axiom 0.44.0 → 0.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.cjs +6 -6
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +5 -5
- package/dist/chunk-3Q36GUCI.js +23 -0
- package/dist/chunk-3Q36GUCI.js.map +1 -0
- package/dist/{chunk-MCKVQ2IB.js → chunk-JSEK2D3F.js} +5 -19
- package/dist/chunk-JSEK2D3F.js.map +1 -0
- package/dist/{chunk-HW6E4M7S.js → chunk-N3RHEQMQ.js} +2 -2
- package/dist/{chunk-HW6E4M7S.js.map → chunk-N3RHEQMQ.js.map} +1 -1
- package/dist/{chunk-U3JDCQ3Y.js → chunk-QAIGRB75.js} +7 -7
- package/dist/{chunk-7NTVK3F4.js → chunk-R4CARCOX.js} +2 -2
- package/dist/{chunk-56V2A6IW.js → chunk-RSHQRY3F.js} +3 -3
- package/dist/{chunk-AAYRMTT6.js → chunk-SGAIMXRV.js} +24 -9
- package/dist/chunk-SGAIMXRV.js.map +1 -0
- package/dist/evals/online.cjs +31 -8
- package/dist/evals/online.cjs.map +1 -1
- package/dist/evals/online.d.cts +9 -4
- package/dist/evals/online.d.ts +9 -4
- package/dist/evals/online.js +3 -2
- package/dist/evals/online.js.map +1 -1
- package/dist/evals/scorers.cjs +13 -16
- package/dist/evals/scorers.cjs.map +1 -1
- package/dist/evals/scorers.js +2 -1
- package/dist/evals/scorers.js.map +1 -1
- package/dist/evals.cjs +22 -23
- package/dist/evals.cjs.map +1 -1
- package/dist/evals.js +8 -8
- package/dist/evals.js.map +1 -1
- package/dist/index.cjs +36 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/{run-vitest-4OEEDEHV.js → run-vitest-SYYO32TD.js} +5 -5
- package/package.json +1 -1
- package/dist/chunk-AAYRMTT6.js.map +0 -1
- package/dist/chunk-MCKVQ2IB.js.map +0 -1
- /package/dist/{chunk-U3JDCQ3Y.js.map → chunk-QAIGRB75.js.map} +0 -0
- /package/dist/{chunk-7NTVK3F4.js.map → chunk-R4CARCOX.js.map} +0 -0
- /package/dist/{chunk-56V2A6IW.js.map → chunk-RSHQRY3F.js.map} +0 -0
- /package/dist/{run-vitest-4OEEDEHV.js.map → run-vitest-SYYO32TD.js.map} +0 -0
package/dist/index.js
CHANGED
|
@@ -15,11 +15,11 @@ import {
|
|
|
15
15
|
setScopeAttributes,
|
|
16
16
|
withSpan,
|
|
17
17
|
wrapAISDKModel
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-R4CARCOX.js";
|
|
19
19
|
import "./chunk-X2LH7XLM.js";
|
|
20
20
|
import {
|
|
21
21
|
onlineEval
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-SGAIMXRV.js";
|
|
23
23
|
import {
|
|
24
24
|
RedactionPolicy,
|
|
25
25
|
getGlobalTracer,
|
|
@@ -27,10 +27,11 @@ import {
|
|
|
27
27
|
handleMaybeRedactedAttribute,
|
|
28
28
|
initAxiomAI,
|
|
29
29
|
resetAxiomAI
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-N3RHEQMQ.js";
|
|
31
31
|
import {
|
|
32
32
|
createScorer
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-JSEK2D3F.js";
|
|
34
|
+
import "./chunk-3Q36GUCI.js";
|
|
34
35
|
import {
|
|
35
36
|
Attr
|
|
36
37
|
} from "./chunk-TWE3LIRZ.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/otel/wrapTool.ts","../src/util/typedEntries.ts","../src/template.ts","../src/prompt/index.ts"],"sourcesContent":["/**\n * Instrumentation\n */\n\nexport * from './otel/initAxiomAI';\nexport * from './otel/vercel';\nexport * from './otel/withSpan';\nimport { onlineEval as _onlineEval } from './online-evals/onlineEval';\nimport { warnOnlineEvalDeprecation } from './evals/deprecated';\n\n/** @deprecated Import from 'axiom/ai/evals/online' instead. */\nexport const onlineEval: typeof _onlineEval = (...args) => {\n warnOnlineEvalDeprecation();\n return _onlineEval(...args);\n};\n\nimport { createScorer } from './evals/scorer.factory';\nimport { warnScorerDeprecation } from './evals/deprecated';\n\n/** @deprecated Import from 'axiom/ai/evals/scorers' instead. */\nexport const Scorer = ((...args: unknown[]) => {\n warnScorerDeprecation('axiom/ai');\n return (createScorer as Function)(...args);\n}) as typeof createScorer;\n\n/** @deprecated Import from 'axiom/ai/evals/scorers' instead. */\nexport type { Score } from './evals/scorer.types';\n/** @deprecated Import from 'axiom/ai/evals/scorers' instead. */\nexport type { Scorer as ScorerType } from './evals/scorer.types';\n\nexport * from './otel/wrapTool';\nexport * from './otel/middleware';\nexport { type AxiomAIRedactionPolicy, RedactionPolicy } from './otel/utils/redaction';\n\n/**\n * App Scope\n */\n\nexport { createAppScope } from './app-scope';\n\n/**\n * Prompts\n */\n\n// Prompt and template functionality - marked as UNSAFE as these APIs are experimental\nexport type { Prompt as experimental_Prompt } from './types';\n\nexport { Type as experimental_Type } from './template';\nexport type {\n TSchema as experimental_TSchema,\n InferSchema as experimental_InferSchema,\n InferContext as experimental_InferContext,\n} from './template';\n\nexport { parse as experimental_parse, Template as experimental_Template } from './prompt';\n\nexport type {\n AxiomPromptMetadata as experimental_AxiomPromptMetadata,\n ParsedMessage as experimental_ParsedMessage,\n ParsedMessagesArray as experimental_ParsedMessagesArray,\n} from './types/metadata';\n","import { type Span } from '@opentelemetry/api';\nimport { type Tool as ToolV4 } from 'aiv4';\nimport { type Tool as ToolV5 } from 'aiv5';\nimport { createStartActiveSpan } from './startActiveSpan';\nimport { Attr } from './semconv/attributes';\nimport { typedEntries } from '../util/typedEntries';\nimport {\n setAxiomBaseAttributes,\n getTracer,\n classifyToolError,\n setScopeAttributes,\n} from './utils/wrapperUtils';\nimport { getRedactionPolicy, handleMaybeRedactedAttribute } from './utils/redaction';\n\ntype Tool = ToolV4 | ToolV5;\ntype WrappedTool<T> = T extends Tool ? T : never;\n\ninterface ToolLike {\n execute?: (...args: any[]) => any;\n description?: string;\n [key: string]: any;\n}\n\n/**\n * Wraps a tool to create child spans when the tool's execute method is called.\n *\n * @param toolName The name of the tool (key from the tools object) - span name will be `execute_tool <toolName>`\n * @param tool The tool to wrap\n * @returns The same tool but with a wrapped execute method that creates spans\n */\nexport function wrapTool<T extends ToolLike>(toolName: string, tool: T): T {\n if (!tool || typeof tool !== 'object') {\n console.error('Invalid tool provided to wrapTool, returning unwrapped tool');\n return tool as T;\n }\n\n if (!('execute' in tool) || typeof tool.execute !== 'function') {\n console.error(\n 'Cannot wrap a tool that does not have an execute method, returning unwrapped tool',\n );\n return tool as T;\n }\n\n // After the type guard, we know execute exists and is a function\n const originalExecute = tool.execute as (...args: any[]) => any;\n\n return {\n ...tool,\n execute: async (...executeArgs: Parameters<typeof originalExecute>) => {\n const [args, opts] = executeArgs;\n const tracer = getTracer();\n const startActiveSpan = createStartActiveSpan(tracer);\n const spanName = `${Attr.GenAI.Operation.Name_Values.ExecuteTool} ${toolName}`;\n\n return startActiveSpan(spanName, null, async (span: Span) => {\n const redactionPolicy = getRedactionPolicy();\n\n setAxiomBaseAttributes(span);\n setScopeAttributes(span);\n\n // Handle different opts structures between AI SDK versions\n const toolCallId =\n opts && typeof opts === 'object'\n ? opts.toolCallId || opts.toolCall?.toolCallId\n : undefined;\n\n if (toolCallId) {\n span.setAttribute(Attr.GenAI.Tool.CallID, toolCallId);\n }\n\n span.setAttribute(Attr.GenAI.Operation.Name, Attr.GenAI.Operation.Name_Values.ExecuteTool);\n span.setAttribute(Attr.GenAI.Tool.Name, toolName);\n\n const type = args && typeof args === 'object' && 'type' in args ? args.type : 'function';\n span.setAttribute(Attr.GenAI.Tool.Type, type);\n\n if (tool.description) {\n span.setAttribute(Attr.GenAI.Tool.Description, tool.description);\n }\n\n if (redactionPolicy.mirrorToolPayloadOnToolSpan) {\n try {\n handleMaybeRedactedAttribute(\n span,\n Attr.GenAI.Tool.Arguments,\n JSON.stringify(args),\n redactionPolicy.captureMessageContent,\n );\n } catch (_error) {\n // Handle circular references or other JSON serialization errors\n span.setAttribute(Attr.GenAI.Tool.Arguments, '[Unable to serialize arguments]');\n }\n }\n\n try {\n // Execute the original tool function\n const result = await originalExecute(args, opts);\n\n // Conditionally set tool result message if mirroring is enabled\n if (redactionPolicy.mirrorToolPayloadOnToolSpan) {\n try {\n handleMaybeRedactedAttribute(\n span,\n Attr.GenAI.Tool.Message,\n JSON.stringify(result),\n redactionPolicy.captureMessageContent,\n );\n } catch (_error) {\n // Handle circular references or other JSON serialization errors\n span.setAttribute(Attr.GenAI.Tool.Message, '[Unable to serialize result]');\n }\n }\n\n return result;\n } catch (err) {\n classifyToolError(err, span);\n\n // Always re-throw tool errors to allow the calling code/AI SDK to decide\n // whether to handle gracefully or fail the parent span.\n throw err;\n }\n });\n },\n } as WrappedTool<T>;\n}\n\n/**\n * Wraps multiple tools to create child spans when their execute methods are called.\n *\n * @param tools An object containing tools to wrap\n * @returns The same object with all tools wrapped\n */\nexport function wrapTools<T extends Record<string, ToolLike>>(tools: T): T {\n if (!tools || typeof tools !== 'object') {\n console.error('Invalid tools object provided to wrapTools');\n return tools;\n }\n\n const wrappedTools = {} as T;\n\n for (const [toolName, tool] of typedEntries(tools)) {\n wrappedTools[toolName] = wrapTool(toolName as string, tool);\n }\n\n return wrappedTools;\n}\n","export function typedEntries<T extends object>(obj: T): [keyof T, T[keyof T]][] {\n return Object.entries(obj) as [keyof T, T[keyof T]][];\n}\n","import { Type as TypeBox, type TSchema as TypeBoxSchema, type Static } from '@sinclair/typebox';\n\n/**\n * Template-friendly TypeBox types for use with Handlebars.\n *\n * These types are designed to be easily serializable and work well in template contexts\n * where data needs to be rendered as strings or used in conditionals and loops.\n *\n * All composite types (Array, Object, etc.) only accept other Template types.\n */\n\n// Brand to distinguish Template types from raw TypeBox types\ndeclare const SchemaBrand: unique symbol;\ntype TSchema<T extends TypeBoxSchema = TypeBoxSchema> = T & { [SchemaBrand]: true };\n\n/**\n * Utility type to infer TypeScript types from {@link TSchema}.\n */\nexport type InferSchema<T extends TSchema> = Static<T>;\n\n/**\n * Utility type to infer context types from {@link Prompt} arguments.\n *\n * Used with {@link parse} function to ensure type safety when providing context values.\n */\nexport type InferContext<T extends Record<string, TSchema>> = Static<\n ReturnType<typeof createObject<T>>\n>;\n\ntype OmitFirst<T extends any[]> = T extends [any, ...infer R] ? R : never;\n\n// Helper to create branded Template types\nconst createTemplateType = <T extends TypeBoxSchema>(schema: T): TSchema<T> => schema as TSchema<T>;\n\n// Primitive type creators\nconst createString = (...args: Parameters<typeof TypeBox.String>) =>\n createTemplateType(TypeBox.String(...args));\nconst createNumber = (...args: Parameters<typeof TypeBox.Number>) =>\n createTemplateType(TypeBox.Number(...args));\nconst createInteger = (...args: Parameters<typeof TypeBox.Integer>) =>\n createTemplateType(TypeBox.Integer(...args));\nconst createBoolean = (...args: Parameters<typeof TypeBox.Boolean>) =>\n createTemplateType(TypeBox.Boolean(...args));\nconst createNull = (...args: Parameters<typeof TypeBox.Null>) =>\n createTemplateType(TypeBox.Null(...args));\nconst createLiteral = <T extends string | number | boolean>(\n value: T,\n ...args: OmitFirst<Parameters<typeof TypeBox.Literal>>\n) => createTemplateType(TypeBox.Literal(value, ...args));\nconst createUndefined = (...args: Parameters<typeof TypeBox.Undefined>) =>\n createTemplateType(TypeBox.Undefined(...args));\n\n// Collection type creators - only accept Template types\nconst createArray = <T extends TSchema>(\n items: T,\n ...args: OmitFirst<Parameters<typeof TypeBox.Array>>\n) => createTemplateType(TypeBox.Array(items, ...args));\n\nconst createObject = <T extends Record<string, TSchema>>(\n properties: T,\n ...args: OmitFirst<Parameters<typeof TypeBox.Object>>\n) => createTemplateType(TypeBox.Object(properties, ...args));\n\nconst createRecord = <V extends TSchema>(\n value: V,\n ...args: OmitFirst<OmitFirst<Parameters<typeof TypeBox.Record>>>\n) => createTemplateType(TypeBox.Record(TypeBox.String(), value, ...args));\n\nconst createTuple = <T extends TSchema[]>(\n types: [...T],\n ...args: OmitFirst<Parameters<typeof TypeBox.Tuple>>\n) => {\n return createTemplateType(TypeBox.Tuple(types, ...args));\n};\n\n// Modifier type creators - only accept Template types\nconst createOptional = <T extends TSchema>(\n schema: T,\n ...args: OmitFirst<Parameters<typeof TypeBox.Optional>>\n) => createTemplateType(TypeBox.Optional(schema, true, ...args));\n\nconst createUnion = <T extends TSchema[]>(\n schemas: [...T],\n ...args: OmitFirst<Parameters<typeof TypeBox.Union>>\n) => createTemplateType(TypeBox.Union(schemas, ...args));\n\n// Export all template-friendly types as a namespace\nexport const Type = {\n // Primitives\n String: createString,\n Number: createNumber,\n Integer: createInteger,\n Boolean: createBoolean,\n Null: createNull,\n Undefined: createUndefined,\n\n // Literals\n Literal: createLiteral,\n\n // Collections - only accept Template types\n Array: createArray,\n Object: createObject,\n Record: createRecord,\n Tuple: createTuple,\n\n // Modifiers - only accept Template types\n Optional: createOptional,\n Union: createUnion,\n} as const;\n\n// Export the branded type for advanced usage\nexport type { TSchema };\n\n// Default export for convenience\nexport default Type;\n","import type { Prompt } from '../types';\nimport type { InferContext } from '../template';\nimport type { AxiomPromptMetadata, ParsedMessage, ParsedMessagesArray } from '../types/metadata';\n\nconst getParser = async () => {\n const handlebars = await import('./parsers/handlebars').then((m) => m.handlebarsParse);\n return handlebars;\n};\n\n/**\n * Parses a prompt template by replacing variables with provided context values.\n *\n * This function processes Handlebars templates in prompt messages and attaches metadata\n * for instrumentation and tracking.\n *\n * @experimental This API is experimental and may change in future versions.\n *\n * @param prompt - The {@link Prompt} template to parse\n * @param options - Parsing options\n * @param options.context - Context values to substitute into the template\n * @returns Promise that resolves to the parsed prompt with processed messages;\n */\nexport const parse = async <\n TPrompt extends Prompt,\n TMessages extends TPrompt['messages'] = TPrompt['messages'],\n>(\n prompt: TPrompt & { messages: TMessages },\n {\n context,\n }: {\n context: InferContext<TPrompt['arguments']>;\n },\n): Promise<Omit<TPrompt, 'messages'> & { messages: ParsedMessagesArray<TMessages> }> => {\n const messagesPromises = prompt.messages.map(async (message) => {\n const parser = await getParser();\n return {\n ...message,\n content: await parser(message.content, { context }),\n };\n });\n\n const parsedMessages: ParsedMessage[] = await Promise.all(messagesPromises);\n\n // Create metadata object from prompt\n const promptMetadata: AxiomPromptMetadata = {\n id: prompt.promptId,\n name: prompt.name,\n slug: prompt.slug,\n version: prompt.version,\n };\n\n // Attach metadata to the last message's providerOptions for detection in the wrapper\n // The Vercel SDK converts providerOptions -> providerMetadata in convertToLanguageModelMessage\n if (parsedMessages.length > 0) {\n const lastMessage = parsedMessages[parsedMessages.length - 1];\n lastMessage.providerOptions = {\n ...lastMessage.providerOptions,\n _axiomMeta: promptMetadata,\n };\n lastMessage.providerMetadata = {\n ...lastMessage.providerMetadata,\n _axiomMeta: promptMetadata,\n };\n }\n\n // Also create a Proxy for direct access in tests\n const messages = new Proxy(parsedMessages, {\n get(target: ParsedMessage[], prop: string | symbol, receiver: unknown): any {\n // Special metadata access\n if (prop === '_axiomMeta') {\n return promptMetadata;\n }\n // All other properties (array methods, indices, etc.)\n return Reflect.get(target, prop, receiver) as ParsedMessage | undefined;\n },\n }) as ParsedMessagesArray<TMessages>;\n\n return {\n ...prompt,\n messages: messages,\n };\n};\n\n// Re-export template types for convenience\nexport { Type as Template, type InferContext } from '../template';\n"],"mappings":"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","names":["onlineEval"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/otel/wrapTool.ts","../src/util/typedEntries.ts","../src/template.ts","../src/prompt/index.ts"],"sourcesContent":["/**\n * Instrumentation\n */\n\nexport * from './otel/initAxiomAI';\nexport * from './otel/vercel';\nexport * from './otel/withSpan';\nimport { onlineEval as _onlineEval } from './online-evals/onlineEval';\nimport { warnOnlineEvalDeprecation } from './evals/deprecated';\n\n/** @deprecated Import from 'axiom/ai/evals/online' instead. */\nexport const onlineEval: typeof _onlineEval = (...args) => {\n warnOnlineEvalDeprecation();\n return _onlineEval(...args);\n};\n\nimport { createScorer } from './evals/scorer.factory';\nimport { warnScorerDeprecation } from './evals/deprecated';\n\n/** @deprecated Import from 'axiom/ai/evals/scorers' instead. */\nexport const Scorer = ((...args: unknown[]) => {\n warnScorerDeprecation('axiom/ai');\n return (createScorer as Function)(...args);\n}) as typeof createScorer;\n\n/** @deprecated Import from 'axiom/ai/evals/scorers' instead. */\nexport type { Score } from './evals/scorer.types';\n/** @deprecated Import from 'axiom/ai/evals/scorers' instead. */\nexport type { Scorer as ScorerType } from './evals/scorer.types';\n\nexport * from './otel/wrapTool';\nexport * from './otel/middleware';\nexport { type AxiomAIRedactionPolicy, RedactionPolicy } from './otel/utils/redaction';\n\n/**\n * App Scope\n */\n\nexport { createAppScope } from './app-scope';\n\n/**\n * Prompts\n */\n\n// Prompt and template functionality - marked as UNSAFE as these APIs are experimental\nexport type { Prompt as experimental_Prompt } from './types';\n\nexport { Type as experimental_Type } from './template';\nexport type {\n TSchema as experimental_TSchema,\n InferSchema as experimental_InferSchema,\n InferContext as experimental_InferContext,\n} from './template';\n\nexport { parse as experimental_parse, Template as experimental_Template } from './prompt';\n\nexport type {\n AxiomPromptMetadata as experimental_AxiomPromptMetadata,\n ParsedMessage as experimental_ParsedMessage,\n ParsedMessagesArray as experimental_ParsedMessagesArray,\n} from './types/metadata';\n","import { type Span } from '@opentelemetry/api';\nimport { type Tool as ToolV4 } from 'aiv4';\nimport { type Tool as ToolV5 } from 'aiv5';\nimport { createStartActiveSpan } from './startActiveSpan';\nimport { Attr } from './semconv/attributes';\nimport { typedEntries } from '../util/typedEntries';\nimport {\n setAxiomBaseAttributes,\n getTracer,\n classifyToolError,\n setScopeAttributes,\n} from './utils/wrapperUtils';\nimport { getRedactionPolicy, handleMaybeRedactedAttribute } from './utils/redaction';\n\ntype Tool = ToolV4 | ToolV5;\ntype WrappedTool<T> = T extends Tool ? T : never;\n\ninterface ToolLike {\n execute?: (...args: any[]) => any;\n description?: string;\n [key: string]: any;\n}\n\n/**\n * Wraps a tool to create child spans when the tool's execute method is called.\n *\n * @param toolName The name of the tool (key from the tools object) - span name will be `execute_tool <toolName>`\n * @param tool The tool to wrap\n * @returns The same tool but with a wrapped execute method that creates spans\n */\nexport function wrapTool<T extends ToolLike>(toolName: string, tool: T): T {\n if (!tool || typeof tool !== 'object') {\n console.error('Invalid tool provided to wrapTool, returning unwrapped tool');\n return tool as T;\n }\n\n if (!('execute' in tool) || typeof tool.execute !== 'function') {\n console.error(\n 'Cannot wrap a tool that does not have an execute method, returning unwrapped tool',\n );\n return tool as T;\n }\n\n // After the type guard, we know execute exists and is a function\n const originalExecute = tool.execute as (...args: any[]) => any;\n\n return {\n ...tool,\n execute: async (...executeArgs: Parameters<typeof originalExecute>) => {\n const [args, opts] = executeArgs;\n const tracer = getTracer();\n const startActiveSpan = createStartActiveSpan(tracer);\n const spanName = `${Attr.GenAI.Operation.Name_Values.ExecuteTool} ${toolName}`;\n\n return startActiveSpan(spanName, null, async (span: Span) => {\n const redactionPolicy = getRedactionPolicy();\n\n setAxiomBaseAttributes(span);\n setScopeAttributes(span);\n\n // Handle different opts structures between AI SDK versions\n const toolCallId =\n opts && typeof opts === 'object'\n ? opts.toolCallId || opts.toolCall?.toolCallId\n : undefined;\n\n if (toolCallId) {\n span.setAttribute(Attr.GenAI.Tool.CallID, toolCallId);\n }\n\n span.setAttribute(Attr.GenAI.Operation.Name, Attr.GenAI.Operation.Name_Values.ExecuteTool);\n span.setAttribute(Attr.GenAI.Tool.Name, toolName);\n\n const type = args && typeof args === 'object' && 'type' in args ? args.type : 'function';\n span.setAttribute(Attr.GenAI.Tool.Type, type);\n\n if (tool.description) {\n span.setAttribute(Attr.GenAI.Tool.Description, tool.description);\n }\n\n if (redactionPolicy.mirrorToolPayloadOnToolSpan) {\n try {\n handleMaybeRedactedAttribute(\n span,\n Attr.GenAI.Tool.Arguments,\n JSON.stringify(args),\n redactionPolicy.captureMessageContent,\n );\n } catch (_error) {\n // Handle circular references or other JSON serialization errors\n span.setAttribute(Attr.GenAI.Tool.Arguments, '[Unable to serialize arguments]');\n }\n }\n\n try {\n // Execute the original tool function\n const result = await originalExecute(args, opts);\n\n // Conditionally set tool result message if mirroring is enabled\n if (redactionPolicy.mirrorToolPayloadOnToolSpan) {\n try {\n handleMaybeRedactedAttribute(\n span,\n Attr.GenAI.Tool.Message,\n JSON.stringify(result),\n redactionPolicy.captureMessageContent,\n );\n } catch (_error) {\n // Handle circular references or other JSON serialization errors\n span.setAttribute(Attr.GenAI.Tool.Message, '[Unable to serialize result]');\n }\n }\n\n return result;\n } catch (err) {\n classifyToolError(err, span);\n\n // Always re-throw tool errors to allow the calling code/AI SDK to decide\n // whether to handle gracefully or fail the parent span.\n throw err;\n }\n });\n },\n } as WrappedTool<T>;\n}\n\n/**\n * Wraps multiple tools to create child spans when their execute methods are called.\n *\n * @param tools An object containing tools to wrap\n * @returns The same object with all tools wrapped\n */\nexport function wrapTools<T extends Record<string, ToolLike>>(tools: T): T {\n if (!tools || typeof tools !== 'object') {\n console.error('Invalid tools object provided to wrapTools');\n return tools;\n }\n\n const wrappedTools = {} as T;\n\n for (const [toolName, tool] of typedEntries(tools)) {\n wrappedTools[toolName] = wrapTool(toolName as string, tool);\n }\n\n return wrappedTools;\n}\n","export function typedEntries<T extends object>(obj: T): [keyof T, T[keyof T]][] {\n return Object.entries(obj) as [keyof T, T[keyof T]][];\n}\n","import { Type as TypeBox, type TSchema as TypeBoxSchema, type Static } from '@sinclair/typebox';\n\n/**\n * Template-friendly TypeBox types for use with Handlebars.\n *\n * These types are designed to be easily serializable and work well in template contexts\n * where data needs to be rendered as strings or used in conditionals and loops.\n *\n * All composite types (Array, Object, etc.) only accept other Template types.\n */\n\n// Brand to distinguish Template types from raw TypeBox types\ndeclare const SchemaBrand: unique symbol;\ntype TSchema<T extends TypeBoxSchema = TypeBoxSchema> = T & { [SchemaBrand]: true };\n\n/**\n * Utility type to infer TypeScript types from {@link TSchema}.\n */\nexport type InferSchema<T extends TSchema> = Static<T>;\n\n/**\n * Utility type to infer context types from {@link Prompt} arguments.\n *\n * Used with {@link parse} function to ensure type safety when providing context values.\n */\nexport type InferContext<T extends Record<string, TSchema>> = Static<\n ReturnType<typeof createObject<T>>\n>;\n\ntype OmitFirst<T extends any[]> = T extends [any, ...infer R] ? R : never;\n\n// Helper to create branded Template types\nconst createTemplateType = <T extends TypeBoxSchema>(schema: T): TSchema<T> => schema as TSchema<T>;\n\n// Primitive type creators\nconst createString = (...args: Parameters<typeof TypeBox.String>) =>\n createTemplateType(TypeBox.String(...args));\nconst createNumber = (...args: Parameters<typeof TypeBox.Number>) =>\n createTemplateType(TypeBox.Number(...args));\nconst createInteger = (...args: Parameters<typeof TypeBox.Integer>) =>\n createTemplateType(TypeBox.Integer(...args));\nconst createBoolean = (...args: Parameters<typeof TypeBox.Boolean>) =>\n createTemplateType(TypeBox.Boolean(...args));\nconst createNull = (...args: Parameters<typeof TypeBox.Null>) =>\n createTemplateType(TypeBox.Null(...args));\nconst createLiteral = <T extends string | number | boolean>(\n value: T,\n ...args: OmitFirst<Parameters<typeof TypeBox.Literal>>\n) => createTemplateType(TypeBox.Literal(value, ...args));\nconst createUndefined = (...args: Parameters<typeof TypeBox.Undefined>) =>\n createTemplateType(TypeBox.Undefined(...args));\n\n// Collection type creators - only accept Template types\nconst createArray = <T extends TSchema>(\n items: T,\n ...args: OmitFirst<Parameters<typeof TypeBox.Array>>\n) => createTemplateType(TypeBox.Array(items, ...args));\n\nconst createObject = <T extends Record<string, TSchema>>(\n properties: T,\n ...args: OmitFirst<Parameters<typeof TypeBox.Object>>\n) => createTemplateType(TypeBox.Object(properties, ...args));\n\nconst createRecord = <V extends TSchema>(\n value: V,\n ...args: OmitFirst<OmitFirst<Parameters<typeof TypeBox.Record>>>\n) => createTemplateType(TypeBox.Record(TypeBox.String(), value, ...args));\n\nconst createTuple = <T extends TSchema[]>(\n types: [...T],\n ...args: OmitFirst<Parameters<typeof TypeBox.Tuple>>\n) => {\n return createTemplateType(TypeBox.Tuple(types, ...args));\n};\n\n// Modifier type creators - only accept Template types\nconst createOptional = <T extends TSchema>(\n schema: T,\n ...args: OmitFirst<Parameters<typeof TypeBox.Optional>>\n) => createTemplateType(TypeBox.Optional(schema, true, ...args));\n\nconst createUnion = <T extends TSchema[]>(\n schemas: [...T],\n ...args: OmitFirst<Parameters<typeof TypeBox.Union>>\n) => createTemplateType(TypeBox.Union(schemas, ...args));\n\n// Export all template-friendly types as a namespace\nexport const Type = {\n // Primitives\n String: createString,\n Number: createNumber,\n Integer: createInteger,\n Boolean: createBoolean,\n Null: createNull,\n Undefined: createUndefined,\n\n // Literals\n Literal: createLiteral,\n\n // Collections - only accept Template types\n Array: createArray,\n Object: createObject,\n Record: createRecord,\n Tuple: createTuple,\n\n // Modifiers - only accept Template types\n Optional: createOptional,\n Union: createUnion,\n} as const;\n\n// Export the branded type for advanced usage\nexport type { TSchema };\n\n// Default export for convenience\nexport default Type;\n","import type { Prompt } from '../types';\nimport type { InferContext } from '../template';\nimport type { AxiomPromptMetadata, ParsedMessage, ParsedMessagesArray } from '../types/metadata';\n\nconst getParser = async () => {\n const handlebars = await import('./parsers/handlebars').then((m) => m.handlebarsParse);\n return handlebars;\n};\n\n/**\n * Parses a prompt template by replacing variables with provided context values.\n *\n * This function processes Handlebars templates in prompt messages and attaches metadata\n * for instrumentation and tracking.\n *\n * @experimental This API is experimental and may change in future versions.\n *\n * @param prompt - The {@link Prompt} template to parse\n * @param options - Parsing options\n * @param options.context - Context values to substitute into the template\n * @returns Promise that resolves to the parsed prompt with processed messages;\n */\nexport const parse = async <\n TPrompt extends Prompt,\n TMessages extends TPrompt['messages'] = TPrompt['messages'],\n>(\n prompt: TPrompt & { messages: TMessages },\n {\n context,\n }: {\n context: InferContext<TPrompt['arguments']>;\n },\n): Promise<Omit<TPrompt, 'messages'> & { messages: ParsedMessagesArray<TMessages> }> => {\n const messagesPromises = prompt.messages.map(async (message) => {\n const parser = await getParser();\n return {\n ...message,\n content: await parser(message.content, { context }),\n };\n });\n\n const parsedMessages: ParsedMessage[] = await Promise.all(messagesPromises);\n\n // Create metadata object from prompt\n const promptMetadata: AxiomPromptMetadata = {\n id: prompt.promptId,\n name: prompt.name,\n slug: prompt.slug,\n version: prompt.version,\n };\n\n // Attach metadata to the last message's providerOptions for detection in the wrapper\n // The Vercel SDK converts providerOptions -> providerMetadata in convertToLanguageModelMessage\n if (parsedMessages.length > 0) {\n const lastMessage = parsedMessages[parsedMessages.length - 1];\n lastMessage.providerOptions = {\n ...lastMessage.providerOptions,\n _axiomMeta: promptMetadata,\n };\n lastMessage.providerMetadata = {\n ...lastMessage.providerMetadata,\n _axiomMeta: promptMetadata,\n };\n }\n\n // Also create a Proxy for direct access in tests\n const messages = new Proxy(parsedMessages, {\n get(target: ParsedMessage[], prop: string | symbol, receiver: unknown): any {\n // Special metadata access\n if (prop === '_axiomMeta') {\n return promptMetadata;\n }\n // All other properties (array methods, indices, etc.)\n return Reflect.get(target, prop, receiver) as ParsedMessage | undefined;\n },\n }) as ParsedMessagesArray<TMessages>;\n\n return {\n ...prompt,\n messages: messages,\n };\n};\n\n// Re-export template types for convenience\nexport { Type as Template, type InferContext } from '../template';\n"],"mappings":"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","names":["onlineEval"]}
|
|
@@ -2,17 +2,17 @@ import {
|
|
|
2
2
|
AxiomReporter,
|
|
3
3
|
flush,
|
|
4
4
|
initInstrumentation
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-QAIGRB75.js";
|
|
6
6
|
import {
|
|
7
7
|
u
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-RSHQRY3F.js";
|
|
9
9
|
import "./chunk-T4FBJ252.js";
|
|
10
10
|
import {
|
|
11
11
|
setAxiomConfig
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-R4CARCOX.js";
|
|
13
13
|
import "./chunk-S65FSMB3.js";
|
|
14
14
|
import "./chunk-X2LH7XLM.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-N3RHEQMQ.js";
|
|
16
16
|
import "./chunk-TWE3LIRZ.js";
|
|
17
17
|
import {
|
|
18
18
|
__dirname,
|
|
@@ -140,4 +140,4 @@ var runVitest = async (dir, opts) => {
|
|
|
140
140
|
export {
|
|
141
141
|
runVitest
|
|
142
142
|
};
|
|
143
|
-
//# sourceMappingURL=run-vitest-
|
|
143
|
+
//# sourceMappingURL=run-vitest-SYYO32TD.js.map
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/online-evals/onlineEval.ts","../src/online-evals/executor.ts"],"sourcesContent":["import { context, trace, SpanStatusCode, type SpanContext } from '@opentelemetry/api';\nimport { getGlobalTracer } from '../otel/initAxiomAI';\nimport type {\n OnlineEvalScorerEntry,\n OnlineEvalScorerInput,\n SampledOnlineEvalScorer,\n Scorer,\n ScorerResult,\n ScorerSampling,\n} from './types';\nimport { executeScorer } from './executor';\nimport { Attr } from '../otel/semconv/attributes';\n\ntype ScorerEntry<TInput, TOutput> = OnlineEvalScorerEntry<TInput, TOutput, any>;\ntype ScorerInput<TInput, TOutput> = OnlineEvalScorerInput<TInput, TOutput, any>;\n\ntype InferScorerMetadata<TScorerEntry> =\n TScorerEntry extends SampledOnlineEvalScorer<any, any, any>\n ? InferScorerMetadata<TScorerEntry['scorer']>\n : TScorerEntry extends Scorer<any, any, infer TMetadata>\n ? TMetadata\n : TScorerEntry extends ScorerResult<infer TMetadata>\n ? TMetadata\n : never;\n\ntype InferScorerName<TScorerEntry> =\n TScorerEntry extends SampledOnlineEvalScorer<any, any, any>\n ? InferScorerName<TScorerEntry['scorer']>\n : TScorerEntry extends ScorerResult<any>\n ? TScorerEntry['name']\n : TScorerEntry extends Scorer<any, any, any>\n ? string\n : never;\n\ntype IsBroadString<T extends string> = string extends T ? true : false;\n\ntype DuplicateScorerNames<\n TEntries extends readonly unknown[],\n Seen extends string = never,\n Duplicates extends string = never,\n> = TEntries extends readonly [infer Head, ...infer Tail]\n ? InferScorerName<Head> extends infer ScorerName\n ? ScorerName extends string\n ? IsBroadString<ScorerName> extends true\n ? DuplicateScorerNames<Tail extends readonly unknown[] ? Tail : never, Seen, Duplicates>\n : ScorerName extends Seen\n ? DuplicateScorerNames<\n Tail extends readonly unknown[] ? Tail : never,\n Seen,\n Duplicates | ScorerName\n >\n : DuplicateScorerNames<\n Tail extends readonly unknown[] ? Tail : never,\n Seen | ScorerName,\n Duplicates\n >\n : DuplicateScorerNames<Tail extends readonly unknown[] ? Tail : never, Seen, Duplicates>\n : never\n : Duplicates;\n\ntype EnsureUniqueScorerNames<TEntries extends readonly unknown[]> = [\n DuplicateScorerNames<TEntries>,\n] extends [never]\n ? TEntries\n : never & {\n __axiomDuplicateScorerNames__: DuplicateScorerNames<TEntries>;\n };\n\ntype InferOnlineEvalResult<TScorers extends readonly unknown[]> = ScorerResult<\n InferScorerMetadata<TScorers[number]>\n>;\n\ntype InferOnlineEvalResultRecord<TScorers extends readonly unknown[]> = Partial<\n Record<Extract<InferScorerName<TScorers[number]>, string>, InferOnlineEvalResult<TScorers>>\n>;\n\ntype NormalizedScorerEntry<TInput, TOutput> = {\n name: string;\n scorer: ScorerInput<TInput, TOutput>;\n sampling?: ScorerSampling<TInput, TOutput>;\n};\n\n/**\n * Metadata for categorizing online evaluations.\n */\nexport type OnlineEvalMeta = {\n /** High-level capability being evaluated (e.g., 'qa', 'summarization') */\n capability: string;\n /** Specific step within the capability (e.g., 'answer', 'extract') */\n step?: string;\n /**\n * Explicit SpanContext to link the eval span to the originating generation span.\n * When omitted, the active span's context is used automatically.\n * Use this for deferred evaluation when onlineEval is called after the\n * originating span has completed.\n */\n link?: SpanContext;\n};\n\n/**\n * Options for online evaluation.\n */\nexport type OnlineEvalOptions<\n TInput,\n TOutput,\n TScorers extends readonly ScorerEntry<TInput, TOutput>[] = readonly ScorerEntry<\n TInput,\n TOutput\n >[],\n> = {\n /** Input to pass to scorers (optional - only needed for input+output scorers) */\n input?: TInput;\n /** Output to evaluate */\n output: TOutput;\n /** Scorers or precomputed scores. Supports optional per-scorer sampling. */\n scorers: EnsureUniqueScorerNames<TScorers>;\n};\n\n/**\n * Determines if an individual scorer should run based on sampling configuration.\n */\nasync function shouldSample<TInput, TOutput>(\n sampling: ScorerSampling<TInput, TOutput> | undefined,\n args: { input?: TInput; output: TOutput },\n): Promise<boolean> {\n if (sampling === undefined) return true;\n if (typeof sampling === 'number') {\n if (sampling >= 1) return true;\n if (sampling <= 0) return false;\n return Math.random() < sampling;\n }\n return Boolean(await sampling(args));\n}\n\nfunction isSampledScorerEntry<TInput, TOutput>(\n entry: ScorerEntry<TInput, TOutput>,\n): entry is SampledOnlineEvalScorer<TInput, TOutput, any> {\n return typeof entry === 'object' && entry !== null && 'scorer' in entry;\n}\n\nfunction resolveScorerName<TInput, TOutput>(scorer: ScorerInput<TInput, TOutput>): string {\n if (typeof scorer === 'function') {\n return scorer.name || 'unknown';\n }\n return scorer.name;\n}\n\nfunction normalizeScorerEntry<TInput, TOutput>(\n entry: ScorerEntry<TInput, TOutput>,\n): NormalizedScorerEntry<TInput, TOutput> {\n if (isSampledScorerEntry(entry)) {\n return {\n name: resolveScorerName(entry.scorer),\n scorer: entry.scorer,\n sampling: entry.sampling,\n };\n }\n\n return {\n name: resolveScorerName(entry),\n scorer: entry,\n };\n}\n\nfunction getDuplicateScorerNames<TInput, TOutput>(\n entries: readonly NormalizedScorerEntry<TInput, TOutput>[],\n): string[] {\n const nameCounts = new Map<string, number>();\n\n for (const entry of entries) {\n nameCounts.set(entry.name, (nameCounts.get(entry.name) ?? 0) + 1);\n }\n\n return [...nameCounts.entries()]\n .filter(([, count]) => count > 1)\n .map(([name]) => name)\n .sort();\n}\n\n/**\n * Run online evaluation scorers against production outputs.\n *\n * Returns a promise that resolves to scorer results. Use `void onlineEval(...)`\n * for fire-and-forget, or `await onlineEval(...)` when you need to wait for\n * completion (e.g., before flushing telemetry in short-lived processes).\n *\n * Each eval span links back to the originating generation span via an\n * OpenTelemetry span link. Parent/child hierarchy follows natural context\n * propagation — inside `withSpan` the eval is a child, outside it depends\n * on the active context.\n *\n * ## Usage Patterns\n *\n * **Inside withSpan (recommended):**\n * Active span is automatically detected and linked.\n * ```ts\n * await withSpan({ capability: 'qa', step: 'answer' }, async () => {\n * const response = await generateText({ ... });\n * void onlineEval(\n * { capability: 'qa', step: 'answer' },\n * { output: response.text, scorers: [formatScorer] }\n * );\n * return response.text;\n * });\n * ```\n *\n * **Deferred evaluation with explicit link:**\n * Pass the originating span's context for linking when evaluating later.\n * ```ts\n * let spanCtx: SpanContext;\n * const result = await withSpan({ ... }, async (span) => {\n * spanCtx = span.spanContext();\n * return await generateText({ ... });\n * });\n * void onlineEval({ ..., link: spanCtx }, { output: result, scorers });\n * ```\n *\n * **Awaiting for flush (short-lived processes):**\n * ```ts\n * await onlineEval({ ... }, { output, scorers });\n * await flushTelemetry();\n * ```\n *\n * @param meta - Evaluation metadata for categorization\n * @param meta.capability - High-level capability being evaluated\n * @param meta.step - Optional step within the capability\n * @param meta.link - Optional SpanContext to link to (auto-detected if omitted)\n * @param options - Evaluation configuration\n * @param options.input - Input to pass to scorers\n * @param options.output - Output to evaluate\n * @param options.scorers - Scorer entries with optional per-scorer sampling\n * @returns Promise resolving to scorer results keyed by scorer name\n */\nexport function onlineEval<\n TInput,\n TOutput,\n const TScorers extends readonly ScorerEntry<TInput, TOutput>[],\n>(\n meta: OnlineEvalMeta,\n options: OnlineEvalOptions<TInput, TOutput, TScorers>,\n): Promise<InferOnlineEvalResultRecord<TScorers>> {\n if (options.scorers.length === 0) {\n return Promise.resolve({});\n }\n\n const linkSpanContext = meta.link ?? trace.getSpan(context.active())?.spanContext();\n\n return executeOnlineEvalInternal(meta, options, linkSpanContext);\n}\n\nasync function executeOnlineEvalInternal<\n TInput,\n TOutput,\n const TScorers extends readonly ScorerEntry<TInput, TOutput>[],\n>(\n meta: OnlineEvalMeta,\n options: OnlineEvalOptions<TInput, TOutput, TScorers>,\n linkSpanContext: SpanContext | undefined,\n): Promise<InferOnlineEvalResultRecord<TScorers>> {\n const tracer = getGlobalTracer();\n\n const spanName = meta.step ? `eval ${meta.capability}/${meta.step}` : `eval ${meta.capability}`;\n\n const evalSpan = tracer.startSpan(\n spanName,\n linkSpanContext ? { links: [{ context: linkSpanContext }] } : {},\n );\n\n const evalAttrs: Record<string, string> = {\n [Attr.GenAI.Operation.Name]: 'eval',\n [Attr.Eval.Capability.Name]: meta.capability,\n [Attr.Eval.Tags]: JSON.stringify(['online']),\n };\n if (meta.step) {\n evalAttrs[Attr.Eval.Step.Name] = meta.step;\n }\n evalSpan.setAttributes(evalAttrs);\n\n try {\n const normalizedScorers = options.scorers.map((entry) => normalizeScorerEntry(entry));\n const duplicateScorerNames = getDuplicateScorerNames(normalizedScorers);\n if (duplicateScorerNames.length > 0) {\n throw new Error(\n `Duplicate scorer names are not allowed: ${duplicateScorerNames\n .map((name) => `\"${name}\"`)\n .join(', ')}`,\n );\n }\n\n const outcomes = await Promise.all(\n normalizedScorers.map(async (entry) => {\n try {\n const sampledIn = await shouldSample(entry.sampling, {\n input: options.input,\n output: options.output,\n });\n\n if (!sampledIn) {\n return { sampledOut: true as const };\n }\n\n return {\n sampledOut: false as const,\n result: await executeScorer(\n entry.scorer,\n options.input,\n options.output,\n evalSpan,\n meta,\n ),\n };\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n return {\n sampledOut: false as const,\n result: await executeScorer(\n {\n name: entry.name,\n score: null,\n error: error.message,\n },\n options.input,\n options.output,\n evalSpan,\n meta,\n ),\n };\n }\n }),\n );\n\n const results: Record<string, InferOnlineEvalResult<TScorers>> = {};\n let sampledOutCount = 0;\n\n for (const outcome of outcomes) {\n if (outcome.sampledOut) {\n sampledOutCount += 1;\n continue;\n }\n\n results[outcome.result.name] = outcome.result as InferOnlineEvalResult<TScorers>;\n }\n\n const failedCount = Object.values(results).filter((result) => result.error).length;\n const ranCount = Object.keys(results).length;\n\n evalSpan.setAttributes({\n 'axiom.eval.online.scorers.total': normalizedScorers.length,\n 'axiom.eval.online.scorers.ran': ranCount,\n 'axiom.eval.online.scorers.sampled_out': sampledOutCount,\n 'axiom.eval.online.scorers.failed': failedCount,\n });\n\n if (failedCount > 0) {\n evalSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: 'One or more scorers failed',\n });\n } else {\n evalSpan.setStatus({ code: SpanStatusCode.OK });\n }\n\n return results as InferOnlineEvalResultRecord<TScorers>;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n evalSpan.recordException(error);\n evalSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n return {};\n } finally {\n evalSpan.end();\n }\n}\n","import { context, trace, SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getGlobalTracer } from '../otel/initAxiomAI';\nimport type { Scorer, ScorerResult } from './types';\nimport type { OnlineEvalMeta } from './onlineEval';\nimport { Attr } from '../otel/semconv/attributes';\n\ntype OnlineEvalScorerInput<TInput, TOutput> = Scorer<TInput, TOutput, any> | ScorerResult<any>;\n\nfunction setScorerSpanAttrs(\n scorerSpan: Span,\n scorerName: string,\n result: Pick<ScorerResult<any>, 'score' | 'metadata'>,\n meta?: OnlineEvalMeta,\n): void {\n const attrs: Record<string, string | number | boolean | undefined> = {\n [Attr.GenAI.Operation.Name]: 'eval.score',\n [Attr.Eval.Score.Name]: scorerName,\n [Attr.Eval.Tags]: JSON.stringify(['online']),\n [Attr.Eval.Score.Value]: result.score ?? undefined,\n [Attr.Eval.Capability.Name]: meta?.capability,\n [Attr.Eval.Step.Name]: meta?.step,\n };\n\n if (result.metadata && Object.keys(result.metadata).length > 0) {\n attrs[Attr.Eval.Score.Metadata] = JSON.stringify(result.metadata);\n }\n\n scorerSpan.setAttributes(attrs);\n}\n\n/**\n * Executes a single scorer or emits a precomputed scorer result.\n */\nexport async function executeScorer<TInput, TOutput>(\n scorer: OnlineEvalScorerInput<TInput, TOutput>,\n input: TInput | undefined,\n output: TOutput,\n parentSpan: Span,\n meta?: OnlineEvalMeta,\n): Promise<ScorerResult<any>> {\n const tracer = getGlobalTracer();\n const parentContext = trace.setSpan(context.active(), parentSpan);\n\n return context.with(parentContext, async () => {\n const scorerName =\n typeof scorer === 'function'\n ? // undefined/unknown case shouldn't happen, but better safe than sorry\n scorer.name || 'unknown'\n : scorer.name;\n const scorerSpan = tracer.startSpan(`score ${scorerName}`);\n\n try {\n const result =\n typeof scorer === 'function'\n ? ({\n ...(await scorer({\n input,\n output,\n })),\n name: scorerName,\n } satisfies ScorerResult)\n : scorer;\n\n setScorerSpanAttrs(scorerSpan, scorerName, result, meta);\n if (result.error) {\n const error = new Error(result.error);\n scorerSpan.recordException(error);\n scorerSpan.setAttributes({\n [Attr.Error.Message]: error.message,\n [Attr.Error.Type]: error.name,\n });\n scorerSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n scorerSpan.setStatus({ code: SpanStatusCode.OK });\n }\n\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n const failedResult: ScorerResult = {\n name: scorerName,\n score: null,\n error: error.message,\n };\n\n setScorerSpanAttrs(scorerSpan, scorerName, failedResult, meta);\n\n scorerSpan.recordException(error);\n scorerSpan.setAttributes({\n [Attr.Error.Message]: error.message,\n [Attr.Error.Type]: error.name,\n });\n scorerSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n\n return failedResult;\n } finally {\n scorerSpan.end();\n }\n });\n}\n"],"mappings":";;;;;;;;;;;AAAA;AAAA,SAAS,WAAAA,UAAS,SAAAC,QAAO,kBAAAC,uBAAwC;;;ACAjE;AAAA,SAAS,SAAS,OAAO,sBAAiC;AAQ1D,SAAS,mBACP,YACA,YACA,QACA,MACM;AACN,QAAM,QAA+D;AAAA,IACnE,CAAC,KAAK,MAAM,UAAU,IAAI,GAAG;AAAA,IAC7B,CAAC,KAAK,KAAK,MAAM,IAAI,GAAG;AAAA,IACxB,CAAC,KAAK,KAAK,IAAI,GAAG,KAAK,UAAU,CAAC,QAAQ,CAAC;AAAA,IAC3C,CAAC,KAAK,KAAK,MAAM,KAAK,GAAG,OAAO,SAAS;AAAA,IACzC,CAAC,KAAK,KAAK,WAAW,IAAI,GAAG,MAAM;AAAA,IACnC,CAAC,KAAK,KAAK,KAAK,IAAI,GAAG,MAAM;AAAA,EAC/B;AAEA,MAAI,OAAO,YAAY,OAAO,KAAK,OAAO,QAAQ,EAAE,SAAS,GAAG;AAC9D,UAAM,KAAK,KAAK,MAAM,QAAQ,IAAI,KAAK,UAAU,OAAO,QAAQ;AAAA,EAClE;AAEA,aAAW,cAAc,KAAK;AAChC;AAKA,eAAsB,cACpB,QACA,OACA,QACA,YACA,MAC4B;AAC5B,QAAM,SAAS,gBAAgB;AAC/B,QAAM,gBAAgB,MAAM,QAAQ,QAAQ,OAAO,GAAG,UAAU;AAEhE,SAAO,QAAQ,KAAK,eAAe,YAAY;AAC7C,UAAM,aACJ,OAAO,WAAW;AAAA;AAAA,MAEd,OAAO,QAAQ;AAAA,QACf,OAAO;AACb,UAAM,aAAa,OAAO,UAAU,SAAS,UAAU,EAAE;AAEzD,QAAI;AACF,YAAM,SACJ,OAAO,WAAW,aACb;AAAA,QACC,GAAI,MAAM,OAAO;AAAA,UACf;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,MAAM;AAAA,MACR,IACA;AAEN,yBAAmB,YAAY,YAAY,QAAQ,IAAI;AACvD,UAAI,OAAO,OAAO;AAChB,cAAM,QAAQ,IAAI,MAAM,OAAO,KAAK;AACpC,mBAAW,gBAAgB,KAAK;AAChC,mBAAW,cAAc;AAAA,UACvB,CAAC,KAAK,MAAM,OAAO,GAAG,MAAM;AAAA,UAC5B,CAAC,KAAK,MAAM,IAAI,GAAG,MAAM;AAAA,QAC3B,CAAC;AACD,mBAAW,UAAU;AAAA,UACnB,MAAM,eAAe;AAAA,UACrB,SAAS,MAAM;AAAA,QACjB,CAAC;AAAA,MACH,OAAO;AACL,mBAAW,UAAU,EAAE,MAAM,eAAe,GAAG,CAAC;AAAA,MAClD;AAEA,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,YAAM,eAA6B;AAAA,QACjC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,MAAM;AAAA,MACf;AAEA,yBAAmB,YAAY,YAAY,cAAc,IAAI;AAE7D,iBAAW,gBAAgB,KAAK;AAChC,iBAAW,cAAc;AAAA,QACvB,CAAC,KAAK,MAAM,OAAO,GAAG,MAAM;AAAA,QAC5B,CAAC,KAAK,MAAM,IAAI,GAAG,MAAM;AAAA,MAC3B,CAAC;AACD,iBAAW,UAAU;AAAA,QACnB,MAAM,eAAe;AAAA,QACrB,SAAS,MAAM;AAAA,MACjB,CAAC;AAED,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF,CAAC;AACH;;;ADgBA,eAAe,aACb,UACA,MACkB;AAClB,MAAI,aAAa,OAAW,QAAO;AACnC,MAAI,OAAO,aAAa,UAAU;AAChC,QAAI,YAAY,EAAG,QAAO;AAC1B,QAAI,YAAY,EAAG,QAAO;AAC1B,WAAO,KAAK,OAAO,IAAI;AAAA,EACzB;AACA,SAAO,QAAQ,MAAM,SAAS,IAAI,CAAC;AACrC;AAEA,SAAS,qBACP,OACwD;AACxD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,YAAY;AACpE;AAEA,SAAS,kBAAmC,QAA8C;AACxF,MAAI,OAAO,WAAW,YAAY;AAChC,WAAO,OAAO,QAAQ;AAAA,EACxB;AACA,SAAO,OAAO;AAChB;AAEA,SAAS,qBACP,OACwC;AACxC,MAAI,qBAAqB,KAAK,GAAG;AAC/B,WAAO;AAAA,MACL,MAAM,kBAAkB,MAAM,MAAM;AAAA,MACpC,QAAQ,MAAM;AAAA,MACd,UAAU,MAAM;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,kBAAkB,KAAK;AAAA,IAC7B,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,wBACP,SACU;AACV,QAAM,aAAa,oBAAI,IAAoB;AAE3C,aAAW,SAAS,SAAS;AAC3B,eAAW,IAAI,MAAM,OAAO,WAAW,IAAI,MAAM,IAAI,KAAK,KAAK,CAAC;AAAA,EAClE;AAEA,SAAO,CAAC,GAAG,WAAW,QAAQ,CAAC,EAC5B,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,QAAQ,CAAC,EAC/B,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI,EACpB,KAAK;AACV;AAwDO,SAAS,WAKd,MACA,SACgD;AAChD,MAAI,QAAQ,QAAQ,WAAW,GAAG;AAChC,WAAO,QAAQ,QAAQ,CAAC,CAAC;AAAA,EAC3B;AAEA,QAAM,kBAAkB,KAAK,QAAQC,OAAM,QAAQC,SAAQ,OAAO,CAAC,GAAG,YAAY;AAElF,SAAO,0BAA0B,MAAM,SAAS,eAAe;AACjE;AAEA,eAAe,0BAKb,MACA,SACA,iBACgD;AAChD,QAAM,SAAS,gBAAgB;AAE/B,QAAM,WAAW,KAAK,OAAO,QAAQ,KAAK,UAAU,IAAI,KAAK,IAAI,KAAK,QAAQ,KAAK,UAAU;AAE7F,QAAM,WAAW,OAAO;AAAA,IACtB;AAAA,IACA,kBAAkB,EAAE,OAAO,CAAC,EAAE,SAAS,gBAAgB,CAAC,EAAE,IAAI,CAAC;AAAA,EACjE;AAEA,QAAM,YAAoC;AAAA,IACxC,CAAC,KAAK,MAAM,UAAU,IAAI,GAAG;AAAA,IAC7B,CAAC,KAAK,KAAK,WAAW,IAAI,GAAG,KAAK;AAAA,IAClC,CAAC,KAAK,KAAK,IAAI,GAAG,KAAK,UAAU,CAAC,QAAQ,CAAC;AAAA,EAC7C;AACA,MAAI,KAAK,MAAM;AACb,cAAU,KAAK,KAAK,KAAK,IAAI,IAAI,KAAK;AAAA,EACxC;AACA,WAAS,cAAc,SAAS;AAEhC,MAAI;AACF,UAAM,oBAAoB,QAAQ,QAAQ,IAAI,CAAC,UAAU,qBAAqB,KAAK,CAAC;AACpF,UAAM,uBAAuB,wBAAwB,iBAAiB;AACtE,QAAI,qBAAqB,SAAS,GAAG;AACnC,YAAM,IAAI;AAAA,QACR,2CAA2C,qBACxC,IAAI,CAAC,SAAS,IAAI,IAAI,GAAG,EACzB,KAAK,IAAI,CAAC;AAAA,MACf;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC7B,kBAAkB,IAAI,OAAO,UAAU;AACrC,YAAI;AACF,gBAAM,YAAY,MAAM,aAAa,MAAM,UAAU;AAAA,YACnD,OAAO,QAAQ;AAAA,YACf,QAAQ,QAAQ;AAAA,UAClB,CAAC;AAED,cAAI,CAAC,WAAW;AACd,mBAAO,EAAE,YAAY,KAAc;AAAA,UACrC;AAEA,iBAAO;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ,MAAM;AAAA,cACZ,MAAM;AAAA,cACN,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,KAAK;AACZ,gBAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,iBAAO;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ,MAAM;AAAA,cACZ;AAAA,gBACE,MAAM,MAAM;AAAA,gBACZ,OAAO;AAAA,gBACP,OAAO,MAAM;AAAA,cACf;AAAA,cACA,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,UAA2D,CAAC;AAClE,QAAI,kBAAkB;AAEtB,eAAW,WAAW,UAAU;AAC9B,UAAI,QAAQ,YAAY;AACtB,2BAAmB;AACnB;AAAA,MACF;AAEA,cAAQ,QAAQ,OAAO,IAAI,IAAI,QAAQ;AAAA,IACzC;AAEA,UAAM,cAAc,OAAO,OAAO,OAAO,EAAE,OAAO,CAAC,WAAW,OAAO,KAAK,EAAE;AAC5E,UAAM,WAAW,OAAO,KAAK,OAAO,EAAE;AAEtC,aAAS,cAAc;AAAA,MACrB,mCAAmC,kBAAkB;AAAA,MACrD,iCAAiC;AAAA,MACjC,yCAAyC;AAAA,MACzC,oCAAoC;AAAA,IACtC,CAAC;AAED,QAAI,cAAc,GAAG;AACnB,eAAS,UAAU;AAAA,QACjB,MAAMC,gBAAe;AAAA,QACrB,SAAS;AAAA,MACX,CAAC;AAAA,IACH,OAAO;AACL,eAAS,UAAU,EAAE,MAAMA,gBAAe,GAAG,CAAC;AAAA,IAChD;AAEA,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,UAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,aAAS,gBAAgB,KAAK;AAC9B,aAAS,UAAU;AAAA,MACjB,MAAMA,gBAAe;AAAA,MACrB,SAAS,MAAM;AAAA,IACjB,CAAC;AACD,WAAO,CAAC;AAAA,EACV,UAAE;AACA,aAAS,IAAI;AAAA,EACf;AACF;","names":["context","trace","SpanStatusCode","trace","context","SpanStatusCode"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/evals/scorer.factory.ts"],"sourcesContent":["import { Attr } from '../otel/semconv/attributes';\nimport type { ValidateName } from '../util/name-validation';\nimport type { Score, Scorer, ScorerOptions } from './scorer.types';\n\n// Helper to force TypeScript to evaluate/simplify types\ntype Simplify<T> = { [K in keyof T]: T[K] } & {};\n\ntype ScorerReturnValue = number | boolean | Score;\ntype AwaitedValue<T> = T extends Promise<infer U> ? U : T;\ntype InferScorerMetadata<T> =\n AwaitedValue<T> extends Score<infer TMetadata> ? TMetadata : Record<string, any>;\ntype NormalizeScorerReturn<T, TMetadata extends Record<string, any>> =\n T extends Promise<any> ? Promise<Score<TMetadata>> : Score<TMetadata>;\n\n/**\n * Creates a scorer to be used in evals.\n *\n * Scorers need to return a number or a boolean. If returning a number, it is\n * suggested that this number is between 0 and 1.\n *\n * @example\n * const scorer = createScorer('exact-match',\n * (args: { output: string; expected: string; }) => {\n * return args.output === args.expected ? true : false;\n * }\n * );\n *\n * @example\n * // With aggregation for trials\n * import { PassAtK } from '@axiomhq/ai/evals/aggregations';\n * const scorer = createScorer('tool-called',\n * (args: { output: string }) => args.output.includes('tool') ? 1 : 0,\n * { aggregation: PassAtK({ threshold: 0.8 }) }\n * );\n */\nexport function createScorer<\n TArgs extends Record<string, any> = {},\n // Use tuple wrapping to prevent distributive conditional types\n TInput = [TArgs] extends [{ input: infer I }] ? I : unknown,\n TExpected = [TArgs] extends [{ expected: infer E }] ? Exclude<E, undefined> : unknown,\n TOutput = [TArgs] extends [{ output: infer O }] ? Exclude<O, undefined> : never,\n TExtra extends Record<string, any> = Simplify<\n Omit<TArgs, 'input' | 'expected' | 'output' | 'trialIndex'>\n >,\n TReturn extends ScorerReturnValue | Promise<ScorerReturnValue> =\n | ScorerReturnValue\n | Promise<ScorerReturnValue>,\n TName extends string = string,\n>(\n /**\n * The name of the scorer\n */\n name: ValidateName<TName>,\n /**\n * The scorer function. Can be sync or async.\n */\n fn: (args: TArgs) => TReturn,\n /**\n * Optional configuration for the scorer, including aggregation for trials.\n */\n options?: ScorerOptions,\n): [TOutput] extends [never]\n ? never\n : Scorer<\n TInput,\n TExpected,\n TOutput,\n TExtra,\n InferScorerMetadata<TReturn>,\n NormalizeScorerReturn<TReturn, InferScorerMetadata<TReturn>>\n > {\n const normalizeScore = (res: ScorerReturnValue): Score => {\n if (typeof res === 'number') {\n return { score: res };\n }\n if (typeof res === 'boolean') {\n return {\n score: res ? 1 : 0,\n metadata: {\n [Attr.Eval.Score.IsBoolean]: true,\n },\n };\n }\n // Score object with boolean score - convert and merge is_boolean into metadata\n if (typeof res.score === 'boolean') {\n return {\n score: res.score ? 1 : 0,\n metadata: {\n ...res.metadata,\n [Attr.Eval.Score.IsBoolean]: true,\n },\n };\n }\n return res;\n };\n\n const scorer: any = (args: TArgs) => {\n const res = fn(args);\n\n // If user returned a Promise, handle async\n if (res instanceof Promise) {\n return res.then(normalizeScore);\n }\n\n // Otherwise handle sync\n return normalizeScore(res);\n };\n\n // Attach name property to function for pre-execution access\n Object.defineProperty(scorer, 'name', {\n value: name,\n configurable: true,\n enumerable: true,\n });\n\n // Attach aggregation config if provided\n if (options?.aggregation) {\n Object.defineProperty(scorer, 'aggregation', {\n value: options.aggregation,\n configurable: true,\n enumerable: true,\n });\n }\n\n return scorer as [TOutput] extends [never]\n ? never\n : Scorer<\n TInput,\n TExpected,\n TOutput,\n TExtra,\n InferScorerMetadata<TReturn>,\n NormalizeScorerReturn<TReturn, InferScorerMetadata<TReturn>>\n >;\n}\n"],"mappings":";;;;;;;;AAAA;AAmCO,SAAS,aAiBd,MAIA,IAIA,SAUI;AACJ,QAAM,iBAAiB,CAAC,QAAkC;AACxD,QAAI,OAAO,QAAQ,UAAU;AAC3B,aAAO,EAAE,OAAO,IAAI;AAAA,IACtB;AACA,QAAI,OAAO,QAAQ,WAAW;AAC5B,aAAO;AAAA,QACL,OAAO,MAAM,IAAI;AAAA,QACjB,UAAU;AAAA,UACR,CAAC,KAAK,KAAK,MAAM,SAAS,GAAG;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,IAAI,UAAU,WAAW;AAClC,aAAO;AAAA,QACL,OAAO,IAAI,QAAQ,IAAI;AAAA,QACvB,UAAU;AAAA,UACR,GAAG,IAAI;AAAA,UACP,CAAC,KAAK,KAAK,MAAM,SAAS,GAAG;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,SAAc,CAAC,SAAgB;AACnC,UAAM,MAAM,GAAG,IAAI;AAGnB,QAAI,eAAe,SAAS;AAC1B,aAAO,IAAI,KAAK,cAAc;AAAA,IAChC;AAGA,WAAO,eAAe,GAAG;AAAA,EAC3B;AAGA,SAAO,eAAe,QAAQ,QAAQ;AAAA,IACpC,OAAO;AAAA,IACP,cAAc;AAAA,IACd,YAAY;AAAA,EACd,CAAC;AAGD,MAAI,SAAS,aAAa;AACxB,WAAO,eAAe,QAAQ,eAAe;AAAA,MAC3C,OAAO,QAAQ;AAAA,MACf,cAAc;AAAA,MACd,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAEA,SAAO;AAUT;","names":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|