@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 +59 -23
- package/dist/index.d.mts +66 -21
- package/dist/index.d.ts +66 -21
- package/dist/index.js +80 -38
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +79 -37
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
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 {
|
|
16
|
+
import {
|
|
17
|
+
createJudge,
|
|
18
|
+
describeEval,
|
|
19
|
+
toolCalls,
|
|
20
|
+
type JudgeContext,
|
|
21
|
+
} from "vitest-evals";
|
|
17
22
|
|
|
18
23
|
const harness = piAiHarness({
|
|
19
|
-
|
|
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
|
-
`
|
|
42
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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,
|
|
77
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
74
|
-
declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown>(options:
|
|
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
|
|
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,
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
74
|
-
declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown>(options:
|
|
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
|
|
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 };
|