@vitest-evals/harness-ai-sdk 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -19,7 +19,6 @@ import {
19
19
  createJudge,
20
20
  describeEval,
21
21
  toolCalls,
22
- type JudgeContext,
23
22
  } from "vitest-evals";
24
23
 
25
24
  const tools = {
@@ -73,17 +72,15 @@ const harness = aiSdkHarness({
73
72
  ```
74
73
 
75
74
  If your app exposes an agent object instead, `agent` can be either that object
76
- or a per-run factory. Factories receive the eval input and harness context so
77
- input-dependent instructions, metadata, or seeded state do not require
78
- side-channel setup:
75
+ or a per-run factory. Factories receive the eval input so input-dependent
76
+ instructions or seeded state do not require side-channel setup:
79
77
 
80
78
  ```ts
81
79
  const harness = aiSdkHarness({
82
80
  tools,
83
- agent: ({ input, context }) =>
81
+ agent: ({ input }) =>
84
82
  createRefundAgent({
85
83
  instructions: buildInstructions(input),
86
- metadata: context.metadata,
87
84
  }),
88
85
  });
89
86
  ```
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as vitest_evals_judges from 'vitest-evals/judges';
2
- import { HarnessMetadata, HarnessContext, JsonValue, HarnessRun, Harness } from 'vitest-evals/harness';
2
+ import { HarnessContext, JsonValue, HarnessRun, Harness } from 'vitest-evals/harness';
3
3
  import { LanguageModel, generateText, ToolExecutionOptions, Tool, ToolExecuteFunction } from 'ai';
4
4
  import { ReplayMode, ToolRecording, ToolReplayConfig } from 'vitest-evals/replay';
5
5
 
@@ -7,8 +7,8 @@ type MaybePromise<T> = T | Promise<T>;
7
7
  type AiSdkProviderOptions = Parameters<typeof generateText>[0]["providerOptions"];
8
8
  type JsonOutput<TValue> = [TValue] extends [JsonValue | undefined] ? TValue : undefined;
9
9
  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;
10
- type AgentSource<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = TAgent | ((args: AiSdkCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);
11
- type AnyAiSdkToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;
10
+ type AgentSource<TAgent, TInput = string> = TAgent | ((args: AiSdkCreateAgentArgs<TInput>) => MaybePromise<TAgent>);
11
+ type AnyAiSdkToolset<TInput = string> = Record<string, AiSdkToolDefinition<any, any, TInput>>;
12
12
  /**
13
13
  * Configuration for adapting an AI SDK language model into a judge harness.
14
14
  *
@@ -58,17 +58,16 @@ interface AiSdkJudgeHarnessConfig {
58
58
  */
59
59
  declare function aiSdkJudgeHarness(config: AiSdkJudgeHarnessConfig): vitest_evals_judges.JudgeHarness;
60
60
  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;
61
- type AiSdkAgentResult<TAgent, TInput, TMetadata extends HarnessMetadata, TTools extends AiSdkToolset<TInput, TMetadata>> = TAgent extends {
62
- run: (input: TInput, runtime: AiSdkRuntime<TTools, TInput, TMetadata>) => MaybePromise<infer TResult>;
61
+ type AiSdkAgentResult<TAgent, TInput, TTools extends AiSdkToolset<TInput>> = TAgent extends {
62
+ run: (input: TInput, runtime: AiSdkRuntime<TTools, TInput>) => MaybePromise<infer TResult>;
63
63
  } ? Awaited<TResult> : TAgent extends {
64
- generate: (input: TInput, runtime: AiSdkRuntime<TTools, TInput, TMetadata>) => MaybePromise<infer TResult>;
64
+ generate: (input: TInput, runtime: AiSdkRuntime<TTools, TInput>) => MaybePromise<infer TResult>;
65
65
  } ? Awaited<TResult> : unknown;
66
66
  /** Context passed to instrumented AI SDK tool executions. */
67
- interface AiSdkToolContext<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
67
+ interface AiSdkToolContext<TInput = string> {
68
68
  input: TInput;
69
- metadata: HarnessContext<TMetadata>["metadata"];
70
69
  signal?: AbortSignal;
71
- setArtifact: HarnessContext<TMetadata>["setArtifact"];
70
+ setArtifact: HarnessContext["setArtifact"];
72
71
  execution: ToolExecutionOptions;
73
72
  }
74
73
  /** Replay mode alias used by the AI SDK harness package. */
@@ -76,73 +75,73 @@ type AiSdkReplayMode = ReplayMode;
76
75
  /** Tool replay recording shape for AI SDK tools. */
77
76
  type AiSdkToolRecording<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue> = ToolRecording<TArgs, TResult>;
78
77
  /** Replay configuration for an AI SDK tool. */
79
- type AiSdkToolReplayConfig<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput, TMetadata>>;
78
+ type AiSdkToolReplayConfig<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, TInput = string> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput>>;
80
79
  /** AI SDK tool definition accepted by the harness. */
81
- type AiSdkToolDefinition<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, _TInput = string, _TMetadata extends HarnessMetadata = HarnessMetadata> = Tool<TArgs, TResult>;
80
+ type AiSdkToolDefinition<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, _TInput = string> = Tool<TArgs, TResult>;
82
81
  /** Replay policy for one AI SDK tool. */
83
- type AiSdkToolReplayPolicy<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;
82
+ type AiSdkToolReplayPolicy<TInput = string> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput>;
84
83
  /** Replay policy map keyed by AI SDK tool name. */
85
- type AiSdkToolReplayPolicies<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;
84
+ type AiSdkToolReplayPolicies<TInput = string> = Record<string, AiSdkToolReplayPolicy<TInput>>;
86
85
  /** Toolset shape accepted by the AI SDK harness. */
87
- type AiSdkToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = AnyAiSdkToolset<TInput, TMetadata>;
86
+ type AiSdkToolset<TInput = string> = AnyAiSdkToolset<TInput>;
88
87
  /** Runtime toolset exposed to the system under test. */
89
- type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any, any>> = {
90
- [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<infer TArgs extends JsonValue, infer TResult extends JsonValue, infer _TInput, infer _TMetadata> ? Omit<TTools[K], "execute"> & {
88
+ type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any>> = {
89
+ [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<infer TArgs extends JsonValue, infer TResult extends JsonValue, infer _TInput> ? Omit<TTools[K], "execute"> & {
91
90
  execute?: ToolExecuteFunction<TArgs, TResult>;
92
91
  } : TTools[K];
93
92
  };
94
93
  /** Runtime object passed into AI SDK-style agent entrypoints. */
95
- interface AiSdkRuntime<TTools extends AiSdkToolset<TInput, TMetadata>, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
94
+ interface AiSdkRuntime<TTools extends AiSdkToolset<TInput>, TInput = string> {
96
95
  tools: AiSdkRuntimeToolset<TTools>;
97
96
  signal?: AbortSignal;
98
97
  }
99
98
  /** Arguments passed to per-run AI SDK agent factories. */
100
- interface AiSdkCreateAgentArgs<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
99
+ interface AiSdkCreateAgentArgs<TInput = string> {
101
100
  input: TInput;
102
- context: HarnessContext<TMetadata>;
101
+ context: HarnessContext;
103
102
  }
104
103
  /** Arguments passed to custom AI SDK harness run callbacks. */
105
- interface AiSdkHarnessRunArgs<TAgent, TInput, TMetadata extends HarnessMetadata, TTools extends AiSdkToolset<TInput, TMetadata>> {
104
+ interface AiSdkHarnessRunArgs<TAgent, TInput, TTools extends AiSdkToolset<TInput>> {
106
105
  agent: TAgent | undefined;
107
106
  input: TInput;
108
- context: HarnessContext<TMetadata>;
109
- runtime: AiSdkRuntime<TTools, TInput, TMetadata>;
107
+ context: HarnessContext;
108
+ runtime: AiSdkRuntime<TTools, TInput>;
110
109
  tools: AiSdkRuntimeToolset<TTools>;
111
110
  }
112
111
  /** Arguments passed to AI SDK harness output selectors. */
113
- interface AiSdkHarnessResultArgs<TAgent, TInput, TMetadata extends HarnessMetadata, TResult, TTools extends AiSdkToolset<TInput, TMetadata>> extends AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {
112
+ interface AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools extends AiSdkToolset<TInput>> extends AiSdkHarnessRunArgs<TAgent, TInput, TTools> {
114
113
  result: TResult;
115
114
  }
116
- 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>;
117
- 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> & ({
118
- agent: AgentSource<TAgent, TInput, TMetadata>;
115
+ type AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools extends AiSdkToolset<TInput>, TOutput extends JsonValue | undefined> = (args: AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools>) => MaybePromise<TOutput>;
116
+ type AiSdkHarnessOptions<TAgent = unknown, TInput = string, TResult = unknown, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>, TOutput extends JsonValue | undefined = JsonValue | undefined> = AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> & ({
117
+ agent: AgentSource<TAgent, TInput>;
119
118
  run?: never;
120
119
  } | {
121
- run: (args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult | HarnessRun<TOutput>>;
120
+ run: (args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>) => MaybePromise<TResult | HarnessRun<TOutput>>;
122
121
  agent?: never;
123
122
  });
124
- 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> & {
125
- output: AiSdkHarnessOutputSelector<TAgent, TInput, TMetadata, TResult, TTools, TOutput>;
123
+ type AiSdkHarnessOptionsWithOutput<TAgent = unknown, TInput = string, TResult = unknown, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>, TOutput extends JsonValue | undefined = JsonValue | undefined> = AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput> & {
124
+ output: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;
126
125
  };
127
- 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> & {
128
- run: (args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult>;
126
+ type AiSdkHarnessRunOptionsWithoutOutput<TAgent = unknown, TInput = string, TResult = unknown, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>> = AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, JsonValue | undefined> & {
127
+ run: (args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>) => MaybePromise<TResult>;
129
128
  agent?: never;
130
129
  output?: never;
131
130
  };
132
- 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> & {
133
- agent: AgentSource<TAgent, TInput, TMetadata>;
131
+ type AiSdkHarnessAgentOptionsWithoutOutput<TAgent = unknown, TInput = string, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>> = AiSdkHarnessBaseOptions<TAgent, TInput, unknown, TTools, JsonValue | undefined> & {
132
+ agent: AgentSource<TAgent, TInput>;
134
133
  run?: never;
135
134
  output?: never;
136
135
  };
137
- 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> {
136
+ interface AiSdkHarnessBaseOptions<TAgent = unknown, TInput = string, TResult = unknown, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>, TOutput extends JsonValue | undefined = JsonValue | undefined> {
138
137
  tools?: TTools;
139
- toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;
140
- output?: AiSdkHarnessOutputSelector<TAgent, TInput, TMetadata, TResult, TTools, TOutput>;
138
+ toolReplay?: AiSdkToolReplayPolicies<TInput>;
139
+ output?: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;
141
140
  name?: string;
142
141
  }
143
142
  /** Adapts an AI SDK-style workflow into a normalized eval harness. */
144
- 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>;
145
- 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>;
146
- 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>;
143
+ declare function aiSdkHarness<TAgent = unknown, TInput = string, TResult = unknown, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>, TOutput extends JsonValue | undefined = JsonValue | undefined>(options: AiSdkHarnessOptionsWithOutput<TAgent, TInput, TResult, TTools, TOutput>): Harness<TInput, TOutput>;
144
+ declare function aiSdkHarness<TAgent = unknown, TInput = string, TResult = unknown, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>>(options: AiSdkHarnessRunOptionsWithoutOutput<TAgent, TInput, TResult, TTools>): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>>;
145
+ declare function aiSdkHarness<TAgent = unknown, TInput = string, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>>(options: AiSdkHarnessAgentOptionsWithoutOutput<TAgent, TInput, TTools>): Harness<TInput, AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TTools>>>;
147
146
 
148
147
  export { type AiSdkCreateAgentArgs, type AiSdkHarnessResultArgs, type AiSdkHarnessRunArgs, type AiSdkJudgeHarnessConfig, type AiSdkReplayMode, type AiSdkRuntime, type AiSdkRuntimeToolset, type AiSdkToolContext, type AiSdkToolDefinition, type AiSdkToolRecording, type AiSdkToolReplayConfig, type AiSdkToolReplayPolicies, type AiSdkToolReplayPolicy, type AiSdkToolset, aiSdkHarness, aiSdkJudgeHarness };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as vitest_evals_judges from 'vitest-evals/judges';
2
- import { HarnessMetadata, HarnessContext, JsonValue, HarnessRun, Harness } from 'vitest-evals/harness';
2
+ import { HarnessContext, JsonValue, HarnessRun, Harness } from 'vitest-evals/harness';
3
3
  import { LanguageModel, generateText, ToolExecutionOptions, Tool, ToolExecuteFunction } from 'ai';
4
4
  import { ReplayMode, ToolRecording, ToolReplayConfig } from 'vitest-evals/replay';
5
5
 
@@ -7,8 +7,8 @@ type MaybePromise<T> = T | Promise<T>;
7
7
  type AiSdkProviderOptions = Parameters<typeof generateText>[0]["providerOptions"];
8
8
  type JsonOutput<TValue> = [TValue] extends [JsonValue | undefined] ? TValue : undefined;
9
9
  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;
10
- type AgentSource<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = TAgent | ((args: AiSdkCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);
11
- type AnyAiSdkToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;
10
+ type AgentSource<TAgent, TInput = string> = TAgent | ((args: AiSdkCreateAgentArgs<TInput>) => MaybePromise<TAgent>);
11
+ type AnyAiSdkToolset<TInput = string> = Record<string, AiSdkToolDefinition<any, any, TInput>>;
12
12
  /**
13
13
  * Configuration for adapting an AI SDK language model into a judge harness.
14
14
  *
@@ -58,17 +58,16 @@ interface AiSdkJudgeHarnessConfig {
58
58
  */
59
59
  declare function aiSdkJudgeHarness(config: AiSdkJudgeHarnessConfig): vitest_evals_judges.JudgeHarness;
60
60
  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;
61
- type AiSdkAgentResult<TAgent, TInput, TMetadata extends HarnessMetadata, TTools extends AiSdkToolset<TInput, TMetadata>> = TAgent extends {
62
- run: (input: TInput, runtime: AiSdkRuntime<TTools, TInput, TMetadata>) => MaybePromise<infer TResult>;
61
+ type AiSdkAgentResult<TAgent, TInput, TTools extends AiSdkToolset<TInput>> = TAgent extends {
62
+ run: (input: TInput, runtime: AiSdkRuntime<TTools, TInput>) => MaybePromise<infer TResult>;
63
63
  } ? Awaited<TResult> : TAgent extends {
64
- generate: (input: TInput, runtime: AiSdkRuntime<TTools, TInput, TMetadata>) => MaybePromise<infer TResult>;
64
+ generate: (input: TInput, runtime: AiSdkRuntime<TTools, TInput>) => MaybePromise<infer TResult>;
65
65
  } ? Awaited<TResult> : unknown;
66
66
  /** Context passed to instrumented AI SDK tool executions. */
67
- interface AiSdkToolContext<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
67
+ interface AiSdkToolContext<TInput = string> {
68
68
  input: TInput;
69
- metadata: HarnessContext<TMetadata>["metadata"];
70
69
  signal?: AbortSignal;
71
- setArtifact: HarnessContext<TMetadata>["setArtifact"];
70
+ setArtifact: HarnessContext["setArtifact"];
72
71
  execution: ToolExecutionOptions;
73
72
  }
74
73
  /** Replay mode alias used by the AI SDK harness package. */
@@ -76,73 +75,73 @@ type AiSdkReplayMode = ReplayMode;
76
75
  /** Tool replay recording shape for AI SDK tools. */
77
76
  type AiSdkToolRecording<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue> = ToolRecording<TArgs, TResult>;
78
77
  /** Replay configuration for an AI SDK tool. */
79
- type AiSdkToolReplayConfig<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput, TMetadata>>;
78
+ type AiSdkToolReplayConfig<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, TInput = string> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput>>;
80
79
  /** AI SDK tool definition accepted by the harness. */
81
- type AiSdkToolDefinition<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, _TInput = string, _TMetadata extends HarnessMetadata = HarnessMetadata> = Tool<TArgs, TResult>;
80
+ type AiSdkToolDefinition<TArgs extends JsonValue = JsonValue, TResult extends JsonValue = JsonValue, _TInput = string> = Tool<TArgs, TResult>;
82
81
  /** Replay policy for one AI SDK tool. */
83
- type AiSdkToolReplayPolicy<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;
82
+ type AiSdkToolReplayPolicy<TInput = string> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput>;
84
83
  /** Replay policy map keyed by AI SDK tool name. */
85
- type AiSdkToolReplayPolicies<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;
84
+ type AiSdkToolReplayPolicies<TInput = string> = Record<string, AiSdkToolReplayPolicy<TInput>>;
86
85
  /** Toolset shape accepted by the AI SDK harness. */
87
- type AiSdkToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = AnyAiSdkToolset<TInput, TMetadata>;
86
+ type AiSdkToolset<TInput = string> = AnyAiSdkToolset<TInput>;
88
87
  /** Runtime toolset exposed to the system under test. */
89
- type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any, any>> = {
90
- [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<infer TArgs extends JsonValue, infer TResult extends JsonValue, infer _TInput, infer _TMetadata> ? Omit<TTools[K], "execute"> & {
88
+ type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any>> = {
89
+ [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<infer TArgs extends JsonValue, infer TResult extends JsonValue, infer _TInput> ? Omit<TTools[K], "execute"> & {
91
90
  execute?: ToolExecuteFunction<TArgs, TResult>;
92
91
  } : TTools[K];
93
92
  };
94
93
  /** Runtime object passed into AI SDK-style agent entrypoints. */
95
- interface AiSdkRuntime<TTools extends AiSdkToolset<TInput, TMetadata>, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
94
+ interface AiSdkRuntime<TTools extends AiSdkToolset<TInput>, TInput = string> {
96
95
  tools: AiSdkRuntimeToolset<TTools>;
97
96
  signal?: AbortSignal;
98
97
  }
99
98
  /** Arguments passed to per-run AI SDK agent factories. */
100
- interface AiSdkCreateAgentArgs<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
99
+ interface AiSdkCreateAgentArgs<TInput = string> {
101
100
  input: TInput;
102
- context: HarnessContext<TMetadata>;
101
+ context: HarnessContext;
103
102
  }
104
103
  /** Arguments passed to custom AI SDK harness run callbacks. */
105
- interface AiSdkHarnessRunArgs<TAgent, TInput, TMetadata extends HarnessMetadata, TTools extends AiSdkToolset<TInput, TMetadata>> {
104
+ interface AiSdkHarnessRunArgs<TAgent, TInput, TTools extends AiSdkToolset<TInput>> {
106
105
  agent: TAgent | undefined;
107
106
  input: TInput;
108
- context: HarnessContext<TMetadata>;
109
- runtime: AiSdkRuntime<TTools, TInput, TMetadata>;
107
+ context: HarnessContext;
108
+ runtime: AiSdkRuntime<TTools, TInput>;
110
109
  tools: AiSdkRuntimeToolset<TTools>;
111
110
  }
112
111
  /** Arguments passed to AI SDK harness output selectors. */
113
- interface AiSdkHarnessResultArgs<TAgent, TInput, TMetadata extends HarnessMetadata, TResult, TTools extends AiSdkToolset<TInput, TMetadata>> extends AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {
112
+ interface AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools extends AiSdkToolset<TInput>> extends AiSdkHarnessRunArgs<TAgent, TInput, TTools> {
114
113
  result: TResult;
115
114
  }
116
- 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>;
117
- 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> & ({
118
- agent: AgentSource<TAgent, TInput, TMetadata>;
115
+ type AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools extends AiSdkToolset<TInput>, TOutput extends JsonValue | undefined> = (args: AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools>) => MaybePromise<TOutput>;
116
+ type AiSdkHarnessOptions<TAgent = unknown, TInput = string, TResult = unknown, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>, TOutput extends JsonValue | undefined = JsonValue | undefined> = AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> & ({
117
+ agent: AgentSource<TAgent, TInput>;
119
118
  run?: never;
120
119
  } | {
121
- run: (args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult | HarnessRun<TOutput>>;
120
+ run: (args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>) => MaybePromise<TResult | HarnessRun<TOutput>>;
122
121
  agent?: never;
123
122
  });
124
- 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> & {
125
- output: AiSdkHarnessOutputSelector<TAgent, TInput, TMetadata, TResult, TTools, TOutput>;
123
+ type AiSdkHarnessOptionsWithOutput<TAgent = unknown, TInput = string, TResult = unknown, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>, TOutput extends JsonValue | undefined = JsonValue | undefined> = AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput> & {
124
+ output: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;
126
125
  };
127
- 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> & {
128
- run: (args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult>;
126
+ type AiSdkHarnessRunOptionsWithoutOutput<TAgent = unknown, TInput = string, TResult = unknown, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>> = AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, JsonValue | undefined> & {
127
+ run: (args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>) => MaybePromise<TResult>;
129
128
  agent?: never;
130
129
  output?: never;
131
130
  };
132
- 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> & {
133
- agent: AgentSource<TAgent, TInput, TMetadata>;
131
+ type AiSdkHarnessAgentOptionsWithoutOutput<TAgent = unknown, TInput = string, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>> = AiSdkHarnessBaseOptions<TAgent, TInput, unknown, TTools, JsonValue | undefined> & {
132
+ agent: AgentSource<TAgent, TInput>;
134
133
  run?: never;
135
134
  output?: never;
136
135
  };
137
- 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> {
136
+ interface AiSdkHarnessBaseOptions<TAgent = unknown, TInput = string, TResult = unknown, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>, TOutput extends JsonValue | undefined = JsonValue | undefined> {
138
137
  tools?: TTools;
139
- toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;
140
- output?: AiSdkHarnessOutputSelector<TAgent, TInput, TMetadata, TResult, TTools, TOutput>;
138
+ toolReplay?: AiSdkToolReplayPolicies<TInput>;
139
+ output?: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;
141
140
  name?: string;
142
141
  }
143
142
  /** Adapts an AI SDK-style workflow into a normalized eval harness. */
144
- 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>;
145
- 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>;
146
- 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>;
143
+ declare function aiSdkHarness<TAgent = unknown, TInput = string, TResult = unknown, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>, TOutput extends JsonValue | undefined = JsonValue | undefined>(options: AiSdkHarnessOptionsWithOutput<TAgent, TInput, TResult, TTools, TOutput>): Harness<TInput, TOutput>;
144
+ declare function aiSdkHarness<TAgent = unknown, TInput = string, TResult = unknown, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>>(options: AiSdkHarnessRunOptionsWithoutOutput<TAgent, TInput, TResult, TTools>): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>>;
145
+ declare function aiSdkHarness<TAgent = unknown, TInput = string, TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>>(options: AiSdkHarnessAgentOptionsWithoutOutput<TAgent, TInput, TTools>): Harness<TInput, AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TTools>>>;
147
146
 
148
147
  export { type AiSdkCreateAgentArgs, type AiSdkHarnessResultArgs, type AiSdkHarnessRunArgs, type AiSdkJudgeHarnessConfig, type AiSdkReplayMode, type AiSdkRuntime, type AiSdkRuntimeToolset, type AiSdkToolContext, type AiSdkToolDefinition, type AiSdkToolRecording, type AiSdkToolReplayConfig, type AiSdkToolReplayPolicies, type AiSdkToolReplayPolicy, type AiSdkToolset, aiSdkHarness, aiSdkJudgeHarness };
package/dist/index.js CHANGED
@@ -217,9 +217,7 @@ async function runAgent(options, args) {
217
217
  if (hasAiSdkRunMethod(args.agent)) {
218
218
  return args.agent.run(args.input, args.runtime);
219
219
  }
220
- if (hasAiSdkGenerateMethod(
221
- args.agent
222
- )) {
220
+ if (hasAiSdkGenerateMethod(args.agent)) {
223
221
  return args.agent.generate(args.input, args.runtime);
224
222
  }
225
223
  throw new Error(
@@ -399,7 +397,6 @@ function createToolset({
399
397
  const normalizedArgs = normalizeArguments(toolInput);
400
398
  const replayContext = {
401
399
  input,
402
- metadata: context.metadata,
403
400
  signal: context.signal,
404
401
  setArtifact: context.setArtifact,
405
402
  execution
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n attachHarnessRunToError,\n createFailedHarnessRun,\n createGenAiUsageAttributes,\n createToolCallSpans,\n ensureRunTrace,\n getHarnessRunFromError,\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n normalizeSpanAttributes,\n normalizeSpanError,\n toJsonValue,\n toolCalls as collectToolCalls,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSpan,\n NormalizedSession,\n NormalizedTrace,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport { generateObject, generateText, jsonSchema } from \"ai\";\nimport {\n createJudgeHarness,\n type JudgeHarnessInput,\n} from \"vitest-evals/judges\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMetadata,\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\nimport type {\n InferToolInput,\n InferToolOutput,\n LanguageModel,\n LanguageModelUsage,\n StepResult,\n Tool,\n ToolExecuteFunction,\n ToolExecutionOptions,\n ToolSet,\n} from \"ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AiSdkProviderOptions = Parameters<\n typeof generateText\n>[0][\"providerOptions\"];\ntype JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;\n\nlet nextTraceId = 0;\n\n/**\n * Configuration for adapting an AI SDK language model into a judge harness.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n * ```\n */\nexport interface AiSdkJudgeHarnessConfig {\n /** AI SDK language model used for judge prompts. */\n model: LanguageModel;\n /** Optional display name for diagnostics. */\n name?: string;\n /** Optional judge-model temperature. */\n temperature?: number;\n /** Optional judge-model token cap. */\n maxOutputTokens?: number;\n /** Optional provider-specific options forwarded to the AI SDK. */\n providerOptions?: AiSdkProviderOptions;\n}\n\n/**\n * Adapts an AI SDK language model into the provider-neutral judge harness API.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n * import { describeEval, FactualityJudge } from \"vitest-evals\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n *\n * describeEval(\"qa agent\", {\n * harness: qaHarness,\n * judgeHarness,\n * judges: [FactualityJudge()],\n * }, (it) => {});\n * ```\n */\nexport function aiSdkJudgeHarness(config: AiSdkJudgeHarnessConfig) {\n return createJudgeHarness({\n name: config.name ?? \"ai-sdk\",\n run: (input, options) => runAiSdkJudgeHarness(config, input, options),\n });\n}\n\nasync function runAiSdkJudgeHarness(\n config: AiSdkJudgeHarnessConfig,\n input: JudgeHarnessInput,\n options: { signal?: AbortSignal },\n) {\n const system = formatAiSdkJudgeSystemPrompt(\n input.system,\n input.responseFormat,\n );\n const requestOptions = {\n model: config.model,\n prompt: input.prompt,\n ...(system !== undefined ? { system } : {}),\n ...(config.temperature !== undefined\n ? { temperature: config.temperature }\n : {}),\n ...(config.maxOutputTokens !== undefined\n ? { maxOutputTokens: config.maxOutputTokens }\n : {}),\n ...(config.providerOptions !== undefined\n ? { providerOptions: config.providerOptions }\n : {}),\n ...(options.signal ? { abortSignal: options.signal } : {}),\n };\n\n if (\n input.responseFormat?.type === \"json\" &&\n input.responseFormat.schema !== undefined\n ) {\n const { object } = await generateObject({\n ...requestOptions,\n schema: jsonSchema(\n input.responseFormat.schema as Parameters<typeof jsonSchema>[0],\n ),\n });\n\n return object;\n }\n\n const { text } = await generateText(requestOptions);\n return text;\n}\n\nfunction formatAiSdkJudgeSystemPrompt(\n system: string | undefined,\n responseFormat: JudgeHarnessInput[\"responseFormat\"],\n) {\n if (responseFormat?.type !== \"json\" || responseFormat.schema !== undefined) {\n return system;\n }\n\n const jsonInstruction =\n \"Return only valid JSON. Do not include markdown fences or explanatory prose.\";\n\n return system ? `${system}\\n\\n${jsonInstruction}` : jsonInstruction;\n}\n\ntype StepLike = Pick<\n StepResult<ToolSet>,\n | \"content\"\n | \"finishReason\"\n | \"model\"\n | \"rawFinishReason\"\n | \"reasoningText\"\n | \"response\"\n | \"stepNumber\"\n | \"text\"\n | \"toolCalls\"\n | \"toolResults\"\n | \"usage\"\n>;\n\ntype AiSdkLikeResult = {\n steps?: StepLike[];\n usage?: LanguageModelUsage;\n totalUsage?: LanguageModelUsage;\n output?: unknown;\n object?: unknown;\n text?: string;\n session?: NormalizedSession;\n trace?: NormalizedSession;\n errors?: Array<Record<string, JsonValue>>;\n};\n\ntype AiSdkResultOutput<TResult> = TResult extends HarnessRun<infer TOutput>\n ? TOutput\n : \"output\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"output\">\n : \"object\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"object\">\n : \"text\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"text\">\n : undefined;\ntype AiSdkAgentResult<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : TAgent extends {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n }\n ? Awaited<TResult>\n : unknown;\n\n/** Context passed to instrumented AI SDK tool executions. */\nexport interface AiSdkToolContext<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n metadata: HarnessContext<TMetadata>[\"metadata\"];\n signal?: AbortSignal;\n setArtifact: HarnessContext<TMetadata>[\"setArtifact\"];\n execution: ToolExecutionOptions;\n}\n\n/** Replay mode alias used by the AI SDK harness package. */\nexport type AiSdkReplayMode = ReplayMode;\n\n/** Tool replay recording shape for AI SDK tools. */\nexport type AiSdkToolRecording<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for an AI SDK tool. */\nexport type AiSdkToolReplayConfig<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput, TMetadata>>;\n\n/** AI SDK tool definition accepted by the harness. */\nexport type AiSdkToolDefinition<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n _TInput = string,\n _TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Tool<TArgs, TResult>;\n\n/** Replay policy for one AI SDK tool. */\nexport type AiSdkToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;\n\n/** Replay policy map keyed by AI SDK tool name. */\nexport type AiSdkToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;\n\n/** Toolset shape accepted by the AI SDK harness. */\nexport type AiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyAiSdkToolset<TInput, TMetadata>;\n\n/** Runtime toolset exposed to the system under test. */\nexport type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any, any>> = {\n [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<\n infer TArgs extends JsonValue,\n infer TResult extends JsonValue,\n infer _TInput,\n infer _TMetadata\n >\n ? Omit<TTools[K], \"execute\"> & {\n execute?: ToolExecuteFunction<TArgs, TResult>;\n }\n : TTools[K];\n};\n\n/** Runtime object passed into AI SDK-style agent entrypoints. */\nexport interface AiSdkRuntime<\n TTools extends AiSdkToolset<TInput, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n tools: AiSdkRuntimeToolset<TTools>;\n signal?: AbortSignal;\n}\n\n/** Arguments passed to per-run AI SDK agent factories. */\nexport interface AiSdkCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\n}\n\n/** Arguments passed to custom AI SDK harness run callbacks. */\nexport interface AiSdkHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> {\n agent: TAgent | undefined;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>;\n tools: AiSdkRuntimeToolset<TTools>;\n}\n\n/** Arguments passed to AI SDK harness output selectors. */\nexport interface AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> extends AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\ntype AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n> = (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype AiSdkHarnessOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> &\n (\n | {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n }\n | {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n agent?: never;\n }\n );\n\ntype AiSdkHarnessOptionsWithOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> & {\n output: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n};\n\ntype AiSdkHarnessRunOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult>;\n agent?: never;\n output?: never;\n};\n\ntype AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n output?: never;\n};\n\ninterface AiSdkHarnessBaseOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;\n output?: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\n/** Adapts an AI SDK-style workflow into a normalized eval harness. */\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TTools\n >,\n): Harness<\n TInput,\n AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TMetadata, TTools>>,\n TMetadata\n>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata> {\n validateOptions(options);\n\n const harnessName = options.name ?? \"ai-sdk\";\n const harness: Harness<TInput, TOutput, TMetadata> = {\n name: harnessName,\n run: async (input, context) => {\n const startedAt = new Date();\n\n try {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n return await runAiSdkHarness(options, agent, input, context);\n } catch (error) {\n if (getHarnessRunFromError(error)) {\n throw error;\n }\n\n throw attachHarnessRunToError(\n error,\n createFailedAiSdkRun(input, context, error, harnessName, startedAt),\n );\n }\n },\n };\n\n return harness;\n}\n\nfunction createFailedAiSdkRun<TInput, TMetadata extends HarnessMetadata>(\n input: TInput,\n context: HarnessContext<TMetadata>,\n error: unknown,\n harnessName: string,\n startedAt: Date,\n) {\n const run = createFailedHarnessRun(input, error, {\n artifacts: context.artifacts,\n });\n ensureRunTrace(run, {\n name: harnessName,\n startedAt,\n finishedAt: new Date(),\n operationName: \"invoke_workflow\",\n source: \"harness-ai-sdk\",\n });\n\n return run;\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext<TMetadata>,\n): Promise<HarnessRun<TOutput>> {\n const trace = createTraceRecorder(options.name ?? \"ai-sdk\");\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const runtimeToolCalls: ToolCallRecord[] = [];\n const tools = createToolset({\n input,\n context,\n tools: options.tools,\n toolReplay: options.toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n });\n const runtime = {\n tools,\n signal: context.signal,\n } satisfies AiSdkRuntime<TTools, TInput, TMetadata>;\n\n try {\n const result = await runAgent(options, {\n agent,\n input,\n context,\n runtime,\n tools,\n });\n\n if (isHarnessRun(result) && !hasOutputSelector(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n attachAiSdkTrace(result, trace, result, new Date());\n return result;\n }\n\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n tools,\n result: result as TResult,\n } satisfies AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(result) as TOutput | undefined);\n const usage = resolveUsage(result, runtimeToolCalls.length);\n const session = resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n const errors = resolveHarnessRunErrors(result);\n const finishedAt = new Date();\n\n return {\n session,\n output,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors,\n traces: [\n finishAiSdkTrace(trace, {\n result,\n session,\n usage,\n errors,\n finishedAt,\n }),\n ],\n } as HarnessRun<TOutput>;\n } catch (error) {\n const finishedAt = new Date();\n const serializedError = serializeError(error);\n const usage =\n runtimeToolCalls.length > 0 ? { toolCalls: runtimeToolCalls.length } : {};\n const session = resolveSession(\n input,\n undefined,\n undefined,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n const run = {\n session,\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializedError],\n traces: [\n finishAiSdkTrace(trace, {\n session,\n usage,\n errors: [serializedError],\n finishedAt,\n }),\n ],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n return Boolean(options.output);\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (\n hasAiSdkRunMethod<TInput, TMetadata, TResult, TOutput, TTools>(args.agent)\n ) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (\n hasAiSdkGenerateMethod<TInput, TMetadata, TResult, TOutput, TTools>(\n args.agent,\n )\n ) {\n return args.agent.generate(args.input, args.runtime);\n }\n\n throw new Error(\n \"aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use run() for a custom entrypoint.\",\n );\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n const hasAgent = hasAgentSource(options);\n const hasRun = typeof (options as { run?: unknown }).run === \"function\";\n const entrypoints = [hasAgent, hasRun].filter(Boolean).length;\n\n if (entrypoints > 1) {\n throw new Error(\n \"aiSdkHarness accepts exactly one of agent or run. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or run for a custom entrypoint.\",\n );\n }\n\n if (entrypoints === 0) {\n throw new Error(\n \"aiSdkHarness requires agent or run. Use agent for objects with run(input, runtime) or generate(input, runtime), or run for a custom entrypoint.\",\n );\n }\n}\n\nfunction hasAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & { agent: AgentSource<TAgent, TInput, TMetadata> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) => MaybePromise<TAgent> {\n return (\n typeof agent === \"function\" &&\n !hasCallableMethod(agent, \"run\") &&\n !hasCallableMethod(agent, \"generate\")\n );\n}\n\ntype TraceRecorder = {\n id: string;\n rootSpanId: string;\n name: string;\n startedAt: Date;\n};\n\nfunction createTraceRecorder(name: string): TraceRecorder {\n const id = `ai_sdk_trace_${++nextTraceId}`;\n\n return {\n id,\n rootSpanId: `${id}:run`,\n name,\n startedAt: new Date(),\n };\n}\n\nfunction attachAiSdkTrace(\n run: HarnessRun,\n trace: TraceRecorder,\n result: unknown,\n finishedAt: Date,\n) {\n const errors = run.errors ?? [];\n const nativeTrace = finishAiSdkTrace(trace, {\n result,\n session: run.session,\n usage: run.usage,\n errors,\n finishedAt,\n });\n\n run.traces = [...(run.traces ?? []), nativeTrace];\n}\n\nfunction finishAiSdkTrace(\n trace: TraceRecorder,\n options: {\n result?: unknown;\n session: NormalizedSession;\n usage?: UsageSummary;\n errors?: unknown[];\n finishedAt: Date;\n },\n): NormalizedTrace {\n const modelSpans = createAiSdkModelSpans(\n trace,\n options.result,\n options.usage,\n );\n const toolSpans = createToolCallSpans(collectToolCalls(options.session), {\n traceId: trace.id,\n parentId: trace.rootSpanId,\n spanIdPrefix: `${trace.id}:tool`,\n });\n const finishedAt = options.finishedAt;\n const durationMs = finishedAt.getTime() - trace.startedAt.getTime();\n const rootError = options.errors?.[0]\n ? normalizeSpanError(options.errors[0])\n : undefined;\n const rootSpan: NormalizedSpan = {\n id: trace.rootSpanId,\n traceId: trace.id,\n name: trace.name,\n kind: \"run\",\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n status: rootError ? \"error\" : \"ok\",\n ...(rootError ? { error: rootError } : {}),\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"invoke_workflow\",\n \"gen_ai.workflow.name\": trace.name,\n ...createGenAiUsageAttributes(options.usage),\n }),\n };\n const spans = [rootSpan, ...modelSpans, ...toolSpans];\n\n return {\n id: trace.id,\n name: trace.name,\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n metadata: {\n source: \"harness-ai-sdk\",\n },\n spans,\n };\n}\n\nfunction createAiSdkModelSpans(\n trace: TraceRecorder,\n result: unknown,\n usage: UsageSummary | undefined,\n): NormalizedSpan[] {\n const steps = resolveSteps(result);\n if (steps.length === 0) {\n const fallback = createUsageModelSpan(trace, usage);\n return fallback ? [fallback] : [];\n }\n\n return steps.map((step, index) => {\n const stepUsage = step.usage;\n\n return {\n id: `${trace.id}:model:${index + 1}`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: `ai-sdk step ${step.stepNumber ?? index}`,\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n \"gen_ai.provider.name\": step.model?.provider,\n \"gen_ai.request.model\": step.model?.modelId,\n \"gen_ai.response.model\": step.model?.modelId,\n \"gen_ai.response.finish_reasons\": step.finishReason\n ? [String(step.finishReason)]\n : undefined,\n \"gen_ai.usage.input_tokens\": stepUsage?.inputTokens,\n \"gen_ai.usage.output_tokens\": stepUsage?.outputTokens,\n \"gen_ai.usage.reasoning.output_tokens\":\n stepUsage?.outputTokenDetails?.reasoningTokens ??\n stepUsage?.reasoningTokens,\n \"gen_ai.usage.cache_read.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheReadTokens ??\n stepUsage?.cachedInputTokens,\n \"gen_ai.usage.cache_creation.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheWriteTokens,\n \"ai.step.number\": step.stepNumber,\n \"ai.finish_reason\": step.finishReason,\n \"ai.raw_finish_reason\": step.rawFinishReason,\n }),\n } satisfies NormalizedSpan;\n });\n}\n\nfunction createUsageModelSpan(\n trace: TraceRecorder,\n usage: UsageSummary | undefined,\n): NormalizedSpan | undefined {\n if (!usage?.provider && !usage?.model) {\n return undefined;\n }\n\n return {\n id: `${trace.id}:model:1`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: usage.model ? `ai-sdk ${usage.model}` : \"ai-sdk model\",\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n ...createGenAiUsageAttributes(usage),\n }),\n };\n}\n\nfunction createToolset<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput, TMetadata> | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeToolCalls: ToolCallRecord[];\n}) {\n return Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => {\n const replay = toolReplay?.[toolName];\n\n if (replay && !tool.execute) {\n throw new Error(\n `Tool replay requires execute() for ${toolName}. Provider-executed tools cannot be recorded automatically.`,\n );\n }\n\n if (!tool.execute) {\n return [toolName, tool];\n }\n\n const execute = tool.execute;\n const wrappedTool = {\n ...tool,\n execute: async (\n toolInput: InferToolInput<typeof tool>,\n execution: ToolExecutionOptions,\n ) => {\n const startedAt = new Date();\n const normalizedArgs = normalizeArguments(toolInput);\n const replayContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput, TMetadata>;\n\n try {\n const executionResult = replay\n ? await executeToolWithReplay({\n toolName,\n toolInput,\n execute,\n execution,\n context: replayContext,\n replay,\n })\n : {\n result: await execute(toolInput, execution),\n replay: undefined,\n };\n const finishedAt = new Date();\n const normalizedResult = toJsonValue(executionResult.result);\n const replayMetadata = normalizeReplayMetadata(\n executionResult.replay,\n );\n\n if (executionResult.replay) {\n replayMetadataByToolCallId.set(\n execution.toolCallId,\n executionResult.replay,\n );\n }\n\n runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n ...(normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\n });\n\n return executionResult.result as InferToolOutput<typeof tool>;\n } catch (error) {\n const replay = getReplayMetadataFromError(error);\n const finishedAt = new Date();\n const replayMetadata = normalizeReplayMetadata(replay);\n\n if (replay) {\n replayMetadataByToolCallId.set(execution.toolCallId, replay);\n }\n\n runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n error: normalizeError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\n });\n throw error;\n }\n },\n } satisfies typeof tool;\n\n return [toolName, wrappedTool];\n }),\n ) as AiSdkRuntimeToolset<TTools>;\n}\n\nasync function executeToolWithReplay<\n TInput,\n TMetadata extends HarnessMetadata,\n TTool extends AiSdkToolDefinition<any, any, TInput, TMetadata>,\n>({\n toolName,\n toolInput,\n execute,\n execution,\n context,\n replay,\n}: {\n toolName: string;\n toolInput: InferToolInput<TTool>;\n execute: NonNullable<TTool[\"execute\"]>;\n execution: ToolExecutionOptions;\n context: AiSdkToolContext<TInput, TMetadata>;\n replay: AiSdkToolReplayPolicy<TInput, TMetadata>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<\n JsonValue,\n JsonValue,\n AiSdkToolContext<TInput, TMetadata>\n >({\n toolName,\n args: replayInput,\n context,\n execute: async (replayedInput) => {\n const output = await execute(\n replayedInput as InferToolInput<TTool>,\n execution,\n );\n\n if (isAsyncIterable(output)) {\n throw new Error(\n `Tool replay only supports JSON-serializable outputs. ${toolName} returned an async iterable.`,\n );\n }\n\n return toReplayJsonValue(output, `${toolName} tool output`);\n },\n replay,\n });\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const candidates = [\"output\", \"object\", \"text\"] satisfies string[];\n const resultRecord = result as Record<string, unknown>;\n\n for (const key of candidates) {\n if (Object.prototype.hasOwnProperty.call(resultRecord, key)) {\n return toOutputValue(resultRecord[key]);\n }\n }\n\n return undefined;\n}\n\n// Keep this adapter-local rather than exporting a core helper. Core\n// `toJsonValue` normalizes trace data; inferred app output should only accept\n// values that are already JSON-safe so the public contract stays explicit.\n// Invalid nested values reject the whole candidate instead of being patched.\nfunction toOutputValue(value: unknown): JsonValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (Array.isArray(value)) {\n const items: JsonValue[] = [];\n for (const item of value) {\n const normalized = toOutputValue(item);\n if (normalized === undefined) {\n return undefined;\n }\n items.push(normalized);\n }\n return items;\n }\n\n if (typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return undefined;\n }\n\n const record: Record<string, JsonValue> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = toOutputValue(entry);\n if (normalized === undefined) {\n return undefined;\n }\n record[key] = normalized;\n }\n return record;\n }\n\n return undefined;\n}\n\nfunction resolveUsage(result: unknown, runtimeToolCallCount = 0): UsageSummary {\n const steps = resolveSteps(result);\n const usage = resolveLanguageModelUsage(result) ?? resolveStepUsage(steps);\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n if (!usage) {\n if (steps.length > 0) {\n const toolCallCount = countStepToolCalls(steps);\n\n return {\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n ...(toolCallCount > 0 ? { toolCalls: toolCallCount } : {}),\n };\n }\n\n return runtimeToolCallCount > 0 ? { toolCalls: runtimeToolCallCount } : {};\n }\n\n const stepToolCallCount = countStepToolCalls(steps);\n const toolCallCount =\n stepToolCallCount > 0 ? stepToolCallCount : runtimeToolCallCount;\n\n return {\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens:\n usage.outputTokenDetails?.reasoningTokens ?? usage.reasoningTokens,\n totalTokens:\n usage.totalTokens ?? (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),\n toolCalls: toolCallCount > 0 ? toolCallCount : undefined,\n metadata: normalizeMetadata({\n cacheReadTokens:\n usage.inputTokenDetails?.cacheReadTokens ?? usage.cachedInputTokens,\n cacheWriteTokens: usage.inputTokenDetails?.cacheWriteTokens,\n raw: usage.raw,\n }),\n };\n}\n\nfunction resolveStepUsage(steps: StepLike[]): LanguageModelUsage | undefined {\n const usages = steps\n .map((step) => step.usage)\n .filter((usage): usage is LanguageModelUsage => Boolean(usage));\n\n if (usages.length === 0) {\n return undefined;\n }\n\n return usages.reduce(addLanguageModelUsage);\n}\n\nfunction addLanguageModelUsage(\n left: LanguageModelUsage,\n right: LanguageModelUsage,\n): LanguageModelUsage {\n return {\n inputTokens: addTokenCounts(left.inputTokens, right.inputTokens),\n inputTokenDetails: {\n noCacheTokens: addTokenCounts(\n left.inputTokenDetails?.noCacheTokens,\n right.inputTokenDetails?.noCacheTokens,\n ),\n cacheReadTokens: addTokenCounts(\n left.inputTokenDetails?.cacheReadTokens,\n right.inputTokenDetails?.cacheReadTokens,\n ),\n cacheWriteTokens: addTokenCounts(\n left.inputTokenDetails?.cacheWriteTokens,\n right.inputTokenDetails?.cacheWriteTokens,\n ),\n },\n outputTokens: addTokenCounts(left.outputTokens, right.outputTokens),\n outputTokenDetails: {\n textTokens: addTokenCounts(\n left.outputTokenDetails?.textTokens,\n right.outputTokenDetails?.textTokens,\n ),\n reasoningTokens: addTokenCounts(\n left.outputTokenDetails?.reasoningTokens,\n right.outputTokenDetails?.reasoningTokens,\n ),\n },\n totalTokens: addTokenCounts(left.totalTokens, right.totalTokens),\n reasoningTokens: addTokenCounts(\n left.reasoningTokens,\n right.reasoningTokens,\n ),\n cachedInputTokens: addTokenCounts(\n left.cachedInputTokens,\n right.cachedInputTokens,\n ),\n };\n}\n\nfunction addTokenCounts(left: number | undefined, right: number | undefined) {\n return left == null && right == null ? undefined : (left ?? 0) + (right ?? 0);\n}\n\nfunction countStepToolCalls(steps: StepLike[]) {\n return steps.reduce(\n (count, step) => count + (step.toolCalls?.length ?? 0),\n 0,\n );\n}\n\nfunction resolveSession(\n input: unknown,\n result: unknown,\n output: JsonValue | undefined,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n runtimeToolCalls: ToolCallRecord[] = [],\n): NormalizedSession {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return (result as { session: NormalizedSession }).session;\n }\n\n if (\n isNormalizedSession((result as Record<string, unknown> | undefined)?.trace)\n ) {\n return (result as { trace: NormalizedSession }).trace;\n }\n\n const steps = resolveSteps(result);\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const stepToolCallIds = new Set<string>();\n\n for (const step of steps) {\n for (const toolCall of step.toolCalls ?? []) {\n stepToolCallIds.add(toolCall.toolCallId);\n }\n messages.push(...normalizeStep(step, replayMetadataByToolCallId));\n }\n\n const unmatchedRuntimeToolCalls = runtimeToolCalls.filter(\n (call) => call.id === undefined || !stepToolCallIds.has(call.id),\n );\n\n if (unmatchedRuntimeToolCalls.length > 0) {\n messages.push(...normalizeRuntimeToolCalls(unmatchedRuntimeToolCalls));\n }\n\n if (\n output !== undefined &&\n !messages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n messages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n return {\n messages,\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n };\n}\n\nfunction normalizeRuntimeToolCalls(\n runtimeToolCalls: ToolCallRecord[],\n): NormalizedMessage[] {\n const messages: NormalizedMessage[] = [\n {\n role: \"assistant\",\n toolCalls: runtimeToolCalls,\n },\n ];\n\n for (const call of runtimeToolCalls) {\n if (call.result === undefined && !call.error) {\n continue;\n }\n\n const content =\n call.result !== undefined\n ? call.result\n : call.error && call.error.message.length > 0\n ? call.error.message\n : undefined;\n\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: call.name,\n toolCallId: call.id,\n isError: Boolean(call.error),\n }),\n });\n }\n\n return messages;\n}\n\nfunction resolveSteps(result: unknown): StepLike[] {\n if (!result || typeof result !== \"object\") {\n return [];\n }\n\n return Array.isArray((result as AiSdkLikeResult).steps)\n ? ((result as AiSdkLikeResult).steps ?? [])\n : [];\n}\n\nfunction resolveLanguageModelUsage(\n result: unknown,\n): LanguageModelUsage | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const aiResult = result as AiSdkLikeResult;\n return aiResult.totalUsage ?? aiResult.usage;\n}\n\nfunction normalizeStep(\n step: StepLike,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): NormalizedMessage[] {\n const toolResultsById = new Map(\n (step.toolResults ?? []).map((toolResult) => [\n toolResult.toolCallId,\n toolResult,\n ]),\n );\n\n const normalizedCalls = (step.toolCalls ?? []).map((toolCall) =>\n normalizeToolCall(toolCall, toolResultsById, replayMetadataByToolCallId),\n );\n const normalizedCallsById = new Map(\n normalizedCalls.map((toolCall) => [toolCall.id, toolCall]),\n );\n const assistantMetadata = normalizeMetadata({\n stepNumber: step.stepNumber,\n finishReason: step.finishReason,\n rawFinishReason: step.rawFinishReason,\n reasoningText: step.reasoningText,\n response: step.response,\n });\n const messages: NormalizedMessage[] = [];\n\n if (step.text || normalizedCalls.length > 0 || assistantMetadata) {\n messages.push({\n role: \"assistant\",\n ...(step.text ? { content: step.text } : {}),\n ...(normalizedCalls.length > 0 ? { toolCalls: normalizedCalls } : {}),\n ...(assistantMetadata ? { metadata: assistantMetadata } : {}),\n });\n }\n\n for (const toolResult of step.toolResults ?? []) {\n const content =\n toolResult.output === undefined\n ? undefined\n : normalizeContent(toolResult.output);\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: toolResult.toolName,\n toolCallId: toolResult.toolCallId,\n isError: Boolean(normalizedCallsById.get(toolResult.toolCallId)?.error),\n preliminary: toolResult.preliminary,\n providerExecuted: toolResult.providerExecuted,\n title: toolResult.title,\n providerMetadata: toolResult.providerMetadata,\n }),\n });\n }\n\n return messages;\n}\n\nfunction normalizeToolCall(\n toolCall: StepLike[\"toolCalls\"][number],\n toolResultsById: Map<string, StepLike[\"toolResults\"][number]>,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): ToolCallRecord {\n const toolResult = toolResultsById.get(toolCall.toolCallId);\n const normalizedArguments = normalizeArguments(toolCall.input);\n const normalizedResult =\n toolResult !== undefined ? toJsonValue(toolResult.output) : undefined;\n const errorValue =\n toolCall.invalid || toolCall.error !== undefined\n ? normalizeError(toolCall.error ?? toolCall.invalid)\n : undefined;\n const replayMetadata = normalizeReplayMetadata(\n replayMetadataByToolCallId.get(toolCall.toolCallId),\n );\n\n return {\n id: toolCall.toolCallId,\n name: toolCall.toolName,\n ...(normalizedArguments ? { arguments: normalizedArguments } : {}),\n ...(toolResult && normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n ...(errorValue ? { error: errorValue } : {}),\n metadata: normalizeMetadata({\n providerExecuted:\n toolCall.providerExecuted ?? toolResult?.providerExecuted,\n title: toolCall.title ?? toolResult?.title,\n dynamic: toolCall.dynamic,\n invalid: toolCall.invalid,\n preliminary: toolResult?.preliminary,\n providerMetadata:\n toolCall.providerMetadata ?? toolResult?.providerMetadata,\n ...(replayMetadata ?? {}),\n }),\n };\n}\n\nfunction normalizeArguments(\n value: unknown,\n): Record<string, JsonValue> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n return normalizeRecord(value as Record<string, unknown>);\n}\n\nfunction normalizeError(error: unknown) {\n if (error instanceof Error) {\n return {\n type: error.name,\n message: error.message,\n };\n }\n\n const normalized = toJsonValue(error);\n if (\n normalized &&\n typeof normalized === \"object\" &&\n !Array.isArray(normalized) &&\n typeof normalized.message === \"string\"\n ) {\n return {\n message: normalized.message,\n type: typeof normalized.type === \"string\" ? normalized.type : \"Error\",\n };\n }\n\n return {\n type: \"Error\",\n message: String(error ?? \"Unknown tool call error\"),\n };\n}\n\nfunction toReplayJsonValue(value: unknown, label: string): JsonValue {\n const normalized = toJsonValue(value);\n if (normalized === undefined) {\n throw new Error(\n `Tool replay only supports JSON-serializable values. ${label} could not be normalized.`,\n );\n }\n\n return normalized;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n Symbol.asyncIterator in value\n );\n}\n"],"mappings":"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","names":["collectToolCalls","replay","toolCallCount"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n attachHarnessRunToError,\n createFailedHarnessRun,\n createGenAiUsageAttributes,\n createToolCallSpans,\n ensureRunTrace,\n getHarnessRunFromError,\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n normalizeSpanAttributes,\n normalizeSpanError,\n toJsonValue,\n toolCalls as collectToolCalls,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSpan,\n NormalizedSession,\n NormalizedTrace,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport { generateObject, generateText, jsonSchema } from \"ai\";\nimport {\n createJudgeHarness,\n type JudgeHarnessInput,\n} from \"vitest-evals/judges\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMetadata,\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\nimport type {\n InferToolInput,\n InferToolOutput,\n LanguageModel,\n LanguageModelUsage,\n StepResult,\n Tool,\n ToolExecuteFunction,\n ToolExecutionOptions,\n ToolSet,\n} from \"ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AiSdkProviderOptions = Parameters<\n typeof generateText\n>[0][\"providerOptions\"];\ntype JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<TAgent, TInput = string> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<TInput = string> = Record<\n string,\n AiSdkToolDefinition<any, any, TInput>\n>;\n\nlet nextTraceId = 0;\n\n/**\n * Configuration for adapting an AI SDK language model into a judge harness.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n * ```\n */\nexport interface AiSdkJudgeHarnessConfig {\n /** AI SDK language model used for judge prompts. */\n model: LanguageModel;\n /** Optional display name for diagnostics. */\n name?: string;\n /** Optional judge-model temperature. */\n temperature?: number;\n /** Optional judge-model token cap. */\n maxOutputTokens?: number;\n /** Optional provider-specific options forwarded to the AI SDK. */\n providerOptions?: AiSdkProviderOptions;\n}\n\n/**\n * Adapts an AI SDK language model into the provider-neutral judge harness API.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n * import { describeEval, FactualityJudge } from \"vitest-evals\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n *\n * describeEval(\"qa agent\", {\n * harness: qaHarness,\n * judgeHarness,\n * judges: [FactualityJudge()],\n * }, (it) => {});\n * ```\n */\nexport function aiSdkJudgeHarness(config: AiSdkJudgeHarnessConfig) {\n return createJudgeHarness({\n name: config.name ?? \"ai-sdk\",\n run: (input, options) => runAiSdkJudgeHarness(config, input, options),\n });\n}\n\nasync function runAiSdkJudgeHarness(\n config: AiSdkJudgeHarnessConfig,\n input: JudgeHarnessInput,\n options: { signal?: AbortSignal },\n) {\n const system = formatAiSdkJudgeSystemPrompt(\n input.system,\n input.responseFormat,\n );\n const requestOptions = {\n model: config.model,\n prompt: input.prompt,\n ...(system !== undefined ? { system } : {}),\n ...(config.temperature !== undefined\n ? { temperature: config.temperature }\n : {}),\n ...(config.maxOutputTokens !== undefined\n ? { maxOutputTokens: config.maxOutputTokens }\n : {}),\n ...(config.providerOptions !== undefined\n ? { providerOptions: config.providerOptions }\n : {}),\n ...(options.signal ? { abortSignal: options.signal } : {}),\n };\n\n if (\n input.responseFormat?.type === \"json\" &&\n input.responseFormat.schema !== undefined\n ) {\n const { object } = await generateObject({\n ...requestOptions,\n schema: jsonSchema(\n input.responseFormat.schema as Parameters<typeof jsonSchema>[0],\n ),\n });\n\n return object;\n }\n\n const { text } = await generateText(requestOptions);\n return text;\n}\n\nfunction formatAiSdkJudgeSystemPrompt(\n system: string | undefined,\n responseFormat: JudgeHarnessInput[\"responseFormat\"],\n) {\n if (responseFormat?.type !== \"json\" || responseFormat.schema !== undefined) {\n return system;\n }\n\n const jsonInstruction =\n \"Return only valid JSON. Do not include markdown fences or explanatory prose.\";\n\n return system ? `${system}\\n\\n${jsonInstruction}` : jsonInstruction;\n}\n\ntype StepLike = Pick<\n StepResult<ToolSet>,\n | \"content\"\n | \"finishReason\"\n | \"model\"\n | \"rawFinishReason\"\n | \"reasoningText\"\n | \"response\"\n | \"stepNumber\"\n | \"text\"\n | \"toolCalls\"\n | \"toolResults\"\n | \"usage\"\n>;\n\ntype AiSdkLikeResult = {\n steps?: StepLike[];\n usage?: LanguageModelUsage;\n totalUsage?: LanguageModelUsage;\n output?: unknown;\n object?: unknown;\n text?: string;\n session?: NormalizedSession;\n 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 TTools extends AiSdkToolset<TInput>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : TAgent extends {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n }\n ? Awaited<TResult>\n : unknown;\n\n/** Context passed to instrumented AI SDK tool executions. */\nexport interface AiSdkToolContext<TInput = string> {\n input: TInput;\n signal?: AbortSignal;\n setArtifact: HarnessContext[\"setArtifact\"];\n execution: ToolExecutionOptions;\n}\n\n/** Replay mode alias used by the AI SDK harness package. */\nexport type AiSdkReplayMode = ReplayMode;\n\n/** Tool replay recording shape for AI SDK tools. */\nexport type AiSdkToolRecording<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for an AI SDK tool. */\nexport type AiSdkToolReplayConfig<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput>>;\n\n/** AI SDK tool definition accepted by the harness. */\nexport type AiSdkToolDefinition<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n _TInput = string,\n> = Tool<TArgs, TResult>;\n\n/** Replay policy for one AI SDK tool. */\nexport type AiSdkToolReplayPolicy<TInput = string> =\n | boolean\n | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput>;\n\n/** Replay policy map keyed by AI SDK tool name. */\nexport type AiSdkToolReplayPolicies<TInput = string> = Record<\n string,\n AiSdkToolReplayPolicy<TInput>\n>;\n\n/** Toolset shape accepted by the AI SDK harness. */\nexport type AiSdkToolset<TInput = string> = AnyAiSdkToolset<TInput>;\n\n/** Runtime toolset exposed to the system under test. */\nexport type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any>> = {\n [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<\n infer TArgs extends JsonValue,\n infer TResult extends JsonValue,\n infer _TInput\n >\n ? Omit<TTools[K], \"execute\"> & {\n execute?: ToolExecuteFunction<TArgs, TResult>;\n }\n : TTools[K];\n};\n\n/** Runtime object passed into AI SDK-style agent entrypoints. */\nexport interface AiSdkRuntime<\n TTools extends AiSdkToolset<TInput>,\n TInput = string,\n> {\n tools: AiSdkRuntimeToolset<TTools>;\n signal?: AbortSignal;\n}\n\n/** Arguments passed to per-run AI SDK agent factories. */\nexport interface AiSdkCreateAgentArgs<TInput = string> {\n input: TInput;\n context: HarnessContext;\n}\n\n/** Arguments passed to custom AI SDK harness run callbacks. */\nexport interface AiSdkHarnessRunArgs<\n TAgent,\n TInput,\n TTools extends AiSdkToolset<TInput>,\n> {\n agent: TAgent | undefined;\n input: TInput;\n context: HarnessContext;\n runtime: AiSdkRuntime<TTools, TInput>;\n tools: AiSdkRuntimeToolset<TTools>;\n}\n\n/** Arguments passed to AI SDK harness output selectors. */\nexport interface AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TResult,\n TTools extends AiSdkToolset<TInput>,\n> extends AiSdkHarnessRunArgs<TAgent, TInput, TTools> {\n result: TResult;\n}\n\ntype AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TResult,\n TTools extends AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined,\n> = (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype AiSdkHarnessOptions<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> &\n (\n | {\n agent: AgentSource<TAgent, TInput>;\n run?: never;\n }\n | {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n agent?: never;\n }\n );\n\ntype AiSdkHarnessOptionsWithOutput<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput> & {\n output: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n};\n\ntype AiSdkHarnessRunOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult>;\n agent?: never;\n output?: never;\n};\n\ntype AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n agent: AgentSource<TAgent, TInput>;\n run?: never;\n output?: never;\n};\n\ninterface AiSdkHarnessBaseOptions<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput>;\n output?: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\n/** Adapts an AI SDK-style workflow into a normalized eval harness. */\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptionsWithOutput<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessRunOptionsWithoutOutput<TAgent, TInput, TResult, TTools>,\n): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessAgentOptionsWithoutOutput<TAgent, TInput, TTools>,\n): Harness<TInput, AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TTools>>>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): Harness<TInput, TOutput> {\n validateOptions(options);\n\n const harnessName = options.name ?? \"ai-sdk\";\n const harness: Harness<TInput, TOutput> = {\n name: harnessName,\n run: async (input, context) => {\n const startedAt = new Date();\n\n try {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n return await runAiSdkHarness(options, agent, input, context);\n } catch (error) {\n if (getHarnessRunFromError(error)) {\n throw error;\n }\n\n throw attachHarnessRunToError(\n error,\n createFailedAiSdkRun(input, context, error, harnessName, startedAt),\n );\n }\n },\n };\n\n return harness;\n}\n\nfunction createFailedAiSdkRun<TInput>(\n input: TInput,\n context: HarnessContext,\n error: unknown,\n harnessName: string,\n startedAt: Date,\n) {\n const run = createFailedHarnessRun(input, error, {\n artifacts: context.artifacts,\n });\n ensureRunTrace(run, {\n name: harnessName,\n startedAt,\n finishedAt: new Date(),\n operationName: \"invoke_workflow\",\n source: \"harness-ai-sdk\",\n });\n\n return run;\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext,\n): Promise<HarnessRun<TOutput>> {\n const trace = createTraceRecorder(options.name ?? \"ai-sdk\");\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const 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>;\n\n try {\n const result = await runAgent(options, {\n agent,\n input,\n context,\n runtime,\n tools,\n });\n\n if (isHarnessRun(result) && !hasOutputSelector(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n attachAiSdkTrace(result, trace, result, new Date());\n return result;\n }\n\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n tools,\n result: result as TResult,\n } satisfies AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools>;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(result) as TOutput | undefined);\n const usage = resolveUsage(result, runtimeToolCalls.length);\n const session = resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n const errors = resolveHarnessRunErrors(result);\n const finishedAt = new Date();\n\n return {\n session,\n output,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors,\n traces: [\n finishAiSdkTrace(trace, {\n result,\n session,\n usage,\n errors,\n finishedAt,\n }),\n ],\n } as HarnessRun<TOutput>;\n } catch (error) {\n const finishedAt = new Date();\n const serializedError = serializeError(error);\n const usage =\n runtimeToolCalls.length > 0 ? { toolCalls: runtimeToolCalls.length } : {};\n const session = resolveSession(\n input,\n undefined,\n undefined,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n const run = {\n session,\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializedError],\n traces: [\n finishAiSdkTrace(trace, {\n session,\n usage,\n errors: [serializedError],\n finishedAt,\n }),\n ],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(options: AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput>) {\n return Boolean(options.output);\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: AiSdkCreateAgentArgs<TInput>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (hasAiSdkRunMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (hasAiSdkGenerateMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.generate(args.input, args.runtime);\n }\n\n throw new Error(\n \"aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use run() for a custom entrypoint.\",\n );\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>) {\n const hasAgent = hasAgentSource(options);\n const hasRun = typeof (options as { run?: unknown }).run === \"function\";\n const entrypoints = [hasAgent, hasRun].filter(Boolean).length;\n\n if (entrypoints > 1) {\n throw new Error(\n \"aiSdkHarness accepts exactly one of agent or run. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or run for a custom entrypoint.\",\n );\n }\n\n if (entrypoints === 0) {\n throw new Error(\n \"aiSdkHarness requires agent or run. Use agent for objects with run(input, runtime) or generate(input, runtime), or run for a custom entrypoint.\",\n );\n }\n}\n\nfunction hasAgentSource<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n> & { agent: AgentSource<TAgent, TInput> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n args: AiSdkCreateAgentArgs<TInput>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n): agent is (args: AiSdkCreateAgentArgs<TInput>) => MaybePromise<TAgent> {\n return (\n typeof agent === \"function\" &&\n !hasCallableMethod(agent, \"run\") &&\n !hasCallableMethod(agent, \"generate\")\n );\n}\n\ntype TraceRecorder = {\n id: string;\n rootSpanId: string;\n name: string;\n startedAt: Date;\n};\n\nfunction createTraceRecorder(name: string): TraceRecorder {\n const id = `ai_sdk_trace_${++nextTraceId}`;\n\n return {\n id,\n rootSpanId: `${id}:run`,\n name,\n startedAt: new Date(),\n };\n}\n\nfunction attachAiSdkTrace(\n run: HarnessRun,\n trace: TraceRecorder,\n result: unknown,\n finishedAt: Date,\n) {\n const errors = run.errors ?? [];\n const nativeTrace = finishAiSdkTrace(trace, {\n result,\n session: run.session,\n usage: run.usage,\n errors,\n finishedAt,\n });\n\n run.traces = [...(run.traces ?? []), nativeTrace];\n}\n\nfunction finishAiSdkTrace(\n trace: TraceRecorder,\n options: {\n result?: unknown;\n session: NormalizedSession;\n usage?: UsageSummary;\n errors?: unknown[];\n finishedAt: Date;\n },\n): NormalizedTrace {\n const modelSpans = createAiSdkModelSpans(\n trace,\n options.result,\n options.usage,\n );\n const toolSpans = createToolCallSpans(collectToolCalls(options.session), {\n traceId: trace.id,\n parentId: trace.rootSpanId,\n spanIdPrefix: `${trace.id}:tool`,\n });\n const finishedAt = options.finishedAt;\n const durationMs = finishedAt.getTime() - trace.startedAt.getTime();\n const rootError = options.errors?.[0]\n ? normalizeSpanError(options.errors[0])\n : undefined;\n const rootSpan: NormalizedSpan = {\n id: trace.rootSpanId,\n traceId: trace.id,\n name: trace.name,\n kind: \"run\",\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n status: rootError ? \"error\" : \"ok\",\n ...(rootError ? { error: rootError } : {}),\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"invoke_workflow\",\n \"gen_ai.workflow.name\": trace.name,\n ...createGenAiUsageAttributes(options.usage),\n }),\n };\n const spans = [rootSpan, ...modelSpans, ...toolSpans];\n\n return {\n id: trace.id,\n name: trace.name,\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n metadata: {\n source: \"harness-ai-sdk\",\n },\n spans,\n };\n}\n\nfunction createAiSdkModelSpans(\n trace: TraceRecorder,\n result: unknown,\n usage: UsageSummary | undefined,\n): NormalizedSpan[] {\n const steps = resolveSteps(result);\n if (steps.length === 0) {\n const fallback = createUsageModelSpan(trace, usage);\n return fallback ? [fallback] : [];\n }\n\n return steps.map((step, index) => {\n const stepUsage = step.usage;\n\n return {\n id: `${trace.id}:model:${index + 1}`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: `ai-sdk step ${step.stepNumber ?? index}`,\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n \"gen_ai.provider.name\": step.model?.provider,\n \"gen_ai.request.model\": step.model?.modelId,\n \"gen_ai.response.model\": step.model?.modelId,\n \"gen_ai.response.finish_reasons\": step.finishReason\n ? [String(step.finishReason)]\n : undefined,\n \"gen_ai.usage.input_tokens\": stepUsage?.inputTokens,\n \"gen_ai.usage.output_tokens\": stepUsage?.outputTokens,\n \"gen_ai.usage.reasoning.output_tokens\":\n stepUsage?.outputTokenDetails?.reasoningTokens ??\n stepUsage?.reasoningTokens,\n \"gen_ai.usage.cache_read.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheReadTokens ??\n stepUsage?.cachedInputTokens,\n \"gen_ai.usage.cache_creation.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheWriteTokens,\n \"ai.step.number\": step.stepNumber,\n \"ai.finish_reason\": step.finishReason,\n \"ai.raw_finish_reason\": step.rawFinishReason,\n }),\n } satisfies NormalizedSpan;\n });\n}\n\nfunction createUsageModelSpan(\n trace: TraceRecorder,\n usage: UsageSummary | undefined,\n): NormalizedSpan | undefined {\n if (!usage?.provider && !usage?.model) {\n return undefined;\n }\n\n return {\n id: `${trace.id}:model:1`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: usage.model ? `ai-sdk ${usage.model}` : \"ai-sdk model\",\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n ...createGenAiUsageAttributes(usage),\n }),\n };\n}\n\nfunction createToolset<TInput, TTools extends AiSdkToolset<TInput>>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n}: {\n input: TInput;\n context: HarnessContext;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput> | 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 signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput>;\n\n try {\n const executionResult = replay\n ? await executeToolWithReplay({\n toolName,\n toolInput,\n execute,\n execution,\n context: replayContext,\n replay,\n })\n : {\n result: await execute(toolInput, execution),\n replay: undefined,\n };\n const finishedAt = new Date();\n const 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 TTool extends AiSdkToolDefinition<any, any, TInput>,\n>({\n toolName,\n toolInput,\n execute,\n execution,\n context,\n replay,\n}: {\n toolName: string;\n toolInput: InferToolInput<TTool>;\n execute: NonNullable<TTool[\"execute\"]>;\n execution: ToolExecutionOptions;\n context: AiSdkToolContext<TInput>;\n replay: AiSdkToolReplayPolicy<TInput>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<JsonValue, JsonValue, AiSdkToolContext<TInput>>({\n toolName,\n args: replayInput,\n context,\n execute: async (replayedInput) => {\n const output = await execute(\n replayedInput as InferToolInput<TTool>,\n execution,\n );\n\n if (isAsyncIterable(output)) {\n throw new Error(\n `Tool replay only supports JSON-serializable outputs. ${toolName} returned an async iterable.`,\n );\n }\n\n return toReplayJsonValue(output, `${toolName} tool output`);\n },\n replay,\n });\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const candidates = [\"output\", \"object\", \"text\"] satisfies string[];\n const resultRecord = result as Record<string, unknown>;\n\n for (const key of candidates) {\n if (Object.prototype.hasOwnProperty.call(resultRecord, key)) {\n return toOutputValue(resultRecord[key]);\n }\n }\n\n return undefined;\n}\n\n// Keep this adapter-local rather than exporting a core helper. Core\n// `toJsonValue` normalizes trace data; inferred app output should only accept\n// values that are already JSON-safe so the public contract stays explicit.\n// Invalid nested values reject the whole candidate instead of being patched.\nfunction toOutputValue(value: unknown): JsonValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (Array.isArray(value)) {\n const items: JsonValue[] = [];\n for (const item of value) {\n const normalized = toOutputValue(item);\n if (normalized === undefined) {\n return undefined;\n }\n items.push(normalized);\n }\n return items;\n }\n\n if (typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return undefined;\n }\n\n const record: Record<string, JsonValue> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = toOutputValue(entry);\n if (normalized === undefined) {\n return undefined;\n }\n record[key] = normalized;\n }\n return record;\n }\n\n return undefined;\n}\n\nfunction resolveUsage(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":["collectToolCalls","replay","toolCallCount"]}
package/dist/index.mjs CHANGED
@@ -217,9 +217,7 @@ async function runAgent(options, args) {
217
217
  if (hasAiSdkRunMethod(args.agent)) {
218
218
  return args.agent.run(args.input, args.runtime);
219
219
  }
220
- if (hasAiSdkGenerateMethod(
221
- args.agent
222
- )) {
220
+ if (hasAiSdkGenerateMethod(args.agent)) {
223
221
  return args.agent.generate(args.input, args.runtime);
224
222
  }
225
223
  throw new Error(
@@ -399,7 +397,6 @@ function createToolset({
399
397
  const normalizedArgs = normalizeArguments(toolInput);
400
398
  const replayContext = {
401
399
  input,
402
- metadata: context.metadata,
403
400
  signal: context.signal,
404
401
  setArtifact: context.setArtifact,
405
402
  execution
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n attachHarnessRunToError,\n createFailedHarnessRun,\n createGenAiUsageAttributes,\n createToolCallSpans,\n ensureRunTrace,\n getHarnessRunFromError,\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n normalizeSpanAttributes,\n normalizeSpanError,\n toJsonValue,\n toolCalls as collectToolCalls,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSpan,\n NormalizedSession,\n NormalizedTrace,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport { generateObject, generateText, jsonSchema } from \"ai\";\nimport {\n createJudgeHarness,\n type JudgeHarnessInput,\n} from \"vitest-evals/judges\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMetadata,\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\nimport type {\n InferToolInput,\n InferToolOutput,\n LanguageModel,\n LanguageModelUsage,\n StepResult,\n Tool,\n ToolExecuteFunction,\n ToolExecutionOptions,\n ToolSet,\n} from \"ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AiSdkProviderOptions = Parameters<\n typeof generateText\n>[0][\"providerOptions\"];\ntype JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolDefinition<any, any, TInput, TMetadata>>;\n\nlet nextTraceId = 0;\n\n/**\n * Configuration for adapting an AI SDK language model into a judge harness.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n * ```\n */\nexport interface AiSdkJudgeHarnessConfig {\n /** AI SDK language model used for judge prompts. */\n model: LanguageModel;\n /** Optional display name for diagnostics. */\n name?: string;\n /** Optional judge-model temperature. */\n temperature?: number;\n /** Optional judge-model token cap. */\n maxOutputTokens?: number;\n /** Optional provider-specific options forwarded to the AI SDK. */\n providerOptions?: AiSdkProviderOptions;\n}\n\n/**\n * Adapts an AI SDK language model into the provider-neutral judge harness API.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n * import { describeEval, FactualityJudge } from \"vitest-evals\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n *\n * describeEval(\"qa agent\", {\n * harness: qaHarness,\n * judgeHarness,\n * judges: [FactualityJudge()],\n * }, (it) => {});\n * ```\n */\nexport function aiSdkJudgeHarness(config: AiSdkJudgeHarnessConfig) {\n return createJudgeHarness({\n name: config.name ?? \"ai-sdk\",\n run: (input, options) => runAiSdkJudgeHarness(config, input, options),\n });\n}\n\nasync function runAiSdkJudgeHarness(\n config: AiSdkJudgeHarnessConfig,\n input: JudgeHarnessInput,\n options: { signal?: AbortSignal },\n) {\n const system = formatAiSdkJudgeSystemPrompt(\n input.system,\n input.responseFormat,\n );\n const requestOptions = {\n model: config.model,\n prompt: input.prompt,\n ...(system !== undefined ? { system } : {}),\n ...(config.temperature !== undefined\n ? { temperature: config.temperature }\n : {}),\n ...(config.maxOutputTokens !== undefined\n ? { maxOutputTokens: config.maxOutputTokens }\n : {}),\n ...(config.providerOptions !== undefined\n ? { providerOptions: config.providerOptions }\n : {}),\n ...(options.signal ? { abortSignal: options.signal } : {}),\n };\n\n if (\n input.responseFormat?.type === \"json\" &&\n input.responseFormat.schema !== undefined\n ) {\n const { object } = await generateObject({\n ...requestOptions,\n schema: jsonSchema(\n input.responseFormat.schema as Parameters<typeof jsonSchema>[0],\n ),\n });\n\n return object;\n }\n\n const { text } = await generateText(requestOptions);\n return text;\n}\n\nfunction formatAiSdkJudgeSystemPrompt(\n system: string | undefined,\n responseFormat: JudgeHarnessInput[\"responseFormat\"],\n) {\n if (responseFormat?.type !== \"json\" || responseFormat.schema !== undefined) {\n return system;\n }\n\n const jsonInstruction =\n \"Return only valid JSON. Do not include markdown fences or explanatory prose.\";\n\n return system ? `${system}\\n\\n${jsonInstruction}` : jsonInstruction;\n}\n\ntype StepLike = Pick<\n StepResult<ToolSet>,\n | \"content\"\n | \"finishReason\"\n | \"model\"\n | \"rawFinishReason\"\n | \"reasoningText\"\n | \"response\"\n | \"stepNumber\"\n | \"text\"\n | \"toolCalls\"\n | \"toolResults\"\n | \"usage\"\n>;\n\ntype AiSdkLikeResult = {\n steps?: StepLike[];\n usage?: LanguageModelUsage;\n totalUsage?: LanguageModelUsage;\n output?: unknown;\n object?: unknown;\n text?: string;\n session?: NormalizedSession;\n trace?: NormalizedSession;\n errors?: Array<Record<string, JsonValue>>;\n};\n\ntype AiSdkResultOutput<TResult> = TResult extends HarnessRun<infer TOutput>\n ? TOutput\n : \"output\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"output\">\n : \"object\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"object\">\n : \"text\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"text\">\n : undefined;\ntype AiSdkAgentResult<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : TAgent extends {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n }\n ? Awaited<TResult>\n : unknown;\n\n/** Context passed to instrumented AI SDK tool executions. */\nexport interface AiSdkToolContext<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n metadata: HarnessContext<TMetadata>[\"metadata\"];\n signal?: AbortSignal;\n setArtifact: HarnessContext<TMetadata>[\"setArtifact\"];\n execution: ToolExecutionOptions;\n}\n\n/** Replay mode alias used by the AI SDK harness package. */\nexport type AiSdkReplayMode = ReplayMode;\n\n/** Tool replay recording shape for AI SDK tools. */\nexport type AiSdkToolRecording<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for an AI SDK tool. */\nexport type AiSdkToolReplayConfig<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput, TMetadata>>;\n\n/** AI SDK tool definition accepted by the harness. */\nexport type AiSdkToolDefinition<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n _TInput = string,\n _TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Tool<TArgs, TResult>;\n\n/** Replay policy for one AI SDK tool. */\nexport type AiSdkToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = boolean | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput, TMetadata>;\n\n/** Replay policy map keyed by AI SDK tool name. */\nexport type AiSdkToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, AiSdkToolReplayPolicy<TInput, TMetadata>>;\n\n/** Toolset shape accepted by the AI SDK harness. */\nexport type AiSdkToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyAiSdkToolset<TInput, TMetadata>;\n\n/** Runtime toolset exposed to the system under test. */\nexport type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any, any>> = {\n [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<\n infer TArgs extends JsonValue,\n infer TResult extends JsonValue,\n infer _TInput,\n infer _TMetadata\n >\n ? Omit<TTools[K], \"execute\"> & {\n execute?: ToolExecuteFunction<TArgs, TResult>;\n }\n : TTools[K];\n};\n\n/** Runtime object passed into AI SDK-style agent entrypoints. */\nexport interface AiSdkRuntime<\n TTools extends AiSdkToolset<TInput, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n tools: AiSdkRuntimeToolset<TTools>;\n signal?: AbortSignal;\n}\n\n/** Arguments passed to per-run AI SDK agent factories. */\nexport interface AiSdkCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\n}\n\n/** Arguments passed to custom AI SDK harness run callbacks. */\nexport interface AiSdkHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> {\n agent: TAgent | undefined;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>;\n tools: AiSdkRuntimeToolset<TTools>;\n}\n\n/** Arguments passed to AI SDK harness output selectors. */\nexport interface AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> extends AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\ntype AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n> = (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype AiSdkHarnessOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> &\n (\n | {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n }\n | {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n agent?: never;\n }\n );\n\ntype AiSdkHarnessOptionsWithOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> & {\n output: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n};\n\ntype AiSdkHarnessRunOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult>;\n agent?: never;\n output?: never;\n};\n\ntype AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n run?: never;\n output?: never;\n};\n\ninterface AiSdkHarnessBaseOptions<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput, TMetadata>;\n output?: AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\n/** Adapts an AI SDK-style workflow into a normalized eval harness. */\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>, TMetadata>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n>(\n options: AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TTools\n >,\n): Harness<\n TInput,\n AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TMetadata, TTools>>,\n TMetadata\n>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput, TMetadata> = AiSdkToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata> {\n validateOptions(options);\n\n const harnessName = options.name ?? \"ai-sdk\";\n const harness: Harness<TInput, TOutput, TMetadata> = {\n name: harnessName,\n run: async (input, context) => {\n const startedAt = new Date();\n\n try {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n return await runAiSdkHarness(options, agent, input, context);\n } catch (error) {\n if (getHarnessRunFromError(error)) {\n throw error;\n }\n\n throw attachHarnessRunToError(\n error,\n createFailedAiSdkRun(input, context, error, harnessName, startedAt),\n );\n }\n },\n };\n\n return harness;\n}\n\nfunction createFailedAiSdkRun<TInput, TMetadata extends HarnessMetadata>(\n input: TInput,\n context: HarnessContext<TMetadata>,\n error: unknown,\n harnessName: string,\n startedAt: Date,\n) {\n const run = createFailedHarnessRun(input, error, {\n artifacts: context.artifacts,\n });\n ensureRunTrace(run, {\n name: harnessName,\n startedAt,\n finishedAt: new Date(),\n operationName: \"invoke_workflow\",\n source: \"harness-ai-sdk\",\n });\n\n return run;\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext<TMetadata>,\n): Promise<HarnessRun<TOutput>> {\n const trace = createTraceRecorder(options.name ?? \"ai-sdk\");\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const runtimeToolCalls: ToolCallRecord[] = [];\n const tools = createToolset({\n input,\n context,\n tools: options.tools,\n toolReplay: options.toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n });\n const runtime = {\n tools,\n signal: context.signal,\n } satisfies AiSdkRuntime<TTools, TInput, TMetadata>;\n\n try {\n const result = await runAgent(options, {\n agent,\n input,\n context,\n runtime,\n tools,\n });\n\n if (isHarnessRun(result) && !hasOutputSelector(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n attachAiSdkTrace(result, trace, result, new Date());\n return result;\n }\n\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n tools,\n result: result as TResult,\n } satisfies AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(result) as TOutput | undefined);\n const usage = resolveUsage(result, runtimeToolCalls.length);\n const session = resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n const errors = resolveHarnessRunErrors(result);\n const finishedAt = new Date();\n\n return {\n session,\n output,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors,\n traces: [\n finishAiSdkTrace(trace, {\n result,\n session,\n usage,\n errors,\n finishedAt,\n }),\n ],\n } as HarnessRun<TOutput>;\n } catch (error) {\n const finishedAt = new Date();\n const serializedError = serializeError(error);\n const usage =\n runtimeToolCalls.length > 0 ? { toolCalls: runtimeToolCalls.length } : {};\n const session = resolveSession(\n input,\n undefined,\n undefined,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n const run = {\n session,\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializedError],\n traces: [\n finishAiSdkTrace(trace, {\n session,\n usage,\n errors: [serializedError],\n finishedAt,\n }),\n ],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n return Boolean(options.output);\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (\n hasAiSdkRunMethod<TInput, TMetadata, TResult, TOutput, TTools>(args.agent)\n ) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (\n hasAiSdkGenerateMethod<TInput, TMetadata, TResult, TOutput, TTools>(\n args.agent,\n )\n ) {\n return args.agent.generate(args.input, args.runtime);\n }\n\n throw new Error(\n \"aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use run() for a custom entrypoint.\",\n );\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n const hasAgent = hasAgentSource(options);\n const hasRun = typeof (options as { run?: unknown }).run === \"function\";\n const entrypoints = [hasAgent, hasRun].filter(Boolean).length;\n\n if (entrypoints > 1) {\n throw new Error(\n \"aiSdkHarness accepts exactly one of agent or run. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or run for a custom entrypoint.\",\n );\n }\n\n if (entrypoints === 0) {\n throw new Error(\n \"aiSdkHarness requires agent or run. Use agent for objects with run(input, runtime) or generate(input, runtime), or run for a custom entrypoint.\",\n );\n }\n}\n\nfunction hasAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n options: AiSdkHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & { agent: AgentSource<TAgent, TInput, TMetadata> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: AiSdkCreateAgentArgs<TInput, TMetadata>,\n) => MaybePromise<TAgent> {\n return (\n typeof agent === \"function\" &&\n !hasCallableMethod(agent, \"run\") &&\n !hasCallableMethod(agent, \"generate\")\n );\n}\n\ntype TraceRecorder = {\n id: string;\n rootSpanId: string;\n name: string;\n startedAt: Date;\n};\n\nfunction createTraceRecorder(name: string): TraceRecorder {\n const id = `ai_sdk_trace_${++nextTraceId}`;\n\n return {\n id,\n rootSpanId: `${id}:run`,\n name,\n startedAt: new Date(),\n };\n}\n\nfunction attachAiSdkTrace(\n run: HarnessRun,\n trace: TraceRecorder,\n result: unknown,\n finishedAt: Date,\n) {\n const errors = run.errors ?? [];\n const nativeTrace = finishAiSdkTrace(trace, {\n result,\n session: run.session,\n usage: run.usage,\n errors,\n finishedAt,\n });\n\n run.traces = [...(run.traces ?? []), nativeTrace];\n}\n\nfunction finishAiSdkTrace(\n trace: TraceRecorder,\n options: {\n result?: unknown;\n session: NormalizedSession;\n usage?: UsageSummary;\n errors?: unknown[];\n finishedAt: Date;\n },\n): NormalizedTrace {\n const modelSpans = createAiSdkModelSpans(\n trace,\n options.result,\n options.usage,\n );\n const toolSpans = createToolCallSpans(collectToolCalls(options.session), {\n traceId: trace.id,\n parentId: trace.rootSpanId,\n spanIdPrefix: `${trace.id}:tool`,\n });\n const finishedAt = options.finishedAt;\n const durationMs = finishedAt.getTime() - trace.startedAt.getTime();\n const rootError = options.errors?.[0]\n ? normalizeSpanError(options.errors[0])\n : undefined;\n const rootSpan: NormalizedSpan = {\n id: trace.rootSpanId,\n traceId: trace.id,\n name: trace.name,\n kind: \"run\",\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n status: rootError ? \"error\" : \"ok\",\n ...(rootError ? { error: rootError } : {}),\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"invoke_workflow\",\n \"gen_ai.workflow.name\": trace.name,\n ...createGenAiUsageAttributes(options.usage),\n }),\n };\n const spans = [rootSpan, ...modelSpans, ...toolSpans];\n\n return {\n id: trace.id,\n name: trace.name,\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n metadata: {\n source: \"harness-ai-sdk\",\n },\n spans,\n };\n}\n\nfunction createAiSdkModelSpans(\n trace: TraceRecorder,\n result: unknown,\n usage: UsageSummary | undefined,\n): NormalizedSpan[] {\n const steps = resolveSteps(result);\n if (steps.length === 0) {\n const fallback = createUsageModelSpan(trace, usage);\n return fallback ? [fallback] : [];\n }\n\n return steps.map((step, index) => {\n const stepUsage = step.usage;\n\n return {\n id: `${trace.id}:model:${index + 1}`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: `ai-sdk step ${step.stepNumber ?? index}`,\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n \"gen_ai.provider.name\": step.model?.provider,\n \"gen_ai.request.model\": step.model?.modelId,\n \"gen_ai.response.model\": step.model?.modelId,\n \"gen_ai.response.finish_reasons\": step.finishReason\n ? [String(step.finishReason)]\n : undefined,\n \"gen_ai.usage.input_tokens\": stepUsage?.inputTokens,\n \"gen_ai.usage.output_tokens\": stepUsage?.outputTokens,\n \"gen_ai.usage.reasoning.output_tokens\":\n stepUsage?.outputTokenDetails?.reasoningTokens ??\n stepUsage?.reasoningTokens,\n \"gen_ai.usage.cache_read.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheReadTokens ??\n stepUsage?.cachedInputTokens,\n \"gen_ai.usage.cache_creation.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheWriteTokens,\n \"ai.step.number\": step.stepNumber,\n \"ai.finish_reason\": step.finishReason,\n \"ai.raw_finish_reason\": step.rawFinishReason,\n }),\n } satisfies NormalizedSpan;\n });\n}\n\nfunction createUsageModelSpan(\n trace: TraceRecorder,\n usage: UsageSummary | undefined,\n): NormalizedSpan | undefined {\n if (!usage?.provider && !usage?.model) {\n return undefined;\n }\n\n return {\n id: `${trace.id}:model:1`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: usage.model ? `ai-sdk ${usage.model}` : \"ai-sdk model\",\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n ...createGenAiUsageAttributes(usage),\n }),\n };\n}\n\nfunction createToolset<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends AiSdkToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput, TMetadata> | undefined;\n replayMetadataByToolCallId: Map<string, ReplayMetadata>;\n runtimeToolCalls: ToolCallRecord[];\n}) {\n return Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => {\n const replay = toolReplay?.[toolName];\n\n if (replay && !tool.execute) {\n throw new Error(\n `Tool replay requires execute() for ${toolName}. Provider-executed tools cannot be recorded automatically.`,\n );\n }\n\n if (!tool.execute) {\n return [toolName, tool];\n }\n\n const execute = tool.execute;\n const wrappedTool = {\n ...tool,\n execute: async (\n toolInput: InferToolInput<typeof tool>,\n execution: ToolExecutionOptions,\n ) => {\n const startedAt = new Date();\n const normalizedArgs = normalizeArguments(toolInput);\n const replayContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput, TMetadata>;\n\n try {\n const executionResult = replay\n ? await executeToolWithReplay({\n toolName,\n toolInput,\n execute,\n execution,\n context: replayContext,\n replay,\n })\n : {\n result: await execute(toolInput, execution),\n replay: undefined,\n };\n const finishedAt = new Date();\n const normalizedResult = toJsonValue(executionResult.result);\n const replayMetadata = normalizeReplayMetadata(\n executionResult.replay,\n );\n\n if (executionResult.replay) {\n replayMetadataByToolCallId.set(\n execution.toolCallId,\n executionResult.replay,\n );\n }\n\n runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n ...(normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\n });\n\n return executionResult.result as InferToolOutput<typeof tool>;\n } catch (error) {\n const replay = getReplayMetadataFromError(error);\n const finishedAt = new Date();\n const replayMetadata = normalizeReplayMetadata(replay);\n\n if (replay) {\n replayMetadataByToolCallId.set(execution.toolCallId, replay);\n }\n\n runtimeToolCalls.push({\n id: execution.toolCallId,\n name: toolName,\n ...(normalizedArgs ? { arguments: normalizedArgs } : {}),\n error: normalizeError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n ...(replayMetadata ? { metadata: replayMetadata } : {}),\n });\n throw error;\n }\n },\n } satisfies typeof tool;\n\n return [toolName, wrappedTool];\n }),\n ) as AiSdkRuntimeToolset<TTools>;\n}\n\nasync function executeToolWithReplay<\n TInput,\n TMetadata extends HarnessMetadata,\n TTool extends AiSdkToolDefinition<any, any, TInput, TMetadata>,\n>({\n toolName,\n toolInput,\n execute,\n execution,\n context,\n replay,\n}: {\n toolName: string;\n toolInput: InferToolInput<TTool>;\n execute: NonNullable<TTool[\"execute\"]>;\n execution: ToolExecutionOptions;\n context: AiSdkToolContext<TInput, TMetadata>;\n replay: AiSdkToolReplayPolicy<TInput, TMetadata>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<\n JsonValue,\n JsonValue,\n AiSdkToolContext<TInput, TMetadata>\n >({\n toolName,\n args: replayInput,\n context,\n execute: async (replayedInput) => {\n const output = await execute(\n replayedInput as InferToolInput<TTool>,\n execution,\n );\n\n if (isAsyncIterable(output)) {\n throw new Error(\n `Tool replay only supports JSON-serializable outputs. ${toolName} returned an async iterable.`,\n );\n }\n\n return toReplayJsonValue(output, `${toolName} tool output`);\n },\n replay,\n });\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const candidates = [\"output\", \"object\", \"text\"] satisfies string[];\n const resultRecord = result as Record<string, unknown>;\n\n for (const key of candidates) {\n if (Object.prototype.hasOwnProperty.call(resultRecord, key)) {\n return toOutputValue(resultRecord[key]);\n }\n }\n\n return undefined;\n}\n\n// Keep this adapter-local rather than exporting a core helper. Core\n// `toJsonValue` normalizes trace data; inferred app output should only accept\n// values that are already JSON-safe so the public contract stays explicit.\n// Invalid nested values reject the whole candidate instead of being patched.\nfunction toOutputValue(value: unknown): JsonValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (Array.isArray(value)) {\n const items: JsonValue[] = [];\n for (const item of value) {\n const normalized = toOutputValue(item);\n if (normalized === undefined) {\n return undefined;\n }\n items.push(normalized);\n }\n return items;\n }\n\n if (typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return undefined;\n }\n\n const record: Record<string, JsonValue> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = toOutputValue(entry);\n if (normalized === undefined) {\n return undefined;\n }\n record[key] = normalized;\n }\n return record;\n }\n\n return undefined;\n}\n\nfunction resolveUsage(result: unknown, runtimeToolCallCount = 0): UsageSummary {\n const steps = resolveSteps(result);\n const usage = resolveLanguageModelUsage(result) ?? resolveStepUsage(steps);\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n if (!usage) {\n if (steps.length > 0) {\n const toolCallCount = countStepToolCalls(steps);\n\n return {\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n ...(toolCallCount > 0 ? { toolCalls: toolCallCount } : {}),\n };\n }\n\n return runtimeToolCallCount > 0 ? { toolCalls: runtimeToolCallCount } : {};\n }\n\n const stepToolCallCount = countStepToolCalls(steps);\n const toolCallCount =\n stepToolCallCount > 0 ? stepToolCallCount : runtimeToolCallCount;\n\n return {\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens:\n usage.outputTokenDetails?.reasoningTokens ?? usage.reasoningTokens,\n totalTokens:\n usage.totalTokens ?? (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),\n toolCalls: toolCallCount > 0 ? toolCallCount : undefined,\n metadata: normalizeMetadata({\n cacheReadTokens:\n usage.inputTokenDetails?.cacheReadTokens ?? usage.cachedInputTokens,\n cacheWriteTokens: usage.inputTokenDetails?.cacheWriteTokens,\n raw: usage.raw,\n }),\n };\n}\n\nfunction resolveStepUsage(steps: StepLike[]): LanguageModelUsage | undefined {\n const usages = steps\n .map((step) => step.usage)\n .filter((usage): usage is LanguageModelUsage => Boolean(usage));\n\n if (usages.length === 0) {\n return undefined;\n }\n\n return usages.reduce(addLanguageModelUsage);\n}\n\nfunction addLanguageModelUsage(\n left: LanguageModelUsage,\n right: LanguageModelUsage,\n): LanguageModelUsage {\n return {\n inputTokens: addTokenCounts(left.inputTokens, right.inputTokens),\n inputTokenDetails: {\n noCacheTokens: addTokenCounts(\n left.inputTokenDetails?.noCacheTokens,\n right.inputTokenDetails?.noCacheTokens,\n ),\n cacheReadTokens: addTokenCounts(\n left.inputTokenDetails?.cacheReadTokens,\n right.inputTokenDetails?.cacheReadTokens,\n ),\n cacheWriteTokens: addTokenCounts(\n left.inputTokenDetails?.cacheWriteTokens,\n right.inputTokenDetails?.cacheWriteTokens,\n ),\n },\n outputTokens: addTokenCounts(left.outputTokens, right.outputTokens),\n outputTokenDetails: {\n textTokens: addTokenCounts(\n left.outputTokenDetails?.textTokens,\n right.outputTokenDetails?.textTokens,\n ),\n reasoningTokens: addTokenCounts(\n left.outputTokenDetails?.reasoningTokens,\n right.outputTokenDetails?.reasoningTokens,\n ),\n },\n totalTokens: addTokenCounts(left.totalTokens, right.totalTokens),\n reasoningTokens: addTokenCounts(\n left.reasoningTokens,\n right.reasoningTokens,\n ),\n cachedInputTokens: addTokenCounts(\n left.cachedInputTokens,\n right.cachedInputTokens,\n ),\n };\n}\n\nfunction addTokenCounts(left: number | undefined, right: number | undefined) {\n return left == null && right == null ? undefined : (left ?? 0) + (right ?? 0);\n}\n\nfunction countStepToolCalls(steps: StepLike[]) {\n return steps.reduce(\n (count, step) => count + (step.toolCalls?.length ?? 0),\n 0,\n );\n}\n\nfunction resolveSession(\n input: unknown,\n result: unknown,\n output: JsonValue | undefined,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n runtimeToolCalls: ToolCallRecord[] = [],\n): NormalizedSession {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return (result as { session: NormalizedSession }).session;\n }\n\n if (\n isNormalizedSession((result as Record<string, unknown> | undefined)?.trace)\n ) {\n return (result as { trace: NormalizedSession }).trace;\n }\n\n const steps = resolveSteps(result);\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const stepToolCallIds = new Set<string>();\n\n for (const step of steps) {\n for (const toolCall of step.toolCalls ?? []) {\n stepToolCallIds.add(toolCall.toolCallId);\n }\n messages.push(...normalizeStep(step, replayMetadataByToolCallId));\n }\n\n const unmatchedRuntimeToolCalls = runtimeToolCalls.filter(\n (call) => call.id === undefined || !stepToolCallIds.has(call.id),\n );\n\n if (unmatchedRuntimeToolCalls.length > 0) {\n messages.push(...normalizeRuntimeToolCalls(unmatchedRuntimeToolCalls));\n }\n\n if (\n output !== undefined &&\n !messages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n messages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n const lastStep = steps.length > 0 ? steps[steps.length - 1] : undefined;\n\n return {\n messages,\n provider: lastStep?.model.provider,\n model: lastStep?.model.modelId,\n };\n}\n\nfunction normalizeRuntimeToolCalls(\n runtimeToolCalls: ToolCallRecord[],\n): NormalizedMessage[] {\n const messages: NormalizedMessage[] = [\n {\n role: \"assistant\",\n toolCalls: runtimeToolCalls,\n },\n ];\n\n for (const call of runtimeToolCalls) {\n if (call.result === undefined && !call.error) {\n continue;\n }\n\n const content =\n call.result !== undefined\n ? call.result\n : call.error && call.error.message.length > 0\n ? call.error.message\n : undefined;\n\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: call.name,\n toolCallId: call.id,\n isError: Boolean(call.error),\n }),\n });\n }\n\n return messages;\n}\n\nfunction resolveSteps(result: unknown): StepLike[] {\n if (!result || typeof result !== \"object\") {\n return [];\n }\n\n return Array.isArray((result as AiSdkLikeResult).steps)\n ? ((result as AiSdkLikeResult).steps ?? [])\n : [];\n}\n\nfunction resolveLanguageModelUsage(\n result: unknown,\n): LanguageModelUsage | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const aiResult = result as AiSdkLikeResult;\n return aiResult.totalUsage ?? aiResult.usage;\n}\n\nfunction normalizeStep(\n step: StepLike,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): NormalizedMessage[] {\n const toolResultsById = new Map(\n (step.toolResults ?? []).map((toolResult) => [\n toolResult.toolCallId,\n toolResult,\n ]),\n );\n\n const normalizedCalls = (step.toolCalls ?? []).map((toolCall) =>\n normalizeToolCall(toolCall, toolResultsById, replayMetadataByToolCallId),\n );\n const normalizedCallsById = new Map(\n normalizedCalls.map((toolCall) => [toolCall.id, toolCall]),\n );\n const assistantMetadata = normalizeMetadata({\n stepNumber: step.stepNumber,\n finishReason: step.finishReason,\n rawFinishReason: step.rawFinishReason,\n reasoningText: step.reasoningText,\n response: step.response,\n });\n const messages: NormalizedMessage[] = [];\n\n if (step.text || normalizedCalls.length > 0 || assistantMetadata) {\n messages.push({\n role: \"assistant\",\n ...(step.text ? { content: step.text } : {}),\n ...(normalizedCalls.length > 0 ? { toolCalls: normalizedCalls } : {}),\n ...(assistantMetadata ? { metadata: assistantMetadata } : {}),\n });\n }\n\n for (const toolResult of step.toolResults ?? []) {\n const content =\n toolResult.output === undefined\n ? undefined\n : normalizeContent(toolResult.output);\n messages.push({\n role: \"tool\",\n ...(content !== undefined ? { content } : {}),\n metadata: normalizeMetadata({\n name: toolResult.toolName,\n toolCallId: toolResult.toolCallId,\n isError: Boolean(normalizedCallsById.get(toolResult.toolCallId)?.error),\n preliminary: toolResult.preliminary,\n providerExecuted: toolResult.providerExecuted,\n title: toolResult.title,\n providerMetadata: toolResult.providerMetadata,\n }),\n });\n }\n\n return messages;\n}\n\nfunction normalizeToolCall(\n toolCall: StepLike[\"toolCalls\"][number],\n toolResultsById: Map<string, StepLike[\"toolResults\"][number]>,\n replayMetadataByToolCallId: Map<string, ReplayMetadata>,\n): ToolCallRecord {\n const toolResult = toolResultsById.get(toolCall.toolCallId);\n const normalizedArguments = normalizeArguments(toolCall.input);\n const normalizedResult =\n toolResult !== undefined ? toJsonValue(toolResult.output) : undefined;\n const errorValue =\n toolCall.invalid || toolCall.error !== undefined\n ? normalizeError(toolCall.error ?? toolCall.invalid)\n : undefined;\n const replayMetadata = normalizeReplayMetadata(\n replayMetadataByToolCallId.get(toolCall.toolCallId),\n );\n\n return {\n id: toolCall.toolCallId,\n name: toolCall.toolName,\n ...(normalizedArguments ? { arguments: normalizedArguments } : {}),\n ...(toolResult && normalizedResult !== undefined\n ? { result: normalizedResult }\n : {}),\n ...(errorValue ? { error: errorValue } : {}),\n metadata: normalizeMetadata({\n providerExecuted:\n toolCall.providerExecuted ?? toolResult?.providerExecuted,\n title: toolCall.title ?? toolResult?.title,\n dynamic: toolCall.dynamic,\n invalid: toolCall.invalid,\n preliminary: toolResult?.preliminary,\n providerMetadata:\n toolCall.providerMetadata ?? toolResult?.providerMetadata,\n ...(replayMetadata ?? {}),\n }),\n };\n}\n\nfunction normalizeArguments(\n value: unknown,\n): Record<string, JsonValue> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n return normalizeRecord(value as Record<string, unknown>);\n}\n\nfunction normalizeError(error: unknown) {\n if (error instanceof Error) {\n return {\n type: error.name,\n message: error.message,\n };\n }\n\n const normalized = toJsonValue(error);\n if (\n normalized &&\n typeof normalized === \"object\" &&\n !Array.isArray(normalized) &&\n typeof normalized.message === \"string\"\n ) {\n return {\n message: normalized.message,\n type: typeof normalized.type === \"string\" ? normalized.type : \"Error\",\n };\n }\n\n return {\n type: \"Error\",\n message: String(error ?? \"Unknown tool call error\"),\n };\n}\n\nfunction toReplayJsonValue(value: unknown, label: string): JsonValue {\n const normalized = toJsonValue(value);\n if (normalized === undefined) {\n throw new Error(\n `Tool replay only supports JSON-serializable values. ${label} could not be normalized.`,\n );\n }\n\n return normalized;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n Symbol.asyncIterator in value\n );\n}\n"],"mappings":"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","names":["replay","toolCallCount"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n attachHarnessRunToError,\n createFailedHarnessRun,\n createGenAiUsageAttributes,\n createToolCallSpans,\n ensureRunTrace,\n getHarnessRunFromError,\n hasCallableMethod,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n normalizeMetadata,\n normalizeRecord,\n resolveHarnessRunErrors,\n serializeError,\n normalizeSpanAttributes,\n normalizeSpanError,\n toJsonValue,\n toolCalls as collectToolCalls,\n} from \"vitest-evals/harness\";\nimport type {\n Harness,\n HarnessContext,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSpan,\n NormalizedSession,\n NormalizedTrace,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport { generateObject, generateText, jsonSchema } from \"ai\";\nimport {\n createJudgeHarness,\n type JudgeHarnessInput,\n} from \"vitest-evals/judges\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMetadata,\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\nimport type {\n InferToolInput,\n InferToolOutput,\n LanguageModel,\n LanguageModelUsage,\n StepResult,\n Tool,\n ToolExecuteFunction,\n ToolExecutionOptions,\n ToolSet,\n} from \"ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AiSdkProviderOptions = Parameters<\n typeof generateText\n>[0][\"providerOptions\"];\ntype JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<TAgent, TInput = string> =\n | TAgent\n | ((args: AiSdkCreateAgentArgs<TInput>) => MaybePromise<TAgent>);\ntype AnyAiSdkToolset<TInput = string> = Record<\n string,\n AiSdkToolDefinition<any, any, TInput>\n>;\n\nlet nextTraceId = 0;\n\n/**\n * Configuration for adapting an AI SDK language model into a judge harness.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n * ```\n */\nexport interface AiSdkJudgeHarnessConfig {\n /** AI SDK language model used for judge prompts. */\n model: LanguageModel;\n /** Optional display name for diagnostics. */\n name?: string;\n /** Optional judge-model temperature. */\n temperature?: number;\n /** Optional judge-model token cap. */\n maxOutputTokens?: number;\n /** Optional provider-specific options forwarded to the AI SDK. */\n providerOptions?: AiSdkProviderOptions;\n}\n\n/**\n * Adapts an AI SDK language model into the provider-neutral judge harness API.\n *\n * @example\n * ```ts\n * import { anthropic } from \"@ai-sdk/anthropic\";\n * import { aiSdkJudgeHarness } from \"@vitest-evals/harness-ai-sdk\";\n * import { describeEval, FactualityJudge } from \"vitest-evals\";\n *\n * const judgeHarness = aiSdkJudgeHarness({\n * model: anthropic(\"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n *\n * describeEval(\"qa agent\", {\n * harness: qaHarness,\n * judgeHarness,\n * judges: [FactualityJudge()],\n * }, (it) => {});\n * ```\n */\nexport function aiSdkJudgeHarness(config: AiSdkJudgeHarnessConfig) {\n return createJudgeHarness({\n name: config.name ?? \"ai-sdk\",\n run: (input, options) => runAiSdkJudgeHarness(config, input, options),\n });\n}\n\nasync function runAiSdkJudgeHarness(\n config: AiSdkJudgeHarnessConfig,\n input: JudgeHarnessInput,\n options: { signal?: AbortSignal },\n) {\n const system = formatAiSdkJudgeSystemPrompt(\n input.system,\n input.responseFormat,\n );\n const requestOptions = {\n model: config.model,\n prompt: input.prompt,\n ...(system !== undefined ? { system } : {}),\n ...(config.temperature !== undefined\n ? { temperature: config.temperature }\n : {}),\n ...(config.maxOutputTokens !== undefined\n ? { maxOutputTokens: config.maxOutputTokens }\n : {}),\n ...(config.providerOptions !== undefined\n ? { providerOptions: config.providerOptions }\n : {}),\n ...(options.signal ? { abortSignal: options.signal } : {}),\n };\n\n if (\n input.responseFormat?.type === \"json\" &&\n input.responseFormat.schema !== undefined\n ) {\n const { object } = await generateObject({\n ...requestOptions,\n schema: jsonSchema(\n input.responseFormat.schema as Parameters<typeof jsonSchema>[0],\n ),\n });\n\n return object;\n }\n\n const { text } = await generateText(requestOptions);\n return text;\n}\n\nfunction formatAiSdkJudgeSystemPrompt(\n system: string | undefined,\n responseFormat: JudgeHarnessInput[\"responseFormat\"],\n) {\n if (responseFormat?.type !== \"json\" || responseFormat.schema !== undefined) {\n return system;\n }\n\n const jsonInstruction =\n \"Return only valid JSON. Do not include markdown fences or explanatory prose.\";\n\n return system ? `${system}\\n\\n${jsonInstruction}` : jsonInstruction;\n}\n\ntype StepLike = Pick<\n StepResult<ToolSet>,\n | \"content\"\n | \"finishReason\"\n | \"model\"\n | \"rawFinishReason\"\n | \"reasoningText\"\n | \"response\"\n | \"stepNumber\"\n | \"text\"\n | \"toolCalls\"\n | \"toolResults\"\n | \"usage\"\n>;\n\ntype AiSdkLikeResult = {\n steps?: StepLike[];\n usage?: LanguageModelUsage;\n totalUsage?: LanguageModelUsage;\n output?: unknown;\n object?: unknown;\n text?: string;\n session?: NormalizedSession;\n 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 TTools extends AiSdkToolset<TInput>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : TAgent extends {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n }\n ? Awaited<TResult>\n : unknown;\n\n/** Context passed to instrumented AI SDK tool executions. */\nexport interface AiSdkToolContext<TInput = string> {\n input: TInput;\n signal?: AbortSignal;\n setArtifact: HarnessContext[\"setArtifact\"];\n execution: ToolExecutionOptions;\n}\n\n/** Replay mode alias used by the AI SDK harness package. */\nexport type AiSdkReplayMode = ReplayMode;\n\n/** Tool replay recording shape for AI SDK tools. */\nexport type AiSdkToolRecording<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for an AI SDK tool. */\nexport type AiSdkToolReplayConfig<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n> = ToolReplayConfig<TArgs, TResult, AiSdkToolContext<TInput>>;\n\n/** AI SDK tool definition accepted by the harness. */\nexport type AiSdkToolDefinition<\n TArgs extends JsonValue = JsonValue,\n TResult extends JsonValue = JsonValue,\n _TInput = string,\n> = Tool<TArgs, TResult>;\n\n/** Replay policy for one AI SDK tool. */\nexport type AiSdkToolReplayPolicy<TInput = string> =\n | boolean\n | AiSdkToolReplayConfig<JsonValue, JsonValue, TInput>;\n\n/** Replay policy map keyed by AI SDK tool name. */\nexport type AiSdkToolReplayPolicies<TInput = string> = Record<\n string,\n AiSdkToolReplayPolicy<TInput>\n>;\n\n/** Toolset shape accepted by the AI SDK harness. */\nexport type AiSdkToolset<TInput = string> = AnyAiSdkToolset<TInput>;\n\n/** Runtime toolset exposed to the system under test. */\nexport type AiSdkRuntimeToolset<TTools extends AnyAiSdkToolset<any>> = {\n [K in keyof TTools]: TTools[K] extends AiSdkToolDefinition<\n infer TArgs extends JsonValue,\n infer TResult extends JsonValue,\n infer _TInput\n >\n ? Omit<TTools[K], \"execute\"> & {\n execute?: ToolExecuteFunction<TArgs, TResult>;\n }\n : TTools[K];\n};\n\n/** Runtime object passed into AI SDK-style agent entrypoints. */\nexport interface AiSdkRuntime<\n TTools extends AiSdkToolset<TInput>,\n TInput = string,\n> {\n tools: AiSdkRuntimeToolset<TTools>;\n signal?: AbortSignal;\n}\n\n/** Arguments passed to per-run AI SDK agent factories. */\nexport interface AiSdkCreateAgentArgs<TInput = string> {\n input: TInput;\n context: HarnessContext;\n}\n\n/** Arguments passed to custom AI SDK harness run callbacks. */\nexport interface AiSdkHarnessRunArgs<\n TAgent,\n TInput,\n TTools extends AiSdkToolset<TInput>,\n> {\n agent: TAgent | undefined;\n input: TInput;\n context: HarnessContext;\n runtime: AiSdkRuntime<TTools, TInput>;\n tools: AiSdkRuntimeToolset<TTools>;\n}\n\n/** Arguments passed to AI SDK harness output selectors. */\nexport interface AiSdkHarnessResultArgs<\n TAgent,\n TInput,\n TResult,\n TTools extends AiSdkToolset<TInput>,\n> extends AiSdkHarnessRunArgs<TAgent, TInput, TTools> {\n result: TResult;\n}\n\ntype AiSdkHarnessOutputSelector<\n TAgent,\n TInput,\n TResult,\n TTools extends AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined,\n> = (\n args: AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype AiSdkHarnessOptions<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> &\n (\n | {\n agent: AgentSource<TAgent, TInput>;\n run?: never;\n }\n | {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n agent?: never;\n }\n );\n\ntype AiSdkHarnessOptionsWithOutput<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput> & {\n output: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n};\n\ntype AiSdkHarnessRunOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n run: (\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult>;\n agent?: never;\n output?: never;\n};\n\ntype AiSdkHarnessAgentOptionsWithoutOutput<\n TAgent = unknown,\n TInput = string,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n> = AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n agent: AgentSource<TAgent, TInput>;\n run?: never;\n output?: never;\n};\n\ninterface AiSdkHarnessBaseOptions<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n tools?: TTools;\n toolReplay?: AiSdkToolReplayPolicies<TInput>;\n output?: AiSdkHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n name?: string;\n}\n\ntype AiSdkRunnableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n> = {\n run: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype AiSdkGeneratableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n> = {\n generate: (\n input: TInput,\n runtime: AiSdkRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\n/** Adapts an AI SDK-style workflow into a normalized eval harness. */\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptionsWithOutput<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessRunOptionsWithoutOutput<TAgent, TInput, TResult, TTools>,\n): Harness<TInput, AiSdkResultOutput<Awaited<TResult>>>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessAgentOptionsWithoutOutput<TAgent, TInput, TTools>,\n): Harness<TInput, AiSdkResultOutput<AiSdkAgentResult<TAgent, TInput, TTools>>>;\nexport function aiSdkHarness<\n TAgent = unknown,\n TInput = string,\n TResult = unknown,\n TTools extends AiSdkToolset<TInput> = AiSdkToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): Harness<TInput, TOutput> {\n validateOptions(options);\n\n const harnessName = options.name ?? \"ai-sdk\";\n const harness: Harness<TInput, TOutput> = {\n name: harnessName,\n run: async (input, context) => {\n const startedAt = new Date();\n\n try {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n return await runAiSdkHarness(options, agent, input, context);\n } catch (error) {\n if (getHarnessRunFromError(error)) {\n throw error;\n }\n\n throw attachHarnessRunToError(\n error,\n createFailedAiSdkRun(input, context, error, harnessName, startedAt),\n );\n }\n },\n };\n\n return harness;\n}\n\nfunction createFailedAiSdkRun<TInput>(\n input: TInput,\n context: HarnessContext,\n error: unknown,\n harnessName: string,\n startedAt: Date,\n) {\n const run = createFailedHarnessRun(input, error, {\n artifacts: context.artifacts,\n });\n ensureRunTrace(run, {\n name: harnessName,\n startedAt,\n finishedAt: new Date(),\n operationName: \"invoke_workflow\",\n source: \"harness-ai-sdk\",\n });\n\n return run;\n}\n\nasync function runAiSdkHarness<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n agent: TAgent | undefined,\n input: TInput,\n context: HarnessContext,\n): Promise<HarnessRun<TOutput>> {\n const trace = createTraceRecorder(options.name ?? \"ai-sdk\");\n const replayMetadataByToolCallId = new Map<string, ReplayMetadata>();\n const 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>;\n\n try {\n const result = await runAgent(options, {\n agent,\n input,\n context,\n runtime,\n tools,\n });\n\n if (isHarnessRun(result) && !hasOutputSelector(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n attachAiSdkTrace(result, trace, result, new Date());\n return result;\n }\n\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n tools,\n result: result as TResult,\n } satisfies AiSdkHarnessResultArgs<TAgent, TInput, TResult, TTools>;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(result) as TOutput | undefined);\n const usage = resolveUsage(result, runtimeToolCalls.length);\n const session = resolveSession(\n input,\n result,\n output,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n const errors = resolveHarnessRunErrors(result);\n const finishedAt = new Date();\n\n return {\n session,\n output,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors,\n traces: [\n finishAiSdkTrace(trace, {\n result,\n session,\n usage,\n errors,\n finishedAt,\n }),\n ],\n } as HarnessRun<TOutput>;\n } catch (error) {\n const finishedAt = new Date();\n const serializedError = serializeError(error);\n const usage =\n runtimeToolCalls.length > 0 ? { toolCalls: runtimeToolCalls.length } : {};\n const session = resolveSession(\n input,\n undefined,\n undefined,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n );\n const run = {\n session,\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializedError],\n traces: [\n finishAiSdkTrace(trace, {\n session,\n usage,\n errors: [serializedError],\n finishedAt,\n }),\n ],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(options: AiSdkHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput>) {\n return Boolean(options.output);\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: AiSdkCreateAgentArgs<TInput>,\n) {\n return hasAgentSource(options)\n ? await resolveAgentSource(options.agent, args)\n : undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: AiSdkHarnessRunArgs<TAgent, TInput, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (hasAiSdkRunMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n if (hasAiSdkGenerateMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.generate(args.input, args.runtime);\n }\n\n throw new Error(\n \"aiSdkHarness agent must expose run(input, runtime) or generate(input, runtime), or use run() for a custom entrypoint.\",\n );\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>) {\n const hasAgent = hasAgentSource(options);\n const hasRun = typeof (options as { run?: unknown }).run === \"function\";\n const entrypoints = [hasAgent, hasRun].filter(Boolean).length;\n\n if (entrypoints > 1) {\n throw new Error(\n \"aiSdkHarness accepts exactly one of agent or run. Use agent for the zero-glue run(input, runtime) or generate(input, runtime) path, or run for a custom entrypoint.\",\n );\n }\n\n if (entrypoints === 0) {\n throw new Error(\n \"aiSdkHarness requires agent or run. Use agent for objects with run(input, runtime) or generate(input, runtime), or run for a custom entrypoint.\",\n );\n }\n}\n\nfunction hasAgentSource<\n TAgent,\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n options: AiSdkHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): options is AiSdkHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n> & { agent: AgentSource<TAgent, TInput> } {\n return \"agent\" in options && options.agent !== undefined;\n}\n\nasync function resolveAgentSource<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n args: AiSdkCreateAgentArgs<TInput>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction hasAiSdkRunMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n agent: unknown,\n): agent is AiSdkRunnableAgent<TInput, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"run\");\n}\n\nfunction hasAiSdkGenerateMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends AiSdkToolset<TInput>,\n>(\n agent: unknown,\n): agent is AiSdkGeneratableAgent<TInput, TResult, TOutput, TTools> {\n return hasCallableMethod(agent, \"generate\");\n}\n\nfunction isAgentFactory<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n): agent is (args: AiSdkCreateAgentArgs<TInput>) => MaybePromise<TAgent> {\n return (\n typeof agent === \"function\" &&\n !hasCallableMethod(agent, \"run\") &&\n !hasCallableMethod(agent, \"generate\")\n );\n}\n\ntype TraceRecorder = {\n id: string;\n rootSpanId: string;\n name: string;\n startedAt: Date;\n};\n\nfunction createTraceRecorder(name: string): TraceRecorder {\n const id = `ai_sdk_trace_${++nextTraceId}`;\n\n return {\n id,\n rootSpanId: `${id}:run`,\n name,\n startedAt: new Date(),\n };\n}\n\nfunction attachAiSdkTrace(\n run: HarnessRun,\n trace: TraceRecorder,\n result: unknown,\n finishedAt: Date,\n) {\n const errors = run.errors ?? [];\n const nativeTrace = finishAiSdkTrace(trace, {\n result,\n session: run.session,\n usage: run.usage,\n errors,\n finishedAt,\n });\n\n run.traces = [...(run.traces ?? []), nativeTrace];\n}\n\nfunction finishAiSdkTrace(\n trace: TraceRecorder,\n options: {\n result?: unknown;\n session: NormalizedSession;\n usage?: UsageSummary;\n errors?: unknown[];\n finishedAt: Date;\n },\n): NormalizedTrace {\n const modelSpans = createAiSdkModelSpans(\n trace,\n options.result,\n options.usage,\n );\n const toolSpans = createToolCallSpans(collectToolCalls(options.session), {\n traceId: trace.id,\n parentId: trace.rootSpanId,\n spanIdPrefix: `${trace.id}:tool`,\n });\n const finishedAt = options.finishedAt;\n const durationMs = finishedAt.getTime() - trace.startedAt.getTime();\n const rootError = options.errors?.[0]\n ? normalizeSpanError(options.errors[0])\n : undefined;\n const rootSpan: NormalizedSpan = {\n id: trace.rootSpanId,\n traceId: trace.id,\n name: trace.name,\n kind: \"run\",\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n status: rootError ? \"error\" : \"ok\",\n ...(rootError ? { error: rootError } : {}),\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"invoke_workflow\",\n \"gen_ai.workflow.name\": trace.name,\n ...createGenAiUsageAttributes(options.usage),\n }),\n };\n const spans = [rootSpan, ...modelSpans, ...toolSpans];\n\n return {\n id: trace.id,\n name: trace.name,\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n metadata: {\n source: \"harness-ai-sdk\",\n },\n spans,\n };\n}\n\nfunction createAiSdkModelSpans(\n trace: TraceRecorder,\n result: unknown,\n usage: UsageSummary | undefined,\n): NormalizedSpan[] {\n const steps = resolveSteps(result);\n if (steps.length === 0) {\n const fallback = createUsageModelSpan(trace, usage);\n return fallback ? [fallback] : [];\n }\n\n return steps.map((step, index) => {\n const stepUsage = step.usage;\n\n return {\n id: `${trace.id}:model:${index + 1}`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: `ai-sdk step ${step.stepNumber ?? index}`,\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n \"gen_ai.provider.name\": step.model?.provider,\n \"gen_ai.request.model\": step.model?.modelId,\n \"gen_ai.response.model\": step.model?.modelId,\n \"gen_ai.response.finish_reasons\": step.finishReason\n ? [String(step.finishReason)]\n : undefined,\n \"gen_ai.usage.input_tokens\": stepUsage?.inputTokens,\n \"gen_ai.usage.output_tokens\": stepUsage?.outputTokens,\n \"gen_ai.usage.reasoning.output_tokens\":\n stepUsage?.outputTokenDetails?.reasoningTokens ??\n stepUsage?.reasoningTokens,\n \"gen_ai.usage.cache_read.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheReadTokens ??\n stepUsage?.cachedInputTokens,\n \"gen_ai.usage.cache_creation.input_tokens\":\n stepUsage?.inputTokenDetails?.cacheWriteTokens,\n \"ai.step.number\": step.stepNumber,\n \"ai.finish_reason\": step.finishReason,\n \"ai.raw_finish_reason\": step.rawFinishReason,\n }),\n } satisfies NormalizedSpan;\n });\n}\n\nfunction createUsageModelSpan(\n trace: TraceRecorder,\n usage: UsageSummary | undefined,\n): NormalizedSpan | undefined {\n if (!usage?.provider && !usage?.model) {\n return undefined;\n }\n\n return {\n id: `${trace.id}:model:1`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: usage.model ? `ai-sdk ${usage.model}` : \"ai-sdk model\",\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n ...createGenAiUsageAttributes(usage),\n }),\n };\n}\n\nfunction createToolset<TInput, TTools extends AiSdkToolset<TInput>>({\n input,\n context,\n tools,\n toolReplay,\n replayMetadataByToolCallId,\n runtimeToolCalls,\n}: {\n input: TInput;\n context: HarnessContext;\n tools: TTools | undefined;\n toolReplay: AiSdkToolReplayPolicies<TInput> | 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 signal: context.signal,\n setArtifact: context.setArtifact,\n execution,\n } satisfies AiSdkToolContext<TInput>;\n\n try {\n const executionResult = replay\n ? await executeToolWithReplay({\n toolName,\n toolInput,\n execute,\n execution,\n context: replayContext,\n replay,\n })\n : {\n result: await execute(toolInput, execution),\n replay: undefined,\n };\n const finishedAt = new Date();\n const 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 TTool extends AiSdkToolDefinition<any, any, TInput>,\n>({\n toolName,\n toolInput,\n execute,\n execution,\n context,\n replay,\n}: {\n toolName: string;\n toolInput: InferToolInput<TTool>;\n execute: NonNullable<TTool[\"execute\"]>;\n execution: ToolExecutionOptions;\n context: AiSdkToolContext<TInput>;\n replay: AiSdkToolReplayPolicy<TInput>;\n}) {\n const replayInput = toReplayJsonValue(toolInput, `${toolName} tool input`);\n\n return executeWithReplay<JsonValue, JsonValue, AiSdkToolContext<TInput>>({\n toolName,\n args: replayInput,\n context,\n execute: async (replayedInput) => {\n const output = await execute(\n replayedInput as InferToolInput<TTool>,\n execution,\n );\n\n if (isAsyncIterable(output)) {\n throw new Error(\n `Tool replay only supports JSON-serializable outputs. ${toolName} returned an async iterable.`,\n );\n }\n\n return toReplayJsonValue(output, `${toolName} tool output`);\n },\n replay,\n });\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const candidates = [\"output\", \"object\", \"text\"] satisfies string[];\n const resultRecord = result as Record<string, unknown>;\n\n for (const key of candidates) {\n if (Object.prototype.hasOwnProperty.call(resultRecord, key)) {\n return toOutputValue(resultRecord[key]);\n }\n }\n\n return undefined;\n}\n\n// Keep this adapter-local rather than exporting a core helper. Core\n// `toJsonValue` normalizes trace data; inferred app output should only accept\n// values that are already JSON-safe so the public contract stays explicit.\n// Invalid nested values reject the whole candidate instead of being patched.\nfunction toOutputValue(value: unknown): JsonValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (Array.isArray(value)) {\n const items: JsonValue[] = [];\n for (const item of value) {\n const normalized = toOutputValue(item);\n if (normalized === undefined) {\n return undefined;\n }\n items.push(normalized);\n }\n return items;\n }\n\n if (typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return undefined;\n }\n\n const record: Record<string, JsonValue> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = toOutputValue(entry);\n if (normalized === undefined) {\n return undefined;\n }\n record[key] = normalized;\n }\n return record;\n }\n\n return undefined;\n}\n\nfunction resolveUsage(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.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "AI SDK harness adapter for vitest-evals.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -37,7 +37,7 @@
37
37
  },
38
38
  "devDependencies": {
39
39
  "ai": "^6.0.141",
40
- "vitest-evals": "0.12.0"
40
+ "vitest-evals": "0.13.0"
41
41
  },
42
42
  "scripts": {
43
43
  "build": "tsup --config ./tsup.config.ts"