UNPKG

axiom

Version:

Axiom AI SDK provides - an API to wrap your AI calls with observability instrumentation. - offline evals

224 lines (218 loc) 7.01 kB
import { Attr, RedactionPolicy, axiomAIMiddleware, axiomAIMiddlewareV1, axiomAIMiddlewareV2, classifyToolError, createAppScope, createStartActiveSpan, getGlobalTracer, getRedactionPolicy, getTracer, handleMaybeRedactedAttribute, initAxiomAI, resetAxiomAI, setAxiomBaseAttributes, setScopeAttributes, withSpan, wrapAISDKModel } from "./chunk-PZCJLQFO.js"; import "./chunk-X2LH7XLM.js"; import { init_esm_shims } from "./chunk-4VNFFUM5.js"; // src/index.ts init_esm_shims(); // src/otel/wrapTool.ts init_esm_shims(); import "@opentelemetry/api"; // src/util/typedEntries.ts init_esm_shims(); function typedEntries(obj) { return Object.entries(obj); } // src/otel/wrapTool.ts function wrapTool(toolName, tool) { if (!tool || typeof tool !== "object") { console.error("Invalid tool provided to wrapTool, returning unwrapped tool"); return tool; } if (!("execute" in tool) || typeof tool.execute !== "function") { console.error( "Cannot wrap a tool that does not have an execute method, returning unwrapped tool" ); return tool; } const originalExecute = tool.execute; return { ...tool, execute: async (...executeArgs) => { const [args, opts] = executeArgs; const tracer = getTracer(); const startActiveSpan = createStartActiveSpan(tracer); const spanName = `${Attr.GenAI.Operation.Name_Values.ExecuteTool} ${toolName}`; return startActiveSpan(spanName, null, async (span) => { const redactionPolicy = getRedactionPolicy(); setAxiomBaseAttributes(span); setScopeAttributes(span); const toolCallId = opts && typeof opts === "object" ? opts.toolCallId || opts.toolCall?.toolCallId : void 0; if (toolCallId) { span.setAttribute(Attr.GenAI.Tool.CallID, toolCallId); } span.setAttribute(Attr.GenAI.Operation.Name, Attr.GenAI.Operation.Name_Values.ExecuteTool); span.setAttribute(Attr.GenAI.Tool.Name, toolName); const type = args && typeof args === "object" && "type" in args ? args.type : "function"; span.setAttribute(Attr.GenAI.Tool.Type, type); if (tool.description) { span.setAttribute(Attr.GenAI.Tool.Description, tool.description); } if (redactionPolicy.mirrorToolPayloadOnToolSpan) { try { handleMaybeRedactedAttribute( span, Attr.GenAI.Tool.Arguments, JSON.stringify(args), redactionPolicy.captureMessageContent ); } catch (_error) { span.setAttribute(Attr.GenAI.Tool.Arguments, "[Unable to serialize arguments]"); } } try { const result = await originalExecute(args, opts); if (redactionPolicy.mirrorToolPayloadOnToolSpan) { try { handleMaybeRedactedAttribute( span, Attr.GenAI.Tool.Message, JSON.stringify(result), redactionPolicy.captureMessageContent ); } catch (_error) { span.setAttribute(Attr.GenAI.Tool.Message, "[Unable to serialize result]"); } } return result; } catch (err) { classifyToolError(err, span); throw err; } }); } }; } function wrapTools(tools) { if (!tools || typeof tools !== "object") { console.error("Invalid tools object provided to wrapTools"); return tools; } const wrappedTools = {}; for (const [toolName, tool] of typedEntries(tools)) { wrappedTools[toolName] = wrapTool(toolName, tool); } return wrappedTools; } // src/template.ts init_esm_shims(); import { Type as TypeBox } from "@sinclair/typebox"; var createTemplateType = (schema) => schema; var createString = (...args) => createTemplateType(TypeBox.String(...args)); var createNumber = (...args) => createTemplateType(TypeBox.Number(...args)); var createInteger = (...args) => createTemplateType(TypeBox.Integer(...args)); var createBoolean = (...args) => createTemplateType(TypeBox.Boolean(...args)); var createNull = (...args) => createTemplateType(TypeBox.Null(...args)); var createLiteral = (value, ...args) => createTemplateType(TypeBox.Literal(value, ...args)); var createUndefined = (...args) => createTemplateType(TypeBox.Undefined(...args)); var createArray = (items, ...args) => createTemplateType(TypeBox.Array(items, ...args)); var createObject = (properties, ...args) => createTemplateType(TypeBox.Object(properties, ...args)); var createRecord = (value, ...args) => createTemplateType(TypeBox.Record(TypeBox.String(), value, ...args)); var createTuple = (types, ...args) => { return createTemplateType(TypeBox.Tuple(types, ...args)); }; var createOptional = (schema, ...args) => createTemplateType(TypeBox.Optional(schema, true, ...args)); var createUnion = (schemas, ...args) => createTemplateType(TypeBox.Union(schemas, ...args)); var Type = { // Primitives String: createString, Number: createNumber, Integer: createInteger, Boolean: createBoolean, Null: createNull, Undefined: createUndefined, // Literals Literal: createLiteral, // Collections - only accept Template types Array: createArray, Object: createObject, Record: createRecord, Tuple: createTuple, // Modifiers - only accept Template types Optional: createOptional, Union: createUnion }; // src/prompt/index.ts init_esm_shims(); var getParser = async () => { const handlebars = await import("./handlebars-AIP3BZD5.js").then((m) => m.handlebarsParse); return handlebars; }; var parse = async (prompt, { context }) => { const messagesPromises = prompt.messages.map(async (message) => { const parser = await getParser(); return { ...message, content: await parser(message.content, { context }) }; }); const parsedMessages = await Promise.all(messagesPromises); const promptMetadata = { id: prompt.promptId, name: prompt.name, slug: prompt.slug, version: prompt.version }; if (parsedMessages.length > 0) { const lastMessage = parsedMessages[parsedMessages.length - 1]; lastMessage.providerOptions = { ...lastMessage.providerOptions, _axiomMeta: promptMetadata }; lastMessage.providerMetadata = { ...lastMessage.providerMetadata, _axiomMeta: promptMetadata }; } const messages = new Proxy(parsedMessages, { get(target, prop, receiver) { if (prop === "_axiomMeta") { return promptMetadata; } return Reflect.get(target, prop, receiver); } }); return { ...prompt, messages }; }; export { RedactionPolicy, axiomAIMiddleware, axiomAIMiddlewareV1, axiomAIMiddlewareV2, createAppScope, Type as experimental_Template, Type as experimental_Type, parse as experimental_parse, getGlobalTracer, initAxiomAI, resetAxiomAI, withSpan, wrapAISDKModel, wrapTool, wrapTools }; //# sourceMappingURL=index.js.map