@vitest-evals/harness-pi-ai 0.9.0-beta.2 → 0.9.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,14 +13,18 @@ npm install -D vitest-evals @vitest-evals/harness-pi-ai
13
13
  ```ts
14
14
  import { expect } from "vitest";
15
15
  import { piAiHarness } from "@vitest-evals/harness-pi-ai";
16
- import { describeEval, toolCalls } from "vitest-evals";
16
+ import {
17
+ createJudge,
18
+ describeEval,
19
+ toolCalls,
20
+ type JudgeContext,
21
+ } from "vitest-evals";
17
22
 
18
23
  const harness = piAiHarness({
19
- createAgent: () => createRefundAgent(),
24
+ agent: () => createRefundAgent(),
20
25
  toolReplay: {
21
26
  lookupInvoice: true,
22
27
  },
23
- prompt: sharedJudgePrompt,
24
28
  });
25
29
 
26
30
  describeEval("refund agent", { harness }, (it) => {
@@ -38,8 +42,25 @@ describeEval("refund agent", { harness }, (it) => {
38
42
  });
39
43
  ```
40
44
 
41
- `prompt` gives rubric or factuality judges the same provider/model setup
42
- through `JudgeContext.harness.prompt`.
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.
48
+
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
+ });
59
+
60
+ return parseJudgeVerdict(verdict);
61
+ },
62
+ );
63
+ ```
43
64
 
44
65
  If the agent already exposes its own tools, the adapter will infer them from
45
66
  the agent by default. If your existing Pi Mono agent already exposes its own
@@ -48,8 +69,7 @@ seam:
48
69
 
49
70
  ```ts
50
71
  const harness = piAiHarness({
51
- createAgent: () => createRefundAgent(),
52
- prompt: sharedJudgePrompt,
72
+ agent: () => createRefundAgent(),
53
73
  run: ({ agent, input, runtime }) => agent.execute(input, runtime),
54
74
  });
55
75
  ```
@@ -57,42 +77,59 @@ const harness = piAiHarness({
57
77
  If the agent already implements `run(input, runtime)`, you can omit `run` and
58
78
  the harness will call that method automatically.
59
79
 
80
+ `agent` can be an object or a per-run factory. The factory receives the per-run
81
+ input and harness context before the adapter infers and instruments native
82
+ agent tools. Use that for scenario-specific instructions, tool closures, or
83
+ metadata without leaving the default replay path:
84
+
85
+ ```ts
86
+ const harness = piAiHarness({
87
+ agent: ({ input, context }) =>
88
+ createRefundAgent({
89
+ instructions: buildInstructions(input),
90
+ metadata: context.metadata,
91
+ }),
92
+ toolReplay: {
93
+ lookupInvoice: true,
94
+ },
95
+ });
96
+ ```
97
+
60
98
  You should not need to configure output/session/usage basics for the normal Pi
61
99
  path. Pass your agent and let the adapter infer both the toolset and the
62
- normalized result from common Pi-style return values such as `decision` or
63
- `output`.
100
+ normalized result from the agent transcript. When your app returns a structured
101
+ domain value, return it as `output`.
64
102
 
65
103
  If the agent completely hides its tools, `tools` still exists as a low-level
66
104
  override:
67
105
 
68
106
  ```ts
69
107
  const harness = piAiHarness({
70
- createAgent: () => createRefundAgent(),
71
- prompt: sharedJudgePrompt,
108
+ agent: () => createRefundAgent(),
72
109
  tools: hiddenAgentTools,
73
110
  });
74
111
  ```
75
112
 
76
- If you do have an unusual wrapper around the agent result, low-level
77
- normalization hooks still exist under `normalize`:
113
+ If you do have an unusual wrapper around the agent result, make the app-facing
114
+ value explicit in the `run()` return:
78
115
 
79
116
  ```ts
80
117
  const harness = piAiHarness({
81
- createAgent: () => createWrappedRefundAgent(),
82
- prompt: sharedJudgePrompt,
83
- run: ({ agent, input, runtime }) => agent.run(input, runtime),
84
- normalize: {
85
- output: ({ result }) => result.customDecision,
86
- },
118
+ agent: () => createWrappedRefundAgent(),
119
+ run: async ({ agent, input, runtime }) => ({
120
+ output: await agent.run(input, runtime),
121
+ }),
87
122
  });
88
123
  ```
89
124
 
90
125
  The adapter provides:
91
126
 
92
127
  - a runtime/tool injection seam for an existing agent
93
- - a required prompt seam for LLM-backed judges
94
128
  - normalized session capture from emitted events and wrapped tool calls
95
- - usage/output inference for common `pi-ai`-style result objects
129
+ - usage capture plus typed app output from `run()` results that return `output`
130
+ - native app output is accepted only when it is already JSON-safe; arbitrary
131
+ fields, primitive raw results, and non-JSON values require an explicit
132
+ `output` selector
96
133
  - opt-in tool replay/recording from harness-level `toolReplay`
97
134
 
98
135
  See the workspace demo in `apps/demo-pi`.
@@ -118,11 +155,10 @@ Then opt individual tools into recording/replay from the harness:
118
155
 
119
156
  ```ts
120
157
  const harness = piAiHarness({
121
- createAgent: () => createRefundAgent(),
158
+ agent: () => createRefundAgent(),
122
159
  toolReplay: {
123
160
  lookupInvoice: true,
124
161
  },
125
- prompt: sharedJudgePrompt,
126
162
  });
127
163
  ```
128
164
 
package/dist/index.d.mts CHANGED
@@ -1,10 +1,19 @@
1
- import { NormalizedMessage, JsonValue, HarnessMetadata, HarnessContext, NormalizedSession, UsageSummary, TimingSummary, HarnessPrompt, HarnessRun, Harness } from 'vitest-evals/harness';
1
+ import { NormalizedMessage, JsonValue, HarnessMetadata, HarnessContext, HarnessRun, Harness } from 'vitest-evals/harness';
2
2
  import { ReplayMode, ToolRecording, ToolReplayConfig } from 'vitest-evals/replay';
3
3
 
4
4
  type MaybePromise<T> = T | Promise<T>;
5
+ type JsonOutput<TValue> = [TValue] extends [JsonValue | undefined] ? TValue : undefined;
6
+ 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
+ type AgentSource<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = TAgent | ((args: PiAiCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);
5
8
  type AnyPiAiToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, PiAiToolDefinition<any, any, TInput, TMetadata>>;
6
9
  type InferredPiAiToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput, TMetadata>>;
10
+ type PiAiResultOutput<TResult> = TResult extends HarnessRun<infer TOutput> ? TOutput : "output" extends keyof TResult ? ResultFieldOutput<TResult, "output"> : undefined;
11
+ type PiAiAgentResult<TAgent, TInput, TMetadata extends HarnessMetadata, TTools extends PiAiToolset<TInput, TMetadata>> = TAgent extends {
12
+ run: (input: TInput, runtime: PiAiRuntime<TTools, TInput, TMetadata>) => MaybePromise<infer TResult>;
13
+ } ? Awaited<TResult> : unknown;
14
+ /** Replay mode alias used by the Pi AI harness package. */
7
15
  type PiAiReplayMode = ReplayMode;
16
+ /** Event sink for recording Pi AI transcript messages. */
8
17
  interface PiAiEventSink {
9
18
  message: (message: NormalizedMessage) => void;
10
19
  system: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;
@@ -12,23 +21,31 @@ interface PiAiEventSink {
12
21
  assistant: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;
13
22
  tool: (name: string, content: JsonValue, metadata?: Record<string, JsonValue>) => void;
14
23
  }
24
+ /** Context passed to instrumented Pi AI tool executions. */
15
25
  interface PiAiToolContext<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
16
26
  input: TInput;
17
27
  metadata: HarnessContext<TMetadata>["metadata"];
18
28
  signal?: AbortSignal;
19
29
  setArtifact: HarnessContext<TMetadata>["setArtifact"];
20
30
  }
31
+ /** Tool replay recording shape for Pi AI tools. */
21
32
  type PiAiToolRecording<TArgs extends Record<string, JsonValue> = Record<string, JsonValue>, TResult extends JsonValue = JsonValue> = ToolRecording<TArgs, TResult>;
33
+ /** Replay configuration for a Pi AI tool. */
22
34
  type PiAiToolReplayConfig<TArgs extends Record<string, JsonValue> = Record<string, JsonValue>, TResult extends JsonValue = JsonValue, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput, TMetadata>>;
35
+ /** Replay policy for one Pi AI tool. */
23
36
  type PiAiToolReplayPolicy<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = boolean | PiAiToolReplayConfig<Record<string, JsonValue>, JsonValue, TInput, TMetadata>;
37
+ /** Replay policy map keyed by Pi AI tool name. */
24
38
  type PiAiToolReplayPolicies<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, PiAiToolReplayPolicy<TInput, TMetadata>>;
39
+ /** Tool definition accepted by the Pi AI harness runtime. */
25
40
  interface PiAiToolDefinition<TArgs extends Record<string, JsonValue> = Record<string, JsonValue>, TResult extends JsonValue = JsonValue, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
26
41
  description?: string;
27
42
  execute: (args: TArgs, context: PiAiToolContext<TInput, TMetadata>) => MaybePromise<TResult>;
28
43
  }
44
+ /** Toolset shape accepted by the Pi AI harness. */
29
45
  type PiAiToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = AnyPiAiToolset<TInput, TMetadata>;
30
46
  type ToolArgs<TTool> = TTool extends PiAiToolDefinition<infer TArgs, infer _TResult, infer _TInput, infer _TMetadata> ? TArgs : never;
31
47
  type ToolResult<TTool> = TTool extends PiAiToolDefinition<infer _TArgs, infer TResult, infer _TInput, infer _TMetadata> ? TResult : never;
48
+ /** Runtime object passed into Pi AI agent entrypoints. */
32
49
  type PiAiRuntime<TTools extends PiAiToolset<TInput, TMetadata>, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = {
33
50
  tools: {
34
51
  [K in keyof TTools]: (args: ToolArgs<TTools[K]>) => Promise<ToolResult<TTools[K]>>;
@@ -36,41 +53,69 @@ type PiAiRuntime<TTools extends PiAiToolset<TInput, TMetadata>, TInput = string,
36
53
  events: PiAiEventSink;
37
54
  signal?: AbortSignal;
38
55
  };
56
+ /** Arguments passed to custom Pi AI harness run callbacks. */
39
57
  interface PiAiHarnessRunArgs<TAgent, TInput, TMetadata extends HarnessMetadata, TTools extends PiAiToolset<TInput, TMetadata>> {
40
58
  agent: TAgent;
41
59
  input: TInput;
42
60
  context: HarnessContext<TMetadata>;
43
61
  runtime: PiAiRuntime<TTools, TInput, TMetadata>;
44
62
  }
63
+ /** Arguments passed to Pi AI harness output selectors. */
45
64
  interface PiAiHarnessResultArgs<TAgent, TInput, TMetadata extends HarnessMetadata, TResult, TTools extends PiAiToolset<TInput, TMetadata>> extends PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {
46
65
  result: TResult;
47
66
  }
48
- interface PiAiHarnessBaseOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>> {
49
- agent?: TAgent;
50
- createAgent?: () => MaybePromise<TAgent>;
67
+ /** Arguments passed to per-run Pi AI agent factories. */
68
+ interface PiAiCreateAgentArgs<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
69
+ input: TInput;
70
+ context: HarnessContext<TMetadata>;
71
+ }
72
+ interface PiAiHarnessBaseOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined> {
73
+ agent: AgentSource<TAgent, TInput, TMetadata>;
51
74
  toolReplay?: PiAiToolReplayPolicies<TInput, TMetadata>;
52
- normalize?: PiAiHarnessNormalizeOptions<TAgent, TInput, TMetadata, TResult, TTools>;
53
- prompt: HarnessPrompt;
75
+ output?: PiAiHarnessOutputSelector<TAgent, TInput, TMetadata, TResult, TTools, TOutput>;
54
76
  name?: string;
55
77
  }
56
- interface PiAiHarnessWithToolsOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>> extends PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> {
78
+ interface PiAiHarnessWithToolsOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined> extends PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> {
57
79
  tools: TTools;
58
- run?: (args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult | HarnessRun>;
80
+ run?: (args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult | HarnessRun<TOutput>>;
59
81
  }
60
- interface PiAiHarnessInferredToolsOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown> extends PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, InferredPiAiToolset<TInput, TMetadata>> {
82
+ interface PiAiHarnessInferredToolsOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TOutput extends JsonValue | undefined = JsonValue | undefined> extends PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, InferredPiAiToolset<TInput, TMetadata>, TOutput> {
61
83
  tools?: undefined;
62
- run?: (args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, InferredPiAiToolset<TInput, TMetadata>>) => MaybePromise<TResult | HarnessRun>;
63
- }
64
- type PiAiHarnessOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>> = PiAiHarnessWithToolsOptions<TAgent, TInput, TMetadata, TResult, TTools> | PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult>;
65
- interface PiAiHarnessNormalizeOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>> {
66
- session?: (args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<NormalizedSession>;
67
- output?: (args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<JsonValue | undefined>;
68
- usage?: (args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<UsageSummary>;
69
- timings?: (args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<TimingSummary | undefined>;
70
- errors?: (args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<Array<Record<string, JsonValue>>>;
84
+ run?: (args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, InferredPiAiToolset<TInput, TMetadata>>) => MaybePromise<TResult | HarnessRun<TOutput>>;
71
85
  }
86
+ type PiAiHarnessWithToolsOptionsWithOutput<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined> = PiAiHarnessWithToolsOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> & {
87
+ output: PiAiHarnessOutputSelector<TAgent, TInput, TMetadata, TResult, TTools, TOutput>;
88
+ };
89
+ type PiAiHarnessInferredToolsOptionsWithOutput<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TOutput extends JsonValue | undefined = JsonValue | undefined> = PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult, TOutput> & {
90
+ output: PiAiHarnessOutputSelector<TAgent, TInput, TMetadata, TResult, InferredPiAiToolset<TInput, TMetadata>, TOutput>;
91
+ };
92
+ type PiAiHarnessWithToolsRunOptionsWithoutOutput<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>> = PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools, JsonValue | undefined> & {
93
+ tools: TTools;
94
+ run: (args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult>;
95
+ output?: never;
96
+ };
97
+ type PiAiHarnessWithToolsAgentOptionsWithoutOutput<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>> = PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, unknown, TTools, JsonValue | undefined> & {
98
+ tools: TTools;
99
+ run?: never;
100
+ output?: never;
101
+ };
102
+ type PiAiHarnessInferredToolsRunOptionsWithoutOutput<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown> = PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, InferredPiAiToolset<TInput, TMetadata>, JsonValue | undefined> & {
103
+ tools?: undefined;
104
+ run: (args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, InferredPiAiToolset<TInput, TMetadata>>) => MaybePromise<TResult>;
105
+ output?: never;
106
+ };
107
+ type PiAiHarnessInferredToolsAgentOptionsWithoutOutput<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, unknown, InferredPiAiToolset<TInput, TMetadata>, JsonValue | undefined> & {
108
+ tools?: undefined;
109
+ run?: never;
110
+ output?: never;
111
+ };
112
+ type PiAiHarnessOutputSelector<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined> = (args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<TOutput>;
72
113
  /** Adapts a Pi agent runtime into a normalized vitest-evals harness. */
73
- declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>>(options: PiAiHarnessWithToolsOptions<TAgent, TInput, TMetadata, TResult, TTools>): Harness<TInput, TMetadata>;
74
- declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown>(options: PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult>): Harness<TInput, TMetadata>;
114
+ declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined>(options: PiAiHarnessWithToolsOptionsWithOutput<TAgent, TInput, TMetadata, TResult, TTools, TOutput>): Harness<TInput, TOutput, TMetadata>;
115
+ declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TOutput extends JsonValue | undefined = JsonValue | undefined>(options: PiAiHarnessInferredToolsOptionsWithOutput<TAgent, TInput, TMetadata, TResult, TOutput>): Harness<TInput, TOutput, TMetadata>;
116
+ declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>>(options: PiAiHarnessWithToolsRunOptionsWithoutOutput<TAgent, TInput, TMetadata, TResult, TTools>): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;
117
+ declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>>(options: PiAiHarnessWithToolsAgentOptionsWithoutOutput<TAgent, TInput, TMetadata, TTools>): Harness<TInput, PiAiResultOutput<PiAiAgentResult<TAgent, TInput, TMetadata, TTools>>, TMetadata>;
118
+ 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
+ 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>;
75
120
 
76
- export { type PiAiEventSink, type PiAiHarnessInferredToolsOptions, type PiAiHarnessNormalizeOptions, type PiAiHarnessOptions, type PiAiHarnessResultArgs, type PiAiHarnessRunArgs, type PiAiHarnessWithToolsOptions, type PiAiReplayMode, type PiAiRuntime, type PiAiToolContext, type PiAiToolDefinition, type PiAiToolRecording, type PiAiToolReplayConfig, type PiAiToolReplayPolicies, type PiAiToolReplayPolicy, type PiAiToolset, piAiHarness };
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 };
package/dist/index.d.ts CHANGED
@@ -1,10 +1,19 @@
1
- import { NormalizedMessage, JsonValue, HarnessMetadata, HarnessContext, NormalizedSession, UsageSummary, TimingSummary, HarnessPrompt, HarnessRun, Harness } from 'vitest-evals/harness';
1
+ import { NormalizedMessage, JsonValue, HarnessMetadata, HarnessContext, HarnessRun, Harness } from 'vitest-evals/harness';
2
2
  import { ReplayMode, ToolRecording, ToolReplayConfig } from 'vitest-evals/replay';
3
3
 
4
4
  type MaybePromise<T> = T | Promise<T>;
5
+ type JsonOutput<TValue> = [TValue] extends [JsonValue | undefined] ? TValue : undefined;
6
+ 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
+ type AgentSource<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = TAgent | ((args: PiAiCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);
5
8
  type AnyPiAiToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, PiAiToolDefinition<any, any, TInput, TMetadata>>;
6
9
  type InferredPiAiToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput, TMetadata>>;
10
+ type PiAiResultOutput<TResult> = TResult extends HarnessRun<infer TOutput> ? TOutput : "output" extends keyof TResult ? ResultFieldOutput<TResult, "output"> : undefined;
11
+ type PiAiAgentResult<TAgent, TInput, TMetadata extends HarnessMetadata, TTools extends PiAiToolset<TInput, TMetadata>> = TAgent extends {
12
+ run: (input: TInput, runtime: PiAiRuntime<TTools, TInput, TMetadata>) => MaybePromise<infer TResult>;
13
+ } ? Awaited<TResult> : unknown;
14
+ /** Replay mode alias used by the Pi AI harness package. */
7
15
  type PiAiReplayMode = ReplayMode;
16
+ /** Event sink for recording Pi AI transcript messages. */
8
17
  interface PiAiEventSink {
9
18
  message: (message: NormalizedMessage) => void;
10
19
  system: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;
@@ -12,23 +21,31 @@ interface PiAiEventSink {
12
21
  assistant: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;
13
22
  tool: (name: string, content: JsonValue, metadata?: Record<string, JsonValue>) => void;
14
23
  }
24
+ /** Context passed to instrumented Pi AI tool executions. */
15
25
  interface PiAiToolContext<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
16
26
  input: TInput;
17
27
  metadata: HarnessContext<TMetadata>["metadata"];
18
28
  signal?: AbortSignal;
19
29
  setArtifact: HarnessContext<TMetadata>["setArtifact"];
20
30
  }
31
+ /** Tool replay recording shape for Pi AI tools. */
21
32
  type PiAiToolRecording<TArgs extends Record<string, JsonValue> = Record<string, JsonValue>, TResult extends JsonValue = JsonValue> = ToolRecording<TArgs, TResult>;
33
+ /** Replay configuration for a Pi AI tool. */
22
34
  type PiAiToolReplayConfig<TArgs extends Record<string, JsonValue> = Record<string, JsonValue>, TResult extends JsonValue = JsonValue, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput, TMetadata>>;
35
+ /** Replay policy for one Pi AI tool. */
23
36
  type PiAiToolReplayPolicy<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = boolean | PiAiToolReplayConfig<Record<string, JsonValue>, JsonValue, TInput, TMetadata>;
37
+ /** Replay policy map keyed by Pi AI tool name. */
24
38
  type PiAiToolReplayPolicies<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, PiAiToolReplayPolicy<TInput, TMetadata>>;
39
+ /** Tool definition accepted by the Pi AI harness runtime. */
25
40
  interface PiAiToolDefinition<TArgs extends Record<string, JsonValue> = Record<string, JsonValue>, TResult extends JsonValue = JsonValue, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
26
41
  description?: string;
27
42
  execute: (args: TArgs, context: PiAiToolContext<TInput, TMetadata>) => MaybePromise<TResult>;
28
43
  }
44
+ /** Toolset shape accepted by the Pi AI harness. */
29
45
  type PiAiToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = AnyPiAiToolset<TInput, TMetadata>;
30
46
  type ToolArgs<TTool> = TTool extends PiAiToolDefinition<infer TArgs, infer _TResult, infer _TInput, infer _TMetadata> ? TArgs : never;
31
47
  type ToolResult<TTool> = TTool extends PiAiToolDefinition<infer _TArgs, infer TResult, infer _TInput, infer _TMetadata> ? TResult : never;
48
+ /** Runtime object passed into Pi AI agent entrypoints. */
32
49
  type PiAiRuntime<TTools extends PiAiToolset<TInput, TMetadata>, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = {
33
50
  tools: {
34
51
  [K in keyof TTools]: (args: ToolArgs<TTools[K]>) => Promise<ToolResult<TTools[K]>>;
@@ -36,41 +53,69 @@ type PiAiRuntime<TTools extends PiAiToolset<TInput, TMetadata>, TInput = string,
36
53
  events: PiAiEventSink;
37
54
  signal?: AbortSignal;
38
55
  };
56
+ /** Arguments passed to custom Pi AI harness run callbacks. */
39
57
  interface PiAiHarnessRunArgs<TAgent, TInput, TMetadata extends HarnessMetadata, TTools extends PiAiToolset<TInput, TMetadata>> {
40
58
  agent: TAgent;
41
59
  input: TInput;
42
60
  context: HarnessContext<TMetadata>;
43
61
  runtime: PiAiRuntime<TTools, TInput, TMetadata>;
44
62
  }
63
+ /** Arguments passed to Pi AI harness output selectors. */
45
64
  interface PiAiHarnessResultArgs<TAgent, TInput, TMetadata extends HarnessMetadata, TResult, TTools extends PiAiToolset<TInput, TMetadata>> extends PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {
46
65
  result: TResult;
47
66
  }
48
- interface PiAiHarnessBaseOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>> {
49
- agent?: TAgent;
50
- createAgent?: () => MaybePromise<TAgent>;
67
+ /** Arguments passed to per-run Pi AI agent factories. */
68
+ interface PiAiCreateAgentArgs<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
69
+ input: TInput;
70
+ context: HarnessContext<TMetadata>;
71
+ }
72
+ interface PiAiHarnessBaseOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined> {
73
+ agent: AgentSource<TAgent, TInput, TMetadata>;
51
74
  toolReplay?: PiAiToolReplayPolicies<TInput, TMetadata>;
52
- normalize?: PiAiHarnessNormalizeOptions<TAgent, TInput, TMetadata, TResult, TTools>;
53
- prompt: HarnessPrompt;
75
+ output?: PiAiHarnessOutputSelector<TAgent, TInput, TMetadata, TResult, TTools, TOutput>;
54
76
  name?: string;
55
77
  }
56
- interface PiAiHarnessWithToolsOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>> extends PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> {
78
+ interface PiAiHarnessWithToolsOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined> extends PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> {
57
79
  tools: TTools;
58
- run?: (args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult | HarnessRun>;
80
+ run?: (args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult | HarnessRun<TOutput>>;
59
81
  }
60
- interface PiAiHarnessInferredToolsOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown> extends PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, InferredPiAiToolset<TInput, TMetadata>> {
82
+ interface PiAiHarnessInferredToolsOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TOutput extends JsonValue | undefined = JsonValue | undefined> extends PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, InferredPiAiToolset<TInput, TMetadata>, TOutput> {
61
83
  tools?: undefined;
62
- run?: (args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, InferredPiAiToolset<TInput, TMetadata>>) => MaybePromise<TResult | HarnessRun>;
63
- }
64
- type PiAiHarnessOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>> = PiAiHarnessWithToolsOptions<TAgent, TInput, TMetadata, TResult, TTools> | PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult>;
65
- interface PiAiHarnessNormalizeOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>> {
66
- session?: (args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<NormalizedSession>;
67
- output?: (args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<JsonValue | undefined>;
68
- usage?: (args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<UsageSummary>;
69
- timings?: (args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<TimingSummary | undefined>;
70
- errors?: (args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<Array<Record<string, JsonValue>>>;
84
+ run?: (args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, InferredPiAiToolset<TInput, TMetadata>>) => MaybePromise<TResult | HarnessRun<TOutput>>;
71
85
  }
86
+ type PiAiHarnessWithToolsOptionsWithOutput<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined> = PiAiHarnessWithToolsOptions<TAgent, TInput, TMetadata, TResult, TTools, TOutput> & {
87
+ output: PiAiHarnessOutputSelector<TAgent, TInput, TMetadata, TResult, TTools, TOutput>;
88
+ };
89
+ type PiAiHarnessInferredToolsOptionsWithOutput<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TOutput extends JsonValue | undefined = JsonValue | undefined> = PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult, TOutput> & {
90
+ output: PiAiHarnessOutputSelector<TAgent, TInput, TMetadata, TResult, InferredPiAiToolset<TInput, TMetadata>, TOutput>;
91
+ };
92
+ type PiAiHarnessWithToolsRunOptionsWithoutOutput<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>> = PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools, JsonValue | undefined> & {
93
+ tools: TTools;
94
+ run: (args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>) => MaybePromise<TResult>;
95
+ output?: never;
96
+ };
97
+ type PiAiHarnessWithToolsAgentOptionsWithoutOutput<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>> = PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, unknown, TTools, JsonValue | undefined> & {
98
+ tools: TTools;
99
+ run?: never;
100
+ output?: never;
101
+ };
102
+ type PiAiHarnessInferredToolsRunOptionsWithoutOutput<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown> = PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, InferredPiAiToolset<TInput, TMetadata>, JsonValue | undefined> & {
103
+ tools?: undefined;
104
+ run: (args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, InferredPiAiToolset<TInput, TMetadata>>) => MaybePromise<TResult>;
105
+ output?: never;
106
+ };
107
+ type PiAiHarnessInferredToolsAgentOptionsWithoutOutput<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, unknown, InferredPiAiToolset<TInput, TMetadata>, JsonValue | undefined> & {
108
+ tools?: undefined;
109
+ run?: never;
110
+ output?: never;
111
+ };
112
+ type PiAiHarnessOutputSelector<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined> = (args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>) => MaybePromise<TOutput>;
72
113
  /** Adapts a Pi agent runtime into a normalized vitest-evals harness. */
73
- declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>>(options: PiAiHarnessWithToolsOptions<TAgent, TInput, TMetadata, TResult, TTools>): Harness<TInput, TMetadata>;
74
- declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown>(options: PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult>): Harness<TInput, TMetadata>;
114
+ declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>, TOutput extends JsonValue | undefined = JsonValue | undefined>(options: PiAiHarnessWithToolsOptionsWithOutput<TAgent, TInput, TMetadata, TResult, TTools, TOutput>): Harness<TInput, TOutput, TMetadata>;
115
+ declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TOutput extends JsonValue | undefined = JsonValue | undefined>(options: PiAiHarnessInferredToolsOptionsWithOutput<TAgent, TInput, TMetadata, TResult, TOutput>): Harness<TInput, TOutput, TMetadata>;
116
+ declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>>(options: PiAiHarnessWithToolsRunOptionsWithoutOutput<TAgent, TInput, TMetadata, TResult, TTools>): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;
117
+ declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>>(options: PiAiHarnessWithToolsAgentOptionsWithoutOutput<TAgent, TInput, TMetadata, TTools>): Harness<TInput, PiAiResultOutput<PiAiAgentResult<TAgent, TInput, TMetadata, TTools>>, TMetadata>;
118
+ 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
+ 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>;
75
120
 
76
- export { type PiAiEventSink, type PiAiHarnessInferredToolsOptions, type PiAiHarnessNormalizeOptions, type PiAiHarnessOptions, type PiAiHarnessResultArgs, type PiAiHarnessRunArgs, type PiAiHarnessWithToolsOptions, type PiAiReplayMode, type PiAiRuntime, type PiAiToolContext, type PiAiToolDefinition, type PiAiToolRecording, type PiAiToolReplayConfig, type PiAiToolReplayPolicies, type PiAiToolReplayPolicy, type PiAiToolset, piAiHarness };
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 };