@vitest-evals/harness-pi-ai 0.9.0 → 0.10.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
@@ -43,23 +43,24 @@ describeEval("refund agent", { harness }, (it) => {
43
43
  ```
44
44
 
45
45
  `run` executes the Pi agent under test. Judges are created separately; keep
46
- judge prompts and model calls in the judge instead of putting a judge model
47
- call on the app harness.
46
+ judge prompts on the judge and model calls on a judge harness instead of
47
+ putting a judge model call on the app harness.
48
48
 
49
49
  ```ts
50
- const RefundRubricJudge = createJudge(
51
- "RefundRubricJudge",
52
- async (ctx: JudgeContext<string, RefundDecision>) => {
53
- const verdict = await queryRefundJudgeModel({
54
- prompt: formatJudgePrompt({
55
- input: ctx.input,
56
- output: ctx.output,
57
- }),
58
- });
50
+ import { getModel } from "@mariozechner/pi-ai";
51
+ import { piAiJudgeHarness } from "@vitest-evals/harness-pi-ai";
52
+ import { describeEval, FactualityJudge } from "vitest-evals";
59
53
 
60
- return parseJudgeVerdict(verdict);
61
- },
62
- );
54
+ const judgeHarness = piAiJudgeHarness({
55
+ model: getModel("anthropic", "claude-sonnet-4-5"),
56
+ temperature: 0,
57
+ });
58
+ const factualityJudge = FactualityJudge({ judgeHarness });
59
+
60
+ describeEval("refund agent", {
61
+ harness,
62
+ judges: [factualityJudge],
63
+ });
63
64
  ```
64
65
 
65
66
  If the agent already exposes its own tools, the adapter will infer them from
@@ -170,7 +171,7 @@ overwrite the native recording.
170
171
 
171
172
  Supported modes:
172
173
 
174
+ - `auto` (default): replay when present, otherwise call live and write a recording
175
+ - `record`: always call live and overwrite the recording
173
176
  - `off`: never read or write recordings
174
- - `auto`: replay when present, otherwise call live and write a recording
175
177
  - `strict`: require an existing recording and fail if it is missing
176
- - `record`: always call live and overwrite the recording
package/dist/index.d.mts CHANGED
@@ -1,11 +1,61 @@
1
+ import * as vitest_evals_judges from 'vitest-evals/judges';
1
2
  import { NormalizedMessage, JsonValue, HarnessMetadata, HarnessContext, HarnessRun, Harness } from 'vitest-evals/harness';
2
3
  import { ReplayMode, ToolRecording, ToolReplayConfig } from 'vitest-evals/replay';
4
+ import { Api, Model, SimpleStreamOptions } from '@mariozechner/pi-ai';
3
5
 
4
6
  type MaybePromise<T> = T | Promise<T>;
5
7
  type JsonOutput<TValue> = [TValue] extends [JsonValue | undefined] ? TValue : undefined;
6
8
  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;
7
9
  type AgentSource<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = TAgent | ((args: PiAiCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);
8
10
  type AnyPiAiToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, PiAiToolDefinition<any, any, TInput, TMetadata>>;
11
+ /**
12
+ * Configuration for adapting a Pi AI model into a judge harness.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { getModel } from "@mariozechner/pi-ai";
17
+ * import { piAiJudgeHarness } from "@vitest-evals/harness-pi-ai";
18
+ *
19
+ * const judgeHarness = piAiJudgeHarness({
20
+ * model: getModel("anthropic", "claude-sonnet-4-5"),
21
+ * temperature: 0,
22
+ * });
23
+ * ```
24
+ */
25
+ interface PiAiJudgeHarnessConfig<TApi extends Api = Api> {
26
+ /** Pi AI model used for judge prompts. */
27
+ model: Model<TApi>;
28
+ /** Optional display name for diagnostics. */
29
+ name?: string;
30
+ /** Optional judge-model temperature. */
31
+ temperature?: number;
32
+ /** Optional judge-model token cap. */
33
+ maxOutputTokens?: number;
34
+ /** Additional Pi AI stream options forwarded to `completeSimple(...)`. */
35
+ options?: Omit<SimpleStreamOptions, "signal" | "temperature" | "maxTokens">;
36
+ }
37
+ /**
38
+ * Adapts a Pi AI model into the provider-neutral judge harness API.
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * import { getModel } from "@mariozechner/pi-ai";
43
+ * import { piAiJudgeHarness } from "@vitest-evals/harness-pi-ai";
44
+ * import { describeEval, FactualityJudge } from "vitest-evals";
45
+ *
46
+ * const judgeHarness = piAiJudgeHarness({
47
+ * model: getModel("anthropic", "claude-sonnet-4-5"),
48
+ * temperature: 0,
49
+ * });
50
+ *
51
+ * describeEval("qa agent", {
52
+ * harness: qaHarness,
53
+ * judgeHarness,
54
+ * judges: [FactualityJudge()],
55
+ * }, (it) => {});
56
+ * ```
57
+ */
58
+ declare function piAiJudgeHarness<TApi extends Api>(config: PiAiJudgeHarnessConfig<TApi>): vitest_evals_judges.JudgeHarness;
9
59
  type InferredPiAiToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput, TMetadata>>;
10
60
  type PiAiResultOutput<TResult> = TResult extends HarnessRun<infer TOutput> ? TOutput : "output" extends keyof TResult ? ResultFieldOutput<TResult, "output"> : undefined;
11
61
  type PiAiAgentResult<TAgent, TInput, TMetadata extends HarnessMetadata, TTools extends PiAiToolset<TInput, TMetadata>> = TAgent extends {
@@ -118,4 +168,4 @@ declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessM
118
168
  declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown>(options: PiAiHarnessInferredToolsRunOptionsWithoutOutput<TAgent, TInput, TMetadata, TResult>): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;
119
169
  declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata>(options: PiAiHarnessInferredToolsAgentOptionsWithoutOutput<TAgent, TInput, TMetadata>): Harness<TInput, PiAiResultOutput<PiAiAgentResult<TAgent, TInput, TMetadata, InferredPiAiToolset<TInput, TMetadata>>>, TMetadata>;
120
170
 
121
- export { type PiAiCreateAgentArgs, type PiAiEventSink, type PiAiHarnessResultArgs, type PiAiHarnessRunArgs, type PiAiReplayMode, type PiAiRuntime, type PiAiToolContext, type PiAiToolDefinition, type PiAiToolRecording, type PiAiToolReplayConfig, type PiAiToolReplayPolicies, type PiAiToolReplayPolicy, type PiAiToolset, piAiHarness };
171
+ export { type PiAiCreateAgentArgs, type PiAiEventSink, type PiAiHarnessResultArgs, type PiAiHarnessRunArgs, type PiAiJudgeHarnessConfig, type PiAiReplayMode, type PiAiRuntime, type PiAiToolContext, type PiAiToolDefinition, type PiAiToolRecording, type PiAiToolReplayConfig, type PiAiToolReplayPolicies, type PiAiToolReplayPolicy, type PiAiToolset, piAiHarness, piAiJudgeHarness };
package/dist/index.d.ts CHANGED
@@ -1,11 +1,61 @@
1
+ import * as vitest_evals_judges from 'vitest-evals/judges';
1
2
  import { NormalizedMessage, JsonValue, HarnessMetadata, HarnessContext, HarnessRun, Harness } from 'vitest-evals/harness';
2
3
  import { ReplayMode, ToolRecording, ToolReplayConfig } from 'vitest-evals/replay';
4
+ import { Api, Model, SimpleStreamOptions } from '@mariozechner/pi-ai';
3
5
 
4
6
  type MaybePromise<T> = T | Promise<T>;
5
7
  type JsonOutput<TValue> = [TValue] extends [JsonValue | undefined] ? TValue : undefined;
6
8
  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;
7
9
  type AgentSource<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = TAgent | ((args: PiAiCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);
8
10
  type AnyPiAiToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, PiAiToolDefinition<any, any, TInput, TMetadata>>;
11
+ /**
12
+ * Configuration for adapting a Pi AI model into a judge harness.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { getModel } from "@mariozechner/pi-ai";
17
+ * import { piAiJudgeHarness } from "@vitest-evals/harness-pi-ai";
18
+ *
19
+ * const judgeHarness = piAiJudgeHarness({
20
+ * model: getModel("anthropic", "claude-sonnet-4-5"),
21
+ * temperature: 0,
22
+ * });
23
+ * ```
24
+ */
25
+ interface PiAiJudgeHarnessConfig<TApi extends Api = Api> {
26
+ /** Pi AI model used for judge prompts. */
27
+ model: Model<TApi>;
28
+ /** Optional display name for diagnostics. */
29
+ name?: string;
30
+ /** Optional judge-model temperature. */
31
+ temperature?: number;
32
+ /** Optional judge-model token cap. */
33
+ maxOutputTokens?: number;
34
+ /** Additional Pi AI stream options forwarded to `completeSimple(...)`. */
35
+ options?: Omit<SimpleStreamOptions, "signal" | "temperature" | "maxTokens">;
36
+ }
37
+ /**
38
+ * Adapts a Pi AI model into the provider-neutral judge harness API.
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * import { getModel } from "@mariozechner/pi-ai";
43
+ * import { piAiJudgeHarness } from "@vitest-evals/harness-pi-ai";
44
+ * import { describeEval, FactualityJudge } from "vitest-evals";
45
+ *
46
+ * const judgeHarness = piAiJudgeHarness({
47
+ * model: getModel("anthropic", "claude-sonnet-4-5"),
48
+ * temperature: 0,
49
+ * });
50
+ *
51
+ * describeEval("qa agent", {
52
+ * harness: qaHarness,
53
+ * judgeHarness,
54
+ * judges: [FactualityJudge()],
55
+ * }, (it) => {});
56
+ * ```
57
+ */
58
+ declare function piAiJudgeHarness<TApi extends Api>(config: PiAiJudgeHarnessConfig<TApi>): vitest_evals_judges.JudgeHarness;
9
59
  type InferredPiAiToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput, TMetadata>>;
10
60
  type PiAiResultOutput<TResult> = TResult extends HarnessRun<infer TOutput> ? TOutput : "output" extends keyof TResult ? ResultFieldOutput<TResult, "output"> : undefined;
11
61
  type PiAiAgentResult<TAgent, TInput, TMetadata extends HarnessMetadata, TTools extends PiAiToolset<TInput, TMetadata>> = TAgent extends {
@@ -118,4 +168,4 @@ declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessM
118
168
  declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown>(options: PiAiHarnessInferredToolsRunOptionsWithoutOutput<TAgent, TInput, TMetadata, TResult>): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;
119
169
  declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata>(options: PiAiHarnessInferredToolsAgentOptionsWithoutOutput<TAgent, TInput, TMetadata>): Harness<TInput, PiAiResultOutput<PiAiAgentResult<TAgent, TInput, TMetadata, InferredPiAiToolset<TInput, TMetadata>>>, TMetadata>;
120
170
 
121
- export { type PiAiCreateAgentArgs, type PiAiEventSink, type PiAiHarnessResultArgs, type PiAiHarnessRunArgs, type PiAiReplayMode, type PiAiRuntime, type PiAiToolContext, type PiAiToolDefinition, type PiAiToolRecording, type PiAiToolReplayConfig, type PiAiToolReplayPolicies, type PiAiToolReplayPolicy, type PiAiToolset, piAiHarness };
171
+ export { type PiAiCreateAgentArgs, type PiAiEventSink, type PiAiHarnessResultArgs, type PiAiHarnessRunArgs, type PiAiJudgeHarnessConfig, type PiAiReplayMode, type PiAiRuntime, type PiAiToolContext, type PiAiToolDefinition, type PiAiToolRecording, type PiAiToolReplayConfig, type PiAiToolReplayPolicies, type PiAiToolReplayPolicy, type PiAiToolset, piAiHarness, piAiJudgeHarness };
package/dist/index.js CHANGED
@@ -20,11 +20,60 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
- piAiHarness: () => piAiHarness
23
+ piAiHarness: () => piAiHarness,
24
+ piAiJudgeHarness: () => piAiJudgeHarness
24
25
  });
25
26
  module.exports = __toCommonJS(index_exports);
26
27
  var import_harness = require("vitest-evals/harness");
27
28
  var import_replay = require("vitest-evals/replay");
29
+ var import_judges = require("vitest-evals/judges");
30
+ var import_pi_ai = require("@mariozechner/pi-ai");
31
+ function piAiJudgeHarness(config) {
32
+ return (0, import_judges.createJudgeHarness)({
33
+ name: config.name ?? "pi-ai",
34
+ run: async ({ responseFormat, system, prompt }, { signal }) => {
35
+ const message = await (0, import_pi_ai.completeSimple)(
36
+ config.model,
37
+ {
38
+ systemPrompt: formatPiAiJudgeSystemPrompt(system, responseFormat),
39
+ messages: [
40
+ {
41
+ role: "user",
42
+ content: prompt,
43
+ timestamp: Date.now()
44
+ }
45
+ ]
46
+ },
47
+ {
48
+ ...config.options ?? {},
49
+ ...config.temperature !== void 0 ? { temperature: config.temperature } : {},
50
+ ...config.maxOutputTokens !== void 0 ? { maxTokens: config.maxOutputTokens } : {},
51
+ ...signal ? { signal } : {}
52
+ }
53
+ );
54
+ return resolvePiAiJudgeText(message);
55
+ }
56
+ });
57
+ }
58
+ function formatPiAiJudgeSystemPrompt(system, responseFormat) {
59
+ if (responseFormat?.type !== "json") {
60
+ return system;
61
+ }
62
+ const jsonInstruction = [
63
+ "Return only valid JSON. Do not include markdown fences or explanatory prose.",
64
+ responseFormat.schema ? `JSON Schema:
65
+ ${JSON.stringify(responseFormat.schema, null, 2)}` : void 0
66
+ ].filter(Boolean).join("\n\n");
67
+ return system ? `${system}
68
+
69
+ ${jsonInstruction}` : jsonInstruction;
70
+ }
71
+ function resolvePiAiJudgeText(message) {
72
+ if (message.stopReason === "error" || message.stopReason === "aborted") {
73
+ throw new Error(message.errorMessage ?? "Pi AI judge harness failed.");
74
+ }
75
+ return message.content.filter((part) => part.type === "text").map((part) => part.text).join("").trim();
76
+ }
28
77
  var ORIGINAL_NATIVE_EXECUTE = Symbol("vitest-evals.originalNativeExecute");
29
78
  function piAiHarness(options) {
30
79
  validateOptions(options);
@@ -802,6 +851,7 @@ async function executeToolWithReplay({
802
851
  }
803
852
  // Annotate the CommonJS export names for ESM import in node:
804
853
  0 && (module.exports = {
805
- piAiHarness
854
+ piAiHarness,
855
+ piAiJudgeHarness
806
856
  });
807
857
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport {\n attachHarnessRunToError,\n isHarnessRun,\n isNormalizedSession,\n normalizeMetadata,\n normalizeContent,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: PiAiCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolDefinition<any, any, TInput, TMetadata>>;\ntype InferredPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<\n string,\n PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput, TMetadata>\n>;\n\ntype PiAgentToolLike<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n name: string;\n execute: (toolCallId: string, args: Record<string, JsonValue>) => unknown;\n};\n\ntype PiAiResultOutput<TResult> = TResult extends HarnessRun<infer TOutput>\n ? TOutput\n : \"output\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"output\">\n : undefined;\ntype PiAiAgentResult<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : unknown;\n\nconst ORIGINAL_NATIVE_EXECUTE = Symbol(\"vitest-evals.originalNativeExecute\");\n\ntype NativeToolExecute<\n TInput,\n TMetadata extends HarnessMetadata,\n> = PiAgentToolLike<TInput, TMetadata>[\"execute\"] & {\n [ORIGINAL_NATIVE_EXECUTE]?: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n};\n\n/** Replay mode alias used by the Pi AI harness package. */\nexport type PiAiReplayMode = ReplayMode;\n\n/** Event sink for recording Pi AI transcript messages. */\nexport interface PiAiEventSink {\n message: (message: NormalizedMessage) => void;\n system: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n user: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n assistant: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n tool: (\n name: string,\n content: JsonValue,\n metadata?: Record<string, JsonValue>,\n ) => void;\n}\n\n/** Context passed to instrumented Pi AI tool executions. */\nexport interface PiAiToolContext<\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}\n\n/** Tool replay recording shape for Pi AI tools. */\nexport type PiAiToolRecording<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for a Pi AI tool. */\nexport type PiAiToolReplayConfig<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput, TMetadata>>;\n\n/** Replay policy for one Pi AI tool. */\nexport type PiAiToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | boolean\n | PiAiToolReplayConfig<\n Record<string, JsonValue>,\n JsonValue,\n TInput,\n TMetadata\n >;\n\n/** Replay policy map keyed by Pi AI tool name. */\nexport type PiAiToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolReplayPolicy<TInput, TMetadata>>;\n\n/** Tool definition accepted by the Pi AI harness runtime. */\nexport interface PiAiToolDefinition<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n description?: string;\n execute: (\n args: TArgs,\n context: PiAiToolContext<TInput, TMetadata>,\n ) => MaybePromise<TResult>;\n}\n\n/** Toolset shape accepted by the Pi AI harness. */\nexport type PiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyPiAiToolset<TInput, TMetadata>;\n\ntype ToolArgs<TTool> = TTool extends PiAiToolDefinition<\n infer TArgs,\n infer _TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TArgs\n : never;\n\ntype ToolResult<TTool> = TTool extends PiAiToolDefinition<\n infer _TArgs,\n infer TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TResult\n : never;\n\n/** Runtime object passed into Pi AI agent entrypoints. */\nexport type PiAiRuntime<\n TTools extends PiAiToolset<TInput, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n tools: {\n [K in keyof TTools]: (\n args: ToolArgs<TTools[K]>,\n ) => Promise<ToolResult<TTools[K]>>;\n };\n events: PiAiEventSink;\n signal?: AbortSignal;\n};\n\n/** Arguments passed to custom Pi AI harness run callbacks. */\nexport interface PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> {\n agent: TAgent;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: PiAiRuntime<TTools, TInput, TMetadata>;\n}\n\n/** Arguments passed to Pi AI harness output selectors. */\nexport interface PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> extends PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\n/** Arguments passed to per-run Pi AI agent factories. */\nexport interface PiAiCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\n}\n\ninterface PiAiHarnessBaseOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n toolReplay?: PiAiToolReplayPolicies<TInput, TMetadata>;\n output?: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n name?: string;\n}\n\ninterface PiAiHarnessWithToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n > {\n tools: TTools;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ninterface PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n TOutput\n > {\n tools?: undefined;\n run?: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ntype PiAiHarnessOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> =\n | PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >\n | PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n >;\n\ntype PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n};\n\ntype PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n TOutput\n >;\n};\n\ntype PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n InferredPiAiToolset<TInput, TMetadata>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & {\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiHarnessOutputSelector<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype InferredToolSurfaces<TInput, TMetadata extends HarnessMetadata> = {\n runtimeTools?: InferredPiAiToolset<TInput, TMetadata>;\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>;\n};\n\ntype PiToolExecutionState = {\n activeNativeToolNames: Map<string, number>;\n};\n\n/** Adapts a Pi agent runtime into a normalized vitest-evals harness. */\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TTools\n >,\n): Harness<\n TInput,\n PiAiResultOutput<PiAiAgentResult<TAgent, TInput, TMetadata, TTools>>,\n TMetadata\n>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n>(\n options: PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n>(\n options: PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata\n >,\n): Harness<\n TInput,\n PiAiResultOutput<\n PiAiAgentResult<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >\n >,\n TMetadata\n>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata> {\n validateOptions(options);\n\n const harness: Harness<TInput, TOutput, TMetadata> = {\n name: options.name ?? \"pi-ai\",\n run: async (input, context) => {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const inferredTools = resolveInferredToolSurfaces<TInput, TMetadata>(\n agent,\n );\n\n if (hasExplicitToolset(options)) {\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n options.tools,\n inferredTools.nativeToolsets,\n );\n }\n\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n inferredTools.runtimeTools,\n inferredTools.nativeToolsets,\n );\n },\n };\n\n return harness;\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n if (options.agent === undefined) {\n throw new Error(\n \"piAiHarness requires agent. Pass an agent instance or an agent factory.\",\n );\n }\n}\n\nasync function executePiHarnessRun<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n agent: TAgent,\n input: TInput,\n context: HarnessContext<TMetadata>,\n messages: NormalizedMessage[],\n runtimeTools: TTools | undefined,\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n): Promise<HarnessRun<TOutput>> {\n const executionState = createPiToolExecutionState();\n const runtime = createRuntime({\n input,\n context,\n tools: runtimeTools,\n toolReplay: options.toolReplay,\n executionState,\n messages,\n });\n\n try {\n const result = await withInstrumentedAgentTools(\n agent,\n nativeToolsets,\n {\n input,\n context,\n messages,\n toolCalls: runtime.toolCalls,\n toolReplay: options.toolReplay,\n executionState,\n },\n () =>\n runAgent(options, {\n agent,\n input,\n context,\n runtime,\n }),\n );\n\n if (isHarnessRun(result) && !hasOutputSelector(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n return result;\n }\n\n const normalizeResult = result as TResult;\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n result: normalizeResult,\n } satisfies PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(normalizeResult) as TOutput | undefined);\n const usage = resolveUsage(normalizeResult, runtime.toolCalls.length);\n const session = resolveSession(normalizeResult, messages, output, usage);\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: resolveErrors(normalizeResult),\n } as HarnessRun<TOutput>;\n } catch (error) {\n const usage = resolveUsage(undefined, runtime.toolCalls.length);\n const run = {\n session: resolveSession(undefined, messages, undefined, usage),\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializeError(error)],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n) {\n return resolveAgentSource(options.agent, args);\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction isAgentFactory<TAgent, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n) => MaybePromise<TAgent> {\n return typeof agent === \"function\" && !hasPiAiRunMethod(agent);\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n return Boolean(options.output);\n}\n\nfunction resolveInferredToolSurfaces<TInput, TMetadata extends HarnessMetadata>(\n agent: unknown,\n): InferredToolSurfaces<TInput, TMetadata> {\n let runtimeTools: InferredPiAiToolset<TInput, TMetadata> | undefined;\n const nativeToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nextRuntimeTools = getRuntimeToolset<TInput, TMetadata>(candidate);\n if (runtimeTools === undefined && nextRuntimeTools !== undefined) {\n runtimeTools = nextRuntimeTools;\n }\n\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n nativeToolsets.push(nativeTools);\n }\n }\n\n return {\n ...(runtimeTools ? { runtimeTools } : {}),\n ...(nativeToolsets.length > 0 ? { nativeToolsets } : {}),\n };\n}\n\nfunction getAgentToolCandidates(agent: unknown): object[] {\n const roots = getAgentRoots(agent);\n const candidates: object[] = [];\n const seen = new Set<object>();\n\n for (const root of roots) {\n addUniqueObject(candidates, seen, root);\n addUniqueObject(candidates, seen, getObjectProperty(root, \"state\"));\n addUniqueObject(candidates, seen, getObjectProperty(root, \"initialState\"));\n }\n\n return candidates;\n}\n\nfunction getAgentRoots(agent: unknown): object[] {\n return [asObject(agent)]\n .concat(asObject(getObjectProperty(agent, \"agent\")))\n .filter((value): value is object => value !== undefined);\n}\n\nfunction addUniqueObject(\n candidates: object[],\n seen: Set<object>,\n value: unknown,\n) {\n if (!value || typeof value !== \"object\" || seen.has(value)) {\n return;\n }\n\n seen.add(value);\n candidates.push(value);\n}\n\nfunction asObject(value: unknown): object | undefined {\n return value && typeof value === \"object\" ? value : undefined;\n}\n\nfunction getObjectProperty(value: unknown, key: string): unknown {\n return value && typeof value === \"object\"\n ? (value as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction getRuntimeToolset<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): InferredPiAiToolset<TInput, TMetadata> | undefined {\n const candidate =\n getObjectProperty(value, \"tools\") ?? getObjectProperty(value, \"toolset\");\n\n return isPiAiToolset(candidate)\n ? (candidate as InferredPiAiToolset<TInput, TMetadata>)\n : undefined;\n}\n\nfunction getNativeToolArray<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): PiAgentToolLike<TInput, TMetadata>[] | undefined {\n const candidate = getObjectProperty(value, \"tools\");\n if (isAgentToolArray(candidate)) {\n return candidate as PiAgentToolLike<TInput, TMetadata>[];\n }\n\n return undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (\n hasPiAiRunMethod<TInput, TMetadata, TResult, TOutput, TTools>(args.agent)\n ) {\n return args.agent.run(args.input, args.runtime);\n }\n\n throw new Error(\n \"piAiHarness requires a run() function unless the provided agent exposes run(input, runtime).\",\n );\n}\n\nfunction hasExplicitToolset<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): options is PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> {\n return options.tools !== undefined;\n}\n\nfunction hasPiAiRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is PiAiRunnableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n if (!agent || (typeof agent !== \"object\" && typeof agent !== \"function\")) {\n return false;\n }\n\n return (\n \"run\" in agent && typeof (agent as { run?: unknown }).run === \"function\"\n );\n}\n\nfunction isPiAiToolset(value: unknown): value is PiAiToolset {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const tools = Object.values(value);\n return (\n tools.length > 0 &&\n tools.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nfunction isAgentToolArray(value: unknown): value is PiAgentToolLike[] {\n return (\n Array.isArray(value) &&\n value.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"name\" in tool &&\n typeof (tool as { name?: unknown }).name === \"string\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nasync function withInstrumentedAgentTools<\n TResult,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: unknown,\n toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> | undefined,\n args: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n messages: NormalizedMessage[];\n toolCalls: ToolCallRecord[];\n toolReplay: PiAiToolReplayPolicies<TInput, TMetadata> | undefined;\n executionState: PiToolExecutionState;\n },\n callback: () => Promise<TResult>,\n) {\n if (!toolsets || toolsets.length === 0) {\n return callback();\n }\n\n const originalExecutions = new Map<\n PiAgentToolLike<TInput, TMetadata>,\n PiAgentToolLike<TInput, TMetadata>[\"execute\"]\n >();\n const originalResets = new Map<ResettableAgent, ResettableAgent[\"reset\"]>();\n\n const patchTool = (tool: PiAgentToolLike<TInput, TMetadata>) => {\n if (originalExecutions.has(tool)) {\n return;\n }\n\n const originalExecute = getNativeToolExecuteOrigin(tool.execute);\n originalExecutions.set(tool, originalExecute);\n const instrumentedExecute: NativeToolExecute<TInput, TMetadata> = async (\n toolCallId: string,\n rawArgs: Record<string, JsonValue>,\n ) => {\n const startedAt = new Date();\n const toolContext = {\n input: args.input,\n metadata: args.context.metadata,\n signal: args.context.signal,\n setArtifact: args.context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n const leaveNativeTool = enterNativeToolExecution(\n args.executionState,\n tool.name,\n );\n\n try {\n const execution = await executeNativeToolWithReplay({\n toolName: tool.name,\n toolCallId,\n execute: originalExecute,\n replay: args.toolReplay?.[tool.name],\n args: rawArgs,\n context: toolContext,\n });\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n result: execution.normalizedResult,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n args.messages.push({\n role: \"tool\",\n content: execution.normalizedResult,\n metadata: {\n name: tool.name,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(getReplayMetadataFromError(error)),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n } finally {\n leaveNativeTool();\n }\n };\n instrumentedExecute[ORIGINAL_NATIVE_EXECUTE] = originalExecute;\n tool.execute = instrumentedExecute;\n };\n\n const patchToolsets = (\n nextToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n ) => {\n for (const toolset of nextToolsets) {\n for (const tool of toolset) {\n patchTool(tool);\n }\n }\n };\n\n patchToolsets(toolsets);\n\n for (const target of getAgentResetTargets(agent)) {\n const originalReset = target.reset;\n originalResets.set(target, originalReset);\n target.reset = function patchedReset(this: ResettableAgent, ...resetArgs) {\n const resetResult = originalReset.apply(this, resetArgs);\n\n if (isPromiseLike(resetResult)) {\n return resetResult.finally(() => {\n patchToolsets(\n resolveInferredNativeToolsets<TInput, TMetadata>(agent),\n );\n });\n }\n\n patchToolsets(resolveInferredNativeToolsets<TInput, TMetadata>(agent));\n return resetResult;\n };\n }\n\n try {\n return await callback();\n } finally {\n for (const [target, originalReset] of originalResets) {\n target.reset = originalReset;\n }\n\n for (const [tool, originalExecute] of originalExecutions) {\n tool.execute = originalExecute;\n }\n }\n}\n\ntype ResettableAgent = {\n reset: (...args: unknown[]) => unknown;\n};\n\nfunction getAgentResetTargets(agent: unknown): ResettableAgent[] {\n return getAgentRoots(agent).filter(isResettableAgent);\n}\n\nfunction isResettableAgent(value: object): value is ResettableAgent {\n return \"reset\" in value && typeof value.reset === \"function\";\n}\n\nfunction resolveInferredNativeToolsets<\n TInput,\n TMetadata extends HarnessMetadata,\n>(agent: unknown): Array<PiAgentToolLike<TInput, TMetadata>[]> {\n const toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n toolsets.push(nativeTools);\n }\n }\n\n return toolsets;\n}\n\nfunction isPromiseLike(value: unknown): value is Promise<unknown> {\n return Boolean(\n value && typeof (value as { then?: unknown }).then === \"function\",\n );\n}\n\nfunction serializeToolCallError(\n error: unknown,\n): NonNullable<ToolCallRecord[\"error\"]> {\n const serialized = serializeError(error);\n const { message, type, ...details } = serialized;\n\n return {\n ...details,\n message: typeof message === \"string\" ? message : String(message),\n ...(typeof type === \"string\" ? { type } : {}),\n };\n}\n\nfunction getNativeToolExecuteOrigin<TInput, TMetadata extends HarnessMetadata>(\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"],\n) {\n const nativeExecute = execute as NativeToolExecute<TInput, TMetadata>;\n return nativeExecute[ORIGINAL_NATIVE_EXECUTE] ?? nativeExecute;\n}\n\nfunction createPiToolExecutionState(): PiToolExecutionState {\n return {\n activeNativeToolNames: new Map(),\n };\n}\n\nfunction enterNativeToolExecution(\n state: PiToolExecutionState,\n toolName: string,\n) {\n state.activeNativeToolNames.set(\n toolName,\n (state.activeNativeToolNames.get(toolName) ?? 0) + 1,\n );\n\n return () => {\n const nextCount = (state.activeNativeToolNames.get(toolName) ?? 1) - 1;\n if (nextCount <= 0) {\n state.activeNativeToolNames.delete(toolName);\n return;\n }\n\n state.activeNativeToolNames.set(toolName, nextCount);\n };\n}\n\nfunction hasActiveNativeToolExecution(\n state: PiToolExecutionState,\n toolName: string,\n) {\n return (state.activeNativeToolNames.get(toolName) ?? 0) > 0;\n}\n\nasync function executeNativeToolWithReplay<\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n toolCallId,\n execute,\n replay,\n args,\n context,\n}: {\n toolName: string;\n toolCallId: string;\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n replay: PiAiToolReplayPolicy<TInput, TMetadata> | undefined;\n args: Record<string, JsonValue>;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n let didExecute = false;\n let liveResult: unknown;\n\n const execution = await executeWithReplay({\n toolName: createNativeReplayToolName(toolName),\n args,\n context,\n execute: async (toolArgs) => {\n didExecute = true;\n liveResult = await execute(toolCallId, toolArgs);\n return createNativeToolReplayEnvelope(liveResult);\n },\n replay,\n });\n\n if (didExecute) {\n return {\n result: liveResult,\n normalizedResult: normalizeReplayToolResult(liveResult),\n replay: execution.replay,\n };\n }\n\n return {\n ...resolveNativeToolReplayResult(execution.result),\n replay: execution.replay,\n };\n}\n\nfunction createNativeReplayToolName(toolName: string) {\n return `${toolName}.native`;\n}\n\nfunction createRuntime<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n executionState,\n messages,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: PiAiToolReplayPolicies<TInput, TMetadata> | undefined;\n executionState: PiToolExecutionState;\n messages: NormalizedMessage[];\n}): PiAiRuntime<TTools, TInput, TMetadata> & {\n toolCalls: ToolCallRecord[];\n} {\n const toolCalls: ToolCallRecord[] = [];\n const eventSink: PiAiEventSink = {\n message: (message) => {\n messages.push(message);\n },\n system: (content, metadata) => {\n messages.push({\n role: \"system\",\n content,\n metadata,\n });\n },\n user: (content, metadata) => {\n messages.push({\n role: \"user\",\n content,\n metadata,\n });\n },\n assistant: (content, metadata) => {\n messages.push({\n role: \"assistant\",\n content,\n metadata,\n });\n },\n tool: (name, content, metadata) => {\n messages.push({\n role: \"tool\",\n content,\n metadata: {\n name,\n ...(metadata ?? {}),\n },\n });\n },\n };\n\n const runtimeTools = Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => [\n toolName,\n async (args: Record<string, JsonValue>) => {\n const startedAt = new Date();\n const isNativeImplementationCall = hasActiveNativeToolExecution(\n executionState,\n toolName,\n );\n const toolContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n\n try {\n const execution = await executeToolWithReplay({\n toolName,\n tool,\n replay: isNativeImplementationCall\n ? undefined\n : toolReplay?.[toolName],\n args,\n context: toolContext,\n });\n const finishedAt = new Date();\n\n if (isNativeImplementationCall) {\n return execution.result;\n }\n\n const call = {\n name: toolName,\n arguments: args,\n result: execution.result,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n messages.push({\n role: \"tool\",\n content: execution.result,\n metadata: {\n name: toolName,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n if (isNativeImplementationCall) {\n throw error;\n }\n\n const call = {\n name: toolName,\n arguments: args,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n ),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n }\n },\n ]),\n ) as unknown as PiAiRuntime<TTools, TInput, TMetadata>[\"tools\"];\n\n return {\n tools: runtimeTools,\n events: eventSink,\n signal: context.signal,\n toolCalls,\n };\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const candidates = [\"output\"] 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 normalizeToolResult(result: unknown): JsonValue | undefined {\n const details =\n result && typeof result === \"object\"\n ? toJsonValue((result as { details?: unknown }).details)\n : undefined;\n if (details !== undefined) {\n return details;\n }\n\n const normalized = toJsonValue(result);\n return normalized !== undefined\n ? normalized\n : result === undefined\n ? undefined\n : String(result);\n}\n\nfunction normalizeReplayToolResult(result: unknown): JsonValue {\n return normalizeToolResult(result) ?? null;\n}\n\ntype NativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 2;\n };\n agentResult: JsonValue;\n normalizedResult: JsonValue;\n};\n\ntype LegacyNativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 1;\n };\n normalizedResult: JsonValue;\n agentResult?: JsonValue;\n};\n\nfunction createNativeToolReplayEnvelope(\n result: unknown,\n): NativeToolReplayEnvelope {\n const normalizedResult = normalizeReplayToolResult(result);\n\n const agentResult = toJsonValue(result);\n\n return {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\",\n version: 2,\n },\n agentResult: agentResult !== undefined ? agentResult : normalizedResult,\n normalizedResult,\n };\n}\n\nfunction resolveNativeToolReplayResult(result: JsonValue) {\n if (isNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n if (isLegacyNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult ?? result.normalizedResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n return {\n result,\n normalizedResult: normalizeReplayToolResult(result),\n };\n}\n\nfunction isNativeToolReplayEnvelope(\n value: unknown,\n): value is NativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"agentResult\" in value &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isNativeToolReplayMarker(\n value: unknown,\n): value is NativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 2,\n );\n}\n\nfunction isLegacyNativeToolReplayEnvelope(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isLegacyNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isLegacyNativeToolReplayMarker(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 1,\n );\n}\n\nfunction resolveUsage(result: unknown, toolCallCount: number): UsageSummary {\n if (!result || typeof result !== \"object\") {\n return toolCallCount > 0 ? { toolCalls: toolCallCount } : {};\n }\n\n const usageValue =\n (result as Record<string, unknown>).usage ??\n (result as Record<string, unknown>).metrics;\n\n if (\n !usageValue ||\n typeof usageValue !== \"object\" ||\n Array.isArray(usageValue)\n ) {\n return toolCallCount > 0 ? { toolCalls: toolCallCount } : {};\n }\n\n const usageRecord = usageValue as Record<string, unknown>;\n const usage: UsageSummary = {\n provider: stringField(usageRecord.provider),\n model: stringField(usageRecord.model),\n inputTokens: numberField(usageRecord.inputTokens),\n outputTokens: numberField(usageRecord.outputTokens),\n reasoningTokens: numberField(usageRecord.reasoningTokens),\n totalTokens: numberField(usageRecord.totalTokens),\n toolCalls: numberField(usageRecord.toolCalls),\n retries: numberField(usageRecord.retries),\n metadata: collectUsageMetadata(usageRecord),\n };\n\n if (usage.toolCalls === undefined && toolCallCount > 0) {\n usage.toolCalls = toolCallCount;\n }\n\n return usage;\n}\n\nfunction collectUsageMetadata(usage: Record<string, unknown>) {\n const metadata: Record<string, unknown> = {};\n const nestedMetadata = usage.metadata;\n if (\n nestedMetadata &&\n typeof nestedMetadata === \"object\" &&\n !Array.isArray(nestedMetadata)\n ) {\n Object.assign(metadata, nestedMetadata);\n }\n\n for (const [key, value] of Object.entries(usage)) {\n if (key === \"metadata\" || USAGE_SUMMARY_KEYS.has(key)) {\n continue;\n }\n metadata[key] = value;\n }\n\n return normalizeMetadata(metadata);\n}\n\nconst USAGE_SUMMARY_KEYS = new Set([\n \"provider\",\n \"model\",\n \"inputTokens\",\n \"outputTokens\",\n \"reasoningTokens\",\n \"totalTokens\",\n \"toolCalls\",\n \"retries\",\n]);\n\nfunction stringField(value: unknown) {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction numberField(value: unknown) {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction resolveSession(\n result: unknown,\n messages: NormalizedMessage[],\n output: JsonValue | undefined,\n usage: UsageSummary,\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 sessionMessages = [...messages];\n if (\n output !== undefined &&\n !sessionMessages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n sessionMessages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n return {\n messages: sessionMessages,\n provider:\n ((result as Record<string, unknown> | undefined)?.provider as\n | string\n | undefined) ?? usage.provider,\n model:\n ((result as Record<string, unknown> | undefined)?.model as\n | string\n | undefined) ?? usage.model,\n };\n}\n\nfunction resolveErrors(result: unknown): Array<Record<string, JsonValue>> {\n return resolveHarnessRunErrors(result);\n}\n\nasync function executeToolWithReplay<\n TArgs extends Record<string, JsonValue>,\n TResult extends JsonValue,\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n tool,\n replay,\n args,\n context,\n}: {\n toolName: string;\n tool: PiAiToolDefinition<TArgs, TResult, TInput, TMetadata>;\n replay: PiAiToolReplayPolicy<TInput, TMetadata> | undefined;\n args: TArgs;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n return executeWithReplay<\n Record<string, JsonValue>,\n JsonValue,\n PiAiToolContext<TInput, TMetadata>\n >({\n toolName,\n args,\n context,\n execute: (toolArgs, toolContext) =>\n tool.execute(toolArgs as TArgs, toolContext),\n replay,\n });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport {\n attachHarnessRunToError,\n isHarnessRun,\n isNormalizedSession,\n normalizeMetadata,\n normalizeContent,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\nimport {\n createJudgeHarness,\n type JudgeHarnessInput,\n} from \"vitest-evals/judges\";\nimport { completeSimple } from \"@mariozechner/pi-ai\";\nimport type {\n Api,\n AssistantMessage,\n Model,\n SimpleStreamOptions,\n} from \"@mariozechner/pi-ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: PiAiCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolDefinition<any, any, TInput, TMetadata>>;\n\n/**\n * Configuration for adapting a Pi AI model into a judge harness.\n *\n * @example\n * ```ts\n * import { getModel } from \"@mariozechner/pi-ai\";\n * import { piAiJudgeHarness } from \"@vitest-evals/harness-pi-ai\";\n *\n * const judgeHarness = piAiJudgeHarness({\n * model: getModel(\"anthropic\", \"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n * ```\n */\nexport interface PiAiJudgeHarnessConfig<TApi extends Api = Api> {\n /** Pi AI model used for judge prompts. */\n model: Model<TApi>;\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 /** Additional Pi AI stream options forwarded to `completeSimple(...)`. */\n options?: Omit<SimpleStreamOptions, \"signal\" | \"temperature\" | \"maxTokens\">;\n}\n\n/**\n * Adapts a Pi AI model into the provider-neutral judge harness API.\n *\n * @example\n * ```ts\n * import { getModel } from \"@mariozechner/pi-ai\";\n * import { piAiJudgeHarness } from \"@vitest-evals/harness-pi-ai\";\n * import { describeEval, FactualityJudge } from \"vitest-evals\";\n *\n * const judgeHarness = piAiJudgeHarness({\n * model: getModel(\"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 piAiJudgeHarness<TApi extends Api>(\n config: PiAiJudgeHarnessConfig<TApi>,\n) {\n return createJudgeHarness({\n name: config.name ?? \"pi-ai\",\n run: async ({ responseFormat, system, prompt }, { signal }) => {\n const message = await completeSimple(\n config.model,\n {\n systemPrompt: formatPiAiJudgeSystemPrompt(system, responseFormat),\n messages: [\n {\n role: \"user\",\n content: prompt,\n timestamp: Date.now(),\n },\n ],\n },\n {\n ...(config.options ?? {}),\n ...(config.temperature !== undefined\n ? { temperature: config.temperature }\n : {}),\n ...(config.maxOutputTokens !== undefined\n ? { maxTokens: config.maxOutputTokens }\n : {}),\n ...(signal ? { signal } : {}),\n },\n );\n\n return resolvePiAiJudgeText(message);\n },\n });\n}\n\nfunction formatPiAiJudgeSystemPrompt(\n system: string | undefined,\n responseFormat: JudgeHarnessInput[\"responseFormat\"],\n) {\n if (responseFormat?.type !== \"json\") {\n return system;\n }\n\n const jsonInstruction = [\n \"Return only valid JSON. Do not include markdown fences or explanatory prose.\",\n responseFormat.schema\n ? `JSON Schema:\\n${JSON.stringify(responseFormat.schema, null, 2)}`\n : undefined,\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n\n return system ? `${system}\\n\\n${jsonInstruction}` : jsonInstruction;\n}\n\nfunction resolvePiAiJudgeText(message: AssistantMessage) {\n if (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n throw new Error(message.errorMessage ?? \"Pi AI judge harness failed.\");\n }\n\n return message.content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\")\n .trim();\n}\n\ntype InferredPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<\n string,\n PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput, TMetadata>\n>;\n\ntype PiAgentToolLike<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n name: string;\n execute: (toolCallId: string, args: Record<string, JsonValue>) => unknown;\n};\n\ntype PiAiResultOutput<TResult> = TResult extends HarnessRun<infer TOutput>\n ? TOutput\n : \"output\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"output\">\n : undefined;\ntype PiAiAgentResult<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : unknown;\n\nconst ORIGINAL_NATIVE_EXECUTE = Symbol(\"vitest-evals.originalNativeExecute\");\n\ntype NativeToolExecute<\n TInput,\n TMetadata extends HarnessMetadata,\n> = PiAgentToolLike<TInput, TMetadata>[\"execute\"] & {\n [ORIGINAL_NATIVE_EXECUTE]?: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n};\n\n/** Replay mode alias used by the Pi AI harness package. */\nexport type PiAiReplayMode = ReplayMode;\n\n/** Event sink for recording Pi AI transcript messages. */\nexport interface PiAiEventSink {\n message: (message: NormalizedMessage) => void;\n system: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n user: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n assistant: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n tool: (\n name: string,\n content: JsonValue,\n metadata?: Record<string, JsonValue>,\n ) => void;\n}\n\n/** Context passed to instrumented Pi AI tool executions. */\nexport interface PiAiToolContext<\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}\n\n/** Tool replay recording shape for Pi AI tools. */\nexport type PiAiToolRecording<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for a Pi AI tool. */\nexport type PiAiToolReplayConfig<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput, TMetadata>>;\n\n/** Replay policy for one Pi AI tool. */\nexport type PiAiToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | boolean\n | PiAiToolReplayConfig<\n Record<string, JsonValue>,\n JsonValue,\n TInput,\n TMetadata\n >;\n\n/** Replay policy map keyed by Pi AI tool name. */\nexport type PiAiToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolReplayPolicy<TInput, TMetadata>>;\n\n/** Tool definition accepted by the Pi AI harness runtime. */\nexport interface PiAiToolDefinition<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n description?: string;\n execute: (\n args: TArgs,\n context: PiAiToolContext<TInput, TMetadata>,\n ) => MaybePromise<TResult>;\n}\n\n/** Toolset shape accepted by the Pi AI harness. */\nexport type PiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyPiAiToolset<TInput, TMetadata>;\n\ntype ToolArgs<TTool> = TTool extends PiAiToolDefinition<\n infer TArgs,\n infer _TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TArgs\n : never;\n\ntype ToolResult<TTool> = TTool extends PiAiToolDefinition<\n infer _TArgs,\n infer TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TResult\n : never;\n\n/** Runtime object passed into Pi AI agent entrypoints. */\nexport type PiAiRuntime<\n TTools extends PiAiToolset<TInput, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n tools: {\n [K in keyof TTools]: (\n args: ToolArgs<TTools[K]>,\n ) => Promise<ToolResult<TTools[K]>>;\n };\n events: PiAiEventSink;\n signal?: AbortSignal;\n};\n\n/** Arguments passed to custom Pi AI harness run callbacks. */\nexport interface PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> {\n agent: TAgent;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: PiAiRuntime<TTools, TInput, TMetadata>;\n}\n\n/** Arguments passed to Pi AI harness output selectors. */\nexport interface PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> extends PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\n/** Arguments passed to per-run Pi AI agent factories. */\nexport interface PiAiCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\n}\n\ninterface PiAiHarnessBaseOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n toolReplay?: PiAiToolReplayPolicies<TInput, TMetadata>;\n output?: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n name?: string;\n}\n\ninterface PiAiHarnessWithToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n > {\n tools: TTools;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ninterface PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n TOutput\n > {\n tools?: undefined;\n run?: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ntype PiAiHarnessOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> =\n | PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >\n | PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n >;\n\ntype PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n};\n\ntype PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n TOutput\n >;\n};\n\ntype PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n InferredPiAiToolset<TInput, TMetadata>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & {\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiHarnessOutputSelector<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype InferredToolSurfaces<TInput, TMetadata extends HarnessMetadata> = {\n runtimeTools?: InferredPiAiToolset<TInput, TMetadata>;\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>;\n};\n\ntype PiToolExecutionState = {\n activeNativeToolNames: Map<string, number>;\n};\n\n/** Adapts a Pi agent runtime into a normalized vitest-evals harness. */\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TTools\n >,\n): Harness<\n TInput,\n PiAiResultOutput<PiAiAgentResult<TAgent, TInput, TMetadata, TTools>>,\n TMetadata\n>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n>(\n options: PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n>(\n options: PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata\n >,\n): Harness<\n TInput,\n PiAiResultOutput<\n PiAiAgentResult<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >\n >,\n TMetadata\n>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata> {\n validateOptions(options);\n\n const harness: Harness<TInput, TOutput, TMetadata> = {\n name: options.name ?? \"pi-ai\",\n run: async (input, context) => {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const inferredTools = resolveInferredToolSurfaces<TInput, TMetadata>(\n agent,\n );\n\n if (hasExplicitToolset(options)) {\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n options.tools,\n inferredTools.nativeToolsets,\n );\n }\n\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n inferredTools.runtimeTools,\n inferredTools.nativeToolsets,\n );\n },\n };\n\n return harness;\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n if (options.agent === undefined) {\n throw new Error(\n \"piAiHarness requires agent. Pass an agent instance or an agent factory.\",\n );\n }\n}\n\nasync function executePiHarnessRun<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n agent: TAgent,\n input: TInput,\n context: HarnessContext<TMetadata>,\n messages: NormalizedMessage[],\n runtimeTools: TTools | undefined,\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n): Promise<HarnessRun<TOutput>> {\n const executionState = createPiToolExecutionState();\n const runtime = createRuntime({\n input,\n context,\n tools: runtimeTools,\n toolReplay: options.toolReplay,\n executionState,\n messages,\n });\n\n try {\n const result = await withInstrumentedAgentTools(\n agent,\n nativeToolsets,\n {\n input,\n context,\n messages,\n toolCalls: runtime.toolCalls,\n toolReplay: options.toolReplay,\n executionState,\n },\n () =>\n runAgent(options, {\n agent,\n input,\n context,\n runtime,\n }),\n );\n\n if (isHarnessRun(result) && !hasOutputSelector(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n return result;\n }\n\n const normalizeResult = result as TResult;\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n result: normalizeResult,\n } satisfies PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(normalizeResult) as TOutput | undefined);\n const usage = resolveUsage(normalizeResult, runtime.toolCalls.length);\n const session = resolveSession(normalizeResult, messages, output, usage);\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: resolveErrors(normalizeResult),\n } as HarnessRun<TOutput>;\n } catch (error) {\n const usage = resolveUsage(undefined, runtime.toolCalls.length);\n const run = {\n session: resolveSession(undefined, messages, undefined, usage),\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializeError(error)],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n) {\n return resolveAgentSource(options.agent, args);\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction isAgentFactory<TAgent, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n) => MaybePromise<TAgent> {\n return typeof agent === \"function\" && !hasPiAiRunMethod(agent);\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n return Boolean(options.output);\n}\n\nfunction resolveInferredToolSurfaces<TInput, TMetadata extends HarnessMetadata>(\n agent: unknown,\n): InferredToolSurfaces<TInput, TMetadata> {\n let runtimeTools: InferredPiAiToolset<TInput, TMetadata> | undefined;\n const nativeToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nextRuntimeTools = getRuntimeToolset<TInput, TMetadata>(candidate);\n if (runtimeTools === undefined && nextRuntimeTools !== undefined) {\n runtimeTools = nextRuntimeTools;\n }\n\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n nativeToolsets.push(nativeTools);\n }\n }\n\n return {\n ...(runtimeTools ? { runtimeTools } : {}),\n ...(nativeToolsets.length > 0 ? { nativeToolsets } : {}),\n };\n}\n\nfunction getAgentToolCandidates(agent: unknown): object[] {\n const roots = getAgentRoots(agent);\n const candidates: object[] = [];\n const seen = new Set<object>();\n\n for (const root of roots) {\n addUniqueObject(candidates, seen, root);\n addUniqueObject(candidates, seen, getObjectProperty(root, \"state\"));\n addUniqueObject(candidates, seen, getObjectProperty(root, \"initialState\"));\n }\n\n return candidates;\n}\n\nfunction getAgentRoots(agent: unknown): object[] {\n return [asObject(agent)]\n .concat(asObject(getObjectProperty(agent, \"agent\")))\n .filter((value): value is object => value !== undefined);\n}\n\nfunction addUniqueObject(\n candidates: object[],\n seen: Set<object>,\n value: unknown,\n) {\n if (!value || typeof value !== \"object\" || seen.has(value)) {\n return;\n }\n\n seen.add(value);\n candidates.push(value);\n}\n\nfunction asObject(value: unknown): object | undefined {\n return value && typeof value === \"object\" ? value : undefined;\n}\n\nfunction getObjectProperty(value: unknown, key: string): unknown {\n return value && typeof value === \"object\"\n ? (value as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction getRuntimeToolset<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): InferredPiAiToolset<TInput, TMetadata> | undefined {\n const candidate =\n getObjectProperty(value, \"tools\") ?? getObjectProperty(value, \"toolset\");\n\n return isPiAiToolset(candidate)\n ? (candidate as InferredPiAiToolset<TInput, TMetadata>)\n : undefined;\n}\n\nfunction getNativeToolArray<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): PiAgentToolLike<TInput, TMetadata>[] | undefined {\n const candidate = getObjectProperty(value, \"tools\");\n if (isAgentToolArray(candidate)) {\n return candidate as PiAgentToolLike<TInput, TMetadata>[];\n }\n\n return undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (\n hasPiAiRunMethod<TInput, TMetadata, TResult, TOutput, TTools>(args.agent)\n ) {\n return args.agent.run(args.input, args.runtime);\n }\n\n throw new Error(\n \"piAiHarness requires a run() function unless the provided agent exposes run(input, runtime).\",\n );\n}\n\nfunction hasExplicitToolset<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): options is PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> {\n return options.tools !== undefined;\n}\n\nfunction hasPiAiRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is PiAiRunnableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n if (!agent || (typeof agent !== \"object\" && typeof agent !== \"function\")) {\n return false;\n }\n\n return (\n \"run\" in agent && typeof (agent as { run?: unknown }).run === \"function\"\n );\n}\n\nfunction isPiAiToolset(value: unknown): value is PiAiToolset {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const tools = Object.values(value);\n return (\n tools.length > 0 &&\n tools.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nfunction isAgentToolArray(value: unknown): value is PiAgentToolLike[] {\n return (\n Array.isArray(value) &&\n value.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"name\" in tool &&\n typeof (tool as { name?: unknown }).name === \"string\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nasync function withInstrumentedAgentTools<\n TResult,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: unknown,\n toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> | undefined,\n args: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n messages: NormalizedMessage[];\n toolCalls: ToolCallRecord[];\n toolReplay: PiAiToolReplayPolicies<TInput, TMetadata> | undefined;\n executionState: PiToolExecutionState;\n },\n callback: () => Promise<TResult>,\n) {\n if (!toolsets || toolsets.length === 0) {\n return callback();\n }\n\n const originalExecutions = new Map<\n PiAgentToolLike<TInput, TMetadata>,\n PiAgentToolLike<TInput, TMetadata>[\"execute\"]\n >();\n const originalResets = new Map<ResettableAgent, ResettableAgent[\"reset\"]>();\n\n const patchTool = (tool: PiAgentToolLike<TInput, TMetadata>) => {\n if (originalExecutions.has(tool)) {\n return;\n }\n\n const originalExecute = getNativeToolExecuteOrigin(tool.execute);\n originalExecutions.set(tool, originalExecute);\n const instrumentedExecute: NativeToolExecute<TInput, TMetadata> = async (\n toolCallId: string,\n rawArgs: Record<string, JsonValue>,\n ) => {\n const startedAt = new Date();\n const toolContext = {\n input: args.input,\n metadata: args.context.metadata,\n signal: args.context.signal,\n setArtifact: args.context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n const leaveNativeTool = enterNativeToolExecution(\n args.executionState,\n tool.name,\n );\n\n try {\n const execution = await executeNativeToolWithReplay({\n toolName: tool.name,\n toolCallId,\n execute: originalExecute,\n replay: args.toolReplay?.[tool.name],\n args: rawArgs,\n context: toolContext,\n });\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n result: execution.normalizedResult,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n args.messages.push({\n role: \"tool\",\n content: execution.normalizedResult,\n metadata: {\n name: tool.name,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(getReplayMetadataFromError(error)),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n } finally {\n leaveNativeTool();\n }\n };\n instrumentedExecute[ORIGINAL_NATIVE_EXECUTE] = originalExecute;\n tool.execute = instrumentedExecute;\n };\n\n const patchToolsets = (\n nextToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n ) => {\n for (const toolset of nextToolsets) {\n for (const tool of toolset) {\n patchTool(tool);\n }\n }\n };\n\n patchToolsets(toolsets);\n\n for (const target of getAgentResetTargets(agent)) {\n const originalReset = target.reset;\n originalResets.set(target, originalReset);\n target.reset = function patchedReset(this: ResettableAgent, ...resetArgs) {\n const resetResult = originalReset.apply(this, resetArgs);\n\n if (isPromiseLike(resetResult)) {\n return resetResult.finally(() => {\n patchToolsets(\n resolveInferredNativeToolsets<TInput, TMetadata>(agent),\n );\n });\n }\n\n patchToolsets(resolveInferredNativeToolsets<TInput, TMetadata>(agent));\n return resetResult;\n };\n }\n\n try {\n return await callback();\n } finally {\n for (const [target, originalReset] of originalResets) {\n target.reset = originalReset;\n }\n\n for (const [tool, originalExecute] of originalExecutions) {\n tool.execute = originalExecute;\n }\n }\n}\n\ntype ResettableAgent = {\n reset: (...args: unknown[]) => unknown;\n};\n\nfunction getAgentResetTargets(agent: unknown): ResettableAgent[] {\n return getAgentRoots(agent).filter(isResettableAgent);\n}\n\nfunction isResettableAgent(value: object): value is ResettableAgent {\n return \"reset\" in value && typeof value.reset === \"function\";\n}\n\nfunction resolveInferredNativeToolsets<\n TInput,\n TMetadata extends HarnessMetadata,\n>(agent: unknown): Array<PiAgentToolLike<TInput, TMetadata>[]> {\n const toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n toolsets.push(nativeTools);\n }\n }\n\n return toolsets;\n}\n\nfunction isPromiseLike(value: unknown): value is Promise<unknown> {\n return Boolean(\n value && typeof (value as { then?: unknown }).then === \"function\",\n );\n}\n\nfunction serializeToolCallError(\n error: unknown,\n): NonNullable<ToolCallRecord[\"error\"]> {\n const serialized = serializeError(error);\n const { message, type, ...details } = serialized;\n\n return {\n ...details,\n message: typeof message === \"string\" ? message : String(message),\n ...(typeof type === \"string\" ? { type } : {}),\n };\n}\n\nfunction getNativeToolExecuteOrigin<TInput, TMetadata extends HarnessMetadata>(\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"],\n) {\n const nativeExecute = execute as NativeToolExecute<TInput, TMetadata>;\n return nativeExecute[ORIGINAL_NATIVE_EXECUTE] ?? nativeExecute;\n}\n\nfunction createPiToolExecutionState(): PiToolExecutionState {\n return {\n activeNativeToolNames: new Map(),\n };\n}\n\nfunction enterNativeToolExecution(\n state: PiToolExecutionState,\n toolName: string,\n) {\n state.activeNativeToolNames.set(\n toolName,\n (state.activeNativeToolNames.get(toolName) ?? 0) + 1,\n );\n\n return () => {\n const nextCount = (state.activeNativeToolNames.get(toolName) ?? 1) - 1;\n if (nextCount <= 0) {\n state.activeNativeToolNames.delete(toolName);\n return;\n }\n\n state.activeNativeToolNames.set(toolName, nextCount);\n };\n}\n\nfunction hasActiveNativeToolExecution(\n state: PiToolExecutionState,\n toolName: string,\n) {\n return (state.activeNativeToolNames.get(toolName) ?? 0) > 0;\n}\n\nasync function executeNativeToolWithReplay<\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n toolCallId,\n execute,\n replay,\n args,\n context,\n}: {\n toolName: string;\n toolCallId: string;\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n replay: PiAiToolReplayPolicy<TInput, TMetadata> | undefined;\n args: Record<string, JsonValue>;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n let didExecute = false;\n let liveResult: unknown;\n\n const execution = await executeWithReplay({\n toolName: createNativeReplayToolName(toolName),\n args,\n context,\n execute: async (toolArgs) => {\n didExecute = true;\n liveResult = await execute(toolCallId, toolArgs);\n return createNativeToolReplayEnvelope(liveResult);\n },\n replay,\n });\n\n if (didExecute) {\n return {\n result: liveResult,\n normalizedResult: normalizeReplayToolResult(liveResult),\n replay: execution.replay,\n };\n }\n\n return {\n ...resolveNativeToolReplayResult(execution.result),\n replay: execution.replay,\n };\n}\n\nfunction createNativeReplayToolName(toolName: string) {\n return `${toolName}.native`;\n}\n\nfunction createRuntime<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n executionState,\n messages,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: PiAiToolReplayPolicies<TInput, TMetadata> | undefined;\n executionState: PiToolExecutionState;\n messages: NormalizedMessage[];\n}): PiAiRuntime<TTools, TInput, TMetadata> & {\n toolCalls: ToolCallRecord[];\n} {\n const toolCalls: ToolCallRecord[] = [];\n const eventSink: PiAiEventSink = {\n message: (message) => {\n messages.push(message);\n },\n system: (content, metadata) => {\n messages.push({\n role: \"system\",\n content,\n metadata,\n });\n },\n user: (content, metadata) => {\n messages.push({\n role: \"user\",\n content,\n metadata,\n });\n },\n assistant: (content, metadata) => {\n messages.push({\n role: \"assistant\",\n content,\n metadata,\n });\n },\n tool: (name, content, metadata) => {\n messages.push({\n role: \"tool\",\n content,\n metadata: {\n name,\n ...(metadata ?? {}),\n },\n });\n },\n };\n\n const runtimeTools = Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => [\n toolName,\n async (args: Record<string, JsonValue>) => {\n const startedAt = new Date();\n const isNativeImplementationCall = hasActiveNativeToolExecution(\n executionState,\n toolName,\n );\n const toolContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n\n try {\n const execution = await executeToolWithReplay({\n toolName,\n tool,\n replay: isNativeImplementationCall\n ? undefined\n : toolReplay?.[toolName],\n args,\n context: toolContext,\n });\n const finishedAt = new Date();\n\n if (isNativeImplementationCall) {\n return execution.result;\n }\n\n const call = {\n name: toolName,\n arguments: args,\n result: execution.result,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n messages.push({\n role: \"tool\",\n content: execution.result,\n metadata: {\n name: toolName,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n if (isNativeImplementationCall) {\n throw error;\n }\n\n const call = {\n name: toolName,\n arguments: args,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n ),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n }\n },\n ]),\n ) as unknown as PiAiRuntime<TTools, TInput, TMetadata>[\"tools\"];\n\n return {\n tools: runtimeTools,\n events: eventSink,\n signal: context.signal,\n toolCalls,\n };\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const candidates = [\"output\"] 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 normalizeToolResult(result: unknown): JsonValue | undefined {\n const details =\n result && typeof result === \"object\"\n ? toJsonValue((result as { details?: unknown }).details)\n : undefined;\n if (details !== undefined) {\n return details;\n }\n\n const normalized = toJsonValue(result);\n return normalized !== undefined\n ? normalized\n : result === undefined\n ? undefined\n : String(result);\n}\n\nfunction normalizeReplayToolResult(result: unknown): JsonValue {\n return normalizeToolResult(result) ?? null;\n}\n\ntype NativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 2;\n };\n agentResult: JsonValue;\n normalizedResult: JsonValue;\n};\n\ntype LegacyNativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 1;\n };\n normalizedResult: JsonValue;\n agentResult?: JsonValue;\n};\n\nfunction createNativeToolReplayEnvelope(\n result: unknown,\n): NativeToolReplayEnvelope {\n const normalizedResult = normalizeReplayToolResult(result);\n\n const agentResult = toJsonValue(result);\n\n return {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\",\n version: 2,\n },\n agentResult: agentResult !== undefined ? agentResult : normalizedResult,\n normalizedResult,\n };\n}\n\nfunction resolveNativeToolReplayResult(result: JsonValue) {\n if (isNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n if (isLegacyNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult ?? result.normalizedResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n return {\n result,\n normalizedResult: normalizeReplayToolResult(result),\n };\n}\n\nfunction isNativeToolReplayEnvelope(\n value: unknown,\n): value is NativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"agentResult\" in value &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isNativeToolReplayMarker(\n value: unknown,\n): value is NativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 2,\n );\n}\n\nfunction isLegacyNativeToolReplayEnvelope(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isLegacyNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isLegacyNativeToolReplayMarker(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 1,\n );\n}\n\nfunction resolveUsage(result: unknown, toolCallCount: number): UsageSummary {\n if (!result || typeof result !== \"object\") {\n return toolCallCount > 0 ? { toolCalls: toolCallCount } : {};\n }\n\n const usageValue =\n (result as Record<string, unknown>).usage ??\n (result as Record<string, unknown>).metrics;\n\n if (\n !usageValue ||\n typeof usageValue !== \"object\" ||\n Array.isArray(usageValue)\n ) {\n return toolCallCount > 0 ? { toolCalls: toolCallCount } : {};\n }\n\n const usageRecord = usageValue as Record<string, unknown>;\n const usage: UsageSummary = {\n provider: stringField(usageRecord.provider),\n model: stringField(usageRecord.model),\n inputTokens: numberField(usageRecord.inputTokens),\n outputTokens: numberField(usageRecord.outputTokens),\n reasoningTokens: numberField(usageRecord.reasoningTokens),\n totalTokens: numberField(usageRecord.totalTokens),\n toolCalls: numberField(usageRecord.toolCalls),\n retries: numberField(usageRecord.retries),\n metadata: collectUsageMetadata(usageRecord),\n };\n\n if (usage.toolCalls === undefined && toolCallCount > 0) {\n usage.toolCalls = toolCallCount;\n }\n\n return usage;\n}\n\nfunction collectUsageMetadata(usage: Record<string, unknown>) {\n const metadata: Record<string, unknown> = {};\n const nestedMetadata = usage.metadata;\n if (\n nestedMetadata &&\n typeof nestedMetadata === \"object\" &&\n !Array.isArray(nestedMetadata)\n ) {\n Object.assign(metadata, nestedMetadata);\n }\n\n for (const [key, value] of Object.entries(usage)) {\n if (key === \"metadata\" || USAGE_SUMMARY_KEYS.has(key)) {\n continue;\n }\n metadata[key] = value;\n }\n\n return normalizeMetadata(metadata);\n}\n\nconst USAGE_SUMMARY_KEYS = new Set([\n \"provider\",\n \"model\",\n \"inputTokens\",\n \"outputTokens\",\n \"reasoningTokens\",\n \"totalTokens\",\n \"toolCalls\",\n \"retries\",\n]);\n\nfunction stringField(value: unknown) {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction numberField(value: unknown) {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction resolveSession(\n result: unknown,\n messages: NormalizedMessage[],\n output: JsonValue | undefined,\n usage: UsageSummary,\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 sessionMessages = [...messages];\n if (\n output !== undefined &&\n !sessionMessages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n sessionMessages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n return {\n messages: sessionMessages,\n provider:\n ((result as Record<string, unknown> | undefined)?.provider as\n | string\n | undefined) ?? usage.provider,\n model:\n ((result as Record<string, unknown> | undefined)?.model as\n | string\n | undefined) ?? usage.model,\n };\n}\n\nfunction resolveErrors(result: unknown): Array<Record<string, JsonValue>> {\n return resolveHarnessRunErrors(result);\n}\n\nasync function executeToolWithReplay<\n TArgs extends Record<string, JsonValue>,\n TResult extends JsonValue,\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n tool,\n replay,\n args,\n context,\n}: {\n toolName: string;\n tool: PiAiToolDefinition<TArgs, TResult, TInput, TMetadata>;\n replay: PiAiToolReplayPolicy<TInput, TMetadata> | undefined;\n args: TArgs;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n return executeWithReplay<\n Record<string, JsonValue>,\n JsonValue,\n PiAiToolContext<TInput, TMetadata>\n >({\n toolName,\n args,\n context,\n execute: (toolArgs, toolContext) =>\n tool.execute(toolArgs as TArgs, toolContext),\n replay,\n });\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -14,6 +14,56 @@ import {
14
14
  getReplayMetadataFromError,
15
15
  normalizeReplayMetadata
16
16
  } from "vitest-evals/replay";
17
+ import {
18
+ createJudgeHarness
19
+ } from "vitest-evals/judges";
20
+ import { completeSimple } from "@mariozechner/pi-ai";
21
+ function piAiJudgeHarness(config) {
22
+ return createJudgeHarness({
23
+ name: config.name ?? "pi-ai",
24
+ run: async ({ responseFormat, system, prompt }, { signal }) => {
25
+ const message = await completeSimple(
26
+ config.model,
27
+ {
28
+ systemPrompt: formatPiAiJudgeSystemPrompt(system, responseFormat),
29
+ messages: [
30
+ {
31
+ role: "user",
32
+ content: prompt,
33
+ timestamp: Date.now()
34
+ }
35
+ ]
36
+ },
37
+ {
38
+ ...config.options ?? {},
39
+ ...config.temperature !== void 0 ? { temperature: config.temperature } : {},
40
+ ...config.maxOutputTokens !== void 0 ? { maxTokens: config.maxOutputTokens } : {},
41
+ ...signal ? { signal } : {}
42
+ }
43
+ );
44
+ return resolvePiAiJudgeText(message);
45
+ }
46
+ });
47
+ }
48
+ function formatPiAiJudgeSystemPrompt(system, responseFormat) {
49
+ if (responseFormat?.type !== "json") {
50
+ return system;
51
+ }
52
+ const jsonInstruction = [
53
+ "Return only valid JSON. Do not include markdown fences or explanatory prose.",
54
+ responseFormat.schema ? `JSON Schema:
55
+ ${JSON.stringify(responseFormat.schema, null, 2)}` : void 0
56
+ ].filter(Boolean).join("\n\n");
57
+ return system ? `${system}
58
+
59
+ ${jsonInstruction}` : jsonInstruction;
60
+ }
61
+ function resolvePiAiJudgeText(message) {
62
+ if (message.stopReason === "error" || message.stopReason === "aborted") {
63
+ throw new Error(message.errorMessage ?? "Pi AI judge harness failed.");
64
+ }
65
+ return message.content.filter((part) => part.type === "text").map((part) => part.text).join("").trim();
66
+ }
17
67
  var ORIGINAL_NATIVE_EXECUTE = Symbol("vitest-evals.originalNativeExecute");
18
68
  function piAiHarness(options) {
19
69
  validateOptions(options);
@@ -790,6 +840,7 @@ async function executeToolWithReplay({
790
840
  });
791
841
  }
792
842
  export {
793
- piAiHarness
843
+ piAiHarness,
844
+ piAiJudgeHarness
794
845
  };
795
846
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport {\n attachHarnessRunToError,\n isHarnessRun,\n isNormalizedSession,\n normalizeMetadata,\n normalizeContent,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: PiAiCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolDefinition<any, any, TInput, TMetadata>>;\ntype InferredPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<\n string,\n PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput, TMetadata>\n>;\n\ntype PiAgentToolLike<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n name: string;\n execute: (toolCallId: string, args: Record<string, JsonValue>) => unknown;\n};\n\ntype PiAiResultOutput<TResult> = TResult extends HarnessRun<infer TOutput>\n ? TOutput\n : \"output\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"output\">\n : undefined;\ntype PiAiAgentResult<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : unknown;\n\nconst ORIGINAL_NATIVE_EXECUTE = Symbol(\"vitest-evals.originalNativeExecute\");\n\ntype NativeToolExecute<\n TInput,\n TMetadata extends HarnessMetadata,\n> = PiAgentToolLike<TInput, TMetadata>[\"execute\"] & {\n [ORIGINAL_NATIVE_EXECUTE]?: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n};\n\n/** Replay mode alias used by the Pi AI harness package. */\nexport type PiAiReplayMode = ReplayMode;\n\n/** Event sink for recording Pi AI transcript messages. */\nexport interface PiAiEventSink {\n message: (message: NormalizedMessage) => void;\n system: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n user: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n assistant: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n tool: (\n name: string,\n content: JsonValue,\n metadata?: Record<string, JsonValue>,\n ) => void;\n}\n\n/** Context passed to instrumented Pi AI tool executions. */\nexport interface PiAiToolContext<\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}\n\n/** Tool replay recording shape for Pi AI tools. */\nexport type PiAiToolRecording<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for a Pi AI tool. */\nexport type PiAiToolReplayConfig<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput, TMetadata>>;\n\n/** Replay policy for one Pi AI tool. */\nexport type PiAiToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | boolean\n | PiAiToolReplayConfig<\n Record<string, JsonValue>,\n JsonValue,\n TInput,\n TMetadata\n >;\n\n/** Replay policy map keyed by Pi AI tool name. */\nexport type PiAiToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolReplayPolicy<TInput, TMetadata>>;\n\n/** Tool definition accepted by the Pi AI harness runtime. */\nexport interface PiAiToolDefinition<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n description?: string;\n execute: (\n args: TArgs,\n context: PiAiToolContext<TInput, TMetadata>,\n ) => MaybePromise<TResult>;\n}\n\n/** Toolset shape accepted by the Pi AI harness. */\nexport type PiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyPiAiToolset<TInput, TMetadata>;\n\ntype ToolArgs<TTool> = TTool extends PiAiToolDefinition<\n infer TArgs,\n infer _TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TArgs\n : never;\n\ntype ToolResult<TTool> = TTool extends PiAiToolDefinition<\n infer _TArgs,\n infer TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TResult\n : never;\n\n/** Runtime object passed into Pi AI agent entrypoints. */\nexport type PiAiRuntime<\n TTools extends PiAiToolset<TInput, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n tools: {\n [K in keyof TTools]: (\n args: ToolArgs<TTools[K]>,\n ) => Promise<ToolResult<TTools[K]>>;\n };\n events: PiAiEventSink;\n signal?: AbortSignal;\n};\n\n/** Arguments passed to custom Pi AI harness run callbacks. */\nexport interface PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> {\n agent: TAgent;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: PiAiRuntime<TTools, TInput, TMetadata>;\n}\n\n/** Arguments passed to Pi AI harness output selectors. */\nexport interface PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> extends PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\n/** Arguments passed to per-run Pi AI agent factories. */\nexport interface PiAiCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\n}\n\ninterface PiAiHarnessBaseOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n toolReplay?: PiAiToolReplayPolicies<TInput, TMetadata>;\n output?: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n name?: string;\n}\n\ninterface PiAiHarnessWithToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n > {\n tools: TTools;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ninterface PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n TOutput\n > {\n tools?: undefined;\n run?: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ntype PiAiHarnessOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> =\n | PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >\n | PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n >;\n\ntype PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n};\n\ntype PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n TOutput\n >;\n};\n\ntype PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n InferredPiAiToolset<TInput, TMetadata>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & {\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiHarnessOutputSelector<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype InferredToolSurfaces<TInput, TMetadata extends HarnessMetadata> = {\n runtimeTools?: InferredPiAiToolset<TInput, TMetadata>;\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>;\n};\n\ntype PiToolExecutionState = {\n activeNativeToolNames: Map<string, number>;\n};\n\n/** Adapts a Pi agent runtime into a normalized vitest-evals harness. */\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TTools\n >,\n): Harness<\n TInput,\n PiAiResultOutput<PiAiAgentResult<TAgent, TInput, TMetadata, TTools>>,\n TMetadata\n>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n>(\n options: PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n>(\n options: PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata\n >,\n): Harness<\n TInput,\n PiAiResultOutput<\n PiAiAgentResult<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >\n >,\n TMetadata\n>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata> {\n validateOptions(options);\n\n const harness: Harness<TInput, TOutput, TMetadata> = {\n name: options.name ?? \"pi-ai\",\n run: async (input, context) => {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const inferredTools = resolveInferredToolSurfaces<TInput, TMetadata>(\n agent,\n );\n\n if (hasExplicitToolset(options)) {\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n options.tools,\n inferredTools.nativeToolsets,\n );\n }\n\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n inferredTools.runtimeTools,\n inferredTools.nativeToolsets,\n );\n },\n };\n\n return harness;\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n if (options.agent === undefined) {\n throw new Error(\n \"piAiHarness requires agent. Pass an agent instance or an agent factory.\",\n );\n }\n}\n\nasync function executePiHarnessRun<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n agent: TAgent,\n input: TInput,\n context: HarnessContext<TMetadata>,\n messages: NormalizedMessage[],\n runtimeTools: TTools | undefined,\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n): Promise<HarnessRun<TOutput>> {\n const executionState = createPiToolExecutionState();\n const runtime = createRuntime({\n input,\n context,\n tools: runtimeTools,\n toolReplay: options.toolReplay,\n executionState,\n messages,\n });\n\n try {\n const result = await withInstrumentedAgentTools(\n agent,\n nativeToolsets,\n {\n input,\n context,\n messages,\n toolCalls: runtime.toolCalls,\n toolReplay: options.toolReplay,\n executionState,\n },\n () =>\n runAgent(options, {\n agent,\n input,\n context,\n runtime,\n }),\n );\n\n if (isHarnessRun(result) && !hasOutputSelector(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n return result;\n }\n\n const normalizeResult = result as TResult;\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n result: normalizeResult,\n } satisfies PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(normalizeResult) as TOutput | undefined);\n const usage = resolveUsage(normalizeResult, runtime.toolCalls.length);\n const session = resolveSession(normalizeResult, messages, output, usage);\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: resolveErrors(normalizeResult),\n } as HarnessRun<TOutput>;\n } catch (error) {\n const usage = resolveUsage(undefined, runtime.toolCalls.length);\n const run = {\n session: resolveSession(undefined, messages, undefined, usage),\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializeError(error)],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n) {\n return resolveAgentSource(options.agent, args);\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction isAgentFactory<TAgent, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n) => MaybePromise<TAgent> {\n return typeof agent === \"function\" && !hasPiAiRunMethod(agent);\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n return Boolean(options.output);\n}\n\nfunction resolveInferredToolSurfaces<TInput, TMetadata extends HarnessMetadata>(\n agent: unknown,\n): InferredToolSurfaces<TInput, TMetadata> {\n let runtimeTools: InferredPiAiToolset<TInput, TMetadata> | undefined;\n const nativeToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nextRuntimeTools = getRuntimeToolset<TInput, TMetadata>(candidate);\n if (runtimeTools === undefined && nextRuntimeTools !== undefined) {\n runtimeTools = nextRuntimeTools;\n }\n\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n nativeToolsets.push(nativeTools);\n }\n }\n\n return {\n ...(runtimeTools ? { runtimeTools } : {}),\n ...(nativeToolsets.length > 0 ? { nativeToolsets } : {}),\n };\n}\n\nfunction getAgentToolCandidates(agent: unknown): object[] {\n const roots = getAgentRoots(agent);\n const candidates: object[] = [];\n const seen = new Set<object>();\n\n for (const root of roots) {\n addUniqueObject(candidates, seen, root);\n addUniqueObject(candidates, seen, getObjectProperty(root, \"state\"));\n addUniqueObject(candidates, seen, getObjectProperty(root, \"initialState\"));\n }\n\n return candidates;\n}\n\nfunction getAgentRoots(agent: unknown): object[] {\n return [asObject(agent)]\n .concat(asObject(getObjectProperty(agent, \"agent\")))\n .filter((value): value is object => value !== undefined);\n}\n\nfunction addUniqueObject(\n candidates: object[],\n seen: Set<object>,\n value: unknown,\n) {\n if (!value || typeof value !== \"object\" || seen.has(value)) {\n return;\n }\n\n seen.add(value);\n candidates.push(value);\n}\n\nfunction asObject(value: unknown): object | undefined {\n return value && typeof value === \"object\" ? value : undefined;\n}\n\nfunction getObjectProperty(value: unknown, key: string): unknown {\n return value && typeof value === \"object\"\n ? (value as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction getRuntimeToolset<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): InferredPiAiToolset<TInput, TMetadata> | undefined {\n const candidate =\n getObjectProperty(value, \"tools\") ?? getObjectProperty(value, \"toolset\");\n\n return isPiAiToolset(candidate)\n ? (candidate as InferredPiAiToolset<TInput, TMetadata>)\n : undefined;\n}\n\nfunction getNativeToolArray<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): PiAgentToolLike<TInput, TMetadata>[] | undefined {\n const candidate = getObjectProperty(value, \"tools\");\n if (isAgentToolArray(candidate)) {\n return candidate as PiAgentToolLike<TInput, TMetadata>[];\n }\n\n return undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (\n hasPiAiRunMethod<TInput, TMetadata, TResult, TOutput, TTools>(args.agent)\n ) {\n return args.agent.run(args.input, args.runtime);\n }\n\n throw new Error(\n \"piAiHarness requires a run() function unless the provided agent exposes run(input, runtime).\",\n );\n}\n\nfunction hasExplicitToolset<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): options is PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> {\n return options.tools !== undefined;\n}\n\nfunction hasPiAiRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is PiAiRunnableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n if (!agent || (typeof agent !== \"object\" && typeof agent !== \"function\")) {\n return false;\n }\n\n return (\n \"run\" in agent && typeof (agent as { run?: unknown }).run === \"function\"\n );\n}\n\nfunction isPiAiToolset(value: unknown): value is PiAiToolset {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const tools = Object.values(value);\n return (\n tools.length > 0 &&\n tools.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nfunction isAgentToolArray(value: unknown): value is PiAgentToolLike[] {\n return (\n Array.isArray(value) &&\n value.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"name\" in tool &&\n typeof (tool as { name?: unknown }).name === \"string\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nasync function withInstrumentedAgentTools<\n TResult,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: unknown,\n toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> | undefined,\n args: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n messages: NormalizedMessage[];\n toolCalls: ToolCallRecord[];\n toolReplay: PiAiToolReplayPolicies<TInput, TMetadata> | undefined;\n executionState: PiToolExecutionState;\n },\n callback: () => Promise<TResult>,\n) {\n if (!toolsets || toolsets.length === 0) {\n return callback();\n }\n\n const originalExecutions = new Map<\n PiAgentToolLike<TInput, TMetadata>,\n PiAgentToolLike<TInput, TMetadata>[\"execute\"]\n >();\n const originalResets = new Map<ResettableAgent, ResettableAgent[\"reset\"]>();\n\n const patchTool = (tool: PiAgentToolLike<TInput, TMetadata>) => {\n if (originalExecutions.has(tool)) {\n return;\n }\n\n const originalExecute = getNativeToolExecuteOrigin(tool.execute);\n originalExecutions.set(tool, originalExecute);\n const instrumentedExecute: NativeToolExecute<TInput, TMetadata> = async (\n toolCallId: string,\n rawArgs: Record<string, JsonValue>,\n ) => {\n const startedAt = new Date();\n const toolContext = {\n input: args.input,\n metadata: args.context.metadata,\n signal: args.context.signal,\n setArtifact: args.context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n const leaveNativeTool = enterNativeToolExecution(\n args.executionState,\n tool.name,\n );\n\n try {\n const execution = await executeNativeToolWithReplay({\n toolName: tool.name,\n toolCallId,\n execute: originalExecute,\n replay: args.toolReplay?.[tool.name],\n args: rawArgs,\n context: toolContext,\n });\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n result: execution.normalizedResult,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n args.messages.push({\n role: \"tool\",\n content: execution.normalizedResult,\n metadata: {\n name: tool.name,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(getReplayMetadataFromError(error)),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n } finally {\n leaveNativeTool();\n }\n };\n instrumentedExecute[ORIGINAL_NATIVE_EXECUTE] = originalExecute;\n tool.execute = instrumentedExecute;\n };\n\n const patchToolsets = (\n nextToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n ) => {\n for (const toolset of nextToolsets) {\n for (const tool of toolset) {\n patchTool(tool);\n }\n }\n };\n\n patchToolsets(toolsets);\n\n for (const target of getAgentResetTargets(agent)) {\n const originalReset = target.reset;\n originalResets.set(target, originalReset);\n target.reset = function patchedReset(this: ResettableAgent, ...resetArgs) {\n const resetResult = originalReset.apply(this, resetArgs);\n\n if (isPromiseLike(resetResult)) {\n return resetResult.finally(() => {\n patchToolsets(\n resolveInferredNativeToolsets<TInput, TMetadata>(agent),\n );\n });\n }\n\n patchToolsets(resolveInferredNativeToolsets<TInput, TMetadata>(agent));\n return resetResult;\n };\n }\n\n try {\n return await callback();\n } finally {\n for (const [target, originalReset] of originalResets) {\n target.reset = originalReset;\n }\n\n for (const [tool, originalExecute] of originalExecutions) {\n tool.execute = originalExecute;\n }\n }\n}\n\ntype ResettableAgent = {\n reset: (...args: unknown[]) => unknown;\n};\n\nfunction getAgentResetTargets(agent: unknown): ResettableAgent[] {\n return getAgentRoots(agent).filter(isResettableAgent);\n}\n\nfunction isResettableAgent(value: object): value is ResettableAgent {\n return \"reset\" in value && typeof value.reset === \"function\";\n}\n\nfunction resolveInferredNativeToolsets<\n TInput,\n TMetadata extends HarnessMetadata,\n>(agent: unknown): Array<PiAgentToolLike<TInput, TMetadata>[]> {\n const toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n toolsets.push(nativeTools);\n }\n }\n\n return toolsets;\n}\n\nfunction isPromiseLike(value: unknown): value is Promise<unknown> {\n return Boolean(\n value && typeof (value as { then?: unknown }).then === \"function\",\n );\n}\n\nfunction serializeToolCallError(\n error: unknown,\n): NonNullable<ToolCallRecord[\"error\"]> {\n const serialized = serializeError(error);\n const { message, type, ...details } = serialized;\n\n return {\n ...details,\n message: typeof message === \"string\" ? message : String(message),\n ...(typeof type === \"string\" ? { type } : {}),\n };\n}\n\nfunction getNativeToolExecuteOrigin<TInput, TMetadata extends HarnessMetadata>(\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"],\n) {\n const nativeExecute = execute as NativeToolExecute<TInput, TMetadata>;\n return nativeExecute[ORIGINAL_NATIVE_EXECUTE] ?? nativeExecute;\n}\n\nfunction createPiToolExecutionState(): PiToolExecutionState {\n return {\n activeNativeToolNames: new Map(),\n };\n}\n\nfunction enterNativeToolExecution(\n state: PiToolExecutionState,\n toolName: string,\n) {\n state.activeNativeToolNames.set(\n toolName,\n (state.activeNativeToolNames.get(toolName) ?? 0) + 1,\n );\n\n return () => {\n const nextCount = (state.activeNativeToolNames.get(toolName) ?? 1) - 1;\n if (nextCount <= 0) {\n state.activeNativeToolNames.delete(toolName);\n return;\n }\n\n state.activeNativeToolNames.set(toolName, nextCount);\n };\n}\n\nfunction hasActiveNativeToolExecution(\n state: PiToolExecutionState,\n toolName: string,\n) {\n return (state.activeNativeToolNames.get(toolName) ?? 0) > 0;\n}\n\nasync function executeNativeToolWithReplay<\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n toolCallId,\n execute,\n replay,\n args,\n context,\n}: {\n toolName: string;\n toolCallId: string;\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n replay: PiAiToolReplayPolicy<TInput, TMetadata> | undefined;\n args: Record<string, JsonValue>;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n let didExecute = false;\n let liveResult: unknown;\n\n const execution = await executeWithReplay({\n toolName: createNativeReplayToolName(toolName),\n args,\n context,\n execute: async (toolArgs) => {\n didExecute = true;\n liveResult = await execute(toolCallId, toolArgs);\n return createNativeToolReplayEnvelope(liveResult);\n },\n replay,\n });\n\n if (didExecute) {\n return {\n result: liveResult,\n normalizedResult: normalizeReplayToolResult(liveResult),\n replay: execution.replay,\n };\n }\n\n return {\n ...resolveNativeToolReplayResult(execution.result),\n replay: execution.replay,\n };\n}\n\nfunction createNativeReplayToolName(toolName: string) {\n return `${toolName}.native`;\n}\n\nfunction createRuntime<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n executionState,\n messages,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: PiAiToolReplayPolicies<TInput, TMetadata> | undefined;\n executionState: PiToolExecutionState;\n messages: NormalizedMessage[];\n}): PiAiRuntime<TTools, TInput, TMetadata> & {\n toolCalls: ToolCallRecord[];\n} {\n const toolCalls: ToolCallRecord[] = [];\n const eventSink: PiAiEventSink = {\n message: (message) => {\n messages.push(message);\n },\n system: (content, metadata) => {\n messages.push({\n role: \"system\",\n content,\n metadata,\n });\n },\n user: (content, metadata) => {\n messages.push({\n role: \"user\",\n content,\n metadata,\n });\n },\n assistant: (content, metadata) => {\n messages.push({\n role: \"assistant\",\n content,\n metadata,\n });\n },\n tool: (name, content, metadata) => {\n messages.push({\n role: \"tool\",\n content,\n metadata: {\n name,\n ...(metadata ?? {}),\n },\n });\n },\n };\n\n const runtimeTools = Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => [\n toolName,\n async (args: Record<string, JsonValue>) => {\n const startedAt = new Date();\n const isNativeImplementationCall = hasActiveNativeToolExecution(\n executionState,\n toolName,\n );\n const toolContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n\n try {\n const execution = await executeToolWithReplay({\n toolName,\n tool,\n replay: isNativeImplementationCall\n ? undefined\n : toolReplay?.[toolName],\n args,\n context: toolContext,\n });\n const finishedAt = new Date();\n\n if (isNativeImplementationCall) {\n return execution.result;\n }\n\n const call = {\n name: toolName,\n arguments: args,\n result: execution.result,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n messages.push({\n role: \"tool\",\n content: execution.result,\n metadata: {\n name: toolName,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n if (isNativeImplementationCall) {\n throw error;\n }\n\n const call = {\n name: toolName,\n arguments: args,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n ),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n }\n },\n ]),\n ) as unknown as PiAiRuntime<TTools, TInput, TMetadata>[\"tools\"];\n\n return {\n tools: runtimeTools,\n events: eventSink,\n signal: context.signal,\n toolCalls,\n };\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const candidates = [\"output\"] 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 normalizeToolResult(result: unknown): JsonValue | undefined {\n const details =\n result && typeof result === \"object\"\n ? toJsonValue((result as { details?: unknown }).details)\n : undefined;\n if (details !== undefined) {\n return details;\n }\n\n const normalized = toJsonValue(result);\n return normalized !== undefined\n ? normalized\n : result === undefined\n ? undefined\n : String(result);\n}\n\nfunction normalizeReplayToolResult(result: unknown): JsonValue {\n return normalizeToolResult(result) ?? null;\n}\n\ntype NativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 2;\n };\n agentResult: JsonValue;\n normalizedResult: JsonValue;\n};\n\ntype LegacyNativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 1;\n };\n normalizedResult: JsonValue;\n agentResult?: JsonValue;\n};\n\nfunction createNativeToolReplayEnvelope(\n result: unknown,\n): NativeToolReplayEnvelope {\n const normalizedResult = normalizeReplayToolResult(result);\n\n const agentResult = toJsonValue(result);\n\n return {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\",\n version: 2,\n },\n agentResult: agentResult !== undefined ? agentResult : normalizedResult,\n normalizedResult,\n };\n}\n\nfunction resolveNativeToolReplayResult(result: JsonValue) {\n if (isNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n if (isLegacyNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult ?? result.normalizedResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n return {\n result,\n normalizedResult: normalizeReplayToolResult(result),\n };\n}\n\nfunction isNativeToolReplayEnvelope(\n value: unknown,\n): value is NativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"agentResult\" in value &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isNativeToolReplayMarker(\n value: unknown,\n): value is NativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 2,\n );\n}\n\nfunction isLegacyNativeToolReplayEnvelope(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isLegacyNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isLegacyNativeToolReplayMarker(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 1,\n );\n}\n\nfunction resolveUsage(result: unknown, toolCallCount: number): UsageSummary {\n if (!result || typeof result !== \"object\") {\n return toolCallCount > 0 ? { toolCalls: toolCallCount } : {};\n }\n\n const usageValue =\n (result as Record<string, unknown>).usage ??\n (result as Record<string, unknown>).metrics;\n\n if (\n !usageValue ||\n typeof usageValue !== \"object\" ||\n Array.isArray(usageValue)\n ) {\n return toolCallCount > 0 ? { toolCalls: toolCallCount } : {};\n }\n\n const usageRecord = usageValue as Record<string, unknown>;\n const usage: UsageSummary = {\n provider: stringField(usageRecord.provider),\n model: stringField(usageRecord.model),\n inputTokens: numberField(usageRecord.inputTokens),\n outputTokens: numberField(usageRecord.outputTokens),\n reasoningTokens: numberField(usageRecord.reasoningTokens),\n totalTokens: numberField(usageRecord.totalTokens),\n toolCalls: numberField(usageRecord.toolCalls),\n retries: numberField(usageRecord.retries),\n metadata: collectUsageMetadata(usageRecord),\n };\n\n if (usage.toolCalls === undefined && toolCallCount > 0) {\n usage.toolCalls = toolCallCount;\n }\n\n return usage;\n}\n\nfunction collectUsageMetadata(usage: Record<string, unknown>) {\n const metadata: Record<string, unknown> = {};\n const nestedMetadata = usage.metadata;\n if (\n nestedMetadata &&\n typeof nestedMetadata === \"object\" &&\n !Array.isArray(nestedMetadata)\n ) {\n Object.assign(metadata, nestedMetadata);\n }\n\n for (const [key, value] of Object.entries(usage)) {\n if (key === \"metadata\" || USAGE_SUMMARY_KEYS.has(key)) {\n continue;\n }\n metadata[key] = value;\n }\n\n return normalizeMetadata(metadata);\n}\n\nconst USAGE_SUMMARY_KEYS = new Set([\n \"provider\",\n \"model\",\n \"inputTokens\",\n \"outputTokens\",\n \"reasoningTokens\",\n \"totalTokens\",\n \"toolCalls\",\n \"retries\",\n]);\n\nfunction stringField(value: unknown) {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction numberField(value: unknown) {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction resolveSession(\n result: unknown,\n messages: NormalizedMessage[],\n output: JsonValue | undefined,\n usage: UsageSummary,\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 sessionMessages = [...messages];\n if (\n output !== undefined &&\n !sessionMessages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n sessionMessages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n return {\n messages: sessionMessages,\n provider:\n ((result as Record<string, unknown> | undefined)?.provider as\n | string\n | undefined) ?? usage.provider,\n model:\n ((result as Record<string, unknown> | undefined)?.model as\n | string\n | undefined) ?? usage.model,\n };\n}\n\nfunction resolveErrors(result: unknown): Array<Record<string, JsonValue>> {\n return resolveHarnessRunErrors(result);\n}\n\nasync function executeToolWithReplay<\n TArgs extends Record<string, JsonValue>,\n TResult extends JsonValue,\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n tool,\n replay,\n args,\n context,\n}: {\n toolName: string;\n tool: PiAiToolDefinition<TArgs, TResult, TInput, TMetadata>;\n replay: PiAiToolReplayPolicy<TInput, TMetadata> | undefined;\n args: TArgs;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n return executeWithReplay<\n Record<string, JsonValue>,\n JsonValue,\n PiAiToolContext<TInput, TMetadata>\n >({\n toolName,\n args,\n context,\n execute: (toolArgs, toolContext) =>\n tool.execute(toolArgs as TArgs, toolContext),\n replay,\n });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport {\n attachHarnessRunToError,\n isHarnessRun,\n isNormalizedSession,\n normalizeMetadata,\n normalizeContent,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\nimport {\n createJudgeHarness,\n type JudgeHarnessInput,\n} from \"vitest-evals/judges\";\nimport { completeSimple } from \"@mariozechner/pi-ai\";\nimport type {\n Api,\n AssistantMessage,\n Model,\n SimpleStreamOptions,\n} from \"@mariozechner/pi-ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: PiAiCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolDefinition<any, any, TInput, TMetadata>>;\n\n/**\n * Configuration for adapting a Pi AI model into a judge harness.\n *\n * @example\n * ```ts\n * import { getModel } from \"@mariozechner/pi-ai\";\n * import { piAiJudgeHarness } from \"@vitest-evals/harness-pi-ai\";\n *\n * const judgeHarness = piAiJudgeHarness({\n * model: getModel(\"anthropic\", \"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n * ```\n */\nexport interface PiAiJudgeHarnessConfig<TApi extends Api = Api> {\n /** Pi AI model used for judge prompts. */\n model: Model<TApi>;\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 /** Additional Pi AI stream options forwarded to `completeSimple(...)`. */\n options?: Omit<SimpleStreamOptions, \"signal\" | \"temperature\" | \"maxTokens\">;\n}\n\n/**\n * Adapts a Pi AI model into the provider-neutral judge harness API.\n *\n * @example\n * ```ts\n * import { getModel } from \"@mariozechner/pi-ai\";\n * import { piAiJudgeHarness } from \"@vitest-evals/harness-pi-ai\";\n * import { describeEval, FactualityJudge } from \"vitest-evals\";\n *\n * const judgeHarness = piAiJudgeHarness({\n * model: getModel(\"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 piAiJudgeHarness<TApi extends Api>(\n config: PiAiJudgeHarnessConfig<TApi>,\n) {\n return createJudgeHarness({\n name: config.name ?? \"pi-ai\",\n run: async ({ responseFormat, system, prompt }, { signal }) => {\n const message = await completeSimple(\n config.model,\n {\n systemPrompt: formatPiAiJudgeSystemPrompt(system, responseFormat),\n messages: [\n {\n role: \"user\",\n content: prompt,\n timestamp: Date.now(),\n },\n ],\n },\n {\n ...(config.options ?? {}),\n ...(config.temperature !== undefined\n ? { temperature: config.temperature }\n : {}),\n ...(config.maxOutputTokens !== undefined\n ? { maxTokens: config.maxOutputTokens }\n : {}),\n ...(signal ? { signal } : {}),\n },\n );\n\n return resolvePiAiJudgeText(message);\n },\n });\n}\n\nfunction formatPiAiJudgeSystemPrompt(\n system: string | undefined,\n responseFormat: JudgeHarnessInput[\"responseFormat\"],\n) {\n if (responseFormat?.type !== \"json\") {\n return system;\n }\n\n const jsonInstruction = [\n \"Return only valid JSON. Do not include markdown fences or explanatory prose.\",\n responseFormat.schema\n ? `JSON Schema:\\n${JSON.stringify(responseFormat.schema, null, 2)}`\n : undefined,\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n\n return system ? `${system}\\n\\n${jsonInstruction}` : jsonInstruction;\n}\n\nfunction resolvePiAiJudgeText(message: AssistantMessage) {\n if (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n throw new Error(message.errorMessage ?? \"Pi AI judge harness failed.\");\n }\n\n return message.content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\")\n .trim();\n}\n\ntype InferredPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<\n string,\n PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput, TMetadata>\n>;\n\ntype PiAgentToolLike<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n name: string;\n execute: (toolCallId: string, args: Record<string, JsonValue>) => unknown;\n};\n\ntype PiAiResultOutput<TResult> = TResult extends HarnessRun<infer TOutput>\n ? TOutput\n : \"output\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"output\">\n : undefined;\ntype PiAiAgentResult<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : unknown;\n\nconst ORIGINAL_NATIVE_EXECUTE = Symbol(\"vitest-evals.originalNativeExecute\");\n\ntype NativeToolExecute<\n TInput,\n TMetadata extends HarnessMetadata,\n> = PiAgentToolLike<TInput, TMetadata>[\"execute\"] & {\n [ORIGINAL_NATIVE_EXECUTE]?: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n};\n\n/** Replay mode alias used by the Pi AI harness package. */\nexport type PiAiReplayMode = ReplayMode;\n\n/** Event sink for recording Pi AI transcript messages. */\nexport interface PiAiEventSink {\n message: (message: NormalizedMessage) => void;\n system: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n user: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n assistant: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n tool: (\n name: string,\n content: JsonValue,\n metadata?: Record<string, JsonValue>,\n ) => void;\n}\n\n/** Context passed to instrumented Pi AI tool executions. */\nexport interface PiAiToolContext<\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}\n\n/** Tool replay recording shape for Pi AI tools. */\nexport type PiAiToolRecording<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for a Pi AI tool. */\nexport type PiAiToolReplayConfig<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput, TMetadata>>;\n\n/** Replay policy for one Pi AI tool. */\nexport type PiAiToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | boolean\n | PiAiToolReplayConfig<\n Record<string, JsonValue>,\n JsonValue,\n TInput,\n TMetadata\n >;\n\n/** Replay policy map keyed by Pi AI tool name. */\nexport type PiAiToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolReplayPolicy<TInput, TMetadata>>;\n\n/** Tool definition accepted by the Pi AI harness runtime. */\nexport interface PiAiToolDefinition<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n description?: string;\n execute: (\n args: TArgs,\n context: PiAiToolContext<TInput, TMetadata>,\n ) => MaybePromise<TResult>;\n}\n\n/** Toolset shape accepted by the Pi AI harness. */\nexport type PiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyPiAiToolset<TInput, TMetadata>;\n\ntype ToolArgs<TTool> = TTool extends PiAiToolDefinition<\n infer TArgs,\n infer _TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TArgs\n : never;\n\ntype ToolResult<TTool> = TTool extends PiAiToolDefinition<\n infer _TArgs,\n infer TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TResult\n : never;\n\n/** Runtime object passed into Pi AI agent entrypoints. */\nexport type PiAiRuntime<\n TTools extends PiAiToolset<TInput, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n tools: {\n [K in keyof TTools]: (\n args: ToolArgs<TTools[K]>,\n ) => Promise<ToolResult<TTools[K]>>;\n };\n events: PiAiEventSink;\n signal?: AbortSignal;\n};\n\n/** Arguments passed to custom Pi AI harness run callbacks. */\nexport interface PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> {\n agent: TAgent;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: PiAiRuntime<TTools, TInput, TMetadata>;\n}\n\n/** Arguments passed to Pi AI harness output selectors. */\nexport interface PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> extends PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\n/** Arguments passed to per-run Pi AI agent factories. */\nexport interface PiAiCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\n}\n\ninterface PiAiHarnessBaseOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n toolReplay?: PiAiToolReplayPolicies<TInput, TMetadata>;\n output?: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n name?: string;\n}\n\ninterface PiAiHarnessWithToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n > {\n tools: TTools;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ninterface PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n TOutput\n > {\n tools?: undefined;\n run?: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ntype PiAiHarnessOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> =\n | PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >\n | PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n >;\n\ntype PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n};\n\ntype PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n TOutput\n >;\n};\n\ntype PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n InferredPiAiToolset<TInput, TMetadata>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & {\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiHarnessOutputSelector<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype InferredToolSurfaces<TInput, TMetadata extends HarnessMetadata> = {\n runtimeTools?: InferredPiAiToolset<TInput, TMetadata>;\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>;\n};\n\ntype PiToolExecutionState = {\n activeNativeToolNames: Map<string, number>;\n};\n\n/** Adapts a Pi agent runtime into a normalized vitest-evals harness. */\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TTools\n >,\n): Harness<\n TInput,\n PiAiResultOutput<PiAiAgentResult<TAgent, TInput, TMetadata, TTools>>,\n TMetadata\n>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n>(\n options: PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n>(\n options: PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata\n >,\n): Harness<\n TInput,\n PiAiResultOutput<\n PiAiAgentResult<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >\n >,\n TMetadata\n>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata> {\n validateOptions(options);\n\n const harness: Harness<TInput, TOutput, TMetadata> = {\n name: options.name ?? \"pi-ai\",\n run: async (input, context) => {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const inferredTools = resolveInferredToolSurfaces<TInput, TMetadata>(\n agent,\n );\n\n if (hasExplicitToolset(options)) {\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n options.tools,\n inferredTools.nativeToolsets,\n );\n }\n\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n inferredTools.runtimeTools,\n inferredTools.nativeToolsets,\n );\n },\n };\n\n return harness;\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n if (options.agent === undefined) {\n throw new Error(\n \"piAiHarness requires agent. Pass an agent instance or an agent factory.\",\n );\n }\n}\n\nasync function executePiHarnessRun<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n agent: TAgent,\n input: TInput,\n context: HarnessContext<TMetadata>,\n messages: NormalizedMessage[],\n runtimeTools: TTools | undefined,\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n): Promise<HarnessRun<TOutput>> {\n const executionState = createPiToolExecutionState();\n const runtime = createRuntime({\n input,\n context,\n tools: runtimeTools,\n toolReplay: options.toolReplay,\n executionState,\n messages,\n });\n\n try {\n const result = await withInstrumentedAgentTools(\n agent,\n nativeToolsets,\n {\n input,\n context,\n messages,\n toolCalls: runtime.toolCalls,\n toolReplay: options.toolReplay,\n executionState,\n },\n () =>\n runAgent(options, {\n agent,\n input,\n context,\n runtime,\n }),\n );\n\n if (isHarnessRun(result) && !hasOutputSelector(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n return result;\n }\n\n const normalizeResult = result as TResult;\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n result: normalizeResult,\n } satisfies PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(normalizeResult) as TOutput | undefined);\n const usage = resolveUsage(normalizeResult, runtime.toolCalls.length);\n const session = resolveSession(normalizeResult, messages, output, usage);\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: resolveErrors(normalizeResult),\n } as HarnessRun<TOutput>;\n } catch (error) {\n const usage = resolveUsage(undefined, runtime.toolCalls.length);\n const run = {\n session: resolveSession(undefined, messages, undefined, usage),\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializeError(error)],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n) {\n return resolveAgentSource(options.agent, args);\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction isAgentFactory<TAgent, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n) => MaybePromise<TAgent> {\n return typeof agent === \"function\" && !hasPiAiRunMethod(agent);\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n return Boolean(options.output);\n}\n\nfunction resolveInferredToolSurfaces<TInput, TMetadata extends HarnessMetadata>(\n agent: unknown,\n): InferredToolSurfaces<TInput, TMetadata> {\n let runtimeTools: InferredPiAiToolset<TInput, TMetadata> | undefined;\n const nativeToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nextRuntimeTools = getRuntimeToolset<TInput, TMetadata>(candidate);\n if (runtimeTools === undefined && nextRuntimeTools !== undefined) {\n runtimeTools = nextRuntimeTools;\n }\n\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n nativeToolsets.push(nativeTools);\n }\n }\n\n return {\n ...(runtimeTools ? { runtimeTools } : {}),\n ...(nativeToolsets.length > 0 ? { nativeToolsets } : {}),\n };\n}\n\nfunction getAgentToolCandidates(agent: unknown): object[] {\n const roots = getAgentRoots(agent);\n const candidates: object[] = [];\n const seen = new Set<object>();\n\n for (const root of roots) {\n addUniqueObject(candidates, seen, root);\n addUniqueObject(candidates, seen, getObjectProperty(root, \"state\"));\n addUniqueObject(candidates, seen, getObjectProperty(root, \"initialState\"));\n }\n\n return candidates;\n}\n\nfunction getAgentRoots(agent: unknown): object[] {\n return [asObject(agent)]\n .concat(asObject(getObjectProperty(agent, \"agent\")))\n .filter((value): value is object => value !== undefined);\n}\n\nfunction addUniqueObject(\n candidates: object[],\n seen: Set<object>,\n value: unknown,\n) {\n if (!value || typeof value !== \"object\" || seen.has(value)) {\n return;\n }\n\n seen.add(value);\n candidates.push(value);\n}\n\nfunction asObject(value: unknown): object | undefined {\n return value && typeof value === \"object\" ? value : undefined;\n}\n\nfunction getObjectProperty(value: unknown, key: string): unknown {\n return value && typeof value === \"object\"\n ? (value as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction getRuntimeToolset<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): InferredPiAiToolset<TInput, TMetadata> | undefined {\n const candidate =\n getObjectProperty(value, \"tools\") ?? getObjectProperty(value, \"toolset\");\n\n return isPiAiToolset(candidate)\n ? (candidate as InferredPiAiToolset<TInput, TMetadata>)\n : undefined;\n}\n\nfunction getNativeToolArray<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): PiAgentToolLike<TInput, TMetadata>[] | undefined {\n const candidate = getObjectProperty(value, \"tools\");\n if (isAgentToolArray(candidate)) {\n return candidate as PiAgentToolLike<TInput, TMetadata>[];\n }\n\n return undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (\n hasPiAiRunMethod<TInput, TMetadata, TResult, TOutput, TTools>(args.agent)\n ) {\n return args.agent.run(args.input, args.runtime);\n }\n\n throw new Error(\n \"piAiHarness requires a run() function unless the provided agent exposes run(input, runtime).\",\n );\n}\n\nfunction hasExplicitToolset<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): options is PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> {\n return options.tools !== undefined;\n}\n\nfunction hasPiAiRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is PiAiRunnableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n if (!agent || (typeof agent !== \"object\" && typeof agent !== \"function\")) {\n return false;\n }\n\n return (\n \"run\" in agent && typeof (agent as { run?: unknown }).run === \"function\"\n );\n}\n\nfunction isPiAiToolset(value: unknown): value is PiAiToolset {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const tools = Object.values(value);\n return (\n tools.length > 0 &&\n tools.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nfunction isAgentToolArray(value: unknown): value is PiAgentToolLike[] {\n return (\n Array.isArray(value) &&\n value.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"name\" in tool &&\n typeof (tool as { name?: unknown }).name === \"string\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nasync function withInstrumentedAgentTools<\n TResult,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: unknown,\n toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> | undefined,\n args: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n messages: NormalizedMessage[];\n toolCalls: ToolCallRecord[];\n toolReplay: PiAiToolReplayPolicies<TInput, TMetadata> | undefined;\n executionState: PiToolExecutionState;\n },\n callback: () => Promise<TResult>,\n) {\n if (!toolsets || toolsets.length === 0) {\n return callback();\n }\n\n const originalExecutions = new Map<\n PiAgentToolLike<TInput, TMetadata>,\n PiAgentToolLike<TInput, TMetadata>[\"execute\"]\n >();\n const originalResets = new Map<ResettableAgent, ResettableAgent[\"reset\"]>();\n\n const patchTool = (tool: PiAgentToolLike<TInput, TMetadata>) => {\n if (originalExecutions.has(tool)) {\n return;\n }\n\n const originalExecute = getNativeToolExecuteOrigin(tool.execute);\n originalExecutions.set(tool, originalExecute);\n const instrumentedExecute: NativeToolExecute<TInput, TMetadata> = async (\n toolCallId: string,\n rawArgs: Record<string, JsonValue>,\n ) => {\n const startedAt = new Date();\n const toolContext = {\n input: args.input,\n metadata: args.context.metadata,\n signal: args.context.signal,\n setArtifact: args.context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n const leaveNativeTool = enterNativeToolExecution(\n args.executionState,\n tool.name,\n );\n\n try {\n const execution = await executeNativeToolWithReplay({\n toolName: tool.name,\n toolCallId,\n execute: originalExecute,\n replay: args.toolReplay?.[tool.name],\n args: rawArgs,\n context: toolContext,\n });\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n result: execution.normalizedResult,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n args.messages.push({\n role: \"tool\",\n content: execution.normalizedResult,\n metadata: {\n name: tool.name,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(getReplayMetadataFromError(error)),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n } finally {\n leaveNativeTool();\n }\n };\n instrumentedExecute[ORIGINAL_NATIVE_EXECUTE] = originalExecute;\n tool.execute = instrumentedExecute;\n };\n\n const patchToolsets = (\n nextToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n ) => {\n for (const toolset of nextToolsets) {\n for (const tool of toolset) {\n patchTool(tool);\n }\n }\n };\n\n patchToolsets(toolsets);\n\n for (const target of getAgentResetTargets(agent)) {\n const originalReset = target.reset;\n originalResets.set(target, originalReset);\n target.reset = function patchedReset(this: ResettableAgent, ...resetArgs) {\n const resetResult = originalReset.apply(this, resetArgs);\n\n if (isPromiseLike(resetResult)) {\n return resetResult.finally(() => {\n patchToolsets(\n resolveInferredNativeToolsets<TInput, TMetadata>(agent),\n );\n });\n }\n\n patchToolsets(resolveInferredNativeToolsets<TInput, TMetadata>(agent));\n return resetResult;\n };\n }\n\n try {\n return await callback();\n } finally {\n for (const [target, originalReset] of originalResets) {\n target.reset = originalReset;\n }\n\n for (const [tool, originalExecute] of originalExecutions) {\n tool.execute = originalExecute;\n }\n }\n}\n\ntype ResettableAgent = {\n reset: (...args: unknown[]) => unknown;\n};\n\nfunction getAgentResetTargets(agent: unknown): ResettableAgent[] {\n return getAgentRoots(agent).filter(isResettableAgent);\n}\n\nfunction isResettableAgent(value: object): value is ResettableAgent {\n return \"reset\" in value && typeof value.reset === \"function\";\n}\n\nfunction resolveInferredNativeToolsets<\n TInput,\n TMetadata extends HarnessMetadata,\n>(agent: unknown): Array<PiAgentToolLike<TInput, TMetadata>[]> {\n const toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n toolsets.push(nativeTools);\n }\n }\n\n return toolsets;\n}\n\nfunction isPromiseLike(value: unknown): value is Promise<unknown> {\n return Boolean(\n value && typeof (value as { then?: unknown }).then === \"function\",\n );\n}\n\nfunction serializeToolCallError(\n error: unknown,\n): NonNullable<ToolCallRecord[\"error\"]> {\n const serialized = serializeError(error);\n const { message, type, ...details } = serialized;\n\n return {\n ...details,\n message: typeof message === \"string\" ? message : String(message),\n ...(typeof type === \"string\" ? { type } : {}),\n };\n}\n\nfunction getNativeToolExecuteOrigin<TInput, TMetadata extends HarnessMetadata>(\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"],\n) {\n const nativeExecute = execute as NativeToolExecute<TInput, TMetadata>;\n return nativeExecute[ORIGINAL_NATIVE_EXECUTE] ?? nativeExecute;\n}\n\nfunction createPiToolExecutionState(): PiToolExecutionState {\n return {\n activeNativeToolNames: new Map(),\n };\n}\n\nfunction enterNativeToolExecution(\n state: PiToolExecutionState,\n toolName: string,\n) {\n state.activeNativeToolNames.set(\n toolName,\n (state.activeNativeToolNames.get(toolName) ?? 0) + 1,\n );\n\n return () => {\n const nextCount = (state.activeNativeToolNames.get(toolName) ?? 1) - 1;\n if (nextCount <= 0) {\n state.activeNativeToolNames.delete(toolName);\n return;\n }\n\n state.activeNativeToolNames.set(toolName, nextCount);\n };\n}\n\nfunction hasActiveNativeToolExecution(\n state: PiToolExecutionState,\n toolName: string,\n) {\n return (state.activeNativeToolNames.get(toolName) ?? 0) > 0;\n}\n\nasync function executeNativeToolWithReplay<\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n toolCallId,\n execute,\n replay,\n args,\n context,\n}: {\n toolName: string;\n toolCallId: string;\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n replay: PiAiToolReplayPolicy<TInput, TMetadata> | undefined;\n args: Record<string, JsonValue>;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n let didExecute = false;\n let liveResult: unknown;\n\n const execution = await executeWithReplay({\n toolName: createNativeReplayToolName(toolName),\n args,\n context,\n execute: async (toolArgs) => {\n didExecute = true;\n liveResult = await execute(toolCallId, toolArgs);\n return createNativeToolReplayEnvelope(liveResult);\n },\n replay,\n });\n\n if (didExecute) {\n return {\n result: liveResult,\n normalizedResult: normalizeReplayToolResult(liveResult),\n replay: execution.replay,\n };\n }\n\n return {\n ...resolveNativeToolReplayResult(execution.result),\n replay: execution.replay,\n };\n}\n\nfunction createNativeReplayToolName(toolName: string) {\n return `${toolName}.native`;\n}\n\nfunction createRuntime<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n executionState,\n messages,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: PiAiToolReplayPolicies<TInput, TMetadata> | undefined;\n executionState: PiToolExecutionState;\n messages: NormalizedMessage[];\n}): PiAiRuntime<TTools, TInput, TMetadata> & {\n toolCalls: ToolCallRecord[];\n} {\n const toolCalls: ToolCallRecord[] = [];\n const eventSink: PiAiEventSink = {\n message: (message) => {\n messages.push(message);\n },\n system: (content, metadata) => {\n messages.push({\n role: \"system\",\n content,\n metadata,\n });\n },\n user: (content, metadata) => {\n messages.push({\n role: \"user\",\n content,\n metadata,\n });\n },\n assistant: (content, metadata) => {\n messages.push({\n role: \"assistant\",\n content,\n metadata,\n });\n },\n tool: (name, content, metadata) => {\n messages.push({\n role: \"tool\",\n content,\n metadata: {\n name,\n ...(metadata ?? {}),\n },\n });\n },\n };\n\n const runtimeTools = Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => [\n toolName,\n async (args: Record<string, JsonValue>) => {\n const startedAt = new Date();\n const isNativeImplementationCall = hasActiveNativeToolExecution(\n executionState,\n toolName,\n );\n const toolContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n\n try {\n const execution = await executeToolWithReplay({\n toolName,\n tool,\n replay: isNativeImplementationCall\n ? undefined\n : toolReplay?.[toolName],\n args,\n context: toolContext,\n });\n const finishedAt = new Date();\n\n if (isNativeImplementationCall) {\n return execution.result;\n }\n\n const call = {\n name: toolName,\n arguments: args,\n result: execution.result,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n messages.push({\n role: \"tool\",\n content: execution.result,\n metadata: {\n name: toolName,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n if (isNativeImplementationCall) {\n throw error;\n }\n\n const call = {\n name: toolName,\n arguments: args,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n ),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n }\n },\n ]),\n ) as unknown as PiAiRuntime<TTools, TInput, TMetadata>[\"tools\"];\n\n return {\n tools: runtimeTools,\n events: eventSink,\n signal: context.signal,\n toolCalls,\n };\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n\n const candidates = [\"output\"] 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 normalizeToolResult(result: unknown): JsonValue | undefined {\n const details =\n result && typeof result === \"object\"\n ? toJsonValue((result as { details?: unknown }).details)\n : undefined;\n if (details !== undefined) {\n return details;\n }\n\n const normalized = toJsonValue(result);\n return normalized !== undefined\n ? normalized\n : result === undefined\n ? undefined\n : String(result);\n}\n\nfunction normalizeReplayToolResult(result: unknown): JsonValue {\n return normalizeToolResult(result) ?? null;\n}\n\ntype NativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 2;\n };\n agentResult: JsonValue;\n normalizedResult: JsonValue;\n};\n\ntype LegacyNativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 1;\n };\n normalizedResult: JsonValue;\n agentResult?: JsonValue;\n};\n\nfunction createNativeToolReplayEnvelope(\n result: unknown,\n): NativeToolReplayEnvelope {\n const normalizedResult = normalizeReplayToolResult(result);\n\n const agentResult = toJsonValue(result);\n\n return {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\",\n version: 2,\n },\n agentResult: agentResult !== undefined ? agentResult : normalizedResult,\n normalizedResult,\n };\n}\n\nfunction resolveNativeToolReplayResult(result: JsonValue) {\n if (isNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n if (isLegacyNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult ?? result.normalizedResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n return {\n result,\n normalizedResult: normalizeReplayToolResult(result),\n };\n}\n\nfunction isNativeToolReplayEnvelope(\n value: unknown,\n): value is NativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"agentResult\" in value &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isNativeToolReplayMarker(\n value: unknown,\n): value is NativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 2,\n );\n}\n\nfunction isLegacyNativeToolReplayEnvelope(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isLegacyNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isLegacyNativeToolReplayMarker(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 1,\n );\n}\n\nfunction resolveUsage(result: unknown, toolCallCount: number): UsageSummary {\n if (!result || typeof result !== \"object\") {\n return toolCallCount > 0 ? { toolCalls: toolCallCount } : {};\n }\n\n const usageValue =\n (result as Record<string, unknown>).usage ??\n (result as Record<string, unknown>).metrics;\n\n if (\n !usageValue ||\n typeof usageValue !== \"object\" ||\n Array.isArray(usageValue)\n ) {\n return toolCallCount > 0 ? { toolCalls: toolCallCount } : {};\n }\n\n const usageRecord = usageValue as Record<string, unknown>;\n const usage: UsageSummary = {\n provider: stringField(usageRecord.provider),\n model: stringField(usageRecord.model),\n inputTokens: numberField(usageRecord.inputTokens),\n outputTokens: numberField(usageRecord.outputTokens),\n reasoningTokens: numberField(usageRecord.reasoningTokens),\n totalTokens: numberField(usageRecord.totalTokens),\n toolCalls: numberField(usageRecord.toolCalls),\n retries: numberField(usageRecord.retries),\n metadata: collectUsageMetadata(usageRecord),\n };\n\n if (usage.toolCalls === undefined && toolCallCount > 0) {\n usage.toolCalls = toolCallCount;\n }\n\n return usage;\n}\n\nfunction collectUsageMetadata(usage: Record<string, unknown>) {\n const metadata: Record<string, unknown> = {};\n const nestedMetadata = usage.metadata;\n if (\n nestedMetadata &&\n typeof nestedMetadata === \"object\" &&\n !Array.isArray(nestedMetadata)\n ) {\n Object.assign(metadata, nestedMetadata);\n }\n\n for (const [key, value] of Object.entries(usage)) {\n if (key === \"metadata\" || USAGE_SUMMARY_KEYS.has(key)) {\n continue;\n }\n metadata[key] = value;\n }\n\n return normalizeMetadata(metadata);\n}\n\nconst USAGE_SUMMARY_KEYS = new Set([\n \"provider\",\n \"model\",\n \"inputTokens\",\n \"outputTokens\",\n \"reasoningTokens\",\n \"totalTokens\",\n \"toolCalls\",\n \"retries\",\n]);\n\nfunction stringField(value: unknown) {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction numberField(value: unknown) {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction resolveSession(\n result: unknown,\n messages: NormalizedMessage[],\n output: JsonValue | undefined,\n usage: UsageSummary,\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 sessionMessages = [...messages];\n if (\n output !== undefined &&\n !sessionMessages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n sessionMessages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n return {\n messages: sessionMessages,\n provider:\n ((result as Record<string, unknown> | undefined)?.provider as\n | string\n | undefined) ?? usage.provider,\n model:\n ((result as Record<string, unknown> | undefined)?.model as\n | string\n | undefined) ?? usage.model,\n };\n}\n\nfunction resolveErrors(result: unknown): Array<Record<string, JsonValue>> {\n return resolveHarnessRunErrors(result);\n}\n\nasync function executeToolWithReplay<\n TArgs extends Record<string, JsonValue>,\n TResult extends JsonValue,\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n tool,\n replay,\n args,\n context,\n}: {\n toolName: string;\n tool: PiAiToolDefinition<TArgs, TResult, TInput, TMetadata>;\n replay: PiAiToolReplayPolicy<TInput, TMetadata> | undefined;\n args: TArgs;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n return executeWithReplay<\n Record<string, JsonValue>,\n JsonValue,\n PiAiToolContext<TInput, TMetadata>\n >({\n toolName,\n args,\n context,\n execute: (toolArgs, toolContext) =>\n tool.execute(toolArgs as TArgs, toolContext),\n replay,\n });\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitest-evals/harness-pi-ai",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "pi-ai harness adapter with tool replay for vitest-evals.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -39,7 +39,7 @@
39
39
  "devDependencies": {
40
40
  "@mariozechner/pi-agent-core": "^0.67.68",
41
41
  "@mariozechner/pi-ai": "^0.67.68",
42
- "vitest-evals": "0.9.0"
42
+ "vitest-evals": "0.10.0"
43
43
  },
44
44
  "scripts": {
45
45
  "build": "tsup --config ./tsup.config.ts"