incantx 0.1.1 → 0.1.2
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 +43 -31
- package/dist/cli.js +197 -15
- package/dist/cli.js.map +5 -5
- package/dist/index.js +197 -15
- package/dist/index.js.map +5 -5
- package/dist/src/fixture/types.d.ts +53 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -50,7 +50,7 @@ incantx path/to/fixtures --judge off
|
|
|
50
50
|
|
|
51
51
|
- A test framework for “agents” that behave like a **single Chat Completions call**: input is `{messages, tools}` and output is the **next assistant message** (which may include `tool_calls`).
|
|
52
52
|
- A fixture format that supports:
|
|
53
|
-
- Starting tests **mid-conversation** via full
|
|
53
|
+
- Starting tests **mid-conversation** via a full transcript.
|
|
54
54
|
- Asserting on the **next assistant message**, including **tool call expectations**.
|
|
55
55
|
- (Planned) executing tools and continuing until the agent returns a final message.
|
|
56
56
|
- LLM-based assertions (“judge”) for fuzzy/semantic checks (implemented via OpenAI in `auto` mode; skipped if no `OPENAI_API_KEY`).
|
|
@@ -91,13 +91,19 @@ Fixture files are YAML and contain:
|
|
|
91
91
|
|
|
92
92
|
- a file-level `agent` config (optional), and
|
|
93
93
|
- a `fixtures[]` list, each with:
|
|
94
|
-
-
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
- a `transcript[]` list of chat turns, ending with `next_assistant` (required)
|
|
95
|
+
|
|
96
|
+
Transcript entries are one of:
|
|
97
|
+
|
|
98
|
+
- `system: "..."`
|
|
99
|
+
- `user: "..."`
|
|
100
|
+
- `assistant: "..."` or `assistant: { content: "...", tool_calls: [...] }`
|
|
101
|
+
- `tool: { name: "...", tool_call_id: "...", json: {...} }` (or `content: "..."`)
|
|
102
|
+
- `next_assistant: { ...expectations... }` (required, must be last)
|
|
97
103
|
|
|
98
104
|
### Example fixture file
|
|
99
105
|
|
|
100
|
-
See `tests/fixtures/weather.yaml` for a complete working example. The key idea is that
|
|
106
|
+
See `tests/fixtures/weather.yaml` for a complete working example. The key idea is that fixtures read like a chat transcript, and `next_assistant` describes what you expect the agent to return for the next turn.
|
|
101
107
|
|
|
102
108
|
```yaml
|
|
103
109
|
agent:
|
|
@@ -106,56 +112,62 @@ agent:
|
|
|
106
112
|
|
|
107
113
|
fixtures:
|
|
108
114
|
- id: weather-requests-tool
|
|
109
|
-
|
|
110
|
-
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
115
|
+
transcript:
|
|
116
|
+
- system: You are a helpful assistant.
|
|
117
|
+
- user: What's the weather in Dublin?
|
|
118
|
+
- next_assistant:
|
|
119
|
+
content_match: exact
|
|
120
|
+
content: ""
|
|
121
|
+
tool_calls_match: contains
|
|
122
|
+
tool_calls:
|
|
123
|
+
- get_weather: { location: Dublin, unit: c }
|
|
124
|
+
tool_results_match: contains
|
|
125
|
+
tool_results:
|
|
126
|
+
- get_weather: { condition: Rain }
|
|
120
127
|
```
|
|
121
128
|
|
|
122
129
|
## Expectations
|
|
123
130
|
|
|
124
|
-
All expectations apply to the **next assistant message** produced after the runner
|
|
125
|
-
|
|
126
|
-
1. takes `history` (if any),
|
|
127
|
-
2. appends `{ role: "user", content: input }`,
|
|
128
|
-
3. calls the agent once.
|
|
131
|
+
All expectations apply to the **next assistant message** produced after the runner sends the transcript’s messages (everything before `next_assistant`) to the agent once.
|
|
129
132
|
|
|
130
133
|
### Expecting tool calls
|
|
131
134
|
|
|
132
|
-
Use `
|
|
135
|
+
Use `next_assistant.tool_calls` to assert that the next assistant message includes tool calls.
|
|
133
136
|
|
|
134
|
-
- `
|
|
135
|
-
- `
|
|
137
|
+
- `next_assistant.tool_calls_match: contains` (default): each expected tool call must appear somewhere in the returned `tool_calls`; extra tool calls are allowed; order is ignored.
|
|
138
|
+
- `next_assistant.tool_calls_match: exact`: the returned `tool_calls` must match exactly (same length/order and matching entries).
|
|
136
139
|
|
|
137
140
|
Tool call matching details:
|
|
138
141
|
|
|
139
142
|
- `name` matches `tool_calls[].function.name`.
|
|
140
143
|
- `arguments` is a **subset match** against the parsed JSON from `tool_calls[].function.arguments` (which is a JSON string in OpenAI format).
|
|
141
144
|
|
|
145
|
+
Fixture sugar:
|
|
146
|
+
|
|
147
|
+
- `tool_calls` entries can be either `{ name: get_weather, args: {...}, id?: ... }` or `{ get_weather: {...args} }`.
|
|
148
|
+
- `tool_results` entries can be either `{ name: ..., tool_call_id?: ..., content?: ..., content_json?: ... }` or `{ get_weather: {...jsonSubset} }`.
|
|
149
|
+
|
|
142
150
|
### Expecting tool results (agent-provided)
|
|
143
151
|
|
|
144
|
-
If your agent returns `tool_messages` alongside `message` (same JSONL response), use `
|
|
152
|
+
If your agent returns `tool_messages` alongside `message` (same JSONL response), use `next_assistant.tool_results` to assert on those `role: "tool"` messages.
|
|
153
|
+
|
|
154
|
+
Note: `tool_messages` are only used for expectations today; incantx does not yet append them into the next call’s `messages` automatically (that’s part of the planned tool-execution loop).
|
|
145
155
|
|
|
146
156
|
Tool result matching details:
|
|
147
157
|
|
|
148
158
|
- Match by `tool_call_id` and/or `name`.
|
|
149
159
|
- `content_json` is a subset match against parsed JSON from `tool_messages[].content`.
|
|
150
160
|
|
|
161
|
+
### Expecting assistant content
|
|
162
|
+
|
|
163
|
+
Use `next_assistant.content` with `next_assistant.content_match: contains|exact` for deterministic checks.
|
|
164
|
+
|
|
151
165
|
### Expecting assistant content (LLM-judged)
|
|
152
166
|
|
|
153
|
-
Use `
|
|
167
|
+
Use `next_assistant.llm` to express the intended outcome in natural language.
|
|
154
168
|
|
|
155
169
|
The CLI can grade this using an LLM judge. By default (`--judge auto`), it will only run if `OPENAI_API_KEY` is set; otherwise these checks are marked `SKIP`.
|
|
156
170
|
|
|
157
|
-
For deterministic checks without an LLM, use `expect.assistant.content` with `expect.assistant.content_match: contains|exact`.
|
|
158
|
-
|
|
159
171
|
## Agent integration (language-agnostic)
|
|
160
172
|
|
|
161
173
|
### Subprocess (recommended for local agents)
|
|
@@ -177,11 +189,11 @@ For local, language-agnostic agents, the runner will spawn a subprocess and comm
|
|
|
177
189
|
}
|
|
178
190
|
```
|
|
179
191
|
|
|
180
|
-
#### How
|
|
192
|
+
#### How messages are passed
|
|
181
193
|
|
|
182
|
-
|
|
194
|
+
The runner sends the full conversation so far in `messages` **on every call** (Chat Completions style). This is what makes “start tests mid-conversation” possible: fixtures provide a transcript that becomes the `messages` array.
|
|
183
195
|
|
|
184
|
-
When tools are involved,
|
|
196
|
+
When tools are involved, `messages` typically includes:
|
|
185
197
|
|
|
186
198
|
1. an assistant message containing `tool_calls`, then
|
|
187
199
|
2. one or more `role: "tool"` messages containing tool results (each with `tool_call_id`), then
|
package/dist/cli.js
CHANGED
|
@@ -44,24 +44,207 @@ function loadFixtureFile(yamlText, env = process.env) {
|
|
|
44
44
|
if (!Array.isArray(file.fixtures))
|
|
45
45
|
throw new Error("Fixture file must contain `fixtures: [...]`.");
|
|
46
46
|
const normalized = {
|
|
47
|
-
fixtures:
|
|
47
|
+
fixtures: []
|
|
48
48
|
};
|
|
49
49
|
if (file.agent)
|
|
50
50
|
normalized.agent = normalizeAgentSpec(file.agent, env);
|
|
51
|
-
|
|
51
|
+
function normalizeToolCallSource(entry, where) {
|
|
52
|
+
if (!entry || typeof entry !== "object")
|
|
53
|
+
throw new Error(`${where} must be an object.`);
|
|
54
|
+
if ("name" in entry) {
|
|
55
|
+
const e = entry;
|
|
56
|
+
return {
|
|
57
|
+
id: e.id !== undefined ? String(e.id) : undefined,
|
|
58
|
+
name: String(e.name),
|
|
59
|
+
args: e.args !== undefined ? e.args : undefined
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const keys = Object.keys(entry);
|
|
63
|
+
if (keys.length !== 1)
|
|
64
|
+
throw new Error(`${where} must be { name: ..., args: ... } or { toolName: { ...args } }.`);
|
|
65
|
+
const name = keys[0];
|
|
66
|
+
const args = entry[name];
|
|
67
|
+
if (!args || typeof args !== "object")
|
|
68
|
+
throw new Error(`${where}.${name} must be an object of args.`);
|
|
69
|
+
return { name, args };
|
|
70
|
+
}
|
|
71
|
+
function normalizeToolCallsForMessage(toolCalls, callId) {
|
|
72
|
+
if (!toolCalls || toolCalls.length === 0)
|
|
73
|
+
return;
|
|
74
|
+
const out = [];
|
|
75
|
+
for (let i = 0;i < toolCalls.length; i++) {
|
|
76
|
+
const tc = normalizeToolCallSource(toolCalls[i], `tool_calls[${i}]`);
|
|
77
|
+
out.push({
|
|
78
|
+
id: callId(tc.id),
|
|
79
|
+
type: "function",
|
|
80
|
+
function: {
|
|
81
|
+
name: tc.name,
|
|
82
|
+
arguments: JSON.stringify(tc.args ?? {})
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
function normalizeTranscriptTool(entry, where, inferToolCallId) {
|
|
89
|
+
if (!entry || typeof entry !== "object")
|
|
90
|
+
throw new Error(`${where} must be an object.`);
|
|
91
|
+
const name = String(entry.name);
|
|
92
|
+
let tool_call_id = entry.tool_call_id !== undefined ? String(entry.tool_call_id) : undefined;
|
|
93
|
+
if (!tool_call_id)
|
|
94
|
+
tool_call_id = inferToolCallId();
|
|
95
|
+
if ("json" in entry && entry.json !== undefined) {
|
|
96
|
+
return { role: "tool", tool_call_id, name, content: JSON.stringify(entry.json) };
|
|
97
|
+
}
|
|
98
|
+
if ("content" in entry && entry.content !== undefined) {
|
|
99
|
+
return { role: "tool", tool_call_id, name, content: String(entry.content) };
|
|
100
|
+
}
|
|
101
|
+
throw new Error(`${where} must include either 'json' or 'content'.`);
|
|
102
|
+
}
|
|
103
|
+
function normalizeNextAssistantExpect(expect, where) {
|
|
104
|
+
if (!expect || typeof expect !== "object")
|
|
105
|
+
throw new Error(`${where} must be an object.`);
|
|
106
|
+
const tool_calls = expect.tool_calls;
|
|
107
|
+
const tool_results = expect.tool_results;
|
|
108
|
+
const out = {};
|
|
109
|
+
const assistant = {};
|
|
110
|
+
if (expect.content !== undefined)
|
|
111
|
+
assistant.content = String(expect.content);
|
|
112
|
+
if (expect.content_match !== undefined)
|
|
113
|
+
assistant.content_match = expect.content_match;
|
|
114
|
+
if (expect.llm !== undefined)
|
|
115
|
+
assistant.llm = String(expect.llm);
|
|
116
|
+
if (assistant.content !== undefined || assistant.llm !== undefined)
|
|
117
|
+
out.assistant = assistant;
|
|
118
|
+
if (expect.tool_calls_match !== undefined)
|
|
119
|
+
out.tool_calls_match = expect.tool_calls_match;
|
|
120
|
+
if (tool_calls) {
|
|
121
|
+
out.tool_calls = tool_calls.map((tc, i) => {
|
|
122
|
+
const normalized2 = normalizeToolCallSource(tc, `${where}.tool_calls[${i}]`);
|
|
123
|
+
const entry = { name: normalized2.name };
|
|
124
|
+
if (normalized2.args !== undefined)
|
|
125
|
+
entry.arguments = normalized2.args;
|
|
126
|
+
return entry;
|
|
127
|
+
});
|
|
128
|
+
if (out.tool_calls_match === undefined)
|
|
129
|
+
out.tool_calls_match = "contains";
|
|
130
|
+
}
|
|
131
|
+
if (expect.tool_results_match !== undefined)
|
|
132
|
+
out.tool_results_match = expect.tool_results_match;
|
|
133
|
+
if (tool_results) {
|
|
134
|
+
out.tool_results = tool_results.map((tr, i) => {
|
|
135
|
+
const whereItem = `${where}.tool_results[${i}]`;
|
|
136
|
+
if (!tr || typeof tr !== "object")
|
|
137
|
+
throw new Error(`${whereItem} must be an object.`);
|
|
138
|
+
if ("name" in tr || "tool_call_id" in tr || "content" in tr || "content_json" in tr) {
|
|
139
|
+
const e = tr;
|
|
140
|
+
const entry = {};
|
|
141
|
+
if (e.name !== undefined)
|
|
142
|
+
entry.name = String(e.name);
|
|
143
|
+
if (e.tool_call_id !== undefined)
|
|
144
|
+
entry.tool_call_id = String(e.tool_call_id);
|
|
145
|
+
if (e.content !== undefined)
|
|
146
|
+
entry.content = String(e.content);
|
|
147
|
+
if (e.content_match !== undefined)
|
|
148
|
+
entry.content_match = e.content_match;
|
|
149
|
+
if (e.content_json !== undefined)
|
|
150
|
+
entry.content_json = e.content_json;
|
|
151
|
+
return entry;
|
|
152
|
+
}
|
|
153
|
+
const keys = Object.keys(tr);
|
|
154
|
+
if (keys.length !== 1)
|
|
155
|
+
throw new Error(`${whereItem} must be { name: ..., ... } or { toolName: { ...jsonSubset } }.`);
|
|
156
|
+
const name = keys[0];
|
|
157
|
+
const content_json = tr[name];
|
|
158
|
+
if (!content_json || typeof content_json !== "object")
|
|
159
|
+
throw new Error(`${whereItem}.${name} must be an object.`);
|
|
160
|
+
return { name, content_json };
|
|
161
|
+
});
|
|
162
|
+
if (out.tool_results_match === undefined)
|
|
163
|
+
out.tool_results_match = "contains";
|
|
164
|
+
}
|
|
165
|
+
return out;
|
|
166
|
+
}
|
|
167
|
+
function normalizeTranscript(entries, where) {
|
|
168
|
+
if (!Array.isArray(entries))
|
|
169
|
+
throw new Error(`${where} must be an array.`);
|
|
170
|
+
if (entries.length === 0)
|
|
171
|
+
throw new Error(`${where} must not be empty.`);
|
|
172
|
+
const last = entries[entries.length - 1];
|
|
173
|
+
if (!last || typeof last !== "object" || !("next_assistant" in last)) {
|
|
174
|
+
throw new Error(`${where} must end with { next_assistant: ... }.`);
|
|
175
|
+
}
|
|
176
|
+
let callCounter = 0;
|
|
177
|
+
const seenToolCallIds = new Set;
|
|
178
|
+
const nextCallId = (preferred) => {
|
|
179
|
+
const id = preferred ?? `call_${++callCounter}`;
|
|
180
|
+
if (!seenToolCallIds.has(id)) {
|
|
181
|
+
seenToolCallIds.add(id);
|
|
182
|
+
return id;
|
|
183
|
+
}
|
|
184
|
+
if (preferred)
|
|
185
|
+
return preferred;
|
|
186
|
+
throw new Error(`${where}: generated duplicate tool call id: ${id}`);
|
|
187
|
+
};
|
|
188
|
+
const inferSingleToolCallId = () => {
|
|
189
|
+
if (seenToolCallIds.size !== 1) {
|
|
190
|
+
throw new Error(`${where}: tool entry is missing tool_call_id and it cannot be inferred.`);
|
|
191
|
+
}
|
|
192
|
+
return [...seenToolCallIds][0];
|
|
193
|
+
};
|
|
194
|
+
const messages = [];
|
|
195
|
+
for (let i = 0;i < entries.length - 1; i++) {
|
|
196
|
+
const entry = entries[i];
|
|
197
|
+
const whereEntry = `${where}[${i}]`;
|
|
198
|
+
if (!entry || typeof entry !== "object")
|
|
199
|
+
throw new Error(`${whereEntry} must be an object.`);
|
|
200
|
+
if ("system" in entry) {
|
|
201
|
+
messages.push({ role: "system", content: String(entry.system) });
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
if ("user" in entry) {
|
|
205
|
+
messages.push({ role: "user", content: String(entry.user) });
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
if ("assistant" in entry) {
|
|
209
|
+
const a = entry.assistant;
|
|
210
|
+
if (typeof a === "string") {
|
|
211
|
+
messages.push({ role: "assistant", content: a });
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (!a || typeof a !== "object")
|
|
215
|
+
throw new Error(`${whereEntry}.assistant must be a string or object.`);
|
|
216
|
+
const tool_calls = normalizeToolCallsForMessage(a.tool_calls, nextCallId);
|
|
217
|
+
const msg = {
|
|
218
|
+
role: "assistant",
|
|
219
|
+
content: a.content !== undefined ? String(a.content) : "",
|
|
220
|
+
tool_calls
|
|
221
|
+
};
|
|
222
|
+
messages.push(msg);
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
if ("tool" in entry) {
|
|
226
|
+
const tool = normalizeTranscriptTool(entry.tool, `${whereEntry}.tool`, inferSingleToolCallId);
|
|
227
|
+
messages.push(tool);
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
throw new Error(`${whereEntry} must be one of: system, user, assistant, tool.`);
|
|
231
|
+
}
|
|
232
|
+
const expect = normalizeNextAssistantExpect(last.next_assistant, `${where}[${entries.length - 1}].next_assistant`);
|
|
233
|
+
return { messages, expect };
|
|
234
|
+
}
|
|
235
|
+
normalized.fixtures = file.fixtures.map((fixture, index) => {
|
|
52
236
|
if (!fixture || typeof fixture !== "object")
|
|
53
237
|
throw new Error(`fixtures[${index}] must be an object.`);
|
|
54
238
|
if (!("id" in fixture))
|
|
55
239
|
throw new Error(`fixtures[${index}].id is required.`);
|
|
56
|
-
if (!("
|
|
57
|
-
throw new Error(`fixtures[${index}].
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
out.expect.tool_calls_match = "contains";
|
|
240
|
+
if (!("transcript" in fixture))
|
|
241
|
+
throw new Error(`fixtures[${index}].transcript is required.`);
|
|
242
|
+
const id = String(fixture.id);
|
|
243
|
+
const transcript = fixture.transcript;
|
|
244
|
+
const { messages, expect } = normalizeTranscript(transcript, `fixtures[${index}].transcript`);
|
|
245
|
+
const out = { id, messages, expect };
|
|
246
|
+
if (fixture.agent)
|
|
247
|
+
out.agent = normalizeAgentSpec(fixture.agent, env);
|
|
65
248
|
return out;
|
|
66
249
|
});
|
|
67
250
|
return normalized;
|
|
@@ -202,7 +385,7 @@ ${stderrText}` : ""));
|
|
|
202
385
|
if (isError(payload))
|
|
203
386
|
throw new Error(payload.error.message);
|
|
204
387
|
if (!isSuccess(payload)) {
|
|
205
|
-
throw new Error(`Agent response must be { "message": { ... } } or { "error": { "message": ... } }.`);
|
|
388
|
+
throw new Error(`Agent response must be { "message": { ... }, "tool_messages"?: [...] } or { "error": { "message": ... } }.`);
|
|
206
389
|
}
|
|
207
390
|
return payload;
|
|
208
391
|
} finally {
|
|
@@ -419,9 +602,8 @@ async function runFixtureFile(path, options = {}) {
|
|
|
419
602
|
for (const fixture of file.fixtures) {
|
|
420
603
|
try {
|
|
421
604
|
const agent = pickAgentSpec(file, fixture);
|
|
422
|
-
const messages = [...fixture.history ?? [], { role: "user", content: fixture.input }];
|
|
423
605
|
const res = await callSubprocessAgent(agent, {
|
|
424
|
-
messages,
|
|
606
|
+
messages: fixture.messages,
|
|
425
607
|
tools: [],
|
|
426
608
|
tool_choice: "auto"
|
|
427
609
|
});
|
|
@@ -534,4 +716,4 @@ Summary: ${pass} passed, ${fail} failed, ${skip} skipped`);
|
|
|
534
716
|
}
|
|
535
717
|
await main();
|
|
536
718
|
|
|
537
|
-
//# debugId=
|
|
719
|
+
//# debugId=8780BA705018958964756E2164756E21
|
package/dist/cli.js.map
CHANGED
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
"sources": ["../src/cli.ts", "../src/runner/runFixtureFile.ts", "../src/fixture/load.ts", "../src/judge/openaiJudge.ts", "../src/runner/subprocessAgent.ts", "../src/runner/deepMatch.ts", "../src/runner/expectations.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"#!/usr/bin/env bun\nimport { stat } from \"node:fs/promises\";\nimport { extname, resolve } from \"node:path\";\nimport { Glob } from \"bun\";\nimport { runFixtureFile } from \"./runner/runFixtureFile\";\n\nfunction usage(): string {\n return [\n \"Usage:\",\n \" incantx <file-or-dir> [--judge auto|off|on] [--judge-model <model>]\",\n \" incantx run <file-or-dir> [--judge auto|off|on] [--judge-model <model>]\",\n \"\",\n \"Examples:\",\n \" incantx tests/fixtures/weather.yaml\",\n \" incantx tests/fixtures --judge off\",\n ].join(\"\\n\");\n}\n\nfunction parseArgs(argv: string[]) {\n const [first, ...restAll] = argv;\n const opts: { judge?: \"auto\" | \"off\" | \"on\"; judgeModel?: string } = {};\n\n if (!first) return { command: \"help\" as const };\n if (first === \"-h\" || first === \"--help\") return { command: \"help\" as const };\n\n const target = first === \"run\" ? restAll[0] : first;\n const rest = first === \"run\" ? restAll.slice(1) : restAll;\n\n for (let i = 0; i < rest.length; i++) {\n const a = rest[i];\n if (a === \"--judge\") opts.judge = rest[++i] as any;\n else if (a === \"--judge-model\") opts.judgeModel = rest[++i];\n else if (a === \"-h\" || a === \"--help\") return { command: \"help\" as const };\n else throw new Error(`Unknown arg: ${a}`);\n }\n\n return { command: \"run\" as const, target, opts };\n}\n\nasync function listFixtureFiles(target: string): Promise<string[]> {\n const abs = resolve(target);\n const s = await stat(abs);\n if (s.isFile()) return [abs];\n\n const glob = new Glob(\"**/*.{yaml,yml}\");\n const out: string[] = [];\n for await (const rel of glob.scan({ cwd: abs, onlyFiles: true })) {\n out.push(resolve(abs, rel));\n }\n out.sort();\n return out;\n}\n\nfunction formatStatus(status: \"pass\" | \"fail\" | \"skip\"): string {\n if (status === \"pass\") return \"PASS\";\n if (status === \"skip\") return \"SKIP\";\n return \"FAIL\";\n}\n\nasync function main() {\n const parsed = parseArgs(process.argv.slice(2));\n if ((parsed as any).command === \"help\" || !(\"command\" in parsed) || parsed.command !== \"run\") {\n console.log(usage());\n process.exit(0);\n }\n\n if (!parsed.target) throw new Error(\"Missing <file-or-dir>.\");\n\n const files = await listFixtureFiles(parsed.target);\n if (files.length === 0) throw new Error(`No fixture files found under: ${parsed.target}`);\n\n let pass = 0;\n let fail = 0;\n let skip = 0;\n\n for (const file of files) {\n if (![\".yaml\", \".yml\"].includes(extname(file))) continue;\n const res = await runFixtureFile(file, {\n judgeMode: parsed.opts.judge ?? \"auto\",\n judgeModel: parsed.opts.judgeModel,\n });\n\n console.log(res.path);\n for (const r of res.results) {\n console.log(` ${formatStatus(r.status)} ${r.id}${r.reason ? ` — ${r.reason}` : \"\"}`);\n if (r.status === \"pass\") pass++;\n else if (r.status === \"skip\") skip++;\n else fail++;\n }\n }\n\n console.log(`\\nSummary: ${pass} passed, ${fail} failed, ${skip} skipped`);\n process.exit(fail > 0 ? 1 : 0);\n}\n\nawait main();\n",
|
|
6
|
-
"import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { AssistantMessage, ToolMessage } from \"../agent/types\";\nimport { loadFixtureFile } from \"../fixture/load\";\nimport type { AgentSpec, Fixture, FixtureFile } from \"../fixture/types\";\nimport { createOpenAIJudge } from \"../judge/openaiJudge\";\nimport { callSubprocessAgent } from \"./subprocessAgent\";\nimport type { ExpectationResult, Judge } from \"./expectations\";\nimport { evaluateExpectations } from \"./expectations\";\n\nexport type JudgeMode = \"off\" | \"auto\" | \"on\";\n\nexport type RunOptions = {\n judgeMode?: JudgeMode;\n judgeModel?: string;\n};\n\nexport type FixtureResult = {\n id: string;\n status: \"pass\" | \"fail\" | \"skip\";\n reason?: string;\n message?: AssistantMessage;\n tool_messages?: ToolMessage[];\n};\n\nexport type FixtureFileResult = {\n path: string;\n results: FixtureResult[];\n};\n\nfunction pickAgentSpec(file: FixtureFile, fixture: Fixture): AgentSpec {\n const agent = fixture.agent ?? file.agent;\n if (!agent) throw new Error(`Fixture '${fixture.id}' has no agent. Add file-level 'agent:' or fixture-level 'agent:'.`);\n if ((agent.type ?? \"subprocess\") !== \"subprocess\") throw new Error(`Unsupported agent type: ${agent.type}`);\n return agent;\n}\n\nfunction makeJudge(mode: JudgeMode, model?: string): Judge | undefined {\n if (mode === \"off\") return undefined;\n\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n if (mode === \"on\") throw new Error(\"Judge mode is 'on' but OPENAI_API_KEY is not set.\");\n return undefined;\n }\n\n return createOpenAIJudge({ apiKey, model });\n}\n\nexport async function runFixtureFile(path: string, options: RunOptions = {}): Promise<FixtureFileResult> {\n const absolute = resolve(path);\n const yamlText = await readFile(absolute, \"utf8\");\n const file = loadFixtureFile(yamlText);\n\n const judgeMode = options.judgeMode ?? \"auto\";\n const judge = makeJudge(judgeMode, options.judgeModel);\n\n const results: FixtureResult[] = [];\n\n for (const fixture of file.fixtures) {\n try {\n const agent = pickAgentSpec(file, fixture);\n const
|
|
7
|
-
"import { parse as parseYaml } from \"yaml\";\nimport type { AgentSpec, FixtureFile } from \"./types\";\n\nfunction expandEnvVars(value: string, env: Record<string, string | undefined>): string {\n return value.replace(/\\$\\{([A-Z0-9_]+)\\}/gi, (_, key: string) => env[key] ?? \"\");\n}\n\nfunction normalizeAgentSpec(raw: AgentSpec, env: Record<string, string | undefined>): AgentSpec {\n const normalized: AgentSpec = { ...raw };\n\n if (normalized.type === undefined) normalized.type = \"subprocess\";\n if (!Array.isArray(normalized.command) || normalized.command.length === 0) {\n throw new Error(\"`agent.command` must be a non-empty array of strings.\");\n }\n\n normalized.command = normalized.command.map((part) => String(part));\n\n if (normalized.cwd !== undefined) normalized.cwd = String(normalized.cwd);\n if (normalized.timeout_ms !== undefined) normalized.timeout_ms = Number(normalized.timeout_ms);\n\n if (normalized.env) {\n const expanded: Record<string, string> = {};\n for (const [k, v] of Object.entries(normalized.env)) {\n expanded[k] = expandEnvVars(String(v), env);\n }\n normalized.env = expanded;\n }\n\n return normalized;\n}\n\nexport function loadFixtureFile(yamlText: string, env: Record<string, string | undefined> = process.env): FixtureFile {\n const data = parseYaml(yamlText) as unknown;\n if (!data || typeof data !== \"object\") throw new Error(\"Fixture file must be a YAML object.\");\n\n const file = data as Partial<FixtureFile>;\n if (!Array.isArray(file.fixtures)) throw new Error(\"Fixture file must contain `fixtures: [...]`.\");\n\n const normalized: FixtureFile = {\n fixtures: file.fixtures as FixtureFile[\"fixtures\"],\n };\n\n if (file.agent) normalized.agent = normalizeAgentSpec(file.agent as AgentSpec, env);\n\n normalized.fixtures = normalized.fixtures.map((fixture, index) => {\n if (!fixture || typeof fixture !== \"object\") throw new Error(`fixtures[${index}] must be an object.`);\n if (!(\"id\" in fixture)) throw new Error(`fixtures[${index}].id is required.`);\n if (!(\"input\" in fixture)) throw new Error(`fixtures[${index}].input is required.`);\n\n const out = { ...fixture } as any;\n out.id = String(out.id);\n out.input = String(out.input);\n\n if (out.agent) out.agent = normalizeAgentSpec(out.agent as AgentSpec, env);\n if (out.expect?.tool_calls_match === undefined && out.expect?.tool_calls) out.expect.tool_calls_match = \"contains\";\n\n return out;\n });\n\n return normalized;\n}\n",
|
|
6
|
+
"import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { AssistantMessage, ToolMessage } from \"../agent/types\";\nimport { loadFixtureFile } from \"../fixture/load\";\nimport type { AgentSpec, Fixture, FixtureFile } from \"../fixture/types\";\nimport { createOpenAIJudge } from \"../judge/openaiJudge\";\nimport { callSubprocessAgent } from \"./subprocessAgent\";\nimport type { ExpectationResult, Judge } from \"./expectations\";\nimport { evaluateExpectations } from \"./expectations\";\n\nexport type JudgeMode = \"off\" | \"auto\" | \"on\";\n\nexport type RunOptions = {\n judgeMode?: JudgeMode;\n judgeModel?: string;\n};\n\nexport type FixtureResult = {\n id: string;\n status: \"pass\" | \"fail\" | \"skip\";\n reason?: string;\n message?: AssistantMessage;\n tool_messages?: ToolMessage[];\n};\n\nexport type FixtureFileResult = {\n path: string;\n results: FixtureResult[];\n};\n\nfunction pickAgentSpec(file: FixtureFile, fixture: Fixture): AgentSpec {\n const agent = fixture.agent ?? file.agent;\n if (!agent) throw new Error(`Fixture '${fixture.id}' has no agent. Add file-level 'agent:' or fixture-level 'agent:'.`);\n if ((agent.type ?? \"subprocess\") !== \"subprocess\") throw new Error(`Unsupported agent type: ${agent.type}`);\n return agent;\n}\n\nfunction makeJudge(mode: JudgeMode, model?: string): Judge | undefined {\n if (mode === \"off\") return undefined;\n\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n if (mode === \"on\") throw new Error(\"Judge mode is 'on' but OPENAI_API_KEY is not set.\");\n return undefined;\n }\n\n return createOpenAIJudge({ apiKey, model });\n}\n\nexport async function runFixtureFile(path: string, options: RunOptions = {}): Promise<FixtureFileResult> {\n const absolute = resolve(path);\n const yamlText = await readFile(absolute, \"utf8\");\n const file = loadFixtureFile(yamlText);\n\n const judgeMode = options.judgeMode ?? \"auto\";\n const judge = makeJudge(judgeMode, options.judgeModel);\n\n const results: FixtureResult[] = [];\n\n for (const fixture of file.fixtures) {\n try {\n const agent = pickAgentSpec(file, fixture);\n const res = await callSubprocessAgent(agent, {\n messages: fixture.messages,\n tools: [],\n tool_choice: \"auto\",\n });\n\n const expectation = await evaluateExpectations(fixture.expect, res, judge);\n results.push({\n id: fixture.id,\n status: expectation.status,\n reason: (expectation as Extract<ExpectationResult, { status: \"fail\" | \"skip\" }>).reason,\n message: res.message,\n tool_messages: res.tool_messages,\n });\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n results.push({ id: fixture.id, status: \"fail\", reason });\n }\n }\n\n return { path: absolute, results };\n}\n",
|
|
7
|
+
"import { parse as parseYaml } from \"yaml\";\nimport type {\n AgentSpec,\n Fixture,\n FixtureExpectation,\n FixtureFile,\n FixtureFileSource,\n NextAssistantExpectationSource,\n ToolCallExpectation,\n ToolResultExpectation,\n TranscriptEntrySource,\n TranscriptToolCallSource,\n TranscriptToolSource,\n} from \"./types\";\nimport type { AssistantMessage, ChatMessage, ToolCall, ToolMessage } from \"../agent/types\";\n\nfunction expandEnvVars(value: string, env: Record<string, string | undefined>): string {\n return value.replace(/\\$\\{([A-Z0-9_]+)\\}/gi, (_, key: string) => env[key] ?? \"\");\n}\n\nfunction normalizeAgentSpec(raw: AgentSpec, env: Record<string, string | undefined>): AgentSpec {\n const normalized: AgentSpec = { ...raw };\n\n if (normalized.type === undefined) normalized.type = \"subprocess\";\n if (!Array.isArray(normalized.command) || normalized.command.length === 0) {\n throw new Error(\"`agent.command` must be a non-empty array of strings.\");\n }\n\n normalized.command = normalized.command.map((part) => String(part));\n\n if (normalized.cwd !== undefined) normalized.cwd = String(normalized.cwd);\n if (normalized.timeout_ms !== undefined) normalized.timeout_ms = Number(normalized.timeout_ms);\n\n if (normalized.env) {\n const expanded: Record<string, string> = {};\n for (const [k, v] of Object.entries(normalized.env)) {\n expanded[k] = expandEnvVars(String(v), env);\n }\n normalized.env = expanded;\n }\n\n return normalized;\n}\n\nexport function loadFixtureFile(yamlText: string, env: Record<string, string | undefined> = process.env): FixtureFile {\n const data = parseYaml(yamlText) as unknown;\n if (!data || typeof data !== \"object\") throw new Error(\"Fixture file must be a YAML object.\");\n\n const file = data as Partial<FixtureFileSource>;\n if (!Array.isArray(file.fixtures)) throw new Error(\"Fixture file must contain `fixtures: [...]`.\");\n\n const normalized: FixtureFile = {\n fixtures: [],\n };\n\n if (file.agent) normalized.agent = normalizeAgentSpec(file.agent as AgentSpec, env);\n\n function normalizeToolCallSource(entry: TranscriptToolCallSource, where: string): { id?: string; name: string; args?: Record<string, unknown> } {\n if (!entry || typeof entry !== \"object\") throw new Error(`${where} must be an object.`);\n\n if (\"name\" in entry) {\n const e = entry as any;\n return {\n id: e.id !== undefined ? String(e.id) : undefined,\n name: String(e.name),\n args: e.args !== undefined ? (e.args as Record<string, unknown>) : undefined,\n };\n }\n\n const keys = Object.keys(entry);\n if (keys.length !== 1) throw new Error(`${where} must be { name: ..., args: ... } or { toolName: { ...args } }.`);\n const name = keys[0]!;\n const args = (entry as any)[name];\n if (!args || typeof args !== \"object\") throw new Error(`${where}.${name} must be an object of args.`);\n return { name, args: args as Record<string, unknown> };\n }\n\n function normalizeToolCallsForMessage(\n toolCalls: TranscriptToolCallSource[] | undefined,\n callId: (preferred?: string) => string\n ): ToolCall[] | undefined {\n if (!toolCalls || toolCalls.length === 0) return undefined;\n const out: ToolCall[] = [];\n for (let i = 0; i < toolCalls.length; i++) {\n const tc = normalizeToolCallSource(toolCalls[i]!, `tool_calls[${i}]`);\n out.push({\n id: callId(tc.id),\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args ?? {}),\n },\n });\n }\n return out;\n }\n\n function normalizeTranscriptTool(entry: TranscriptToolSource, where: string, inferToolCallId: () => string): ToolMessage {\n if (!entry || typeof entry !== \"object\") throw new Error(`${where} must be an object.`);\n const name = String((entry as any).name);\n\n let tool_call_id: string | undefined = (entry as any).tool_call_id !== undefined ? String((entry as any).tool_call_id) : undefined;\n if (!tool_call_id) tool_call_id = inferToolCallId();\n\n if (\"json\" in entry && entry.json !== undefined) {\n return { role: \"tool\", tool_call_id, name, content: JSON.stringify(entry.json) };\n }\n\n if (\"content\" in entry && entry.content !== undefined) {\n return { role: \"tool\", tool_call_id, name, content: String(entry.content) };\n }\n\n throw new Error(`${where} must include either 'json' or 'content'.`);\n }\n\n function normalizeNextAssistantExpect(expect: NextAssistantExpectationSource, where: string): FixtureExpectation {\n if (!expect || typeof expect !== \"object\") throw new Error(`${where} must be an object.`);\n\n const tool_calls = (expect as any).tool_calls as TranscriptToolCallSource[] | undefined;\n const tool_results = (expect as any).tool_results as any[] | undefined;\n\n const out: FixtureExpectation = {};\n\n const assistant: FixtureExpectation[\"assistant\"] = {};\n if ((expect as any).content !== undefined) assistant.content = String((expect as any).content);\n if ((expect as any).content_match !== undefined) assistant.content_match = (expect as any).content_match;\n if ((expect as any).llm !== undefined) assistant.llm = String((expect as any).llm);\n if (assistant.content !== undefined || assistant.llm !== undefined) out.assistant = assistant;\n\n if ((expect as any).tool_calls_match !== undefined) out.tool_calls_match = (expect as any).tool_calls_match;\n if (tool_calls) {\n out.tool_calls = tool_calls.map((tc, i) => {\n const normalized = normalizeToolCallSource(tc, `${where}.tool_calls[${i}]`);\n const entry: ToolCallExpectation = { name: normalized.name };\n if (normalized.args !== undefined) entry.arguments = normalized.args;\n return entry;\n });\n if (out.tool_calls_match === undefined) out.tool_calls_match = \"contains\";\n }\n\n if ((expect as any).tool_results_match !== undefined) out.tool_results_match = (expect as any).tool_results_match;\n if (tool_results) {\n out.tool_results = tool_results.map((tr, i) => {\n const whereItem = `${where}.tool_results[${i}]`;\n if (!tr || typeof tr !== \"object\") throw new Error(`${whereItem} must be an object.`);\n\n if (\"name\" in tr || \"tool_call_id\" in tr || \"content\" in tr || \"content_json\" in tr) {\n const e = tr as any;\n const entry: ToolResultExpectation = {};\n if (e.name !== undefined) entry.name = String(e.name);\n if (e.tool_call_id !== undefined) entry.tool_call_id = String(e.tool_call_id);\n if (e.content !== undefined) entry.content = String(e.content);\n if (e.content_match !== undefined) entry.content_match = e.content_match;\n if (e.content_json !== undefined) entry.content_json = e.content_json as Record<string, unknown>;\n return entry;\n }\n\n const keys = Object.keys(tr);\n if (keys.length !== 1) throw new Error(`${whereItem} must be { name: ..., ... } or { toolName: { ...jsonSubset } }.`);\n const name = keys[0]!;\n const content_json = (tr as any)[name];\n if (!content_json || typeof content_json !== \"object\") throw new Error(`${whereItem}.${name} must be an object.`);\n return { name, content_json: content_json as Record<string, unknown> };\n });\n if (out.tool_results_match === undefined) out.tool_results_match = \"contains\";\n }\n\n return out;\n }\n\n function normalizeTranscript(entries: TranscriptEntrySource[], where: string): { messages: ChatMessage[]; expect: FixtureExpectation } {\n if (!Array.isArray(entries)) throw new Error(`${where} must be an array.`);\n if (entries.length === 0) throw new Error(`${where} must not be empty.`);\n\n const last = entries[entries.length - 1] as any;\n if (!last || typeof last !== \"object\" || !(\"next_assistant\" in last)) {\n throw new Error(`${where} must end with { next_assistant: ... }.`);\n }\n\n let callCounter = 0;\n const seenToolCallIds = new Set<string>();\n\n const nextCallId = (preferred?: string) => {\n const id = preferred ?? `call_${++callCounter}`;\n if (!seenToolCallIds.has(id)) {\n seenToolCallIds.add(id);\n return id;\n }\n if (preferred) return preferred;\n throw new Error(`${where}: generated duplicate tool call id: ${id}`);\n };\n\n const inferSingleToolCallId = () => {\n if (seenToolCallIds.size !== 1) {\n throw new Error(`${where}: tool entry is missing tool_call_id and it cannot be inferred.`);\n }\n return [...seenToolCallIds][0]!;\n };\n\n const messages: ChatMessage[] = [];\n\n for (let i = 0; i < entries.length - 1; i++) {\n const entry = entries[i] as any;\n const whereEntry = `${where}[${i}]`;\n if (!entry || typeof entry !== \"object\") throw new Error(`${whereEntry} must be an object.`);\n\n if (\"system\" in entry) {\n messages.push({ role: \"system\", content: String(entry.system) });\n continue;\n }\n\n if (\"user\" in entry) {\n messages.push({ role: \"user\", content: String(entry.user) });\n continue;\n }\n\n if (\"assistant\" in entry) {\n const a = entry.assistant;\n if (typeof a === \"string\") {\n messages.push({ role: \"assistant\", content: a });\n continue;\n }\n if (!a || typeof a !== \"object\") throw new Error(`${whereEntry}.assistant must be a string or object.`);\n const tool_calls = normalizeToolCallsForMessage((a as any).tool_calls, nextCallId);\n const msg: AssistantMessage = {\n role: \"assistant\",\n content: (a as any).content !== undefined ? String((a as any).content) : \"\",\n tool_calls,\n };\n messages.push(msg);\n continue;\n }\n\n if (\"tool\" in entry) {\n const tool = normalizeTranscriptTool(entry.tool as TranscriptToolSource, `${whereEntry}.tool`, inferSingleToolCallId);\n messages.push(tool);\n continue;\n }\n\n throw new Error(`${whereEntry} must be one of: system, user, assistant, tool.`);\n }\n\n const expect = normalizeNextAssistantExpect((last as any).next_assistant, `${where}[${entries.length - 1}].next_assistant`);\n return { messages, expect };\n }\n\n normalized.fixtures = (file.fixtures as FixtureFileSource[\"fixtures\"]).map((fixture, index) => {\n if (!fixture || typeof fixture !== \"object\") throw new Error(`fixtures[${index}] must be an object.`);\n if (!(\"id\" in fixture)) throw new Error(`fixtures[${index}].id is required.`);\n if (!(\"transcript\" in fixture)) throw new Error(`fixtures[${index}].transcript is required.`);\n\n const id = String((fixture as any).id);\n const transcript = (fixture as any).transcript as TranscriptEntrySource[];\n const { messages, expect } = normalizeTranscript(transcript, `fixtures[${index}].transcript`);\n\n const out: Fixture = { id, messages, expect };\n if ((fixture as any).agent) out.agent = normalizeAgentSpec((fixture as any).agent as AgentSpec, env);\n return out;\n });\n\n return normalized;\n}\n",
|
|
8
8
|
"import type { AssistantMessage } from \"../agent/types\";\nimport type { ExpectationResult } from \"../runner/expectations\";\n\nexport type OpenAIJudgeOptions = {\n apiKey: string;\n baseUrl?: string;\n model?: string;\n};\n\ntype JudgeResponse = { pass: boolean; reason: string };\n\nexport function createOpenAIJudge(options: OpenAIJudgeOptions) {\n const baseUrl = options.baseUrl ?? process.env.OPENAI_BASE_URL ?? \"https://api.openai.com/v1\";\n const model = options.model ?? process.env.OPENAI_JUDGE_MODEL ?? \"gpt-4o-mini\";\n\n return async ({ expectation, message }: { expectation: string; message: AssistantMessage }): Promise<ExpectationResult> => {\n const system =\n \"You are a strict test evaluator. Decide if the assistant message satisfies the expectation. \" +\n \"Respond with ONLY valid JSON: {\\\"pass\\\": boolean, \\\"reason\\\": string}.\";\n\n const user = JSON.stringify(\n {\n expectation,\n assistant_message: message,\n },\n null,\n 2\n );\n\n const res = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model,\n temperature: 0,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n }),\n });\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n return {\n status: \"fail\",\n reason: `Judge call failed: ${res.status} ${res.statusText}${body ? `\\n${body}` : \"\"}`,\n };\n }\n\n const data = (await res.json()) as any;\n const content = data?.choices?.[0]?.message?.content;\n if (typeof content !== \"string\" || content.trim().length === 0) {\n return { status: \"fail\", reason: \"Judge returned no content.\" };\n }\n\n let parsed: JudgeResponse;\n try {\n parsed = JSON.parse(content) as JudgeResponse;\n } catch {\n return { status: \"fail\", reason: `Judge did not return valid JSON.\\n${content}` };\n }\n\n if (parsed.pass) return { status: \"pass\" };\n return { status: \"fail\", reason: parsed.reason || \"Expectation not satisfied.\" };\n };\n}\n",
|
|
9
|
-
"import type { AssistantMessage, ChatAgentRequest, ToolMessage } from \"../agent/types\";\nimport type { AgentSpec } from \"../fixture/types\";\n\nexport type SubprocessAgentResponse = { message: AssistantMessage; tool_messages?: ToolMessage[] };\ntype AgentProcessError = { error: { message: string } };\n\nfunction isSuccess(value: unknown): value is SubprocessAgentResponse {\n return !!value && typeof value === \"object\" && \"message\" in (value as any);\n}\n\nfunction isError(value: unknown): value is AgentProcessError {\n return !!value && typeof value === \"object\" && \"error\" in (value as any);\n}\n\nasync function readFirstNonEmptyLine(stream: ReadableStream<Uint8Array>, timeoutMs: number): Promise<string> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const deadline = Date.now() + timeoutMs;\n\n type ReadResult = { value?: Uint8Array; done: boolean };\n\n while (true) {\n const timeLeft = deadline - Date.now();\n if (timeLeft <= 0) throw new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`);\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timerPromise = new Promise<never>((_, reject) => {\n timerId = setTimeout(() => reject(new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`)), timeLeft);\n });\n\n let chunk: ReadResult;\n try {\n chunk = await Promise.race([reader.read(), timerPromise]);\n } finally {\n if (timerId !== undefined) clearTimeout(timerId);\n }\n\n const { value, done } = chunk;\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = buffer.indexOf(\"\\n\");\n if (idx === -1) break;\n const line = buffer.slice(0, idx).trim();\n buffer = buffer.slice(idx + 1);\n if (line.length > 0) return line;\n }\n }\n\n const tail = buffer.trim();\n if (tail.length > 0) return tail;\n throw new Error(\"Agent produced no output on stdout.\");\n}\n\nexport async function callSubprocessAgent(spec: AgentSpec, request: ChatAgentRequest): Promise<SubprocessAgentResponse> {\n const timeoutMs = spec.timeout_ms ?? 20_000;\n\n const proc = Bun.spawn(spec.command, {\n cwd: spec.cwd,\n env: { ...process.env, ...(spec.env ?? {}) },\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n\n const stdin = proc.stdin;\n if (!stdin) throw new Error(\"Failed to open agent stdin.\");\n\n stdin.write(`${JSON.stringify(request)}\\n`);\n stdin.end();\n\n let stderrText = \"\";\n const stderrPromise = (async () => {\n if (!proc.stderr) return;\n stderrText = await new Response(proc.stderr).text().catch(() => \"\");\n })();\n\n try {\n if (!proc.stdout) throw new Error(\"Failed to open agent stdout.\");\n const line = await readFirstNonEmptyLine(proc.stdout, timeoutMs);\n\n let payload: unknown;\n try {\n payload = JSON.parse(line) as unknown;\n } catch {\n throw new Error(\n `Agent stdout is not valid JSON.\\n` +\n `Line: ${line}\\n` +\n (stderrText ? `Stderr:\\n${stderrText}` : \"\")\n );\n }\n\n if (isError(payload)) throw new Error(payload.error.message);\n if (!isSuccess(payload)) {\n throw new Error(`Agent response must be { \"message\": { ... } } or { \"error\": { \"message\": ... } }
|
|
9
|
+
"import type { AssistantMessage, ChatAgentRequest, ToolMessage } from \"../agent/types\";\nimport type { AgentSpec } from \"../fixture/types\";\n\nexport type SubprocessAgentResponse = { message: AssistantMessage; tool_messages?: ToolMessage[] };\ntype AgentProcessError = { error: { message: string } };\n\nfunction isSuccess(value: unknown): value is SubprocessAgentResponse {\n return !!value && typeof value === \"object\" && \"message\" in (value as any);\n}\n\nfunction isError(value: unknown): value is AgentProcessError {\n return !!value && typeof value === \"object\" && \"error\" in (value as any);\n}\n\nasync function readFirstNonEmptyLine(stream: ReadableStream<Uint8Array>, timeoutMs: number): Promise<string> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const deadline = Date.now() + timeoutMs;\n\n type ReadResult = { value?: Uint8Array; done: boolean };\n\n while (true) {\n const timeLeft = deadline - Date.now();\n if (timeLeft <= 0) throw new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`);\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timerPromise = new Promise<never>((_, reject) => {\n timerId = setTimeout(() => reject(new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`)), timeLeft);\n });\n\n let chunk: ReadResult;\n try {\n chunk = await Promise.race([reader.read(), timerPromise]);\n } finally {\n if (timerId !== undefined) clearTimeout(timerId);\n }\n\n const { value, done } = chunk;\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = buffer.indexOf(\"\\n\");\n if (idx === -1) break;\n const line = buffer.slice(0, idx).trim();\n buffer = buffer.slice(idx + 1);\n if (line.length > 0) return line;\n }\n }\n\n const tail = buffer.trim();\n if (tail.length > 0) return tail;\n throw new Error(\"Agent produced no output on stdout.\");\n}\n\nexport async function callSubprocessAgent(spec: AgentSpec, request: ChatAgentRequest): Promise<SubprocessAgentResponse> {\n const timeoutMs = spec.timeout_ms ?? 20_000;\n\n const proc = Bun.spawn(spec.command, {\n cwd: spec.cwd,\n env: { ...process.env, ...(spec.env ?? {}) },\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n\n const stdin = proc.stdin;\n if (!stdin) throw new Error(\"Failed to open agent stdin.\");\n\n stdin.write(`${JSON.stringify(request)}\\n`);\n stdin.end();\n\n let stderrText = \"\";\n const stderrPromise = (async () => {\n if (!proc.stderr) return;\n stderrText = await new Response(proc.stderr).text().catch(() => \"\");\n })();\n\n try {\n if (!proc.stdout) throw new Error(\"Failed to open agent stdout.\");\n const line = await readFirstNonEmptyLine(proc.stdout, timeoutMs);\n\n let payload: unknown;\n try {\n payload = JSON.parse(line) as unknown;\n } catch {\n throw new Error(\n `Agent stdout is not valid JSON.\\n` +\n `Line: ${line}\\n` +\n (stderrText ? `Stderr:\\n${stderrText}` : \"\")\n );\n }\n\n if (isError(payload)) throw new Error(payload.error.message);\n if (!isSuccess(payload)) {\n throw new Error(\n `Agent response must be { \"message\": { ... }, \"tool_messages\"?: [...] } or { \"error\": { \"message\": ... } }.`\n );\n }\n\n return payload;\n } finally {\n proc.kill();\n await Promise.allSettled([proc.exited, stderrPromise]);\n }\n}\n",
|
|
10
10
|
"export function deepPartialMatch(expected: unknown, actual: unknown): boolean {\n if (expected === actual) return true;\n\n if (expected === null || actual === null) return expected === actual;\n\n const expectedType = typeof expected;\n const actualType = typeof actual;\n if (expectedType !== actualType) return false;\n\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual)) return false;\n if (expected.length !== actual.length) return false;\n for (let i = 0; i < expected.length; i++) {\n if (!deepPartialMatch(expected[i], actual[i])) return false;\n }\n return true;\n }\n\n if (expectedType === \"object\") {\n if (Array.isArray(actual)) return false;\n const expectedObj = expected as Record<string, unknown>;\n const actualObj = actual as Record<string, unknown>;\n for (const [key, expectedValue] of Object.entries(expectedObj)) {\n if (!(key in actualObj)) return false;\n if (!deepPartialMatch(expectedValue, actualObj[key])) return false;\n }\n return true;\n }\n\n return false;\n}\n\n",
|
|
11
11
|
"import type { AssistantMessage, ToolMessage } from \"../agent/types\";\nimport type { FixtureExpectation, ToolCallExpectation, ToolResultExpectation } from \"../fixture/types\";\nimport { deepPartialMatch } from \"./deepMatch\";\n\nexport type ExpectationResult =\n | { status: \"pass\" }\n | { status: \"fail\"; reason: string }\n | { status: \"skip\"; reason: string };\n\nfunction parseJsonOrUndefined(value: string): unknown | undefined {\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return undefined;\n }\n}\n\nfunction matchToolCall(expected: ToolCallExpectation, actual: NonNullable<AssistantMessage[\"tool_calls\"]>[number]): boolean {\n if (actual.function.name !== expected.name) return false;\n if (expected.arguments === undefined) return true;\n const actualArgs = parseJsonOrUndefined(actual.function.arguments);\n if (actualArgs === undefined) return false;\n return deepPartialMatch(expected.arguments, actualArgs);\n}\n\nfunction checkToolCalls(expect: FixtureExpectation, message: AssistantMessage): ExpectationResult {\n const expectedCalls = expect.tool_calls ?? [];\n if (expectedCalls.length === 0) return { status: \"pass\" };\n\n const actualCalls = message.tool_calls ?? [];\n const mode = expect.tool_calls_match ?? \"contains\";\n\n if (mode === \"contains\") {\n for (const expected of expectedCalls) {\n const ok = actualCalls.some((actual) => matchToolCall(expected, actual));\n if (!ok) {\n return {\n status: \"fail\",\n reason: `Expected tool call not found: ${expected.name}`,\n };\n }\n }\n return { status: \"pass\" };\n }\n\n if (actualCalls.length !== expectedCalls.length) {\n return {\n status: \"fail\",\n reason: `Expected exactly ${expectedCalls.length} tool call(s), got ${actualCalls.length}.`,\n };\n }\n\n for (let i = 0; i < expectedCalls.length; i++) {\n const expected = expectedCalls[i];\n const actual = actualCalls[i];\n if (!expected || !actual || !matchToolCall(expected, actual)) {\n return { status: \"fail\", reason: `Tool call mismatch at index ${i}.` };\n }\n }\n\n return { status: \"pass\" };\n}\n\nexport type Judge = (args: { expectation: string; message: AssistantMessage }) => Promise<ExpectationResult>;\n\ntype AgentTurn = { message: AssistantMessage; tool_messages?: ToolMessage[] };\n\nfunction matchToolResult(expected: ToolResultExpectation, actual: ToolMessage): boolean {\n if (expected.tool_call_id !== undefined && actual.tool_call_id !== expected.tool_call_id) return false;\n if (expected.name !== undefined && actual.name !== expected.name) return false;\n\n if (expected.content !== undefined) {\n const mode = expected.content_match ?? \"exact\";\n if (mode === \"exact\" && actual.content !== expected.content) return false;\n if (mode === \"contains\" && !actual.content.includes(expected.content)) return false;\n }\n\n if (expected.content_json !== undefined) {\n const actualJson = parseJsonOrUndefined(actual.content);\n if (actualJson === undefined) return false;\n if (!deepPartialMatch(expected.content_json, actualJson)) return false;\n }\n\n return true;\n}\n\nfunction checkToolResults(expect: FixtureExpectation, toolMessages: ToolMessage[]): ExpectationResult {\n const expectedResults = expect.tool_results ?? [];\n if (expectedResults.length === 0) return { status: \"pass\" };\n\n const mode = expect.tool_results_match ?? \"contains\";\n\n if (mode === \"contains\") {\n for (const expected of expectedResults) {\n if (!expected.name && !expected.tool_call_id) {\n return { status: \"fail\", reason: \"tool_results entries must include at least 'name' or 'tool_call_id'.\" };\n }\n\n const ok = toolMessages.some((actual) => matchToolResult(expected, actual));\n if (!ok) {\n return {\n status: \"fail\",\n reason: `Expected tool result not found${expected.name ? `: ${expected.name}` : \"\"}.`,\n };\n }\n }\n return { status: \"pass\" };\n }\n\n if (toolMessages.length !== expectedResults.length) {\n return {\n status: \"fail\",\n reason: `Expected exactly ${expectedResults.length} tool result(s), got ${toolMessages.length}.`,\n };\n }\n\n for (let i = 0; i < expectedResults.length; i++) {\n const expected = expectedResults[i];\n const actual = toolMessages[i];\n if (!expected || !actual || !matchToolResult(expected, actual)) {\n return { status: \"fail\", reason: `Tool result mismatch at index ${i}.` };\n }\n }\n\n return { status: \"pass\" };\n}\n\nfunction checkAssistantContent(expect: FixtureExpectation, message: AssistantMessage): ExpectationResult {\n const expected = expect.assistant?.content;\n if (expected === undefined) return { status: \"pass\" };\n\n const mode = expect.assistant?.content_match ?? \"contains\";\n if (mode === \"exact\") {\n if (message.content !== expected) return { status: \"fail\", reason: \"Assistant content did not match exactly.\" };\n return { status: \"pass\" };\n }\n\n if (!message.content.includes(expected)) return { status: \"fail\", reason: \"Assistant content did not contain expected text.\" };\n return { status: \"pass\" };\n}\n\nexport async function evaluateExpectations(\n expect: FixtureExpectation | undefined,\n turn: AgentTurn,\n judge: Judge | undefined\n): Promise<ExpectationResult> {\n if (!expect) return { status: \"pass\" };\n\n const toolRes = checkToolCalls(expect, turn.message);\n if (toolRes.status !== \"pass\") return toolRes;\n\n const toolResultsRes = checkToolResults(expect, turn.tool_messages ?? []);\n if (toolResultsRes.status !== \"pass\") return toolResultsRes;\n\n const contentRes = checkAssistantContent(expect, turn.message);\n if (contentRes.status !== \"pass\") return contentRes;\n\n if (expect.assistant?.llm) {\n if (!judge) return { status: \"skip\", reason: \"LLM judge not configured.\" };\n return await judge({ expectation: expect.assistant.llm, message: turn.message });\n }\n\n return { status: \"pass\" };\n}\n"
|
|
12
12
|
],
|
|
13
|
-
"mappings": "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",
|
|
14
|
-
"debugId": "
|
|
13
|
+
"mappings": "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",
|
|
14
|
+
"debugId": "8780BA705018958964756E2164756E21",
|
|
15
15
|
"names": []
|
|
16
16
|
}
|
package/dist/index.js
CHANGED
|
@@ -141,24 +141,207 @@ function loadFixtureFile(yamlText, env = process.env) {
|
|
|
141
141
|
if (!Array.isArray(file.fixtures))
|
|
142
142
|
throw new Error("Fixture file must contain `fixtures: [...]`.");
|
|
143
143
|
const normalized = {
|
|
144
|
-
fixtures:
|
|
144
|
+
fixtures: []
|
|
145
145
|
};
|
|
146
146
|
if (file.agent)
|
|
147
147
|
normalized.agent = normalizeAgentSpec(file.agent, env);
|
|
148
|
-
|
|
148
|
+
function normalizeToolCallSource(entry, where) {
|
|
149
|
+
if (!entry || typeof entry !== "object")
|
|
150
|
+
throw new Error(`${where} must be an object.`);
|
|
151
|
+
if ("name" in entry) {
|
|
152
|
+
const e = entry;
|
|
153
|
+
return {
|
|
154
|
+
id: e.id !== undefined ? String(e.id) : undefined,
|
|
155
|
+
name: String(e.name),
|
|
156
|
+
args: e.args !== undefined ? e.args : undefined
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const keys = Object.keys(entry);
|
|
160
|
+
if (keys.length !== 1)
|
|
161
|
+
throw new Error(`${where} must be { name: ..., args: ... } or { toolName: { ...args } }.`);
|
|
162
|
+
const name = keys[0];
|
|
163
|
+
const args = entry[name];
|
|
164
|
+
if (!args || typeof args !== "object")
|
|
165
|
+
throw new Error(`${where}.${name} must be an object of args.`);
|
|
166
|
+
return { name, args };
|
|
167
|
+
}
|
|
168
|
+
function normalizeToolCallsForMessage(toolCalls, callId) {
|
|
169
|
+
if (!toolCalls || toolCalls.length === 0)
|
|
170
|
+
return;
|
|
171
|
+
const out = [];
|
|
172
|
+
for (let i = 0;i < toolCalls.length; i++) {
|
|
173
|
+
const tc = normalizeToolCallSource(toolCalls[i], `tool_calls[${i}]`);
|
|
174
|
+
out.push({
|
|
175
|
+
id: callId(tc.id),
|
|
176
|
+
type: "function",
|
|
177
|
+
function: {
|
|
178
|
+
name: tc.name,
|
|
179
|
+
arguments: JSON.stringify(tc.args ?? {})
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
return out;
|
|
184
|
+
}
|
|
185
|
+
function normalizeTranscriptTool(entry, where, inferToolCallId) {
|
|
186
|
+
if (!entry || typeof entry !== "object")
|
|
187
|
+
throw new Error(`${where} must be an object.`);
|
|
188
|
+
const name = String(entry.name);
|
|
189
|
+
let tool_call_id = entry.tool_call_id !== undefined ? String(entry.tool_call_id) : undefined;
|
|
190
|
+
if (!tool_call_id)
|
|
191
|
+
tool_call_id = inferToolCallId();
|
|
192
|
+
if ("json" in entry && entry.json !== undefined) {
|
|
193
|
+
return { role: "tool", tool_call_id, name, content: JSON.stringify(entry.json) };
|
|
194
|
+
}
|
|
195
|
+
if ("content" in entry && entry.content !== undefined) {
|
|
196
|
+
return { role: "tool", tool_call_id, name, content: String(entry.content) };
|
|
197
|
+
}
|
|
198
|
+
throw new Error(`${where} must include either 'json' or 'content'.`);
|
|
199
|
+
}
|
|
200
|
+
function normalizeNextAssistantExpect(expect, where) {
|
|
201
|
+
if (!expect || typeof expect !== "object")
|
|
202
|
+
throw new Error(`${where} must be an object.`);
|
|
203
|
+
const tool_calls = expect.tool_calls;
|
|
204
|
+
const tool_results = expect.tool_results;
|
|
205
|
+
const out = {};
|
|
206
|
+
const assistant = {};
|
|
207
|
+
if (expect.content !== undefined)
|
|
208
|
+
assistant.content = String(expect.content);
|
|
209
|
+
if (expect.content_match !== undefined)
|
|
210
|
+
assistant.content_match = expect.content_match;
|
|
211
|
+
if (expect.llm !== undefined)
|
|
212
|
+
assistant.llm = String(expect.llm);
|
|
213
|
+
if (assistant.content !== undefined || assistant.llm !== undefined)
|
|
214
|
+
out.assistant = assistant;
|
|
215
|
+
if (expect.tool_calls_match !== undefined)
|
|
216
|
+
out.tool_calls_match = expect.tool_calls_match;
|
|
217
|
+
if (tool_calls) {
|
|
218
|
+
out.tool_calls = tool_calls.map((tc, i) => {
|
|
219
|
+
const normalized2 = normalizeToolCallSource(tc, `${where}.tool_calls[${i}]`);
|
|
220
|
+
const entry = { name: normalized2.name };
|
|
221
|
+
if (normalized2.args !== undefined)
|
|
222
|
+
entry.arguments = normalized2.args;
|
|
223
|
+
return entry;
|
|
224
|
+
});
|
|
225
|
+
if (out.tool_calls_match === undefined)
|
|
226
|
+
out.tool_calls_match = "contains";
|
|
227
|
+
}
|
|
228
|
+
if (expect.tool_results_match !== undefined)
|
|
229
|
+
out.tool_results_match = expect.tool_results_match;
|
|
230
|
+
if (tool_results) {
|
|
231
|
+
out.tool_results = tool_results.map((tr, i) => {
|
|
232
|
+
const whereItem = `${where}.tool_results[${i}]`;
|
|
233
|
+
if (!tr || typeof tr !== "object")
|
|
234
|
+
throw new Error(`${whereItem} must be an object.`);
|
|
235
|
+
if ("name" in tr || "tool_call_id" in tr || "content" in tr || "content_json" in tr) {
|
|
236
|
+
const e = tr;
|
|
237
|
+
const entry = {};
|
|
238
|
+
if (e.name !== undefined)
|
|
239
|
+
entry.name = String(e.name);
|
|
240
|
+
if (e.tool_call_id !== undefined)
|
|
241
|
+
entry.tool_call_id = String(e.tool_call_id);
|
|
242
|
+
if (e.content !== undefined)
|
|
243
|
+
entry.content = String(e.content);
|
|
244
|
+
if (e.content_match !== undefined)
|
|
245
|
+
entry.content_match = e.content_match;
|
|
246
|
+
if (e.content_json !== undefined)
|
|
247
|
+
entry.content_json = e.content_json;
|
|
248
|
+
return entry;
|
|
249
|
+
}
|
|
250
|
+
const keys = Object.keys(tr);
|
|
251
|
+
if (keys.length !== 1)
|
|
252
|
+
throw new Error(`${whereItem} must be { name: ..., ... } or { toolName: { ...jsonSubset } }.`);
|
|
253
|
+
const name = keys[0];
|
|
254
|
+
const content_json = tr[name];
|
|
255
|
+
if (!content_json || typeof content_json !== "object")
|
|
256
|
+
throw new Error(`${whereItem}.${name} must be an object.`);
|
|
257
|
+
return { name, content_json };
|
|
258
|
+
});
|
|
259
|
+
if (out.tool_results_match === undefined)
|
|
260
|
+
out.tool_results_match = "contains";
|
|
261
|
+
}
|
|
262
|
+
return out;
|
|
263
|
+
}
|
|
264
|
+
function normalizeTranscript(entries, where) {
|
|
265
|
+
if (!Array.isArray(entries))
|
|
266
|
+
throw new Error(`${where} must be an array.`);
|
|
267
|
+
if (entries.length === 0)
|
|
268
|
+
throw new Error(`${where} must not be empty.`);
|
|
269
|
+
const last2 = entries[entries.length - 1];
|
|
270
|
+
if (!last2 || typeof last2 !== "object" || !("next_assistant" in last2)) {
|
|
271
|
+
throw new Error(`${where} must end with { next_assistant: ... }.`);
|
|
272
|
+
}
|
|
273
|
+
let callCounter = 0;
|
|
274
|
+
const seenToolCallIds = new Set;
|
|
275
|
+
const nextCallId = (preferred) => {
|
|
276
|
+
const id = preferred ?? `call_${++callCounter}`;
|
|
277
|
+
if (!seenToolCallIds.has(id)) {
|
|
278
|
+
seenToolCallIds.add(id);
|
|
279
|
+
return id;
|
|
280
|
+
}
|
|
281
|
+
if (preferred)
|
|
282
|
+
return preferred;
|
|
283
|
+
throw new Error(`${where}: generated duplicate tool call id: ${id}`);
|
|
284
|
+
};
|
|
285
|
+
const inferSingleToolCallId = () => {
|
|
286
|
+
if (seenToolCallIds.size !== 1) {
|
|
287
|
+
throw new Error(`${where}: tool entry is missing tool_call_id and it cannot be inferred.`);
|
|
288
|
+
}
|
|
289
|
+
return [...seenToolCallIds][0];
|
|
290
|
+
};
|
|
291
|
+
const messages = [];
|
|
292
|
+
for (let i = 0;i < entries.length - 1; i++) {
|
|
293
|
+
const entry = entries[i];
|
|
294
|
+
const whereEntry = `${where}[${i}]`;
|
|
295
|
+
if (!entry || typeof entry !== "object")
|
|
296
|
+
throw new Error(`${whereEntry} must be an object.`);
|
|
297
|
+
if ("system" in entry) {
|
|
298
|
+
messages.push({ role: "system", content: String(entry.system) });
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
if ("user" in entry) {
|
|
302
|
+
messages.push({ role: "user", content: String(entry.user) });
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
if ("assistant" in entry) {
|
|
306
|
+
const a = entry.assistant;
|
|
307
|
+
if (typeof a === "string") {
|
|
308
|
+
messages.push({ role: "assistant", content: a });
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
if (!a || typeof a !== "object")
|
|
312
|
+
throw new Error(`${whereEntry}.assistant must be a string or object.`);
|
|
313
|
+
const tool_calls = normalizeToolCallsForMessage(a.tool_calls, nextCallId);
|
|
314
|
+
const msg = {
|
|
315
|
+
role: "assistant",
|
|
316
|
+
content: a.content !== undefined ? String(a.content) : "",
|
|
317
|
+
tool_calls
|
|
318
|
+
};
|
|
319
|
+
messages.push(msg);
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
if ("tool" in entry) {
|
|
323
|
+
const tool = normalizeTranscriptTool(entry.tool, `${whereEntry}.tool`, inferSingleToolCallId);
|
|
324
|
+
messages.push(tool);
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
throw new Error(`${whereEntry} must be one of: system, user, assistant, tool.`);
|
|
328
|
+
}
|
|
329
|
+
const expect = normalizeNextAssistantExpect(last2.next_assistant, `${where}[${entries.length - 1}].next_assistant`);
|
|
330
|
+
return { messages, expect };
|
|
331
|
+
}
|
|
332
|
+
normalized.fixtures = file.fixtures.map((fixture, index) => {
|
|
149
333
|
if (!fixture || typeof fixture !== "object")
|
|
150
334
|
throw new Error(`fixtures[${index}] must be an object.`);
|
|
151
335
|
if (!("id" in fixture))
|
|
152
336
|
throw new Error(`fixtures[${index}].id is required.`);
|
|
153
|
-
if (!("
|
|
154
|
-
throw new Error(`fixtures[${index}].
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
out.expect.tool_calls_match = "contains";
|
|
337
|
+
if (!("transcript" in fixture))
|
|
338
|
+
throw new Error(`fixtures[${index}].transcript is required.`);
|
|
339
|
+
const id = String(fixture.id);
|
|
340
|
+
const transcript = fixture.transcript;
|
|
341
|
+
const { messages, expect } = normalizeTranscript(transcript, `fixtures[${index}].transcript`);
|
|
342
|
+
const out = { id, messages, expect };
|
|
343
|
+
if (fixture.agent)
|
|
344
|
+
out.agent = normalizeAgentSpec(fixture.agent, env);
|
|
162
345
|
return out;
|
|
163
346
|
});
|
|
164
347
|
return normalized;
|
|
@@ -302,7 +485,7 @@ ${stderrText}` : ""));
|
|
|
302
485
|
if (isError(payload))
|
|
303
486
|
throw new Error(payload.error.message);
|
|
304
487
|
if (!isSuccess(payload)) {
|
|
305
|
-
throw new Error(`Agent response must be { "message": { ... } } or { "error": { "message": ... } }.`);
|
|
488
|
+
throw new Error(`Agent response must be { "message": { ... }, "tool_messages"?: [...] } or { "error": { "message": ... } }.`);
|
|
306
489
|
}
|
|
307
490
|
return payload;
|
|
308
491
|
} finally {
|
|
@@ -519,9 +702,8 @@ async function runFixtureFile(path, options = {}) {
|
|
|
519
702
|
for (const fixture of file.fixtures) {
|
|
520
703
|
try {
|
|
521
704
|
const agent = pickAgentSpec(file, fixture);
|
|
522
|
-
const messages = [...fixture.history ?? [], { role: "user", content: fixture.input }];
|
|
523
705
|
const res = await callSubprocessAgent(agent, {
|
|
524
|
-
messages,
|
|
706
|
+
messages: fixture.messages,
|
|
525
707
|
tools: [],
|
|
526
708
|
tool_choice: "auto"
|
|
527
709
|
});
|
|
@@ -547,4 +729,4 @@ export {
|
|
|
547
729
|
createMockWeatherAgent
|
|
548
730
|
};
|
|
549
731
|
|
|
550
|
-
//# debugId=
|
|
732
|
+
//# debugId=305B5B519951154364756E2164756E21
|
package/dist/index.js.map
CHANGED
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import type { AssistantMessage, ChatAgent, ChatMessage, ToolMessage } from \"./types\";\n\nfunction last<T>(items: T[]): T | undefined {\n return items.length > 0 ? items[items.length - 1] : undefined;\n}\n\nfunction findLatestToolMessage(messages: ChatMessage[], toolName: string): ToolMessage | undefined {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (!message) continue;\n if (message.role === \"tool\" && message.name === toolName) return message;\n }\n return undefined;\n}\n\nfunction tryParseJson<T>(value: string): T | undefined {\n try {\n return JSON.parse(value) as T;\n } catch {\n return undefined;\n }\n}\n\nexport type MockWeatherAgentOptions = {\n toolName?: string;\n};\n\nexport function createMockWeatherAgent(options: MockWeatherAgentOptions = {}): ChatAgent {\n const toolName = options.toolName ?? \"get_weather\";\n let callCounter = 0;\n\n return async ({ messages }) => {\n const latest = last(messages);\n if (!latest || latest.role !== \"user\") {\n return { role: \"assistant\", content: \"Send a user message to continue.\" };\n }\n\n const userText = latest.content.toLowerCase();\n\n if (userText.includes(\"weather\")) {\n callCounter += 1;\n return {\n role: \"assistant\",\n content: \"\",\n tool_calls: [\n {\n id: `call_${callCounter}`,\n type: \"function\",\n function: {\n name: toolName,\n arguments: JSON.stringify({ location: \"Dublin\", unit: \"c\" }),\n },\n },\n ],\n };\n }\n\n if (userText.includes(\"umbrella\")) {\n const toolMessage = findLatestToolMessage(messages, toolName);\n const payload = toolMessage ? tryParseJson<{ temp_c?: number; condition?: string }>(toolMessage.content) : undefined;\n const condition = payload?.condition?.toLowerCase();\n\n if (condition?.includes(\"rain\")) {\n return { role: \"assistant\", content: \"Yes—bring an umbrella. The forecast shows rain.\" };\n }\n if (toolMessage) {\n return { role: \"assistant\", content: \"Probably yes—better to be prepared based on the forecast.\" };\n }\n return {\n role: \"assistant\",\n content: \"\",\n tool_calls: [\n {\n id: `call_${++callCounter}`,\n type: \"function\",\n function: { name: toolName, arguments: JSON.stringify({ location: \"Dublin\", unit: \"c\" }) },\n },\n ],\n };\n }\n\n const reply: AssistantMessage = { role: \"assistant\", content: \"OK.\" };\n return reply;\n };\n}\n",
|
|
6
6
|
"import type { AssistantMessage, ChatAgent, ChatAgentRequest } from \"./types\";\n\nexport type OpenAIChatAgentOptions = {\n apiKey?: string;\n baseUrl?: string;\n defaultModel?: string;\n};\n\ntype OpenAIChatCompletionResponse = {\n choices: Array<{\n message: AssistantMessage;\n }>;\n};\n\nexport function createOpenAIChatAgent(options: OpenAIChatAgentOptions = {}): ChatAgent {\n const apiKey = options.apiKey ?? process.env.OPENAI_API_KEY;\n const baseUrl = options.baseUrl ?? process.env.OPENAI_BASE_URL ?? \"https://api.openai.com/v1\";\n const defaultModel = options.defaultModel ?? process.env.OPENAI_MODEL ?? \"gpt-4o-mini\";\n\n if (!apiKey) {\n throw new Error(\"Missing OPENAI_API_KEY (or pass { apiKey }).\");\n }\n\n return async (req: ChatAgentRequest) => {\n const model = req.model ?? defaultModel;\n const res = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model,\n messages: req.messages,\n tools: req.tools,\n tool_choice: req.tool_choice,\n }),\n });\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`OpenAI chat.completions failed: ${res.status} ${res.statusText}${body ? `\\n${body}` : \"\"}`);\n }\n\n const data = (await res.json()) as OpenAIChatCompletionResponse;\n const message = data.choices?.[0]?.message;\n if (!message) throw new Error(\"OpenAI chat.completions returned no message.\");\n return message;\n };\n}\n",
|
|
7
|
-
"import { parse as parseYaml } from \"yaml\";\nimport type { AgentSpec, FixtureFile } from \"./types\";\n\nfunction expandEnvVars(value: string, env: Record<string, string | undefined>): string {\n return value.replace(/\\$\\{([A-Z0-9_]+)\\}/gi, (_, key: string) => env[key] ?? \"\");\n}\n\nfunction normalizeAgentSpec(raw: AgentSpec, env: Record<string, string | undefined>): AgentSpec {\n const normalized: AgentSpec = { ...raw };\n\n if (normalized.type === undefined) normalized.type = \"subprocess\";\n if (!Array.isArray(normalized.command) || normalized.command.length === 0) {\n throw new Error(\"`agent.command` must be a non-empty array of strings.\");\n }\n\n normalized.command = normalized.command.map((part) => String(part));\n\n if (normalized.cwd !== undefined) normalized.cwd = String(normalized.cwd);\n if (normalized.timeout_ms !== undefined) normalized.timeout_ms = Number(normalized.timeout_ms);\n\n if (normalized.env) {\n const expanded: Record<string, string> = {};\n for (const [k, v] of Object.entries(normalized.env)) {\n expanded[k] = expandEnvVars(String(v), env);\n }\n normalized.env = expanded;\n }\n\n return normalized;\n}\n\nexport function loadFixtureFile(yamlText: string, env: Record<string, string | undefined> = process.env): FixtureFile {\n const data = parseYaml(yamlText) as unknown;\n if (!data || typeof data !== \"object\") throw new Error(\"Fixture file must be a YAML object.\");\n\n const file = data as Partial<FixtureFile>;\n if (!Array.isArray(file.fixtures)) throw new Error(\"Fixture file must contain `fixtures: [...]`.\");\n\n const normalized: FixtureFile = {\n fixtures: file.fixtures as FixtureFile[\"fixtures\"],\n };\n\n if (file.agent) normalized.agent = normalizeAgentSpec(file.agent as AgentSpec, env);\n\n normalized.fixtures = normalized.fixtures.map((fixture, index) => {\n if (!fixture || typeof fixture !== \"object\") throw new Error(`fixtures[${index}] must be an object.`);\n if (!(\"id\" in fixture)) throw new Error(`fixtures[${index}].id is required.`);\n if (!(\"input\" in fixture)) throw new Error(`fixtures[${index}].input is required.`);\n\n const out = { ...fixture } as any;\n out.id = String(out.id);\n out.input = String(out.input);\n\n if (out.agent) out.agent = normalizeAgentSpec(out.agent as AgentSpec, env);\n if (out.expect?.tool_calls_match === undefined && out.expect?.tool_calls) out.expect.tool_calls_match = \"contains\";\n\n return out;\n });\n\n return normalized;\n}\n",
|
|
8
|
-
"import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { AssistantMessage, ToolMessage } from \"../agent/types\";\nimport { loadFixtureFile } from \"../fixture/load\";\nimport type { AgentSpec, Fixture, FixtureFile } from \"../fixture/types\";\nimport { createOpenAIJudge } from \"../judge/openaiJudge\";\nimport { callSubprocessAgent } from \"./subprocessAgent\";\nimport type { ExpectationResult, Judge } from \"./expectations\";\nimport { evaluateExpectations } from \"./expectations\";\n\nexport type JudgeMode = \"off\" | \"auto\" | \"on\";\n\nexport type RunOptions = {\n judgeMode?: JudgeMode;\n judgeModel?: string;\n};\n\nexport type FixtureResult = {\n id: string;\n status: \"pass\" | \"fail\" | \"skip\";\n reason?: string;\n message?: AssistantMessage;\n tool_messages?: ToolMessage[];\n};\n\nexport type FixtureFileResult = {\n path: string;\n results: FixtureResult[];\n};\n\nfunction pickAgentSpec(file: FixtureFile, fixture: Fixture): AgentSpec {\n const agent = fixture.agent ?? file.agent;\n if (!agent) throw new Error(`Fixture '${fixture.id}' has no agent. Add file-level 'agent:' or fixture-level 'agent:'.`);\n if ((agent.type ?? \"subprocess\") !== \"subprocess\") throw new Error(`Unsupported agent type: ${agent.type}`);\n return agent;\n}\n\nfunction makeJudge(mode: JudgeMode, model?: string): Judge | undefined {\n if (mode === \"off\") return undefined;\n\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n if (mode === \"on\") throw new Error(\"Judge mode is 'on' but OPENAI_API_KEY is not set.\");\n return undefined;\n }\n\n return createOpenAIJudge({ apiKey, model });\n}\n\nexport async function runFixtureFile(path: string, options: RunOptions = {}): Promise<FixtureFileResult> {\n const absolute = resolve(path);\n const yamlText = await readFile(absolute, \"utf8\");\n const file = loadFixtureFile(yamlText);\n\n const judgeMode = options.judgeMode ?? \"auto\";\n const judge = makeJudge(judgeMode, options.judgeModel);\n\n const results: FixtureResult[] = [];\n\n for (const fixture of file.fixtures) {\n try {\n const agent = pickAgentSpec(file, fixture);\n const
|
|
7
|
+
"import { parse as parseYaml } from \"yaml\";\nimport type {\n AgentSpec,\n Fixture,\n FixtureExpectation,\n FixtureFile,\n FixtureFileSource,\n NextAssistantExpectationSource,\n ToolCallExpectation,\n ToolResultExpectation,\n TranscriptEntrySource,\n TranscriptToolCallSource,\n TranscriptToolSource,\n} from \"./types\";\nimport type { AssistantMessage, ChatMessage, ToolCall, ToolMessage } from \"../agent/types\";\n\nfunction expandEnvVars(value: string, env: Record<string, string | undefined>): string {\n return value.replace(/\\$\\{([A-Z0-9_]+)\\}/gi, (_, key: string) => env[key] ?? \"\");\n}\n\nfunction normalizeAgentSpec(raw: AgentSpec, env: Record<string, string | undefined>): AgentSpec {\n const normalized: AgentSpec = { ...raw };\n\n if (normalized.type === undefined) normalized.type = \"subprocess\";\n if (!Array.isArray(normalized.command) || normalized.command.length === 0) {\n throw new Error(\"`agent.command` must be a non-empty array of strings.\");\n }\n\n normalized.command = normalized.command.map((part) => String(part));\n\n if (normalized.cwd !== undefined) normalized.cwd = String(normalized.cwd);\n if (normalized.timeout_ms !== undefined) normalized.timeout_ms = Number(normalized.timeout_ms);\n\n if (normalized.env) {\n const expanded: Record<string, string> = {};\n for (const [k, v] of Object.entries(normalized.env)) {\n expanded[k] = expandEnvVars(String(v), env);\n }\n normalized.env = expanded;\n }\n\n return normalized;\n}\n\nexport function loadFixtureFile(yamlText: string, env: Record<string, string | undefined> = process.env): FixtureFile {\n const data = parseYaml(yamlText) as unknown;\n if (!data || typeof data !== \"object\") throw new Error(\"Fixture file must be a YAML object.\");\n\n const file = data as Partial<FixtureFileSource>;\n if (!Array.isArray(file.fixtures)) throw new Error(\"Fixture file must contain `fixtures: [...]`.\");\n\n const normalized: FixtureFile = {\n fixtures: [],\n };\n\n if (file.agent) normalized.agent = normalizeAgentSpec(file.agent as AgentSpec, env);\n\n function normalizeToolCallSource(entry: TranscriptToolCallSource, where: string): { id?: string; name: string; args?: Record<string, unknown> } {\n if (!entry || typeof entry !== \"object\") throw new Error(`${where} must be an object.`);\n\n if (\"name\" in entry) {\n const e = entry as any;\n return {\n id: e.id !== undefined ? String(e.id) : undefined,\n name: String(e.name),\n args: e.args !== undefined ? (e.args as Record<string, unknown>) : undefined,\n };\n }\n\n const keys = Object.keys(entry);\n if (keys.length !== 1) throw new Error(`${where} must be { name: ..., args: ... } or { toolName: { ...args } }.`);\n const name = keys[0]!;\n const args = (entry as any)[name];\n if (!args || typeof args !== \"object\") throw new Error(`${where}.${name} must be an object of args.`);\n return { name, args: args as Record<string, unknown> };\n }\n\n function normalizeToolCallsForMessage(\n toolCalls: TranscriptToolCallSource[] | undefined,\n callId: (preferred?: string) => string\n ): ToolCall[] | undefined {\n if (!toolCalls || toolCalls.length === 0) return undefined;\n const out: ToolCall[] = [];\n for (let i = 0; i < toolCalls.length; i++) {\n const tc = normalizeToolCallSource(toolCalls[i]!, `tool_calls[${i}]`);\n out.push({\n id: callId(tc.id),\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args ?? {}),\n },\n });\n }\n return out;\n }\n\n function normalizeTranscriptTool(entry: TranscriptToolSource, where: string, inferToolCallId: () => string): ToolMessage {\n if (!entry || typeof entry !== \"object\") throw new Error(`${where} must be an object.`);\n const name = String((entry as any).name);\n\n let tool_call_id: string | undefined = (entry as any).tool_call_id !== undefined ? String((entry as any).tool_call_id) : undefined;\n if (!tool_call_id) tool_call_id = inferToolCallId();\n\n if (\"json\" in entry && entry.json !== undefined) {\n return { role: \"tool\", tool_call_id, name, content: JSON.stringify(entry.json) };\n }\n\n if (\"content\" in entry && entry.content !== undefined) {\n return { role: \"tool\", tool_call_id, name, content: String(entry.content) };\n }\n\n throw new Error(`${where} must include either 'json' or 'content'.`);\n }\n\n function normalizeNextAssistantExpect(expect: NextAssistantExpectationSource, where: string): FixtureExpectation {\n if (!expect || typeof expect !== \"object\") throw new Error(`${where} must be an object.`);\n\n const tool_calls = (expect as any).tool_calls as TranscriptToolCallSource[] | undefined;\n const tool_results = (expect as any).tool_results as any[] | undefined;\n\n const out: FixtureExpectation = {};\n\n const assistant: FixtureExpectation[\"assistant\"] = {};\n if ((expect as any).content !== undefined) assistant.content = String((expect as any).content);\n if ((expect as any).content_match !== undefined) assistant.content_match = (expect as any).content_match;\n if ((expect as any).llm !== undefined) assistant.llm = String((expect as any).llm);\n if (assistant.content !== undefined || assistant.llm !== undefined) out.assistant = assistant;\n\n if ((expect as any).tool_calls_match !== undefined) out.tool_calls_match = (expect as any).tool_calls_match;\n if (tool_calls) {\n out.tool_calls = tool_calls.map((tc, i) => {\n const normalized = normalizeToolCallSource(tc, `${where}.tool_calls[${i}]`);\n const entry: ToolCallExpectation = { name: normalized.name };\n if (normalized.args !== undefined) entry.arguments = normalized.args;\n return entry;\n });\n if (out.tool_calls_match === undefined) out.tool_calls_match = \"contains\";\n }\n\n if ((expect as any).tool_results_match !== undefined) out.tool_results_match = (expect as any).tool_results_match;\n if (tool_results) {\n out.tool_results = tool_results.map((tr, i) => {\n const whereItem = `${where}.tool_results[${i}]`;\n if (!tr || typeof tr !== \"object\") throw new Error(`${whereItem} must be an object.`);\n\n if (\"name\" in tr || \"tool_call_id\" in tr || \"content\" in tr || \"content_json\" in tr) {\n const e = tr as any;\n const entry: ToolResultExpectation = {};\n if (e.name !== undefined) entry.name = String(e.name);\n if (e.tool_call_id !== undefined) entry.tool_call_id = String(e.tool_call_id);\n if (e.content !== undefined) entry.content = String(e.content);\n if (e.content_match !== undefined) entry.content_match = e.content_match;\n if (e.content_json !== undefined) entry.content_json = e.content_json as Record<string, unknown>;\n return entry;\n }\n\n const keys = Object.keys(tr);\n if (keys.length !== 1) throw new Error(`${whereItem} must be { name: ..., ... } or { toolName: { ...jsonSubset } }.`);\n const name = keys[0]!;\n const content_json = (tr as any)[name];\n if (!content_json || typeof content_json !== \"object\") throw new Error(`${whereItem}.${name} must be an object.`);\n return { name, content_json: content_json as Record<string, unknown> };\n });\n if (out.tool_results_match === undefined) out.tool_results_match = \"contains\";\n }\n\n return out;\n }\n\n function normalizeTranscript(entries: TranscriptEntrySource[], where: string): { messages: ChatMessage[]; expect: FixtureExpectation } {\n if (!Array.isArray(entries)) throw new Error(`${where} must be an array.`);\n if (entries.length === 0) throw new Error(`${where} must not be empty.`);\n\n const last = entries[entries.length - 1] as any;\n if (!last || typeof last !== \"object\" || !(\"next_assistant\" in last)) {\n throw new Error(`${where} must end with { next_assistant: ... }.`);\n }\n\n let callCounter = 0;\n const seenToolCallIds = new Set<string>();\n\n const nextCallId = (preferred?: string) => {\n const id = preferred ?? `call_${++callCounter}`;\n if (!seenToolCallIds.has(id)) {\n seenToolCallIds.add(id);\n return id;\n }\n if (preferred) return preferred;\n throw new Error(`${where}: generated duplicate tool call id: ${id}`);\n };\n\n const inferSingleToolCallId = () => {\n if (seenToolCallIds.size !== 1) {\n throw new Error(`${where}: tool entry is missing tool_call_id and it cannot be inferred.`);\n }\n return [...seenToolCallIds][0]!;\n };\n\n const messages: ChatMessage[] = [];\n\n for (let i = 0; i < entries.length - 1; i++) {\n const entry = entries[i] as any;\n const whereEntry = `${where}[${i}]`;\n if (!entry || typeof entry !== \"object\") throw new Error(`${whereEntry} must be an object.`);\n\n if (\"system\" in entry) {\n messages.push({ role: \"system\", content: String(entry.system) });\n continue;\n }\n\n if (\"user\" in entry) {\n messages.push({ role: \"user\", content: String(entry.user) });\n continue;\n }\n\n if (\"assistant\" in entry) {\n const a = entry.assistant;\n if (typeof a === \"string\") {\n messages.push({ role: \"assistant\", content: a });\n continue;\n }\n if (!a || typeof a !== \"object\") throw new Error(`${whereEntry}.assistant must be a string or object.`);\n const tool_calls = normalizeToolCallsForMessage((a as any).tool_calls, nextCallId);\n const msg: AssistantMessage = {\n role: \"assistant\",\n content: (a as any).content !== undefined ? String((a as any).content) : \"\",\n tool_calls,\n };\n messages.push(msg);\n continue;\n }\n\n if (\"tool\" in entry) {\n const tool = normalizeTranscriptTool(entry.tool as TranscriptToolSource, `${whereEntry}.tool`, inferSingleToolCallId);\n messages.push(tool);\n continue;\n }\n\n throw new Error(`${whereEntry} must be one of: system, user, assistant, tool.`);\n }\n\n const expect = normalizeNextAssistantExpect((last as any).next_assistant, `${where}[${entries.length - 1}].next_assistant`);\n return { messages, expect };\n }\n\n normalized.fixtures = (file.fixtures as FixtureFileSource[\"fixtures\"]).map((fixture, index) => {\n if (!fixture || typeof fixture !== \"object\") throw new Error(`fixtures[${index}] must be an object.`);\n if (!(\"id\" in fixture)) throw new Error(`fixtures[${index}].id is required.`);\n if (!(\"transcript\" in fixture)) throw new Error(`fixtures[${index}].transcript is required.`);\n\n const id = String((fixture as any).id);\n const transcript = (fixture as any).transcript as TranscriptEntrySource[];\n const { messages, expect } = normalizeTranscript(transcript, `fixtures[${index}].transcript`);\n\n const out: Fixture = { id, messages, expect };\n if ((fixture as any).agent) out.agent = normalizeAgentSpec((fixture as any).agent as AgentSpec, env);\n return out;\n });\n\n return normalized;\n}\n",
|
|
8
|
+
"import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { AssistantMessage, ToolMessage } from \"../agent/types\";\nimport { loadFixtureFile } from \"../fixture/load\";\nimport type { AgentSpec, Fixture, FixtureFile } from \"../fixture/types\";\nimport { createOpenAIJudge } from \"../judge/openaiJudge\";\nimport { callSubprocessAgent } from \"./subprocessAgent\";\nimport type { ExpectationResult, Judge } from \"./expectations\";\nimport { evaluateExpectations } from \"./expectations\";\n\nexport type JudgeMode = \"off\" | \"auto\" | \"on\";\n\nexport type RunOptions = {\n judgeMode?: JudgeMode;\n judgeModel?: string;\n};\n\nexport type FixtureResult = {\n id: string;\n status: \"pass\" | \"fail\" | \"skip\";\n reason?: string;\n message?: AssistantMessage;\n tool_messages?: ToolMessage[];\n};\n\nexport type FixtureFileResult = {\n path: string;\n results: FixtureResult[];\n};\n\nfunction pickAgentSpec(file: FixtureFile, fixture: Fixture): AgentSpec {\n const agent = fixture.agent ?? file.agent;\n if (!agent) throw new Error(`Fixture '${fixture.id}' has no agent. Add file-level 'agent:' or fixture-level 'agent:'.`);\n if ((agent.type ?? \"subprocess\") !== \"subprocess\") throw new Error(`Unsupported agent type: ${agent.type}`);\n return agent;\n}\n\nfunction makeJudge(mode: JudgeMode, model?: string): Judge | undefined {\n if (mode === \"off\") return undefined;\n\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n if (mode === \"on\") throw new Error(\"Judge mode is 'on' but OPENAI_API_KEY is not set.\");\n return undefined;\n }\n\n return createOpenAIJudge({ apiKey, model });\n}\n\nexport async function runFixtureFile(path: string, options: RunOptions = {}): Promise<FixtureFileResult> {\n const absolute = resolve(path);\n const yamlText = await readFile(absolute, \"utf8\");\n const file = loadFixtureFile(yamlText);\n\n const judgeMode = options.judgeMode ?? \"auto\";\n const judge = makeJudge(judgeMode, options.judgeModel);\n\n const results: FixtureResult[] = [];\n\n for (const fixture of file.fixtures) {\n try {\n const agent = pickAgentSpec(file, fixture);\n const res = await callSubprocessAgent(agent, {\n messages: fixture.messages,\n tools: [],\n tool_choice: \"auto\",\n });\n\n const expectation = await evaluateExpectations(fixture.expect, res, judge);\n results.push({\n id: fixture.id,\n status: expectation.status,\n reason: (expectation as Extract<ExpectationResult, { status: \"fail\" | \"skip\" }>).reason,\n message: res.message,\n tool_messages: res.tool_messages,\n });\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n results.push({ id: fixture.id, status: \"fail\", reason });\n }\n }\n\n return { path: absolute, results };\n}\n",
|
|
9
9
|
"import type { AssistantMessage } from \"../agent/types\";\nimport type { ExpectationResult } from \"../runner/expectations\";\n\nexport type OpenAIJudgeOptions = {\n apiKey: string;\n baseUrl?: string;\n model?: string;\n};\n\ntype JudgeResponse = { pass: boolean; reason: string };\n\nexport function createOpenAIJudge(options: OpenAIJudgeOptions) {\n const baseUrl = options.baseUrl ?? process.env.OPENAI_BASE_URL ?? \"https://api.openai.com/v1\";\n const model = options.model ?? process.env.OPENAI_JUDGE_MODEL ?? \"gpt-4o-mini\";\n\n return async ({ expectation, message }: { expectation: string; message: AssistantMessage }): Promise<ExpectationResult> => {\n const system =\n \"You are a strict test evaluator. Decide if the assistant message satisfies the expectation. \" +\n \"Respond with ONLY valid JSON: {\\\"pass\\\": boolean, \\\"reason\\\": string}.\";\n\n const user = JSON.stringify(\n {\n expectation,\n assistant_message: message,\n },\n null,\n 2\n );\n\n const res = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model,\n temperature: 0,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n }),\n });\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n return {\n status: \"fail\",\n reason: `Judge call failed: ${res.status} ${res.statusText}${body ? `\\n${body}` : \"\"}`,\n };\n }\n\n const data = (await res.json()) as any;\n const content = data?.choices?.[0]?.message?.content;\n if (typeof content !== \"string\" || content.trim().length === 0) {\n return { status: \"fail\", reason: \"Judge returned no content.\" };\n }\n\n let parsed: JudgeResponse;\n try {\n parsed = JSON.parse(content) as JudgeResponse;\n } catch {\n return { status: \"fail\", reason: `Judge did not return valid JSON.\\n${content}` };\n }\n\n if (parsed.pass) return { status: \"pass\" };\n return { status: \"fail\", reason: parsed.reason || \"Expectation not satisfied.\" };\n };\n}\n",
|
|
10
|
-
"import type { AssistantMessage, ChatAgentRequest, ToolMessage } from \"../agent/types\";\nimport type { AgentSpec } from \"../fixture/types\";\n\nexport type SubprocessAgentResponse = { message: AssistantMessage; tool_messages?: ToolMessage[] };\ntype AgentProcessError = { error: { message: string } };\n\nfunction isSuccess(value: unknown): value is SubprocessAgentResponse {\n return !!value && typeof value === \"object\" && \"message\" in (value as any);\n}\n\nfunction isError(value: unknown): value is AgentProcessError {\n return !!value && typeof value === \"object\" && \"error\" in (value as any);\n}\n\nasync function readFirstNonEmptyLine(stream: ReadableStream<Uint8Array>, timeoutMs: number): Promise<string> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const deadline = Date.now() + timeoutMs;\n\n type ReadResult = { value?: Uint8Array; done: boolean };\n\n while (true) {\n const timeLeft = deadline - Date.now();\n if (timeLeft <= 0) throw new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`);\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timerPromise = new Promise<never>((_, reject) => {\n timerId = setTimeout(() => reject(new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`)), timeLeft);\n });\n\n let chunk: ReadResult;\n try {\n chunk = await Promise.race([reader.read(), timerPromise]);\n } finally {\n if (timerId !== undefined) clearTimeout(timerId);\n }\n\n const { value, done } = chunk;\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = buffer.indexOf(\"\\n\");\n if (idx === -1) break;\n const line = buffer.slice(0, idx).trim();\n buffer = buffer.slice(idx + 1);\n if (line.length > 0) return line;\n }\n }\n\n const tail = buffer.trim();\n if (tail.length > 0) return tail;\n throw new Error(\"Agent produced no output on stdout.\");\n}\n\nexport async function callSubprocessAgent(spec: AgentSpec, request: ChatAgentRequest): Promise<SubprocessAgentResponse> {\n const timeoutMs = spec.timeout_ms ?? 20_000;\n\n const proc = Bun.spawn(spec.command, {\n cwd: spec.cwd,\n env: { ...process.env, ...(spec.env ?? {}) },\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n\n const stdin = proc.stdin;\n if (!stdin) throw new Error(\"Failed to open agent stdin.\");\n\n stdin.write(`${JSON.stringify(request)}\\n`);\n stdin.end();\n\n let stderrText = \"\";\n const stderrPromise = (async () => {\n if (!proc.stderr) return;\n stderrText = await new Response(proc.stderr).text().catch(() => \"\");\n })();\n\n try {\n if (!proc.stdout) throw new Error(\"Failed to open agent stdout.\");\n const line = await readFirstNonEmptyLine(proc.stdout, timeoutMs);\n\n let payload: unknown;\n try {\n payload = JSON.parse(line) as unknown;\n } catch {\n throw new Error(\n `Agent stdout is not valid JSON.\\n` +\n `Line: ${line}\\n` +\n (stderrText ? `Stderr:\\n${stderrText}` : \"\")\n );\n }\n\n if (isError(payload)) throw new Error(payload.error.message);\n if (!isSuccess(payload)) {\n throw new Error(`Agent response must be { \"message\": { ... } } or { \"error\": { \"message\": ... } }
|
|
10
|
+
"import type { AssistantMessage, ChatAgentRequest, ToolMessage } from \"../agent/types\";\nimport type { AgentSpec } from \"../fixture/types\";\n\nexport type SubprocessAgentResponse = { message: AssistantMessage; tool_messages?: ToolMessage[] };\ntype AgentProcessError = { error: { message: string } };\n\nfunction isSuccess(value: unknown): value is SubprocessAgentResponse {\n return !!value && typeof value === \"object\" && \"message\" in (value as any);\n}\n\nfunction isError(value: unknown): value is AgentProcessError {\n return !!value && typeof value === \"object\" && \"error\" in (value as any);\n}\n\nasync function readFirstNonEmptyLine(stream: ReadableStream<Uint8Array>, timeoutMs: number): Promise<string> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const deadline = Date.now() + timeoutMs;\n\n type ReadResult = { value?: Uint8Array; done: boolean };\n\n while (true) {\n const timeLeft = deadline - Date.now();\n if (timeLeft <= 0) throw new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`);\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timerPromise = new Promise<never>((_, reject) => {\n timerId = setTimeout(() => reject(new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`)), timeLeft);\n });\n\n let chunk: ReadResult;\n try {\n chunk = await Promise.race([reader.read(), timerPromise]);\n } finally {\n if (timerId !== undefined) clearTimeout(timerId);\n }\n\n const { value, done } = chunk;\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = buffer.indexOf(\"\\n\");\n if (idx === -1) break;\n const line = buffer.slice(0, idx).trim();\n buffer = buffer.slice(idx + 1);\n if (line.length > 0) return line;\n }\n }\n\n const tail = buffer.trim();\n if (tail.length > 0) return tail;\n throw new Error(\"Agent produced no output on stdout.\");\n}\n\nexport async function callSubprocessAgent(spec: AgentSpec, request: ChatAgentRequest): Promise<SubprocessAgentResponse> {\n const timeoutMs = spec.timeout_ms ?? 20_000;\n\n const proc = Bun.spawn(spec.command, {\n cwd: spec.cwd,\n env: { ...process.env, ...(spec.env ?? {}) },\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n\n const stdin = proc.stdin;\n if (!stdin) throw new Error(\"Failed to open agent stdin.\");\n\n stdin.write(`${JSON.stringify(request)}\\n`);\n stdin.end();\n\n let stderrText = \"\";\n const stderrPromise = (async () => {\n if (!proc.stderr) return;\n stderrText = await new Response(proc.stderr).text().catch(() => \"\");\n })();\n\n try {\n if (!proc.stdout) throw new Error(\"Failed to open agent stdout.\");\n const line = await readFirstNonEmptyLine(proc.stdout, timeoutMs);\n\n let payload: unknown;\n try {\n payload = JSON.parse(line) as unknown;\n } catch {\n throw new Error(\n `Agent stdout is not valid JSON.\\n` +\n `Line: ${line}\\n` +\n (stderrText ? `Stderr:\\n${stderrText}` : \"\")\n );\n }\n\n if (isError(payload)) throw new Error(payload.error.message);\n if (!isSuccess(payload)) {\n throw new Error(\n `Agent response must be { \"message\": { ... }, \"tool_messages\"?: [...] } or { \"error\": { \"message\": ... } }.`\n );\n }\n\n return payload;\n } finally {\n proc.kill();\n await Promise.allSettled([proc.exited, stderrPromise]);\n }\n}\n",
|
|
11
11
|
"export function deepPartialMatch(expected: unknown, actual: unknown): boolean {\n if (expected === actual) return true;\n\n if (expected === null || actual === null) return expected === actual;\n\n const expectedType = typeof expected;\n const actualType = typeof actual;\n if (expectedType !== actualType) return false;\n\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual)) return false;\n if (expected.length !== actual.length) return false;\n for (let i = 0; i < expected.length; i++) {\n if (!deepPartialMatch(expected[i], actual[i])) return false;\n }\n return true;\n }\n\n if (expectedType === \"object\") {\n if (Array.isArray(actual)) return false;\n const expectedObj = expected as Record<string, unknown>;\n const actualObj = actual as Record<string, unknown>;\n for (const [key, expectedValue] of Object.entries(expectedObj)) {\n if (!(key in actualObj)) return false;\n if (!deepPartialMatch(expectedValue, actualObj[key])) return false;\n }\n return true;\n }\n\n return false;\n}\n\n",
|
|
12
12
|
"import type { AssistantMessage, ToolMessage } from \"../agent/types\";\nimport type { FixtureExpectation, ToolCallExpectation, ToolResultExpectation } from \"../fixture/types\";\nimport { deepPartialMatch } from \"./deepMatch\";\n\nexport type ExpectationResult =\n | { status: \"pass\" }\n | { status: \"fail\"; reason: string }\n | { status: \"skip\"; reason: string };\n\nfunction parseJsonOrUndefined(value: string): unknown | undefined {\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return undefined;\n }\n}\n\nfunction matchToolCall(expected: ToolCallExpectation, actual: NonNullable<AssistantMessage[\"tool_calls\"]>[number]): boolean {\n if (actual.function.name !== expected.name) return false;\n if (expected.arguments === undefined) return true;\n const actualArgs = parseJsonOrUndefined(actual.function.arguments);\n if (actualArgs === undefined) return false;\n return deepPartialMatch(expected.arguments, actualArgs);\n}\n\nfunction checkToolCalls(expect: FixtureExpectation, message: AssistantMessage): ExpectationResult {\n const expectedCalls = expect.tool_calls ?? [];\n if (expectedCalls.length === 0) return { status: \"pass\" };\n\n const actualCalls = message.tool_calls ?? [];\n const mode = expect.tool_calls_match ?? \"contains\";\n\n if (mode === \"contains\") {\n for (const expected of expectedCalls) {\n const ok = actualCalls.some((actual) => matchToolCall(expected, actual));\n if (!ok) {\n return {\n status: \"fail\",\n reason: `Expected tool call not found: ${expected.name}`,\n };\n }\n }\n return { status: \"pass\" };\n }\n\n if (actualCalls.length !== expectedCalls.length) {\n return {\n status: \"fail\",\n reason: `Expected exactly ${expectedCalls.length} tool call(s), got ${actualCalls.length}.`,\n };\n }\n\n for (let i = 0; i < expectedCalls.length; i++) {\n const expected = expectedCalls[i];\n const actual = actualCalls[i];\n if (!expected || !actual || !matchToolCall(expected, actual)) {\n return { status: \"fail\", reason: `Tool call mismatch at index ${i}.` };\n }\n }\n\n return { status: \"pass\" };\n}\n\nexport type Judge = (args: { expectation: string; message: AssistantMessage }) => Promise<ExpectationResult>;\n\ntype AgentTurn = { message: AssistantMessage; tool_messages?: ToolMessage[] };\n\nfunction matchToolResult(expected: ToolResultExpectation, actual: ToolMessage): boolean {\n if (expected.tool_call_id !== undefined && actual.tool_call_id !== expected.tool_call_id) return false;\n if (expected.name !== undefined && actual.name !== expected.name) return false;\n\n if (expected.content !== undefined) {\n const mode = expected.content_match ?? \"exact\";\n if (mode === \"exact\" && actual.content !== expected.content) return false;\n if (mode === \"contains\" && !actual.content.includes(expected.content)) return false;\n }\n\n if (expected.content_json !== undefined) {\n const actualJson = parseJsonOrUndefined(actual.content);\n if (actualJson === undefined) return false;\n if (!deepPartialMatch(expected.content_json, actualJson)) return false;\n }\n\n return true;\n}\n\nfunction checkToolResults(expect: FixtureExpectation, toolMessages: ToolMessage[]): ExpectationResult {\n const expectedResults = expect.tool_results ?? [];\n if (expectedResults.length === 0) return { status: \"pass\" };\n\n const mode = expect.tool_results_match ?? \"contains\";\n\n if (mode === \"contains\") {\n for (const expected of expectedResults) {\n if (!expected.name && !expected.tool_call_id) {\n return { status: \"fail\", reason: \"tool_results entries must include at least 'name' or 'tool_call_id'.\" };\n }\n\n const ok = toolMessages.some((actual) => matchToolResult(expected, actual));\n if (!ok) {\n return {\n status: \"fail\",\n reason: `Expected tool result not found${expected.name ? `: ${expected.name}` : \"\"}.`,\n };\n }\n }\n return { status: \"pass\" };\n }\n\n if (toolMessages.length !== expectedResults.length) {\n return {\n status: \"fail\",\n reason: `Expected exactly ${expectedResults.length} tool result(s), got ${toolMessages.length}.`,\n };\n }\n\n for (let i = 0; i < expectedResults.length; i++) {\n const expected = expectedResults[i];\n const actual = toolMessages[i];\n if (!expected || !actual || !matchToolResult(expected, actual)) {\n return { status: \"fail\", reason: `Tool result mismatch at index ${i}.` };\n }\n }\n\n return { status: \"pass\" };\n}\n\nfunction checkAssistantContent(expect: FixtureExpectation, message: AssistantMessage): ExpectationResult {\n const expected = expect.assistant?.content;\n if (expected === undefined) return { status: \"pass\" };\n\n const mode = expect.assistant?.content_match ?? \"contains\";\n if (mode === \"exact\") {\n if (message.content !== expected) return { status: \"fail\", reason: \"Assistant content did not match exactly.\" };\n return { status: \"pass\" };\n }\n\n if (!message.content.includes(expected)) return { status: \"fail\", reason: \"Assistant content did not contain expected text.\" };\n return { status: \"pass\" };\n}\n\nexport async function evaluateExpectations(\n expect: FixtureExpectation | undefined,\n turn: AgentTurn,\n judge: Judge | undefined\n): Promise<ExpectationResult> {\n if (!expect) return { status: \"pass\" };\n\n const toolRes = checkToolCalls(expect, turn.message);\n if (toolRes.status !== \"pass\") return toolRes;\n\n const toolResultsRes = checkToolResults(expect, turn.tool_messages ?? []);\n if (toolResultsRes.status !== \"pass\") return toolResultsRes;\n\n const contentRes = checkAssistantContent(expect, turn.message);\n if (contentRes.status !== \"pass\") return contentRes;\n\n if (expect.assistant?.llm) {\n if (!judge) return { status: \"skip\", reason: \"LLM judge not configured.\" };\n return await judge({ expectation: expect.assistant.llm, message: turn.message });\n }\n\n return { status: \"pass\" };\n}\n"
|
|
13
13
|
],
|
|
14
|
-
"mappings": "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",
|
|
15
|
-
"debugId": "
|
|
14
|
+
"mappings": "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",
|
|
15
|
+
"debugId": "305B5B519951154364756E2164756E21",
|
|
16
16
|
"names": []
|
|
17
17
|
}
|
|
@@ -1,4 +1,55 @@
|
|
|
1
1
|
import type { ChatMessage } from "../agent/types";
|
|
2
|
+
export type FixtureFileSource = {
|
|
3
|
+
agent?: AgentSpec;
|
|
4
|
+
fixtures: FixtureSource[];
|
|
5
|
+
};
|
|
6
|
+
export type FixtureSource = {
|
|
7
|
+
id: string;
|
|
8
|
+
agent?: AgentSpec;
|
|
9
|
+
transcript: TranscriptEntrySource[];
|
|
10
|
+
};
|
|
11
|
+
export type TranscriptEntrySource = {
|
|
12
|
+
system: string;
|
|
13
|
+
} | {
|
|
14
|
+
user: string;
|
|
15
|
+
} | {
|
|
16
|
+
assistant: string | TranscriptAssistantSource;
|
|
17
|
+
} | {
|
|
18
|
+
tool: TranscriptToolSource;
|
|
19
|
+
} | {
|
|
20
|
+
next_assistant: NextAssistantExpectationSource;
|
|
21
|
+
};
|
|
22
|
+
export type TranscriptAssistantSource = {
|
|
23
|
+
content?: string;
|
|
24
|
+
tool_calls?: TranscriptToolCallSource[];
|
|
25
|
+
};
|
|
26
|
+
export type TranscriptToolCallSource = {
|
|
27
|
+
id?: string;
|
|
28
|
+
name: string;
|
|
29
|
+
args?: Record<string, unknown>;
|
|
30
|
+
} | Record<string, Record<string, unknown>>;
|
|
31
|
+
export type TranscriptToolSource = {
|
|
32
|
+
name: string;
|
|
33
|
+
tool_call_id?: string;
|
|
34
|
+
content?: string;
|
|
35
|
+
json?: unknown;
|
|
36
|
+
};
|
|
37
|
+
export type NextAssistantExpectationSource = {
|
|
38
|
+
content?: string;
|
|
39
|
+
content_match?: "contains" | "exact";
|
|
40
|
+
llm?: string;
|
|
41
|
+
tool_calls_match?: "contains" | "exact";
|
|
42
|
+
tool_calls?: TranscriptToolCallSource[];
|
|
43
|
+
tool_results_match?: "contains" | "exact";
|
|
44
|
+
tool_results?: ToolResultExpectationSource[];
|
|
45
|
+
};
|
|
46
|
+
export type ToolResultExpectationSource = {
|
|
47
|
+
name?: string;
|
|
48
|
+
tool_call_id?: string;
|
|
49
|
+
content?: string;
|
|
50
|
+
content_match?: "contains" | "exact";
|
|
51
|
+
content_json?: Record<string, unknown>;
|
|
52
|
+
} | Record<string, Record<string, unknown>>;
|
|
2
53
|
export type FixtureFile = {
|
|
3
54
|
agent?: AgentSpec;
|
|
4
55
|
fixtures: Fixture[];
|
|
@@ -6,9 +57,8 @@ export type FixtureFile = {
|
|
|
6
57
|
export type Fixture = {
|
|
7
58
|
id: string;
|
|
8
59
|
agent?: AgentSpec;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
expect?: FixtureExpectation;
|
|
60
|
+
messages: ChatMessage[];
|
|
61
|
+
expect: FixtureExpectation;
|
|
12
62
|
};
|
|
13
63
|
export type AgentSpec = {
|
|
14
64
|
type?: "subprocess";
|
package/package.json
CHANGED