@assemblyline-agents/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/add.d.ts +23 -0
- package/dist/add.d.ts.map +1 -0
- package/dist/add.js +352 -0
- package/dist/add.js.map +1 -0
- package/dist/args.d.ts +14 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +95 -0
- package/dist/args.js.map +1 -0
- package/dist/auth.d.ts +8 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +74 -0
- package/dist/auth.js.map +1 -0
- package/dist/channels.d.ts +25 -0
- package/dist/channels.d.ts.map +1 -0
- package/dist/channels.js +76 -0
- package/dist/channels.js.map +1 -0
- package/dist/checkpoints.d.ts +3 -0
- package/dist/checkpoints.d.ts.map +1 -0
- package/dist/checkpoints.js +60 -0
- package/dist/checkpoints.js.map +1 -0
- package/dist/deploy-definition.d.ts +14 -0
- package/dist/deploy-definition.d.ts.map +1 -0
- package/dist/deploy-definition.js +92 -0
- package/dist/deploy-definition.js.map +1 -0
- package/dist/deploy-lifecycle.d.ts +17 -0
- package/dist/deploy-lifecycle.d.ts.map +1 -0
- package/dist/deploy-lifecycle.js +25 -0
- package/dist/deploy-lifecycle.js.map +1 -0
- package/dist/deploy.d.ts +20 -0
- package/dist/deploy.d.ts.map +1 -0
- package/dist/deploy.js +462 -0
- package/dist/deploy.js.map +1 -0
- package/dist/dev.d.ts +13 -0
- package/dist/dev.d.ts.map +1 -0
- package/dist/dev.js +157 -0
- package/dist/dev.js.map +1 -0
- package/dist/eval-assertions.d.ts +5 -0
- package/dist/eval-assertions.d.ts.map +1 -0
- package/dist/eval-assertions.js +99 -0
- package/dist/eval-assertions.js.map +1 -0
- package/dist/eval-case-runner.d.ts +38 -0
- package/dist/eval-case-runner.d.ts.map +1 -0
- package/dist/eval-case-runner.js +247 -0
- package/dist/eval-case-runner.js.map +1 -0
- package/dist/eval-cases.d.ts +6 -0
- package/dist/eval-cases.d.ts.map +1 -0
- package/dist/eval-cases.js +151 -0
- package/dist/eval-cases.js.map +1 -0
- package/dist/eval-comparison.d.ts +8 -0
- package/dist/eval-comparison.d.ts.map +1 -0
- package/dist/eval-comparison.js +90 -0
- package/dist/eval-comparison.js.map +1 -0
- package/dist/eval-custom.d.ts +15 -0
- package/dist/eval-custom.d.ts.map +1 -0
- package/dist/eval-custom.js +118 -0
- package/dist/eval-custom.js.map +1 -0
- package/dist/eval-experiment.d.ts +19 -0
- package/dist/eval-experiment.d.ts.map +1 -0
- package/dist/eval-experiment.js +122 -0
- package/dist/eval-experiment.js.map +1 -0
- package/dist/eval-fixtures.d.ts +17 -0
- package/dist/eval-fixtures.d.ts.map +1 -0
- package/dist/eval-fixtures.js +59 -0
- package/dist/eval-fixtures.js.map +1 -0
- package/dist/eval-gateway-host.d.ts +34 -0
- package/dist/eval-gateway-host.d.ts.map +1 -0
- package/dist/eval-gateway-host.js +127 -0
- package/dist/eval-gateway-host.js.map +1 -0
- package/dist/eval-judge.d.ts +35 -0
- package/dist/eval-judge.d.ts.map +1 -0
- package/dist/eval-judge.js +105 -0
- package/dist/eval-judge.js.map +1 -0
- package/dist/eval-mocks.d.ts +10 -0
- package/dist/eval-mocks.d.ts.map +1 -0
- package/dist/eval-mocks.js +57 -0
- package/dist/eval-mocks.js.map +1 -0
- package/dist/eval-report.d.ts +7 -0
- package/dist/eval-report.d.ts.map +1 -0
- package/dist/eval-report.js +89 -0
- package/dist/eval-report.js.map +1 -0
- package/dist/eval-retry.d.ts +10 -0
- package/dist/eval-retry.d.ts.map +1 -0
- package/dist/eval-retry.js +37 -0
- package/dist/eval-retry.js.map +1 -0
- package/dist/eval-trajectory.d.ts +7 -0
- package/dist/eval-trajectory.d.ts.map +1 -0
- package/dist/eval-trajectory.js +92 -0
- package/dist/eval-trajectory.js.map +1 -0
- package/dist/eval-turns.d.ts +66 -0
- package/dist/eval-turns.d.ts.map +1 -0
- package/dist/eval-turns.js +187 -0
- package/dist/eval-turns.js.map +1 -0
- package/dist/eval-types.d.ts +271 -0
- package/dist/eval-types.d.ts.map +1 -0
- package/dist/eval-types.js +4 -0
- package/dist/eval-types.js.map +1 -0
- package/dist/eval.d.ts +26 -0
- package/dist/eval.d.ts.map +1 -0
- package/dist/eval.js +218 -0
- package/dist/eval.js.map +1 -0
- package/dist/help.d.ts +12 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +323 -0
- package/dist/help.js.map +1 -0
- package/dist/hosts.d.ts +3 -0
- package/dist/hosts.d.ts.map +1 -0
- package/dist/hosts.js +51 -0
- package/dist/hosts.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +318 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +13 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +79 -0
- package/dist/init.js.map +1 -0
- package/dist/legacy-bin.d.ts +3 -0
- package/dist/legacy-bin.d.ts.map +1 -0
- package/dist/legacy-bin.js +8 -0
- package/dist/legacy-bin.js.map +1 -0
- package/dist/models.d.ts +5 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +20 -0
- package/dist/models.js.map +1 -0
- package/dist/operator-client.d.ts +7 -0
- package/dist/operator-client.d.ts.map +1 -0
- package/dist/operator-client.js +62 -0
- package/dist/operator-client.js.map +1 -0
- package/dist/pm.d.ts +20 -0
- package/dist/pm.d.ts.map +1 -0
- package/dist/pm.js +70 -0
- package/dist/pm.js.map +1 -0
- package/dist/project-env.d.ts +8 -0
- package/dist/project-env.d.ts.map +1 -0
- package/dist/project-env.js +51 -0
- package/dist/project-env.js.map +1 -0
- package/dist/secrets.d.ts +3 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +48 -0
- package/dist/secrets.js.map +1 -0
- package/dist/state.d.ts +3 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +85 -0
- package/dist/state.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const TRANSIENT_CODES = new Set([
|
|
2
|
+
"408", "425", "429", "500", "502", "503", "504",
|
|
3
|
+
"ECONNRESET", "ECONNREFUSED", "EAI_AGAIN", "ETIMEDOUT"
|
|
4
|
+
]);
|
|
5
|
+
export function isTransientProviderError(error) {
|
|
6
|
+
if (typeof error === "string")
|
|
7
|
+
return transientMessage(error);
|
|
8
|
+
if (!error || typeof error !== "object")
|
|
9
|
+
return false;
|
|
10
|
+
const value = error;
|
|
11
|
+
for (const key of ["status", "statusCode", "code"]) {
|
|
12
|
+
if (value[key] !== undefined && TRANSIENT_CODES.has(String(value[key]).toUpperCase()))
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
if (typeof value.message === "string" && transientMessage(value.message))
|
|
16
|
+
return true;
|
|
17
|
+
return value.cause !== undefined && isTransientProviderError(value.cause);
|
|
18
|
+
}
|
|
19
|
+
export async function retryTransient(operation, options) {
|
|
20
|
+
const sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
21
|
+
let attempt = 1;
|
|
22
|
+
while (true) {
|
|
23
|
+
try {
|
|
24
|
+
return { value: await operation(attempt), attempts: attempt };
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (attempt > options.retryAttempts || !isTransientProviderError(error))
|
|
28
|
+
throw error;
|
|
29
|
+
await sleep(options.retryBackoffMs * (2 ** (attempt - 1)));
|
|
30
|
+
attempt += 1;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function transientMessage(message) {
|
|
35
|
+
return /(?:\b(?:408|425|429|500|502|503|504)\b|ECONNRESET|ECONNREFUSED|EAI_AGAIN|ETIMEDOUT|rate[ -]?limit|temporar(?:y|ily) unavailable|service unavailable|provider unavailable|overloaded)/iu.test(message);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=eval-retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-retry.js","sourceRoot":"","sources":["../src/eval-retry.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IAC/C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW;CACvD,CAAC,CAAC;AAEH,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,KAAK,GAAG,KAAgC,CAAC;IAC/C,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;IACrG,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACtF,OAAO,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAA0C,EAC1C,OAAiG;IAEjG,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACnG,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,OAAO,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;YACrF,MAAM,KAAK,CAAC,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,wLAAwL,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAChN,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RunTimeline } from "@assemblyline-agents/runtime";
|
|
2
|
+
import type { EvalCase } from "./eval-types.js";
|
|
3
|
+
type TrajectoryExpectation = NonNullable<EvalCase["expect"]["trajectory"]>;
|
|
4
|
+
type ToolCall = RunTimeline["toolCalls"][number];
|
|
5
|
+
export declare function evaluateTrajectory(expectation: TrajectoryExpectation, calls: ToolCall[]): string[];
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=eval-trajectory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-trajectory.d.ts","sourceRoot":"","sources":["../src/eval-trajectory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAsB,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEpE,KAAK,qBAAqB,GAAG,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AAC3E,KAAK,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,qBAAqB,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAWlG"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from "node:util";
|
|
2
|
+
export function evaluateTrajectory(expectation, calls) {
|
|
3
|
+
const { mode, steps } = expectation;
|
|
4
|
+
if (mode === "exact")
|
|
5
|
+
return evaluateExact(steps, calls);
|
|
6
|
+
if (mode === "ordered")
|
|
7
|
+
return evaluateOrdered(steps, calls);
|
|
8
|
+
if (mode === "forbid") {
|
|
9
|
+
return steps.flatMap((step) => {
|
|
10
|
+
const match = calls.find((call) => stepMatches(step, call));
|
|
11
|
+
return match ? [`forbidden trajectory step ${describeStep(step)} matched tool call ${match.toolName}`] : [];
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
return evaluateContains(steps, calls);
|
|
15
|
+
}
|
|
16
|
+
function evaluateExact(steps, calls) {
|
|
17
|
+
const failures = [];
|
|
18
|
+
if (calls.length !== steps.length)
|
|
19
|
+
failures.push(`expected exactly ${steps.length} tool calls, got ${calls.length}`);
|
|
20
|
+
for (let index = 0; index < Math.max(steps.length, calls.length); index += 1) {
|
|
21
|
+
const step = steps[index];
|
|
22
|
+
const call = calls[index];
|
|
23
|
+
if (!step || !call)
|
|
24
|
+
continue;
|
|
25
|
+
const mismatch = stepMismatch(step, call);
|
|
26
|
+
if (mismatch)
|
|
27
|
+
failures.push(`trajectory step ${index + 1}: ${mismatch}`);
|
|
28
|
+
}
|
|
29
|
+
return failures;
|
|
30
|
+
}
|
|
31
|
+
function evaluateOrdered(steps, calls) {
|
|
32
|
+
let cursor = 0;
|
|
33
|
+
for (const step of steps) {
|
|
34
|
+
let found = false;
|
|
35
|
+
while (cursor < calls.length) {
|
|
36
|
+
if (stepMatches(step, calls[cursor])) {
|
|
37
|
+
found = true;
|
|
38
|
+
cursor += 1;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
cursor += 1;
|
|
42
|
+
}
|
|
43
|
+
if (!found)
|
|
44
|
+
return [`expected ordered trajectory step ${describeStep(step)} after tool-call position ${cursor}`];
|
|
45
|
+
}
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
function evaluateContains(steps, calls) {
|
|
49
|
+
const available = calls.map((call, index) => ({ call, index }));
|
|
50
|
+
const failures = [];
|
|
51
|
+
for (const step of steps) {
|
|
52
|
+
const matchIndex = available.findIndex(({ call }) => stepMatches(step, call));
|
|
53
|
+
if (matchIndex < 0)
|
|
54
|
+
failures.push(`expected trajectory to contain ${describeStep(step)}`);
|
|
55
|
+
else
|
|
56
|
+
available.splice(matchIndex, 1);
|
|
57
|
+
}
|
|
58
|
+
return failures;
|
|
59
|
+
}
|
|
60
|
+
function stepMatches(step, call) {
|
|
61
|
+
return stepMismatch(step, call) === undefined;
|
|
62
|
+
}
|
|
63
|
+
function stepMismatch(step, call) {
|
|
64
|
+
if (call.toolName !== step.tool)
|
|
65
|
+
return `expected tool ${step.tool}, got ${call.toolName}`;
|
|
66
|
+
if (step.status !== undefined && call.status !== step.status) {
|
|
67
|
+
return `tool ${step.tool} expected status ${step.status}, got ${call.status}`;
|
|
68
|
+
}
|
|
69
|
+
if (step.arguments !== undefined && !valueMatches(step.arguments, call.input, step.argumentsMatch ?? "partial")) {
|
|
70
|
+
return `tool ${step.tool} arguments did not ${step.argumentsMatch ?? "partial"}-match ${JSON.stringify(step.arguments)}`;
|
|
71
|
+
}
|
|
72
|
+
if (step.result !== undefined && !valueMatches(step.result, call.result, step.resultMatch ?? "partial")) {
|
|
73
|
+
return `tool ${step.tool} result did not ${step.resultMatch ?? "partial"}-match ${JSON.stringify(step.result)}`;
|
|
74
|
+
}
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
function valueMatches(expected, actual, mode) {
|
|
78
|
+
if (mode === "exact")
|
|
79
|
+
return isDeepStrictEqual(actual, expected);
|
|
80
|
+
if (!isRecord(expected))
|
|
81
|
+
return isDeepStrictEqual(actual, expected);
|
|
82
|
+
if (!isRecord(actual))
|
|
83
|
+
return false;
|
|
84
|
+
return Object.entries(expected).every(([key, value]) => key in actual && valueMatches(value, actual[key], "partial"));
|
|
85
|
+
}
|
|
86
|
+
function isRecord(value) {
|
|
87
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
88
|
+
}
|
|
89
|
+
function describeStep(step) {
|
|
90
|
+
return step.arguments === undefined ? step.tool : `${step.tool}(${JSON.stringify(step.arguments)})`;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=eval-trajectory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-trajectory.js","sourceRoot":"","sources":["../src/eval-trajectory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { JsonValue } from "@assemblyline-agents/core";
|
|
2
|
+
import type { RunAgentOptions, RunStatus, RunTimeline } from "@assemblyline-agents/runtime";
|
|
3
|
+
import type { EvalActual, EvalCase, EvalTurn } from "./eval-types.js";
|
|
4
|
+
/**
|
|
5
|
+
* The runtime surface the eval loop actually consumes. `OpenEveRuntime`
|
|
6
|
+
* satisfies it structurally for in-process runs; `createGatewayEvalHost`
|
|
7
|
+
* implements it over HTTP for remote gateways.
|
|
8
|
+
*/
|
|
9
|
+
export interface EvalRuntimeHost {
|
|
10
|
+
run(options: RunAgentOptions): Promise<{
|
|
11
|
+
run: {
|
|
12
|
+
id: string;
|
|
13
|
+
status: RunStatus;
|
|
14
|
+
};
|
|
15
|
+
response?: string;
|
|
16
|
+
output?: JsonValue;
|
|
17
|
+
}>;
|
|
18
|
+
cancelRun(runId: string): Promise<unknown>;
|
|
19
|
+
replay(runId: string): Promise<RunTimeline>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Conversation execution for eval cases. A single-turn case is a one-entry
|
|
23
|
+
* conversation; multi-turn cases share a conversation id so the runtime
|
|
24
|
+
* hydrates recent history and reuses the conversation-scoped sandbox session,
|
|
25
|
+
* exactly as a production channel turn would.
|
|
26
|
+
*/
|
|
27
|
+
export declare const EVAL_CONVERSATION_ID = "eval-conversation";
|
|
28
|
+
export declare const EVAL_CHANNEL = "eval";
|
|
29
|
+
export declare function normalizeTurns(evalCase: EvalCase): EvalTurn[];
|
|
30
|
+
/**
|
|
31
|
+
* Cases needing durable state across runs (multi-turn history, seeded sandbox
|
|
32
|
+
* files) get a conversation-scoped identity; plain single-turn cases keep the
|
|
33
|
+
* historical run-scoped behavior.
|
|
34
|
+
*/
|
|
35
|
+
export declare function conversationIdForCase(evalCase: EvalCase): string | undefined;
|
|
36
|
+
export type ConversationOutcome = {
|
|
37
|
+
kind: "completed";
|
|
38
|
+
actual: EvalActual;
|
|
39
|
+
timelines: RunTimeline[];
|
|
40
|
+
turnFailures: string[];
|
|
41
|
+
runId: string;
|
|
42
|
+
} | {
|
|
43
|
+
kind: "run_failed";
|
|
44
|
+
runId: string;
|
|
45
|
+
status: RunStatus;
|
|
46
|
+
response: string;
|
|
47
|
+
error: string;
|
|
48
|
+
costUsd: number;
|
|
49
|
+
} | {
|
|
50
|
+
kind: "error";
|
|
51
|
+
cause: unknown;
|
|
52
|
+
runId?: string;
|
|
53
|
+
costUsd: number;
|
|
54
|
+
};
|
|
55
|
+
export declare function runConversation(input: {
|
|
56
|
+
runtime: EvalRuntimeHost;
|
|
57
|
+
evalCase: EvalCase;
|
|
58
|
+
caseId: string;
|
|
59
|
+
repetition: number;
|
|
60
|
+
attempt: number;
|
|
61
|
+
approveDefault: boolean;
|
|
62
|
+
timeoutMs: number;
|
|
63
|
+
conversationId?: string;
|
|
64
|
+
}): Promise<ConversationOutcome>;
|
|
65
|
+
export declare function withRunTimeout<T>(promise: Promise<T>, timeoutMs: number, cancel: () => Promise<void>): Promise<T>;
|
|
66
|
+
//# sourceMappingURL=eval-turns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-turns.d.ts","sourceRoot":"","sources":["../src/eval-turns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAoB,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE9G,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAkB,MAAM,iBAAiB,CAAC;AAEtF;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC;QACrC,GAAG,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,SAAS,CAAA;SAAE,CAAC;QACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,SAAS,CAAC;KACpB,CAAC,CAAC;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC7C;AAED;;;;;GAKG;AAEH,eAAO,MAAM,oBAAoB,sBAAsB,CAAC;AACxD,eAAO,MAAM,YAAY,SAAS,CAAC;AAEnC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAO7D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAI5E;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,WAAW,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC1G;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC1G;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAC3C,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA4H/B;AAED,wBAAsB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAcvH"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { evaluateExpectations } from "./eval-assertions.js";
|
|
2
|
+
/**
|
|
3
|
+
* Conversation execution for eval cases. A single-turn case is a one-entry
|
|
4
|
+
* conversation; multi-turn cases share a conversation id so the runtime
|
|
5
|
+
* hydrates recent history and reuses the conversation-scoped sandbox session,
|
|
6
|
+
* exactly as a production channel turn would.
|
|
7
|
+
*/
|
|
8
|
+
export const EVAL_CONVERSATION_ID = "eval-conversation";
|
|
9
|
+
export const EVAL_CHANNEL = "eval";
|
|
10
|
+
export function normalizeTurns(evalCase) {
|
|
11
|
+
if (evalCase.input.turns)
|
|
12
|
+
return evalCase.input.turns;
|
|
13
|
+
const turn = { message: evalCase.input.message ?? "" };
|
|
14
|
+
if (evalCase.input.approve !== undefined)
|
|
15
|
+
turn.approve = evalCase.input.approve;
|
|
16
|
+
if (evalCase.input.tool !== undefined)
|
|
17
|
+
turn.tool = evalCase.input.tool;
|
|
18
|
+
if (evalCase.input.toolInput !== undefined)
|
|
19
|
+
turn.toolInput = evalCase.input.toolInput;
|
|
20
|
+
return [turn];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Cases needing durable state across runs (multi-turn history, seeded sandbox
|
|
24
|
+
* files) get a conversation-scoped identity; plain single-turn cases keep the
|
|
25
|
+
* historical run-scoped behavior.
|
|
26
|
+
*/
|
|
27
|
+
export function conversationIdForCase(evalCase) {
|
|
28
|
+
const multiTurn = (evalCase.input.turns?.length ?? 0) > 1;
|
|
29
|
+
const sandboxFixtures = Object.keys(evalCase.fixtures?.sandbox ?? {}).length > 0;
|
|
30
|
+
return multiTurn || sandboxFixtures ? EVAL_CONVERSATION_ID : undefined;
|
|
31
|
+
}
|
|
32
|
+
export async function runConversation(input) {
|
|
33
|
+
const { runtime, evalCase } = input;
|
|
34
|
+
const turns = normalizeTurns(evalCase);
|
|
35
|
+
const multiTurn = Boolean(evalCase.input.turns);
|
|
36
|
+
const channel = evalCase.input.channel ?? EVAL_CHANNEL;
|
|
37
|
+
const timelines = [];
|
|
38
|
+
const turnRecords = [];
|
|
39
|
+
const turnFailures = [];
|
|
40
|
+
const toolsCalled = [];
|
|
41
|
+
const toolCalls = [];
|
|
42
|
+
let totalCostUsd = 0;
|
|
43
|
+
let costComplete = true;
|
|
44
|
+
let lastRunId;
|
|
45
|
+
for (const [index, turn] of turns.entries()) {
|
|
46
|
+
let runId;
|
|
47
|
+
const approveTurn = turn.approve ?? evalCase.input.approve ?? input.approveDefault;
|
|
48
|
+
try {
|
|
49
|
+
const options = {
|
|
50
|
+
message: turn.message,
|
|
51
|
+
channel,
|
|
52
|
+
approve: approveTurn,
|
|
53
|
+
// Per-run eval block: record-only delivery always; approval
|
|
54
|
+
// auto-resolve when the turn approves (this is what makes --approve
|
|
55
|
+
// work for model-driven gated calls); stubs ride per-run for
|
|
56
|
+
// single-turn cases (multi-turn keeps the constructor stubs so
|
|
57
|
+
// {results} cursors span turns).
|
|
58
|
+
eval: {
|
|
59
|
+
recordOnlyDelivery: true,
|
|
60
|
+
...(approveTurn ? { autoApproveTools: true } : {}),
|
|
61
|
+
...(evalCase.mocks && !multiTurn ? { toolStubs: evalCase.mocks.tools } : {})
|
|
62
|
+
},
|
|
63
|
+
...(turn.tool ? { toolName: turn.tool } : {}),
|
|
64
|
+
...(turn.toolInput !== undefined ? { input: turn.toolInput } : {}),
|
|
65
|
+
...(index === 0 && evalCase.input.recentHistory ? { recentHistory: evalCase.input.recentHistory } : {}),
|
|
66
|
+
...(input.conversationId && !multiTurn ? { conversationId: input.conversationId } : {}),
|
|
67
|
+
...(multiTurn && input.conversationId
|
|
68
|
+
? {
|
|
69
|
+
turn: {
|
|
70
|
+
eventId: `eval-turn-${index + 1}`,
|
|
71
|
+
channel,
|
|
72
|
+
conversationId: input.conversationId,
|
|
73
|
+
message: turn.message
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
: {}),
|
|
77
|
+
metadata: {
|
|
78
|
+
eval: true,
|
|
79
|
+
evalCase: evalCase.name,
|
|
80
|
+
evalCaseId: input.caseId,
|
|
81
|
+
evalRepetition: input.repetition,
|
|
82
|
+
evalAttempt: input.attempt,
|
|
83
|
+
...(multiTurn ? { evalTurn: index + 1 } : {})
|
|
84
|
+
},
|
|
85
|
+
onRunCreated: (run) => {
|
|
86
|
+
runId = run.id;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
const result = await withRunTimeout(runtime.run(options), input.timeoutMs, async () => {
|
|
90
|
+
if (runId)
|
|
91
|
+
await runtime.cancelRun(runId).catch(() => undefined);
|
|
92
|
+
});
|
|
93
|
+
runId = result.run.id;
|
|
94
|
+
lastRunId = result.run.id;
|
|
95
|
+
const timeline = await runtime.replay(result.run.id);
|
|
96
|
+
timelines.push(timeline);
|
|
97
|
+
const turnCostUsd = timeline.usage.reduce((sum, usage) => sum + (usage.costUsd ?? 0), 0);
|
|
98
|
+
totalCostUsd += turnCostUsd;
|
|
99
|
+
const turnCostComplete = timeline.usage.every((usage) => usage.costSource === "provider_reported" || usage.costSource === "provider_reconciled");
|
|
100
|
+
costComplete &&= turnCostComplete;
|
|
101
|
+
if (result.run.status === "failed") {
|
|
102
|
+
return {
|
|
103
|
+
kind: "run_failed",
|
|
104
|
+
runId: result.run.id,
|
|
105
|
+
status: result.run.status,
|
|
106
|
+
response: result.response ?? "",
|
|
107
|
+
error: latestRunError(timeline.events) ?? "agent run failed",
|
|
108
|
+
costUsd: totalCostUsd
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const turnToolsCalled = timeline.toolCalls.map((toolCall) => toolCall.toolName);
|
|
112
|
+
toolsCalled.push(...turnToolsCalled);
|
|
113
|
+
toolCalls.push(...timeline.toolCalls);
|
|
114
|
+
const record = {
|
|
115
|
+
message: turn.message,
|
|
116
|
+
status: result.run.status,
|
|
117
|
+
response: result.response ?? "",
|
|
118
|
+
toolsCalled: turnToolsCalled,
|
|
119
|
+
costUsd: turnCostUsd,
|
|
120
|
+
runId: result.run.id
|
|
121
|
+
};
|
|
122
|
+
if (result.output !== undefined)
|
|
123
|
+
record.output = result.output;
|
|
124
|
+
turnRecords.push(record);
|
|
125
|
+
if (turn.expect) {
|
|
126
|
+
const turnActual = {
|
|
127
|
+
status: result.run.status,
|
|
128
|
+
response: result.response ?? "",
|
|
129
|
+
toolsCalled: turnToolsCalled,
|
|
130
|
+
toolCalls: timeline.toolCalls,
|
|
131
|
+
costComplete: turnCostComplete,
|
|
132
|
+
costUsd: turnCostUsd
|
|
133
|
+
};
|
|
134
|
+
if (result.output !== undefined)
|
|
135
|
+
turnActual.output = result.output;
|
|
136
|
+
turnFailures.push(...evaluateExpectations(turn.expect, turnActual).map((failure) => `turn ${index + 1}: ${failure}`));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
return { kind: "error", cause: error, ...(runId ? { runId } : {}), costUsd: totalCostUsd };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const final = turnRecords[turnRecords.length - 1];
|
|
144
|
+
if (!final || !lastRunId) {
|
|
145
|
+
return { kind: "error", cause: new Error("conversation produced no turns"), costUsd: totalCostUsd };
|
|
146
|
+
}
|
|
147
|
+
const actual = {
|
|
148
|
+
status: final.status,
|
|
149
|
+
response: final.response,
|
|
150
|
+
toolsCalled,
|
|
151
|
+
toolCalls,
|
|
152
|
+
costComplete,
|
|
153
|
+
costUsd: totalCostUsd
|
|
154
|
+
};
|
|
155
|
+
if (final.output !== undefined)
|
|
156
|
+
actual.output = final.output;
|
|
157
|
+
if (multiTurn)
|
|
158
|
+
actual.turns = turnRecords;
|
|
159
|
+
return { kind: "completed", actual, timelines, turnFailures, runId: lastRunId };
|
|
160
|
+
}
|
|
161
|
+
export async function withRunTimeout(promise, timeoutMs, cancel) {
|
|
162
|
+
let timer;
|
|
163
|
+
const timeout = new Promise((_resolve, reject) => {
|
|
164
|
+
timer = setTimeout(() => {
|
|
165
|
+
void cancel().finally(() => reject(new Error(`Eval case timed out after ${timeoutMs}ms.`)));
|
|
166
|
+
}, timeoutMs);
|
|
167
|
+
timer.unref?.();
|
|
168
|
+
});
|
|
169
|
+
try {
|
|
170
|
+
return await Promise.race([promise, timeout]);
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
if (timer)
|
|
174
|
+
clearTimeout(timer);
|
|
175
|
+
void promise.catch(() => undefined);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
function latestRunError(events) {
|
|
179
|
+
for (const event of [...events].reverse()) {
|
|
180
|
+
if (event.type !== "run.failed")
|
|
181
|
+
continue;
|
|
182
|
+
if (typeof event.data.error === "string")
|
|
183
|
+
return event.data.error;
|
|
184
|
+
}
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=eval-turns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-turns.js","sourceRoot":"","sources":["../src/eval-turns.ts"],"names":[],"mappings":"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"}
|