@vitest-evals/harness-ai-sdk 0.9.0-beta.3 → 0.9.0-beta.4

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 CHANGED
@@ -15,7 +15,12 @@ import { expect } from "vitest";
15
15
  import { generateText, stepCountIs } from "ai";
16
16
  import { openai } from "@ai-sdk/openai";
17
17
  import { aiSdkHarness } from "@vitest-evals/harness-ai-sdk";
18
- import { describeEval, toolCalls } from "vitest-evals";
18
+ import {
19
+ createJudge,
20
+ describeEval,
21
+ toolCalls,
22
+ type JudgeContext,
23
+ } from "vitest-evals";
19
24
 
20
25
  const tools = {
21
26
  lookupInvoice: {
@@ -29,19 +34,14 @@ const harness = aiSdkHarness({
29
34
  toolReplay: {
30
35
  lookupInvoice: true,
31
36
  },
32
- prompt: (input, options) =>
33
- generateText({
34
- model: openai("gpt-4o-mini"),
35
- system: options?.system,
36
- prompt: input,
37
- }).then((result) => result.text),
38
- task: ({ input, runtime }) =>
37
+ run: ({ input, runtime }) =>
39
38
  generateText({
40
39
  model: openai("gpt-4o-mini"),
41
40
  prompt: input,
42
41
  tools: runtime.tools,
43
42
  stopWhen: stepCountIs(5),
44
43
  }),
44
+ output: ({ result }) => parseRefundDecision(result.text),
45
45
  });
46
46
 
47
47
  describeEval("refund agent", { harness }, (it) => {
@@ -58,13 +58,17 @@ describeEval("refund agent", { harness }, (it) => {
58
58
  });
59
59
  ```
60
60
 
61
+ If `run()` already returns `{ output }` or a full `HarnessRun`, that typed
62
+ output is used directly. The `output` selector above is only for the raw
63
+ `generateText(...)` result path where the adapter should keep AI SDK
64
+ diagnostics while projecting provider text into app output.
65
+
61
66
  If your existing AI SDK app exposes its own entrypoint, wire that in directly:
62
67
 
63
68
  ```ts
64
69
  const harness = aiSdkHarness({
65
70
  tools,
66
- prompt: sharedJudgePrompt,
67
- task: ({ input, runtime }) => createRefundAgent().run(input, runtime),
71
+ run: ({ input, runtime }) => createRefundAgent().run(input, runtime),
68
72
  });
69
73
  ```
70
74
 
@@ -76,7 +80,6 @@ side-channel setup:
76
80
  ```ts
77
81
  const harness = aiSdkHarness({
78
82
  tools,
79
- prompt: sharedJudgePrompt,
80
83
  agent: ({ input, context }) =>
81
84
  createRefundAgent({
82
85
  instructions: buildInstructions(input),
@@ -85,16 +88,37 @@ const harness = aiSdkHarness({
85
88
  });
86
89
  ```
87
90
 
88
- The required `prompt` callback is passed to harness-backed judges as
89
- `JudgeContext.harness.prompt`, which lets rubric or factuality judges share the
90
- same provider/model configuration as the suite harness.
91
+ `run` executes the system under test. Judges are created separately; keep judge
92
+ prompts and model calls in the judge instead of putting a judge model call on
93
+ the app harness.
94
+
95
+ ```ts
96
+ const FactualityJudge = createJudge(
97
+ "FactualityJudge",
98
+ async (ctx: JudgeContext<string, RefundDecision>) => {
99
+ const verdict = await generateText({
100
+ model: openai("gpt-4o-mini"),
101
+ prompt: formatJudgePrompt({
102
+ input: ctx.input,
103
+ output: ctx.output,
104
+ }),
105
+ }).then((result) => result.text);
106
+
107
+ return parseJudgeVerdict(verdict);
108
+ },
109
+ );
110
+ ```
91
111
 
92
112
  The adapter infers:
93
113
 
94
114
  - normalized session and tool-call traces from AI SDK `steps`
95
115
  - usage diagnostics from `totalUsage` / `usage`
96
- - `run.output` from common AI SDK result fields such as `output`, `object`, and
97
- `text`
116
+ - typed `run.output` from explicit `run()` results that return `output`, from
117
+ common AI SDK provider fields such as `object` and `text`, or from a typed
118
+ `output` selector when the app deliberately returns a raw provider result
119
+ - native app output is accepted only when it is already JSON-safe; arbitrary
120
+ fields, primitive raw results, and non-JSON values require an explicit
121
+ `output` selector
98
122
  - replay/cassette metadata for local tools configured with `toolReplay`
99
123
 
100
124
  See the workspace demo app in `apps/demo-ai-sdk` and the RFC notes in
package/dist/index.d.mts CHANGED
@@ -1,10 +1,19 @@
1
- import { HarnessMetadata, HarnessContext, JsonValue, NormalizedSession, UsageSummary, TimingSummary, HarnessPrompt, HarnessRun, Harness } from 'vitest-evals/harness';
1
+ import { HarnessMetadata, HarnessContext, JsonValue, HarnessRun, Harness } from 'vitest-evals/harness';
2
2
  import { ReplayMode, ToolRecording, ToolReplayConfig } from 'vitest-evals/replay';
3
3
  import { ToolExecutionOptions, Tool, ToolExecuteFunction } from 'ai';
4
4
 
5
5
  type MaybePromise<T> = T | Promise<T>;
6
+ type JsonOutput<TValue> = [TValue] extends [JsonValue | undefined] ? TValue : undefined;
7
+ type ResultFieldOutput<TResult, TKey extends string> = TKey extends keyof TResult ? Record<string, never> extends Pick<TResult, TKey> ? JsonOutput<TResult[TKey]> | undefined : JsonOutput<TResult[TKey]> : undefined;
6
8
  type AgentSource<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = TAgent | ((args: AiSdkCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);
7
9
  type AnyAiSdkToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;
10
+ type AiSdkResultOutput<TResult> = TResult extends HarnessRun<infer TOutput> ? TOutput : "output" extends keyof TResult ? ResultFieldOutput<TResult, "output"> : "object" extends keyof TResult ? ResultFieldOutput<TResult, "object"> : "text" extends keyof TResult ? ResultFieldOutput<TResult, "text"> : undefined;
11
+ type AiSdkAgentResult<TAgent, TInput, TMetadata extends HarnessMetadata, TTools extends AiSdkToolset<TInput, TMetadata>> = TAgent extends {
12
+ run: (input: TInput, runtime: AiSdkRuntime<TTools, TInput, TMetadata>) => MaybePromise<infer TResult>;
13
+ } ? Awaited<TResult> : TAgent extends {
14
+ generate: (input: TInput, runtime: AiSdkRuntime<TTools, TInput, TMetadata>) => MaybePromise<infer TResult>;
15
+ } ? Awaited<TResult> : unknown;
16
+ /** Context passed to instrumented AI SDK tool executions. */
8
17
  interface AiSdkToolContext<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
9
18
  input: TInput;
10
19
  metadata: HarnessContext<TMetadata>["metadata"];
@@ -12,26 +21,37 @@ interface AiSdkToolContext<TInput = string, TMetadata extends HarnessMetadata =
12
21
  setArtifact: HarnessContext<TMetadata>["setArtifact"];
13
22
  execution: ToolExecutionOptions;
14
23
  }
24
+ /** Replay mode alias used by the AI SDK harness package. */
15
25
  type AiSdkReplayMode = ReplayMode;
26
+ /** Tool replay recording shape for AI SDK tools. */
16
27
  type AiSdkToolRecording<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue> = ToolRecording<TArgs, TResult>;
28
+ /** Replay configuration for an AI SDK tool. */
17
29
  type AiSdkToolReplayConfig<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput, TMetadata>>;
30
+ /** AI SDK tool definition accepted by the harness. */
18
31
  type AiSdkToolDefinition<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, _TInput = string, _TMetadata extends HarnessMetadata = HarnessMetadata> = Tool<TArgs, TResult>;
32
+ /** Replay policy for one AI SDK tool. */
19
33
  type AiSdkToolReplayPolicy<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;
34
+ /** Replay policy map keyed by AI SDK tool name. */
20
35
  type AiSdkToolReplayPolicies<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;
36
+ /** Toolset shape accepted by the AI SDK harness. */
21
37
  type AiSdkToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = AnyAiSdkToolset<TInput, TMetadata>;
38
+ /** Runtime toolset exposed to the system under test. */
22
39
  type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any, any>> = {
23
40
  [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<infer TArgs extends JsonValue, infer TResult extends JsonValue, infer _TInput, infer _TMetadata> ? Omit<TTools[K], "execute"> & {
24
41
  execute?: ToolExecuteFunction<TArgs, TResult>;
25
42
  } : TTools[K];
26
43
  };
44
+ /** Runtime object passed into AI SDK-style agent entrypoints. */
27
45
  interface AiSdkRuntime<TTools extends AiSdkToolset<TInput, TMetadata>, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
28
46
  tools: AiSdkRuntimeToolset<TTools>;
29
47
  signal?: AbortSignal;
30
48
  }
49
+ /** Arguments passed to per-run AI SDK agent factories. */
31
50
  interface AiSdkCreateAgentArgs<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
32
51
  input: TInput;
33
52
  context: HarnessContext<TMetadata>;
34
53
  }
54
+ /** Arguments passed to custom AI SDK harness run callbacks. */
35
55
  interface AiSdkHarnessRunArgs<TAgent, TInput, TMetadata extends HarnessMetadata, TTools extends AiSdkToolset<TInput, TMetadata>> {
36
56
  agent: TAgent | undefined;
37
57
  input: TInput;
@@ -39,27 +59,40 @@ interface AiSdkHarnessRunArgs<TAgent, TInput, TMetadata extends HarnessMetadata,
39
59
  runtime: AiSdkRuntime<TTools, TInput, TMetadata>;
40
60
  tools: AiSdkRuntimeToolset<TTools>;
41
61
  }
62
+ /** Arguments passed to AI SDK harness output selectors. */
42
63
  interface AiSdkHarnessResultArgs<TAgent, TInput, TMetadata extends HarnessMetadata, TResult, TTools extends AiSdkToolset<TInput, TMetadata>> extends AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {
43
64
  result: TResult;
44
65
  }
45
- type AiSdkHarnessOptions<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>> = AiSdkHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> & ({
66
+ type AiSdkHarnessOutputSelector<TAgent, TInput, TMetadata extends HarnessMetadata, TResult, TTools extends AiSdkToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined> = (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<TOutput>;
67
+ type AiSdkHarnessOptions<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined> = AiSdkHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> & ({
46
68
  agent: AgentSource<TAgent, TInput, TMetadata>;
47
- task?: never;
69
+ run?: never;
48
70
  } | {
49
- task: (args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult | HarnessRun>;
71
+ run: (args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult | HarnessRun<TOutput>>;
50
72
  agent?: never;
51
73
  });
52
- interface AiSdkHarnessBaseOptions<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>> {
74
+ type AiSdkHarnessOptionsWithOutput<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined> = AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> & {
75
+ output: AiSdkHarnessOutputSelector<TAgent, TInput, TMetadata, TResult, TTools, TOutput>;
76
+ };
77
+ type AiSdkHarnessRunOptionsWithoutOutput<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>> = AiSdkHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools, JsonValue | undefined> & {
78
+ run: (args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult>;
79
+ agent?: never;
80
+ output?: never;
81
+ };
82
+ type AiSdkHarnessAgentOptionsWithoutOutput<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>> = AiSdkHarnessBaseOptions<TAgent, TInput, TMetadata, unknown, TTools, JsonValue | undefined> & {
83
+ agent: AgentSource<TAgent, TInput, TMetadata>;
84
+ run?: never;
85
+ output?: never;
86
+ };
87
+ interface AiSdkHarnessBaseOptions<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined> {
53
88
  tools?: TTools;
54
89
  toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;
55
- session?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<NormalizedSession>;
56
- output?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<JsonValue | undefined>;
57
- usage?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<UsageSummary>;
58
- timings?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<TimingSummary | undefined>;
59
- errors?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<Array<Record<string, JsonValue>>>;
60
- prompt: HarnessPrompt;
90
+ output?: AiSdkHarnessOutputSelector<TAgent, TInput, TMetadata, TResult, TTools, TOutput>;
61
91
  name?: string;
62
92
  }
63
- 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>;
93
+ /** Adapts an AI SDK-style workflow into a normalized eval harness. */
94
+ declare function aiSdkHarness<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined>(options: AiSdkHarnessOptionsWithOutput<TAgent, TInput, TMetadata, TResult, TTools, TOutput>): Harness<TInput, TOutput, TMetadata>;
95
+ declare function aiSdkHarness<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>>(options: AiSdkHarnessRunOptionsWithoutOutput<TAgent, TInput, TMetadata, TResult, TTools>): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>, TMetadata>;
96
+ declare function aiSdkHarness<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>>(options: AiSdkHarnessAgentOptionsWithoutOutput<TAgent, TInput, TMetadata, TTools>): Harness<TInput, AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TMetadata, TTools>>, TMetadata>;
64
97
 
65
- export { type AiSdkCreateAgentArgs, 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 };
98
+ export { type AiSdkCreateAgentArgs, 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
@@ -1,10 +1,19 @@
1
- import { HarnessMetadata, HarnessContext, JsonValue, NormalizedSession, UsageSummary, TimingSummary, HarnessPrompt, HarnessRun, Harness } from 'vitest-evals/harness';
1
+ import { HarnessMetadata, HarnessContext, JsonValue, HarnessRun, Harness } from 'vitest-evals/harness';
2
2
  import { ReplayMode, ToolRecording, ToolReplayConfig } from 'vitest-evals/replay';
3
3
  import { ToolExecutionOptions, Tool, ToolExecuteFunction } from 'ai';
4
4
 
5
5
  type MaybePromise<T> = T | Promise<T>;
6
+ type JsonOutput<TValue> = [TValue] extends [JsonValue | undefined] ? TValue : undefined;
7
+ type ResultFieldOutput<TResult, TKey extends string> = TKey extends keyof TResult ? Record<string, never> extends Pick<TResult, TKey> ? JsonOutput<TResult[TKey]> | undefined : JsonOutput<TResult[TKey]> : undefined;
6
8
  type AgentSource<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = TAgent | ((args: AiSdkCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);
7
9
  type AnyAiSdkToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;
10
+ type AiSdkResultOutput<TResult> = TResult extends HarnessRun<infer TOutput> ? TOutput : "output" extends keyof TResult ? ResultFieldOutput<TResult, "output"> : "object" extends keyof TResult ? ResultFieldOutput<TResult, "object"> : "text" extends keyof TResult ? ResultFieldOutput<TResult, "text"> : undefined;
11
+ type AiSdkAgentResult<TAgent, TInput, TMetadata extends HarnessMetadata, TTools extends AiSdkToolset<TInput, TMetadata>> = TAgent extends {
12
+ run: (input: TInput, runtime: AiSdkRuntime<TTools, TInput, TMetadata>) => MaybePromise<infer TResult>;
13
+ } ? Awaited<TResult> : TAgent extends {
14
+ generate: (input: TInput, runtime: AiSdkRuntime<TTools, TInput, TMetadata>) => MaybePromise<infer TResult>;
15
+ } ? Awaited<TResult> : unknown;
16
+ /** Context passed to instrumented AI SDK tool executions. */
8
17
  interface AiSdkToolContext<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
9
18
  input: TInput;
10
19
  metadata: HarnessContext<TMetadata>["metadata"];
@@ -12,26 +21,37 @@ interface AiSdkToolContext<TInput = string, TMetadata extends HarnessMetadata =
12
21
  setArtifact: HarnessContext<TMetadata>["setArtifact"];
13
22
  execution: ToolExecutionOptions;
14
23
  }
24
+ /** Replay mode alias used by the AI SDK harness package. */
15
25
  type AiSdkReplayMode = ReplayMode;
26
+ /** Tool replay recording shape for AI SDK tools. */
16
27
  type AiSdkToolRecording<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue> = ToolRecording<TArgs, TResult>;
28
+ /** Replay configuration for an AI SDK tool. */
17
29
  type AiSdkToolReplayConfig<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput, TMetadata>>;
30
+ /** AI SDK tool definition accepted by the harness. */
18
31
  type AiSdkToolDefinition<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, _TInput = string, _TMetadata extends HarnessMetadata = HarnessMetadata> = Tool<TArgs, TResult>;
32
+ /** Replay policy for one AI SDK tool. */
19
33
  type AiSdkToolReplayPolicy<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;
34
+ /** Replay policy map keyed by AI SDK tool name. */
20
35
  type AiSdkToolReplayPolicies<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;
36
+ /** Toolset shape accepted by the AI SDK harness. */
21
37
  type AiSdkToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = AnyAiSdkToolset<TInput, TMetadata>;
38
+ /** Runtime toolset exposed to the system under test. */
22
39
  type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any, any>> = {
23
40
  [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<infer TArgs extends JsonValue, infer TResult extends JsonValue, infer _TInput, infer _TMetadata> ? Omit<TTools[K], "execute"> & {
24
41
  execute?: ToolExecuteFunction<TArgs, TResult>;
25
42
  } : TTools[K];
26
43
  };
44
+ /** Runtime object passed into AI SDK-style agent entrypoints. */
27
45
  interface AiSdkRuntime<TTools extends AiSdkToolset<TInput, TMetadata>, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
28
46
  tools: AiSdkRuntimeToolset<TTools>;
29
47
  signal?: AbortSignal;
30
48
  }
49
+ /** Arguments passed to per-run AI SDK agent factories. */
31
50
  interface AiSdkCreateAgentArgs<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
32
51
  input: TInput;
33
52
  context: HarnessContext<TMetadata>;
34
53
  }
54
+ /** Arguments passed to custom AI SDK harness run callbacks. */
35
55
  interface AiSdkHarnessRunArgs<TAgent, TInput, TMetadata extends HarnessMetadata, TTools extends AiSdkToolset<TInput, TMetadata>> {
36
56
  agent: TAgent | undefined;
37
57
  input: TInput;
@@ -39,27 +59,40 @@ interface AiSdkHarnessRunArgs<TAgent, TInput, TMetadata extends HarnessMetadata,
39
59
  runtime: AiSdkRuntime<TTools, TInput, TMetadata>;
40
60
  tools: AiSdkRuntimeToolset<TTools>;
41
61
  }
62
+ /** Arguments passed to AI SDK harness output selectors. */
42
63
  interface AiSdkHarnessResultArgs<TAgent, TInput, TMetadata extends HarnessMetadata, TResult, TTools extends AiSdkToolset<TInput, TMetadata>> extends AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {
43
64
  result: TResult;
44
65
  }
45
- type AiSdkHarnessOptions<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>> = AiSdkHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> & ({
66
+ type AiSdkHarnessOutputSelector<TAgent, TInput, TMetadata extends HarnessMetadata, TResult, TTools extends AiSdkToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined> = (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<TOutput>;
67
+ type AiSdkHarnessOptions<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined> = AiSdkHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> & ({
46
68
  agent: AgentSource<TAgent, TInput, TMetadata>;
47
- task?: never;
69
+ run?: never;
48
70
  } | {
49
- task: (args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult | HarnessRun>;
71
+ run: (args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult | HarnessRun<TOutput>>;
50
72
  agent?: never;
51
73
  });
52
- interface AiSdkHarnessBaseOptions<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>> {
74
+ type AiSdkHarnessOptionsWithOutput<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined> = AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> & {
75
+ output: AiSdkHarnessOutputSelector<TAgent, TInput, TMetadata, TResult, TTools, TOutput>;
76
+ };
77
+ type AiSdkHarnessRunOptionsWithoutOutput<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>> = AiSdkHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools, JsonValue | undefined> & {
78
+ run: (args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult>;
79
+ agent?: never;
80
+ output?: never;
81
+ };
82
+ type AiSdkHarnessAgentOptionsWithoutOutput<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>> = AiSdkHarnessBaseOptions<TAgent, TInput, TMetadata, unknown, TTools, JsonValue | undefined> & {
83
+ agent: AgentSource<TAgent, TInput, TMetadata>;
84
+ run?: never;
85
+ output?: never;
86
+ };
87
+ interface AiSdkHarnessBaseOptions<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined> {
53
88
  tools?: TTools;
54
89
  toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;
55
- session?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<NormalizedSession>;
56
- output?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<JsonValue | undefined>;
57
- usage?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<UsageSummary>;
58
- timings?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<TimingSummary | undefined>;
59
- errors?: (args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<Array<Record<string, JsonValue>>>;
60
- prompt: HarnessPrompt;
90
+ output?: AiSdkHarnessOutputSelector<TAgent, TInput, TMetadata, TResult, TTools, TOutput>;
61
91
  name?: string;
62
92
  }
63
- 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>;
93
+ /** Adapts an AI SDK-style workflow into a normalized eval harness. */
94
+ declare function aiSdkHarness<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined>(options: AiSdkHarnessOptionsWithOutput<TAgent, TInput, TMetadata, TResult, TTools, TOutput>): Harness<TInput, TOutput, TMetadata>;
95
+ declare function aiSdkHarness<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>>(options: AiSdkHarnessRunOptionsWithoutOutput<TAgent, TInput, TMetadata, TResult, TTools>): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>, TMetadata>;
96
+ declare function aiSdkHarness<TAgent = unknown, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<TInput, TMetadata>>(options: AiSdkHarnessAgentOptionsWithoutOutput<TAgent, TInput, TMetadata, TTools>): Harness<TInput, AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TMetadata, TTools>>, TMetadata>;
64
97
 
65
- export { type AiSdkCreateAgentArgs, 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 };
98
+ export { type AiSdkCreateAgentArgs, 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
@@ -27,9 +27,8 @@ var import_harness = require("vitest-evals/harness");
27
27
  var import_replay = require("vitest-evals/replay");
28
28
  function aiSdkHarness(options) {
29
29
  validateOptions(options);
30
- return {
30
+ const harness = {
31
31
  name: options.name ?? "ai-sdk",
32
- prompt: options.prompt,
33
32
  run: async (input, context) => {
34
33
  const agent = await resolveAgent(options, {
35
34
  input,
@@ -38,6 +37,7 @@ function aiSdkHarness(options) {
38
37
  return runAiSdkHarness(options, agent, input, context);
39
38
  }
40
39
  };
40
+ return harness;
41
41
  }
42
42
  async function runAiSdkHarness(options, agent, input, context) {
43
43
  const replayMetadataByToolCallId = /* @__PURE__ */ new Map();
@@ -62,7 +62,7 @@ async function runAiSdkHarness(options, agent, input, context) {
62
62
  runtime,
63
63
  tools
64
64
  });
65
- if ((0, import_harness.isHarnessRun)(result) && !hasResultOverrides(options)) {
65
+ if ((0, import_harness.isHarnessRun)(result) && !hasOutputSelector(options)) {
66
66
  if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {
67
67
  result.artifacts = context.artifacts;
68
68
  }
@@ -77,21 +77,21 @@ async function runAiSdkHarness(options, agent, input, context) {
77
77
  result
78
78
  };
79
79
  const output = options.output ? await options.output(resultArgs) : resolveOutput(result);
80
- const usage = options.usage ? await options.usage(resultArgs) : resolveUsage(result, runtimeToolCalls.length);
81
- const session = options.session ? await options.session(resultArgs) : resolveSession(
80
+ const usage = resolveUsage(result, runtimeToolCalls.length);
81
+ const session = resolveSession(
82
82
  input,
83
83
  result,
84
84
  output,
85
85
  replayMetadataByToolCallId,
86
86
  runtimeToolCalls
87
87
  );
88
+ const errors = (0, import_harness.resolveHarnessRunErrors)(result);
88
89
  return {
89
90
  session,
90
91
  output,
91
92
  usage,
92
- timings: options.timings ? await options.timings(resultArgs) : void 0,
93
93
  artifacts: Object.keys(context.artifacts).length > 0 ? context.artifacts : void 0,
94
- errors: options.errors ? await options.errors(resultArgs) : (0, import_harness.resolveHarnessRunErrors)(result)
94
+ errors
95
95
  };
96
96
  } catch (error) {
97
97
  const run = {
@@ -110,39 +110,40 @@ async function runAiSdkHarness(options, agent, input, context) {
110
110
  throw (0, import_harness.attachHarnessRunToError)(error, run);
111
111
  }
112
112
  }
113
- function hasResultOverrides(options) {
114
- return Boolean(
115
- options.output ?? options.session ?? options.usage ?? options.timings ?? options.errors
116
- );
113
+ function hasOutputSelector(options) {
114
+ return Boolean(options.output);
117
115
  }
118
116
  async function resolveAgent(options, args) {
119
117
  return hasAgentSource(options) ? await resolveAgentSource(options.agent, args) : void 0;
120
118
  }
121
119
  async function runAgent(options, args) {
122
- if (options.task) {
123
- return options.task(args);
120
+ if (options.run) {
121
+ return options.run(args);
124
122
  }
125
123
  if (hasAiSdkRunMethod(args.agent)) {
126
124
  return args.agent.run(args.input, args.runtime);
127
125
  }
128
- if (hasAiSdkGenerateMethod(args.agent)) {
126
+ if (hasAiSdkGenerateMethod(
127
+ args.agent
128
+ )) {
129
129
  return args.agent.generate(args.input, args.runtime);
130
130
  }
131
131
  throw new Error(
132
- "aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use task() for a custom entrypoint."
132
+ "aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use run() for a custom entrypoint."
133
133
  );
134
134
  }
135
135
  function validateOptions(options) {
136
136
  const hasAgent = hasAgentSource(options);
137
- const hasTask = typeof options.task === "function";
138
- if (hasAgent && hasTask) {
137
+ const hasRun = typeof options.run === "function";
138
+ const entrypoints = [hasAgent, hasRun].filter(Boolean).length;
139
+ if (entrypoints > 1) {
139
140
  throw new Error(
140
- "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."
141
+ "aiSdkHarness accepts exactly one of agent or run. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or run for a custom entrypoint."
141
142
  );
142
143
  }
143
- if (!hasAgent && !hasTask) {
144
+ if (entrypoints === 0) {
144
145
  throw new Error(
145
- "aiSdkHarness requires either agent or task. Use agent for objects with run(input, runtime) or generate(input, runtime), or task for a custom entrypoint."
146
+ "aiSdkHarness requires agent or run. Use agent for objects with run(input, runtime) or generate(input, runtime), or run for a custom entrypoint."
146
147
  );
147
148
  }
148
149
  }
@@ -285,24 +286,55 @@ async function executeToolWithReplay({
285
286
  }
286
287
  function resolveOutput(result) {
287
288
  if (!result || typeof result !== "object") {
288
- return (0, import_harness.toJsonValue)(result);
289
+ return void 0;
289
290
  }
290
- const candidates = [
291
- "output",
292
- "object",
293
- "experimental_output",
294
- "result",
295
- "text"
296
- ];
291
+ const candidates = ["output", "object", "text"];
292
+ const resultRecord = result;
297
293
  for (const key of candidates) {
298
- const value = result[key];
299
- const normalized = (0, import_harness.toJsonValue)(value);
300
- if (normalized !== void 0) {
301
- return normalized;
294
+ if (Object.prototype.hasOwnProperty.call(resultRecord, key)) {
295
+ return toOutputValue(resultRecord[key]);
302
296
  }
303
297
  }
304
298
  return void 0;
305
299
  }
300
+ function toOutputValue(value) {
301
+ if (value === void 0) {
302
+ return void 0;
303
+ }
304
+ if (value === null || typeof value === "string" || typeof value === "boolean") {
305
+ return value;
306
+ }
307
+ if (typeof value === "number") {
308
+ return Number.isFinite(value) ? value : void 0;
309
+ }
310
+ if (Array.isArray(value)) {
311
+ const items = [];
312
+ for (const item of value) {
313
+ const normalized = toOutputValue(item);
314
+ if (normalized === void 0) {
315
+ return void 0;
316
+ }
317
+ items.push(normalized);
318
+ }
319
+ return items;
320
+ }
321
+ if (typeof value === "object") {
322
+ const prototype = Object.getPrototypeOf(value);
323
+ if (prototype !== Object.prototype && prototype !== null) {
324
+ return void 0;
325
+ }
326
+ const record = {};
327
+ for (const [key, entry] of Object.entries(value)) {
328
+ const normalized = toOutputValue(entry);
329
+ if (normalized === void 0) {
330
+ return void 0;
331
+ }
332
+ record[key] = normalized;
333
+ }
334
+ return record;
335
+ }
336
+ return void 0;
337
+ }
306
338
  function resolveUsage(result, runtimeToolCallCount = 0) {
307
339
  const steps = resolveSteps(result);
308
340
  const usage = resolveLanguageModelUsage(result) ?? resolveStepUsage(steps);
@@ -428,10 +460,8 @@ function resolveSession(input, result, output, replayMetadataByToolCallId, runti
428
460
  });
429
461
  }
430
462
  const lastStep = steps.length > 0 ? steps[steps.length - 1] : void 0;
431
- const outputText = resolveOutputText(result, output, lastStep);
432
463
  return {
433
464
  messages,
434
- outputText,
435
465
  provider: lastStep?.model.provider,
436
466
  model: lastStep?.model.modelId
437
467
  };
@@ -473,15 +503,6 @@ function resolveLanguageModelUsage(result) {
473
503
  const aiResult = result;
474
504
  return aiResult.totalUsage ?? aiResult.usage;
475
505
  }
476
- function resolveOutputText(result, output, lastStep) {
477
- if (lastStep?.text) {
478
- return lastStep.text;
479
- }
480
- if (result && typeof result === "object" && typeof result.text === "string") {
481
- return result.text;
482
- }
483
- return typeof output === "string" ? output : void 0;
484
- }
485
506
  function normalizeStep(step, replayMetadataByToolCallId) {
486
507
  const toolResultsById = new Map(
487
508
  (step.toolResults ?? []).map((toolResult) => [
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<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;\n\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 AiSdkCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\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, TInput, TMetadata>;\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 input,\n context,\n });\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>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n 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, TInput, TMetadata> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n 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, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) => MaybePromise<TAgent> {\n return (\n typeof agent === \"function\" &&\n !hasCallableMethod(agent, \"run\") &&\n !hasCallableMethod(agent, \"generate\")\n );\n}\n\nfunction createToolset<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput, TMetadata> | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeToolCalls: ToolCallRecord[];\n}) {\n return Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => {\n const replay = toolReplay?.[toolName];\n\n if (replay && !tool.execute) {\n throw new Error(\n `Tool replay requires execute() for ${toolName}. Provider-executed tools cannot be recorded automatically.`,\n );\n }\n\n if (!tool.execute) {\n return [toolName, tool];\n }\n\n const execute = tool.execute;\n const wrappedTool = {\n ...tool,\n execute: async (\n toolInput: InferToolInput<typeof tool>,\n execution: ToolExecutionOptions,\n ) => {\n const startedAt = new Date();\n const normalizedArgs = normalizeArguments(toolInput);\n const replayContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput, TMetadata>;\n\n try {\n const executionResult = replay\n ? await executeToolWithReplay({\n toolName,\n toolInput,\n execute,\n execution,\n context: replayContext,\n replay,\n })\n : {\n result: await execute(toolInput, execution),\n replay: undefined,\n };\n const finishedAt = new Date();\n const normalizedResult = toJsonValue(executionResult.result);\n const replayMetadata = normalizeReplayMetadata(\n executionResult.replay,\n );\n\n if (executionResult.replay) {\n replayMetadataByToolCallId.set(\n execution.toolCallId,\n executionResult.replay,\n );\n }\n\n runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n ...(normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\n });\n\n return executionResult.result as InferToolOutput<typeof tool>;\n } catch (error) {\n const replay = getReplayMetadataFromError(error);\n const finishedAt = new Date();\n const replayMetadata = normalizeReplayMetadata(replay);\n\n if (replay) {\n replayMetadataByToolCallId.set(execution.toolCallId, replay);\n }\n\n runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n error: normalizeError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\n });\n throw error;\n }\n },\n } satisfies typeof tool;\n\n return [toolName, wrappedTool];\n }),\n ) as AiSdkRuntimeToolset<TTools>;\n}\n\nasync function executeToolWithReplay<\n TInput,\n TMetadata extends HarnessMetadata,\n TTool extends AiSdkToolDefinition<any, any, TInput, TMetadata>,\n>({\n toolName,\n toolInput,\n execute,\n execution,\n context,\n replay,\n}: {\n toolName: string;\n toolInput: InferToolInput<TTool>;\n execute: NonNullable<TTool[\"execute\"]>;\n execution: ToolExecutionOptions;\n context: AiSdkToolContext<TInput, TMetadata>;\n replay: AiSdkToolReplayPolicy<TInput, TMetadata>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<\n JsonValue,\n JsonValue,\n AiSdkToolContext<TInput, TMetadata>\n >({\n toolName,\n args: replayInput,\n context,\n execute: async (replayedInput) => {\n const output = await execute(\n replayedInput as InferToolInput<TTool>,\n execution,\n );\n\n if (isAsyncIterable(output)) {\n throw new Error(\n `Tool replay only supports JSON-serializable outputs. ${toolName} returned an async iterable.`,\n );\n }\n\n return toReplayJsonValue(output, `${toolName} tool output`);\n },\n replay,\n });\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return 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"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n attachHarnessRunToError,\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport {\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 JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;\n\ntype StepLike = Pick<\n StepResult<ToolSet>,\n | \"content\"\n | \"finishReason\"\n | \"model\"\n | \"rawFinishReason\"\n | \"reasoningText\"\n | \"response\"\n | \"stepNumber\"\n | \"text\"\n | \"toolCalls\"\n | \"toolResults\"\n | \"usage\"\n>;\n\ntype AiSdkLikeResult = {\n steps?: StepLike[];\n usage?: LanguageModelUsage;\n totalUsage?: LanguageModelUsage;\n output?: unknown;\n object?: unknown;\n text?: string;\n session?: NormalizedSession;\n trace?: NormalizedSession;\n errors?: Array<Record<string, JsonValue>>;\n};\n\ntype AiSdkResultOutput<TResult> = TResult extends HarnessRun<infer TOutput>\n ? TOutput\n : \"output\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"output\">\n : \"object\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"object\">\n : \"text\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"text\">\n : undefined;\ntype AiSdkAgentResult<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : TAgent extends {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n }\n ? Awaited<TResult>\n : unknown;\n\n/** Context passed to instrumented AI SDK tool executions. */\nexport interface AiSdkToolContext<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n metadata: HarnessContext<TMetadata>[\"metadata\"];\n signal?: AbortSignal;\n setArtifact: HarnessContext<TMetadata>[\"setArtifact\"];\n execution: ToolExecutionOptions;\n}\n\n/** Replay mode alias used by the AI SDK harness package. */\nexport type AiSdkReplayMode = ReplayMode;\n\n/** Tool replay recording shape for AI SDK tools. */\nexport type AiSdkToolRecording<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for an AI SDK tool. */\nexport type AiSdkToolReplayConfig<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput, TMetadata>>;\n\n/** AI SDK tool definition accepted by the harness. */\nexport type AiSdkToolDefinition<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n _TInput = string,\n _TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Tool<TArgs, TResult>;\n\n/** Replay policy for one AI SDK tool. */\nexport type AiSdkToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;\n\n/** Replay policy map keyed by AI SDK tool name. */\nexport type AiSdkToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;\n\n/** Toolset shape accepted by the AI SDK harness. */\nexport type AiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyAiSdkToolset<TInput, TMetadata>;\n\n/** Runtime toolset exposed to the system under test. */\nexport type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any, any>> = {\n [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<\n infer TArgs extends JsonValue,\n infer TResult extends JsonValue,\n infer _TInput,\n infer _TMetadata\n >\n ? Omit<TTools[K], \"execute\"> & {\n execute?: ToolExecuteFunction<TArgs, TResult>;\n }\n : TTools[K];\n};\n\n/** Runtime object passed into AI SDK-style agent entrypoints. */\nexport interface AiSdkRuntime<\n TTools extends AiSdkToolset<TInput, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n tools: AiSdkRuntimeToolset<TTools>;\n signal?: AbortSignal;\n}\n\n/** Arguments passed to per-run AI SDK agent factories. */\nexport interface AiSdkCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\n}\n\n/** Arguments passed to custom AI SDK harness run callbacks. */\nexport interface AiSdkHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> {\n agent: TAgent | undefined;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>;\n tools: AiSdkRuntimeToolset<TTools>;\n}\n\n/** Arguments passed to AI SDK harness output selectors. */\nexport interface AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> extends AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\ntype AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n> = (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype AiSdkHarnessOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> &\n (\n | {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n }\n | {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n agent?: never;\n }\n );\n\ntype AiSdkHarnessOptionsWithOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> & {\n output: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n};\n\ntype AiSdkHarnessRunOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult>;\n agent?: never;\n output?: never;\n};\n\ntype AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n output?: never;\n};\n\ninterface AiSdkHarnessBaseOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;\n output?: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\n/** Adapts an AI SDK-style workflow into a normalized eval harness. */\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TTools\n >,\n): Harness<\n TInput,\n AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TMetadata, TTools>>,\n TMetadata\n>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata> {\n validateOptions(options);\n\n const harness: Harness<TInput, TOutput, TMetadata> = {\n name: options.name ?? \"ai-sdk\",\n run: async (input, context) => {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n return runAiSdkHarness(options, agent, input, context);\n },\n };\n\n return harness;\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext<TMetadata>,\n): Promise<HarnessRun<TOutput>> {\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const runtimeToolCalls: ToolCallRecord[] = [];\n const tools = createToolset({\n input,\n context,\n tools: options.tools,\n toolReplay: options.toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n });\n const runtime = {\n tools,\n signal: context.signal,\n } satisfies AiSdkRuntime<TTools, TInput, TMetadata>;\n\n try {\n const result = await runAgent(options, {\n agent,\n input,\n context,\n runtime,\n tools,\n });\n\n if (isHarnessRun(result) && !hasOutputSelector(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n return result;\n }\n\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n tools,\n result: result as TResult,\n } satisfies AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(result) as TOutput | undefined);\n const usage = resolveUsage(result, runtimeToolCalls.length);\n const session = resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n const errors = resolveHarnessRunErrors(result);\n\n return {\n session,\n output,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors,\n } as HarnessRun<TOutput>;\n } catch (error) {\n const run = {\n session: resolveSession(\n input,\n undefined,\n undefined,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n ),\n output: undefined,\n usage:\n runtimeToolCalls.length > 0\n ? { toolCalls: runtimeToolCalls.length }\n : {},\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializeError(error)],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n return Boolean(options.output);\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (\n hasAiSdkRunMethod<TInput, TMetadata, TResult, TOutput, TTools>(args.agent)\n ) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (\n hasAiSdkGenerateMethod<TInput, TMetadata, TResult, TOutput, TTools>(\n args.agent,\n )\n ) {\n return args.agent.generate(args.input, args.runtime);\n }\n\n throw new Error(\n \"aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use run() for a custom entrypoint.\",\n );\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n const hasAgent = hasAgentSource(options);\n const hasRun = typeof (options as { run?: unknown }).run === \"function\";\n const entrypoints = [hasAgent, hasRun].filter(Boolean).length;\n\n if (entrypoints > 1) {\n throw new Error(\n \"aiSdkHarness accepts exactly one of agent or run. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or run for a custom entrypoint.\",\n );\n }\n\n if (entrypoints === 0) {\n throw new Error(\n \"aiSdkHarness requires agent or run. Use agent for objects with run(input, runtime) or generate(input, runtime), or run for a custom entrypoint.\",\n );\n }\n}\n\nfunction hasAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & { agent: AgentSource<TAgent, TInput, TMetadata> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) => MaybePromise<TAgent> {\n return (\n typeof agent === \"function\" &&\n !hasCallableMethod(agent, \"run\") &&\n !hasCallableMethod(agent, \"generate\")\n );\n}\n\nfunction createToolset<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput, TMetadata> | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeToolCalls: ToolCallRecord[];\n}) {\n return Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => {\n const replay = toolReplay?.[toolName];\n\n if (replay && !tool.execute) {\n throw new Error(\n `Tool replay requires execute() for ${toolName}. Provider-executed tools cannot be recorded automatically.`,\n );\n }\n\n if (!tool.execute) {\n return [toolName, tool];\n }\n\n const execute = tool.execute;\n const wrappedTool = {\n ...tool,\n execute: async (\n toolInput: InferToolInput<typeof tool>,\n execution: ToolExecutionOptions,\n ) => {\n const startedAt = new Date();\n const normalizedArgs = normalizeArguments(toolInput);\n const replayContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput, TMetadata>;\n\n try {\n const executionResult = replay\n ? await executeToolWithReplay({\n toolName,\n toolInput,\n execute,\n execution,\n context: replayContext,\n replay,\n })\n : {\n result: await execute(toolInput, execution),\n replay: undefined,\n };\n const finishedAt = new Date();\n const normalizedResult = toJsonValue(executionResult.result);\n const replayMetadata = normalizeReplayMetadata(\n executionResult.replay,\n );\n\n if (executionResult.replay) {\n replayMetadataByToolCallId.set(\n execution.toolCallId,\n executionResult.replay,\n );\n }\n\n runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n ...(normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\n });\n\n return executionResult.result as InferToolOutput<typeof tool>;\n } catch (error) {\n const replay = getReplayMetadataFromError(error);\n const finishedAt = new Date();\n const replayMetadata = normalizeReplayMetadata(replay);\n\n if (replay) {\n replayMetadataByToolCallId.set(execution.toolCallId, replay);\n }\n\n runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n error: normalizeError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\n });\n throw error;\n }\n },\n } satisfies typeof tool;\n\n return [toolName, wrappedTool];\n }),\n ) as AiSdkRuntimeToolset<TTools>;\n}\n\nasync function executeToolWithReplay<\n TInput,\n TMetadata extends HarnessMetadata,\n TTool extends AiSdkToolDefinition<any, any, TInput, TMetadata>,\n>({\n toolName,\n toolInput,\n execute,\n execution,\n context,\n replay,\n}: {\n toolName: string;\n toolInput: InferToolInput<TTool>;\n execute: NonNullable<TTool[\"execute\"]>;\n execution: ToolExecutionOptions;\n context: AiSdkToolContext<TInput, TMetadata>;\n replay: AiSdkToolReplayPolicy<TInput, TMetadata>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<\n JsonValue,\n JsonValue,\n AiSdkToolContext<TInput, TMetadata>\n >({\n toolName,\n args: replayInput,\n context,\n execute: async (replayedInput) => {\n const output = await execute(\n replayedInput as InferToolInput<TTool>,\n execution,\n );\n\n if (isAsyncIterable(output)) {\n throw new Error(\n `Tool replay only supports JSON-serializable outputs. ${toolName} returned an async iterable.`,\n );\n }\n\n return toReplayJsonValue(output, `${toolName} tool output`);\n },\n replay,\n });\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const candidates = [\"output\", \"object\", \"text\"] satisfies string[];\n const resultRecord = result as Record<string, unknown>;\n\n for (const key of candidates) {\n if (Object.prototype.hasOwnProperty.call(resultRecord, key)) {\n return toOutputValue(resultRecord[key]);\n }\n }\n\n return undefined;\n}\n\n// Keep this adapter-local rather than exporting a core helper. Core\n// `toJsonValue` normalizes trace data; inferred app output should only accept\n// values that are already JSON-safe so the public contract stays explicit.\n// Invalid nested values reject the whole candidate instead of being patched.\nfunction toOutputValue(value: unknown): JsonValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (Array.isArray(value)) {\n const items: JsonValue[] = [];\n for (const item of value) {\n const normalized = toOutputValue(item);\n if (normalized === undefined) {\n return undefined;\n }\n items.push(normalized);\n }\n return items;\n }\n\n if (typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return undefined;\n }\n\n const record: Record<string, JsonValue> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = toOutputValue(entry);\n if (normalized === undefined) {\n return undefined;\n }\n record[key] = normalized;\n }\n return record;\n }\n\n return undefined;\n}\n\nfunction resolveUsage(result: unknown, runtimeToolCallCount = 0): UsageSummary {\n const steps = resolveSteps(result);\n const usage = resolveLanguageModelUsage(result) ?? resolveStepUsage(steps);\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n if (!usage) {\n if (steps.length > 0) {\n const toolCallCount = countStepToolCalls(steps);\n\n return {\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n ...(toolCallCount > 0 ? { toolCalls: toolCallCount } : {}),\n };\n }\n\n return runtimeToolCallCount > 0 ? { toolCalls: runtimeToolCallCount } : {};\n }\n\n const stepToolCallCount = countStepToolCalls(steps);\n const toolCallCount =\n stepToolCallCount > 0 ? stepToolCallCount : runtimeToolCallCount;\n\n return {\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens:\n usage.outputTokenDetails?.reasoningTokens ?? usage.reasoningTokens,\n totalTokens:\n usage.totalTokens ?? (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),\n toolCalls: toolCallCount > 0 ? toolCallCount : undefined,\n metadata: normalizeMetadata({\n cacheReadTokens:\n usage.inputTokenDetails?.cacheReadTokens ?? usage.cachedInputTokens,\n cacheWriteTokens: usage.inputTokenDetails?.cacheWriteTokens,\n raw: usage.raw,\n }),\n };\n}\n\nfunction resolveStepUsage(steps: StepLike[]): LanguageModelUsage | undefined {\n const usages = steps\n .map((step) => step.usage)\n .filter((usage): usage is LanguageModelUsage => Boolean(usage));\n\n if (usages.length === 0) {\n return undefined;\n }\n\n return usages.reduce(addLanguageModelUsage);\n}\n\nfunction addLanguageModelUsage(\n left: LanguageModelUsage,\n right: LanguageModelUsage,\n): LanguageModelUsage {\n return {\n inputTokens: addTokenCounts(left.inputTokens, right.inputTokens),\n inputTokenDetails: {\n noCacheTokens: addTokenCounts(\n left.inputTokenDetails?.noCacheTokens,\n right.inputTokenDetails?.noCacheTokens,\n ),\n cacheReadTokens: addTokenCounts(\n left.inputTokenDetails?.cacheReadTokens,\n right.inputTokenDetails?.cacheReadTokens,\n ),\n cacheWriteTokens: addTokenCounts(\n left.inputTokenDetails?.cacheWriteTokens,\n right.inputTokenDetails?.cacheWriteTokens,\n ),\n },\n outputTokens: addTokenCounts(left.outputTokens, right.outputTokens),\n outputTokenDetails: {\n textTokens: addTokenCounts(\n left.outputTokenDetails?.textTokens,\n right.outputTokenDetails?.textTokens,\n ),\n reasoningTokens: addTokenCounts(\n left.outputTokenDetails?.reasoningTokens,\n right.outputTokenDetails?.reasoningTokens,\n ),\n },\n totalTokens: addTokenCounts(left.totalTokens, right.totalTokens),\n reasoningTokens: addTokenCounts(\n left.reasoningTokens,\n right.reasoningTokens,\n ),\n cachedInputTokens: addTokenCounts(\n left.cachedInputTokens,\n right.cachedInputTokens,\n ),\n };\n}\n\nfunction addTokenCounts(left: number | undefined, right: number | undefined) {\n return left == null && right == null ? undefined : (left ?? 0) + (right ?? 0);\n}\n\nfunction countStepToolCalls(steps: StepLike[]) {\n return steps.reduce(\n (count, step) => count + (step.toolCalls?.length ?? 0),\n 0,\n );\n}\n\nfunction resolveSession(\n input: unknown,\n result: unknown,\n output: JsonValue | undefined,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n runtimeToolCalls: ToolCallRecord[] = [],\n): NormalizedSession {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return (result as { session: NormalizedSession }).session;\n }\n\n if (\n isNormalizedSession((result as Record<string, unknown> | undefined)?.trace)\n ) {\n return (result as { trace: NormalizedSession }).trace;\n }\n\n const steps = resolveSteps(result);\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const stepToolCallIds = new Set<string>();\n\n for (const step of steps) {\n for (const toolCall of step.toolCalls ?? []) {\n stepToolCallIds.add(toolCall.toolCallId);\n }\n messages.push(...normalizeStep(step, replayMetadataByToolCallId));\n }\n\n const unmatchedRuntimeToolCalls = runtimeToolCalls.filter(\n (call) => call.id === undefined || !stepToolCallIds.has(call.id),\n );\n\n if (unmatchedRuntimeToolCalls.length > 0) {\n messages.push(...normalizeRuntimeToolCalls(unmatchedRuntimeToolCalls));\n }\n\n if (\n output !== undefined &&\n !messages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n messages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n return {\n messages,\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n };\n}\n\nfunction normalizeRuntimeToolCalls(\n runtimeToolCalls: ToolCallRecord[],\n): NormalizedMessage[] {\n const messages: NormalizedMessage[] = [\n {\n role: \"assistant\",\n toolCalls: runtimeToolCalls,\n },\n ];\n\n for (const call of runtimeToolCalls) {\n if (call.result === undefined && !call.error) {\n continue;\n }\n\n const content =\n call.result !== undefined\n ? call.result\n : call.error && call.error.message.length > 0\n ? call.error.message\n : undefined;\n\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: call.name,\n toolCallId: call.id,\n isError: Boolean(call.error),\n }),\n });\n }\n\n return messages;\n}\n\nfunction resolveSteps(result: unknown): StepLike[] {\n if (!result || typeof result !== \"object\") {\n return [];\n }\n\n return Array.isArray((result as AiSdkLikeResult).steps)\n ? ((result as AiSdkLikeResult).steps ?? [])\n : [];\n}\n\nfunction resolveLanguageModelUsage(\n result: unknown,\n): LanguageModelUsage | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const aiResult = result as AiSdkLikeResult;\n return aiResult.totalUsage ?? aiResult.usage;\n}\n\nfunction normalizeStep(\n step: StepLike,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): NormalizedMessage[] {\n const toolResultsById = new Map(\n (step.toolResults ?? []).map((toolResult) => [\n toolResult.toolCallId,\n toolResult,\n ]),\n );\n\n const normalizedCalls = (step.toolCalls ?? []).map((toolCall) =>\n normalizeToolCall(toolCall, toolResultsById, replayMetadataByToolCallId),\n );\n const normalizedCallsById = new Map(\n normalizedCalls.map((toolCall) => [toolCall.id, toolCall]),\n );\n const assistantMetadata = normalizeMetadata({\n stepNumber: step.stepNumber,\n finishReason: step.finishReason,\n rawFinishReason: step.rawFinishReason,\n reasoningText: step.reasoningText,\n response: step.response,\n });\n const messages: NormalizedMessage[] = [];\n\n if (step.text || normalizedCalls.length > 0 || assistantMetadata) {\n messages.push({\n role: \"assistant\",\n ...(step.text ? { content: step.text } : {}),\n ...(normalizedCalls.length > 0 ? { toolCalls: normalizedCalls } : {}),\n ...(assistantMetadata ? { metadata: assistantMetadata } : {}),\n });\n }\n\n for (const toolResult of step.toolResults ?? []) {\n const content =\n toolResult.output === undefined\n ? undefined\n : normalizeContent(toolResult.output);\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: toolResult.toolName,\n toolCallId: toolResult.toolCallId,\n isError: Boolean(normalizedCallsById.get(toolResult.toolCallId)?.error),\n preliminary: toolResult.preliminary,\n providerExecuted: toolResult.providerExecuted,\n title: toolResult.title,\n providerMetadata: toolResult.providerMetadata,\n }),\n });\n }\n\n return messages;\n}\n\nfunction normalizeToolCall(\n toolCall: StepLike[\"toolCalls\"][number],\n toolResultsById: Map<string, StepLike[\"toolResults\"][number]>,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): ToolCallRecord {\n const toolResult = toolResultsById.get(toolCall.toolCallId);\n const normalizedArguments = normalizeArguments(toolCall.input);\n const normalizedResult =\n toolResult !== undefined ? toJsonValue(toolResult.output) : undefined;\n const errorValue =\n toolCall.invalid || toolCall.error !== undefined\n ? normalizeError(toolCall.error ?? toolCall.invalid)\n : undefined;\n const replayMetadata = normalizeReplayMetadata(\n replayMetadataByToolCallId.get(toolCall.toolCallId),\n );\n\n return {\n id: toolCall.toolCallId,\n name: toolCall.toolName,\n ...(normalizedArguments ? { arguments: normalizedArguments } : {}),\n ...(toolResult && normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n ...(errorValue ? { error: errorValue } : {}),\n metadata: normalizeMetadata({\n providerExecuted:\n toolCall.providerExecuted ?? toolResult?.providerExecuted,\n title: toolCall.title ?? toolResult?.title,\n dynamic: toolCall.dynamic,\n invalid: toolCall.invalid,\n preliminary: toolResult?.preliminary,\n providerMetadata:\n toolCall.providerMetadata ?? toolResult?.providerMetadata,\n ...(replayMetadata ?? {}),\n }),\n };\n}\n\nfunction normalizeArguments(\n value: unknown,\n): Record<string, JsonValue> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n return normalizeRecord(value as Record<string, unknown>);\n}\n\nfunction normalizeError(error: unknown) {\n if (error instanceof Error) {\n return {\n type: error.name,\n message: error.message,\n };\n }\n\n const normalized = toJsonValue(error);\n if (\n normalized &&\n typeof normalized === \"object\" &&\n !Array.isArray(normalized) &&\n typeof normalized.message === \"string\"\n ) {\n return {\n message: normalized.message,\n type: typeof normalized.type === \"string\" ? normalized.type : \"Error\",\n };\n }\n\n return {\n type: \"Error\",\n message: String(error ?? \"Unknown tool call error\"),\n };\n}\n\nfunction toReplayJsonValue(value: unknown, label: string): JsonValue {\n const normalized = toJsonValue(value);\n if (normalized === undefined) {\n throw new Error(\n `Tool replay only supports JSON-serializable values. ${label} could not be normalized.`,\n );\n }\n\n return normalized;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n Symbol.asyncIterator in value\n );\n}\n"],"mappings":"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","names":["replay","toolCallCount"]}
package/dist/index.mjs CHANGED
@@ -1,5 +1,6 @@
1
1
  // src/index.ts
2
2
  import {
3
+ attachHarnessRunToError,
3
4
  hasCallableMethod,
4
5
  isHarnessRun,
5
6
  isNormalizedSession,
@@ -8,8 +9,7 @@ import {
8
9
  normalizeRecord,
9
10
  resolveHarnessRunErrors,
10
11
  serializeError,
11
- toJsonValue,
12
- attachHarnessRunToError
12
+ toJsonValue
13
13
  } from "vitest-evals/harness";
14
14
  import {
15
15
  executeWithReplay,
@@ -18,9 +18,8 @@ import {
18
18
  } from "vitest-evals/replay";
19
19
  function aiSdkHarness(options) {
20
20
  validateOptions(options);
21
- return {
21
+ const harness = {
22
22
  name: options.name ?? "ai-sdk",
23
- prompt: options.prompt,
24
23
  run: async (input, context) => {
25
24
  const agent = await resolveAgent(options, {
26
25
  input,
@@ -29,6 +28,7 @@ function aiSdkHarness(options) {
29
28
  return runAiSdkHarness(options, agent, input, context);
30
29
  }
31
30
  };
31
+ return harness;
32
32
  }
33
33
  async function runAiSdkHarness(options, agent, input, context) {
34
34
  const replayMetadataByToolCallId = /* @__PURE__ */ new Map();
@@ -53,7 +53,7 @@ async function runAiSdkHarness(options, agent, input, context) {
53
53
  runtime,
54
54
  tools
55
55
  });
56
- if (isHarnessRun(result) && !hasResultOverrides(options)) {
56
+ if (isHarnessRun(result) && !hasOutputSelector(options)) {
57
57
  if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {
58
58
  result.artifacts = context.artifacts;
59
59
  }
@@ -68,21 +68,21 @@ async function runAiSdkHarness(options, agent, input, context) {
68
68
  result
69
69
  };
70
70
  const output = options.output ? await options.output(resultArgs) : resolveOutput(result);
71
- const usage = options.usage ? await options.usage(resultArgs) : resolveUsage(result, runtimeToolCalls.length);
72
- const session = options.session ? await options.session(resultArgs) : resolveSession(
71
+ const usage = resolveUsage(result, runtimeToolCalls.length);
72
+ const session = resolveSession(
73
73
  input,
74
74
  result,
75
75
  output,
76
76
  replayMetadataByToolCallId,
77
77
  runtimeToolCalls
78
78
  );
79
+ const errors = resolveHarnessRunErrors(result);
79
80
  return {
80
81
  session,
81
82
  output,
82
83
  usage,
83
- timings: options.timings ? await options.timings(resultArgs) : void 0,
84
84
  artifacts: Object.keys(context.artifacts).length > 0 ? context.artifacts : void 0,
85
- errors: options.errors ? await options.errors(resultArgs) : resolveHarnessRunErrors(result)
85
+ errors
86
86
  };
87
87
  } catch (error) {
88
88
  const run = {
@@ -101,39 +101,40 @@ async function runAiSdkHarness(options, agent, input, context) {
101
101
  throw attachHarnessRunToError(error, run);
102
102
  }
103
103
  }
104
- function hasResultOverrides(options) {
105
- return Boolean(
106
- options.output ?? options.session ?? options.usage ?? options.timings ?? options.errors
107
- );
104
+ function hasOutputSelector(options) {
105
+ return Boolean(options.output);
108
106
  }
109
107
  async function resolveAgent(options, args) {
110
108
  return hasAgentSource(options) ? await resolveAgentSource(options.agent, args) : void 0;
111
109
  }
112
110
  async function runAgent(options, args) {
113
- if (options.task) {
114
- return options.task(args);
111
+ if (options.run) {
112
+ return options.run(args);
115
113
  }
116
114
  if (hasAiSdkRunMethod(args.agent)) {
117
115
  return args.agent.run(args.input, args.runtime);
118
116
  }
119
- if (hasAiSdkGenerateMethod(args.agent)) {
117
+ if (hasAiSdkGenerateMethod(
118
+ args.agent
119
+ )) {
120
120
  return args.agent.generate(args.input, args.runtime);
121
121
  }
122
122
  throw new Error(
123
- "aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use task() for a custom entrypoint."
123
+ "aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use run() for a custom entrypoint."
124
124
  );
125
125
  }
126
126
  function validateOptions(options) {
127
127
  const hasAgent = hasAgentSource(options);
128
- const hasTask = typeof options.task === "function";
129
- if (hasAgent && hasTask) {
128
+ const hasRun = typeof options.run === "function";
129
+ const entrypoints = [hasAgent, hasRun].filter(Boolean).length;
130
+ if (entrypoints > 1) {
130
131
  throw new Error(
131
- "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."
132
+ "aiSdkHarness accepts exactly one of agent or run. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or run for a custom entrypoint."
132
133
  );
133
134
  }
134
- if (!hasAgent && !hasTask) {
135
+ if (entrypoints === 0) {
135
136
  throw new Error(
136
- "aiSdkHarness requires either agent or task. Use agent for objects with run(input, runtime) or generate(input, runtime), or task for a custom entrypoint."
137
+ "aiSdkHarness requires agent or run. Use agent for objects with run(input, runtime) or generate(input, runtime), or run for a custom entrypoint."
137
138
  );
138
139
  }
139
140
  }
@@ -276,24 +277,55 @@ async function executeToolWithReplay({
276
277
  }
277
278
  function resolveOutput(result) {
278
279
  if (!result || typeof result !== "object") {
279
- return toJsonValue(result);
280
+ return void 0;
280
281
  }
281
- const candidates = [
282
- "output",
283
- "object",
284
- "experimental_output",
285
- "result",
286
- "text"
287
- ];
282
+ const candidates = ["output", "object", "text"];
283
+ const resultRecord = result;
288
284
  for (const key of candidates) {
289
- const value = result[key];
290
- const normalized = toJsonValue(value);
291
- if (normalized !== void 0) {
292
- return normalized;
285
+ if (Object.prototype.hasOwnProperty.call(resultRecord, key)) {
286
+ return toOutputValue(resultRecord[key]);
293
287
  }
294
288
  }
295
289
  return void 0;
296
290
  }
291
+ function toOutputValue(value) {
292
+ if (value === void 0) {
293
+ return void 0;
294
+ }
295
+ if (value === null || typeof value === "string" || typeof value === "boolean") {
296
+ return value;
297
+ }
298
+ if (typeof value === "number") {
299
+ return Number.isFinite(value) ? value : void 0;
300
+ }
301
+ if (Array.isArray(value)) {
302
+ const items = [];
303
+ for (const item of value) {
304
+ const normalized = toOutputValue(item);
305
+ if (normalized === void 0) {
306
+ return void 0;
307
+ }
308
+ items.push(normalized);
309
+ }
310
+ return items;
311
+ }
312
+ if (typeof value === "object") {
313
+ const prototype = Object.getPrototypeOf(value);
314
+ if (prototype !== Object.prototype && prototype !== null) {
315
+ return void 0;
316
+ }
317
+ const record = {};
318
+ for (const [key, entry] of Object.entries(value)) {
319
+ const normalized = toOutputValue(entry);
320
+ if (normalized === void 0) {
321
+ return void 0;
322
+ }
323
+ record[key] = normalized;
324
+ }
325
+ return record;
326
+ }
327
+ return void 0;
328
+ }
297
329
  function resolveUsage(result, runtimeToolCallCount = 0) {
298
330
  const steps = resolveSteps(result);
299
331
  const usage = resolveLanguageModelUsage(result) ?? resolveStepUsage(steps);
@@ -419,10 +451,8 @@ function resolveSession(input, result, output, replayMetadataByToolCallId, runti
419
451
  });
420
452
  }
421
453
  const lastStep = steps.length > 0 ? steps[steps.length - 1] : void 0;
422
- const outputText = resolveOutputText(result, output, lastStep);
423
454
  return {
424
455
  messages,
425
- outputText,
426
456
  provider: lastStep?.model.provider,
427
457
  model: lastStep?.model.modelId
428
458
  };
@@ -464,15 +494,6 @@ function resolveLanguageModelUsage(result) {
464
494
  const aiResult = result;
465
495
  return aiResult.totalUsage ?? aiResult.usage;
466
496
  }
467
- function resolveOutputText(result, output, lastStep) {
468
- if (lastStep?.text) {
469
- return lastStep.text;
470
- }
471
- if (result && typeof result === "object" && typeof result.text === "string") {
472
- return result.text;
473
- }
474
- return typeof output === "string" ? output : void 0;
475
- }
476
497
  function normalizeStep(step, replayMetadataByToolCallId) {
477
498
  const toolResultsById = new Map(
478
499
  (step.toolResults ?? []).map((toolResult) => [
@@ -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<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;\n\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 AiSdkCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\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, TInput, TMetadata>;\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 input,\n context,\n });\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>(\n options: AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n 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, TInput, TMetadata> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n 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, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) => MaybePromise<TAgent> {\n return (\n typeof agent === \"function\" &&\n !hasCallableMethod(agent, \"run\") &&\n !hasCallableMethod(agent, \"generate\")\n );\n}\n\nfunction createToolset<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput, TMetadata> | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeToolCalls: ToolCallRecord[];\n}) {\n return Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => {\n const replay = toolReplay?.[toolName];\n\n if (replay && !tool.execute) {\n throw new Error(\n `Tool replay requires execute() for ${toolName}. Provider-executed tools cannot be recorded automatically.`,\n );\n }\n\n if (!tool.execute) {\n return [toolName, tool];\n }\n\n const execute = tool.execute;\n const wrappedTool = {\n ...tool,\n execute: async (\n toolInput: InferToolInput<typeof tool>,\n execution: ToolExecutionOptions,\n ) => {\n const startedAt = new Date();\n const normalizedArgs = normalizeArguments(toolInput);\n const replayContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput, TMetadata>;\n\n try {\n const executionResult = replay\n ? await executeToolWithReplay({\n toolName,\n toolInput,\n execute,\n execution,\n context: replayContext,\n replay,\n })\n : {\n result: await execute(toolInput, execution),\n replay: undefined,\n };\n const finishedAt = new Date();\n const normalizedResult = toJsonValue(executionResult.result);\n const replayMetadata = normalizeReplayMetadata(\n executionResult.replay,\n );\n\n if (executionResult.replay) {\n replayMetadataByToolCallId.set(\n execution.toolCallId,\n executionResult.replay,\n );\n }\n\n runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n ...(normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\n });\n\n return executionResult.result as InferToolOutput<typeof tool>;\n } catch (error) {\n const replay = getReplayMetadataFromError(error);\n const finishedAt = new Date();\n const replayMetadata = normalizeReplayMetadata(replay);\n\n if (replay) {\n replayMetadataByToolCallId.set(execution.toolCallId, replay);\n }\n\n runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n error: normalizeError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\n });\n throw error;\n }\n },\n } satisfies typeof tool;\n\n return [toolName, wrappedTool];\n }),\n ) as AiSdkRuntimeToolset<TTools>;\n}\n\nasync function executeToolWithReplay<\n TInput,\n TMetadata extends HarnessMetadata,\n TTool extends AiSdkToolDefinition<any, any, TInput, TMetadata>,\n>({\n toolName,\n toolInput,\n execute,\n execution,\n context,\n replay,\n}: {\n toolName: string;\n toolInput: InferToolInput<TTool>;\n execute: NonNullable<TTool[\"execute\"]>;\n execution: ToolExecutionOptions;\n context: AiSdkToolContext<TInput, TMetadata>;\n replay: AiSdkToolReplayPolicy<TInput, TMetadata>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<\n JsonValue,\n JsonValue,\n AiSdkToolContext<TInput, TMetadata>\n >({\n toolName,\n args: replayInput,\n context,\n execute: async (replayedInput) => {\n const output = await execute(\n replayedInput as InferToolInput<TTool>,\n execution,\n );\n\n if (isAsyncIterable(output)) {\n throw new Error(\n `Tool replay only supports JSON-serializable outputs. ${toolName} returned an async iterable.`,\n );\n }\n\n return toReplayJsonValue(output, `${toolName} tool output`);\n },\n replay,\n });\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return 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":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAcP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAyPA,SAAS,aAUd,SAC4B;AAC5B,kBAAgB,OAAO;AAEvB,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ;AAAA,IACtB,QAAQ,QAAQ;AAAA,IAChB,KAAK,OAAO,OAAO,YAAY;AAC7B,YAAM,QAAQ,MAAM,aAAa,SAAS;AAAA,QACxC;AAAA,QACA;AAAA,MACF,CAAC;AACD,aAAO,gBAAgB,SAAS,OAAO,OAAO,OAAO;AAAA,IACvD;AAAA,EACF;AACF;AAEA,eAAe,gBAOb,SACA,OACA,OACA,SACqB;AACrB,QAAM,6BAA6B,oBAAI,IAA4B;AACnE,QAAM,mBAAqC,CAAC;AAC5C,QAAM,QAAQ,cAAc;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,OAAO,QAAQ;AAAA,IACf,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,UAAU;AAAA,IACd;AAAA,IACA,QAAQ,QAAQ;AAAA,EAClB;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,SAAS,SAAS;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,aAAa,MAAM,KAAK,CAAC,mBAAmB,OAAO,GAAG;AACxD,UAAI,OAAO,KAAK,QAAQ,SAAS,EAAE,SAAS,KAAK,CAAC,OAAO,WAAW;AAClE,eAAO,YAAY,QAAQ;AAAA,MAC7B;AACA,aAAO;AAAA,IACT;AAEA,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAQA,UAAM,SAAS,QAAQ,SACnB,MAAM,QAAQ,OAAO,UAAU,IAC/B,cAAc,MAAM;AACxB,UAAM,QAAQ,QAAQ,QAClB,MAAM,QAAQ,MAAM,UAAU,IAC9B,aAAa,QAAQ,iBAAiB,MAAM;AAChD,UAAM,UAAU,QAAQ,UACpB,MAAM,QAAQ,QAAQ,UAAU,IAChC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEJ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,QAAQ,UAAU,MAAM,QAAQ,QAAQ,UAAU,IAAI;AAAA,MAC/D,WACE,OAAO,KAAK,QAAQ,SAAS,EAAE,SAAS,IACpC,QAAQ,YACR;AAAA,MACN,QAAQ,QAAQ,SACZ,MAAM,QAAQ,OAAO,UAAU,IAC/B,wBAAwB,MAAM;AAAA,IACpC;AAAA,EACF,SAAS,OAAO;AACd,UAAM,MAAM;AAAA,MACV,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,MACR,OACE,iBAAiB,SAAS,IACtB,EAAE,WAAW,iBAAiB,OAAO,IACrC,CAAC;AAAA,MACP,WACE,OAAO,KAAK,QAAQ,SAAS,EAAE,SAAS,IACpC,QAAQ,YACR;AAAA,MACN,QAAQ,CAAC,eAAe,KAAK,CAAC;AAAA,IAChC;AAEA,UAAM,wBAAwB,OAAO,GAAG;AAAA,EAC1C;AACF;AAEA,SAAS,mBAMP,SAA2E;AAC3E,SAAO;AAAA,IACL,QAAQ,UACN,QAAQ,WACR,QAAQ,SACR,QAAQ,WACR,QAAQ;AAAA,EACZ;AACF;AAEA,eAAe,aAOb,SACA,MACA;AACA,SAAO,eAAe,OAAO,IACzB,MAAM,mBAAmB,QAAQ,OAAO,IAAI,IAC5C;AACN;AAEA,eAAe,SAOb,SACA,MAC+B;AAC/B,MAAI,QAAQ,MAAM;AAChB,WAAO,QAAQ,KAAK,IAAI;AAAA,EAC1B;AAEA,MAAI,kBAAsD,KAAK,KAAK,GAAG;AACrE,WAAO,KAAK,MAAM,IAAI,KAAK,OAAO,KAAK,OAAO;AAAA,EAChD;AAEA,MAAI,uBAA2D,KAAK,KAAK,GAAG;AAC1E,WAAO,KAAK,MAAM,SAAS,KAAK,OAAO,KAAK,OAAO;AAAA,EACrD;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,gBAMP,SAA0E;AAC1E,QAAM,WAAW,eAAe,OAAO;AACvC,QAAM,UAAU,OAAQ,QAA+B,SAAS;AAEhE,MAAI,YAAY,SAAS;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,YAAY,CAAC,SAAS;AACzB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAOP,SAOoD;AACpD,SAAO,WAAW,WAAW,QAAQ,UAAU;AACjD;AAEA,eAAe,mBAKb,OACA,MACiB;AACjB,MAAI,eAAe,KAAK,GAAG;AACzB,WAAO,MAAM,IAAI;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,SAAS,kBAMP,OACiE;AACjE,SAAO,kBAAkB,OAAO,KAAK;AACvC;AAEA,SAAS,uBAMP,OACoE;AACpE,SAAO,kBAAkB,OAAO,UAAU;AAC5C;AAEA,SAAS,eACP,OAGwB;AACxB,SACE,OAAO,UAAU,cACjB,CAAC,kBAAkB,OAAO,KAAK,KAC/B,CAAC,kBAAkB,OAAO,UAAU;AAExC;AAEA,SAAS,cAIP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,IAAI,MAAM;AACpD,YAAM,SAAS,aAAa,QAAQ;AAEpC,UAAI,UAAU,CAAC,KAAK,SAAS;AAC3B,cAAM,IAAI;AAAA,UACR,sCAAsC,QAAQ;AAAA,QAChD;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,SAAS;AACjB,eAAO,CAAC,UAAU,IAAI;AAAA,MACxB;AAEA,YAAM,UAAU,KAAK;AACrB,YAAM,cAAc;AAAA,QAClB,GAAG;AAAA,QACH,SAAS,OACP,WACA,cACG;AACH,gBAAM,YAAY,oBAAI,KAAK;AAC3B,gBAAM,iBAAiB,mBAAmB,SAAS;AACnD,gBAAM,gBAAgB;AAAA,YACpB;AAAA,YACA,UAAU,QAAQ;AAAA,YAClB,QAAQ,QAAQ;AAAA,YAChB,aAAa,QAAQ;AAAA,YACrB;AAAA,UACF;AAEA,cAAI;AACF,kBAAM,kBAAkB,SACpB,MAAM,sBAAsB;AAAA,cAC1B;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,SAAS;AAAA,cACT;AAAA,YACF,CAAC,IACD;AAAA,cACE,QAAQ,MAAM,QAAQ,WAAW,SAAS;AAAA,cAC1C,QAAQ;AAAA,YACV;AACJ,kBAAM,aAAa,oBAAI,KAAK;AAC5B,kBAAM,mBAAmB,YAAY,gBAAgB,MAAM;AAC3D,kBAAM,iBAAiB;AAAA,cACrB,gBAAgB;AAAA,YAClB;AAEA,gBAAI,gBAAgB,QAAQ;AAC1B,yCAA2B;AAAA,gBACzB,UAAU;AAAA,gBACV,gBAAgB;AAAA,cAClB;AAAA,YACF;AAEA,6BAAiB,KAAK;AAAA,cACpB,IAAI,UAAU;AAAA,cACd,MAAM;AAAA,cACN,GAAI,iBAAiB,EAAE,WAAW,eAAe,IAAI,CAAC;AAAA,cACtD,GAAI,qBAAqB,SACrB,EAAE,QAAQ,iBAAiB,IAC3B,CAAC;AAAA,cACL,WAAW,UAAU,YAAY;AAAA,cACjC,YAAY,WAAW,YAAY;AAAA,cACnC,YAAY,WAAW,QAAQ,IAAI,UAAU,QAAQ;AAAA,cACrD,GAAI,iBAAiB,EAAE,UAAU,eAAe,IAAI,CAAC;AAAA,YACvD,CAAC;AAED,mBAAO,gBAAgB;AAAA,UACzB,SAAS,OAAO;AACd,kBAAMA,UAAS,2BAA2B,KAAK;AAC/C,kBAAM,aAAa,oBAAI,KAAK;AAC5B,kBAAM,iBAAiB,wBAAwBA,OAAM;AAErD,gBAAIA,SAAQ;AACV,yCAA2B,IAAI,UAAU,YAAYA,OAAM;AAAA,YAC7D;AAEA,6BAAiB,KAAK;AAAA,cACpB,IAAI,UAAU;AAAA,cACd,MAAM;AAAA,cACN,GAAI,iBAAiB,EAAE,WAAW,eAAe,IAAI,CAAC;AAAA,cACtD,OAAO,eAAe,KAAK;AAAA,cAC3B,WAAW,UAAU,YAAY;AAAA,cACjC,YAAY,WAAW,YAAY;AAAA,cACnC,YAAY,WAAW,QAAQ,IAAI,UAAU,QAAQ;AAAA,cACrD,GAAI,iBAAiB,EAAE,UAAU,eAAe,IAAI,CAAC;AAAA,YACvD,CAAC;AACD,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,aAAO,CAAC,UAAU,WAAW;AAAA,IAC/B,CAAC;AAAA,EACH;AACF;AAEA,eAAe,sBAIb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,cAAc,kBAAkB,WAAW,GAAG,QAAQ,aAAa;AAEzE,SAAO,kBAIL;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,SAAS,OAAO,kBAAkB;AAChC,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AAEA,UAAI,gBAAgB,MAAM,GAAG;AAC3B,cAAM,IAAI;AAAA,UACR,wDAAwD,QAAQ;AAAA,QAClE;AAAA,MACF;AAEA,aAAO,kBAAkB,QAAQ,GAAG,QAAQ,cAAc;AAAA,IAC5D;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cAAc,QAAwC;AAC7D,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO,YAAY,MAAM;AAAA,EAC3B;AAEA,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,OAAO,YAAY;AAC5B,UAAM,QAAS,OAAmC,GAAG;AACrD,UAAM,aAAa,YAAY,KAAK;AACpC,QAAI,eAAe,QAAW;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,QAAiB,uBAAuB,GAAiB;AAC7E,QAAM,QAAQ,aAAa,MAAM;AACjC,QAAM,QAAQ,0BAA0B,MAAM,KAAK,iBAAiB,KAAK;AACzE,QAAM,WAAW,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,IAAI;AAE9D,MAAI,CAAC,OAAO;AACV,QAAI,MAAM,SAAS,GAAG;AACpB,YAAMC,iBAAgB,mBAAmB,KAAK;AAE9C,aAAO;AAAA,QACL,UAAU,UAAU,MAAM;AAAA,QAC1B,OAAO,UAAU,MAAM;AAAA,QACvB,GAAIA,iBAAgB,IAAI,EAAE,WAAWA,eAAc,IAAI,CAAC;AAAA,MAC1D;AAAA,IACF;AAEA,WAAO,uBAAuB,IAAI,EAAE,WAAW,qBAAqB,IAAI,CAAC;AAAA,EAC3E;AAEA,QAAM,oBAAoB,mBAAmB,KAAK;AAClD,QAAM,gBACJ,oBAAoB,IAAI,oBAAoB;AAE9C,SAAO;AAAA,IACL,UAAU,UAAU,MAAM;AAAA,IAC1B,OAAO,UAAU,MAAM;AAAA,IACvB,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,iBACE,MAAM,oBAAoB,mBAAmB,MAAM;AAAA,IACrD,aACE,MAAM,gBAAgB,MAAM,eAAe,MAAM,MAAM,gBAAgB;AAAA,IACzE,WAAW,gBAAgB,IAAI,gBAAgB;AAAA,IAC/C,UAAU,kBAAkB;AAAA,MAC1B,iBACE,MAAM,mBAAmB,mBAAmB,MAAM;AAAA,MACpD,kBAAkB,MAAM,mBAAmB;AAAA,MAC3C,KAAK,MAAM;AAAA,IACb,CAAC;AAAA,EACH;AACF;AAEA,SAAS,iBAAiB,OAAmD;AAC3E,QAAM,SAAS,MACZ,IAAI,CAAC,SAAS,KAAK,KAAK,EACxB,OAAO,CAAC,UAAuC,QAAQ,KAAK,CAAC;AAEhE,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,OAAO,qBAAqB;AAC5C;AAEA,SAAS,sBACP,MACA,OACoB;AACpB,SAAO;AAAA,IACL,aAAa,eAAe,KAAK,aAAa,MAAM,WAAW;AAAA,IAC/D,mBAAmB;AAAA,MACjB,eAAe;AAAA,QACb,KAAK,mBAAmB;AAAA,QACxB,MAAM,mBAAmB;AAAA,MAC3B;AAAA,MACA,iBAAiB;AAAA,QACf,KAAK,mBAAmB;AAAA,QACxB,MAAM,mBAAmB;AAAA,MAC3B;AAAA,MACA,kBAAkB;AAAA,QAChB,KAAK,mBAAmB;AAAA,QACxB,MAAM,mBAAmB;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,cAAc,eAAe,KAAK,cAAc,MAAM,YAAY;AAAA,IAClE,oBAAoB;AAAA,MAClB,YAAY;AAAA,QACV,KAAK,oBAAoB;AAAA,QACzB,MAAM,oBAAoB;AAAA,MAC5B;AAAA,MACA,iBAAiB;AAAA,QACf,KAAK,oBAAoB;AAAA,QACzB,MAAM,oBAAoB;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,aAAa,eAAe,KAAK,aAAa,MAAM,WAAW;AAAA,IAC/D,iBAAiB;AAAA,MACf,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,IACA,mBAAmB;AAAA,MACjB,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,eAAe,MAA0B,OAA2B;AAC3E,SAAO,QAAQ,QAAQ,SAAS,OAAO,UAAa,QAAQ,MAAM,SAAS;AAC7E;AAEA,SAAS,mBAAmB,OAAmB;AAC7C,SAAO,MAAM;AAAA,IACX,CAAC,OAAO,SAAS,SAAS,KAAK,WAAW,UAAU;AAAA,IACpD;AAAA,EACF;AACF;AAEA,SAAS,eACP,OACA,QACA,QACA,4BACA,mBAAqC,CAAC,GACnB;AACnB,MACE;AAAA,IACG,QAAgD;AAAA,EACnD,GACA;AACA,WAAQ,OAA0C;AAAA,EACpD;AAEA,MACE,oBAAqB,QAAgD,KAAK,GAC1E;AACA,WAAQ,OAAwC;AAAA,EAClD;AAEA,QAAM,QAAQ,aAAa,MAAM;AACjC,QAAM,WAAgC;AAAA,IACpC;AAAA,MACE,MAAM;AAAA,MACN,SAAS,iBAAiB,KAAK;AAAA,IACjC;AAAA,EACF;AACA,QAAM,kBAAkB,oBAAI,IAAY;AAExC,aAAW,QAAQ,OAAO;AACxB,eAAW,YAAY,KAAK,aAAa,CAAC,GAAG;AAC3C,sBAAgB,IAAI,SAAS,UAAU;AAAA,IACzC;AACA,aAAS,KAAK,GAAG,cAAc,MAAM,0BAA0B,CAAC;AAAA,EAClE;AAEA,QAAM,4BAA4B,iBAAiB;AAAA,IACjD,CAAC,SAAS,KAAK,OAAO,UAAa,CAAC,gBAAgB,IAAI,KAAK,EAAE;AAAA,EACjE;AAEA,MAAI,0BAA0B,SAAS,GAAG;AACxC,aAAS,KAAK,GAAG,0BAA0B,yBAAyB,CAAC;AAAA,EACvE;AAEA,MACE,WAAW,UACX,CAAC,SAAS;AAAA,IACR,CAAC,YACC,QAAQ,SAAS,eAAe,QAAQ,YAAY;AAAA,EACxD,GACA;AACA,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,IAAI;AAC9D,QAAM,aAAa,kBAAkB,QAAQ,QAAQ,QAAQ;AAE7D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,UAAU,MAAM;AAAA,IAC1B,OAAO,UAAU,MAAM;AAAA,EACzB;AACF;AAEA,SAAS,0BACP,kBACqB;AACrB,QAAM,WAAgC;AAAA,IACpC;AAAA,MACE,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,EACF;AAEA,aAAW,QAAQ,kBAAkB;AACnC,QAAI,KAAK,WAAW,UAAa,CAAC,KAAK,OAAO;AAC5C;AAAA,IACF;AAEA,UAAM,UACJ,KAAK,WAAW,SACZ,KAAK,SACL,KAAK,SAAS,KAAK,MAAM,QAAQ,SAAS,IACxC,KAAK,MAAM,UACX;AAER,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC3C,UAAU,kBAAkB;AAAA,QAC1B,MAAM,KAAK;AAAA,QACX,YAAY,KAAK;AAAA,QACjB,SAAS,QAAQ,KAAK,KAAK;AAAA,MAC7B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,QAA6B;AACjD,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,MAAM,QAAS,OAA2B,KAAK,IAChD,OAA2B,SAAS,CAAC,IACvC,CAAC;AACP;AAEA,SAAS,0BACP,QACgC;AAChC,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,WAAW;AACjB,SAAO,SAAS,cAAc,SAAS;AACzC;AAEA,SAAS,kBACP,QACA,QACA,UACA;AACA,MAAI,UAAU,MAAM;AAClB,WAAO,SAAS;AAAA,EAClB;AAEA,MACE,UACA,OAAO,WAAW,YAClB,OAAQ,OAA2B,SAAS,UAC5C;AACA,WAAQ,OAA2B;AAAA,EACrC;AAEA,SAAO,OAAO,WAAW,WAAW,SAAS;AAC/C;AAEA,SAAS,cACP,MACA,4BACqB;AACrB,QAAM,kBAAkB,IAAI;AAAA,KACzB,KAAK,eAAe,CAAC,GAAG,IAAI,CAAC,eAAe;AAAA,MAC3C,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,KAAK,aAAa,CAAC,GAAG;AAAA,IAAI,CAAC,aAClD,kBAAkB,UAAU,iBAAiB,0BAA0B;AAAA,EACzE;AACA,QAAM,sBAAsB,IAAI;AAAA,IAC9B,gBAAgB,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,QAAQ,CAAC;AAAA,EAC3D;AACA,QAAM,oBAAoB,kBAAkB;AAAA,IAC1C,YAAY,KAAK;AAAA,IACjB,cAAc,KAAK;AAAA,IACnB,iBAAiB,KAAK;AAAA,IACtB,eAAe,KAAK;AAAA,IACpB,UAAU,KAAK;AAAA,EACjB,CAAC;AACD,QAAM,WAAgC,CAAC;AAEvC,MAAI,KAAK,QAAQ,gBAAgB,SAAS,KAAK,mBAAmB;AAChE,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,GAAI,KAAK,OAAO,EAAE,SAAS,KAAK,KAAK,IAAI,CAAC;AAAA,MAC1C,GAAI,gBAAgB,SAAS,IAAI,EAAE,WAAW,gBAAgB,IAAI,CAAC;AAAA,MACnE,GAAI,oBAAoB,EAAE,UAAU,kBAAkB,IAAI,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH;AAEA,aAAW,cAAc,KAAK,eAAe,CAAC,GAAG;AAC/C,UAAM,UACJ,WAAW,WAAW,SAClB,SACA,iBAAiB,WAAW,MAAM;AACxC,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC3C,UAAU,kBAAkB;AAAA,QAC1B,MAAM,WAAW;AAAA,QACjB,YAAY,WAAW;AAAA,QACvB,SAAS,QAAQ,oBAAoB,IAAI,WAAW,UAAU,GAAG,KAAK;AAAA,QACtE,aAAa,WAAW;AAAA,QACxB,kBAAkB,WAAW;AAAA,QAC7B,OAAO,WAAW;AAAA,QAClB,kBAAkB,WAAW;AAAA,MAC/B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,kBACP,UACA,iBACA,4BACgB;AAChB,QAAM,aAAa,gBAAgB,IAAI,SAAS,UAAU;AAC1D,QAAM,sBAAsB,mBAAmB,SAAS,KAAK;AAC7D,QAAM,mBACJ,eAAe,SAAY,YAAY,WAAW,MAAM,IAAI;AAC9D,QAAM,aACJ,SAAS,WAAW,SAAS,UAAU,SACnC,eAAe,SAAS,SAAS,SAAS,OAAO,IACjD;AACN,QAAM,iBAAiB;AAAA,IACrB,2BAA2B,IAAI,SAAS,UAAU;AAAA,EACpD;AAEA,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,MAAM,SAAS;AAAA,IACf,GAAI,sBAAsB,EAAE,WAAW,oBAAoB,IAAI,CAAC;AAAA,IAChE,GAAI,cAAc,qBAAqB,SACnC,EAAE,QAAQ,iBAAiB,IAC3B,CAAC;AAAA,IACL,GAAI,aAAa,EAAE,OAAO,WAAW,IAAI,CAAC;AAAA,IAC1C,UAAU,kBAAkB;AAAA,MAC1B,kBACE,SAAS,oBAAoB,YAAY;AAAA,MAC3C,OAAO,SAAS,SAAS,YAAY;AAAA,MACrC,SAAS,SAAS;AAAA,MAClB,SAAS,SAAS;AAAA,MAClB,aAAa,YAAY;AAAA,MACzB,kBACE,SAAS,oBAAoB,YAAY;AAAA,MAC3C,GAAI,kBAAkB,CAAC;AAAA,IACzB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,mBACP,OACuC;AACvC,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO,gBAAgB,KAAgC;AACzD;AAEA,SAAS,eAAe,OAAgB;AACtC,MAAI,iBAAiB,OAAO;AAC1B,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,aAAa,YAAY,KAAK;AACpC,MACE,cACA,OAAO,eAAe,YACtB,CAAC,MAAM,QAAQ,UAAU,KACzB,OAAO,WAAW,YAAY,UAC9B;AACA,WAAO;AAAA,MACL,SAAS,WAAW;AAAA,MACpB,MAAM,OAAO,WAAW,SAAS,WAAW,WAAW,OAAO;AAAA,IAChE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,OAAO,SAAS,yBAAyB;AAAA,EACpD;AACF;AAEA,SAAS,kBAAkB,OAAgB,OAA0B;AACnE,QAAM,aAAa,YAAY,KAAK;AACpC,MAAI,eAAe,QAAW;AAC5B,UAAM,IAAI;AAAA,MACR,uDAAuD,KAAK;AAAA,IAC9D;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAiD;AACxE,SACE,UAAU,SACT,OAAO,UAAU,YAAY,OAAO,UAAU,eAC/C,OAAO,iBAAiB;AAE5B;","names":["replay","toolCallCount"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n attachHarnessRunToError,\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport {\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 JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;\n\ntype StepLike = Pick<\n StepResult<ToolSet>,\n | \"content\"\n | \"finishReason\"\n | \"model\"\n | \"rawFinishReason\"\n | \"reasoningText\"\n | \"response\"\n | \"stepNumber\"\n | \"text\"\n | \"toolCalls\"\n | \"toolResults\"\n | \"usage\"\n>;\n\ntype AiSdkLikeResult = {\n steps?: StepLike[];\n usage?: LanguageModelUsage;\n totalUsage?: LanguageModelUsage;\n output?: unknown;\n object?: unknown;\n text?: string;\n session?: NormalizedSession;\n trace?: NormalizedSession;\n errors?: Array<Record<string, JsonValue>>;\n};\n\ntype AiSdkResultOutput<TResult> = TResult extends HarnessRun<infer TOutput>\n ? TOutput\n : \"output\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"output\">\n : \"object\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"object\">\n : \"text\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"text\">\n : undefined;\ntype AiSdkAgentResult<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : TAgent extends {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n }\n ? Awaited<TResult>\n : unknown;\n\n/** Context passed to instrumented AI SDK tool executions. */\nexport interface AiSdkToolContext<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n metadata: HarnessContext<TMetadata>[\"metadata\"];\n signal?: AbortSignal;\n setArtifact: HarnessContext<TMetadata>[\"setArtifact\"];\n execution: ToolExecutionOptions;\n}\n\n/** Replay mode alias used by the AI SDK harness package. */\nexport type AiSdkReplayMode = ReplayMode;\n\n/** Tool replay recording shape for AI SDK tools. */\nexport type AiSdkToolRecording<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for an AI SDK tool. */\nexport type AiSdkToolReplayConfig<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput, TMetadata>>;\n\n/** AI SDK tool definition accepted by the harness. */\nexport type AiSdkToolDefinition<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n _TInput = string,\n _TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Tool<TArgs, TResult>;\n\n/** Replay policy for one AI SDK tool. */\nexport type AiSdkToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;\n\n/** Replay policy map keyed by AI SDK tool name. */\nexport type AiSdkToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;\n\n/** Toolset shape accepted by the AI SDK harness. */\nexport type AiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyAiSdkToolset<TInput, TMetadata>;\n\n/** Runtime toolset exposed to the system under test. */\nexport type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any, any>> = {\n [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<\n infer TArgs extends JsonValue,\n infer TResult extends JsonValue,\n infer _TInput,\n infer _TMetadata\n >\n ? Omit<TTools[K], \"execute\"> & {\n execute?: ToolExecuteFunction<TArgs, TResult>;\n }\n : TTools[K];\n};\n\n/** Runtime object passed into AI SDK-style agent entrypoints. */\nexport interface AiSdkRuntime<\n TTools extends AiSdkToolset<TInput, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n tools: AiSdkRuntimeToolset<TTools>;\n signal?: AbortSignal;\n}\n\n/** Arguments passed to per-run AI SDK agent factories. */\nexport interface AiSdkCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\n}\n\n/** Arguments passed to custom AI SDK harness run callbacks. */\nexport interface AiSdkHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> {\n agent: TAgent | undefined;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>;\n tools: AiSdkRuntimeToolset<TTools>;\n}\n\n/** Arguments passed to AI SDK harness output selectors. */\nexport interface AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> extends AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\ntype AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n> = (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype AiSdkHarnessOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> &\n (\n | {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n }\n | {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n agent?: never;\n }\n );\n\ntype AiSdkHarnessOptionsWithOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> & {\n output: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n};\n\ntype AiSdkHarnessRunOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult>;\n agent?: never;\n output?: never;\n};\n\ntype AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n output?: never;\n};\n\ninterface AiSdkHarnessBaseOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;\n output?: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\n/** Adapts an AI SDK-style workflow into a normalized eval harness. */\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TTools\n >,\n): Harness<\n TInput,\n AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TMetadata, TTools>>,\n TMetadata\n>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata> {\n validateOptions(options);\n\n const harness: Harness<TInput, TOutput, TMetadata> = {\n name: options.name ?? \"ai-sdk\",\n run: async (input, context) => {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n return runAiSdkHarness(options, agent, input, context);\n },\n };\n\n return harness;\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext<TMetadata>,\n): Promise<HarnessRun<TOutput>> {\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const runtimeToolCalls: ToolCallRecord[] = [];\n const tools = createToolset({\n input,\n context,\n tools: options.tools,\n toolReplay: options.toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n });\n const runtime = {\n tools,\n signal: context.signal,\n } satisfies AiSdkRuntime<TTools, TInput, TMetadata>;\n\n try {\n const result = await runAgent(options, {\n agent,\n input,\n context,\n runtime,\n tools,\n });\n\n if (isHarnessRun(result) && !hasOutputSelector(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n return result;\n }\n\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n tools,\n result: result as TResult,\n } satisfies AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(result) as TOutput | undefined);\n const usage = resolveUsage(result, runtimeToolCalls.length);\n const session = resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n const errors = resolveHarnessRunErrors(result);\n\n return {\n session,\n output,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors,\n } as HarnessRun<TOutput>;\n } catch (error) {\n const run = {\n session: resolveSession(\n input,\n undefined,\n undefined,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n ),\n output: undefined,\n usage:\n runtimeToolCalls.length > 0\n ? { toolCalls: runtimeToolCalls.length }\n : {},\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializeError(error)],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n return Boolean(options.output);\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (\n hasAiSdkRunMethod<TInput, TMetadata, TResult, TOutput, TTools>(args.agent)\n ) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (\n hasAiSdkGenerateMethod<TInput, TMetadata, TResult, TOutput, TTools>(\n args.agent,\n )\n ) {\n return args.agent.generate(args.input, args.runtime);\n }\n\n throw new Error(\n \"aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use run() for a custom entrypoint.\",\n );\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n const hasAgent = hasAgentSource(options);\n const hasRun = typeof (options as { run?: unknown }).run === \"function\";\n const entrypoints = [hasAgent, hasRun].filter(Boolean).length;\n\n if (entrypoints > 1) {\n throw new Error(\n \"aiSdkHarness accepts exactly one of agent or run. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or run for a custom entrypoint.\",\n );\n }\n\n if (entrypoints === 0) {\n throw new Error(\n \"aiSdkHarness requires agent or run. Use agent for objects with run(input, runtime) or generate(input, runtime), or run for a custom entrypoint.\",\n );\n }\n}\n\nfunction hasAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & { agent: AgentSource<TAgent, TInput, TMetadata> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) => MaybePromise<TAgent> {\n return (\n typeof agent === \"function\" &&\n !hasCallableMethod(agent, \"run\") &&\n !hasCallableMethod(agent, \"generate\")\n );\n}\n\nfunction createToolset<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput, TMetadata> | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeToolCalls: ToolCallRecord[];\n}) {\n return Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => {\n const replay = toolReplay?.[toolName];\n\n if (replay && !tool.execute) {\n throw new Error(\n `Tool replay requires execute() for ${toolName}. Provider-executed tools cannot be recorded automatically.`,\n );\n }\n\n if (!tool.execute) {\n return [toolName, tool];\n }\n\n const execute = tool.execute;\n const wrappedTool = {\n ...tool,\n execute: async (\n toolInput: InferToolInput<typeof tool>,\n execution: ToolExecutionOptions,\n ) => {\n const startedAt = new Date();\n const normalizedArgs = normalizeArguments(toolInput);\n const replayContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput, TMetadata>;\n\n try {\n const executionResult = replay\n ? await executeToolWithReplay({\n toolName,\n toolInput,\n execute,\n execution,\n context: replayContext,\n replay,\n })\n : {\n result: await execute(toolInput, execution),\n replay: undefined,\n };\n const finishedAt = new Date();\n const normalizedResult = toJsonValue(executionResult.result);\n const replayMetadata = normalizeReplayMetadata(\n executionResult.replay,\n );\n\n if (executionResult.replay) {\n replayMetadataByToolCallId.set(\n execution.toolCallId,\n executionResult.replay,\n );\n }\n\n runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n ...(normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\n });\n\n return executionResult.result as InferToolOutput<typeof tool>;\n } catch (error) {\n const replay = getReplayMetadataFromError(error);\n const finishedAt = new Date();\n const replayMetadata = normalizeReplayMetadata(replay);\n\n if (replay) {\n replayMetadataByToolCallId.set(execution.toolCallId, replay);\n }\n\n runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n error: normalizeError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\n });\n throw error;\n }\n },\n } satisfies typeof tool;\n\n return [toolName, wrappedTool];\n }),\n ) as AiSdkRuntimeToolset<TTools>;\n}\n\nasync function executeToolWithReplay<\n TInput,\n TMetadata extends HarnessMetadata,\n TTool extends AiSdkToolDefinition<any, any, TInput, TMetadata>,\n>({\n toolName,\n toolInput,\n execute,\n execution,\n context,\n replay,\n}: {\n toolName: string;\n toolInput: InferToolInput<TTool>;\n execute: NonNullable<TTool[\"execute\"]>;\n execution: ToolExecutionOptions;\n context: AiSdkToolContext<TInput, TMetadata>;\n replay: AiSdkToolReplayPolicy<TInput, TMetadata>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<\n JsonValue,\n JsonValue,\n AiSdkToolContext<TInput, TMetadata>\n >({\n toolName,\n args: replayInput,\n context,\n execute: async (replayedInput) => {\n const output = await execute(\n replayedInput as InferToolInput<TTool>,\n execution,\n );\n\n if (isAsyncIterable(output)) {\n throw new Error(\n `Tool replay only supports JSON-serializable outputs. ${toolName} returned an async iterable.`,\n );\n }\n\n return toReplayJsonValue(output, `${toolName} tool output`);\n },\n replay,\n });\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const candidates = [\"output\", \"object\", \"text\"] satisfies string[];\n const resultRecord = result as Record<string, unknown>;\n\n for (const key of candidates) {\n if (Object.prototype.hasOwnProperty.call(resultRecord, key)) {\n return toOutputValue(resultRecord[key]);\n }\n }\n\n return undefined;\n}\n\n// Keep this adapter-local rather than exporting a core helper. Core\n// `toJsonValue` normalizes trace data; inferred app output should only accept\n// values that are already JSON-safe so the public contract stays explicit.\n// Invalid nested values reject the whole candidate instead of being patched.\nfunction toOutputValue(value: unknown): JsonValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (Array.isArray(value)) {\n const items: JsonValue[] = [];\n for (const item of value) {\n const normalized = toOutputValue(item);\n if (normalized === undefined) {\n return undefined;\n }\n items.push(normalized);\n }\n return items;\n }\n\n if (typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return undefined;\n }\n\n const record: Record<string, JsonValue> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = toOutputValue(entry);\n if (normalized === undefined) {\n return undefined;\n }\n record[key] = normalized;\n }\n return record;\n }\n\n return undefined;\n}\n\nfunction resolveUsage(result: unknown, runtimeToolCallCount = 0): UsageSummary {\n const steps = resolveSteps(result);\n const usage = resolveLanguageModelUsage(result) ?? resolveStepUsage(steps);\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n if (!usage) {\n if (steps.length > 0) {\n const toolCallCount = countStepToolCalls(steps);\n\n return {\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n ...(toolCallCount > 0 ? { toolCalls: toolCallCount } : {}),\n };\n }\n\n return runtimeToolCallCount > 0 ? { toolCalls: runtimeToolCallCount } : {};\n }\n\n const stepToolCallCount = countStepToolCalls(steps);\n const toolCallCount =\n stepToolCallCount > 0 ? stepToolCallCount : runtimeToolCallCount;\n\n return {\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens:\n usage.outputTokenDetails?.reasoningTokens ?? usage.reasoningTokens,\n totalTokens:\n usage.totalTokens ?? (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),\n toolCalls: toolCallCount > 0 ? toolCallCount : undefined,\n metadata: normalizeMetadata({\n cacheReadTokens:\n usage.inputTokenDetails?.cacheReadTokens ?? usage.cachedInputTokens,\n cacheWriteTokens: usage.inputTokenDetails?.cacheWriteTokens,\n raw: usage.raw,\n }),\n };\n}\n\nfunction resolveStepUsage(steps: StepLike[]): LanguageModelUsage | undefined {\n const usages = steps\n .map((step) => step.usage)\n .filter((usage): usage is LanguageModelUsage => Boolean(usage));\n\n if (usages.length === 0) {\n return undefined;\n }\n\n return usages.reduce(addLanguageModelUsage);\n}\n\nfunction addLanguageModelUsage(\n left: LanguageModelUsage,\n right: LanguageModelUsage,\n): LanguageModelUsage {\n return {\n inputTokens: addTokenCounts(left.inputTokens, right.inputTokens),\n inputTokenDetails: {\n noCacheTokens: addTokenCounts(\n left.inputTokenDetails?.noCacheTokens,\n right.inputTokenDetails?.noCacheTokens,\n ),\n cacheReadTokens: addTokenCounts(\n left.inputTokenDetails?.cacheReadTokens,\n right.inputTokenDetails?.cacheReadTokens,\n ),\n cacheWriteTokens: addTokenCounts(\n left.inputTokenDetails?.cacheWriteTokens,\n right.inputTokenDetails?.cacheWriteTokens,\n ),\n },\n outputTokens: addTokenCounts(left.outputTokens, right.outputTokens),\n outputTokenDetails: {\n textTokens: addTokenCounts(\n left.outputTokenDetails?.textTokens,\n right.outputTokenDetails?.textTokens,\n ),\n reasoningTokens: addTokenCounts(\n left.outputTokenDetails?.reasoningTokens,\n right.outputTokenDetails?.reasoningTokens,\n ),\n },\n totalTokens: addTokenCounts(left.totalTokens, right.totalTokens),\n reasoningTokens: addTokenCounts(\n left.reasoningTokens,\n right.reasoningTokens,\n ),\n cachedInputTokens: addTokenCounts(\n left.cachedInputTokens,\n right.cachedInputTokens,\n ),\n };\n}\n\nfunction addTokenCounts(left: number | undefined, right: number | undefined) {\n return left == null && right == null ? undefined : (left ?? 0) + (right ?? 0);\n}\n\nfunction countStepToolCalls(steps: StepLike[]) {\n return steps.reduce(\n (count, step) => count + (step.toolCalls?.length ?? 0),\n 0,\n );\n}\n\nfunction resolveSession(\n input: unknown,\n result: unknown,\n output: JsonValue | undefined,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n runtimeToolCalls: ToolCallRecord[] = [],\n): NormalizedSession {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return (result as { session: NormalizedSession }).session;\n }\n\n if (\n isNormalizedSession((result as Record<string, unknown> | undefined)?.trace)\n ) {\n return (result as { trace: NormalizedSession }).trace;\n }\n\n const steps = resolveSteps(result);\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const stepToolCallIds = new Set<string>();\n\n for (const step of steps) {\n for (const toolCall of step.toolCalls ?? []) {\n stepToolCallIds.add(toolCall.toolCallId);\n }\n messages.push(...normalizeStep(step, replayMetadataByToolCallId));\n }\n\n const unmatchedRuntimeToolCalls = runtimeToolCalls.filter(\n (call) => call.id === undefined || !stepToolCallIds.has(call.id),\n );\n\n if (unmatchedRuntimeToolCalls.length > 0) {\n messages.push(...normalizeRuntimeToolCalls(unmatchedRuntimeToolCalls));\n }\n\n if (\n output !== undefined &&\n !messages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n messages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n return {\n messages,\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n };\n}\n\nfunction normalizeRuntimeToolCalls(\n runtimeToolCalls: ToolCallRecord[],\n): NormalizedMessage[] {\n const messages: NormalizedMessage[] = [\n {\n role: \"assistant\",\n toolCalls: runtimeToolCalls,\n },\n ];\n\n for (const call of runtimeToolCalls) {\n if (call.result === undefined && !call.error) {\n continue;\n }\n\n const content =\n call.result !== undefined\n ? call.result\n : call.error && call.error.message.length > 0\n ? call.error.message\n : undefined;\n\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: call.name,\n toolCallId: call.id,\n isError: Boolean(call.error),\n }),\n });\n }\n\n return messages;\n}\n\nfunction resolveSteps(result: unknown): StepLike[] {\n if (!result || typeof result !== \"object\") {\n return [];\n }\n\n return Array.isArray((result as AiSdkLikeResult).steps)\n ? ((result as AiSdkLikeResult).steps ?? [])\n : [];\n}\n\nfunction resolveLanguageModelUsage(\n result: unknown,\n): LanguageModelUsage | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const aiResult = result as AiSdkLikeResult;\n return aiResult.totalUsage ?? aiResult.usage;\n}\n\nfunction normalizeStep(\n step: StepLike,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): NormalizedMessage[] {\n const toolResultsById = new Map(\n (step.toolResults ?? []).map((toolResult) => [\n toolResult.toolCallId,\n toolResult,\n ]),\n );\n\n const normalizedCalls = (step.toolCalls ?? []).map((toolCall) =>\n normalizeToolCall(toolCall, toolResultsById, replayMetadataByToolCallId),\n );\n const normalizedCallsById = new Map(\n normalizedCalls.map((toolCall) => [toolCall.id, toolCall]),\n );\n const assistantMetadata = normalizeMetadata({\n stepNumber: step.stepNumber,\n finishReason: step.finishReason,\n rawFinishReason: step.rawFinishReason,\n reasoningText: step.reasoningText,\n response: step.response,\n });\n const messages: NormalizedMessage[] = [];\n\n if (step.text || normalizedCalls.length > 0 || assistantMetadata) {\n messages.push({\n role: \"assistant\",\n ...(step.text ? { content: step.text } : {}),\n ...(normalizedCalls.length > 0 ? { toolCalls: normalizedCalls } : {}),\n ...(assistantMetadata ? { metadata: assistantMetadata } : {}),\n });\n }\n\n for (const toolResult of step.toolResults ?? []) {\n const content =\n toolResult.output === undefined\n ? undefined\n : normalizeContent(toolResult.output);\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: toolResult.toolName,\n toolCallId: toolResult.toolCallId,\n isError: Boolean(normalizedCallsById.get(toolResult.toolCallId)?.error),\n preliminary: toolResult.preliminary,\n providerExecuted: toolResult.providerExecuted,\n title: toolResult.title,\n providerMetadata: toolResult.providerMetadata,\n }),\n });\n }\n\n return messages;\n}\n\nfunction normalizeToolCall(\n toolCall: StepLike[\"toolCalls\"][number],\n toolResultsById: Map<string, StepLike[\"toolResults\"][number]>,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): ToolCallRecord {\n const toolResult = toolResultsById.get(toolCall.toolCallId);\n const normalizedArguments = normalizeArguments(toolCall.input);\n const normalizedResult =\n toolResult !== undefined ? toJsonValue(toolResult.output) : undefined;\n const errorValue =\n toolCall.invalid || toolCall.error !== undefined\n ? normalizeError(toolCall.error ?? toolCall.invalid)\n : undefined;\n const replayMetadata = normalizeReplayMetadata(\n replayMetadataByToolCallId.get(toolCall.toolCallId),\n );\n\n return {\n id: toolCall.toolCallId,\n name: toolCall.toolName,\n ...(normalizedArguments ? { arguments: normalizedArguments } : {}),\n ...(toolResult && normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n ...(errorValue ? { error: errorValue } : {}),\n metadata: normalizeMetadata({\n providerExecuted:\n toolCall.providerExecuted ?? toolResult?.providerExecuted,\n title: toolCall.title ?? toolResult?.title,\n dynamic: toolCall.dynamic,\n invalid: toolCall.invalid,\n preliminary: toolResult?.preliminary,\n providerMetadata:\n toolCall.providerMetadata ?? toolResult?.providerMetadata,\n ...(replayMetadata ?? {}),\n }),\n };\n}\n\nfunction normalizeArguments(\n value: unknown,\n): Record<string, JsonValue> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n return normalizeRecord(value as Record<string, unknown>);\n}\n\nfunction normalizeError(error: unknown) {\n if (error instanceof Error) {\n return {\n type: error.name,\n message: error.message,\n };\n }\n\n const normalized = toJsonValue(error);\n if (\n normalized &&\n typeof normalized === \"object\" &&\n !Array.isArray(normalized) &&\n typeof normalized.message === \"string\"\n ) {\n return {\n message: normalized.message,\n type: typeof normalized.type === \"string\" ? normalized.type : \"Error\",\n };\n }\n\n return {\n type: \"Error\",\n message: String(error ?? \"Unknown tool call error\"),\n };\n}\n\nfunction toReplayJsonValue(value: unknown, label: string): JsonValue {\n const normalized = toJsonValue(value);\n if (normalized === undefined) {\n throw new Error(\n `Tool replay only supports JSON-serializable values. ${label} could not be normalized.`,\n );\n }\n\n return normalized;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n Symbol.asyncIterator in value\n );\n}\n"],"mappings":"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","names":["replay","toolCallCount"]}
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",
3
+ "version": "0.9.0-beta.4",
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.3"
28
+ "vitest-evals": "0.9.0-beta.4"
29
29
  },
30
30
  "scripts": {
31
31
  "build": "tsup --config ./tsup.config.ts"