@vitest-evals/harness-ai-sdk 0.16.0 → 0.17.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/index.js +20 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +20 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -50,16 +50,32 @@ async function runAiSdkJudgeHarness(config, input, options) {
|
|
|
50
50
|
...options.signal ? { abortSignal: options.signal } : {}
|
|
51
51
|
};
|
|
52
52
|
if (input.responseFormat?.type === "json" && input.responseFormat.schema !== void 0) {
|
|
53
|
-
const
|
|
53
|
+
const result2 = await (0, import_ai.generateObject)({
|
|
54
54
|
...requestOptions,
|
|
55
55
|
schema: (0, import_ai.jsonSchema)(
|
|
56
56
|
input.responseFormat.schema
|
|
57
57
|
)
|
|
58
58
|
});
|
|
59
|
-
return object;
|
|
59
|
+
return createAiSdkJudgeRun(input, result2, (0, import_harness.normalizeContent)(result2.object));
|
|
60
60
|
}
|
|
61
|
-
const
|
|
62
|
-
return text;
|
|
61
|
+
const result = await (0, import_ai.generateText)(requestOptions);
|
|
62
|
+
return createAiSdkJudgeRun(input, result, result.text);
|
|
63
|
+
}
|
|
64
|
+
function createAiSdkJudgeRun(input, result, output) {
|
|
65
|
+
const usage = resolveUsage(result);
|
|
66
|
+
return {
|
|
67
|
+
output,
|
|
68
|
+
session: resolveSession(
|
|
69
|
+
input.prompt,
|
|
70
|
+
result,
|
|
71
|
+
output,
|
|
72
|
+
/* @__PURE__ */ new Map(),
|
|
73
|
+
[],
|
|
74
|
+
void 0
|
|
75
|
+
),
|
|
76
|
+
usage,
|
|
77
|
+
errors: []
|
|
78
|
+
};
|
|
63
79
|
}
|
|
64
80
|
function formatAiSdkJudgeSystemPrompt(system, responseFormat) {
|
|
65
81
|
if (responseFormat?.type !== "json" || responseFormat.schema !== void 0) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n attachHarnessRunToError,\n createFailedHarnessRun,\n createGenAiUsageAttributes,\n ensureRunTrace,\n getHarnessRunFromError,\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n normalizeSpanAttributes,\n normalizeSpanError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessRun,\n JsonValue,\n TranscriptToolCallEvent,\n TranscriptEvent,\n NormalizedSpan,\n NormalizedSession,\n NormalizedTrace,\n TimingSummary,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport { generateObject, generateText, jsonSchema } from \"ai\";\nimport {\n createJudgeHarness,\n type JudgeHarnessInput,\n} from \"vitest-evals/judges\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMetadata,\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\nimport type {\n InferToolInput,\n InferToolOutput,\n LanguageModel,\n LanguageModelUsage,\n StepResult,\n Tool,\n ToolExecuteFunction,\n ToolExecutionOptions,\n ToolSet,\n} from \"ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AiSdkProviderOptions = Parameters<\n typeof generateText\n>[0][\"providerOptions\"];\ntype JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<TAgent, TInput = string> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<TInput = string> = Record<\n string,\n AiSdkToolDefinition<any, any, TInput>\n>;\n\nlet nextTraceId = 0;\n\n/**\n * Configuration for adapting an AI SDK language model into a judge harness.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n * ```\n */\nexport interface AiSdkJudgeHarnessConfig {\n /** AI SDK language model used for judge prompts. */\n model: LanguageModel;\n /** Optional display name for diagnostics. */\n name?: string;\n /** Optional judge-model temperature. */\n temperature?: number;\n /** Optional judge-model token cap. */\n maxOutputTokens?: number;\n /** Optional provider-specific options forwarded to the AI SDK. */\n providerOptions?: AiSdkProviderOptions;\n}\n\n/**\n * Adapts an AI SDK language model into the provider-neutral judge harness API.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n * import { describeEval, FactualityJudge } from \"vitest-evals\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n *\n * describeEval(\"qa agent\", {\n * harness: qaHarness,\n * judgeHarness,\n * judges: [FactualityJudge()],\n * }, (it) => {});\n * ```\n */\nexport function aiSdkJudgeHarness(config: AiSdkJudgeHarnessConfig) {\n return createJudgeHarness({\n name: config.name ?? \"ai-sdk\",\n run: (input, options) => runAiSdkJudgeHarness(config, input, options),\n });\n}\n\nasync function runAiSdkJudgeHarness(\n config: AiSdkJudgeHarnessConfig,\n input: JudgeHarnessInput,\n options: { signal?: AbortSignal },\n) {\n const system = formatAiSdkJudgeSystemPrompt(\n input.system,\n input.responseFormat,\n );\n const requestOptions = {\n model: config.model,\n prompt: input.prompt,\n ...(system !== undefined ? { system } : {}),\n ...(config.temperature !== undefined\n ? { temperature: config.temperature }\n : {}),\n ...(config.maxOutputTokens !== undefined\n ? { maxOutputTokens: config.maxOutputTokens }\n : {}),\n ...(config.providerOptions !== undefined\n ? { providerOptions: config.providerOptions }\n : {}),\n ...(options.signal ? { abortSignal: options.signal } : {}),\n };\n\n if (\n input.responseFormat?.type === \"json\" &&\n input.responseFormat.schema !== undefined\n ) {\n const { object } = await generateObject({\n ...requestOptions,\n schema: jsonSchema(\n input.responseFormat.schema as Parameters<typeof jsonSchema>[0],\n ),\n });\n\n return object;\n }\n\n const { text } = await generateText(requestOptions);\n return text;\n}\n\nfunction formatAiSdkJudgeSystemPrompt(\n system: string | undefined,\n responseFormat: JudgeHarnessInput[\"responseFormat\"],\n) {\n if (responseFormat?.type !== \"json\" || responseFormat.schema !== undefined) {\n return system;\n }\n\n const jsonInstruction =\n \"Return only valid JSON. Do not include markdown fences or explanatory prose.\";\n\n return system ? `${system}\\n\\n${jsonInstruction}` : jsonInstruction;\n}\n\ntype StepLike = Pick<\n StepResult<ToolSet>,\n | \"content\"\n | \"finishReason\"\n | \"model\"\n | \"rawFinishReason\"\n | \"reasoningText\"\n | \"response\"\n | \"stepNumber\"\n | \"text\"\n | \"toolCalls\"\n | \"toolResults\"\n | \"usage\"\n>;\n\ntype AiSdkLikeResult = {\n steps?: StepLike[];\n usage?: LanguageModelUsage;\n totalUsage?: LanguageModelUsage;\n output?: unknown;\n object?: unknown;\n text?: string;\n session?: NormalizedSession;\n errors?: Array<Record<string, JsonValue>>;\n};\n\ntype AiSdkResultOutput<TResult> = TResult extends HarnessRun<infer TOutput>\n ? TOutput\n : \"output\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"output\">\n : \"object\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"object\">\n : \"text\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"text\">\n : undefined;\ntype AiSdkAgentResult<\n TAgent,\n TInput,\n TTools extends AiSdkToolset<TInput>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : TAgent extends {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n }\n ? Awaited<TResult>\n : unknown;\n\n/** Context passed to instrumented AI SDK tool executions. */\nexport interface AiSdkToolContext<TInput = string> {\n input: TInput;\n signal?: AbortSignal;\n setArtifact: HarnessContext[\"setArtifact\"];\n execution: ToolExecutionOptions;\n}\n\n/** Replay mode alias used by the AI SDK harness package. */\nexport type AiSdkReplayMode = ReplayMode;\n\n/** Tool replay recording shape for AI SDK tools. */\nexport type AiSdkToolRecording<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for an AI SDK tool. */\nexport type AiSdkToolReplayConfig<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput>>;\n\n/** AI SDK tool definition accepted by the harness. */\nexport type AiSdkToolDefinition<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n _TInput = string,\n> = Tool<TArgs, TResult>;\n\n/** Replay policy for one AI SDK tool. */\nexport type AiSdkToolReplayPolicy<TInput = string> =\n | boolean\n | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput>;\n\n/** Replay policy map keyed by AI SDK tool name. */\nexport type AiSdkToolReplayPolicies<TInput = string> = Record<\n string,\n AiSdkToolReplayPolicy<TInput>\n>;\n\n/** Toolset shape accepted by the AI SDK harness. */\nexport type AiSdkToolset<TInput = string> = AnyAiSdkToolset<TInput>;\n\n/** Runtime toolset exposed to the system under test. */\nexport type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any>> = {\n [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<\n infer TArgs extends JsonValue,\n infer TResult extends JsonValue,\n infer _TInput\n >\n ? Omit<TTools[K], \"execute\"> & {\n execute?: ToolExecuteFunction<TArgs, TResult>;\n }\n : TTools[K];\n};\n\n/** Runtime object passed into AI SDK-style agent entrypoints. */\nexport interface AiSdkRuntime<\n TTools extends AiSdkToolset<TInput>,\n TInput = string,\n> {\n tools: AiSdkRuntimeToolset<TTools>;\n signal?: AbortSignal;\n}\n\n/** Arguments passed to per-run AI SDK agent factories. */\nexport interface AiSdkCreateAgentArgs<TInput = string> {\n input: TInput;\n context: HarnessContext;\n}\n\n/** Arguments passed to custom AI SDK harness run callbacks. */\nexport interface AiSdkHarnessRunArgs<\n TAgent,\n TInput,\n TTools extends AiSdkToolset<TInput>,\n> {\n agent: TAgent | undefined;\n input: TInput;\n context: HarnessContext;\n runtime: AiSdkRuntime<TTools, TInput>;\n tools: AiSdkRuntimeToolset<TTools>;\n}\n\n/** Arguments passed to AI SDK harness output selectors. */\nexport interface AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TResult,\n TTools extends AiSdkToolset<TInput>,\n> extends AiSdkHarnessRunArgs<TAgent, TInput, TTools> {\n result: TResult;\n}\n\ntype AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TResult,\n TTools extends AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined,\n> = (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype AiSdkHarnessOptions<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> &\n (\n | {\n agent: AgentSource<TAgent, TInput>;\n run?: never;\n }\n | {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n agent?: never;\n }\n );\n\ntype AiSdkHarnessOptionsWithOutput<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput> & {\n output: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n};\n\ntype AiSdkHarnessRunOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult>;\n agent?: never;\n output?: never;\n};\n\ntype AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n agent: AgentSource<TAgent, TInput>;\n run?: never;\n output?: never;\n};\n\ninterface AiSdkHarnessBaseOptions<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput>;\n output?: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\n/** Adapts an AI SDK-style workflow into a normalized eval harness. */\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptionsWithOutput<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessRunOptionsWithoutOutput<TAgent, TInput, TResult, TTools>,\n): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessAgentOptionsWithoutOutput<TAgent, TInput, TTools>,\n): Harness<TInput, AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TTools>>>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): Harness<TInput, TOutput> {\n validateOptions(options);\n\n const harnessName = options.name ?? \"ai-sdk\";\n const harness: Harness<TInput, TOutput> = {\n name: harnessName,\n run: async (input, context) => {\n const startedAt = new Date();\n\n try {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n return await runAiSdkHarness(options, agent, input, context);\n } catch (error) {\n if (getHarnessRunFromError(error)) {\n throw error;\n }\n\n throw attachHarnessRunToError(\n error,\n createFailedAiSdkRun(input, context, error, harnessName, startedAt),\n );\n }\n },\n };\n\n return harness;\n}\n\nfunction createFailedAiSdkRun<TInput>(\n input: TInput,\n context: HarnessContext,\n error: unknown,\n harnessName: string,\n startedAt: Date,\n) {\n const run = createFailedHarnessRun(input, error, {\n artifacts: context.artifacts,\n });\n ensureRunTrace(run, {\n name: harnessName,\n startedAt,\n finishedAt: new Date(),\n operationName: \"invoke_workflow\",\n source: \"harness-ai-sdk\",\n });\n\n return run;\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext,\n): Promise<HarnessRun<TOutput>> {\n const trace = createTraceRecorder(options.name ?? \"ai-sdk\");\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const runtimeEvents: TranscriptEvent[] = [];\n const tools = createToolset({\n input,\n context,\n tools: options.tools,\n toolReplay: options.toolReplay,\n replayMetadataByToolCallId,\n runtimeEvents,\n });\n const runtime = {\n tools,\n signal: context.signal,\n } satisfies AiSdkRuntime<TTools, TInput>;\n\n try {\n const result = await runAgent(options, {\n agent,\n input,\n context,\n runtime,\n tools,\n });\n\n if (isHarnessRun(result) && !hasOutputSelector(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n attachAiSdkTrace(result, trace, result, new Date());\n return result;\n }\n\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n tools,\n result: result as TResult,\n } satisfies AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools>;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(result) as TOutput | undefined);\n const explicitSession = getResultSession(result);\n const useRuntimeEvents = shouldUseRuntimeEvents(result);\n const usage = resolveUsage(\n result,\n useRuntimeEvents ? runtimeEvents : [],\n explicitSession,\n );\n const session = resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeEvents,\n explicitSession,\n );\n const errors = resolveHarnessRunErrors(result);\n const finishedAt = new Date();\n\n return {\n session,\n output,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors,\n traces: [\n finishAiSdkTrace(trace, {\n result,\n session,\n usage,\n errors,\n finishedAt,\n }),\n ],\n } as HarnessRun<TOutput>;\n } catch (error) {\n const finishedAt = new Date();\n const serializedError = serializeError(error);\n const runtimeToolCallCount = runtimeEvents.filter(\n (event) => event.type === \"tool_call\",\n ).length;\n const usage =\n runtimeToolCallCount > 0 ? { toolCalls: runtimeToolCallCount } : {};\n const session = resolveFailureSession(input, runtimeEvents);\n const run = {\n session,\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializedError],\n traces: [\n finishAiSdkTrace(trace, {\n session,\n usage,\n errors: [serializedError],\n finishedAt,\n }),\n ],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(options: AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput>) {\n return Boolean(options.output);\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: AiSdkCreateAgentArgs<TInput>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (hasAiSdkRunMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (hasAiSdkGenerateMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.generate(args.input, args.runtime);\n }\n\n throw new Error(\n \"aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use run() for a custom entrypoint.\",\n );\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>) {\n const hasAgent = hasAgentSource(options);\n const hasRun = typeof (options as { run?: unknown }).run === \"function\";\n const entrypoints = [hasAgent, hasRun].filter(Boolean).length;\n\n if (entrypoints > 1) {\n throw new Error(\n \"aiSdkHarness accepts exactly one of agent or run. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or run for a custom entrypoint.\",\n );\n }\n\n if (entrypoints === 0) {\n throw new Error(\n \"aiSdkHarness requires agent or run. Use agent for objects with run(input, runtime) or generate(input, runtime), or run for a custom entrypoint.\",\n );\n }\n}\n\nfunction hasAgentSource<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n> & { agent: AgentSource<TAgent, TInput> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n args: AiSdkCreateAgentArgs<TInput>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n): agent is (args: AiSdkCreateAgentArgs<TInput>) => MaybePromise<TAgent> {\n return (\n typeof agent === \"function\" &&\n !hasCallableMethod(agent, \"run\") &&\n !hasCallableMethod(agent, \"generate\")\n );\n}\n\ntype TraceRecorder = {\n id: string;\n rootSpanId: string;\n name: string;\n startedAt: Date;\n};\n\nfunction createTraceRecorder(name: string): TraceRecorder {\n const id = `ai_sdk_trace_${++nextTraceId}`;\n\n return {\n id,\n rootSpanId: `${id}:run`,\n name,\n startedAt: new Date(),\n };\n}\n\nfunction attachAiSdkTrace(\n run: HarnessRun,\n trace: TraceRecorder,\n result: unknown,\n finishedAt: Date,\n) {\n const errors = run.errors ?? [];\n const nativeTrace = finishAiSdkTrace(trace, {\n result,\n session: run.session,\n usage: run.usage,\n errors,\n finishedAt,\n });\n\n run.traces = [...(run.traces ?? []), nativeTrace];\n}\n\nfunction finishAiSdkTrace(\n trace: TraceRecorder,\n options: {\n result?: unknown;\n session: NormalizedSession;\n usage?: UsageSummary;\n errors?: unknown[];\n finishedAt: Date;\n },\n): NormalizedTrace {\n const modelSpans = createAiSdkModelSpans(\n trace,\n options.result,\n options.usage,\n );\n const finishedAt = options.finishedAt;\n const durationMs = finishedAt.getTime() - trace.startedAt.getTime();\n const rootError = options.errors?.[0]\n ? normalizeSpanError(options.errors[0])\n : undefined;\n const rootSpan: NormalizedSpan = {\n id: trace.rootSpanId,\n traceId: trace.id,\n name: trace.name,\n kind: \"run\",\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n status: rootError ? \"error\" : \"ok\",\n ...(rootError ? { error: rootError } : {}),\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"invoke_workflow\",\n \"gen_ai.workflow.name\": trace.name,\n ...createGenAiUsageAttributes(options.usage),\n }),\n };\n const spans = [rootSpan, ...modelSpans];\n\n return {\n id: trace.id,\n name: trace.name,\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n metadata: {\n source: \"harness-ai-sdk\",\n },\n spans,\n };\n}\n\nfunction createAiSdkModelSpans(\n trace: TraceRecorder,\n result: unknown,\n usage: UsageSummary | undefined,\n): NormalizedSpan[] {\n const steps = readAiSdkSteps(result);\n if (steps.length === 0) {\n const fallback = createUsageModelSpan(trace, usage);\n return fallback ? [fallback] : [];\n }\n\n return steps.map((step, index) => {\n const stepUsage = step.usage;\n\n return {\n id: `${trace.id}:model:${index + 1}`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: `ai-sdk step ${step.stepNumber ?? index}`,\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n \"gen_ai.provider.name\": step.model?.provider,\n \"gen_ai.request.model\": step.model?.modelId,\n \"gen_ai.response.model\": step.model?.modelId,\n \"gen_ai.response.finish_reasons\": step.finishReason\n ? [String(step.finishReason)]\n : undefined,\n \"gen_ai.usage.input_tokens\": stepUsage?.inputTokens,\n \"gen_ai.usage.output_tokens\": stepUsage?.outputTokens,\n \"gen_ai.usage.reasoning.output_tokens\":\n stepUsage?.outputTokenDetails?.reasoningTokens ??\n stepUsage?.reasoningTokens,\n \"gen_ai.usage.cache_read.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheReadTokens ??\n stepUsage?.cachedInputTokens,\n \"gen_ai.usage.cache_creation.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheWriteTokens,\n \"ai.step.number\": step.stepNumber,\n \"ai.finish_reason\": step.finishReason,\n \"ai.raw_finish_reason\": step.rawFinishReason,\n }),\n } satisfies NormalizedSpan;\n });\n}\n\nfunction createUsageModelSpan(\n trace: TraceRecorder,\n usage: UsageSummary | undefined,\n): NormalizedSpan | undefined {\n if (!usage?.provider && !usage?.model) {\n return undefined;\n }\n\n return {\n id: `${trace.id}:model:1`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: usage.model ? `ai-sdk ${usage.model}` : \"ai-sdk model\",\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n ...createGenAiUsageAttributes(usage),\n }),\n };\n}\n\nfunction createToolset<TInput, TTools extends AiSdkToolset<TInput>>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeEvents,\n}: {\n input: TInput;\n context: HarnessContext;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput> | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeEvents: TranscriptEvent[];\n}) {\n return Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => {\n const replay = toolReplay?.[toolName];\n\n if (replay && !tool.execute) {\n throw new Error(\n `Tool replay requires execute() for ${toolName}. Provider-executed tools cannot be recorded automatically.`,\n );\n }\n\n if (!tool.execute) {\n return [toolName, tool];\n }\n\n const execute = tool.execute;\n const wrappedTool = {\n ...tool,\n execute: async (\n toolInput: InferToolInput<typeof tool>,\n execution: ToolExecutionOptions,\n ) => {\n const startedAt = new Date();\n const normalizedArgs = normalizeArguments(toolInput);\n const call: TranscriptToolCallEvent = {\n type: \"tool_call\",\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n startedAt: startedAt.toISOString(),\n };\n runtimeEvents.push(call);\n const replayContext = {\n input,\n signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput>;\n\n try {\n const executionResult = replay\n ? await executeToolWithReplay({\n toolName,\n toolInput,\n execute,\n execution,\n context: replayContext,\n replay,\n })\n : {\n result: await execute(toolInput, execution),\n replay: undefined,\n };\n const finishedAt = new Date();\n const replayMetadata = normalizeReplayMetadata(\n executionResult.replay,\n );\n\n if (executionResult.replay) {\n replayMetadataByToolCallId.set(\n execution.toolCallId,\n executionResult.replay,\n );\n }\n\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n if (replayMetadata) {\n call.metadata = replayMetadata;\n }\n const normalizedResult = toJsonValue(executionResult.result);\n runtimeEvents.push({\n type: \"tool_result\",\n toolCallId: execution.toolCallId,\n name: toolName,\n ...(normalizedResult !== undefined\n ? { content: normalizedResult }\n : {}),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n\n return executionResult.result as InferToolOutput<typeof tool>;\n } catch (error) {\n const replay = getReplayMetadataFromError(error);\n const finishedAt = new Date();\n const replayMetadata = normalizeReplayMetadata(replay);\n\n if (replay) {\n replayMetadataByToolCallId.set(execution.toolCallId, replay);\n }\n\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n if (replayMetadata) {\n call.metadata = replayMetadata;\n }\n runtimeEvents.push({\n type: \"tool_result\",\n toolCallId: execution.toolCallId,\n name: toolName,\n error: normalizeError(error),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n throw error;\n }\n },\n } satisfies typeof tool;\n\n return [toolName, wrappedTool];\n }),\n ) as AiSdkRuntimeToolset<TTools>;\n}\n\nasync function executeToolWithReplay<\n TInput,\n TTool extends AiSdkToolDefinition<any, any, TInput>,\n>({\n toolName,\n toolInput,\n execute,\n execution,\n context,\n replay,\n}: {\n toolName: string;\n toolInput: InferToolInput<TTool>;\n execute: NonNullable<TTool[\"execute\"]>;\n execution: ToolExecutionOptions;\n context: AiSdkToolContext<TInput>;\n replay: AiSdkToolReplayPolicy<TInput>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<JsonValue, JsonValue, AiSdkToolContext<TInput>>({\n toolName,\n args: replayInput,\n context,\n execute: async (replayedInput) => {\n const output = await execute(\n replayedInput as InferToolInput<TTool>,\n execution,\n );\n\n if (isAsyncIterable(output)) {\n throw new Error(\n `Tool replay only supports JSON-serializable outputs. ${toolName} returned an async iterable.`,\n );\n }\n\n return toReplayJsonValue(output, `${toolName} tool output`);\n },\n replay,\n });\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const candidates = [\"output\", \"object\", \"text\"] satisfies string[];\n const resultRecord = result as Record<string, unknown>;\n\n for (const key of candidates) {\n if (Object.prototype.hasOwnProperty.call(resultRecord, key)) {\n return toOutputValue(resultRecord[key]);\n }\n }\n\n return undefined;\n}\n\n// Keep this adapter-local rather than exporting a core helper. Core\n// `toJsonValue` normalizes trace data; inferred app output should only accept\n// values that are already JSON-safe so the public contract stays explicit.\n// Invalid nested values reject the whole candidate instead of being patched.\nfunction toOutputValue(value: unknown): JsonValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (Array.isArray(value)) {\n const items: JsonValue[] = [];\n for (const item of value) {\n const normalized = toOutputValue(item);\n if (normalized === undefined) {\n return undefined;\n }\n items.push(normalized);\n }\n return items;\n }\n\n if (typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return undefined;\n }\n\n const record: Record<string, JsonValue> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = toOutputValue(entry);\n if (normalized === undefined) {\n return undefined;\n }\n record[key] = normalized;\n }\n return record;\n }\n\n return undefined;\n}\n\nfunction resolveUsage(\n result: unknown,\n runtimeEvents: TranscriptEvent[] = [],\n explicitSession?: NormalizedSession,\n): UsageSummary {\n const steps = readAiSdkSteps(result);\n const runtimeToolCallCount = countRuntimeToolCalls(runtimeEvents);\n const explicitSessionToolCallCount = explicitSession\n ? countSessionToolCalls(explicitSession)\n : undefined;\n const usage = readAiSdkUsage(result, steps);\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n // Runtime events count only for custom runs without AI SDK steps, so usage\n // stays aligned with the same transcript source used for assertions.\n const toolCallCount =\n explicitSessionToolCallCount ??\n (steps.length > 0 ? countStepToolCalls(steps) : runtimeToolCallCount);\n\n if (!usage) {\n if (toolCallCount > 0 || steps.length > 0) {\n return {\n provider: lastStep?.model?.provider,\n model: lastStep?.model?.modelId,\n ...(toolCallCount > 0 ? { toolCalls: toolCallCount } : {}),\n };\n }\n\n return {};\n }\n\n return {\n provider: lastStep?.model?.provider,\n model: lastStep?.model?.modelId,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens:\n usage.outputTokenDetails?.reasoningTokens ?? usage.reasoningTokens,\n totalTokens:\n usage.totalTokens ?? (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),\n toolCalls: toolCallCount > 0 ? toolCallCount : undefined,\n metadata: normalizeMetadata({\n cacheReadTokens:\n usage.inputTokenDetails?.cacheReadTokens ?? usage.cachedInputTokens,\n cacheWriteTokens: usage.inputTokenDetails?.cacheWriteTokens,\n raw: usage.raw,\n }),\n };\n}\n\nfunction countRuntimeToolCalls(events: readonly TranscriptEvent[]) {\n return events.filter((event) => event.type === \"tool_call\").length;\n}\n\nfunction resolveStepUsage(steps: StepLike[]): LanguageModelUsage | undefined {\n const usages = steps.map((step) => step.usage).filter(isLanguageModelUsage);\n\n if (usages.length === 0) {\n return undefined;\n }\n\n return usages.reduce(addLanguageModelUsage);\n}\n\nfunction addLanguageModelUsage(\n left: LanguageModelUsage,\n right: LanguageModelUsage,\n): LanguageModelUsage {\n return {\n inputTokens: addTokenCounts(left.inputTokens, right.inputTokens),\n inputTokenDetails: {\n noCacheTokens: addTokenCounts(\n left.inputTokenDetails?.noCacheTokens,\n right.inputTokenDetails?.noCacheTokens,\n ),\n cacheReadTokens: addTokenCounts(\n left.inputTokenDetails?.cacheReadTokens,\n right.inputTokenDetails?.cacheReadTokens,\n ),\n cacheWriteTokens: addTokenCounts(\n left.inputTokenDetails?.cacheWriteTokens,\n right.inputTokenDetails?.cacheWriteTokens,\n ),\n },\n outputTokens: addTokenCounts(left.outputTokens, right.outputTokens),\n outputTokenDetails: {\n textTokens: addTokenCounts(\n left.outputTokenDetails?.textTokens,\n right.outputTokenDetails?.textTokens,\n ),\n reasoningTokens: addTokenCounts(\n left.outputTokenDetails?.reasoningTokens,\n right.outputTokenDetails?.reasoningTokens,\n ),\n },\n totalTokens: addTokenCounts(left.totalTokens, right.totalTokens),\n reasoningTokens: addTokenCounts(\n left.reasoningTokens,\n right.reasoningTokens,\n ),\n cachedInputTokens: addTokenCounts(\n left.cachedInputTokens,\n right.cachedInputTokens,\n ),\n };\n}\n\nfunction addTokenCounts(left: number | undefined, right: number | undefined) {\n return left == null && right == null ? undefined : (left ?? 0) + (right ?? 0);\n}\n\nfunction countStepToolCalls(steps: StepLike[]) {\n return steps.reduce(\n (count, step) => count + (step.toolCalls?.length ?? 0),\n 0,\n );\n}\n\nfunction countSessionToolCalls(session: NormalizedSession) {\n return session.events.filter((event) => event.type === \"tool_call\").length;\n}\n\nfunction shouldUseRuntimeEvents(result: unknown) {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return false;\n }\n\n return readAiSdkSteps(result).length === 0;\n}\n\nfunction resolveSession(\n input: unknown,\n result: unknown,\n output: JsonValue | undefined,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n runtimeEvents: TranscriptEvent[] = [],\n explicitSession = getResultSession(result),\n): NormalizedSession {\n if (explicitSession) {\n return explicitSession;\n }\n\n const steps = readAiSdkSteps(result);\n const events: TranscriptEvent[] = [\n {\n type: \"message\",\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n\n for (const step of steps) {\n events.push(...normalizeStep(step, replayMetadataByToolCallId));\n }\n\n // Runtime events are only the transcript source when no AI SDK steps exist;\n // explicit sessions returned above and provider steps stay authoritative.\n if (steps.length === 0) {\n events.push(...runtimeEvents);\n }\n\n if (\n output !== undefined &&\n !events.some(\n (event) =>\n event.type === \"message\" &&\n event.role === \"assistant\" &&\n event.content !== undefined,\n )\n ) {\n events.push({\n type: \"message\",\n role: \"assistant\",\n content: output,\n });\n }\n\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n return {\n events,\n provider: lastStep?.model?.provider,\n model: lastStep?.model?.modelId,\n };\n}\n\nfunction getResultSession(result: unknown): NormalizedSession | undefined {\n const session = (result as Record<string, unknown> | undefined)?.session;\n return isNormalizedSession(session) ? session : undefined;\n}\n\nfunction resolveFailureSession(\n input: unknown,\n runtimeEvents: TranscriptEvent[],\n): NormalizedSession {\n return {\n events: [\n {\n type: \"message\",\n role: \"user\",\n content: normalizeContent(input),\n },\n ...runtimeEvents,\n ],\n };\n}\n\n/** Reads AI SDK step arrays only when the field looks like provider step data. */\nfunction readAiSdkSteps(result: unknown): StepLike[] {\n if (!result || typeof result !== \"object\") {\n return [];\n }\n\n if (!Object.prototype.hasOwnProperty.call(result, \"steps\")) {\n return [];\n }\n\n const steps = (result as AiSdkLikeResult).steps;\n if (!Array.isArray(steps)) {\n return [];\n }\n if (steps.length > 0 && !steps.every(isAiSdkStepLike)) {\n return [];\n }\n\n return steps;\n}\n\nfunction isAiSdkStepLike(step: unknown): step is StepLike {\n if (!step || typeof step !== \"object\") {\n return false;\n }\n\n const record = step as Record<string, unknown>;\n return (\n Array.isArray(record.content) ||\n Array.isArray(record.toolCalls) ||\n Array.isArray(record.toolResults) ||\n Boolean(record.response && typeof record.response === \"object\") ||\n Boolean(record.usage && typeof record.usage === \"object\") ||\n typeof record.finishReason === \"string\" ||\n typeof record.stepNumber === \"number\" ||\n typeof record.text === \"string\"\n );\n}\n\nfunction readAiSdkUsage(\n result: unknown,\n steps: StepLike[],\n): LanguageModelUsage | undefined {\n // AI SDK generateText exposes aggregate `totalUsage`; `usage` is the last\n // step and only applies to non-step results such as generateObject.\n const totalUsage = readUsageField(result, \"totalUsage\");\n if (totalUsage) {\n return totalUsage;\n }\n\n if (steps.length > 0) {\n return resolveStepUsage(steps);\n }\n\n return readUsageField(result, \"usage\");\n}\n\nfunction readUsageField(\n result: unknown,\n field: \"usage\" | \"totalUsage\",\n): LanguageModelUsage | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const usage = (result as AiSdkLikeResult)[field];\n return isLanguageModelUsage(usage) ? usage : undefined;\n}\n\nfunction isLanguageModelUsage(value: unknown): value is LanguageModelUsage {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const usage = value as LanguageModelUsage;\n return (\n isOptionalFiniteNumber(usage.inputTokens) &&\n isOptionalFiniteNumber(usage.outputTokens) &&\n isOptionalFiniteNumber(usage.reasoningTokens) &&\n isOptionalFiniteNumber(usage.totalTokens) &&\n isOptionalFiniteNumber(usage.cachedInputTokens) &&\n isUsageDetailObject(usage.inputTokenDetails) &&\n isUsageDetailObject(usage.outputTokenDetails)\n );\n}\n\nfunction isUsageDetailObject(value: unknown) {\n if (value === undefined) {\n return true;\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n return Object.values(value).every(isOptionalFiniteNumber);\n}\n\nfunction isOptionalFiniteNumber(value: unknown) {\n return (\n value === undefined || (typeof value === \"number\" && Number.isFinite(value))\n );\n}\n\nfunction normalizeStep(\n step: StepLike,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): TranscriptEvent[] {\n const toolResultsById = new Map(\n (step.toolResults ?? []).map((toolResult) => [\n toolResult.toolCallId,\n toolResult,\n ]),\n );\n const toolErrorsById = new Map(\n (step.toolCalls ?? [])\n .filter((toolCall) => toolCall.invalid || toolCall.error !== undefined)\n .map((toolCall) => [\n toolCall.toolCallId,\n normalizeError(toolCall.error ?? toolCall.invalid),\n ]),\n );\n\n const normalizedCalls = (step.toolCalls ?? []).map((toolCall) =>\n normalizeToolCall(toolCall, toolResultsById, replayMetadataByToolCallId),\n );\n const assistantMetadata = normalizeMetadata({\n stepNumber: step.stepNumber,\n finishReason: step.finishReason,\n rawFinishReason: step.rawFinishReason,\n reasoningText: step.reasoningText,\n response: step.response,\n });\n const events: TranscriptEvent[] = [];\n\n if (step.text || assistantMetadata) {\n events.push({\n type: \"message\",\n role: \"assistant\",\n ...(step.text ? { content: step.text } : {}),\n ...(assistantMetadata ? { metadata: assistantMetadata } : {}),\n });\n }\n\n events.push(...normalizedCalls);\n\n for (const toolResult of step.toolResults ?? []) {\n const content =\n toolResult.output === undefined\n ? undefined\n : normalizeContent(toolResult.output);\n events.push({\n type: \"tool_result\",\n toolCallId: toolResult.toolCallId,\n name: toolResult.toolName,\n ...(content !== undefined ? { content } : {}),\n ...(toolErrorsById.has(toolResult.toolCallId)\n ? { error: toolErrorsById.get(toolResult.toolCallId) }\n : {}),\n metadata: normalizeMetadata({\n preliminary: toolResult.preliminary,\n providerExecuted: toolResult.providerExecuted,\n title: toolResult.title,\n providerMetadata: toolResult.providerMetadata,\n }),\n });\n }\n\n return events;\n}\n\nfunction normalizeToolCall(\n toolCall: StepLike[\"toolCalls\"][number],\n toolResultsById: Map<string, StepLike[\"toolResults\"][number]>,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): TranscriptToolCallEvent {\n const toolResult = toolResultsById.get(toolCall.toolCallId);\n const normalizedArguments = normalizeArguments(toolCall.input);\n const errorValue =\n toolCall.invalid || toolCall.error !== undefined\n ? normalizeError(toolCall.error ?? toolCall.invalid)\n : undefined;\n const replayMetadata = normalizeReplayMetadata(\n replayMetadataByToolCallId.get(toolCall.toolCallId),\n );\n\n return {\n type: \"tool_call\",\n id: toolCall.toolCallId,\n name: toolCall.toolName,\n ...(normalizedArguments ? { arguments: normalizedArguments } : {}),\n metadata: normalizeMetadata({\n providerExecuted:\n toolCall.providerExecuted ?? toolResult?.providerExecuted,\n title: toolCall.title ?? toolResult?.title,\n dynamic: toolCall.dynamic,\n invalid: toolCall.invalid,\n ...(errorValue ? { error: errorValue } : {}),\n preliminary: toolResult?.preliminary,\n providerMetadata:\n toolCall.providerMetadata ?? toolResult?.providerMetadata,\n ...(replayMetadata ?? {}),\n }),\n };\n}\n\nfunction normalizeArguments(\n value: unknown,\n): Record<string, JsonValue> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n return normalizeRecord(value as Record<string, unknown>);\n}\n\nfunction normalizeError(error: unknown) {\n if (error instanceof Error) {\n return {\n type: error.name,\n message: error.message,\n };\n }\n\n const normalized = toJsonValue(error);\n if (\n normalized &&\n typeof normalized === \"object\" &&\n !Array.isArray(normalized) &&\n typeof normalized.message === \"string\"\n ) {\n return {\n message: normalized.message,\n type: typeof normalized.type === \"string\" ? normalized.type : \"Error\",\n };\n }\n\n return {\n type: \"Error\",\n message: String(error ?? \"Unknown tool call error\"),\n };\n}\n\nfunction toReplayJsonValue(value: unknown, label: string): JsonValue {\n const normalized = toJsonValue(value);\n if (normalized === undefined) {\n throw new Error(\n `Tool replay only supports JSON-serializable values. ${label} could not be normalized.`,\n );\n }\n\n return normalized;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n Symbol.asyncIterator in value\n );\n}\n"],"mappings":"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","names":["replay"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n attachHarnessRunToError,\n createFailedHarnessRun,\n createGenAiUsageAttributes,\n ensureRunTrace,\n getHarnessRunFromError,\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n normalizeSpanAttributes,\n normalizeSpanError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessRun,\n JsonValue,\n TranscriptToolCallEvent,\n TranscriptEvent,\n NormalizedSpan,\n NormalizedSession,\n NormalizedTrace,\n TimingSummary,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport { generateObject, generateText, jsonSchema } from \"ai\";\nimport {\n createJudgeHarness,\n type JudgeHarnessInput,\n} from \"vitest-evals/judges\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMetadata,\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\nimport type {\n InferToolInput,\n InferToolOutput,\n LanguageModel,\n LanguageModelUsage,\n StepResult,\n Tool,\n ToolExecuteFunction,\n ToolExecutionOptions,\n ToolSet,\n} from \"ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AiSdkProviderOptions = Parameters<\n typeof generateText\n>[0][\"providerOptions\"];\ntype JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<TAgent, TInput = string> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<TInput = string> = Record<\n string,\n AiSdkToolDefinition<any, any, TInput>\n>;\n\nlet nextTraceId = 0;\n\n/**\n * Configuration for adapting an AI SDK language model into a judge harness.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n * ```\n */\nexport interface AiSdkJudgeHarnessConfig {\n /** AI SDK language model used for judge prompts. */\n model: LanguageModel;\n /** Optional display name for diagnostics. */\n name?: string;\n /** Optional judge-model temperature. */\n temperature?: number;\n /** Optional judge-model token cap. */\n maxOutputTokens?: number;\n /** Optional provider-specific options forwarded to the AI SDK. */\n providerOptions?: AiSdkProviderOptions;\n}\n\n/**\n * Adapts an AI SDK language model into the provider-neutral judge harness API.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n * import { describeEval, FactualityJudge } from \"vitest-evals\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n *\n * describeEval(\"qa agent\", {\n * harness: qaHarness,\n * judgeHarness,\n * judges: [FactualityJudge()],\n * }, (it) => {});\n * ```\n */\nexport function aiSdkJudgeHarness(config: AiSdkJudgeHarnessConfig) {\n return createJudgeHarness({\n name: config.name ?? \"ai-sdk\",\n run: (input, options) => runAiSdkJudgeHarness(config, input, options),\n });\n}\n\nasync function runAiSdkJudgeHarness(\n config: AiSdkJudgeHarnessConfig,\n input: JudgeHarnessInput,\n options: { signal?: AbortSignal },\n) {\n const system = formatAiSdkJudgeSystemPrompt(\n input.system,\n input.responseFormat,\n );\n const requestOptions = {\n model: config.model,\n prompt: input.prompt,\n ...(system !== undefined ? { system } : {}),\n ...(config.temperature !== undefined\n ? { temperature: config.temperature }\n : {}),\n ...(config.maxOutputTokens !== undefined\n ? { maxOutputTokens: config.maxOutputTokens }\n : {}),\n ...(config.providerOptions !== undefined\n ? { providerOptions: config.providerOptions }\n : {}),\n ...(options.signal ? { abortSignal: options.signal } : {}),\n };\n\n if (\n input.responseFormat?.type === \"json\" &&\n input.responseFormat.schema !== undefined\n ) {\n const result = await generateObject({\n ...requestOptions,\n schema: jsonSchema(\n input.responseFormat.schema as Parameters<typeof jsonSchema>[0],\n ),\n });\n\n return createAiSdkJudgeRun(input, result, normalizeContent(result.object));\n }\n\n const result = await generateText(requestOptions);\n return createAiSdkJudgeRun(input, result, result.text);\n}\n\nfunction createAiSdkJudgeRun(\n input: JudgeHarnessInput,\n result: unknown,\n output: JsonValue | undefined,\n): HarnessRun {\n const usage = resolveUsage(result);\n return {\n output,\n session: resolveSession(\n input.prompt,\n result,\n output,\n new Map(),\n [],\n undefined,\n ),\n usage,\n errors: [],\n };\n}\n\nfunction formatAiSdkJudgeSystemPrompt(\n system: string | undefined,\n responseFormat: JudgeHarnessInput[\"responseFormat\"],\n) {\n if (responseFormat?.type !== \"json\" || responseFormat.schema !== undefined) {\n return system;\n }\n\n const jsonInstruction =\n \"Return only valid JSON. Do not include markdown fences or explanatory prose.\";\n\n return system ? `${system}\\n\\n${jsonInstruction}` : jsonInstruction;\n}\n\ntype StepLike = Pick<\n StepResult<ToolSet>,\n | \"content\"\n | \"finishReason\"\n | \"model\"\n | \"rawFinishReason\"\n | \"reasoningText\"\n | \"response\"\n | \"stepNumber\"\n | \"text\"\n | \"toolCalls\"\n | \"toolResults\"\n | \"usage\"\n>;\n\ntype AiSdkLikeResult = {\n steps?: StepLike[];\n usage?: LanguageModelUsage;\n totalUsage?: LanguageModelUsage;\n output?: unknown;\n object?: unknown;\n text?: string;\n session?: NormalizedSession;\n errors?: Array<Record<string, JsonValue>>;\n};\n\ntype AiSdkResultOutput<TResult> = TResult extends HarnessRun<infer TOutput>\n ? TOutput\n : \"output\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"output\">\n : \"object\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"object\">\n : \"text\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"text\">\n : undefined;\ntype AiSdkAgentResult<\n TAgent,\n TInput,\n TTools extends AiSdkToolset<TInput>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : TAgent extends {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n }\n ? Awaited<TResult>\n : unknown;\n\n/** Context passed to instrumented AI SDK tool executions. */\nexport interface AiSdkToolContext<TInput = string> {\n input: TInput;\n signal?: AbortSignal;\n setArtifact: HarnessContext[\"setArtifact\"];\n execution: ToolExecutionOptions;\n}\n\n/** Replay mode alias used by the AI SDK harness package. */\nexport type AiSdkReplayMode = ReplayMode;\n\n/** Tool replay recording shape for AI SDK tools. */\nexport type AiSdkToolRecording<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for an AI SDK tool. */\nexport type AiSdkToolReplayConfig<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput>>;\n\n/** AI SDK tool definition accepted by the harness. */\nexport type AiSdkToolDefinition<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n _TInput = string,\n> = Tool<TArgs, TResult>;\n\n/** Replay policy for one AI SDK tool. */\nexport type AiSdkToolReplayPolicy<TInput = string> =\n | boolean\n | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput>;\n\n/** Replay policy map keyed by AI SDK tool name. */\nexport type AiSdkToolReplayPolicies<TInput = string> = Record<\n string,\n AiSdkToolReplayPolicy<TInput>\n>;\n\n/** Toolset shape accepted by the AI SDK harness. */\nexport type AiSdkToolset<TInput = string> = AnyAiSdkToolset<TInput>;\n\n/** Runtime toolset exposed to the system under test. */\nexport type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any>> = {\n [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<\n infer TArgs extends JsonValue,\n infer TResult extends JsonValue,\n infer _TInput\n >\n ? Omit<TTools[K], \"execute\"> & {\n execute?: ToolExecuteFunction<TArgs, TResult>;\n }\n : TTools[K];\n};\n\n/** Runtime object passed into AI SDK-style agent entrypoints. */\nexport interface AiSdkRuntime<\n TTools extends AiSdkToolset<TInput>,\n TInput = string,\n> {\n tools: AiSdkRuntimeToolset<TTools>;\n signal?: AbortSignal;\n}\n\n/** Arguments passed to per-run AI SDK agent factories. */\nexport interface AiSdkCreateAgentArgs<TInput = string> {\n input: TInput;\n context: HarnessContext;\n}\n\n/** Arguments passed to custom AI SDK harness run callbacks. */\nexport interface AiSdkHarnessRunArgs<\n TAgent,\n TInput,\n TTools extends AiSdkToolset<TInput>,\n> {\n agent: TAgent | undefined;\n input: TInput;\n context: HarnessContext;\n runtime: AiSdkRuntime<TTools, TInput>;\n tools: AiSdkRuntimeToolset<TTools>;\n}\n\n/** Arguments passed to AI SDK harness output selectors. */\nexport interface AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TResult,\n TTools extends AiSdkToolset<TInput>,\n> extends AiSdkHarnessRunArgs<TAgent, TInput, TTools> {\n result: TResult;\n}\n\ntype AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TResult,\n TTools extends AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined,\n> = (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype AiSdkHarnessOptions<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> &\n (\n | {\n agent: AgentSource<TAgent, TInput>;\n run?: never;\n }\n | {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n agent?: never;\n }\n );\n\ntype AiSdkHarnessOptionsWithOutput<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput> & {\n output: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n};\n\ntype AiSdkHarnessRunOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult>;\n agent?: never;\n output?: never;\n};\n\ntype AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n agent: AgentSource<TAgent, TInput>;\n run?: never;\n output?: never;\n};\n\ninterface AiSdkHarnessBaseOptions<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput>;\n output?: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\n/** Adapts an AI SDK-style workflow into a normalized eval harness. */\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptionsWithOutput<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessRunOptionsWithoutOutput<TAgent, TInput, TResult, TTools>,\n): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessAgentOptionsWithoutOutput<TAgent, TInput, TTools>,\n): Harness<TInput, AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TTools>>>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): Harness<TInput, TOutput> {\n validateOptions(options);\n\n const harnessName = options.name ?? \"ai-sdk\";\n const harness: Harness<TInput, TOutput> = {\n name: harnessName,\n run: async (input, context) => {\n const startedAt = new Date();\n\n try {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n return await runAiSdkHarness(options, agent, input, context);\n } catch (error) {\n if (getHarnessRunFromError(error)) {\n throw error;\n }\n\n throw attachHarnessRunToError(\n error,\n createFailedAiSdkRun(input, context, error, harnessName, startedAt),\n );\n }\n },\n };\n\n return harness;\n}\n\nfunction createFailedAiSdkRun<TInput>(\n input: TInput,\n context: HarnessContext,\n error: unknown,\n harnessName: string,\n startedAt: Date,\n) {\n const run = createFailedHarnessRun(input, error, {\n artifacts: context.artifacts,\n });\n ensureRunTrace(run, {\n name: harnessName,\n startedAt,\n finishedAt: new Date(),\n operationName: \"invoke_workflow\",\n source: \"harness-ai-sdk\",\n });\n\n return run;\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext,\n): Promise<HarnessRun<TOutput>> {\n const trace = createTraceRecorder(options.name ?? \"ai-sdk\");\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const runtimeEvents: TranscriptEvent[] = [];\n const tools = createToolset({\n input,\n context,\n tools: options.tools,\n toolReplay: options.toolReplay,\n replayMetadataByToolCallId,\n runtimeEvents,\n });\n const runtime = {\n tools,\n signal: context.signal,\n } satisfies AiSdkRuntime<TTools, TInput>;\n\n try {\n const result = await runAgent(options, {\n agent,\n input,\n context,\n runtime,\n tools,\n });\n\n if (isHarnessRun(result) && !hasOutputSelector(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n attachAiSdkTrace(result, trace, result, new Date());\n return result;\n }\n\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n tools,\n result: result as TResult,\n } satisfies AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools>;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(result) as TOutput | undefined);\n const explicitSession = getResultSession(result);\n const useRuntimeEvents = shouldUseRuntimeEvents(result);\n const usage = resolveUsage(\n result,\n useRuntimeEvents ? runtimeEvents : [],\n explicitSession,\n );\n const session = resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeEvents,\n explicitSession,\n );\n const errors = resolveHarnessRunErrors(result);\n const finishedAt = new Date();\n\n return {\n session,\n output,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors,\n traces: [\n finishAiSdkTrace(trace, {\n result,\n session,\n usage,\n errors,\n finishedAt,\n }),\n ],\n } as HarnessRun<TOutput>;\n } catch (error) {\n const finishedAt = new Date();\n const serializedError = serializeError(error);\n const runtimeToolCallCount = runtimeEvents.filter(\n (event) => event.type === \"tool_call\",\n ).length;\n const usage =\n runtimeToolCallCount > 0 ? { toolCalls: runtimeToolCallCount } : {};\n const session = resolveFailureSession(input, runtimeEvents);\n const run = {\n session,\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializedError],\n traces: [\n finishAiSdkTrace(trace, {\n session,\n usage,\n errors: [serializedError],\n finishedAt,\n }),\n ],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(options: AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput>) {\n return Boolean(options.output);\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: AiSdkCreateAgentArgs<TInput>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (hasAiSdkRunMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (hasAiSdkGenerateMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.generate(args.input, args.runtime);\n }\n\n throw new Error(\n \"aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use run() for a custom entrypoint.\",\n );\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>) {\n const hasAgent = hasAgentSource(options);\n const hasRun = typeof (options as { run?: unknown }).run === \"function\";\n const entrypoints = [hasAgent, hasRun].filter(Boolean).length;\n\n if (entrypoints > 1) {\n throw new Error(\n \"aiSdkHarness accepts exactly one of agent or run. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or run for a custom entrypoint.\",\n );\n }\n\n if (entrypoints === 0) {\n throw new Error(\n \"aiSdkHarness requires agent or run. Use agent for objects with run(input, runtime) or generate(input, runtime), or run for a custom entrypoint.\",\n );\n }\n}\n\nfunction hasAgentSource<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n> & { agent: AgentSource<TAgent, TInput> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n args: AiSdkCreateAgentArgs<TInput>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n): agent is (args: AiSdkCreateAgentArgs<TInput>) => MaybePromise<TAgent> {\n return (\n typeof agent === \"function\" &&\n !hasCallableMethod(agent, \"run\") &&\n !hasCallableMethod(agent, \"generate\")\n );\n}\n\ntype TraceRecorder = {\n id: string;\n rootSpanId: string;\n name: string;\n startedAt: Date;\n};\n\nfunction createTraceRecorder(name: string): TraceRecorder {\n const id = `ai_sdk_trace_${++nextTraceId}`;\n\n return {\n id,\n rootSpanId: `${id}:run`,\n name,\n startedAt: new Date(),\n };\n}\n\nfunction attachAiSdkTrace(\n run: HarnessRun,\n trace: TraceRecorder,\n result: unknown,\n finishedAt: Date,\n) {\n const errors = run.errors ?? [];\n const nativeTrace = finishAiSdkTrace(trace, {\n result,\n session: run.session,\n usage: run.usage,\n errors,\n finishedAt,\n });\n\n run.traces = [...(run.traces ?? []), nativeTrace];\n}\n\nfunction finishAiSdkTrace(\n trace: TraceRecorder,\n options: {\n result?: unknown;\n session: NormalizedSession;\n usage?: UsageSummary;\n errors?: unknown[];\n finishedAt: Date;\n },\n): NormalizedTrace {\n const modelSpans = createAiSdkModelSpans(\n trace,\n options.result,\n options.usage,\n );\n const finishedAt = options.finishedAt;\n const durationMs = finishedAt.getTime() - trace.startedAt.getTime();\n const rootError = options.errors?.[0]\n ? normalizeSpanError(options.errors[0])\n : undefined;\n const rootSpan: NormalizedSpan = {\n id: trace.rootSpanId,\n traceId: trace.id,\n name: trace.name,\n kind: \"run\",\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n status: rootError ? \"error\" : \"ok\",\n ...(rootError ? { error: rootError } : {}),\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"invoke_workflow\",\n \"gen_ai.workflow.name\": trace.name,\n ...createGenAiUsageAttributes(options.usage),\n }),\n };\n const spans = [rootSpan, ...modelSpans];\n\n return {\n id: trace.id,\n name: trace.name,\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n metadata: {\n source: \"harness-ai-sdk\",\n },\n spans,\n };\n}\n\nfunction createAiSdkModelSpans(\n trace: TraceRecorder,\n result: unknown,\n usage: UsageSummary | undefined,\n): NormalizedSpan[] {\n const steps = readAiSdkSteps(result);\n if (steps.length === 0) {\n const fallback = createUsageModelSpan(trace, usage);\n return fallback ? [fallback] : [];\n }\n\n return steps.map((step, index) => {\n const stepUsage = step.usage;\n\n return {\n id: `${trace.id}:model:${index + 1}`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: `ai-sdk step ${step.stepNumber ?? index}`,\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n \"gen_ai.provider.name\": step.model?.provider,\n \"gen_ai.request.model\": step.model?.modelId,\n \"gen_ai.response.model\": step.model?.modelId,\n \"gen_ai.response.finish_reasons\": step.finishReason\n ? [String(step.finishReason)]\n : undefined,\n \"gen_ai.usage.input_tokens\": stepUsage?.inputTokens,\n \"gen_ai.usage.output_tokens\": stepUsage?.outputTokens,\n \"gen_ai.usage.reasoning.output_tokens\":\n stepUsage?.outputTokenDetails?.reasoningTokens ??\n stepUsage?.reasoningTokens,\n \"gen_ai.usage.cache_read.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheReadTokens ??\n stepUsage?.cachedInputTokens,\n \"gen_ai.usage.cache_creation.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheWriteTokens,\n \"ai.step.number\": step.stepNumber,\n \"ai.finish_reason\": step.finishReason,\n \"ai.raw_finish_reason\": step.rawFinishReason,\n }),\n } satisfies NormalizedSpan;\n });\n}\n\nfunction createUsageModelSpan(\n trace: TraceRecorder,\n usage: UsageSummary | undefined,\n): NormalizedSpan | undefined {\n if (!usage?.provider && !usage?.model) {\n return undefined;\n }\n\n return {\n id: `${trace.id}:model:1`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: usage.model ? `ai-sdk ${usage.model}` : \"ai-sdk model\",\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n ...createGenAiUsageAttributes(usage),\n }),\n };\n}\n\nfunction createToolset<TInput, TTools extends AiSdkToolset<TInput>>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeEvents,\n}: {\n input: TInput;\n context: HarnessContext;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput> | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeEvents: TranscriptEvent[];\n}) {\n return Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => {\n const replay = toolReplay?.[toolName];\n\n if (replay && !tool.execute) {\n throw new Error(\n `Tool replay requires execute() for ${toolName}. Provider-executed tools cannot be recorded automatically.`,\n );\n }\n\n if (!tool.execute) {\n return [toolName, tool];\n }\n\n const execute = tool.execute;\n const wrappedTool = {\n ...tool,\n execute: async (\n toolInput: InferToolInput<typeof tool>,\n execution: ToolExecutionOptions,\n ) => {\n const startedAt = new Date();\n const normalizedArgs = normalizeArguments(toolInput);\n const call: TranscriptToolCallEvent = {\n type: \"tool_call\",\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n startedAt: startedAt.toISOString(),\n };\n runtimeEvents.push(call);\n const replayContext = {\n input,\n signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput>;\n\n try {\n const executionResult = replay\n ? await executeToolWithReplay({\n toolName,\n toolInput,\n execute,\n execution,\n context: replayContext,\n replay,\n })\n : {\n result: await execute(toolInput, execution),\n replay: undefined,\n };\n const finishedAt = new Date();\n const replayMetadata = normalizeReplayMetadata(\n executionResult.replay,\n );\n\n if (executionResult.replay) {\n replayMetadataByToolCallId.set(\n execution.toolCallId,\n executionResult.replay,\n );\n }\n\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n if (replayMetadata) {\n call.metadata = replayMetadata;\n }\n const normalizedResult = toJsonValue(executionResult.result);\n runtimeEvents.push({\n type: \"tool_result\",\n toolCallId: execution.toolCallId,\n name: toolName,\n ...(normalizedResult !== undefined\n ? { content: normalizedResult }\n : {}),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n\n return executionResult.result as InferToolOutput<typeof tool>;\n } catch (error) {\n const replay = getReplayMetadataFromError(error);\n const finishedAt = new Date();\n const replayMetadata = normalizeReplayMetadata(replay);\n\n if (replay) {\n replayMetadataByToolCallId.set(execution.toolCallId, replay);\n }\n\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n if (replayMetadata) {\n call.metadata = replayMetadata;\n }\n runtimeEvents.push({\n type: \"tool_result\",\n toolCallId: execution.toolCallId,\n name: toolName,\n error: normalizeError(error),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n throw error;\n }\n },\n } satisfies typeof tool;\n\n return [toolName, wrappedTool];\n }),\n ) as AiSdkRuntimeToolset<TTools>;\n}\n\nasync function executeToolWithReplay<\n TInput,\n TTool extends AiSdkToolDefinition<any, any, TInput>,\n>({\n toolName,\n toolInput,\n execute,\n execution,\n context,\n replay,\n}: {\n toolName: string;\n toolInput: InferToolInput<TTool>;\n execute: NonNullable<TTool[\"execute\"]>;\n execution: ToolExecutionOptions;\n context: AiSdkToolContext<TInput>;\n replay: AiSdkToolReplayPolicy<TInput>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<JsonValue, JsonValue, AiSdkToolContext<TInput>>({\n toolName,\n args: replayInput,\n context,\n execute: async (replayedInput) => {\n const output = await execute(\n replayedInput as InferToolInput<TTool>,\n execution,\n );\n\n if (isAsyncIterable(output)) {\n throw new Error(\n `Tool replay only supports JSON-serializable outputs. ${toolName} returned an async iterable.`,\n );\n }\n\n return toReplayJsonValue(output, `${toolName} tool output`);\n },\n replay,\n });\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const candidates = [\"output\", \"object\", \"text\"] satisfies string[];\n const resultRecord = result as Record<string, unknown>;\n\n for (const key of candidates) {\n if (Object.prototype.hasOwnProperty.call(resultRecord, key)) {\n return toOutputValue(resultRecord[key]);\n }\n }\n\n return undefined;\n}\n\n// Keep this adapter-local rather than exporting a core helper. Core\n// `toJsonValue` normalizes trace data; inferred app output should only accept\n// values that are already JSON-safe so the public contract stays explicit.\n// Invalid nested values reject the whole candidate instead of being patched.\nfunction toOutputValue(value: unknown): JsonValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (Array.isArray(value)) {\n const items: JsonValue[] = [];\n for (const item of value) {\n const normalized = toOutputValue(item);\n if (normalized === undefined) {\n return undefined;\n }\n items.push(normalized);\n }\n return items;\n }\n\n if (typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return undefined;\n }\n\n const record: Record<string, JsonValue> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = toOutputValue(entry);\n if (normalized === undefined) {\n return undefined;\n }\n record[key] = normalized;\n }\n return record;\n }\n\n return undefined;\n}\n\nfunction resolveUsage(\n result: unknown,\n runtimeEvents: TranscriptEvent[] = [],\n explicitSession?: NormalizedSession,\n): UsageSummary {\n const steps = readAiSdkSteps(result);\n const runtimeToolCallCount = countRuntimeToolCalls(runtimeEvents);\n const explicitSessionToolCallCount = explicitSession\n ? countSessionToolCalls(explicitSession)\n : undefined;\n const usage = readAiSdkUsage(result, steps);\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n // Runtime events count only for custom runs without AI SDK steps, so usage\n // stays aligned with the same transcript source used for assertions.\n const toolCallCount =\n explicitSessionToolCallCount ??\n (steps.length > 0 ? countStepToolCalls(steps) : runtimeToolCallCount);\n\n if (!usage) {\n if (toolCallCount > 0 || steps.length > 0) {\n return {\n provider: lastStep?.model?.provider,\n model: lastStep?.model?.modelId,\n ...(toolCallCount > 0 ? { toolCalls: toolCallCount } : {}),\n };\n }\n\n return {};\n }\n\n return {\n provider: lastStep?.model?.provider,\n model: lastStep?.model?.modelId,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens:\n usage.outputTokenDetails?.reasoningTokens ?? usage.reasoningTokens,\n totalTokens:\n usage.totalTokens ?? (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),\n toolCalls: toolCallCount > 0 ? toolCallCount : undefined,\n metadata: normalizeMetadata({\n cacheReadTokens:\n usage.inputTokenDetails?.cacheReadTokens ?? usage.cachedInputTokens,\n cacheWriteTokens: usage.inputTokenDetails?.cacheWriteTokens,\n raw: usage.raw,\n }),\n };\n}\n\nfunction countRuntimeToolCalls(events: readonly TranscriptEvent[]) {\n return events.filter((event) => event.type === \"tool_call\").length;\n}\n\nfunction resolveStepUsage(steps: StepLike[]): LanguageModelUsage | undefined {\n const usages = steps.map((step) => step.usage).filter(isLanguageModelUsage);\n\n if (usages.length === 0) {\n return undefined;\n }\n\n return usages.reduce(addLanguageModelUsage);\n}\n\nfunction addLanguageModelUsage(\n left: LanguageModelUsage,\n right: LanguageModelUsage,\n): LanguageModelUsage {\n return {\n inputTokens: addTokenCounts(left.inputTokens, right.inputTokens),\n inputTokenDetails: {\n noCacheTokens: addTokenCounts(\n left.inputTokenDetails?.noCacheTokens,\n right.inputTokenDetails?.noCacheTokens,\n ),\n cacheReadTokens: addTokenCounts(\n left.inputTokenDetails?.cacheReadTokens,\n right.inputTokenDetails?.cacheReadTokens,\n ),\n cacheWriteTokens: addTokenCounts(\n left.inputTokenDetails?.cacheWriteTokens,\n right.inputTokenDetails?.cacheWriteTokens,\n ),\n },\n outputTokens: addTokenCounts(left.outputTokens, right.outputTokens),\n outputTokenDetails: {\n textTokens: addTokenCounts(\n left.outputTokenDetails?.textTokens,\n right.outputTokenDetails?.textTokens,\n ),\n reasoningTokens: addTokenCounts(\n left.outputTokenDetails?.reasoningTokens,\n right.outputTokenDetails?.reasoningTokens,\n ),\n },\n totalTokens: addTokenCounts(left.totalTokens, right.totalTokens),\n reasoningTokens: addTokenCounts(\n left.reasoningTokens,\n right.reasoningTokens,\n ),\n cachedInputTokens: addTokenCounts(\n left.cachedInputTokens,\n right.cachedInputTokens,\n ),\n };\n}\n\nfunction addTokenCounts(left: number | undefined, right: number | undefined) {\n return left == null && right == null ? undefined : (left ?? 0) + (right ?? 0);\n}\n\nfunction countStepToolCalls(steps: StepLike[]) {\n return steps.reduce(\n (count, step) => count + (step.toolCalls?.length ?? 0),\n 0,\n );\n}\n\nfunction countSessionToolCalls(session: NormalizedSession) {\n return session.events.filter((event) => event.type === \"tool_call\").length;\n}\n\nfunction shouldUseRuntimeEvents(result: unknown) {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return false;\n }\n\n return readAiSdkSteps(result).length === 0;\n}\n\nfunction resolveSession(\n input: unknown,\n result: unknown,\n output: JsonValue | undefined,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n runtimeEvents: TranscriptEvent[] = [],\n explicitSession = getResultSession(result),\n): NormalizedSession {\n if (explicitSession) {\n return explicitSession;\n }\n\n const steps = readAiSdkSteps(result);\n const events: TranscriptEvent[] = [\n {\n type: \"message\",\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n\n for (const step of steps) {\n events.push(...normalizeStep(step, replayMetadataByToolCallId));\n }\n\n // Runtime events are only the transcript source when no AI SDK steps exist;\n // explicit sessions returned above and provider steps stay authoritative.\n if (steps.length === 0) {\n events.push(...runtimeEvents);\n }\n\n if (\n output !== undefined &&\n !events.some(\n (event) =>\n event.type === \"message\" &&\n event.role === \"assistant\" &&\n event.content !== undefined,\n )\n ) {\n events.push({\n type: \"message\",\n role: \"assistant\",\n content: output,\n });\n }\n\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n return {\n events,\n provider: lastStep?.model?.provider,\n model: lastStep?.model?.modelId,\n };\n}\n\nfunction getResultSession(result: unknown): NormalizedSession | undefined {\n const session = (result as Record<string, unknown> | undefined)?.session;\n return isNormalizedSession(session) ? session : undefined;\n}\n\nfunction resolveFailureSession(\n input: unknown,\n runtimeEvents: TranscriptEvent[],\n): NormalizedSession {\n return {\n events: [\n {\n type: \"message\",\n role: \"user\",\n content: normalizeContent(input),\n },\n ...runtimeEvents,\n ],\n };\n}\n\n/** Reads AI SDK step arrays only when the field looks like provider step data. */\nfunction readAiSdkSteps(result: unknown): StepLike[] {\n if (!result || typeof result !== \"object\") {\n return [];\n }\n\n if (!Object.prototype.hasOwnProperty.call(result, \"steps\")) {\n return [];\n }\n\n const steps = (result as AiSdkLikeResult).steps;\n if (!Array.isArray(steps)) {\n return [];\n }\n if (steps.length > 0 && !steps.every(isAiSdkStepLike)) {\n return [];\n }\n\n return steps;\n}\n\nfunction isAiSdkStepLike(step: unknown): step is StepLike {\n if (!step || typeof step !== \"object\") {\n return false;\n }\n\n const record = step as Record<string, unknown>;\n return (\n Array.isArray(record.content) ||\n Array.isArray(record.toolCalls) ||\n Array.isArray(record.toolResults) ||\n Boolean(record.response && typeof record.response === \"object\") ||\n Boolean(record.usage && typeof record.usage === \"object\") ||\n typeof record.finishReason === \"string\" ||\n typeof record.stepNumber === \"number\" ||\n typeof record.text === \"string\"\n );\n}\n\nfunction readAiSdkUsage(\n result: unknown,\n steps: StepLike[],\n): LanguageModelUsage | undefined {\n // AI SDK generateText exposes aggregate `totalUsage`; `usage` is the last\n // step and only applies to non-step results such as generateObject.\n const totalUsage = readUsageField(result, \"totalUsage\");\n if (totalUsage) {\n return totalUsage;\n }\n\n if (steps.length > 0) {\n return resolveStepUsage(steps);\n }\n\n return readUsageField(result, \"usage\");\n}\n\nfunction readUsageField(\n result: unknown,\n field: \"usage\" | \"totalUsage\",\n): LanguageModelUsage | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const usage = (result as AiSdkLikeResult)[field];\n return isLanguageModelUsage(usage) ? usage : undefined;\n}\n\nfunction isLanguageModelUsage(value: unknown): value is LanguageModelUsage {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const usage = value as LanguageModelUsage;\n return (\n isOptionalFiniteNumber(usage.inputTokens) &&\n isOptionalFiniteNumber(usage.outputTokens) &&\n isOptionalFiniteNumber(usage.reasoningTokens) &&\n isOptionalFiniteNumber(usage.totalTokens) &&\n isOptionalFiniteNumber(usage.cachedInputTokens) &&\n isUsageDetailObject(usage.inputTokenDetails) &&\n isUsageDetailObject(usage.outputTokenDetails)\n );\n}\n\nfunction isUsageDetailObject(value: unknown) {\n if (value === undefined) {\n return true;\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n return Object.values(value).every(isOptionalFiniteNumber);\n}\n\nfunction isOptionalFiniteNumber(value: unknown) {\n return (\n value === undefined || (typeof value === \"number\" && Number.isFinite(value))\n );\n}\n\nfunction normalizeStep(\n step: StepLike,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): TranscriptEvent[] {\n const toolResultsById = new Map(\n (step.toolResults ?? []).map((toolResult) => [\n toolResult.toolCallId,\n toolResult,\n ]),\n );\n const toolErrorsById = new Map(\n (step.toolCalls ?? [])\n .filter((toolCall) => toolCall.invalid || toolCall.error !== undefined)\n .map((toolCall) => [\n toolCall.toolCallId,\n normalizeError(toolCall.error ?? toolCall.invalid),\n ]),\n );\n\n const normalizedCalls = (step.toolCalls ?? []).map((toolCall) =>\n normalizeToolCall(toolCall, toolResultsById, replayMetadataByToolCallId),\n );\n const assistantMetadata = normalizeMetadata({\n stepNumber: step.stepNumber,\n finishReason: step.finishReason,\n rawFinishReason: step.rawFinishReason,\n reasoningText: step.reasoningText,\n response: step.response,\n });\n const events: TranscriptEvent[] = [];\n\n if (step.text || assistantMetadata) {\n events.push({\n type: \"message\",\n role: \"assistant\",\n ...(step.text ? { content: step.text } : {}),\n ...(assistantMetadata ? { metadata: assistantMetadata } : {}),\n });\n }\n\n events.push(...normalizedCalls);\n\n for (const toolResult of step.toolResults ?? []) {\n const content =\n toolResult.output === undefined\n ? undefined\n : normalizeContent(toolResult.output);\n events.push({\n type: \"tool_result\",\n toolCallId: toolResult.toolCallId,\n name: toolResult.toolName,\n ...(content !== undefined ? { content } : {}),\n ...(toolErrorsById.has(toolResult.toolCallId)\n ? { error: toolErrorsById.get(toolResult.toolCallId) }\n : {}),\n metadata: normalizeMetadata({\n preliminary: toolResult.preliminary,\n providerExecuted: toolResult.providerExecuted,\n title: toolResult.title,\n providerMetadata: toolResult.providerMetadata,\n }),\n });\n }\n\n return events;\n}\n\nfunction normalizeToolCall(\n toolCall: StepLike[\"toolCalls\"][number],\n toolResultsById: Map<string, StepLike[\"toolResults\"][number]>,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): TranscriptToolCallEvent {\n const toolResult = toolResultsById.get(toolCall.toolCallId);\n const normalizedArguments = normalizeArguments(toolCall.input);\n const errorValue =\n toolCall.invalid || toolCall.error !== undefined\n ? normalizeError(toolCall.error ?? toolCall.invalid)\n : undefined;\n const replayMetadata = normalizeReplayMetadata(\n replayMetadataByToolCallId.get(toolCall.toolCallId),\n );\n\n return {\n type: \"tool_call\",\n id: toolCall.toolCallId,\n name: toolCall.toolName,\n ...(normalizedArguments ? { arguments: normalizedArguments } : {}),\n metadata: normalizeMetadata({\n providerExecuted:\n toolCall.providerExecuted ?? toolResult?.providerExecuted,\n title: toolCall.title ?? toolResult?.title,\n dynamic: toolCall.dynamic,\n invalid: toolCall.invalid,\n ...(errorValue ? { error: errorValue } : {}),\n preliminary: toolResult?.preliminary,\n providerMetadata:\n toolCall.providerMetadata ?? toolResult?.providerMetadata,\n ...(replayMetadata ?? {}),\n }),\n };\n}\n\nfunction normalizeArguments(\n value: unknown,\n): Record<string, JsonValue> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n return normalizeRecord(value as Record<string, unknown>);\n}\n\nfunction normalizeError(error: unknown) {\n if (error instanceof Error) {\n return {\n type: error.name,\n message: error.message,\n };\n }\n\n const normalized = toJsonValue(error);\n if (\n normalized &&\n typeof normalized === \"object\" &&\n !Array.isArray(normalized) &&\n typeof normalized.message === \"string\"\n ) {\n return {\n message: normalized.message,\n type: typeof normalized.type === \"string\" ? normalized.type : \"Error\",\n };\n }\n\n return {\n type: \"Error\",\n message: String(error ?? \"Unknown tool call error\"),\n };\n}\n\nfunction toReplayJsonValue(value: unknown, label: string): JsonValue {\n const normalized = toJsonValue(value);\n if (normalized === undefined) {\n throw new Error(\n `Tool replay only supports JSON-serializable values. ${label} could not be normalized.`,\n );\n }\n\n return normalized;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n Symbol.asyncIterator in value\n );\n}\n"],"mappings":"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","names":["result","replay"]}
|
package/dist/index.mjs
CHANGED
|
@@ -48,16 +48,32 @@ async function runAiSdkJudgeHarness(config, input, options) {
|
|
|
48
48
|
...options.signal ? { abortSignal: options.signal } : {}
|
|
49
49
|
};
|
|
50
50
|
if (input.responseFormat?.type === "json" && input.responseFormat.schema !== void 0) {
|
|
51
|
-
const
|
|
51
|
+
const result2 = await generateObject({
|
|
52
52
|
...requestOptions,
|
|
53
53
|
schema: jsonSchema(
|
|
54
54
|
input.responseFormat.schema
|
|
55
55
|
)
|
|
56
56
|
});
|
|
57
|
-
return object;
|
|
57
|
+
return createAiSdkJudgeRun(input, result2, normalizeContent(result2.object));
|
|
58
58
|
}
|
|
59
|
-
const
|
|
60
|
-
return text;
|
|
59
|
+
const result = await generateText(requestOptions);
|
|
60
|
+
return createAiSdkJudgeRun(input, result, result.text);
|
|
61
|
+
}
|
|
62
|
+
function createAiSdkJudgeRun(input, result, output) {
|
|
63
|
+
const usage = resolveUsage(result);
|
|
64
|
+
return {
|
|
65
|
+
output,
|
|
66
|
+
session: resolveSession(
|
|
67
|
+
input.prompt,
|
|
68
|
+
result,
|
|
69
|
+
output,
|
|
70
|
+
/* @__PURE__ */ new Map(),
|
|
71
|
+
[],
|
|
72
|
+
void 0
|
|
73
|
+
),
|
|
74
|
+
usage,
|
|
75
|
+
errors: []
|
|
76
|
+
};
|
|
61
77
|
}
|
|
62
78
|
function formatAiSdkJudgeSystemPrompt(system, responseFormat) {
|
|
63
79
|
if (responseFormat?.type !== "json" || responseFormat.schema !== void 0) {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n attachHarnessRunToError,\n createFailedHarnessRun,\n createGenAiUsageAttributes,\n ensureRunTrace,\n getHarnessRunFromError,\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n normalizeSpanAttributes,\n normalizeSpanError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessRun,\n JsonValue,\n TranscriptToolCallEvent,\n TranscriptEvent,\n NormalizedSpan,\n NormalizedSession,\n NormalizedTrace,\n TimingSummary,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport { generateObject, generateText, jsonSchema } from \"ai\";\nimport {\n createJudgeHarness,\n type JudgeHarnessInput,\n} from \"vitest-evals/judges\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMetadata,\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\nimport type {\n InferToolInput,\n InferToolOutput,\n LanguageModel,\n LanguageModelUsage,\n StepResult,\n Tool,\n ToolExecuteFunction,\n ToolExecutionOptions,\n ToolSet,\n} from \"ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AiSdkProviderOptions = Parameters<\n typeof generateText\n>[0][\"providerOptions\"];\ntype JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<TAgent, TInput = string> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<TInput = string> = Record<\n string,\n AiSdkToolDefinition<any, any, TInput>\n>;\n\nlet nextTraceId = 0;\n\n/**\n * Configuration for adapting an AI SDK language model into a judge harness.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n * ```\n */\nexport interface AiSdkJudgeHarnessConfig {\n /** AI SDK language model used for judge prompts. */\n model: LanguageModel;\n /** Optional display name for diagnostics. */\n name?: string;\n /** Optional judge-model temperature. */\n temperature?: number;\n /** Optional judge-model token cap. */\n maxOutputTokens?: number;\n /** Optional provider-specific options forwarded to the AI SDK. */\n providerOptions?: AiSdkProviderOptions;\n}\n\n/**\n * Adapts an AI SDK language model into the provider-neutral judge harness API.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n * import { describeEval, FactualityJudge } from \"vitest-evals\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n *\n * describeEval(\"qa agent\", {\n * harness: qaHarness,\n * judgeHarness,\n * judges: [FactualityJudge()],\n * }, (it) => {});\n * ```\n */\nexport function aiSdkJudgeHarness(config: AiSdkJudgeHarnessConfig) {\n return createJudgeHarness({\n name: config.name ?? \"ai-sdk\",\n run: (input, options) => runAiSdkJudgeHarness(config, input, options),\n });\n}\n\nasync function runAiSdkJudgeHarness(\n config: AiSdkJudgeHarnessConfig,\n input: JudgeHarnessInput,\n options: { signal?: AbortSignal },\n) {\n const system = formatAiSdkJudgeSystemPrompt(\n input.system,\n input.responseFormat,\n );\n const requestOptions = {\n model: config.model,\n prompt: input.prompt,\n ...(system !== undefined ? { system } : {}),\n ...(config.temperature !== undefined\n ? { temperature: config.temperature }\n : {}),\n ...(config.maxOutputTokens !== undefined\n ? { maxOutputTokens: config.maxOutputTokens }\n : {}),\n ...(config.providerOptions !== undefined\n ? { providerOptions: config.providerOptions }\n : {}),\n ...(options.signal ? { abortSignal: options.signal } : {}),\n };\n\n if (\n input.responseFormat?.type === \"json\" &&\n input.responseFormat.schema !== undefined\n ) {\n const { object } = await generateObject({\n ...requestOptions,\n schema: jsonSchema(\n input.responseFormat.schema as Parameters<typeof jsonSchema>[0],\n ),\n });\n\n return object;\n }\n\n const { text } = await generateText(requestOptions);\n return text;\n}\n\nfunction formatAiSdkJudgeSystemPrompt(\n system: string | undefined,\n responseFormat: JudgeHarnessInput[\"responseFormat\"],\n) {\n if (responseFormat?.type !== \"json\" || responseFormat.schema !== undefined) {\n return system;\n }\n\n const jsonInstruction =\n \"Return only valid JSON. Do not include markdown fences or explanatory prose.\";\n\n return system ? `${system}\\n\\n${jsonInstruction}` : jsonInstruction;\n}\n\ntype StepLike = Pick<\n StepResult<ToolSet>,\n | \"content\"\n | \"finishReason\"\n | \"model\"\n | \"rawFinishReason\"\n | \"reasoningText\"\n | \"response\"\n | \"stepNumber\"\n | \"text\"\n | \"toolCalls\"\n | \"toolResults\"\n | \"usage\"\n>;\n\ntype AiSdkLikeResult = {\n steps?: StepLike[];\n usage?: LanguageModelUsage;\n totalUsage?: LanguageModelUsage;\n output?: unknown;\n object?: unknown;\n text?: string;\n session?: NormalizedSession;\n errors?: Array<Record<string, JsonValue>>;\n};\n\ntype AiSdkResultOutput<TResult> = TResult extends HarnessRun<infer TOutput>\n ? TOutput\n : \"output\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"output\">\n : \"object\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"object\">\n : \"text\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"text\">\n : undefined;\ntype AiSdkAgentResult<\n TAgent,\n TInput,\n TTools extends AiSdkToolset<TInput>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : TAgent extends {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n }\n ? Awaited<TResult>\n : unknown;\n\n/** Context passed to instrumented AI SDK tool executions. */\nexport interface AiSdkToolContext<TInput = string> {\n input: TInput;\n signal?: AbortSignal;\n setArtifact: HarnessContext[\"setArtifact\"];\n execution: ToolExecutionOptions;\n}\n\n/** Replay mode alias used by the AI SDK harness package. */\nexport type AiSdkReplayMode = ReplayMode;\n\n/** Tool replay recording shape for AI SDK tools. */\nexport type AiSdkToolRecording<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for an AI SDK tool. */\nexport type AiSdkToolReplayConfig<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput>>;\n\n/** AI SDK tool definition accepted by the harness. */\nexport type AiSdkToolDefinition<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n _TInput = string,\n> = Tool<TArgs, TResult>;\n\n/** Replay policy for one AI SDK tool. */\nexport type AiSdkToolReplayPolicy<TInput = string> =\n | boolean\n | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput>;\n\n/** Replay policy map keyed by AI SDK tool name. */\nexport type AiSdkToolReplayPolicies<TInput = string> = Record<\n string,\n AiSdkToolReplayPolicy<TInput>\n>;\n\n/** Toolset shape accepted by the AI SDK harness. */\nexport type AiSdkToolset<TInput = string> = AnyAiSdkToolset<TInput>;\n\n/** Runtime toolset exposed to the system under test. */\nexport type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any>> = {\n [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<\n infer TArgs extends JsonValue,\n infer TResult extends JsonValue,\n infer _TInput\n >\n ? Omit<TTools[K], \"execute\"> & {\n execute?: ToolExecuteFunction<TArgs, TResult>;\n }\n : TTools[K];\n};\n\n/** Runtime object passed into AI SDK-style agent entrypoints. */\nexport interface AiSdkRuntime<\n TTools extends AiSdkToolset<TInput>,\n TInput = string,\n> {\n tools: AiSdkRuntimeToolset<TTools>;\n signal?: AbortSignal;\n}\n\n/** Arguments passed to per-run AI SDK agent factories. */\nexport interface AiSdkCreateAgentArgs<TInput = string> {\n input: TInput;\n context: HarnessContext;\n}\n\n/** Arguments passed to custom AI SDK harness run callbacks. */\nexport interface AiSdkHarnessRunArgs<\n TAgent,\n TInput,\n TTools extends AiSdkToolset<TInput>,\n> {\n agent: TAgent | undefined;\n input: TInput;\n context: HarnessContext;\n runtime: AiSdkRuntime<TTools, TInput>;\n tools: AiSdkRuntimeToolset<TTools>;\n}\n\n/** Arguments passed to AI SDK harness output selectors. */\nexport interface AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TResult,\n TTools extends AiSdkToolset<TInput>,\n> extends AiSdkHarnessRunArgs<TAgent, TInput, TTools> {\n result: TResult;\n}\n\ntype AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TResult,\n TTools extends AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined,\n> = (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype AiSdkHarnessOptions<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> &\n (\n | {\n agent: AgentSource<TAgent, TInput>;\n run?: never;\n }\n | {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n agent?: never;\n }\n );\n\ntype AiSdkHarnessOptionsWithOutput<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput> & {\n output: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n};\n\ntype AiSdkHarnessRunOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult>;\n agent?: never;\n output?: never;\n};\n\ntype AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n agent: AgentSource<TAgent, TInput>;\n run?: never;\n output?: never;\n};\n\ninterface AiSdkHarnessBaseOptions<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput>;\n output?: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\n/** Adapts an AI SDK-style workflow into a normalized eval harness. */\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptionsWithOutput<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessRunOptionsWithoutOutput<TAgent, TInput, TResult, TTools>,\n): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessAgentOptionsWithoutOutput<TAgent, TInput, TTools>,\n): Harness<TInput, AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TTools>>>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): Harness<TInput, TOutput> {\n validateOptions(options);\n\n const harnessName = options.name ?? \"ai-sdk\";\n const harness: Harness<TInput, TOutput> = {\n name: harnessName,\n run: async (input, context) => {\n const startedAt = new Date();\n\n try {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n return await runAiSdkHarness(options, agent, input, context);\n } catch (error) {\n if (getHarnessRunFromError(error)) {\n throw error;\n }\n\n throw attachHarnessRunToError(\n error,\n createFailedAiSdkRun(input, context, error, harnessName, startedAt),\n );\n }\n },\n };\n\n return harness;\n}\n\nfunction createFailedAiSdkRun<TInput>(\n input: TInput,\n context: HarnessContext,\n error: unknown,\n harnessName: string,\n startedAt: Date,\n) {\n const run = createFailedHarnessRun(input, error, {\n artifacts: context.artifacts,\n });\n ensureRunTrace(run, {\n name: harnessName,\n startedAt,\n finishedAt: new Date(),\n operationName: \"invoke_workflow\",\n source: \"harness-ai-sdk\",\n });\n\n return run;\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext,\n): Promise<HarnessRun<TOutput>> {\n const trace = createTraceRecorder(options.name ?? \"ai-sdk\");\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const runtimeEvents: TranscriptEvent[] = [];\n const tools = createToolset({\n input,\n context,\n tools: options.tools,\n toolReplay: options.toolReplay,\n replayMetadataByToolCallId,\n runtimeEvents,\n });\n const runtime = {\n tools,\n signal: context.signal,\n } satisfies AiSdkRuntime<TTools, TInput>;\n\n try {\n const result = await runAgent(options, {\n agent,\n input,\n context,\n runtime,\n tools,\n });\n\n if (isHarnessRun(result) && !hasOutputSelector(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n attachAiSdkTrace(result, trace, result, new Date());\n return result;\n }\n\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n tools,\n result: result as TResult,\n } satisfies AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools>;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(result) as TOutput | undefined);\n const explicitSession = getResultSession(result);\n const useRuntimeEvents = shouldUseRuntimeEvents(result);\n const usage = resolveUsage(\n result,\n useRuntimeEvents ? runtimeEvents : [],\n explicitSession,\n );\n const session = resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeEvents,\n explicitSession,\n );\n const errors = resolveHarnessRunErrors(result);\n const finishedAt = new Date();\n\n return {\n session,\n output,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors,\n traces: [\n finishAiSdkTrace(trace, {\n result,\n session,\n usage,\n errors,\n finishedAt,\n }),\n ],\n } as HarnessRun<TOutput>;\n } catch (error) {\n const finishedAt = new Date();\n const serializedError = serializeError(error);\n const runtimeToolCallCount = runtimeEvents.filter(\n (event) => event.type === \"tool_call\",\n ).length;\n const usage =\n runtimeToolCallCount > 0 ? { toolCalls: runtimeToolCallCount } : {};\n const session = resolveFailureSession(input, runtimeEvents);\n const run = {\n session,\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializedError],\n traces: [\n finishAiSdkTrace(trace, {\n session,\n usage,\n errors: [serializedError],\n finishedAt,\n }),\n ],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(options: AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput>) {\n return Boolean(options.output);\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: AiSdkCreateAgentArgs<TInput>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (hasAiSdkRunMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (hasAiSdkGenerateMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.generate(args.input, args.runtime);\n }\n\n throw new Error(\n \"aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use run() for a custom entrypoint.\",\n );\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>) {\n const hasAgent = hasAgentSource(options);\n const hasRun = typeof (options as { run?: unknown }).run === \"function\";\n const entrypoints = [hasAgent, hasRun].filter(Boolean).length;\n\n if (entrypoints > 1) {\n throw new Error(\n \"aiSdkHarness accepts exactly one of agent or run. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or run for a custom entrypoint.\",\n );\n }\n\n if (entrypoints === 0) {\n throw new Error(\n \"aiSdkHarness requires agent or run. Use agent for objects with run(input, runtime) or generate(input, runtime), or run for a custom entrypoint.\",\n );\n }\n}\n\nfunction hasAgentSource<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n> & { agent: AgentSource<TAgent, TInput> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n args: AiSdkCreateAgentArgs<TInput>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n): agent is (args: AiSdkCreateAgentArgs<TInput>) => MaybePromise<TAgent> {\n return (\n typeof agent === \"function\" &&\n !hasCallableMethod(agent, \"run\") &&\n !hasCallableMethod(agent, \"generate\")\n );\n}\n\ntype TraceRecorder = {\n id: string;\n rootSpanId: string;\n name: string;\n startedAt: Date;\n};\n\nfunction createTraceRecorder(name: string): TraceRecorder {\n const id = `ai_sdk_trace_${++nextTraceId}`;\n\n return {\n id,\n rootSpanId: `${id}:run`,\n name,\n startedAt: new Date(),\n };\n}\n\nfunction attachAiSdkTrace(\n run: HarnessRun,\n trace: TraceRecorder,\n result: unknown,\n finishedAt: Date,\n) {\n const errors = run.errors ?? [];\n const nativeTrace = finishAiSdkTrace(trace, {\n result,\n session: run.session,\n usage: run.usage,\n errors,\n finishedAt,\n });\n\n run.traces = [...(run.traces ?? []), nativeTrace];\n}\n\nfunction finishAiSdkTrace(\n trace: TraceRecorder,\n options: {\n result?: unknown;\n session: NormalizedSession;\n usage?: UsageSummary;\n errors?: unknown[];\n finishedAt: Date;\n },\n): NormalizedTrace {\n const modelSpans = createAiSdkModelSpans(\n trace,\n options.result,\n options.usage,\n );\n const finishedAt = options.finishedAt;\n const durationMs = finishedAt.getTime() - trace.startedAt.getTime();\n const rootError = options.errors?.[0]\n ? normalizeSpanError(options.errors[0])\n : undefined;\n const rootSpan: NormalizedSpan = {\n id: trace.rootSpanId,\n traceId: trace.id,\n name: trace.name,\n kind: \"run\",\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n status: rootError ? \"error\" : \"ok\",\n ...(rootError ? { error: rootError } : {}),\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"invoke_workflow\",\n \"gen_ai.workflow.name\": trace.name,\n ...createGenAiUsageAttributes(options.usage),\n }),\n };\n const spans = [rootSpan, ...modelSpans];\n\n return {\n id: trace.id,\n name: trace.name,\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n metadata: {\n source: \"harness-ai-sdk\",\n },\n spans,\n };\n}\n\nfunction createAiSdkModelSpans(\n trace: TraceRecorder,\n result: unknown,\n usage: UsageSummary | undefined,\n): NormalizedSpan[] {\n const steps = readAiSdkSteps(result);\n if (steps.length === 0) {\n const fallback = createUsageModelSpan(trace, usage);\n return fallback ? [fallback] : [];\n }\n\n return steps.map((step, index) => {\n const stepUsage = step.usage;\n\n return {\n id: `${trace.id}:model:${index + 1}`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: `ai-sdk step ${step.stepNumber ?? index}`,\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n \"gen_ai.provider.name\": step.model?.provider,\n \"gen_ai.request.model\": step.model?.modelId,\n \"gen_ai.response.model\": step.model?.modelId,\n \"gen_ai.response.finish_reasons\": step.finishReason\n ? [String(step.finishReason)]\n : undefined,\n \"gen_ai.usage.input_tokens\": stepUsage?.inputTokens,\n \"gen_ai.usage.output_tokens\": stepUsage?.outputTokens,\n \"gen_ai.usage.reasoning.output_tokens\":\n stepUsage?.outputTokenDetails?.reasoningTokens ??\n stepUsage?.reasoningTokens,\n \"gen_ai.usage.cache_read.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheReadTokens ??\n stepUsage?.cachedInputTokens,\n \"gen_ai.usage.cache_creation.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheWriteTokens,\n \"ai.step.number\": step.stepNumber,\n \"ai.finish_reason\": step.finishReason,\n \"ai.raw_finish_reason\": step.rawFinishReason,\n }),\n } satisfies NormalizedSpan;\n });\n}\n\nfunction createUsageModelSpan(\n trace: TraceRecorder,\n usage: UsageSummary | undefined,\n): NormalizedSpan | undefined {\n if (!usage?.provider && !usage?.model) {\n return undefined;\n }\n\n return {\n id: `${trace.id}:model:1`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: usage.model ? `ai-sdk ${usage.model}` : \"ai-sdk model\",\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n ...createGenAiUsageAttributes(usage),\n }),\n };\n}\n\nfunction createToolset<TInput, TTools extends AiSdkToolset<TInput>>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeEvents,\n}: {\n input: TInput;\n context: HarnessContext;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput> | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeEvents: TranscriptEvent[];\n}) {\n return Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => {\n const replay = toolReplay?.[toolName];\n\n if (replay && !tool.execute) {\n throw new Error(\n `Tool replay requires execute() for ${toolName}. Provider-executed tools cannot be recorded automatically.`,\n );\n }\n\n if (!tool.execute) {\n return [toolName, tool];\n }\n\n const execute = tool.execute;\n const wrappedTool = {\n ...tool,\n execute: async (\n toolInput: InferToolInput<typeof tool>,\n execution: ToolExecutionOptions,\n ) => {\n const startedAt = new Date();\n const normalizedArgs = normalizeArguments(toolInput);\n const call: TranscriptToolCallEvent = {\n type: \"tool_call\",\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n startedAt: startedAt.toISOString(),\n };\n runtimeEvents.push(call);\n const replayContext = {\n input,\n signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput>;\n\n try {\n const executionResult = replay\n ? await executeToolWithReplay({\n toolName,\n toolInput,\n execute,\n execution,\n context: replayContext,\n replay,\n })\n : {\n result: await execute(toolInput, execution),\n replay: undefined,\n };\n const finishedAt = new Date();\n const replayMetadata = normalizeReplayMetadata(\n executionResult.replay,\n );\n\n if (executionResult.replay) {\n replayMetadataByToolCallId.set(\n execution.toolCallId,\n executionResult.replay,\n );\n }\n\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n if (replayMetadata) {\n call.metadata = replayMetadata;\n }\n const normalizedResult = toJsonValue(executionResult.result);\n runtimeEvents.push({\n type: \"tool_result\",\n toolCallId: execution.toolCallId,\n name: toolName,\n ...(normalizedResult !== undefined\n ? { content: normalizedResult }\n : {}),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n\n return executionResult.result as InferToolOutput<typeof tool>;\n } catch (error) {\n const replay = getReplayMetadataFromError(error);\n const finishedAt = new Date();\n const replayMetadata = normalizeReplayMetadata(replay);\n\n if (replay) {\n replayMetadataByToolCallId.set(execution.toolCallId, replay);\n }\n\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n if (replayMetadata) {\n call.metadata = replayMetadata;\n }\n runtimeEvents.push({\n type: \"tool_result\",\n toolCallId: execution.toolCallId,\n name: toolName,\n error: normalizeError(error),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n throw error;\n }\n },\n } satisfies typeof tool;\n\n return [toolName, wrappedTool];\n }),\n ) as AiSdkRuntimeToolset<TTools>;\n}\n\nasync function executeToolWithReplay<\n TInput,\n TTool extends AiSdkToolDefinition<any, any, TInput>,\n>({\n toolName,\n toolInput,\n execute,\n execution,\n context,\n replay,\n}: {\n toolName: string;\n toolInput: InferToolInput<TTool>;\n execute: NonNullable<TTool[\"execute\"]>;\n execution: ToolExecutionOptions;\n context: AiSdkToolContext<TInput>;\n replay: AiSdkToolReplayPolicy<TInput>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<JsonValue, JsonValue, AiSdkToolContext<TInput>>({\n toolName,\n args: replayInput,\n context,\n execute: async (replayedInput) => {\n const output = await execute(\n replayedInput as InferToolInput<TTool>,\n execution,\n );\n\n if (isAsyncIterable(output)) {\n throw new Error(\n `Tool replay only supports JSON-serializable outputs. ${toolName} returned an async iterable.`,\n );\n }\n\n return toReplayJsonValue(output, `${toolName} tool output`);\n },\n replay,\n });\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const candidates = [\"output\", \"object\", \"text\"] satisfies string[];\n const resultRecord = result as Record<string, unknown>;\n\n for (const key of candidates) {\n if (Object.prototype.hasOwnProperty.call(resultRecord, key)) {\n return toOutputValue(resultRecord[key]);\n }\n }\n\n return undefined;\n}\n\n// Keep this adapter-local rather than exporting a core helper. Core\n// `toJsonValue` normalizes trace data; inferred app output should only accept\n// values that are already JSON-safe so the public contract stays explicit.\n// Invalid nested values reject the whole candidate instead of being patched.\nfunction toOutputValue(value: unknown): JsonValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (Array.isArray(value)) {\n const items: JsonValue[] = [];\n for (const item of value) {\n const normalized = toOutputValue(item);\n if (normalized === undefined) {\n return undefined;\n }\n items.push(normalized);\n }\n return items;\n }\n\n if (typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return undefined;\n }\n\n const record: Record<string, JsonValue> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = toOutputValue(entry);\n if (normalized === undefined) {\n return undefined;\n }\n record[key] = normalized;\n }\n return record;\n }\n\n return undefined;\n}\n\nfunction resolveUsage(\n result: unknown,\n runtimeEvents: TranscriptEvent[] = [],\n explicitSession?: NormalizedSession,\n): UsageSummary {\n const steps = readAiSdkSteps(result);\n const runtimeToolCallCount = countRuntimeToolCalls(runtimeEvents);\n const explicitSessionToolCallCount = explicitSession\n ? countSessionToolCalls(explicitSession)\n : undefined;\n const usage = readAiSdkUsage(result, steps);\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n // Runtime events count only for custom runs without AI SDK steps, so usage\n // stays aligned with the same transcript source used for assertions.\n const toolCallCount =\n explicitSessionToolCallCount ??\n (steps.length > 0 ? countStepToolCalls(steps) : runtimeToolCallCount);\n\n if (!usage) {\n if (toolCallCount > 0 || steps.length > 0) {\n return {\n provider: lastStep?.model?.provider,\n model: lastStep?.model?.modelId,\n ...(toolCallCount > 0 ? { toolCalls: toolCallCount } : {}),\n };\n }\n\n return {};\n }\n\n return {\n provider: lastStep?.model?.provider,\n model: lastStep?.model?.modelId,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens:\n usage.outputTokenDetails?.reasoningTokens ?? usage.reasoningTokens,\n totalTokens:\n usage.totalTokens ?? (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),\n toolCalls: toolCallCount > 0 ? toolCallCount : undefined,\n metadata: normalizeMetadata({\n cacheReadTokens:\n usage.inputTokenDetails?.cacheReadTokens ?? usage.cachedInputTokens,\n cacheWriteTokens: usage.inputTokenDetails?.cacheWriteTokens,\n raw: usage.raw,\n }),\n };\n}\n\nfunction countRuntimeToolCalls(events: readonly TranscriptEvent[]) {\n return events.filter((event) => event.type === \"tool_call\").length;\n}\n\nfunction resolveStepUsage(steps: StepLike[]): LanguageModelUsage | undefined {\n const usages = steps.map((step) => step.usage).filter(isLanguageModelUsage);\n\n if (usages.length === 0) {\n return undefined;\n }\n\n return usages.reduce(addLanguageModelUsage);\n}\n\nfunction addLanguageModelUsage(\n left: LanguageModelUsage,\n right: LanguageModelUsage,\n): LanguageModelUsage {\n return {\n inputTokens: addTokenCounts(left.inputTokens, right.inputTokens),\n inputTokenDetails: {\n noCacheTokens: addTokenCounts(\n left.inputTokenDetails?.noCacheTokens,\n right.inputTokenDetails?.noCacheTokens,\n ),\n cacheReadTokens: addTokenCounts(\n left.inputTokenDetails?.cacheReadTokens,\n right.inputTokenDetails?.cacheReadTokens,\n ),\n cacheWriteTokens: addTokenCounts(\n left.inputTokenDetails?.cacheWriteTokens,\n right.inputTokenDetails?.cacheWriteTokens,\n ),\n },\n outputTokens: addTokenCounts(left.outputTokens, right.outputTokens),\n outputTokenDetails: {\n textTokens: addTokenCounts(\n left.outputTokenDetails?.textTokens,\n right.outputTokenDetails?.textTokens,\n ),\n reasoningTokens: addTokenCounts(\n left.outputTokenDetails?.reasoningTokens,\n right.outputTokenDetails?.reasoningTokens,\n ),\n },\n totalTokens: addTokenCounts(left.totalTokens, right.totalTokens),\n reasoningTokens: addTokenCounts(\n left.reasoningTokens,\n right.reasoningTokens,\n ),\n cachedInputTokens: addTokenCounts(\n left.cachedInputTokens,\n right.cachedInputTokens,\n ),\n };\n}\n\nfunction addTokenCounts(left: number | undefined, right: number | undefined) {\n return left == null && right == null ? undefined : (left ?? 0) + (right ?? 0);\n}\n\nfunction countStepToolCalls(steps: StepLike[]) {\n return steps.reduce(\n (count, step) => count + (step.toolCalls?.length ?? 0),\n 0,\n );\n}\n\nfunction countSessionToolCalls(session: NormalizedSession) {\n return session.events.filter((event) => event.type === \"tool_call\").length;\n}\n\nfunction shouldUseRuntimeEvents(result: unknown) {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return false;\n }\n\n return readAiSdkSteps(result).length === 0;\n}\n\nfunction resolveSession(\n input: unknown,\n result: unknown,\n output: JsonValue | undefined,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n runtimeEvents: TranscriptEvent[] = [],\n explicitSession = getResultSession(result),\n): NormalizedSession {\n if (explicitSession) {\n return explicitSession;\n }\n\n const steps = readAiSdkSteps(result);\n const events: TranscriptEvent[] = [\n {\n type: \"message\",\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n\n for (const step of steps) {\n events.push(...normalizeStep(step, replayMetadataByToolCallId));\n }\n\n // Runtime events are only the transcript source when no AI SDK steps exist;\n // explicit sessions returned above and provider steps stay authoritative.\n if (steps.length === 0) {\n events.push(...runtimeEvents);\n }\n\n if (\n output !== undefined &&\n !events.some(\n (event) =>\n event.type === \"message\" &&\n event.role === \"assistant\" &&\n event.content !== undefined,\n )\n ) {\n events.push({\n type: \"message\",\n role: \"assistant\",\n content: output,\n });\n }\n\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n return {\n events,\n provider: lastStep?.model?.provider,\n model: lastStep?.model?.modelId,\n };\n}\n\nfunction getResultSession(result: unknown): NormalizedSession | undefined {\n const session = (result as Record<string, unknown> | undefined)?.session;\n return isNormalizedSession(session) ? session : undefined;\n}\n\nfunction resolveFailureSession(\n input: unknown,\n runtimeEvents: TranscriptEvent[],\n): NormalizedSession {\n return {\n events: [\n {\n type: \"message\",\n role: \"user\",\n content: normalizeContent(input),\n },\n ...runtimeEvents,\n ],\n };\n}\n\n/** Reads AI SDK step arrays only when the field looks like provider step data. */\nfunction readAiSdkSteps(result: unknown): StepLike[] {\n if (!result || typeof result !== \"object\") {\n return [];\n }\n\n if (!Object.prototype.hasOwnProperty.call(result, \"steps\")) {\n return [];\n }\n\n const steps = (result as AiSdkLikeResult).steps;\n if (!Array.isArray(steps)) {\n return [];\n }\n if (steps.length > 0 && !steps.every(isAiSdkStepLike)) {\n return [];\n }\n\n return steps;\n}\n\nfunction isAiSdkStepLike(step: unknown): step is StepLike {\n if (!step || typeof step !== \"object\") {\n return false;\n }\n\n const record = step as Record<string, unknown>;\n return (\n Array.isArray(record.content) ||\n Array.isArray(record.toolCalls) ||\n Array.isArray(record.toolResults) ||\n Boolean(record.response && typeof record.response === \"object\") ||\n Boolean(record.usage && typeof record.usage === \"object\") ||\n typeof record.finishReason === \"string\" ||\n typeof record.stepNumber === \"number\" ||\n typeof record.text === \"string\"\n );\n}\n\nfunction readAiSdkUsage(\n result: unknown,\n steps: StepLike[],\n): LanguageModelUsage | undefined {\n // AI SDK generateText exposes aggregate `totalUsage`; `usage` is the last\n // step and only applies to non-step results such as generateObject.\n const totalUsage = readUsageField(result, \"totalUsage\");\n if (totalUsage) {\n return totalUsage;\n }\n\n if (steps.length > 0) {\n return resolveStepUsage(steps);\n }\n\n return readUsageField(result, \"usage\");\n}\n\nfunction readUsageField(\n result: unknown,\n field: \"usage\" | \"totalUsage\",\n): LanguageModelUsage | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const usage = (result as AiSdkLikeResult)[field];\n return isLanguageModelUsage(usage) ? usage : undefined;\n}\n\nfunction isLanguageModelUsage(value: unknown): value is LanguageModelUsage {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const usage = value as LanguageModelUsage;\n return (\n isOptionalFiniteNumber(usage.inputTokens) &&\n isOptionalFiniteNumber(usage.outputTokens) &&\n isOptionalFiniteNumber(usage.reasoningTokens) &&\n isOptionalFiniteNumber(usage.totalTokens) &&\n isOptionalFiniteNumber(usage.cachedInputTokens) &&\n isUsageDetailObject(usage.inputTokenDetails) &&\n isUsageDetailObject(usage.outputTokenDetails)\n );\n}\n\nfunction isUsageDetailObject(value: unknown) {\n if (value === undefined) {\n return true;\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n return Object.values(value).every(isOptionalFiniteNumber);\n}\n\nfunction isOptionalFiniteNumber(value: unknown) {\n return (\n value === undefined || (typeof value === \"number\" && Number.isFinite(value))\n );\n}\n\nfunction normalizeStep(\n step: StepLike,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): TranscriptEvent[] {\n const toolResultsById = new Map(\n (step.toolResults ?? []).map((toolResult) => [\n toolResult.toolCallId,\n toolResult,\n ]),\n );\n const toolErrorsById = new Map(\n (step.toolCalls ?? [])\n .filter((toolCall) => toolCall.invalid || toolCall.error !== undefined)\n .map((toolCall) => [\n toolCall.toolCallId,\n normalizeError(toolCall.error ?? toolCall.invalid),\n ]),\n );\n\n const normalizedCalls = (step.toolCalls ?? []).map((toolCall) =>\n normalizeToolCall(toolCall, toolResultsById, replayMetadataByToolCallId),\n );\n const assistantMetadata = normalizeMetadata({\n stepNumber: step.stepNumber,\n finishReason: step.finishReason,\n rawFinishReason: step.rawFinishReason,\n reasoningText: step.reasoningText,\n response: step.response,\n });\n const events: TranscriptEvent[] = [];\n\n if (step.text || assistantMetadata) {\n events.push({\n type: \"message\",\n role: \"assistant\",\n ...(step.text ? { content: step.text } : {}),\n ...(assistantMetadata ? { metadata: assistantMetadata } : {}),\n });\n }\n\n events.push(...normalizedCalls);\n\n for (const toolResult of step.toolResults ?? []) {\n const content =\n toolResult.output === undefined\n ? undefined\n : normalizeContent(toolResult.output);\n events.push({\n type: \"tool_result\",\n toolCallId: toolResult.toolCallId,\n name: toolResult.toolName,\n ...(content !== undefined ? { content } : {}),\n ...(toolErrorsById.has(toolResult.toolCallId)\n ? { error: toolErrorsById.get(toolResult.toolCallId) }\n : {}),\n metadata: normalizeMetadata({\n preliminary: toolResult.preliminary,\n providerExecuted: toolResult.providerExecuted,\n title: toolResult.title,\n providerMetadata: toolResult.providerMetadata,\n }),\n });\n }\n\n return events;\n}\n\nfunction normalizeToolCall(\n toolCall: StepLike[\"toolCalls\"][number],\n toolResultsById: Map<string, StepLike[\"toolResults\"][number]>,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): TranscriptToolCallEvent {\n const toolResult = toolResultsById.get(toolCall.toolCallId);\n const normalizedArguments = normalizeArguments(toolCall.input);\n const errorValue =\n toolCall.invalid || toolCall.error !== undefined\n ? normalizeError(toolCall.error ?? toolCall.invalid)\n : undefined;\n const replayMetadata = normalizeReplayMetadata(\n replayMetadataByToolCallId.get(toolCall.toolCallId),\n );\n\n return {\n type: \"tool_call\",\n id: toolCall.toolCallId,\n name: toolCall.toolName,\n ...(normalizedArguments ? { arguments: normalizedArguments } : {}),\n metadata: normalizeMetadata({\n providerExecuted:\n toolCall.providerExecuted ?? toolResult?.providerExecuted,\n title: toolCall.title ?? toolResult?.title,\n dynamic: toolCall.dynamic,\n invalid: toolCall.invalid,\n ...(errorValue ? { error: errorValue } : {}),\n preliminary: toolResult?.preliminary,\n providerMetadata:\n toolCall.providerMetadata ?? toolResult?.providerMetadata,\n ...(replayMetadata ?? {}),\n }),\n };\n}\n\nfunction normalizeArguments(\n value: unknown,\n): Record<string, JsonValue> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n return normalizeRecord(value as Record<string, unknown>);\n}\n\nfunction normalizeError(error: unknown) {\n if (error instanceof Error) {\n return {\n type: error.name,\n message: error.message,\n };\n }\n\n const normalized = toJsonValue(error);\n if (\n normalized &&\n typeof normalized === \"object\" &&\n !Array.isArray(normalized) &&\n typeof normalized.message === \"string\"\n ) {\n return {\n message: normalized.message,\n type: typeof normalized.type === \"string\" ? normalized.type : \"Error\",\n };\n }\n\n return {\n type: \"Error\",\n message: String(error ?? \"Unknown tool call error\"),\n };\n}\n\nfunction toReplayJsonValue(value: unknown, label: string): JsonValue {\n const normalized = toJsonValue(value);\n if (normalized === undefined) {\n throw new Error(\n `Tool replay only supports JSON-serializable values. ${label} could not be normalized.`,\n );\n }\n\n return normalized;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n Symbol.asyncIterator in value\n );\n}\n"],"mappings":"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","names":["replay"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n attachHarnessRunToError,\n createFailedHarnessRun,\n createGenAiUsageAttributes,\n ensureRunTrace,\n getHarnessRunFromError,\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n normalizeSpanAttributes,\n normalizeSpanError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessRun,\n JsonValue,\n TranscriptToolCallEvent,\n TranscriptEvent,\n NormalizedSpan,\n NormalizedSession,\n NormalizedTrace,\n TimingSummary,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport { generateObject, generateText, jsonSchema } from \"ai\";\nimport {\n createJudgeHarness,\n type JudgeHarnessInput,\n} from \"vitest-evals/judges\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMetadata,\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\nimport type {\n InferToolInput,\n InferToolOutput,\n LanguageModel,\n LanguageModelUsage,\n StepResult,\n Tool,\n ToolExecuteFunction,\n ToolExecutionOptions,\n ToolSet,\n} from \"ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AiSdkProviderOptions = Parameters<\n typeof generateText\n>[0][\"providerOptions\"];\ntype JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<TAgent, TInput = string> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<TInput = string> = Record<\n string,\n AiSdkToolDefinition<any, any, TInput>\n>;\n\nlet nextTraceId = 0;\n\n/**\n * Configuration for adapting an AI SDK language model into a judge harness.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n * ```\n */\nexport interface AiSdkJudgeHarnessConfig {\n /** AI SDK language model used for judge prompts. */\n model: LanguageModel;\n /** Optional display name for diagnostics. */\n name?: string;\n /** Optional judge-model temperature. */\n temperature?: number;\n /** Optional judge-model token cap. */\n maxOutputTokens?: number;\n /** Optional provider-specific options forwarded to the AI SDK. */\n providerOptions?: AiSdkProviderOptions;\n}\n\n/**\n * Adapts an AI SDK language model into the provider-neutral judge harness API.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n * import { describeEval, FactualityJudge } from \"vitest-evals\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n *\n * describeEval(\"qa agent\", {\n * harness: qaHarness,\n * judgeHarness,\n * judges: [FactualityJudge()],\n * }, (it) => {});\n * ```\n */\nexport function aiSdkJudgeHarness(config: AiSdkJudgeHarnessConfig) {\n return createJudgeHarness({\n name: config.name ?? \"ai-sdk\",\n run: (input, options) => runAiSdkJudgeHarness(config, input, options),\n });\n}\n\nasync function runAiSdkJudgeHarness(\n config: AiSdkJudgeHarnessConfig,\n input: JudgeHarnessInput,\n options: { signal?: AbortSignal },\n) {\n const system = formatAiSdkJudgeSystemPrompt(\n input.system,\n input.responseFormat,\n );\n const requestOptions = {\n model: config.model,\n prompt: input.prompt,\n ...(system !== undefined ? { system } : {}),\n ...(config.temperature !== undefined\n ? { temperature: config.temperature }\n : {}),\n ...(config.maxOutputTokens !== undefined\n ? { maxOutputTokens: config.maxOutputTokens }\n : {}),\n ...(config.providerOptions !== undefined\n ? { providerOptions: config.providerOptions }\n : {}),\n ...(options.signal ? { abortSignal: options.signal } : {}),\n };\n\n if (\n input.responseFormat?.type === \"json\" &&\n input.responseFormat.schema !== undefined\n ) {\n const result = await generateObject({\n ...requestOptions,\n schema: jsonSchema(\n input.responseFormat.schema as Parameters<typeof jsonSchema>[0],\n ),\n });\n\n return createAiSdkJudgeRun(input, result, normalizeContent(result.object));\n }\n\n const result = await generateText(requestOptions);\n return createAiSdkJudgeRun(input, result, result.text);\n}\n\nfunction createAiSdkJudgeRun(\n input: JudgeHarnessInput,\n result: unknown,\n output: JsonValue | undefined,\n): HarnessRun {\n const usage = resolveUsage(result);\n return {\n output,\n session: resolveSession(\n input.prompt,\n result,\n output,\n new Map(),\n [],\n undefined,\n ),\n usage,\n errors: [],\n };\n}\n\nfunction formatAiSdkJudgeSystemPrompt(\n system: string | undefined,\n responseFormat: JudgeHarnessInput[\"responseFormat\"],\n) {\n if (responseFormat?.type !== \"json\" || responseFormat.schema !== undefined) {\n return system;\n }\n\n const jsonInstruction =\n \"Return only valid JSON. Do not include markdown fences or explanatory prose.\";\n\n return system ? `${system}\\n\\n${jsonInstruction}` : jsonInstruction;\n}\n\ntype StepLike = Pick<\n StepResult<ToolSet>,\n | \"content\"\n | \"finishReason\"\n | \"model\"\n | \"rawFinishReason\"\n | \"reasoningText\"\n | \"response\"\n | \"stepNumber\"\n | \"text\"\n | \"toolCalls\"\n | \"toolResults\"\n | \"usage\"\n>;\n\ntype AiSdkLikeResult = {\n steps?: StepLike[];\n usage?: LanguageModelUsage;\n totalUsage?: LanguageModelUsage;\n output?: unknown;\n object?: unknown;\n text?: string;\n session?: NormalizedSession;\n errors?: Array<Record<string, JsonValue>>;\n};\n\ntype AiSdkResultOutput<TResult> = TResult extends HarnessRun<infer TOutput>\n ? TOutput\n : \"output\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"output\">\n : \"object\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"object\">\n : \"text\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"text\">\n : undefined;\ntype AiSdkAgentResult<\n TAgent,\n TInput,\n TTools extends AiSdkToolset<TInput>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : TAgent extends {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n }\n ? Awaited<TResult>\n : unknown;\n\n/** Context passed to instrumented AI SDK tool executions. */\nexport interface AiSdkToolContext<TInput = string> {\n input: TInput;\n signal?: AbortSignal;\n setArtifact: HarnessContext[\"setArtifact\"];\n execution: ToolExecutionOptions;\n}\n\n/** Replay mode alias used by the AI SDK harness package. */\nexport type AiSdkReplayMode = ReplayMode;\n\n/** Tool replay recording shape for AI SDK tools. */\nexport type AiSdkToolRecording<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for an AI SDK tool. */\nexport type AiSdkToolReplayConfig<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput>>;\n\n/** AI SDK tool definition accepted by the harness. */\nexport type AiSdkToolDefinition<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n _TInput = string,\n> = Tool<TArgs, TResult>;\n\n/** Replay policy for one AI SDK tool. */\nexport type AiSdkToolReplayPolicy<TInput = string> =\n | boolean\n | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput>;\n\n/** Replay policy map keyed by AI SDK tool name. */\nexport type AiSdkToolReplayPolicies<TInput = string> = Record<\n string,\n AiSdkToolReplayPolicy<TInput>\n>;\n\n/** Toolset shape accepted by the AI SDK harness. */\nexport type AiSdkToolset<TInput = string> = AnyAiSdkToolset<TInput>;\n\n/** Runtime toolset exposed to the system under test. */\nexport type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any>> = {\n [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<\n infer TArgs extends JsonValue,\n infer TResult extends JsonValue,\n infer _TInput\n >\n ? Omit<TTools[K], \"execute\"> & {\n execute?: ToolExecuteFunction<TArgs, TResult>;\n }\n : TTools[K];\n};\n\n/** Runtime object passed into AI SDK-style agent entrypoints. */\nexport interface AiSdkRuntime<\n TTools extends AiSdkToolset<TInput>,\n TInput = string,\n> {\n tools: AiSdkRuntimeToolset<TTools>;\n signal?: AbortSignal;\n}\n\n/** Arguments passed to per-run AI SDK agent factories. */\nexport interface AiSdkCreateAgentArgs<TInput = string> {\n input: TInput;\n context: HarnessContext;\n}\n\n/** Arguments passed to custom AI SDK harness run callbacks. */\nexport interface AiSdkHarnessRunArgs<\n TAgent,\n TInput,\n TTools extends AiSdkToolset<TInput>,\n> {\n agent: TAgent | undefined;\n input: TInput;\n context: HarnessContext;\n runtime: AiSdkRuntime<TTools, TInput>;\n tools: AiSdkRuntimeToolset<TTools>;\n}\n\n/** Arguments passed to AI SDK harness output selectors. */\nexport interface AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TResult,\n TTools extends AiSdkToolset<TInput>,\n> extends AiSdkHarnessRunArgs<TAgent, TInput, TTools> {\n result: TResult;\n}\n\ntype AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TResult,\n TTools extends AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined,\n> = (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype AiSdkHarnessOptions<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> &\n (\n | {\n agent: AgentSource<TAgent, TInput>;\n run?: never;\n }\n | {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n agent?: never;\n }\n );\n\ntype AiSdkHarnessOptionsWithOutput<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput> & {\n output: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n};\n\ntype AiSdkHarnessRunOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult>;\n agent?: never;\n output?: never;\n};\n\ntype AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n agent: AgentSource<TAgent, TInput>;\n run?: never;\n output?: never;\n};\n\ninterface AiSdkHarnessBaseOptions<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput>;\n output?: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\n/** Adapts an AI SDK-style workflow into a normalized eval harness. */\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptionsWithOutput<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessRunOptionsWithoutOutput<TAgent, TInput, TResult, TTools>,\n): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessAgentOptionsWithoutOutput<TAgent, TInput, TTools>,\n): Harness<TInput, AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TTools>>>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): Harness<TInput, TOutput> {\n validateOptions(options);\n\n const harnessName = options.name ?? \"ai-sdk\";\n const harness: Harness<TInput, TOutput> = {\n name: harnessName,\n run: async (input, context) => {\n const startedAt = new Date();\n\n try {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n return await runAiSdkHarness(options, agent, input, context);\n } catch (error) {\n if (getHarnessRunFromError(error)) {\n throw error;\n }\n\n throw attachHarnessRunToError(\n error,\n createFailedAiSdkRun(input, context, error, harnessName, startedAt),\n );\n }\n },\n };\n\n return harness;\n}\n\nfunction createFailedAiSdkRun<TInput>(\n input: TInput,\n context: HarnessContext,\n error: unknown,\n harnessName: string,\n startedAt: Date,\n) {\n const run = createFailedHarnessRun(input, error, {\n artifacts: context.artifacts,\n });\n ensureRunTrace(run, {\n name: harnessName,\n startedAt,\n finishedAt: new Date(),\n operationName: \"invoke_workflow\",\n source: \"harness-ai-sdk\",\n });\n\n return run;\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext,\n): Promise<HarnessRun<TOutput>> {\n const trace = createTraceRecorder(options.name ?? \"ai-sdk\");\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const runtimeEvents: TranscriptEvent[] = [];\n const tools = createToolset({\n input,\n context,\n tools: options.tools,\n toolReplay: options.toolReplay,\n replayMetadataByToolCallId,\n runtimeEvents,\n });\n const runtime = {\n tools,\n signal: context.signal,\n } satisfies AiSdkRuntime<TTools, TInput>;\n\n try {\n const result = await runAgent(options, {\n agent,\n input,\n context,\n runtime,\n tools,\n });\n\n if (isHarnessRun(result) && !hasOutputSelector(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n attachAiSdkTrace(result, trace, result, new Date());\n return result;\n }\n\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n tools,\n result: result as TResult,\n } satisfies AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools>;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(result) as TOutput | undefined);\n const explicitSession = getResultSession(result);\n const useRuntimeEvents = shouldUseRuntimeEvents(result);\n const usage = resolveUsage(\n result,\n useRuntimeEvents ? runtimeEvents : [],\n explicitSession,\n );\n const session = resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeEvents,\n explicitSession,\n );\n const errors = resolveHarnessRunErrors(result);\n const finishedAt = new Date();\n\n return {\n session,\n output,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors,\n traces: [\n finishAiSdkTrace(trace, {\n result,\n session,\n usage,\n errors,\n finishedAt,\n }),\n ],\n } as HarnessRun<TOutput>;\n } catch (error) {\n const finishedAt = new Date();\n const serializedError = serializeError(error);\n const runtimeToolCallCount = runtimeEvents.filter(\n (event) => event.type === \"tool_call\",\n ).length;\n const usage =\n runtimeToolCallCount > 0 ? { toolCalls: runtimeToolCallCount } : {};\n const session = resolveFailureSession(input, runtimeEvents);\n const run = {\n session,\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializedError],\n traces: [\n finishAiSdkTrace(trace, {\n session,\n usage,\n errors: [serializedError],\n finishedAt,\n }),\n ],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(options: AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput>) {\n return Boolean(options.output);\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: AiSdkCreateAgentArgs<TInput>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (hasAiSdkRunMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (hasAiSdkGenerateMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.generate(args.input, args.runtime);\n }\n\n throw new Error(\n \"aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use run() for a custom entrypoint.\",\n );\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>) {\n const hasAgent = hasAgentSource(options);\n const hasRun = typeof (options as { run?: unknown }).run === \"function\";\n const entrypoints = [hasAgent, hasRun].filter(Boolean).length;\n\n if (entrypoints > 1) {\n throw new Error(\n \"aiSdkHarness accepts exactly one of agent or run. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or run for a custom entrypoint.\",\n );\n }\n\n if (entrypoints === 0) {\n throw new Error(\n \"aiSdkHarness requires agent or run. Use agent for objects with run(input, runtime) or generate(input, runtime), or run for a custom entrypoint.\",\n );\n }\n}\n\nfunction hasAgentSource<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n> & { agent: AgentSource<TAgent, TInput> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n args: AiSdkCreateAgentArgs<TInput>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n): agent is (args: AiSdkCreateAgentArgs<TInput>) => MaybePromise<TAgent> {\n return (\n typeof agent === \"function\" &&\n !hasCallableMethod(agent, \"run\") &&\n !hasCallableMethod(agent, \"generate\")\n );\n}\n\ntype TraceRecorder = {\n id: string;\n rootSpanId: string;\n name: string;\n startedAt: Date;\n};\n\nfunction createTraceRecorder(name: string): TraceRecorder {\n const id = `ai_sdk_trace_${++nextTraceId}`;\n\n return {\n id,\n rootSpanId: `${id}:run`,\n name,\n startedAt: new Date(),\n };\n}\n\nfunction attachAiSdkTrace(\n run: HarnessRun,\n trace: TraceRecorder,\n result: unknown,\n finishedAt: Date,\n) {\n const errors = run.errors ?? [];\n const nativeTrace = finishAiSdkTrace(trace, {\n result,\n session: run.session,\n usage: run.usage,\n errors,\n finishedAt,\n });\n\n run.traces = [...(run.traces ?? []), nativeTrace];\n}\n\nfunction finishAiSdkTrace(\n trace: TraceRecorder,\n options: {\n result?: unknown;\n session: NormalizedSession;\n usage?: UsageSummary;\n errors?: unknown[];\n finishedAt: Date;\n },\n): NormalizedTrace {\n const modelSpans = createAiSdkModelSpans(\n trace,\n options.result,\n options.usage,\n );\n const finishedAt = options.finishedAt;\n const durationMs = finishedAt.getTime() - trace.startedAt.getTime();\n const rootError = options.errors?.[0]\n ? normalizeSpanError(options.errors[0])\n : undefined;\n const rootSpan: NormalizedSpan = {\n id: trace.rootSpanId,\n traceId: trace.id,\n name: trace.name,\n kind: \"run\",\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n status: rootError ? \"error\" : \"ok\",\n ...(rootError ? { error: rootError } : {}),\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"invoke_workflow\",\n \"gen_ai.workflow.name\": trace.name,\n ...createGenAiUsageAttributes(options.usage),\n }),\n };\n const spans = [rootSpan, ...modelSpans];\n\n return {\n id: trace.id,\n name: trace.name,\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n metadata: {\n source: \"harness-ai-sdk\",\n },\n spans,\n };\n}\n\nfunction createAiSdkModelSpans(\n trace: TraceRecorder,\n result: unknown,\n usage: UsageSummary | undefined,\n): NormalizedSpan[] {\n const steps = readAiSdkSteps(result);\n if (steps.length === 0) {\n const fallback = createUsageModelSpan(trace, usage);\n return fallback ? [fallback] : [];\n }\n\n return steps.map((step, index) => {\n const stepUsage = step.usage;\n\n return {\n id: `${trace.id}:model:${index + 1}`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: `ai-sdk step ${step.stepNumber ?? index}`,\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n \"gen_ai.provider.name\": step.model?.provider,\n \"gen_ai.request.model\": step.model?.modelId,\n \"gen_ai.response.model\": step.model?.modelId,\n \"gen_ai.response.finish_reasons\": step.finishReason\n ? [String(step.finishReason)]\n : undefined,\n \"gen_ai.usage.input_tokens\": stepUsage?.inputTokens,\n \"gen_ai.usage.output_tokens\": stepUsage?.outputTokens,\n \"gen_ai.usage.reasoning.output_tokens\":\n stepUsage?.outputTokenDetails?.reasoningTokens ??\n stepUsage?.reasoningTokens,\n \"gen_ai.usage.cache_read.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheReadTokens ??\n stepUsage?.cachedInputTokens,\n \"gen_ai.usage.cache_creation.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheWriteTokens,\n \"ai.step.number\": step.stepNumber,\n \"ai.finish_reason\": step.finishReason,\n \"ai.raw_finish_reason\": step.rawFinishReason,\n }),\n } satisfies NormalizedSpan;\n });\n}\n\nfunction createUsageModelSpan(\n trace: TraceRecorder,\n usage: UsageSummary | undefined,\n): NormalizedSpan | undefined {\n if (!usage?.provider && !usage?.model) {\n return undefined;\n }\n\n return {\n id: `${trace.id}:model:1`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: usage.model ? `ai-sdk ${usage.model}` : \"ai-sdk model\",\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n ...createGenAiUsageAttributes(usage),\n }),\n };\n}\n\nfunction createToolset<TInput, TTools extends AiSdkToolset<TInput>>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeEvents,\n}: {\n input: TInput;\n context: HarnessContext;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput> | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeEvents: TranscriptEvent[];\n}) {\n return Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => {\n const replay = toolReplay?.[toolName];\n\n if (replay && !tool.execute) {\n throw new Error(\n `Tool replay requires execute() for ${toolName}. Provider-executed tools cannot be recorded automatically.`,\n );\n }\n\n if (!tool.execute) {\n return [toolName, tool];\n }\n\n const execute = tool.execute;\n const wrappedTool = {\n ...tool,\n execute: async (\n toolInput: InferToolInput<typeof tool>,\n execution: ToolExecutionOptions,\n ) => {\n const startedAt = new Date();\n const normalizedArgs = normalizeArguments(toolInput);\n const call: TranscriptToolCallEvent = {\n type: \"tool_call\",\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n startedAt: startedAt.toISOString(),\n };\n runtimeEvents.push(call);\n const replayContext = {\n input,\n signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput>;\n\n try {\n const executionResult = replay\n ? await executeToolWithReplay({\n toolName,\n toolInput,\n execute,\n execution,\n context: replayContext,\n replay,\n })\n : {\n result: await execute(toolInput, execution),\n replay: undefined,\n };\n const finishedAt = new Date();\n const replayMetadata = normalizeReplayMetadata(\n executionResult.replay,\n );\n\n if (executionResult.replay) {\n replayMetadataByToolCallId.set(\n execution.toolCallId,\n executionResult.replay,\n );\n }\n\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n if (replayMetadata) {\n call.metadata = replayMetadata;\n }\n const normalizedResult = toJsonValue(executionResult.result);\n runtimeEvents.push({\n type: \"tool_result\",\n toolCallId: execution.toolCallId,\n name: toolName,\n ...(normalizedResult !== undefined\n ? { content: normalizedResult }\n : {}),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n\n return executionResult.result as InferToolOutput<typeof tool>;\n } catch (error) {\n const replay = getReplayMetadataFromError(error);\n const finishedAt = new Date();\n const replayMetadata = normalizeReplayMetadata(replay);\n\n if (replay) {\n replayMetadataByToolCallId.set(execution.toolCallId, replay);\n }\n\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n if (replayMetadata) {\n call.metadata = replayMetadata;\n }\n runtimeEvents.push({\n type: \"tool_result\",\n toolCallId: execution.toolCallId,\n name: toolName,\n error: normalizeError(error),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n throw error;\n }\n },\n } satisfies typeof tool;\n\n return [toolName, wrappedTool];\n }),\n ) as AiSdkRuntimeToolset<TTools>;\n}\n\nasync function executeToolWithReplay<\n TInput,\n TTool extends AiSdkToolDefinition<any, any, TInput>,\n>({\n toolName,\n toolInput,\n execute,\n execution,\n context,\n replay,\n}: {\n toolName: string;\n toolInput: InferToolInput<TTool>;\n execute: NonNullable<TTool[\"execute\"]>;\n execution: ToolExecutionOptions;\n context: AiSdkToolContext<TInput>;\n replay: AiSdkToolReplayPolicy<TInput>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<JsonValue, JsonValue, AiSdkToolContext<TInput>>({\n toolName,\n args: replayInput,\n context,\n execute: async (replayedInput) => {\n const output = await execute(\n replayedInput as InferToolInput<TTool>,\n execution,\n );\n\n if (isAsyncIterable(output)) {\n throw new Error(\n `Tool replay only supports JSON-serializable outputs. ${toolName} returned an async iterable.`,\n );\n }\n\n return toReplayJsonValue(output, `${toolName} tool output`);\n },\n replay,\n });\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const candidates = [\"output\", \"object\", \"text\"] satisfies string[];\n const resultRecord = result as Record<string, unknown>;\n\n for (const key of candidates) {\n if (Object.prototype.hasOwnProperty.call(resultRecord, key)) {\n return toOutputValue(resultRecord[key]);\n }\n }\n\n return undefined;\n}\n\n// Keep this adapter-local rather than exporting a core helper. Core\n// `toJsonValue` normalizes trace data; inferred app output should only accept\n// values that are already JSON-safe so the public contract stays explicit.\n// Invalid nested values reject the whole candidate instead of being patched.\nfunction toOutputValue(value: unknown): JsonValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (Array.isArray(value)) {\n const items: JsonValue[] = [];\n for (const item of value) {\n const normalized = toOutputValue(item);\n if (normalized === undefined) {\n return undefined;\n }\n items.push(normalized);\n }\n return items;\n }\n\n if (typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return undefined;\n }\n\n const record: Record<string, JsonValue> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = toOutputValue(entry);\n if (normalized === undefined) {\n return undefined;\n }\n record[key] = normalized;\n }\n return record;\n }\n\n return undefined;\n}\n\nfunction resolveUsage(\n result: unknown,\n runtimeEvents: TranscriptEvent[] = [],\n explicitSession?: NormalizedSession,\n): UsageSummary {\n const steps = readAiSdkSteps(result);\n const runtimeToolCallCount = countRuntimeToolCalls(runtimeEvents);\n const explicitSessionToolCallCount = explicitSession\n ? countSessionToolCalls(explicitSession)\n : undefined;\n const usage = readAiSdkUsage(result, steps);\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n // Runtime events count only for custom runs without AI SDK steps, so usage\n // stays aligned with the same transcript source used for assertions.\n const toolCallCount =\n explicitSessionToolCallCount ??\n (steps.length > 0 ? countStepToolCalls(steps) : runtimeToolCallCount);\n\n if (!usage) {\n if (toolCallCount > 0 || steps.length > 0) {\n return {\n provider: lastStep?.model?.provider,\n model: lastStep?.model?.modelId,\n ...(toolCallCount > 0 ? { toolCalls: toolCallCount } : {}),\n };\n }\n\n return {};\n }\n\n return {\n provider: lastStep?.model?.provider,\n model: lastStep?.model?.modelId,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens:\n usage.outputTokenDetails?.reasoningTokens ?? usage.reasoningTokens,\n totalTokens:\n usage.totalTokens ?? (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),\n toolCalls: toolCallCount > 0 ? toolCallCount : undefined,\n metadata: normalizeMetadata({\n cacheReadTokens:\n usage.inputTokenDetails?.cacheReadTokens ?? usage.cachedInputTokens,\n cacheWriteTokens: usage.inputTokenDetails?.cacheWriteTokens,\n raw: usage.raw,\n }),\n };\n}\n\nfunction countRuntimeToolCalls(events: readonly TranscriptEvent[]) {\n return events.filter((event) => event.type === \"tool_call\").length;\n}\n\nfunction resolveStepUsage(steps: StepLike[]): LanguageModelUsage | undefined {\n const usages = steps.map((step) => step.usage).filter(isLanguageModelUsage);\n\n if (usages.length === 0) {\n return undefined;\n }\n\n return usages.reduce(addLanguageModelUsage);\n}\n\nfunction addLanguageModelUsage(\n left: LanguageModelUsage,\n right: LanguageModelUsage,\n): LanguageModelUsage {\n return {\n inputTokens: addTokenCounts(left.inputTokens, right.inputTokens),\n inputTokenDetails: {\n noCacheTokens: addTokenCounts(\n left.inputTokenDetails?.noCacheTokens,\n right.inputTokenDetails?.noCacheTokens,\n ),\n cacheReadTokens: addTokenCounts(\n left.inputTokenDetails?.cacheReadTokens,\n right.inputTokenDetails?.cacheReadTokens,\n ),\n cacheWriteTokens: addTokenCounts(\n left.inputTokenDetails?.cacheWriteTokens,\n right.inputTokenDetails?.cacheWriteTokens,\n ),\n },\n outputTokens: addTokenCounts(left.outputTokens, right.outputTokens),\n outputTokenDetails: {\n textTokens: addTokenCounts(\n left.outputTokenDetails?.textTokens,\n right.outputTokenDetails?.textTokens,\n ),\n reasoningTokens: addTokenCounts(\n left.outputTokenDetails?.reasoningTokens,\n right.outputTokenDetails?.reasoningTokens,\n ),\n },\n totalTokens: addTokenCounts(left.totalTokens, right.totalTokens),\n reasoningTokens: addTokenCounts(\n left.reasoningTokens,\n right.reasoningTokens,\n ),\n cachedInputTokens: addTokenCounts(\n left.cachedInputTokens,\n right.cachedInputTokens,\n ),\n };\n}\n\nfunction addTokenCounts(left: number | undefined, right: number | undefined) {\n return left == null && right == null ? undefined : (left ?? 0) + (right ?? 0);\n}\n\nfunction countStepToolCalls(steps: StepLike[]) {\n return steps.reduce(\n (count, step) => count + (step.toolCalls?.length ?? 0),\n 0,\n );\n}\n\nfunction countSessionToolCalls(session: NormalizedSession) {\n return session.events.filter((event) => event.type === \"tool_call\").length;\n}\n\nfunction shouldUseRuntimeEvents(result: unknown) {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return false;\n }\n\n return readAiSdkSteps(result).length === 0;\n}\n\nfunction resolveSession(\n input: unknown,\n result: unknown,\n output: JsonValue | undefined,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n runtimeEvents: TranscriptEvent[] = [],\n explicitSession = getResultSession(result),\n): NormalizedSession {\n if (explicitSession) {\n return explicitSession;\n }\n\n const steps = readAiSdkSteps(result);\n const events: TranscriptEvent[] = [\n {\n type: \"message\",\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n\n for (const step of steps) {\n events.push(...normalizeStep(step, replayMetadataByToolCallId));\n }\n\n // Runtime events are only the transcript source when no AI SDK steps exist;\n // explicit sessions returned above and provider steps stay authoritative.\n if (steps.length === 0) {\n events.push(...runtimeEvents);\n }\n\n if (\n output !== undefined &&\n !events.some(\n (event) =>\n event.type === \"message\" &&\n event.role === \"assistant\" &&\n event.content !== undefined,\n )\n ) {\n events.push({\n type: \"message\",\n role: \"assistant\",\n content: output,\n });\n }\n\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n return {\n events,\n provider: lastStep?.model?.provider,\n model: lastStep?.model?.modelId,\n };\n}\n\nfunction getResultSession(result: unknown): NormalizedSession | undefined {\n const session = (result as Record<string, unknown> | undefined)?.session;\n return isNormalizedSession(session) ? session : undefined;\n}\n\nfunction resolveFailureSession(\n input: unknown,\n runtimeEvents: TranscriptEvent[],\n): NormalizedSession {\n return {\n events: [\n {\n type: \"message\",\n role: \"user\",\n content: normalizeContent(input),\n },\n ...runtimeEvents,\n ],\n };\n}\n\n/** Reads AI SDK step arrays only when the field looks like provider step data. */\nfunction readAiSdkSteps(result: unknown): StepLike[] {\n if (!result || typeof result !== \"object\") {\n return [];\n }\n\n if (!Object.prototype.hasOwnProperty.call(result, \"steps\")) {\n return [];\n }\n\n const steps = (result as AiSdkLikeResult).steps;\n if (!Array.isArray(steps)) {\n return [];\n }\n if (steps.length > 0 && !steps.every(isAiSdkStepLike)) {\n return [];\n }\n\n return steps;\n}\n\nfunction isAiSdkStepLike(step: unknown): step is StepLike {\n if (!step || typeof step !== \"object\") {\n return false;\n }\n\n const record = step as Record<string, unknown>;\n return (\n Array.isArray(record.content) ||\n Array.isArray(record.toolCalls) ||\n Array.isArray(record.toolResults) ||\n Boolean(record.response && typeof record.response === \"object\") ||\n Boolean(record.usage && typeof record.usage === \"object\") ||\n typeof record.finishReason === \"string\" ||\n typeof record.stepNumber === \"number\" ||\n typeof record.text === \"string\"\n );\n}\n\nfunction readAiSdkUsage(\n result: unknown,\n steps: StepLike[],\n): LanguageModelUsage | undefined {\n // AI SDK generateText exposes aggregate `totalUsage`; `usage` is the last\n // step and only applies to non-step results such as generateObject.\n const totalUsage = readUsageField(result, \"totalUsage\");\n if (totalUsage) {\n return totalUsage;\n }\n\n if (steps.length > 0) {\n return resolveStepUsage(steps);\n }\n\n return readUsageField(result, \"usage\");\n}\n\nfunction readUsageField(\n result: unknown,\n field: \"usage\" | \"totalUsage\",\n): LanguageModelUsage | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const usage = (result as AiSdkLikeResult)[field];\n return isLanguageModelUsage(usage) ? usage : undefined;\n}\n\nfunction isLanguageModelUsage(value: unknown): value is LanguageModelUsage {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const usage = value as LanguageModelUsage;\n return (\n isOptionalFiniteNumber(usage.inputTokens) &&\n isOptionalFiniteNumber(usage.outputTokens) &&\n isOptionalFiniteNumber(usage.reasoningTokens) &&\n isOptionalFiniteNumber(usage.totalTokens) &&\n isOptionalFiniteNumber(usage.cachedInputTokens) &&\n isUsageDetailObject(usage.inputTokenDetails) &&\n isUsageDetailObject(usage.outputTokenDetails)\n );\n}\n\nfunction isUsageDetailObject(value: unknown) {\n if (value === undefined) {\n return true;\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n return Object.values(value).every(isOptionalFiniteNumber);\n}\n\nfunction isOptionalFiniteNumber(value: unknown) {\n return (\n value === undefined || (typeof value === \"number\" && Number.isFinite(value))\n );\n}\n\nfunction normalizeStep(\n step: StepLike,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): TranscriptEvent[] {\n const toolResultsById = new Map(\n (step.toolResults ?? []).map((toolResult) => [\n toolResult.toolCallId,\n toolResult,\n ]),\n );\n const toolErrorsById = new Map(\n (step.toolCalls ?? [])\n .filter((toolCall) => toolCall.invalid || toolCall.error !== undefined)\n .map((toolCall) => [\n toolCall.toolCallId,\n normalizeError(toolCall.error ?? toolCall.invalid),\n ]),\n );\n\n const normalizedCalls = (step.toolCalls ?? []).map((toolCall) =>\n normalizeToolCall(toolCall, toolResultsById, replayMetadataByToolCallId),\n );\n const assistantMetadata = normalizeMetadata({\n stepNumber: step.stepNumber,\n finishReason: step.finishReason,\n rawFinishReason: step.rawFinishReason,\n reasoningText: step.reasoningText,\n response: step.response,\n });\n const events: TranscriptEvent[] = [];\n\n if (step.text || assistantMetadata) {\n events.push({\n type: \"message\",\n role: \"assistant\",\n ...(step.text ? { content: step.text } : {}),\n ...(assistantMetadata ? { metadata: assistantMetadata } : {}),\n });\n }\n\n events.push(...normalizedCalls);\n\n for (const toolResult of step.toolResults ?? []) {\n const content =\n toolResult.output === undefined\n ? undefined\n : normalizeContent(toolResult.output);\n events.push({\n type: \"tool_result\",\n toolCallId: toolResult.toolCallId,\n name: toolResult.toolName,\n ...(content !== undefined ? { content } : {}),\n ...(toolErrorsById.has(toolResult.toolCallId)\n ? { error: toolErrorsById.get(toolResult.toolCallId) }\n : {}),\n metadata: normalizeMetadata({\n preliminary: toolResult.preliminary,\n providerExecuted: toolResult.providerExecuted,\n title: toolResult.title,\n providerMetadata: toolResult.providerMetadata,\n }),\n });\n }\n\n return events;\n}\n\nfunction normalizeToolCall(\n toolCall: StepLike[\"toolCalls\"][number],\n toolResultsById: Map<string, StepLike[\"toolResults\"][number]>,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): TranscriptToolCallEvent {\n const toolResult = toolResultsById.get(toolCall.toolCallId);\n const normalizedArguments = normalizeArguments(toolCall.input);\n const errorValue =\n toolCall.invalid || toolCall.error !== undefined\n ? normalizeError(toolCall.error ?? toolCall.invalid)\n : undefined;\n const replayMetadata = normalizeReplayMetadata(\n replayMetadataByToolCallId.get(toolCall.toolCallId),\n );\n\n return {\n type: \"tool_call\",\n id: toolCall.toolCallId,\n name: toolCall.toolName,\n ...(normalizedArguments ? { arguments: normalizedArguments } : {}),\n metadata: normalizeMetadata({\n providerExecuted:\n toolCall.providerExecuted ?? toolResult?.providerExecuted,\n title: toolCall.title ?? toolResult?.title,\n dynamic: toolCall.dynamic,\n invalid: toolCall.invalid,\n ...(errorValue ? { error: errorValue } : {}),\n preliminary: toolResult?.preliminary,\n providerMetadata:\n toolCall.providerMetadata ?? toolResult?.providerMetadata,\n ...(replayMetadata ?? {}),\n }),\n };\n}\n\nfunction normalizeArguments(\n value: unknown,\n): Record<string, JsonValue> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n return normalizeRecord(value as Record<string, unknown>);\n}\n\nfunction normalizeError(error: unknown) {\n if (error instanceof Error) {\n return {\n type: error.name,\n message: error.message,\n };\n }\n\n const normalized = toJsonValue(error);\n if (\n normalized &&\n typeof normalized === \"object\" &&\n !Array.isArray(normalized) &&\n typeof normalized.message === \"string\"\n ) {\n return {\n message: normalized.message,\n type: typeof normalized.type === \"string\" ? normalized.type : \"Error\",\n };\n }\n\n return {\n type: \"Error\",\n message: String(error ?? \"Unknown tool call error\"),\n };\n}\n\nfunction toReplayJsonValue(value: unknown, label: string): JsonValue {\n const normalized = toJsonValue(value);\n if (normalized === undefined) {\n throw new Error(\n `Tool replay only supports JSON-serializable values. ${label} could not be normalized.`,\n );\n }\n\n return normalized;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n Symbol.asyncIterator in value\n );\n}\n"],"mappings":"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","names":["result","replay"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vitest-evals/harness-ai-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "AI SDK harness adapter for vitest-evals.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"ai": "^6.0.141",
|
|
40
|
-
"vitest-evals": "0.
|
|
40
|
+
"vitest-evals": "0.17.0"
|
|
41
41
|
},
|
|
42
42
|
"scripts": {
|
|
43
43
|
"build": "tsup --config ./tsup.config.ts"
|