@vitest-evals/harness-ai-sdk 0.9.0-beta.0 → 0.9.0-beta.2
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/README.md +30 -2
- package/dist/index.d.mts +6 -5
- package/dist/index.d.ts +6 -5
- package/dist/index.js +12 -15
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +12 -15
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -11,13 +11,14 @@ npm install -D ai vitest-evals @vitest-evals/harness-ai-sdk
|
|
|
11
11
|
## Usage
|
|
12
12
|
|
|
13
13
|
```ts
|
|
14
|
+
import { expect } from "vitest";
|
|
14
15
|
import { generateText, stepCountIs } from "ai";
|
|
15
16
|
import { openai } from "@ai-sdk/openai";
|
|
16
17
|
import { aiSdkHarness } from "@vitest-evals/harness-ai-sdk";
|
|
18
|
+
import { describeEval, toolCalls } from "vitest-evals";
|
|
17
19
|
|
|
18
20
|
const tools = {
|
|
19
21
|
lookupInvoice: {
|
|
20
|
-
replay: true,
|
|
21
22
|
inputSchema: lookupInvoiceSchema,
|
|
22
23
|
execute: lookupInvoice,
|
|
23
24
|
},
|
|
@@ -25,6 +26,15 @@ const tools = {
|
|
|
25
26
|
|
|
26
27
|
const harness = aiSdkHarness({
|
|
27
28
|
tools,
|
|
29
|
+
toolReplay: {
|
|
30
|
+
lookupInvoice: true,
|
|
31
|
+
},
|
|
32
|
+
prompt: (input, options) =>
|
|
33
|
+
generateText({
|
|
34
|
+
model: openai("gpt-4o-mini"),
|
|
35
|
+
system: options?.system,
|
|
36
|
+
prompt: input,
|
|
37
|
+
}).then((result) => result.text),
|
|
28
38
|
task: ({ input, runtime }) =>
|
|
29
39
|
generateText({
|
|
30
40
|
model: openai("gpt-4o-mini"),
|
|
@@ -33,6 +43,19 @@ const harness = aiSdkHarness({
|
|
|
33
43
|
stopWhen: stepCountIs(5),
|
|
34
44
|
}),
|
|
35
45
|
});
|
|
46
|
+
|
|
47
|
+
describeEval("refund agent", { harness }, (it) => {
|
|
48
|
+
it("approves a refundable invoice", async ({ run }) => {
|
|
49
|
+
const result = await run("Refund invoice inv_123");
|
|
50
|
+
|
|
51
|
+
expect(result.output).toMatchObject({
|
|
52
|
+
status: "approved",
|
|
53
|
+
});
|
|
54
|
+
expect(toolCalls(result.session).map((call) => call.name)).toContain(
|
|
55
|
+
"lookupInvoice",
|
|
56
|
+
);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
36
59
|
```
|
|
37
60
|
|
|
38
61
|
If your existing AI SDK app exposes its own entrypoint, wire that in directly:
|
|
@@ -40,17 +63,22 @@ If your existing AI SDK app exposes its own entrypoint, wire that in directly:
|
|
|
40
63
|
```ts
|
|
41
64
|
const harness = aiSdkHarness({
|
|
42
65
|
tools,
|
|
66
|
+
prompt: sharedJudgePrompt,
|
|
43
67
|
task: ({ input, runtime }) => createRefundAgent().run(input, runtime),
|
|
44
68
|
});
|
|
45
69
|
```
|
|
46
70
|
|
|
71
|
+
The required `prompt` callback is passed to harness-backed judges as
|
|
72
|
+
`JudgeContext.harness.prompt`, which lets rubric or factuality judges share the
|
|
73
|
+
same provider/model configuration as the suite harness.
|
|
74
|
+
|
|
47
75
|
The adapter infers:
|
|
48
76
|
|
|
49
77
|
- normalized session and tool-call traces from AI SDK `steps`
|
|
50
78
|
- usage diagnostics from `totalUsage` / `usage`
|
|
51
79
|
- `run.output` from common AI SDK result fields such as `output`, `object`, and
|
|
52
80
|
`text`
|
|
53
|
-
- replay/cassette metadata for
|
|
81
|
+
- replay/cassette metadata for local tools configured with `toolReplay`
|
|
54
82
|
|
|
55
83
|
See the workspace demo app in `apps/demo-ai-sdk` and the RFC notes in
|
|
56
84
|
`docs/harness-first-rfc.md`.
|
package/dist/index.d.mts
CHANGED
|
@@ -15,9 +15,9 @@ interface AiSdkToolContext<TInput = string, TMetadata extends HarnessMetadata =
|
|
|
15
15
|
type AiSdkReplayMode = ReplayMode;
|
|
16
16
|
type AiSdkToolRecording<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue> = ToolRecording<TArgs, TResult>;
|
|
17
17
|
type AiSdkToolReplayConfig<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput, TMetadata>>;
|
|
18
|
-
type AiSdkToolDefinition<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue,
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
type AiSdkToolDefinition<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, _TInput = string, _TMetadata extends HarnessMetadata = HarnessMetadata> = Tool<TArgs, TResult>;
|
|
19
|
+
type AiSdkToolReplayPolicy<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;
|
|
20
|
+
type AiSdkToolReplayPolicies<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;
|
|
21
21
|
type AiSdkToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = AnyAiSdkToolset<TInput, TMetadata>;
|
|
22
22
|
type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any, any>> = {
|
|
23
23
|
[K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<infer TArgs extends JsonValue, infer TResult extends JsonValue, infer _TInput, infer _TMetadata> ? Omit<TTools[K], "execute"> & {
|
|
@@ -47,14 +47,15 @@ type AiSdkHarnessOptions<TAgent = unknown, TInput = string, TMetadata extends Ha
|
|
|
47
47
|
});
|
|
48
48
|
interface AiSdkHarnessBaseOptions<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>> {
|
|
49
49
|
tools?: TTools;
|
|
50
|
+
toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;
|
|
50
51
|
session?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<NormalizedSession>;
|
|
51
52
|
output?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<JsonValue | undefined>;
|
|
52
53
|
usage?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<UsageSummary>;
|
|
53
54
|
timings?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<TimingSummary | undefined>;
|
|
54
55
|
errors?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<Array<Record<string, JsonValue>>>;
|
|
55
|
-
prompt
|
|
56
|
+
prompt: HarnessPrompt;
|
|
56
57
|
name?: string;
|
|
57
58
|
}
|
|
58
59
|
declare function aiSdkHarness<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>>(options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>): Harness<TInput, TMetadata>;
|
|
59
60
|
|
|
60
|
-
export { type AiSdkHarnessOptions, type AiSdkHarnessResultArgs, type AiSdkHarnessRunArgs, type AiSdkReplayMode, type AiSdkRuntime, type AiSdkRuntimeToolset, type AiSdkToolContext, type AiSdkToolDefinition, type AiSdkToolRecording, type AiSdkToolReplayConfig, type AiSdkToolset, aiSdkHarness };
|
|
61
|
+
export { type AiSdkHarnessOptions, type AiSdkHarnessResultArgs, type AiSdkHarnessRunArgs, type AiSdkReplayMode, type AiSdkRuntime, type AiSdkRuntimeToolset, type AiSdkToolContext, type AiSdkToolDefinition, type AiSdkToolRecording, type AiSdkToolReplayConfig, type AiSdkToolReplayPolicies, type AiSdkToolReplayPolicy, type AiSdkToolset, aiSdkHarness };
|
package/dist/index.d.ts
CHANGED
|
@@ -15,9 +15,9 @@ interface AiSdkToolContext<TInput = string, TMetadata extends HarnessMetadata =
|
|
|
15
15
|
type AiSdkReplayMode = ReplayMode;
|
|
16
16
|
type AiSdkToolRecording<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue> = ToolRecording<TArgs, TResult>;
|
|
17
17
|
type AiSdkToolReplayConfig<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput, TMetadata>>;
|
|
18
|
-
type AiSdkToolDefinition<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue,
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
type AiSdkToolDefinition<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, _TInput = string, _TMetadata extends HarnessMetadata = HarnessMetadata> = Tool<TArgs, TResult>;
|
|
19
|
+
type AiSdkToolReplayPolicy<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;
|
|
20
|
+
type AiSdkToolReplayPolicies<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;
|
|
21
21
|
type AiSdkToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = AnyAiSdkToolset<TInput, TMetadata>;
|
|
22
22
|
type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any, any>> = {
|
|
23
23
|
[K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<infer TArgs extends JsonValue, infer TResult extends JsonValue, infer _TInput, infer _TMetadata> ? Omit<TTools[K], "execute"> & {
|
|
@@ -47,14 +47,15 @@ type AiSdkHarnessOptions<TAgent = unknown, TInput = string, TMetadata extends Ha
|
|
|
47
47
|
});
|
|
48
48
|
interface AiSdkHarnessBaseOptions<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>> {
|
|
49
49
|
tools?: TTools;
|
|
50
|
+
toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;
|
|
50
51
|
session?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<NormalizedSession>;
|
|
51
52
|
output?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<JsonValue | undefined>;
|
|
52
53
|
usage?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<UsageSummary>;
|
|
53
54
|
timings?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<TimingSummary | undefined>;
|
|
54
55
|
errors?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<Array<Record<string, JsonValue>>>;
|
|
55
|
-
prompt
|
|
56
|
+
prompt: HarnessPrompt;
|
|
56
57
|
name?: string;
|
|
57
58
|
}
|
|
58
59
|
declare function aiSdkHarness<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>>(options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>): Harness<TInput, TMetadata>;
|
|
59
60
|
|
|
60
|
-
export { type AiSdkHarnessOptions, type AiSdkHarnessResultArgs, type AiSdkHarnessRunArgs, type AiSdkReplayMode, type AiSdkRuntime, type AiSdkRuntimeToolset, type AiSdkToolContext, type AiSdkToolDefinition, type AiSdkToolRecording, type AiSdkToolReplayConfig, type AiSdkToolset, aiSdkHarness };
|
|
61
|
+
export { type AiSdkHarnessOptions, type AiSdkHarnessResultArgs, type AiSdkHarnessRunArgs, type AiSdkReplayMode, type AiSdkRuntime, type AiSdkRuntimeToolset, type AiSdkToolContext, type AiSdkToolDefinition, type AiSdkToolRecording, type AiSdkToolReplayConfig, type AiSdkToolReplayPolicies, type AiSdkToolReplayPolicy, type AiSdkToolset, aiSdkHarness };
|
package/dist/index.js
CHANGED
|
@@ -43,6 +43,7 @@ async function runAiSdkHarness(options, agent, input, context) {
|
|
|
43
43
|
input,
|
|
44
44
|
context,
|
|
45
45
|
tools: options.tools,
|
|
46
|
+
toolReplay: options.toolReplay,
|
|
46
47
|
replayMetadataByToolCallId,
|
|
47
48
|
runtimeToolCalls
|
|
48
49
|
});
|
|
@@ -164,12 +165,14 @@ function createToolset({
|
|
|
164
165
|
input,
|
|
165
166
|
context,
|
|
166
167
|
tools,
|
|
168
|
+
toolReplay,
|
|
167
169
|
replayMetadataByToolCallId,
|
|
168
170
|
runtimeToolCalls
|
|
169
171
|
}) {
|
|
170
172
|
return Object.fromEntries(
|
|
171
173
|
Object.entries(tools ?? {}).map(([toolName, tool]) => {
|
|
172
|
-
|
|
174
|
+
const replay = toolReplay?.[toolName];
|
|
175
|
+
if (replay && !tool.execute) {
|
|
173
176
|
throw new Error(
|
|
174
177
|
`Tool replay requires execute() for ${toolName}. Provider-executed tools cannot be recorded automatically.`
|
|
175
178
|
);
|
|
@@ -191,13 +194,13 @@ function createToolset({
|
|
|
191
194
|
execution
|
|
192
195
|
};
|
|
193
196
|
try {
|
|
194
|
-
const executionResult =
|
|
197
|
+
const executionResult = replay ? await executeToolWithReplay({
|
|
195
198
|
toolName,
|
|
196
199
|
toolInput,
|
|
197
200
|
execute,
|
|
198
201
|
execution,
|
|
199
202
|
context: replayContext,
|
|
200
|
-
replay
|
|
203
|
+
replay
|
|
201
204
|
}) : {
|
|
202
205
|
result: await execute(toolInput, execution),
|
|
203
206
|
replay: void 0
|
|
@@ -225,11 +228,11 @@ function createToolset({
|
|
|
225
228
|
});
|
|
226
229
|
return executionResult.result;
|
|
227
230
|
} catch (error) {
|
|
228
|
-
const
|
|
231
|
+
const replay2 = (0, import_replay.getReplayMetadataFromError)(error);
|
|
229
232
|
const finishedAt = /* @__PURE__ */ new Date();
|
|
230
|
-
const replayMetadata = (0, import_replay.normalizeReplayMetadata)(
|
|
231
|
-
if (
|
|
232
|
-
replayMetadataByToolCallId.set(execution.toolCallId,
|
|
233
|
+
const replayMetadata = (0, import_replay.normalizeReplayMetadata)(replay2);
|
|
234
|
+
if (replay2) {
|
|
235
|
+
replayMetadataByToolCallId.set(execution.toolCallId, replay2);
|
|
233
236
|
}
|
|
234
237
|
runtimeToolCalls.push({
|
|
235
238
|
id: execution.toolCallId,
|
|
@@ -257,10 +260,7 @@ async function executeToolWithReplay({
|
|
|
257
260
|
context,
|
|
258
261
|
replay
|
|
259
262
|
}) {
|
|
260
|
-
const replayInput = toReplayJsonValue(
|
|
261
|
-
toolInput,
|
|
262
|
-
`${toolName} tool input`
|
|
263
|
-
);
|
|
263
|
+
const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);
|
|
264
264
|
return (0, import_replay.executeWithReplay)({
|
|
265
265
|
toolName,
|
|
266
266
|
args: replayInput,
|
|
@@ -275,10 +275,7 @@ async function executeToolWithReplay({
|
|
|
275
275
|
`Tool replay only supports JSON-serializable outputs. ${toolName} returned an async iterable.`
|
|
276
276
|
);
|
|
277
277
|
}
|
|
278
|
-
return toReplayJsonValue(
|
|
279
|
-
output,
|
|
280
|
-
`${toolName} tool output`
|
|
281
|
-
);
|
|
278
|
+
return toReplayJsonValue(output, `${toolName} tool output`);
|
|
282
279
|
},
|
|
283
280
|
replay
|
|
284
281
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n attachHarnessRunToError,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessPrompt,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\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 LanguageModelUsage,\n StepResult,\n Tool,\n ToolExecuteFunction,\n ToolExecutionOptions,\n ToolSet,\n} from \"ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AgentSource<TAgent> = TAgent | (() => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;\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 experimental_output?: unknown;\n result?: unknown;\n text?: string;\n session?: NormalizedSession;\n trace?: NormalizedSession;\n errors?: Array<Record<string, JsonValue>>;\n};\n\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\nexport type AiSdkReplayMode = ReplayMode;\n\nexport type AiSdkToolRecording<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\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\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 replay?: boolean | AiSdkToolReplayConfig<TArgs, TResult, TInput, TMetadata>;\n};\n\nexport type AiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyAiSdkToolset<TInput, TMetadata>;\n\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\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\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\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\nexport type 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> = AiSdkHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> &\n (\n | {\n agent: AgentSource<TAgent>;\n task?: never;\n }\n | {\n task: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun>;\n agent?: never;\n }\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> {\n tools?: TTools;\n session?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<NormalizedSession>;\n output?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<JsonValue | undefined>;\n usage?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<UsageSummary>;\n timings?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<TimingSummary | undefined>;\n errors?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<Array<Record<string, JsonValue>>>;\n prompt?: HarnessPrompt;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\ntype AiSdkResultOverrides<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = Pick<\n AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n \"errors\" | \"output\" | \"session\" | \"timings\" | \"usage\"\n>;\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>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): Harness<TInput, TMetadata> {\n validateOptions(options);\n\n return {\n name: options.name ?? \"ai-sdk\",\n prompt: options.prompt,\n run: async (input, context) => {\n const agent = await resolveAgent(options);\n return runAiSdkHarness(options, agent, input, context);\n },\n };\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext<TMetadata>,\n): Promise<HarnessRun> {\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const runtimeToolCalls: ToolCallRecord[] = [];\n const tools = createToolset({\n input,\n context,\n tools: options.tools,\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) && !hasResultOverrides(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);\n const usage = options.usage\n ? await options.usage(resultArgs)\n : resolveUsage(result, runtimeToolCalls.length);\n const session = options.session\n ? await options.session(resultArgs)\n : resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n\n return {\n session,\n output,\n usage,\n timings: options.timings ? await options.timings(resultArgs) : undefined,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: options.errors\n ? await options.errors(resultArgs)\n : resolveHarnessRunErrors(result),\n };\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 hasResultOverrides<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(options: AiSdkResultOverrides<TAgent, TInput, TMetadata, TResult, TTools>) {\n return Boolean(\n options.output ??\n options.session ??\n options.usage ??\n options.timings ??\n options.errors,\n );\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun> {\n if (options.task) {\n return options.task(args);\n }\n\n if (hasAiSdkRunMethod<TInput, TMetadata, TResult, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (hasAiSdkGenerateMethod<TInput, TMetadata, TResult, TTools>(args.agent)) {\n return args.agent.generate(args.input, args.runtime);\n }\n\n throw new Error(\n \"aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use task() for a custom entrypoint.\",\n );\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>) {\n const hasAgent = hasAgentSource(options);\n const hasTask = typeof (options as { task?: unknown }).task === \"function\";\n\n if (hasAgent && hasTask) {\n throw new Error(\n \"aiSdkHarness accepts either agent or task, not both. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or task for a custom entrypoint.\",\n );\n }\n\n if (!hasAgent && !hasTask) {\n throw new Error(\n \"aiSdkHarness requires either agent or task. Use agent for objects with run(input, runtime) or generate(input, runtime), or task for a custom entrypoint.\",\n );\n }\n}\n\nfunction hasAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n> & { agent: AgentSource<TAgent> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<TAgent>(\n agent: AgentSource<TAgent>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent();\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TMetadata, TResult, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TMetadata, TResult, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent>(\n agent: AgentSource<TAgent>,\n): agent is () => 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 replayMetadataByToolCallId,\n runtimeToolCalls,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeToolCalls: ToolCallRecord[];\n}) {\n return Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => {\n if (tool.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 = tool.replay\n ? await executeToolWithReplay({\n toolName,\n toolInput,\n execute,\n execution,\n context: replayContext,\n replay: tool.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: NonNullable<TTool[\"replay\"]>;\n}) {\n const replayInput = toReplayJsonValue(\n toolInput,\n `${toolName} tool input`,\n ) as InferToolInput<TTool> & JsonValue;\n\n return executeWithReplay({\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(\n output,\n `${toolName} tool output`,\n ) as InferToolOutput<TTool> & JsonValue;\n },\n replay,\n });\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return toJsonValue(result);\n }\n\n const candidates = [\n \"output\",\n \"object\",\n \"experimental_output\",\n \"result\",\n \"text\",\n ] satisfies string[];\n\n for (const key of candidates) {\n const value = (result as Record<string, unknown>)[key];\n const normalized = toJsonValue(value);\n if (normalized !== undefined) {\n return normalized;\n }\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 const outputText = resolveOutputText(result, output, lastStep);\n\n return {\n messages,\n outputText,\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 resolveOutputText(\n result: unknown,\n output: JsonValue | undefined,\n lastStep: StepLike | undefined,\n) {\n if (lastStep?.text) {\n return lastStep.text;\n }\n\n if (\n result &&\n typeof result === \"object\" &&\n typeof (result as AiSdkLikeResult).text === \"string\"\n ) {\n return (result as AiSdkLikeResult).text;\n }\n\n return typeof output === \"string\" ? output : undefined;\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":["toolCallCount"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n attachHarnessRunToError,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessPrompt,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\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 LanguageModelUsage,\n StepResult,\n Tool,\n ToolExecuteFunction,\n ToolExecutionOptions,\n ToolSet,\n} from \"ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AgentSource<TAgent> = TAgent | (() => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;\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 experimental_output?: unknown;\n result?: unknown;\n text?: string;\n session?: NormalizedSession;\n trace?: NormalizedSession;\n errors?: Array<Record<string, JsonValue>>;\n};\n\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\nexport type AiSdkReplayMode = ReplayMode;\n\nexport type AiSdkToolRecording<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\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\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\nexport type AiSdkToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;\n\nexport type AiSdkToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;\n\nexport type AiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyAiSdkToolset<TInput, TMetadata>;\n\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\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\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\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\nexport type 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> = AiSdkHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> &\n (\n | {\n agent: AgentSource<TAgent>;\n task?: never;\n }\n | {\n task: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun>;\n agent?: never;\n }\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> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;\n session?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<NormalizedSession>;\n output?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<JsonValue | undefined>;\n usage?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<UsageSummary>;\n timings?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<TimingSummary | undefined>;\n errors?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<Array<Record<string, JsonValue>>>;\n prompt: HarnessPrompt;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\ntype AiSdkResultOverrides<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = Pick<\n AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n \"errors\" | \"output\" | \"session\" | \"timings\" | \"usage\"\n>;\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>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): Harness<TInput, TMetadata> {\n validateOptions(options);\n\n return {\n name: options.name ?? \"ai-sdk\",\n prompt: options.prompt,\n run: async (input, context) => {\n const agent = await resolveAgent(options);\n return runAiSdkHarness(options, agent, input, context);\n },\n };\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext<TMetadata>,\n): Promise<HarnessRun> {\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) && !hasResultOverrides(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);\n const usage = options.usage\n ? await options.usage(resultArgs)\n : resolveUsage(result, runtimeToolCalls.length);\n const session = options.session\n ? await options.session(resultArgs)\n : resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n\n return {\n session,\n output,\n usage,\n timings: options.timings ? await options.timings(resultArgs) : undefined,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: options.errors\n ? await options.errors(resultArgs)\n : resolveHarnessRunErrors(result),\n };\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 hasResultOverrides<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(options: AiSdkResultOverrides<TAgent, TInput, TMetadata, TResult, TTools>) {\n return Boolean(\n options.output ??\n options.session ??\n options.usage ??\n options.timings ??\n options.errors,\n );\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun> {\n if (options.task) {\n return options.task(args);\n }\n\n if (hasAiSdkRunMethod<TInput, TMetadata, TResult, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (hasAiSdkGenerateMethod<TInput, TMetadata, TResult, TTools>(args.agent)) {\n return args.agent.generate(args.input, args.runtime);\n }\n\n throw new Error(\n \"aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use task() for a custom entrypoint.\",\n );\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>) {\n const hasAgent = hasAgentSource(options);\n const hasTask = typeof (options as { task?: unknown }).task === \"function\";\n\n if (hasAgent && hasTask) {\n throw new Error(\n \"aiSdkHarness accepts either agent or task, not both. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or task for a custom entrypoint.\",\n );\n }\n\n if (!hasAgent && !hasTask) {\n throw new Error(\n \"aiSdkHarness requires either agent or task. Use agent for objects with run(input, runtime) or generate(input, runtime), or task for a custom entrypoint.\",\n );\n }\n}\n\nfunction hasAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n> & { agent: AgentSource<TAgent> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<TAgent>(\n agent: AgentSource<TAgent>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent();\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TMetadata, TResult, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TMetadata, TResult, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent>(\n agent: AgentSource<TAgent>,\n): agent is () => 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 toJsonValue(result);\n }\n\n const candidates = [\n \"output\",\n \"object\",\n \"experimental_output\",\n \"result\",\n \"text\",\n ] satisfies string[];\n\n for (const key of candidates) {\n const value = (result as Record<string, unknown>)[key];\n const normalized = toJsonValue(value);\n if (normalized !== undefined) {\n return normalized;\n }\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 const outputText = resolveOutputText(result, output, lastStep);\n\n return {\n messages,\n outputText,\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 resolveOutputText(\n result: unknown,\n output: JsonValue | undefined,\n lastStep: StepLike | undefined,\n) {\n if (lastStep?.text) {\n return lastStep.text;\n }\n\n if (\n result &&\n typeof result === \"object\" &&\n typeof (result as AiSdkLikeResult).text === \"string\"\n ) {\n return (result as AiSdkLikeResult).text;\n }\n\n return typeof output === \"string\" ? output : undefined;\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/dist/index.mjs
CHANGED
|
@@ -34,6 +34,7 @@ async function runAiSdkHarness(options, agent, input, context) {
|
|
|
34
34
|
input,
|
|
35
35
|
context,
|
|
36
36
|
tools: options.tools,
|
|
37
|
+
toolReplay: options.toolReplay,
|
|
37
38
|
replayMetadataByToolCallId,
|
|
38
39
|
runtimeToolCalls
|
|
39
40
|
});
|
|
@@ -155,12 +156,14 @@ function createToolset({
|
|
|
155
156
|
input,
|
|
156
157
|
context,
|
|
157
158
|
tools,
|
|
159
|
+
toolReplay,
|
|
158
160
|
replayMetadataByToolCallId,
|
|
159
161
|
runtimeToolCalls
|
|
160
162
|
}) {
|
|
161
163
|
return Object.fromEntries(
|
|
162
164
|
Object.entries(tools ?? {}).map(([toolName, tool]) => {
|
|
163
|
-
|
|
165
|
+
const replay = toolReplay?.[toolName];
|
|
166
|
+
if (replay && !tool.execute) {
|
|
164
167
|
throw new Error(
|
|
165
168
|
`Tool replay requires execute() for ${toolName}. Provider-executed tools cannot be recorded automatically.`
|
|
166
169
|
);
|
|
@@ -182,13 +185,13 @@ function createToolset({
|
|
|
182
185
|
execution
|
|
183
186
|
};
|
|
184
187
|
try {
|
|
185
|
-
const executionResult =
|
|
188
|
+
const executionResult = replay ? await executeToolWithReplay({
|
|
186
189
|
toolName,
|
|
187
190
|
toolInput,
|
|
188
191
|
execute,
|
|
189
192
|
execution,
|
|
190
193
|
context: replayContext,
|
|
191
|
-
replay
|
|
194
|
+
replay
|
|
192
195
|
}) : {
|
|
193
196
|
result: await execute(toolInput, execution),
|
|
194
197
|
replay: void 0
|
|
@@ -216,11 +219,11 @@ function createToolset({
|
|
|
216
219
|
});
|
|
217
220
|
return executionResult.result;
|
|
218
221
|
} catch (error) {
|
|
219
|
-
const
|
|
222
|
+
const replay2 = getReplayMetadataFromError(error);
|
|
220
223
|
const finishedAt = /* @__PURE__ */ new Date();
|
|
221
|
-
const replayMetadata = normalizeReplayMetadata(
|
|
222
|
-
if (
|
|
223
|
-
replayMetadataByToolCallId.set(execution.toolCallId,
|
|
224
|
+
const replayMetadata = normalizeReplayMetadata(replay2);
|
|
225
|
+
if (replay2) {
|
|
226
|
+
replayMetadataByToolCallId.set(execution.toolCallId, replay2);
|
|
224
227
|
}
|
|
225
228
|
runtimeToolCalls.push({
|
|
226
229
|
id: execution.toolCallId,
|
|
@@ -248,10 +251,7 @@ async function executeToolWithReplay({
|
|
|
248
251
|
context,
|
|
249
252
|
replay
|
|
250
253
|
}) {
|
|
251
|
-
const replayInput = toReplayJsonValue(
|
|
252
|
-
toolInput,
|
|
253
|
-
`${toolName} tool input`
|
|
254
|
-
);
|
|
254
|
+
const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);
|
|
255
255
|
return executeWithReplay({
|
|
256
256
|
toolName,
|
|
257
257
|
args: replayInput,
|
|
@@ -266,10 +266,7 @@ async function executeToolWithReplay({
|
|
|
266
266
|
`Tool replay only supports JSON-serializable outputs. ${toolName} returned an async iterable.`
|
|
267
267
|
);
|
|
268
268
|
}
|
|
269
|
-
return toReplayJsonValue(
|
|
270
|
-
output,
|
|
271
|
-
`${toolName} tool output`
|
|
272
|
-
);
|
|
269
|
+
return toReplayJsonValue(output, `${toolName} tool output`);
|
|
273
270
|
},
|
|
274
271
|
replay
|
|
275
272
|
});
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n attachHarnessRunToError,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessPrompt,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\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 LanguageModelUsage,\n StepResult,\n Tool,\n ToolExecuteFunction,\n ToolExecutionOptions,\n ToolSet,\n} from \"ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AgentSource<TAgent> = TAgent | (() => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;\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 experimental_output?: unknown;\n result?: unknown;\n text?: string;\n session?: NormalizedSession;\n trace?: NormalizedSession;\n errors?: Array<Record<string, JsonValue>>;\n};\n\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\nexport type AiSdkReplayMode = ReplayMode;\n\nexport type AiSdkToolRecording<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\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\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 replay?: boolean | AiSdkToolReplayConfig<TArgs, TResult, TInput, TMetadata>;\n};\n\nexport type AiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyAiSdkToolset<TInput, TMetadata>;\n\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\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\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\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\nexport type 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> = AiSdkHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> &\n (\n | {\n agent: AgentSource<TAgent>;\n task?: never;\n }\n | {\n task: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun>;\n agent?: never;\n }\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> {\n tools?: TTools;\n session?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<NormalizedSession>;\n output?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<JsonValue | undefined>;\n usage?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<UsageSummary>;\n timings?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<TimingSummary | undefined>;\n errors?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<Array<Record<string, JsonValue>>>;\n prompt?: HarnessPrompt;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\ntype AiSdkResultOverrides<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = Pick<\n AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n \"errors\" | \"output\" | \"session\" | \"timings\" | \"usage\"\n>;\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>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): Harness<TInput, TMetadata> {\n validateOptions(options);\n\n return {\n name: options.name ?? \"ai-sdk\",\n prompt: options.prompt,\n run: async (input, context) => {\n const agent = await resolveAgent(options);\n return runAiSdkHarness(options, agent, input, context);\n },\n };\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext<TMetadata>,\n): Promise<HarnessRun> {\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const runtimeToolCalls: ToolCallRecord[] = [];\n const tools = createToolset({\n input,\n context,\n tools: options.tools,\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) && !hasResultOverrides(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);\n const usage = options.usage\n ? await options.usage(resultArgs)\n : resolveUsage(result, runtimeToolCalls.length);\n const session = options.session\n ? await options.session(resultArgs)\n : resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n\n return {\n session,\n output,\n usage,\n timings: options.timings ? await options.timings(resultArgs) : undefined,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: options.errors\n ? await options.errors(resultArgs)\n : resolveHarnessRunErrors(result),\n };\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 hasResultOverrides<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(options: AiSdkResultOverrides<TAgent, TInput, TMetadata, TResult, TTools>) {\n return Boolean(\n options.output ??\n options.session ??\n options.usage ??\n options.timings ??\n options.errors,\n );\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun> {\n if (options.task) {\n return options.task(args);\n }\n\n if (hasAiSdkRunMethod<TInput, TMetadata, TResult, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (hasAiSdkGenerateMethod<TInput, TMetadata, TResult, TTools>(args.agent)) {\n return args.agent.generate(args.input, args.runtime);\n }\n\n throw new Error(\n \"aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use task() for a custom entrypoint.\",\n );\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>) {\n const hasAgent = hasAgentSource(options);\n const hasTask = typeof (options as { task?: unknown }).task === \"function\";\n\n if (hasAgent && hasTask) {\n throw new Error(\n \"aiSdkHarness accepts either agent or task, not both. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or task for a custom entrypoint.\",\n );\n }\n\n if (!hasAgent && !hasTask) {\n throw new Error(\n \"aiSdkHarness requires either agent or task. Use agent for objects with run(input, runtime) or generate(input, runtime), or task for a custom entrypoint.\",\n );\n }\n}\n\nfunction hasAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n> & { agent: AgentSource<TAgent> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<TAgent>(\n agent: AgentSource<TAgent>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent();\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TMetadata, TResult, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TMetadata, TResult, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent>(\n agent: AgentSource<TAgent>,\n): agent is () => 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 replayMetadataByToolCallId,\n runtimeToolCalls,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeToolCalls: ToolCallRecord[];\n}) {\n return Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => {\n if (tool.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 = tool.replay\n ? await executeToolWithReplay({\n toolName,\n toolInput,\n execute,\n execution,\n context: replayContext,\n replay: tool.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: NonNullable<TTool[\"replay\"]>;\n}) {\n const replayInput = toReplayJsonValue(\n toolInput,\n `${toolName} tool input`,\n ) as InferToolInput<TTool> & JsonValue;\n\n return executeWithReplay({\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(\n output,\n `${toolName} tool output`,\n ) as InferToolOutput<TTool> & JsonValue;\n },\n replay,\n });\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return toJsonValue(result);\n }\n\n const candidates = [\n \"output\",\n \"object\",\n \"experimental_output\",\n \"result\",\n \"text\",\n ] satisfies string[];\n\n for (const key of candidates) {\n const value = (result as Record<string, unknown>)[key];\n const normalized = toJsonValue(value);\n if (normalized !== undefined) {\n return normalized;\n }\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 const outputText = resolveOutputText(result, output, lastStep);\n\n return {\n messages,\n outputText,\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 resolveOutputText(\n result: unknown,\n output: JsonValue | undefined,\n lastStep: StepLike | undefined,\n) {\n if (lastStep?.text) {\n return lastStep.text;\n }\n\n if (\n result &&\n typeof result === \"object\" &&\n typeof (result as AiSdkLikeResult).text === \"string\"\n ) {\n return (result as AiSdkLikeResult).text;\n }\n\n return typeof output === \"string\" ? output : undefined;\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":["toolCallCount"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n attachHarnessRunToError,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessPrompt,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\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 LanguageModelUsage,\n StepResult,\n Tool,\n ToolExecuteFunction,\n ToolExecutionOptions,\n ToolSet,\n} from \"ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AgentSource<TAgent> = TAgent | (() => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;\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 experimental_output?: unknown;\n result?: unknown;\n text?: string;\n session?: NormalizedSession;\n trace?: NormalizedSession;\n errors?: Array<Record<string, JsonValue>>;\n};\n\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\nexport type AiSdkReplayMode = ReplayMode;\n\nexport type AiSdkToolRecording<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\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\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\nexport type AiSdkToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;\n\nexport type AiSdkToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;\n\nexport type AiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyAiSdkToolset<TInput, TMetadata>;\n\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\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\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\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\nexport type 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> = AiSdkHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> &\n (\n | {\n agent: AgentSource<TAgent>;\n task?: never;\n }\n | {\n task: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun>;\n agent?: never;\n }\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> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;\n session?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<NormalizedSession>;\n output?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<JsonValue | undefined>;\n usage?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<UsageSummary>;\n timings?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<TimingSummary | undefined>;\n errors?: (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<Array<Record<string, JsonValue>>>;\n prompt: HarnessPrompt;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\ntype AiSdkResultOverrides<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = Pick<\n AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n \"errors\" | \"output\" | \"session\" | \"timings\" | \"usage\"\n>;\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>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): Harness<TInput, TMetadata> {\n validateOptions(options);\n\n return {\n name: options.name ?? \"ai-sdk\",\n prompt: options.prompt,\n run: async (input, context) => {\n const agent = await resolveAgent(options);\n return runAiSdkHarness(options, agent, input, context);\n },\n };\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext<TMetadata>,\n): Promise<HarnessRun> {\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) && !hasResultOverrides(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);\n const usage = options.usage\n ? await options.usage(resultArgs)\n : resolveUsage(result, runtimeToolCalls.length);\n const session = options.session\n ? await options.session(resultArgs)\n : resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n\n return {\n session,\n output,\n usage,\n timings: options.timings ? await options.timings(resultArgs) : undefined,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: options.errors\n ? await options.errors(resultArgs)\n : resolveHarnessRunErrors(result),\n };\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 hasResultOverrides<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(options: AiSdkResultOverrides<TAgent, TInput, TMetadata, TResult, TTools>) {\n return Boolean(\n options.output ??\n options.session ??\n options.usage ??\n options.timings ??\n options.errors,\n );\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun> {\n if (options.task) {\n return options.task(args);\n }\n\n if (hasAiSdkRunMethod<TInput, TMetadata, TResult, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (hasAiSdkGenerateMethod<TInput, TMetadata, TResult, TTools>(args.agent)) {\n return args.agent.generate(args.input, args.runtime);\n }\n\n throw new Error(\n \"aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use task() for a custom entrypoint.\",\n );\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>) {\n const hasAgent = hasAgentSource(options);\n const hasTask = typeof (options as { task?: unknown }).task === \"function\";\n\n if (hasAgent && hasTask) {\n throw new Error(\n \"aiSdkHarness accepts either agent or task, not both. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or task for a custom entrypoint.\",\n );\n }\n\n if (!hasAgent && !hasTask) {\n throw new Error(\n \"aiSdkHarness requires either agent or task. Use agent for objects with run(input, runtime) or generate(input, runtime), or task for a custom entrypoint.\",\n );\n }\n}\n\nfunction hasAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n> & { agent: AgentSource<TAgent> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<TAgent>(\n agent: AgentSource<TAgent>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent();\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TMetadata, TResult, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TMetadata, TResult, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent>(\n agent: AgentSource<TAgent>,\n): agent is () => 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 toJsonValue(result);\n }\n\n const candidates = [\n \"output\",\n \"object\",\n \"experimental_output\",\n \"result\",\n \"text\",\n ] satisfies string[];\n\n for (const key of candidates) {\n const value = (result as Record<string, unknown>)[key];\n const normalized = toJsonValue(value);\n if (normalized !== undefined) {\n return normalized;\n }\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 const outputText = resolveOutputText(result, output, lastStep);\n\n return {\n messages,\n outputText,\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 resolveOutputText(\n result: unknown,\n output: JsonValue | undefined,\n lastStep: StepLike | undefined,\n) {\n if (lastStep?.text) {\n return lastStep.text;\n }\n\n if (\n result &&\n typeof result === \"object\" &&\n typeof (result as AiSdkLikeResult).text === \"string\"\n ) {\n return (result as AiSdkLikeResult).text;\n }\n\n return typeof output === \"string\" ? output : undefined;\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.9.0-beta.
|
|
3
|
+
"version": "0.9.0-beta.2",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"ai": "^6.0.141",
|
|
28
|
-
"vitest-evals": "0.9.0-beta.
|
|
28
|
+
"vitest-evals": "0.9.0-beta.2"
|
|
29
29
|
},
|
|
30
30
|
"scripts": {
|
|
31
31
|
"build": "tsup --config ./tsup.config.ts"
|