@vitest-evals/harness-ai-sdk 0.10.0 → 0.11.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 +179 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +188 -17
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -28,6 +28,7 @@ var import_harness = require("vitest-evals/harness");
|
|
|
28
28
|
var import_ai = require("ai");
|
|
29
29
|
var import_judges = require("vitest-evals/judges");
|
|
30
30
|
var import_replay = require("vitest-evals/replay");
|
|
31
|
+
var nextTraceId = 0;
|
|
31
32
|
function aiSdkJudgeHarness(config) {
|
|
32
33
|
return (0, import_judges.createJudgeHarness)({
|
|
33
34
|
name: config.name ?? "ai-sdk",
|
|
@@ -71,19 +72,45 @@ ${jsonInstruction}` : jsonInstruction;
|
|
|
71
72
|
}
|
|
72
73
|
function aiSdkHarness(options) {
|
|
73
74
|
validateOptions(options);
|
|
75
|
+
const harnessName = options.name ?? "ai-sdk";
|
|
74
76
|
const harness = {
|
|
75
|
-
name:
|
|
77
|
+
name: harnessName,
|
|
76
78
|
run: async (input, context) => {
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
const startedAt = /* @__PURE__ */ new Date();
|
|
80
|
+
try {
|
|
81
|
+
const agent = await resolveAgent(options, {
|
|
82
|
+
input,
|
|
83
|
+
context
|
|
84
|
+
});
|
|
85
|
+
return await runAiSdkHarness(options, agent, input, context);
|
|
86
|
+
} catch (error) {
|
|
87
|
+
if ((0, import_harness.getHarnessRunFromError)(error)) {
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
throw (0, import_harness.attachHarnessRunToError)(
|
|
91
|
+
error,
|
|
92
|
+
createFailedAiSdkRun(input, context, error, harnessName, startedAt)
|
|
93
|
+
);
|
|
94
|
+
}
|
|
82
95
|
}
|
|
83
96
|
};
|
|
84
97
|
return harness;
|
|
85
98
|
}
|
|
99
|
+
function createFailedAiSdkRun(input, context, error, harnessName, startedAt) {
|
|
100
|
+
const run = (0, import_harness.createFailedHarnessRun)(input, error, {
|
|
101
|
+
artifacts: context.artifacts
|
|
102
|
+
});
|
|
103
|
+
(0, import_harness.ensureRunTrace)(run, {
|
|
104
|
+
name: harnessName,
|
|
105
|
+
startedAt,
|
|
106
|
+
finishedAt: /* @__PURE__ */ new Date(),
|
|
107
|
+
operationName: "invoke_workflow",
|
|
108
|
+
source: "harness-ai-sdk"
|
|
109
|
+
});
|
|
110
|
+
return run;
|
|
111
|
+
}
|
|
86
112
|
async function runAiSdkHarness(options, agent, input, context) {
|
|
113
|
+
const trace = createTraceRecorder(options.name ?? "ai-sdk");
|
|
87
114
|
const replayMetadataByToolCallId = /* @__PURE__ */ new Map();
|
|
88
115
|
const runtimeToolCalls = [];
|
|
89
116
|
const tools = createToolset({
|
|
@@ -110,6 +137,7 @@ async function runAiSdkHarness(options, agent, input, context) {
|
|
|
110
137
|
if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {
|
|
111
138
|
result.artifacts = context.artifacts;
|
|
112
139
|
}
|
|
140
|
+
attachAiSdkTrace(result, trace, result, /* @__PURE__ */ new Date());
|
|
113
141
|
return result;
|
|
114
142
|
}
|
|
115
143
|
const resultArgs = {
|
|
@@ -130,26 +158,48 @@ async function runAiSdkHarness(options, agent, input, context) {
|
|
|
130
158
|
runtimeToolCalls
|
|
131
159
|
);
|
|
132
160
|
const errors = (0, import_harness.resolveHarnessRunErrors)(result);
|
|
161
|
+
const finishedAt = /* @__PURE__ */ new Date();
|
|
133
162
|
return {
|
|
134
163
|
session,
|
|
135
164
|
output,
|
|
136
165
|
usage,
|
|
137
166
|
artifacts: Object.keys(context.artifacts).length > 0 ? context.artifacts : void 0,
|
|
138
|
-
errors
|
|
167
|
+
errors,
|
|
168
|
+
traces: [
|
|
169
|
+
finishAiSdkTrace(trace, {
|
|
170
|
+
result,
|
|
171
|
+
session,
|
|
172
|
+
usage,
|
|
173
|
+
errors,
|
|
174
|
+
finishedAt
|
|
175
|
+
})
|
|
176
|
+
]
|
|
139
177
|
};
|
|
140
178
|
} catch (error) {
|
|
179
|
+
const finishedAt = /* @__PURE__ */ new Date();
|
|
180
|
+
const serializedError = (0, import_harness.serializeError)(error);
|
|
181
|
+
const usage = runtimeToolCalls.length > 0 ? { toolCalls: runtimeToolCalls.length } : {};
|
|
182
|
+
const session = resolveSession(
|
|
183
|
+
input,
|
|
184
|
+
void 0,
|
|
185
|
+
void 0,
|
|
186
|
+
replayMetadataByToolCallId,
|
|
187
|
+
runtimeToolCalls
|
|
188
|
+
);
|
|
141
189
|
const run = {
|
|
142
|
-
session
|
|
143
|
-
input,
|
|
144
|
-
void 0,
|
|
145
|
-
void 0,
|
|
146
|
-
replayMetadataByToolCallId,
|
|
147
|
-
runtimeToolCalls
|
|
148
|
-
),
|
|
190
|
+
session,
|
|
149
191
|
output: void 0,
|
|
150
|
-
usage
|
|
192
|
+
usage,
|
|
151
193
|
artifacts: Object.keys(context.artifacts).length > 0 ? context.artifacts : void 0,
|
|
152
|
-
errors: [
|
|
194
|
+
errors: [serializedError],
|
|
195
|
+
traces: [
|
|
196
|
+
finishAiSdkTrace(trace, {
|
|
197
|
+
session,
|
|
198
|
+
usage,
|
|
199
|
+
errors: [serializedError],
|
|
200
|
+
finishedAt
|
|
201
|
+
})
|
|
202
|
+
]
|
|
153
203
|
};
|
|
154
204
|
throw (0, import_harness.attachHarnessRunToError)(error, run);
|
|
155
205
|
}
|
|
@@ -209,6 +259,119 @@ function hasAiSdkGenerateMethod(agent) {
|
|
|
209
259
|
function isAgentFactory(agent) {
|
|
210
260
|
return typeof agent === "function" && !(0, import_harness.hasCallableMethod)(agent, "run") && !(0, import_harness.hasCallableMethod)(agent, "generate");
|
|
211
261
|
}
|
|
262
|
+
function createTraceRecorder(name) {
|
|
263
|
+
const id = `ai_sdk_trace_${++nextTraceId}`;
|
|
264
|
+
return {
|
|
265
|
+
id,
|
|
266
|
+
rootSpanId: `${id}:run`,
|
|
267
|
+
name,
|
|
268
|
+
startedAt: /* @__PURE__ */ new Date()
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function attachAiSdkTrace(run, trace, result, finishedAt) {
|
|
272
|
+
const errors = run.errors ?? [];
|
|
273
|
+
const nativeTrace = finishAiSdkTrace(trace, {
|
|
274
|
+
result,
|
|
275
|
+
session: run.session,
|
|
276
|
+
usage: run.usage,
|
|
277
|
+
errors,
|
|
278
|
+
finishedAt
|
|
279
|
+
});
|
|
280
|
+
run.traces = [...run.traces ?? [], nativeTrace];
|
|
281
|
+
}
|
|
282
|
+
function finishAiSdkTrace(trace, options) {
|
|
283
|
+
const modelSpans = createAiSdkModelSpans(
|
|
284
|
+
trace,
|
|
285
|
+
options.result,
|
|
286
|
+
options.usage
|
|
287
|
+
);
|
|
288
|
+
const toolSpans = (0, import_harness.createToolCallSpans)((0, import_harness.toolCalls)(options.session), {
|
|
289
|
+
traceId: trace.id,
|
|
290
|
+
parentId: trace.rootSpanId,
|
|
291
|
+
spanIdPrefix: `${trace.id}:tool`
|
|
292
|
+
});
|
|
293
|
+
const finishedAt = options.finishedAt;
|
|
294
|
+
const durationMs = finishedAt.getTime() - trace.startedAt.getTime();
|
|
295
|
+
const rootError = options.errors?.[0] ? (0, import_harness.normalizeSpanError)(options.errors[0]) : void 0;
|
|
296
|
+
const rootSpan = {
|
|
297
|
+
id: trace.rootSpanId,
|
|
298
|
+
traceId: trace.id,
|
|
299
|
+
name: trace.name,
|
|
300
|
+
kind: "run",
|
|
301
|
+
startedAt: trace.startedAt.toISOString(),
|
|
302
|
+
finishedAt: finishedAt.toISOString(),
|
|
303
|
+
durationMs,
|
|
304
|
+
status: rootError ? "error" : "ok",
|
|
305
|
+
...rootError ? { error: rootError } : {},
|
|
306
|
+
attributes: (0, import_harness.normalizeSpanAttributes)({
|
|
307
|
+
"gen_ai.operation.name": "invoke_workflow",
|
|
308
|
+
"gen_ai.workflow.name": trace.name,
|
|
309
|
+
...(0, import_harness.createGenAiUsageAttributes)(options.usage)
|
|
310
|
+
})
|
|
311
|
+
};
|
|
312
|
+
const spans = [rootSpan, ...modelSpans, ...toolSpans];
|
|
313
|
+
return {
|
|
314
|
+
id: trace.id,
|
|
315
|
+
name: trace.name,
|
|
316
|
+
startedAt: trace.startedAt.toISOString(),
|
|
317
|
+
finishedAt: finishedAt.toISOString(),
|
|
318
|
+
durationMs,
|
|
319
|
+
metadata: {
|
|
320
|
+
source: "harness-ai-sdk"
|
|
321
|
+
},
|
|
322
|
+
spans
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
function createAiSdkModelSpans(trace, result, usage) {
|
|
326
|
+
const steps = resolveSteps(result);
|
|
327
|
+
if (steps.length === 0) {
|
|
328
|
+
const fallback = createUsageModelSpan(trace, usage);
|
|
329
|
+
return fallback ? [fallback] : [];
|
|
330
|
+
}
|
|
331
|
+
return steps.map((step, index) => {
|
|
332
|
+
const stepUsage = step.usage;
|
|
333
|
+
return {
|
|
334
|
+
id: `${trace.id}:model:${index + 1}`,
|
|
335
|
+
traceId: trace.id,
|
|
336
|
+
parentId: trace.rootSpanId,
|
|
337
|
+
name: `ai-sdk step ${step.stepNumber ?? index}`,
|
|
338
|
+
kind: "model",
|
|
339
|
+
status: "ok",
|
|
340
|
+
attributes: (0, import_harness.normalizeSpanAttributes)({
|
|
341
|
+
"gen_ai.operation.name": "chat",
|
|
342
|
+
"gen_ai.provider.name": step.model?.provider,
|
|
343
|
+
"gen_ai.request.model": step.model?.modelId,
|
|
344
|
+
"gen_ai.response.model": step.model?.modelId,
|
|
345
|
+
"gen_ai.response.finish_reasons": step.finishReason ? [String(step.finishReason)] : void 0,
|
|
346
|
+
"gen_ai.usage.input_tokens": stepUsage?.inputTokens,
|
|
347
|
+
"gen_ai.usage.output_tokens": stepUsage?.outputTokens,
|
|
348
|
+
"gen_ai.usage.reasoning.output_tokens": stepUsage?.outputTokenDetails?.reasoningTokens ?? stepUsage?.reasoningTokens,
|
|
349
|
+
"gen_ai.usage.cache_read.input_tokens": stepUsage?.inputTokenDetails?.cacheReadTokens ?? stepUsage?.cachedInputTokens,
|
|
350
|
+
"gen_ai.usage.cache_creation.input_tokens": stepUsage?.inputTokenDetails?.cacheWriteTokens,
|
|
351
|
+
"ai.step.number": step.stepNumber,
|
|
352
|
+
"ai.finish_reason": step.finishReason,
|
|
353
|
+
"ai.raw_finish_reason": step.rawFinishReason
|
|
354
|
+
})
|
|
355
|
+
};
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
function createUsageModelSpan(trace, usage) {
|
|
359
|
+
if (!usage?.provider && !usage?.model) {
|
|
360
|
+
return void 0;
|
|
361
|
+
}
|
|
362
|
+
return {
|
|
363
|
+
id: `${trace.id}:model:1`,
|
|
364
|
+
traceId: trace.id,
|
|
365
|
+
parentId: trace.rootSpanId,
|
|
366
|
+
name: usage.model ? `ai-sdk ${usage.model}` : "ai-sdk model",
|
|
367
|
+
kind: "model",
|
|
368
|
+
status: "ok",
|
|
369
|
+
attributes: (0, import_harness.normalizeSpanAttributes)({
|
|
370
|
+
"gen_ai.operation.name": "chat",
|
|
371
|
+
...(0, import_harness.createGenAiUsageAttributes)(usage)
|
|
372
|
+
})
|
|
373
|
+
};
|
|
374
|
+
}
|
|
212
375
|
function createToolset({
|
|
213
376
|
input,
|
|
214
377
|
context,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n attachHarnessRunToError,\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\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<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;\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 trace?: 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 TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : TAgent extends {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n }\n ? Awaited<TResult>\n : unknown;\n\n/** Context passed to instrumented AI SDK tool executions. */\nexport interface AiSdkToolContext<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n metadata: HarnessContext<TMetadata>[\"metadata\"];\n signal?: AbortSignal;\n setArtifact: HarnessContext<TMetadata>[\"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 TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput, TMetadata>>;\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 _TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Tool<TArgs, TResult>;\n\n/** Replay policy for one AI SDK tool. */\nexport type AiSdkToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;\n\n/** Replay policy map keyed by AI SDK tool name. */\nexport type AiSdkToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;\n\n/** Toolset shape accepted by the AI SDK harness. */\nexport type AiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyAiSdkToolset<TInput, TMetadata>;\n\n/** Runtime toolset exposed to the system under test. */\nexport type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any, any>> = {\n [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<\n infer TArgs extends JsonValue,\n infer TResult extends JsonValue,\n infer _TInput,\n infer _TMetadata\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, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n tools: AiSdkRuntimeToolset<TTools>;\n signal?: AbortSignal;\n}\n\n/** Arguments passed to per-run AI SDK agent factories. */\nexport interface AiSdkCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\n}\n\n/** Arguments passed to custom AI SDK harness run callbacks. */\nexport interface AiSdkHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> {\n agent: TAgent | undefined;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>;\n tools: AiSdkRuntimeToolset<TTools>;\n}\n\n/** Arguments passed to AI SDK harness output selectors. */\nexport interface AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> extends AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\ntype AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n> = (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype AiSdkHarnessOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> &\n (\n | {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n }\n | {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n agent?: never;\n }\n );\n\ntype AiSdkHarnessOptionsWithOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> & {\n output: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n};\n\ntype AiSdkHarnessRunOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult>;\n agent?: never;\n output?: never;\n};\n\ntype AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n output?: never;\n};\n\ninterface AiSdkHarnessBaseOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;\n output?: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\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 TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TTools\n >,\n): Harness<\n TInput,\n AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TMetadata, TTools>>,\n TMetadata\n>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata> {\n validateOptions(options);\n\n const harness: Harness<TInput, TOutput, TMetadata> = {\n name: options.name ?? \"ai-sdk\",\n run: async (input, context) => {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n return runAiSdkHarness(options, agent, input, context);\n },\n };\n\n return harness;\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext<TMetadata>,\n): Promise<HarnessRun<TOutput>> {\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const runtimeToolCalls: ToolCallRecord[] = [];\n const tools = createToolset({\n input,\n context,\n tools: options.tools,\n toolReplay: options.toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n });\n const runtime = {\n tools,\n signal: context.signal,\n } satisfies AiSdkRuntime<TTools, TInput, TMetadata>;\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 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<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(result) as TOutput | undefined);\n const usage = resolveUsage(result, runtimeToolCalls.length);\n const session = resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n const errors = resolveHarnessRunErrors(result);\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 } as HarnessRun<TOutput>;\n } catch (error) {\n const run = {\n session: resolveSession(\n input,\n undefined,\n undefined,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n ),\n output: undefined,\n usage:\n runtimeToolCalls.length > 0\n ? { toolCalls: runtimeToolCalls.length }\n : {},\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializeError(error)],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n return Boolean(options.output);\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (\n hasAiSdkRunMethod<TInput, TMetadata, TResult, TOutput, TTools>(args.agent)\n ) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (\n hasAiSdkGenerateMethod<TInput, TMetadata, TResult, TOutput, TTools>(\n args.agent,\n )\n ) {\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 TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\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 TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & { agent: AgentSource<TAgent, TInput, TMetadata> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) => MaybePromise<TAgent> {\n return (\n typeof agent === \"function\" &&\n !hasCallableMethod(agent, \"run\") &&\n !hasCallableMethod(agent, \"generate\")\n );\n}\n\nfunction createToolset<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput, TMetadata> | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeToolCalls: ToolCallRecord[];\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 replayContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput, TMetadata>;\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 normalizedResult = toJsonValue(executionResult.result);\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 runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n ...(normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\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 runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n error: normalizeError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\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 TMetadata extends HarnessMetadata,\n TTool extends AiSdkToolDefinition<any, any, TInput, TMetadata>,\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, TMetadata>;\n replay: AiSdkToolReplayPolicy<TInput, TMetadata>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<\n JsonValue,\n JsonValue,\n AiSdkToolContext<TInput, TMetadata>\n >({\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(result: unknown, runtimeToolCallCount = 0): UsageSummary {\n const steps = resolveSteps(result);\n const usage = resolveLanguageModelUsage(result) ?? resolveStepUsage(steps);\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n if (!usage) {\n if (steps.length > 0) {\n const toolCallCount = countStepToolCalls(steps);\n\n return {\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n ...(toolCallCount > 0 ? { toolCalls: toolCallCount } : {}),\n };\n }\n\n return runtimeToolCallCount > 0 ? { toolCalls: runtimeToolCallCount } : {};\n }\n\n const stepToolCallCount = countStepToolCalls(steps);\n const toolCallCount =\n stepToolCallCount > 0 ? stepToolCallCount : runtimeToolCallCount;\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 resolveStepUsage(steps: StepLike[]): LanguageModelUsage | undefined {\n const usages = steps\n .map((step) => step.usage)\n .filter((usage): usage is LanguageModelUsage => Boolean(usage));\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 resolveSession(\n input: unknown,\n result: unknown,\n output: JsonValue | undefined,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n runtimeToolCalls: ToolCallRecord[] = [],\n): NormalizedSession {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return (result as { session: NormalizedSession }).session;\n }\n\n if (\n isNormalizedSession((result as Record<string, unknown> | undefined)?.trace)\n ) {\n return (result as { trace: NormalizedSession }).trace;\n }\n\n const steps = resolveSteps(result);\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const stepToolCallIds = new Set<string>();\n\n for (const step of steps) {\n for (const toolCall of step.toolCalls ?? []) {\n stepToolCallIds.add(toolCall.toolCallId);\n }\n messages.push(...normalizeStep(step, replayMetadataByToolCallId));\n }\n\n const unmatchedRuntimeToolCalls = runtimeToolCalls.filter(\n (call) => call.id === undefined || !stepToolCallIds.has(call.id),\n );\n\n if (unmatchedRuntimeToolCalls.length > 0) {\n messages.push(...normalizeRuntimeToolCalls(unmatchedRuntimeToolCalls));\n }\n\n if (\n output !== undefined &&\n !messages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n messages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n return {\n messages,\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n };\n}\n\nfunction normalizeRuntimeToolCalls(\n runtimeToolCalls: ToolCallRecord[],\n): NormalizedMessage[] {\n const messages: NormalizedMessage[] = [\n {\n role: \"assistant\",\n toolCalls: runtimeToolCalls,\n },\n ];\n\n for (const call of runtimeToolCalls) {\n if (call.result === undefined && !call.error) {\n continue;\n }\n\n const content =\n call.result !== undefined\n ? call.result\n : call.error && call.error.message.length > 0\n ? call.error.message\n : undefined;\n\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: call.name,\n toolCallId: call.id,\n isError: Boolean(call.error),\n }),\n });\n }\n\n return messages;\n}\n\nfunction resolveSteps(result: unknown): StepLike[] {\n if (!result || typeof result !== \"object\") {\n return [];\n }\n\n return Array.isArray((result as AiSdkLikeResult).steps)\n ? ((result as AiSdkLikeResult).steps ?? [])\n : [];\n}\n\nfunction resolveLanguageModelUsage(\n result: unknown,\n): LanguageModelUsage | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const aiResult = result as AiSdkLikeResult;\n return aiResult.totalUsage ?? aiResult.usage;\n}\n\nfunction normalizeStep(\n step: StepLike,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): NormalizedMessage[] {\n const toolResultsById = new Map(\n (step.toolResults ?? []).map((toolResult) => [\n toolResult.toolCallId,\n toolResult,\n ]),\n );\n\n const normalizedCalls = (step.toolCalls ?? []).map((toolCall) =>\n normalizeToolCall(toolCall, toolResultsById, replayMetadataByToolCallId),\n );\n const normalizedCallsById = new Map(\n normalizedCalls.map((toolCall) => [toolCall.id, toolCall]),\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 messages: NormalizedMessage[] = [];\n\n if (step.text || normalizedCalls.length > 0 || assistantMetadata) {\n messages.push({\n role: \"assistant\",\n ...(step.text ? { content: step.text } : {}),\n ...(normalizedCalls.length > 0 ? { toolCalls: normalizedCalls } : {}),\n ...(assistantMetadata ? { metadata: assistantMetadata } : {}),\n });\n }\n\n for (const toolResult of step.toolResults ?? []) {\n const content =\n toolResult.output === undefined\n ? undefined\n : normalizeContent(toolResult.output);\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: toolResult.toolName,\n toolCallId: toolResult.toolCallId,\n isError: Boolean(normalizedCallsById.get(toolResult.toolCallId)?.error),\n preliminary: toolResult.preliminary,\n providerExecuted: toolResult.providerExecuted,\n title: toolResult.title,\n providerMetadata: toolResult.providerMetadata,\n }),\n });\n }\n\n return messages;\n}\n\nfunction normalizeToolCall(\n toolCall: StepLike[\"toolCalls\"][number],\n toolResultsById: Map<string, StepLike[\"toolResults\"][number]>,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): ToolCallRecord {\n const toolResult = toolResultsById.get(toolCall.toolCallId);\n const normalizedArguments = normalizeArguments(toolCall.input);\n const normalizedResult =\n toolResult !== undefined ? toJsonValue(toolResult.output) : undefined;\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 id: toolCall.toolCallId,\n name: toolCall.toolName,\n ...(normalizedArguments ? { arguments: normalizedArguments } : {}),\n ...(toolResult && normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n ...(errorValue ? { error: errorValue } : {}),\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 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","toolCallCount"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n attachHarnessRunToError,\n createFailedHarnessRun,\n createGenAiUsageAttributes,\n createToolCallSpans,\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 toolCalls as collectToolCalls,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSpan,\n NormalizedSession,\n NormalizedTrace,\n TimingSummary,\n ToolCallRecord,\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<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;\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 trace?: 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 TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : TAgent extends {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n }\n ? Awaited<TResult>\n : unknown;\n\n/** Context passed to instrumented AI SDK tool executions. */\nexport interface AiSdkToolContext<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n metadata: HarnessContext<TMetadata>[\"metadata\"];\n signal?: AbortSignal;\n setArtifact: HarnessContext<TMetadata>[\"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 TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput, TMetadata>>;\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 _TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Tool<TArgs, TResult>;\n\n/** Replay policy for one AI SDK tool. */\nexport type AiSdkToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;\n\n/** Replay policy map keyed by AI SDK tool name. */\nexport type AiSdkToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;\n\n/** Toolset shape accepted by the AI SDK harness. */\nexport type AiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyAiSdkToolset<TInput, TMetadata>;\n\n/** Runtime toolset exposed to the system under test. */\nexport type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any, any>> = {\n [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<\n infer TArgs extends JsonValue,\n infer TResult extends JsonValue,\n infer _TInput,\n infer _TMetadata\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, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n tools: AiSdkRuntimeToolset<TTools>;\n signal?: AbortSignal;\n}\n\n/** Arguments passed to per-run AI SDK agent factories. */\nexport interface AiSdkCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\n}\n\n/** Arguments passed to custom AI SDK harness run callbacks. */\nexport interface AiSdkHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> {\n agent: TAgent | undefined;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>;\n tools: AiSdkRuntimeToolset<TTools>;\n}\n\n/** Arguments passed to AI SDK harness output selectors. */\nexport interface AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> extends AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\ntype AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n> = (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype AiSdkHarnessOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> &\n (\n | {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n }\n | {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n agent?: never;\n }\n );\n\ntype AiSdkHarnessOptionsWithOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> & {\n output: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n};\n\ntype AiSdkHarnessRunOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult>;\n agent?: never;\n output?: never;\n};\n\ntype AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n output?: never;\n};\n\ninterface AiSdkHarnessBaseOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;\n output?: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\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 TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TTools\n >,\n): Harness<\n TInput,\n AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TMetadata, TTools>>,\n TMetadata\n>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata> {\n validateOptions(options);\n\n const harnessName = options.name ?? \"ai-sdk\";\n const harness: Harness<TInput, TOutput, TMetadata> = {\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, TMetadata extends HarnessMetadata>(\n input: TInput,\n context: HarnessContext<TMetadata>,\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 TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext<TMetadata>,\n): Promise<HarnessRun<TOutput>> {\n const trace = createTraceRecorder(options.name ?? \"ai-sdk\");\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const runtimeToolCalls: ToolCallRecord[] = [];\n const tools = createToolset({\n input,\n context,\n tools: options.tools,\n toolReplay: options.toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n });\n const runtime = {\n tools,\n signal: context.signal,\n } satisfies AiSdkRuntime<TTools, TInput, TMetadata>;\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<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(result) as TOutput | undefined);\n const usage = resolveUsage(result, runtimeToolCalls.length);\n const session = resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeToolCalls,\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 usage =\n runtimeToolCalls.length > 0 ? { toolCalls: runtimeToolCalls.length } : {};\n const session = resolveSession(\n input,\n undefined,\n undefined,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\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 TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n return Boolean(options.output);\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (\n hasAiSdkRunMethod<TInput, TMetadata, TResult, TOutput, TTools>(args.agent)\n ) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (\n hasAiSdkGenerateMethod<TInput, TMetadata, TResult, TOutput, TTools>(\n args.agent,\n )\n ) {\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 TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\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 TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & { agent: AgentSource<TAgent, TInput, TMetadata> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) => 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 toolSpans = createToolCallSpans(collectToolCalls(options.session), {\n traceId: trace.id,\n parentId: trace.rootSpanId,\n spanIdPrefix: `${trace.id}:tool`,\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, ...toolSpans];\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 = resolveSteps(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<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput, TMetadata> | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeToolCalls: ToolCallRecord[];\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 replayContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput, TMetadata>;\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 normalizedResult = toJsonValue(executionResult.result);\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 runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n ...(normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\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 runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n error: normalizeError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\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 TMetadata extends HarnessMetadata,\n TTool extends AiSdkToolDefinition<any, any, TInput, TMetadata>,\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, TMetadata>;\n replay: AiSdkToolReplayPolicy<TInput, TMetadata>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<\n JsonValue,\n JsonValue,\n AiSdkToolContext<TInput, TMetadata>\n >({\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(result: unknown, runtimeToolCallCount = 0): UsageSummary {\n const steps = resolveSteps(result);\n const usage = resolveLanguageModelUsage(result) ?? resolveStepUsage(steps);\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n if (!usage) {\n if (steps.length > 0) {\n const toolCallCount = countStepToolCalls(steps);\n\n return {\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n ...(toolCallCount > 0 ? { toolCalls: toolCallCount } : {}),\n };\n }\n\n return runtimeToolCallCount > 0 ? { toolCalls: runtimeToolCallCount } : {};\n }\n\n const stepToolCallCount = countStepToolCalls(steps);\n const toolCallCount =\n stepToolCallCount > 0 ? stepToolCallCount : runtimeToolCallCount;\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 resolveStepUsage(steps: StepLike[]): LanguageModelUsage | undefined {\n const usages = steps\n .map((step) => step.usage)\n .filter((usage): usage is LanguageModelUsage => Boolean(usage));\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 resolveSession(\n input: unknown,\n result: unknown,\n output: JsonValue | undefined,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n runtimeToolCalls: ToolCallRecord[] = [],\n): NormalizedSession {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return (result as { session: NormalizedSession }).session;\n }\n\n if (\n isNormalizedSession((result as Record<string, unknown> | undefined)?.trace)\n ) {\n return (result as { trace: NormalizedSession }).trace;\n }\n\n const steps = resolveSteps(result);\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const stepToolCallIds = new Set<string>();\n\n for (const step of steps) {\n for (const toolCall of step.toolCalls ?? []) {\n stepToolCallIds.add(toolCall.toolCallId);\n }\n messages.push(...normalizeStep(step, replayMetadataByToolCallId));\n }\n\n const unmatchedRuntimeToolCalls = runtimeToolCalls.filter(\n (call) => call.id === undefined || !stepToolCallIds.has(call.id),\n );\n\n if (unmatchedRuntimeToolCalls.length > 0) {\n messages.push(...normalizeRuntimeToolCalls(unmatchedRuntimeToolCalls));\n }\n\n if (\n output !== undefined &&\n !messages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n messages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n return {\n messages,\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n };\n}\n\nfunction normalizeRuntimeToolCalls(\n runtimeToolCalls: ToolCallRecord[],\n): NormalizedMessage[] {\n const messages: NormalizedMessage[] = [\n {\n role: \"assistant\",\n toolCalls: runtimeToolCalls,\n },\n ];\n\n for (const call of runtimeToolCalls) {\n if (call.result === undefined && !call.error) {\n continue;\n }\n\n const content =\n call.result !== undefined\n ? call.result\n : call.error && call.error.message.length > 0\n ? call.error.message\n : undefined;\n\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: call.name,\n toolCallId: call.id,\n isError: Boolean(call.error),\n }),\n });\n }\n\n return messages;\n}\n\nfunction resolveSteps(result: unknown): StepLike[] {\n if (!result || typeof result !== \"object\") {\n return [];\n }\n\n return Array.isArray((result as AiSdkLikeResult).steps)\n ? ((result as AiSdkLikeResult).steps ?? [])\n : [];\n}\n\nfunction resolveLanguageModelUsage(\n result: unknown,\n): LanguageModelUsage | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const aiResult = result as AiSdkLikeResult;\n return aiResult.totalUsage ?? aiResult.usage;\n}\n\nfunction normalizeStep(\n step: StepLike,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): NormalizedMessage[] {\n const toolResultsById = new Map(\n (step.toolResults ?? []).map((toolResult) => [\n toolResult.toolCallId,\n toolResult,\n ]),\n );\n\n const normalizedCalls = (step.toolCalls ?? []).map((toolCall) =>\n normalizeToolCall(toolCall, toolResultsById, replayMetadataByToolCallId),\n );\n const normalizedCallsById = new Map(\n normalizedCalls.map((toolCall) => [toolCall.id, toolCall]),\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 messages: NormalizedMessage[] = [];\n\n if (step.text || normalizedCalls.length > 0 || assistantMetadata) {\n messages.push({\n role: \"assistant\",\n ...(step.text ? { content: step.text } : {}),\n ...(normalizedCalls.length > 0 ? { toolCalls: normalizedCalls } : {}),\n ...(assistantMetadata ? { metadata: assistantMetadata } : {}),\n });\n }\n\n for (const toolResult of step.toolResults ?? []) {\n const content =\n toolResult.output === undefined\n ? undefined\n : normalizeContent(toolResult.output);\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: toolResult.toolName,\n toolCallId: toolResult.toolCallId,\n isError: Boolean(normalizedCallsById.get(toolResult.toolCallId)?.error),\n preliminary: toolResult.preliminary,\n providerExecuted: toolResult.providerExecuted,\n title: toolResult.title,\n providerMetadata: toolResult.providerMetadata,\n }),\n });\n }\n\n return messages;\n}\n\nfunction normalizeToolCall(\n toolCall: StepLike[\"toolCalls\"][number],\n toolResultsById: Map<string, StepLike[\"toolResults\"][number]>,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): ToolCallRecord {\n const toolResult = toolResultsById.get(toolCall.toolCallId);\n const normalizedArguments = normalizeArguments(toolCall.input);\n const normalizedResult =\n toolResult !== undefined ? toJsonValue(toolResult.output) : undefined;\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 id: toolCall.toolCallId,\n name: toolCall.toolName,\n ...(normalizedArguments ? { arguments: normalizedArguments } : {}),\n ...(toolResult && normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n ...(errorValue ? { error: errorValue } : {}),\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 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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAmBO;AAeP,gBAAyD;AACzD,oBAGO;AACP,oBAIO;AA8CP,IAAI,cAAc;AAkDX,SAAS,kBAAkB,QAAiC;AACjE,aAAO,kCAAmB;AAAA,IACxB,MAAM,OAAO,QAAQ;AAAA,IACrB,KAAK,CAAC,OAAO,YAAY,qBAAqB,QAAQ,OAAO,OAAO;AAAA,EACtE,CAAC;AACH;AAEA,eAAe,qBACb,QACA,OACA,SACA;AACA,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACA,QAAM,iBAAiB;AAAA,IACrB,OAAO,OAAO;AAAA,IACd,QAAQ,MAAM;AAAA,IACd,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,IACzC,GAAI,OAAO,gBAAgB,SACvB,EAAE,aAAa,OAAO,YAAY,IAClC,CAAC;AAAA,IACL,GAAI,OAAO,oBAAoB,SAC3B,EAAE,iBAAiB,OAAO,gBAAgB,IAC1C,CAAC;AAAA,IACL,GAAI,OAAO,oBAAoB,SAC3B,EAAE,iBAAiB,OAAO,gBAAgB,IAC1C,CAAC;AAAA,IACL,GAAI,QAAQ,SAAS,EAAE,aAAa,QAAQ,OAAO,IAAI,CAAC;AAAA,EAC1D;AAEA,MACE,MAAM,gBAAgB,SAAS,UAC/B,MAAM,eAAe,WAAW,QAChC;AACA,UAAM,EAAE,OAAO,IAAI,UAAM,0BAAe;AAAA,MACtC,GAAG;AAAA,MACH,YAAQ;AAAA,QACN,MAAM,eAAe;AAAA,MACvB;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,KAAK,IAAI,UAAM,wBAAa,cAAc;AAClD,SAAO;AACT;AAEA,SAAS,6BACP,QACA,gBACA;AACA,MAAI,gBAAgB,SAAS,UAAU,eAAe,WAAW,QAAW;AAC1E,WAAO;AAAA,EACT;AAEA,QAAM,kBACJ;AAEF,SAAO,SAAS,GAAG,MAAM;AAAA;AAAA,EAAO,eAAe,KAAK;AACtD;AAqYO,SAAS,aAWd,SAQqC;AACrC,kBAAgB,OAAO;AAEvB,QAAM,cAAc,QAAQ,QAAQ;AACpC,QAAM,UAA+C;AAAA,IACnD,MAAM;AAAA,IACN,KAAK,OAAO,OAAO,YAAY;AAC7B,YAAM,YAAY,oBAAI,KAAK;AAE3B,UAAI;AACF,cAAM,QAAQ,MAAM,aAAa,SAAS;AAAA,UACxC;AAAA,UACA;AAAA,QACF,CAAC;AACD,eAAO,MAAM,gBAAgB,SAAS,OAAO,OAAO,OAAO;AAAA,MAC7D,SAAS,OAAO;AACd,gBAAI,uCAAuB,KAAK,GAAG;AACjC,gBAAM;AAAA,QACR;AAEA,kBAAM;AAAA,UACJ;AAAA,UACA,qBAAqB,OAAO,SAAS,OAAO,aAAa,SAAS;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBACP,OACA,SACA,OACA,aACA,WACA;AACA,QAAM,UAAM,uCAAuB,OAAO,OAAO;AAAA,IAC/C,WAAW,QAAQ;AAAA,EACrB,CAAC;AACD,qCAAe,KAAK;AAAA,IAClB,MAAM;AAAA,IACN;AAAA,IACA,YAAY,oBAAI,KAAK;AAAA,IACrB,eAAe;AAAA,IACf,QAAQ;AAAA,EACV,CAAC;AAED,SAAO;AACT;AAEA,eAAe,gBAQb,SAQA,OACA,OACA,SAC8B;AAC9B,QAAM,QAAQ,oBAAoB,QAAQ,QAAQ,QAAQ;AAC1D,QAAM,6BAA6B,oBAAI,IAA4B;AACnE,QAAM,mBAAqC,CAAC;AAC5C,QAAM,QAAQ,cAAc;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,OAAO,QAAQ;AAAA,IACf,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,UAAU;AAAA,IACd;AAAA,IACA,QAAQ,QAAQ;AAAA,EAClB;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,SAAS,SAAS;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,YAAI,6BAAa,MAAM,KAAK,CAAC,kBAAkB,OAAO,GAAG;AACvD,UAAI,OAAO,KAAK,QAAQ,SAAS,EAAE,SAAS,KAAK,CAAC,OAAO,WAAW;AAClE,eAAO,YAAY,QAAQ;AAAA,MAC7B;AACA,uBAAiB,QAAQ,OAAO,QAAQ,oBAAI,KAAK,CAAC;AAClD,aAAO;AAAA,IACT;AAEA,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAQA,UAAM,SAAS,QAAQ,SACnB,MAAM,QAAQ,OAAO,UAAU,IAC9B,cAAc,MAAM;AACzB,UAAM,QAAQ,aAAa,QAAQ,iBAAiB,MAAM;AAC1D,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,aAAS,wCAAwB,MAAM;AAC7C,UAAM,aAAa,oBAAI,KAAK;AAE5B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,WACE,OAAO,KAAK,QAAQ,SAAS,EAAE,SAAS,IACpC,QAAQ,YACR;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACN,iBAAiB,OAAO;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,aAAa,oBAAI,KAAK;AAC5B,UAAM,sBAAkB,+BAAe,KAAK;AAC5C,UAAM,QACJ,iBAAiB,SAAS,IAAI,EAAE,WAAW,iBAAiB,OAAO,IAAI,CAAC;AAC1E,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,MAAM;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,WACE,OAAO,KAAK,QAAQ,SAAS,EAAE,SAAS,IACpC,QAAQ,YACR;AAAA,MACN,QAAQ,CAAC,eAAe;AAAA,MACxB,QAAQ;AAAA,QACN,iBAAiB,OAAO;AAAA,UACtB;AAAA,UACA;AAAA,UACA,QAAQ,CAAC,eAAe;AAAA,UACxB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,cAAM,wCAAwB,OAAO,GAAG;AAAA,EAC1C;AACF;AAEA,SAAS,kBAQP,SAQA;AACA,SAAO,QAAQ,QAAQ,MAAM;AAC/B;AAEA,eAAe,aAQb,SAQA,MACA;AACA,SAAO,eAAe,OAAO,IACzB,MAAM,mBAAmB,QAAQ,OAAO,IAAI,IAC5C;AACN;AAEA,eAAe,SAQb,SAQA,MACwC;AACxC,MAAI,QAAQ,KAAK;AACf,WAAO,QAAQ,IAAI,IAAI;AAAA,EACzB;AAEA,MACE,kBAA+D,KAAK,KAAK,GACzE;AACA,WAAO,KAAK,MAAM,IAAI,KAAK,OAAO,KAAK,OAAO;AAAA,EAChD;AAEA,MACE;AAAA,IACE,KAAK;AAAA,EACP,GACA;AACA,WAAO,KAAK,MAAM,SAAS,KAAK,OAAO,KAAK,OAAO;AAAA,EACrD;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,gBAQP,SAQA;AACA,QAAM,WAAW,eAAe,OAAO;AACvC,QAAM,SAAS,OAAQ,QAA8B,QAAQ;AAC7D,QAAM,cAAc,CAAC,UAAU,MAAM,EAAE,OAAO,OAAO,EAAE;AAEvD,MAAI,cAAc,GAAG;AACnB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,GAAG;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAQP,SAeoD;AACpD,SAAO,WAAW,WAAW,QAAQ,UAAU;AACjD;AAEA,eAAe,mBAKb,OACA,MACiB;AACjB,MAAI,eAAe,KAAK,GAAG;AACzB,WAAO,MAAM,IAAI;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,SAAS,kBAOP,OAC0E;AAC1E,aAAO,kCAAkB,OAAO,KAAK;AACvC;AAEA,SAAS,uBAOP,OAC6E;AAC7E,aAAO,kCAAkB,OAAO,UAAU;AAC5C;AAEA,SAAS,eACP,OAGwB;AACxB,SACE,OAAO,UAAU,cACjB,KAAC,kCAAkB,OAAO,KAAK,KAC/B,KAAC,kCAAkB,OAAO,UAAU;AAExC;AASA,SAAS,oBAAoB,MAA6B;AACxD,QAAM,KAAK,gBAAgB,EAAE,WAAW;AAExC,SAAO;AAAA,IACL;AAAA,IACA,YAAY,GAAG,EAAE;AAAA,IACjB;AAAA,IACA,WAAW,oBAAI,KAAK;AAAA,EACtB;AACF;AAEA,SAAS,iBACP,KACA,OACA,QACA,YACA;AACA,QAAM,SAAS,IAAI,UAAU,CAAC;AAC9B,QAAM,cAAc,iBAAiB,OAAO;AAAA,IAC1C;AAAA,IACA,SAAS,IAAI;AAAA,IACb,OAAO,IAAI;AAAA,IACX;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,SAAS,CAAC,GAAI,IAAI,UAAU,CAAC,GAAI,WAAW;AAClD;AAEA,SAAS,iBACP,OACA,SAOiB;AACjB,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,QAAM,gBAAY,wCAAoB,eAAAA,WAAiB,QAAQ,OAAO,GAAG;AAAA,IACvE,SAAS,MAAM;AAAA,IACf,UAAU,MAAM;AAAA,IAChB,cAAc,GAAG,MAAM,EAAE;AAAA,EAC3B,CAAC;AACD,QAAM,aAAa,QAAQ;AAC3B,QAAM,aAAa,WAAW,QAAQ,IAAI,MAAM,UAAU,QAAQ;AAClE,QAAM,YAAY,QAAQ,SAAS,CAAC,QAChC,mCAAmB,QAAQ,OAAO,CAAC,CAAC,IACpC;AACJ,QAAM,WAA2B;AAAA,IAC/B,IAAI,MAAM;AAAA,IACV,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,IACZ,MAAM;AAAA,IACN,WAAW,MAAM,UAAU,YAAY;AAAA,IACvC,YAAY,WAAW,YAAY;AAAA,IACnC;AAAA,IACA,QAAQ,YAAY,UAAU;AAAA,IAC9B,GAAI,YAAY,EAAE,OAAO,UAAU,IAAI,CAAC;AAAA,IACxC,gBAAY,wCAAwB;AAAA,MAClC,yBAAyB;AAAA,MACzB,wBAAwB,MAAM;AAAA,MAC9B,OAAG,2CAA2B,QAAQ,KAAK;AAAA,IAC7C,CAAC;AAAA,EACH;AACA,QAAM,QAAQ,CAAC,UAAU,GAAG,YAAY,GAAG,SAAS;AAEpD,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM,UAAU,YAAY;AAAA,IACvC,YAAY,WAAW,YAAY;AAAA,IACnC;AAAA,IACA,UAAU;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,sBACP,OACA,QACA,OACkB;AAClB,QAAM,QAAQ,aAAa,MAAM;AACjC,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,WAAW,qBAAqB,OAAO,KAAK;AAClD,WAAO,WAAW,CAAC,QAAQ,IAAI,CAAC;AAAA,EAClC;AAEA,SAAO,MAAM,IAAI,CAAC,MAAM,UAAU;AAChC,UAAM,YAAY,KAAK;AAEvB,WAAO;AAAA,MACL,IAAI,GAAG,MAAM,EAAE,UAAU,QAAQ,CAAC;AAAA,MAClC,SAAS,MAAM;AAAA,MACf,UAAU,MAAM;AAAA,MAChB,MAAM,eAAe,KAAK,cAAc,KAAK;AAAA,MAC7C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,gBAAY,wCAAwB;AAAA,QAClC,yBAAyB;AAAA,QACzB,wBAAwB,KAAK,OAAO;AAAA,QACpC,wBAAwB,KAAK,OAAO;AAAA,QACpC,yBAAyB,KAAK,OAAO;AAAA,QACrC,kCAAkC,KAAK,eACnC,CAAC,OAAO,KAAK,YAAY,CAAC,IAC1B;AAAA,QACJ,6BAA6B,WAAW;AAAA,QACxC,8BAA8B,WAAW;AAAA,QACzC,wCACE,WAAW,oBAAoB,mBAC/B,WAAW;AAAA,QACb,wCACE,WAAW,mBAAmB,mBAC9B,WAAW;AAAA,QACb,4CACE,WAAW,mBAAmB;AAAA,QAChC,kBAAkB,KAAK;AAAA,QACvB,oBAAoB,KAAK;AAAA,QACzB,wBAAwB,KAAK;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qBACP,OACA,OAC4B;AAC5B,MAAI,CAAC,OAAO,YAAY,CAAC,OAAO,OAAO;AACrC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,IAAI,GAAG,MAAM,EAAE;AAAA,IACf,SAAS,MAAM;AAAA,IACf,UAAU,MAAM;AAAA,IAChB,MAAM,MAAM,QAAQ,UAAU,MAAM,KAAK,KAAK;AAAA,IAC9C,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,gBAAY,wCAAwB;AAAA,MAClC,yBAAyB;AAAA,MACzB,OAAG,2CAA2B,KAAK;AAAA,IACrC,CAAC;AAAA,EACH;AACF;AAEA,SAAS,cAIP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,IAAI,MAAM;AACpD,YAAM,SAAS,aAAa,QAAQ;AAEpC,UAAI,UAAU,CAAC,KAAK,SAAS;AAC3B,cAAM,IAAI;AAAA,UACR,sCAAsC,QAAQ;AAAA,QAChD;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,SAAS;AACjB,eAAO,CAAC,UAAU,IAAI;AAAA,MACxB;AAEA,YAAM,UAAU,KAAK;AACrB,YAAM,cAAc;AAAA,QAClB,GAAG;AAAA,QACH,SAAS,OACP,WACA,cACG;AACH,gBAAM,YAAY,oBAAI,KAAK;AAC3B,gBAAM,iBAAiB,mBAAmB,SAAS;AACnD,gBAAM,gBAAgB;AAAA,YACpB;AAAA,YACA,UAAU,QAAQ;AAAA,YAClB,QAAQ,QAAQ;AAAA,YAChB,aAAa,QAAQ;AAAA,YACrB;AAAA,UACF;AAEA,cAAI;AACF,kBAAM,kBAAkB,SACpB,MAAM,sBAAsB;AAAA,cAC1B;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,SAAS;AAAA,cACT;AAAA,YACF,CAAC,IACD;AAAA,cACE,QAAQ,MAAM,QAAQ,WAAW,SAAS;AAAA,cAC1C,QAAQ;AAAA,YACV;AACJ,kBAAM,aAAa,oBAAI,KAAK;AAC5B,kBAAM,uBAAmB,4BAAY,gBAAgB,MAAM;AAC3D,kBAAM,qBAAiB;AAAA,cACrB,gBAAgB;AAAA,YAClB;AAEA,gBAAI,gBAAgB,QAAQ;AAC1B,yCAA2B;AAAA,gBACzB,UAAU;AAAA,gBACV,gBAAgB;AAAA,cAClB;AAAA,YACF;AAEA,6BAAiB,KAAK;AAAA,cACpB,IAAI,UAAU;AAAA,cACd,MAAM;AAAA,cACN,GAAI,iBAAiB,EAAE,WAAW,eAAe,IAAI,CAAC;AAAA,cACtD,GAAI,qBAAqB,SACrB,EAAE,QAAQ,iBAAiB,IAC3B,CAAC;AAAA,cACL,WAAW,UAAU,YAAY;AAAA,cACjC,YAAY,WAAW,YAAY;AAAA,cACnC,YAAY,WAAW,QAAQ,IAAI,UAAU,QAAQ;AAAA,cACrD,GAAI,iBAAiB,EAAE,UAAU,eAAe,IAAI,CAAC;AAAA,YACvD,CAAC;AAED,mBAAO,gBAAgB;AAAA,UACzB,SAAS,OAAO;AACd,kBAAMC,cAAS,0CAA2B,KAAK;AAC/C,kBAAM,aAAa,oBAAI,KAAK;AAC5B,kBAAM,qBAAiB,uCAAwBA,OAAM;AAErD,gBAAIA,SAAQ;AACV,yCAA2B,IAAI,UAAU,YAAYA,OAAM;AAAA,YAC7D;AAEA,6BAAiB,KAAK;AAAA,cACpB,IAAI,UAAU;AAAA,cACd,MAAM;AAAA,cACN,GAAI,iBAAiB,EAAE,WAAW,eAAe,IAAI,CAAC;AAAA,cACtD,OAAO,eAAe,KAAK;AAAA,cAC3B,WAAW,UAAU,YAAY;AAAA,cACjC,YAAY,WAAW,YAAY;AAAA,cACnC,YAAY,WAAW,QAAQ,IAAI,UAAU,QAAQ;AAAA,cACrD,GAAI,iBAAiB,EAAE,UAAU,eAAe,IAAI,CAAC;AAAA,YACvD,CAAC;AACD,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,aAAO,CAAC,UAAU,WAAW;AAAA,IAC/B,CAAC;AAAA,EACH;AACF;AAEA,eAAe,sBAIb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,cAAc,kBAAkB,WAAW,GAAG,QAAQ,aAAa;AAEzE,aAAO,iCAIL;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,SAAS,OAAO,kBAAkB;AAChC,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AAEA,UAAI,gBAAgB,MAAM,GAAG;AAC3B,cAAM,IAAI;AAAA,UACR,wDAAwD,QAAQ;AAAA,QAClE;AAAA,MACF;AAEA,aAAO,kBAAkB,QAAQ,GAAG,QAAQ,cAAc;AAAA,IAC5D;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cAAc,QAAwC;AAC7D,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAAC,UAAU,UAAU,MAAM;AAC9C,QAAM,eAAe;AAErB,aAAW,OAAO,YAAY;AAC5B,QAAI,OAAO,UAAU,eAAe,KAAK,cAAc,GAAG,GAAG;AAC3D,aAAO,cAAc,aAAa,GAAG,CAAC;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,cAAc,OAAuC;AAC5D,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAAA,EAC1C;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,QAAqB,CAAC;AAC5B,eAAW,QAAQ,OAAO;AACxB,YAAM,aAAa,cAAc,IAAI;AACrC,UAAI,eAAe,QAAW;AAC5B,eAAO;AAAA,MACT;AACA,YAAM,KAAK,UAAU;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,QAAI,cAAc,OAAO,aAAa,cAAc,MAAM;AACxD,aAAO;AAAA,IACT;AAEA,UAAM,SAAoC,CAAC;AAC3C,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,YAAM,aAAa,cAAc,KAAK;AACtC,UAAI,eAAe,QAAW;AAC5B,eAAO;AAAA,MACT;AACA,aAAO,GAAG,IAAI;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,QAAiB,uBAAuB,GAAiB;AAC7E,QAAM,QAAQ,aAAa,MAAM;AACjC,QAAM,QAAQ,0BAA0B,MAAM,KAAK,iBAAiB,KAAK;AACzE,QAAM,WAAW,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,IAAI;AAE9D,MAAI,CAAC,OAAO;AACV,QAAI,MAAM,SAAS,GAAG;AACpB,YAAMC,iBAAgB,mBAAmB,KAAK;AAE9C,aAAO;AAAA,QACL,UAAU,UAAU,MAAM;AAAA,QAC1B,OAAO,UAAU,MAAM;AAAA,QACvB,GAAIA,iBAAgB,IAAI,EAAE,WAAWA,eAAc,IAAI,CAAC;AAAA,MAC1D;AAAA,IACF;AAEA,WAAO,uBAAuB,IAAI,EAAE,WAAW,qBAAqB,IAAI,CAAC;AAAA,EAC3E;AAEA,QAAM,oBAAoB,mBAAmB,KAAK;AAClD,QAAM,gBACJ,oBAAoB,IAAI,oBAAoB;AAE9C,SAAO;AAAA,IACL,UAAU,UAAU,MAAM;AAAA,IAC1B,OAAO,UAAU,MAAM;AAAA,IACvB,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,iBACE,MAAM,oBAAoB,mBAAmB,MAAM;AAAA,IACrD,aACE,MAAM,gBAAgB,MAAM,eAAe,MAAM,MAAM,gBAAgB;AAAA,IACzE,WAAW,gBAAgB,IAAI,gBAAgB;AAAA,IAC/C,cAAU,kCAAkB;AAAA,MAC1B,iBACE,MAAM,mBAAmB,mBAAmB,MAAM;AAAA,MACpD,kBAAkB,MAAM,mBAAmB;AAAA,MAC3C,KAAK,MAAM;AAAA,IACb,CAAC;AAAA,EACH;AACF;AAEA,SAAS,iBAAiB,OAAmD;AAC3E,QAAM,SAAS,MACZ,IAAI,CAAC,SAAS,KAAK,KAAK,EACxB,OAAO,CAAC,UAAuC,QAAQ,KAAK,CAAC;AAEhE,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,OAAO,qBAAqB;AAC5C;AAEA,SAAS,sBACP,MACA,OACoB;AACpB,SAAO;AAAA,IACL,aAAa,eAAe,KAAK,aAAa,MAAM,WAAW;AAAA,IAC/D,mBAAmB;AAAA,MACjB,eAAe;AAAA,QACb,KAAK,mBAAmB;AAAA,QACxB,MAAM,mBAAmB;AAAA,MAC3B;AAAA,MACA,iBAAiB;AAAA,QACf,KAAK,mBAAmB;AAAA,QACxB,MAAM,mBAAmB;AAAA,MAC3B;AAAA,MACA,kBAAkB;AAAA,QAChB,KAAK,mBAAmB;AAAA,QACxB,MAAM,mBAAmB;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,cAAc,eAAe,KAAK,cAAc,MAAM,YAAY;AAAA,IAClE,oBAAoB;AAAA,MAClB,YAAY;AAAA,QACV,KAAK,oBAAoB;AAAA,QACzB,MAAM,oBAAoB;AAAA,MAC5B;AAAA,MACA,iBAAiB;AAAA,QACf,KAAK,oBAAoB;AAAA,QACzB,MAAM,oBAAoB;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,aAAa,eAAe,KAAK,aAAa,MAAM,WAAW;AAAA,IAC/D,iBAAiB;AAAA,MACf,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,IACA,mBAAmB;AAAA,MACjB,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,eAAe,MAA0B,OAA2B;AAC3E,SAAO,QAAQ,QAAQ,SAAS,OAAO,UAAa,QAAQ,MAAM,SAAS;AAC7E;AAEA,SAAS,mBAAmB,OAAmB;AAC7C,SAAO,MAAM;AAAA,IACX,CAAC,OAAO,SAAS,SAAS,KAAK,WAAW,UAAU;AAAA,IACpD;AAAA,EACF;AACF;AAEA,SAAS,eACP,OACA,QACA,QACA,4BACA,mBAAqC,CAAC,GACnB;AACnB,UACE;AAAA,IACG,QAAgD;AAAA,EACnD,GACA;AACA,WAAQ,OAA0C;AAAA,EACpD;AAEA,UACE,oCAAqB,QAAgD,KAAK,GAC1E;AACA,WAAQ,OAAwC;AAAA,EAClD;AAEA,QAAM,QAAQ,aAAa,MAAM;AACjC,QAAM,WAAgC;AAAA,IACpC;AAAA,MACE,MAAM;AAAA,MACN,aAAS,iCAAiB,KAAK;AAAA,IACjC;AAAA,EACF;AACA,QAAM,kBAAkB,oBAAI,IAAY;AAExC,aAAW,QAAQ,OAAO;AACxB,eAAW,YAAY,KAAK,aAAa,CAAC,GAAG;AAC3C,sBAAgB,IAAI,SAAS,UAAU;AAAA,IACzC;AACA,aAAS,KAAK,GAAG,cAAc,MAAM,0BAA0B,CAAC;AAAA,EAClE;AAEA,QAAM,4BAA4B,iBAAiB;AAAA,IACjD,CAAC,SAAS,KAAK,OAAO,UAAa,CAAC,gBAAgB,IAAI,KAAK,EAAE;AAAA,EACjE;AAEA,MAAI,0BAA0B,SAAS,GAAG;AACxC,aAAS,KAAK,GAAG,0BAA0B,yBAAyB,CAAC;AAAA,EACvE;AAEA,MACE,WAAW,UACX,CAAC,SAAS;AAAA,IACR,CAAC,YACC,QAAQ,SAAS,eAAe,QAAQ,YAAY;AAAA,EACxD,GACA;AACA,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,IAAI;AAE9D,SAAO;AAAA,IACL;AAAA,IACA,UAAU,UAAU,MAAM;AAAA,IAC1B,OAAO,UAAU,MAAM;AAAA,EACzB;AACF;AAEA,SAAS,0BACP,kBACqB;AACrB,QAAM,WAAgC;AAAA,IACpC;AAAA,MACE,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,EACF;AAEA,aAAW,QAAQ,kBAAkB;AACnC,QAAI,KAAK,WAAW,UAAa,CAAC,KAAK,OAAO;AAC5C;AAAA,IACF;AAEA,UAAM,UACJ,KAAK,WAAW,SACZ,KAAK,SACL,KAAK,SAAS,KAAK,MAAM,QAAQ,SAAS,IACxC,KAAK,MAAM,UACX;AAER,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC3C,cAAU,kCAAkB;AAAA,QAC1B,MAAM,KAAK;AAAA,QACX,YAAY,KAAK;AAAA,QACjB,SAAS,QAAQ,KAAK,KAAK;AAAA,MAC7B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,QAA6B;AACjD,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,MAAM,QAAS,OAA2B,KAAK,IAChD,OAA2B,SAAS,CAAC,IACvC,CAAC;AACP;AAEA,SAAS,0BACP,QACgC;AAChC,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,WAAW;AACjB,SAAO,SAAS,cAAc,SAAS;AACzC;AAEA,SAAS,cACP,MACA,4BACqB;AACrB,QAAM,kBAAkB,IAAI;AAAA,KACzB,KAAK,eAAe,CAAC,GAAG,IAAI,CAAC,eAAe;AAAA,MAC3C,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,KAAK,aAAa,CAAC,GAAG;AAAA,IAAI,CAAC,aAClD,kBAAkB,UAAU,iBAAiB,0BAA0B;AAAA,EACzE;AACA,QAAM,sBAAsB,IAAI;AAAA,IAC9B,gBAAgB,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,QAAQ,CAAC;AAAA,EAC3D;AACA,QAAM,wBAAoB,kCAAkB;AAAA,IAC1C,YAAY,KAAK;AAAA,IACjB,cAAc,KAAK;AAAA,IACnB,iBAAiB,KAAK;AAAA,IACtB,eAAe,KAAK;AAAA,IACpB,UAAU,KAAK;AAAA,EACjB,CAAC;AACD,QAAM,WAAgC,CAAC;AAEvC,MAAI,KAAK,QAAQ,gBAAgB,SAAS,KAAK,mBAAmB;AAChE,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,GAAI,KAAK,OAAO,EAAE,SAAS,KAAK,KAAK,IAAI,CAAC;AAAA,MAC1C,GAAI,gBAAgB,SAAS,IAAI,EAAE,WAAW,gBAAgB,IAAI,CAAC;AAAA,MACnE,GAAI,oBAAoB,EAAE,UAAU,kBAAkB,IAAI,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH;AAEA,aAAW,cAAc,KAAK,eAAe,CAAC,GAAG;AAC/C,UAAM,UACJ,WAAW,WAAW,SAClB,aACA,iCAAiB,WAAW,MAAM;AACxC,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC3C,cAAU,kCAAkB;AAAA,QAC1B,MAAM,WAAW;AAAA,QACjB,YAAY,WAAW;AAAA,QACvB,SAAS,QAAQ,oBAAoB,IAAI,WAAW,UAAU,GAAG,KAAK;AAAA,QACtE,aAAa,WAAW;AAAA,QACxB,kBAAkB,WAAW;AAAA,QAC7B,OAAO,WAAW;AAAA,QAClB,kBAAkB,WAAW;AAAA,MAC/B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,kBACP,UACA,iBACA,4BACgB;AAChB,QAAM,aAAa,gBAAgB,IAAI,SAAS,UAAU;AAC1D,QAAM,sBAAsB,mBAAmB,SAAS,KAAK;AAC7D,QAAM,mBACJ,eAAe,aAAY,4BAAY,WAAW,MAAM,IAAI;AAC9D,QAAM,aACJ,SAAS,WAAW,SAAS,UAAU,SACnC,eAAe,SAAS,SAAS,SAAS,OAAO,IACjD;AACN,QAAM,qBAAiB;AAAA,IACrB,2BAA2B,IAAI,SAAS,UAAU;AAAA,EACpD;AAEA,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,MAAM,SAAS;AAAA,IACf,GAAI,sBAAsB,EAAE,WAAW,oBAAoB,IAAI,CAAC;AAAA,IAChE,GAAI,cAAc,qBAAqB,SACnC,EAAE,QAAQ,iBAAiB,IAC3B,CAAC;AAAA,IACL,GAAI,aAAa,EAAE,OAAO,WAAW,IAAI,CAAC;AAAA,IAC1C,cAAU,kCAAkB;AAAA,MAC1B,kBACE,SAAS,oBAAoB,YAAY;AAAA,MAC3C,OAAO,SAAS,SAAS,YAAY;AAAA,MACrC,SAAS,SAAS;AAAA,MAClB,SAAS,SAAS;AAAA,MAClB,aAAa,YAAY;AAAA,MACzB,kBACE,SAAS,oBAAoB,YAAY;AAAA,MAC3C,GAAI,kBAAkB,CAAC;AAAA,IACzB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,mBACP,OACuC;AACvC,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,aAAO,gCAAgB,KAAgC;AACzD;AAEA,SAAS,eAAe,OAAgB;AACtC,MAAI,iBAAiB,OAAO;AAC1B,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,iBAAa,4BAAY,KAAK;AACpC,MACE,cACA,OAAO,eAAe,YACtB,CAAC,MAAM,QAAQ,UAAU,KACzB,OAAO,WAAW,YAAY,UAC9B;AACA,WAAO;AAAA,MACL,SAAS,WAAW;AAAA,MACpB,MAAM,OAAO,WAAW,SAAS,WAAW,WAAW,OAAO;AAAA,IAChE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,OAAO,SAAS,yBAAyB;AAAA,EACpD;AACF;AAEA,SAAS,kBAAkB,OAAgB,OAA0B;AACnE,QAAM,iBAAa,4BAAY,KAAK;AACpC,MAAI,eAAe,QAAW;AAC5B,UAAM,IAAI;AAAA,MACR,uDAAuD,KAAK;AAAA,IAC9D;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAiD;AACxE,SACE,UAAU,SACT,OAAO,UAAU,YAAY,OAAO,UAAU,eAC/C,OAAO,iBAAiB;AAE5B;","names":["collectToolCalls","replay","toolCallCount"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import {
|
|
3
3
|
attachHarnessRunToError,
|
|
4
|
+
createFailedHarnessRun,
|
|
5
|
+
createGenAiUsageAttributes,
|
|
6
|
+
createToolCallSpans,
|
|
7
|
+
ensureRunTrace,
|
|
8
|
+
getHarnessRunFromError,
|
|
4
9
|
hasCallableMethod,
|
|
5
10
|
isHarnessRun,
|
|
6
11
|
isNormalizedSession,
|
|
@@ -9,7 +14,10 @@ import {
|
|
|
9
14
|
normalizeRecord,
|
|
10
15
|
resolveHarnessRunErrors,
|
|
11
16
|
serializeError,
|
|
12
|
-
|
|
17
|
+
normalizeSpanAttributes,
|
|
18
|
+
normalizeSpanError,
|
|
19
|
+
toJsonValue,
|
|
20
|
+
toolCalls as collectToolCalls
|
|
13
21
|
} from "vitest-evals/harness";
|
|
14
22
|
import { generateObject, generateText, jsonSchema } from "ai";
|
|
15
23
|
import {
|
|
@@ -20,6 +28,7 @@ import {
|
|
|
20
28
|
getReplayMetadataFromError,
|
|
21
29
|
normalizeReplayMetadata
|
|
22
30
|
} from "vitest-evals/replay";
|
|
31
|
+
var nextTraceId = 0;
|
|
23
32
|
function aiSdkJudgeHarness(config) {
|
|
24
33
|
return createJudgeHarness({
|
|
25
34
|
name: config.name ?? "ai-sdk",
|
|
@@ -63,19 +72,45 @@ ${jsonInstruction}` : jsonInstruction;
|
|
|
63
72
|
}
|
|
64
73
|
function aiSdkHarness(options) {
|
|
65
74
|
validateOptions(options);
|
|
75
|
+
const harnessName = options.name ?? "ai-sdk";
|
|
66
76
|
const harness = {
|
|
67
|
-
name:
|
|
77
|
+
name: harnessName,
|
|
68
78
|
run: async (input, context) => {
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
79
|
+
const startedAt = /* @__PURE__ */ new Date();
|
|
80
|
+
try {
|
|
81
|
+
const agent = await resolveAgent(options, {
|
|
82
|
+
input,
|
|
83
|
+
context
|
|
84
|
+
});
|
|
85
|
+
return await runAiSdkHarness(options, agent, input, context);
|
|
86
|
+
} catch (error) {
|
|
87
|
+
if (getHarnessRunFromError(error)) {
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
throw attachHarnessRunToError(
|
|
91
|
+
error,
|
|
92
|
+
createFailedAiSdkRun(input, context, error, harnessName, startedAt)
|
|
93
|
+
);
|
|
94
|
+
}
|
|
74
95
|
}
|
|
75
96
|
};
|
|
76
97
|
return harness;
|
|
77
98
|
}
|
|
99
|
+
function createFailedAiSdkRun(input, context, error, harnessName, startedAt) {
|
|
100
|
+
const run = createFailedHarnessRun(input, error, {
|
|
101
|
+
artifacts: context.artifacts
|
|
102
|
+
});
|
|
103
|
+
ensureRunTrace(run, {
|
|
104
|
+
name: harnessName,
|
|
105
|
+
startedAt,
|
|
106
|
+
finishedAt: /* @__PURE__ */ new Date(),
|
|
107
|
+
operationName: "invoke_workflow",
|
|
108
|
+
source: "harness-ai-sdk"
|
|
109
|
+
});
|
|
110
|
+
return run;
|
|
111
|
+
}
|
|
78
112
|
async function runAiSdkHarness(options, agent, input, context) {
|
|
113
|
+
const trace = createTraceRecorder(options.name ?? "ai-sdk");
|
|
79
114
|
const replayMetadataByToolCallId = /* @__PURE__ */ new Map();
|
|
80
115
|
const runtimeToolCalls = [];
|
|
81
116
|
const tools = createToolset({
|
|
@@ -102,6 +137,7 @@ async function runAiSdkHarness(options, agent, input, context) {
|
|
|
102
137
|
if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {
|
|
103
138
|
result.artifacts = context.artifacts;
|
|
104
139
|
}
|
|
140
|
+
attachAiSdkTrace(result, trace, result, /* @__PURE__ */ new Date());
|
|
105
141
|
return result;
|
|
106
142
|
}
|
|
107
143
|
const resultArgs = {
|
|
@@ -122,26 +158,48 @@ async function runAiSdkHarness(options, agent, input, context) {
|
|
|
122
158
|
runtimeToolCalls
|
|
123
159
|
);
|
|
124
160
|
const errors = resolveHarnessRunErrors(result);
|
|
161
|
+
const finishedAt = /* @__PURE__ */ new Date();
|
|
125
162
|
return {
|
|
126
163
|
session,
|
|
127
164
|
output,
|
|
128
165
|
usage,
|
|
129
166
|
artifacts: Object.keys(context.artifacts).length > 0 ? context.artifacts : void 0,
|
|
130
|
-
errors
|
|
167
|
+
errors,
|
|
168
|
+
traces: [
|
|
169
|
+
finishAiSdkTrace(trace, {
|
|
170
|
+
result,
|
|
171
|
+
session,
|
|
172
|
+
usage,
|
|
173
|
+
errors,
|
|
174
|
+
finishedAt
|
|
175
|
+
})
|
|
176
|
+
]
|
|
131
177
|
};
|
|
132
178
|
} catch (error) {
|
|
179
|
+
const finishedAt = /* @__PURE__ */ new Date();
|
|
180
|
+
const serializedError = serializeError(error);
|
|
181
|
+
const usage = runtimeToolCalls.length > 0 ? { toolCalls: runtimeToolCalls.length } : {};
|
|
182
|
+
const session = resolveSession(
|
|
183
|
+
input,
|
|
184
|
+
void 0,
|
|
185
|
+
void 0,
|
|
186
|
+
replayMetadataByToolCallId,
|
|
187
|
+
runtimeToolCalls
|
|
188
|
+
);
|
|
133
189
|
const run = {
|
|
134
|
-
session
|
|
135
|
-
input,
|
|
136
|
-
void 0,
|
|
137
|
-
void 0,
|
|
138
|
-
replayMetadataByToolCallId,
|
|
139
|
-
runtimeToolCalls
|
|
140
|
-
),
|
|
190
|
+
session,
|
|
141
191
|
output: void 0,
|
|
142
|
-
usage
|
|
192
|
+
usage,
|
|
143
193
|
artifacts: Object.keys(context.artifacts).length > 0 ? context.artifacts : void 0,
|
|
144
|
-
errors: [
|
|
194
|
+
errors: [serializedError],
|
|
195
|
+
traces: [
|
|
196
|
+
finishAiSdkTrace(trace, {
|
|
197
|
+
session,
|
|
198
|
+
usage,
|
|
199
|
+
errors: [serializedError],
|
|
200
|
+
finishedAt
|
|
201
|
+
})
|
|
202
|
+
]
|
|
145
203
|
};
|
|
146
204
|
throw attachHarnessRunToError(error, run);
|
|
147
205
|
}
|
|
@@ -201,6 +259,119 @@ function hasAiSdkGenerateMethod(agent) {
|
|
|
201
259
|
function isAgentFactory(agent) {
|
|
202
260
|
return typeof agent === "function" && !hasCallableMethod(agent, "run") && !hasCallableMethod(agent, "generate");
|
|
203
261
|
}
|
|
262
|
+
function createTraceRecorder(name) {
|
|
263
|
+
const id = `ai_sdk_trace_${++nextTraceId}`;
|
|
264
|
+
return {
|
|
265
|
+
id,
|
|
266
|
+
rootSpanId: `${id}:run`,
|
|
267
|
+
name,
|
|
268
|
+
startedAt: /* @__PURE__ */ new Date()
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function attachAiSdkTrace(run, trace, result, finishedAt) {
|
|
272
|
+
const errors = run.errors ?? [];
|
|
273
|
+
const nativeTrace = finishAiSdkTrace(trace, {
|
|
274
|
+
result,
|
|
275
|
+
session: run.session,
|
|
276
|
+
usage: run.usage,
|
|
277
|
+
errors,
|
|
278
|
+
finishedAt
|
|
279
|
+
});
|
|
280
|
+
run.traces = [...run.traces ?? [], nativeTrace];
|
|
281
|
+
}
|
|
282
|
+
function finishAiSdkTrace(trace, options) {
|
|
283
|
+
const modelSpans = createAiSdkModelSpans(
|
|
284
|
+
trace,
|
|
285
|
+
options.result,
|
|
286
|
+
options.usage
|
|
287
|
+
);
|
|
288
|
+
const toolSpans = createToolCallSpans(collectToolCalls(options.session), {
|
|
289
|
+
traceId: trace.id,
|
|
290
|
+
parentId: trace.rootSpanId,
|
|
291
|
+
spanIdPrefix: `${trace.id}:tool`
|
|
292
|
+
});
|
|
293
|
+
const finishedAt = options.finishedAt;
|
|
294
|
+
const durationMs = finishedAt.getTime() - trace.startedAt.getTime();
|
|
295
|
+
const rootError = options.errors?.[0] ? normalizeSpanError(options.errors[0]) : void 0;
|
|
296
|
+
const rootSpan = {
|
|
297
|
+
id: trace.rootSpanId,
|
|
298
|
+
traceId: trace.id,
|
|
299
|
+
name: trace.name,
|
|
300
|
+
kind: "run",
|
|
301
|
+
startedAt: trace.startedAt.toISOString(),
|
|
302
|
+
finishedAt: finishedAt.toISOString(),
|
|
303
|
+
durationMs,
|
|
304
|
+
status: rootError ? "error" : "ok",
|
|
305
|
+
...rootError ? { error: rootError } : {},
|
|
306
|
+
attributes: normalizeSpanAttributes({
|
|
307
|
+
"gen_ai.operation.name": "invoke_workflow",
|
|
308
|
+
"gen_ai.workflow.name": trace.name,
|
|
309
|
+
...createGenAiUsageAttributes(options.usage)
|
|
310
|
+
})
|
|
311
|
+
};
|
|
312
|
+
const spans = [rootSpan, ...modelSpans, ...toolSpans];
|
|
313
|
+
return {
|
|
314
|
+
id: trace.id,
|
|
315
|
+
name: trace.name,
|
|
316
|
+
startedAt: trace.startedAt.toISOString(),
|
|
317
|
+
finishedAt: finishedAt.toISOString(),
|
|
318
|
+
durationMs,
|
|
319
|
+
metadata: {
|
|
320
|
+
source: "harness-ai-sdk"
|
|
321
|
+
},
|
|
322
|
+
spans
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
function createAiSdkModelSpans(trace, result, usage) {
|
|
326
|
+
const steps = resolveSteps(result);
|
|
327
|
+
if (steps.length === 0) {
|
|
328
|
+
const fallback = createUsageModelSpan(trace, usage);
|
|
329
|
+
return fallback ? [fallback] : [];
|
|
330
|
+
}
|
|
331
|
+
return steps.map((step, index) => {
|
|
332
|
+
const stepUsage = step.usage;
|
|
333
|
+
return {
|
|
334
|
+
id: `${trace.id}:model:${index + 1}`,
|
|
335
|
+
traceId: trace.id,
|
|
336
|
+
parentId: trace.rootSpanId,
|
|
337
|
+
name: `ai-sdk step ${step.stepNumber ?? index}`,
|
|
338
|
+
kind: "model",
|
|
339
|
+
status: "ok",
|
|
340
|
+
attributes: normalizeSpanAttributes({
|
|
341
|
+
"gen_ai.operation.name": "chat",
|
|
342
|
+
"gen_ai.provider.name": step.model?.provider,
|
|
343
|
+
"gen_ai.request.model": step.model?.modelId,
|
|
344
|
+
"gen_ai.response.model": step.model?.modelId,
|
|
345
|
+
"gen_ai.response.finish_reasons": step.finishReason ? [String(step.finishReason)] : void 0,
|
|
346
|
+
"gen_ai.usage.input_tokens": stepUsage?.inputTokens,
|
|
347
|
+
"gen_ai.usage.output_tokens": stepUsage?.outputTokens,
|
|
348
|
+
"gen_ai.usage.reasoning.output_tokens": stepUsage?.outputTokenDetails?.reasoningTokens ?? stepUsage?.reasoningTokens,
|
|
349
|
+
"gen_ai.usage.cache_read.input_tokens": stepUsage?.inputTokenDetails?.cacheReadTokens ?? stepUsage?.cachedInputTokens,
|
|
350
|
+
"gen_ai.usage.cache_creation.input_tokens": stepUsage?.inputTokenDetails?.cacheWriteTokens,
|
|
351
|
+
"ai.step.number": step.stepNumber,
|
|
352
|
+
"ai.finish_reason": step.finishReason,
|
|
353
|
+
"ai.raw_finish_reason": step.rawFinishReason
|
|
354
|
+
})
|
|
355
|
+
};
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
function createUsageModelSpan(trace, usage) {
|
|
359
|
+
if (!usage?.provider && !usage?.model) {
|
|
360
|
+
return void 0;
|
|
361
|
+
}
|
|
362
|
+
return {
|
|
363
|
+
id: `${trace.id}:model:1`,
|
|
364
|
+
traceId: trace.id,
|
|
365
|
+
parentId: trace.rootSpanId,
|
|
366
|
+
name: usage.model ? `ai-sdk ${usage.model}` : "ai-sdk model",
|
|
367
|
+
kind: "model",
|
|
368
|
+
status: "ok",
|
|
369
|
+
attributes: normalizeSpanAttributes({
|
|
370
|
+
"gen_ai.operation.name": "chat",
|
|
371
|
+
...createGenAiUsageAttributes(usage)
|
|
372
|
+
})
|
|
373
|
+
};
|
|
374
|
+
}
|
|
204
375
|
function createToolset({
|
|
205
376
|
input,
|
|
206
377
|
context,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n attachHarnessRunToError,\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\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<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;\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 trace?: 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 TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : TAgent extends {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n }\n ? Awaited<TResult>\n : unknown;\n\n/** Context passed to instrumented AI SDK tool executions. */\nexport interface AiSdkToolContext<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n metadata: HarnessContext<TMetadata>[\"metadata\"];\n signal?: AbortSignal;\n setArtifact: HarnessContext<TMetadata>[\"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 TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput, TMetadata>>;\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 _TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Tool<TArgs, TResult>;\n\n/** Replay policy for one AI SDK tool. */\nexport type AiSdkToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;\n\n/** Replay policy map keyed by AI SDK tool name. */\nexport type AiSdkToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;\n\n/** Toolset shape accepted by the AI SDK harness. */\nexport type AiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyAiSdkToolset<TInput, TMetadata>;\n\n/** Runtime toolset exposed to the system under test. */\nexport type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any, any>> = {\n [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<\n infer TArgs extends JsonValue,\n infer TResult extends JsonValue,\n infer _TInput,\n infer _TMetadata\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, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n tools: AiSdkRuntimeToolset<TTools>;\n signal?: AbortSignal;\n}\n\n/** Arguments passed to per-run AI SDK agent factories. */\nexport interface AiSdkCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\n}\n\n/** Arguments passed to custom AI SDK harness run callbacks. */\nexport interface AiSdkHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> {\n agent: TAgent | undefined;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>;\n tools: AiSdkRuntimeToolset<TTools>;\n}\n\n/** Arguments passed to AI SDK harness output selectors. */\nexport interface AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> extends AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\ntype AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n> = (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype AiSdkHarnessOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> &\n (\n | {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n }\n | {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n agent?: never;\n }\n );\n\ntype AiSdkHarnessOptionsWithOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> & {\n output: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n};\n\ntype AiSdkHarnessRunOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult>;\n agent?: never;\n output?: never;\n};\n\ntype AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n output?: never;\n};\n\ninterface AiSdkHarnessBaseOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;\n output?: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\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 TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TTools\n >,\n): Harness<\n TInput,\n AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TMetadata, TTools>>,\n TMetadata\n>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata> {\n validateOptions(options);\n\n const harness: Harness<TInput, TOutput, TMetadata> = {\n name: options.name ?? \"ai-sdk\",\n run: async (input, context) => {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n return runAiSdkHarness(options, agent, input, context);\n },\n };\n\n return harness;\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext<TMetadata>,\n): Promise<HarnessRun<TOutput>> {\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const runtimeToolCalls: ToolCallRecord[] = [];\n const tools = createToolset({\n input,\n context,\n tools: options.tools,\n toolReplay: options.toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n });\n const runtime = {\n tools,\n signal: context.signal,\n } satisfies AiSdkRuntime<TTools, TInput, TMetadata>;\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 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<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(result) as TOutput | undefined);\n const usage = resolveUsage(result, runtimeToolCalls.length);\n const session = resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n const errors = resolveHarnessRunErrors(result);\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 } as HarnessRun<TOutput>;\n } catch (error) {\n const run = {\n session: resolveSession(\n input,\n undefined,\n undefined,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n ),\n output: undefined,\n usage:\n runtimeToolCalls.length > 0\n ? { toolCalls: runtimeToolCalls.length }\n : {},\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializeError(error)],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n return Boolean(options.output);\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (\n hasAiSdkRunMethod<TInput, TMetadata, TResult, TOutput, TTools>(args.agent)\n ) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (\n hasAiSdkGenerateMethod<TInput, TMetadata, TResult, TOutput, TTools>(\n args.agent,\n )\n ) {\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 TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\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 TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & { agent: AgentSource<TAgent, TInput, TMetadata> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) => MaybePromise<TAgent> {\n return (\n typeof agent === \"function\" &&\n !hasCallableMethod(agent, \"run\") &&\n !hasCallableMethod(agent, \"generate\")\n );\n}\n\nfunction createToolset<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput, TMetadata> | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeToolCalls: ToolCallRecord[];\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 replayContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput, TMetadata>;\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 normalizedResult = toJsonValue(executionResult.result);\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 runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n ...(normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\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 runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n error: normalizeError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\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 TMetadata extends HarnessMetadata,\n TTool extends AiSdkToolDefinition<any, any, TInput, TMetadata>,\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, TMetadata>;\n replay: AiSdkToolReplayPolicy<TInput, TMetadata>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<\n JsonValue,\n JsonValue,\n AiSdkToolContext<TInput, TMetadata>\n >({\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(result: unknown, runtimeToolCallCount = 0): UsageSummary {\n const steps = resolveSteps(result);\n const usage = resolveLanguageModelUsage(result) ?? resolveStepUsage(steps);\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n if (!usage) {\n if (steps.length > 0) {\n const toolCallCount = countStepToolCalls(steps);\n\n return {\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n ...(toolCallCount > 0 ? { toolCalls: toolCallCount } : {}),\n };\n }\n\n return runtimeToolCallCount > 0 ? { toolCalls: runtimeToolCallCount } : {};\n }\n\n const stepToolCallCount = countStepToolCalls(steps);\n const toolCallCount =\n stepToolCallCount > 0 ? stepToolCallCount : runtimeToolCallCount;\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 resolveStepUsage(steps: StepLike[]): LanguageModelUsage | undefined {\n const usages = steps\n .map((step) => step.usage)\n .filter((usage): usage is LanguageModelUsage => Boolean(usage));\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 resolveSession(\n input: unknown,\n result: unknown,\n output: JsonValue | undefined,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n runtimeToolCalls: ToolCallRecord[] = [],\n): NormalizedSession {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return (result as { session: NormalizedSession }).session;\n }\n\n if (\n isNormalizedSession((result as Record<string, unknown> | undefined)?.trace)\n ) {\n return (result as { trace: NormalizedSession }).trace;\n }\n\n const steps = resolveSteps(result);\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const stepToolCallIds = new Set<string>();\n\n for (const step of steps) {\n for (const toolCall of step.toolCalls ?? []) {\n stepToolCallIds.add(toolCall.toolCallId);\n }\n messages.push(...normalizeStep(step, replayMetadataByToolCallId));\n }\n\n const unmatchedRuntimeToolCalls = runtimeToolCalls.filter(\n (call) => call.id === undefined || !stepToolCallIds.has(call.id),\n );\n\n if (unmatchedRuntimeToolCalls.length > 0) {\n messages.push(...normalizeRuntimeToolCalls(unmatchedRuntimeToolCalls));\n }\n\n if (\n output !== undefined &&\n !messages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n messages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n return {\n messages,\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n };\n}\n\nfunction normalizeRuntimeToolCalls(\n runtimeToolCalls: ToolCallRecord[],\n): NormalizedMessage[] {\n const messages: NormalizedMessage[] = [\n {\n role: \"assistant\",\n toolCalls: runtimeToolCalls,\n },\n ];\n\n for (const call of runtimeToolCalls) {\n if (call.result === undefined && !call.error) {\n continue;\n }\n\n const content =\n call.result !== undefined\n ? call.result\n : call.error && call.error.message.length > 0\n ? call.error.message\n : undefined;\n\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: call.name,\n toolCallId: call.id,\n isError: Boolean(call.error),\n }),\n });\n }\n\n return messages;\n}\n\nfunction resolveSteps(result: unknown): StepLike[] {\n if (!result || typeof result !== \"object\") {\n return [];\n }\n\n return Array.isArray((result as AiSdkLikeResult).steps)\n ? ((result as AiSdkLikeResult).steps ?? [])\n : [];\n}\n\nfunction resolveLanguageModelUsage(\n result: unknown,\n): LanguageModelUsage | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const aiResult = result as AiSdkLikeResult;\n return aiResult.totalUsage ?? aiResult.usage;\n}\n\nfunction normalizeStep(\n step: StepLike,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): NormalizedMessage[] {\n const toolResultsById = new Map(\n (step.toolResults ?? []).map((toolResult) => [\n toolResult.toolCallId,\n toolResult,\n ]),\n );\n\n const normalizedCalls = (step.toolCalls ?? []).map((toolCall) =>\n normalizeToolCall(toolCall, toolResultsById, replayMetadataByToolCallId),\n );\n const normalizedCallsById = new Map(\n normalizedCalls.map((toolCall) => [toolCall.id, toolCall]),\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 messages: NormalizedMessage[] = [];\n\n if (step.text || normalizedCalls.length > 0 || assistantMetadata) {\n messages.push({\n role: \"assistant\",\n ...(step.text ? { content: step.text } : {}),\n ...(normalizedCalls.length > 0 ? { toolCalls: normalizedCalls } : {}),\n ...(assistantMetadata ? { metadata: assistantMetadata } : {}),\n });\n }\n\n for (const toolResult of step.toolResults ?? []) {\n const content =\n toolResult.output === undefined\n ? undefined\n : normalizeContent(toolResult.output);\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: toolResult.toolName,\n toolCallId: toolResult.toolCallId,\n isError: Boolean(normalizedCallsById.get(toolResult.toolCallId)?.error),\n preliminary: toolResult.preliminary,\n providerExecuted: toolResult.providerExecuted,\n title: toolResult.title,\n providerMetadata: toolResult.providerMetadata,\n }),\n });\n }\n\n return messages;\n}\n\nfunction normalizeToolCall(\n toolCall: StepLike[\"toolCalls\"][number],\n toolResultsById: Map<string, StepLike[\"toolResults\"][number]>,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): ToolCallRecord {\n const toolResult = toolResultsById.get(toolCall.toolCallId);\n const normalizedArguments = normalizeArguments(toolCall.input);\n const normalizedResult =\n toolResult !== undefined ? toJsonValue(toolResult.output) : undefined;\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 id: toolCall.toolCallId,\n name: toolCall.toolName,\n ...(normalizedArguments ? { arguments: normalizedArguments } : {}),\n ...(toolResult && normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n ...(errorValue ? { error: errorValue } : {}),\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 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","toolCallCount"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n attachHarnessRunToError,\n createFailedHarnessRun,\n createGenAiUsageAttributes,\n createToolCallSpans,\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 toolCalls as collectToolCalls,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSpan,\n NormalizedSession,\n NormalizedTrace,\n TimingSummary,\n ToolCallRecord,\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<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;\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 trace?: 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 TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : TAgent extends {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n }\n ? Awaited<TResult>\n : unknown;\n\n/** Context passed to instrumented AI SDK tool executions. */\nexport interface AiSdkToolContext<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n metadata: HarnessContext<TMetadata>[\"metadata\"];\n signal?: AbortSignal;\n setArtifact: HarnessContext<TMetadata>[\"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 TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput, TMetadata>>;\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 _TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Tool<TArgs, TResult>;\n\n/** Replay policy for one AI SDK tool. */\nexport type AiSdkToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;\n\n/** Replay policy map keyed by AI SDK tool name. */\nexport type AiSdkToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;\n\n/** Toolset shape accepted by the AI SDK harness. */\nexport type AiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyAiSdkToolset<TInput, TMetadata>;\n\n/** Runtime toolset exposed to the system under test. */\nexport type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any, any>> = {\n [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<\n infer TArgs extends JsonValue,\n infer TResult extends JsonValue,\n infer _TInput,\n infer _TMetadata\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, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n tools: AiSdkRuntimeToolset<TTools>;\n signal?: AbortSignal;\n}\n\n/** Arguments passed to per-run AI SDK agent factories. */\nexport interface AiSdkCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\n}\n\n/** Arguments passed to custom AI SDK harness run callbacks. */\nexport interface AiSdkHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> {\n agent: TAgent | undefined;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>;\n tools: AiSdkRuntimeToolset<TTools>;\n}\n\n/** Arguments passed to AI SDK harness output selectors. */\nexport interface AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> extends AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\ntype AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n> = (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype AiSdkHarnessOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> &\n (\n | {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n }\n | {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n agent?: never;\n }\n );\n\ntype AiSdkHarnessOptionsWithOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> & {\n output: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n};\n\ntype AiSdkHarnessRunOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult>;\n agent?: never;\n output?: never;\n};\n\ntype AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n output?: never;\n};\n\ninterface AiSdkHarnessBaseOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;\n output?: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\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 TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TTools\n >,\n): Harness<\n TInput,\n AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TMetadata, TTools>>,\n TMetadata\n>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata> {\n validateOptions(options);\n\n const harnessName = options.name ?? \"ai-sdk\";\n const harness: Harness<TInput, TOutput, TMetadata> = {\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, TMetadata extends HarnessMetadata>(\n input: TInput,\n context: HarnessContext<TMetadata>,\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 TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext<TMetadata>,\n): Promise<HarnessRun<TOutput>> {\n const trace = createTraceRecorder(options.name ?? \"ai-sdk\");\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const runtimeToolCalls: ToolCallRecord[] = [];\n const tools = createToolset({\n input,\n context,\n tools: options.tools,\n toolReplay: options.toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n });\n const runtime = {\n tools,\n signal: context.signal,\n } satisfies AiSdkRuntime<TTools, TInput, TMetadata>;\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<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(result) as TOutput | undefined);\n const usage = resolveUsage(result, runtimeToolCalls.length);\n const session = resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeToolCalls,\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 usage =\n runtimeToolCalls.length > 0 ? { toolCalls: runtimeToolCalls.length } : {};\n const session = resolveSession(\n input,\n undefined,\n undefined,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\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 TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n return Boolean(options.output);\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (\n hasAiSdkRunMethod<TInput, TMetadata, TResult, TOutput, TTools>(args.agent)\n ) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (\n hasAiSdkGenerateMethod<TInput, TMetadata, TResult, TOutput, TTools>(\n args.agent,\n )\n ) {\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 TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\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 TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & { agent: AgentSource<TAgent, TInput, TMetadata> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) => 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 toolSpans = createToolCallSpans(collectToolCalls(options.session), {\n traceId: trace.id,\n parentId: trace.rootSpanId,\n spanIdPrefix: `${trace.id}:tool`,\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, ...toolSpans];\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 = resolveSteps(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<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput, TMetadata> | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeToolCalls: ToolCallRecord[];\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 replayContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput, TMetadata>;\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 normalizedResult = toJsonValue(executionResult.result);\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 runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n ...(normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\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 runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n error: normalizeError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\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 TMetadata extends HarnessMetadata,\n TTool extends AiSdkToolDefinition<any, any, TInput, TMetadata>,\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, TMetadata>;\n replay: AiSdkToolReplayPolicy<TInput, TMetadata>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<\n JsonValue,\n JsonValue,\n AiSdkToolContext<TInput, TMetadata>\n >({\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(result: unknown, runtimeToolCallCount = 0): UsageSummary {\n const steps = resolveSteps(result);\n const usage = resolveLanguageModelUsage(result) ?? resolveStepUsage(steps);\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n if (!usage) {\n if (steps.length > 0) {\n const toolCallCount = countStepToolCalls(steps);\n\n return {\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n ...(toolCallCount > 0 ? { toolCalls: toolCallCount } : {}),\n };\n }\n\n return runtimeToolCallCount > 0 ? { toolCalls: runtimeToolCallCount } : {};\n }\n\n const stepToolCallCount = countStepToolCalls(steps);\n const toolCallCount =\n stepToolCallCount > 0 ? stepToolCallCount : runtimeToolCallCount;\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 resolveStepUsage(steps: StepLike[]): LanguageModelUsage | undefined {\n const usages = steps\n .map((step) => step.usage)\n .filter((usage): usage is LanguageModelUsage => Boolean(usage));\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 resolveSession(\n input: unknown,\n result: unknown,\n output: JsonValue | undefined,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n runtimeToolCalls: ToolCallRecord[] = [],\n): NormalizedSession {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return (result as { session: NormalizedSession }).session;\n }\n\n if (\n isNormalizedSession((result as Record<string, unknown> | undefined)?.trace)\n ) {\n return (result as { trace: NormalizedSession }).trace;\n }\n\n const steps = resolveSteps(result);\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const stepToolCallIds = new Set<string>();\n\n for (const step of steps) {\n for (const toolCall of step.toolCalls ?? []) {\n stepToolCallIds.add(toolCall.toolCallId);\n }\n messages.push(...normalizeStep(step, replayMetadataByToolCallId));\n }\n\n const unmatchedRuntimeToolCalls = runtimeToolCalls.filter(\n (call) => call.id === undefined || !stepToolCallIds.has(call.id),\n );\n\n if (unmatchedRuntimeToolCalls.length > 0) {\n messages.push(...normalizeRuntimeToolCalls(unmatchedRuntimeToolCalls));\n }\n\n if (\n output !== undefined &&\n !messages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n messages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n return {\n messages,\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n };\n}\n\nfunction normalizeRuntimeToolCalls(\n runtimeToolCalls: ToolCallRecord[],\n): NormalizedMessage[] {\n const messages: NormalizedMessage[] = [\n {\n role: \"assistant\",\n toolCalls: runtimeToolCalls,\n },\n ];\n\n for (const call of runtimeToolCalls) {\n if (call.result === undefined && !call.error) {\n continue;\n }\n\n const content =\n call.result !== undefined\n ? call.result\n : call.error && call.error.message.length > 0\n ? call.error.message\n : undefined;\n\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: call.name,\n toolCallId: call.id,\n isError: Boolean(call.error),\n }),\n });\n }\n\n return messages;\n}\n\nfunction resolveSteps(result: unknown): StepLike[] {\n if (!result || typeof result !== \"object\") {\n return [];\n }\n\n return Array.isArray((result as AiSdkLikeResult).steps)\n ? ((result as AiSdkLikeResult).steps ?? [])\n : [];\n}\n\nfunction resolveLanguageModelUsage(\n result: unknown,\n): LanguageModelUsage | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const aiResult = result as AiSdkLikeResult;\n return aiResult.totalUsage ?? aiResult.usage;\n}\n\nfunction normalizeStep(\n step: StepLike,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): NormalizedMessage[] {\n const toolResultsById = new Map(\n (step.toolResults ?? []).map((toolResult) => [\n toolResult.toolCallId,\n toolResult,\n ]),\n );\n\n const normalizedCalls = (step.toolCalls ?? []).map((toolCall) =>\n normalizeToolCall(toolCall, toolResultsById, replayMetadataByToolCallId),\n );\n const normalizedCallsById = new Map(\n normalizedCalls.map((toolCall) => [toolCall.id, toolCall]),\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 messages: NormalizedMessage[] = [];\n\n if (step.text || normalizedCalls.length > 0 || assistantMetadata) {\n messages.push({\n role: \"assistant\",\n ...(step.text ? { content: step.text } : {}),\n ...(normalizedCalls.length > 0 ? { toolCalls: normalizedCalls } : {}),\n ...(assistantMetadata ? { metadata: assistantMetadata } : {}),\n });\n }\n\n for (const toolResult of step.toolResults ?? []) {\n const content =\n toolResult.output === undefined\n ? undefined\n : normalizeContent(toolResult.output);\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: toolResult.toolName,\n toolCallId: toolResult.toolCallId,\n isError: Boolean(normalizedCallsById.get(toolResult.toolCallId)?.error),\n preliminary: toolResult.preliminary,\n providerExecuted: toolResult.providerExecuted,\n title: toolResult.title,\n providerMetadata: toolResult.providerMetadata,\n }),\n });\n }\n\n return messages;\n}\n\nfunction normalizeToolCall(\n toolCall: StepLike[\"toolCalls\"][number],\n toolResultsById: Map<string, StepLike[\"toolResults\"][number]>,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): ToolCallRecord {\n const toolResult = toolResultsById.get(toolCall.toolCallId);\n const normalizedArguments = normalizeArguments(toolCall.input);\n const normalizedResult =\n toolResult !== undefined ? toJsonValue(toolResult.output) : undefined;\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 id: toolCall.toolCallId,\n name: toolCall.toolName,\n ...(normalizedArguments ? { arguments: normalizedArguments } : {}),\n ...(toolResult && normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n ...(errorValue ? { error: errorValue } : {}),\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 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","toolCallCount"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vitest-evals/harness-ai-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.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.11.0"
|
|
41
41
|
},
|
|
42
42
|
"scripts": {
|
|
43
43
|
"build": "tsup --config ./tsup.config.ts"
|