@botpress/evals 1.19.0-beta.7 → 2.0.0-alpha.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/dist/client.d.ts +25 -11
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +143 -55
- package/dist/client.js.map +4 -4
- package/dist/definition.d.ts +9 -2
- package/dist/definition.d.ts.map +1 -1
- package/dist/definition.js.map +2 -2
- package/dist/errors.d.ts +15 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/graders/index.js +31 -74
- package/dist/graders/index.js.map +3 -3
- package/dist/graders/llm.d.ts +14 -12
- package/dist/graders/llm.d.ts.map +1 -1
- package/dist/graders/llm.js +46 -74
- package/dist/graders/llm.js.map +3 -3
- package/dist/graders/response.js +24 -64
- package/dist/graders/response.js.map +3 -3
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +3 -3
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +22 -8
- package/dist/loader.js.map +3 -3
- package/dist/manifest.d.ts +13 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/runner.d.ts +7 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +445 -246
- package/dist/runner.js.map +4 -4
- package/dist/spans/index.d.ts +5 -0
- package/dist/spans/index.d.ts.map +1 -0
- package/dist/spans/index.js +687 -0
- package/dist/spans/index.js.map +7 -0
- package/dist/spans/local-span-source.d.ts +19 -0
- package/dist/spans/local-span-source.d.ts.map +1 -0
- package/dist/spans/local-span-source.js +505 -0
- package/dist/spans/local-span-source.js.map +7 -0
- package/dist/spans/span-source.d.ts +40 -0
- package/dist/spans/span-source.d.ts.map +1 -0
- package/dist/spans/span-source.js +1 -0
- package/dist/{sse-collector.d.ts → spans/sse-collector.d.ts} +44 -5
- package/dist/spans/sse-collector.d.ts.map +1 -0
- package/dist/{sse-collector.js → spans/sse-collector.js} +109 -22
- package/dist/spans/sse-collector.js.map +7 -0
- package/dist/spans/trace.d.ts.map +1 -0
- package/dist/spans/trace.js.map +7 -0
- package/dist/spans/vortex-span-source.d.ts +42 -0
- package/dist/spans/vortex-span-source.d.ts.map +1 -0
- package/dist/spans/vortex-span-source.js +184 -0
- package/dist/spans/vortex-span-source.js.map +7 -0
- package/dist/stores/eval-definition-loader.d.ts +4 -0
- package/dist/stores/eval-definition-loader.d.ts.map +1 -0
- package/dist/stores/eval-definition-loader.js +104 -0
- package/dist/stores/eval-definition-loader.js.map +7 -0
- package/dist/stores/eval-store.d.ts +61 -0
- package/dist/stores/eval-store.d.ts.map +1 -0
- package/dist/stores/eval-store.js +1 -0
- package/dist/stores/eval-store.js.map +7 -0
- package/dist/stores/index.d.ts +8 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/index.js +1118 -0
- package/dist/stores/index.js.map +7 -0
- package/dist/stores/local-eval-store.d.ts +66 -0
- package/dist/stores/local-eval-store.d.ts.map +1 -0
- package/dist/stores/local-eval-store.js +557 -0
- package/dist/stores/local-eval-store.js.map +7 -0
- package/dist/stores/vortex-eval-store-entry.d.ts +6 -0
- package/dist/stores/vortex-eval-store-entry.d.ts.map +1 -0
- package/dist/stores/vortex-eval-store-entry.js +664 -0
- package/dist/stores/vortex-eval-store-entry.js.map +7 -0
- package/dist/stores/vortex-eval-store.d.ts +78 -0
- package/dist/stores/vortex-eval-store.d.ts.map +1 -0
- package/dist/stores/vortex-eval-store.js +562 -0
- package/dist/stores/vortex-eval-store.js.map +7 -0
- package/dist/transformer.d.ts +2 -2
- package/dist/transformer.d.ts.map +1 -1
- package/dist/transformer.js +1 -1
- package/dist/transformer.js.map +2 -2
- package/dist/types.d.ts +55 -33
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -1
- package/dist/types.js.map +3 -3
- package/package.json +66 -6
- package/dist/sse-collector.d.ts.map +0 -1
- package/dist/sse-collector.js.map +0 -7
- package/dist/trace.d.ts.map +0 -1
- /package/dist/{trace.js.map → spans/span-source.js.map} +0 -0
- /package/dist/{trace.d.ts → spans/trace.d.ts} +0 -0
- /package/dist/{trace.js → spans/trace.js} +0 -0
package/dist/transformer.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Transformer: projects raw trace spans into grader-friendly TurnData.
|
|
3
3
|
* Pure function — no side effects, no network calls.
|
|
4
4
|
*/
|
|
5
|
-
import type { Span } from './trace';
|
|
5
|
+
import type { Span } from './spans/trace';
|
|
6
6
|
import type { TurnData } from './types';
|
|
7
7
|
/**
|
|
8
8
|
* Transform raw trace spans into structured TurnData for graders.
|
|
@@ -12,7 +12,7 @@ import type { TurnData } from './types';
|
|
|
12
12
|
* - toolCalls: from `autonomous.tool` spans with terminal status, deduped by span id, ordered by endedAt
|
|
13
13
|
* - stateMutations: from `state.save` spans where changed_keys has length > 0
|
|
14
14
|
* - workflowSpans: from `handler.workflow` spans
|
|
15
|
-
* - handler: from `handler.conversation` or `handler.workflow` span with terminal status
|
|
15
|
+
* - handler: from `handler.conversation`, `handler.event`, or `handler.workflow` span with terminal status
|
|
16
16
|
*/
|
|
17
17
|
export declare function transformSpans(spans: Span[]): TurnData;
|
|
18
18
|
//# sourceMappingURL=transformer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../src/transformer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../src/transformer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,KAAK,EAA2B,QAAQ,EAAgB,MAAM,SAAS,CAAA;AA8B9E;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,CAQtD"}
|
package/dist/transformer.js
CHANGED
|
@@ -85,7 +85,7 @@ function extractWorkflowSpans(spans) {
|
|
|
85
85
|
}
|
|
86
86
|
function extractHandler(spans) {
|
|
87
87
|
const handler = spans.find(
|
|
88
|
-
(s) => (s.name === "handler.conversation" || s.name === "handler.workflow") && s.status !== "running"
|
|
88
|
+
(s) => (s.name === "handler.conversation" || s.name === "handler.event" || s.name === "handler.workflow") && s.status !== "running"
|
|
89
89
|
);
|
|
90
90
|
if (!handler) {
|
|
91
91
|
return { handlerDuration: 0, handlerStatus: "ok" };
|
package/dist/transformer.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/transformer.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Transformer: projects raw trace spans into grader-friendly TurnData.\n * Pure function \u2014 no side effects, no network calls.\n */\n\nimport type { Span } from './trace'\nimport type { StateMutation, ToolCall, TurnData, WorkflowSpan } from './types'\n\n/** Safe accessor for span.data as a string-keyed record. */\nfunction data(span: Span): Record<string, unknown> {\n return (span.data && typeof span.data === 'object' ? span.data : {}) as Record<string, unknown>\n}\n\n/** Attempt to parse a JSON string. Returns parsed result, raw value on parse failure, or fallback if value is nullish. */\nfunction tryParseJson(value: unknown): unknown {\n if (value == null) return undefined\n if (typeof value !== 'string') return value\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\n/** Parse JSON with a strict fallback \u2014 returns fallback on parse failure instead of the raw string. */\nfunction parseJsonOrFallback<T>(value: unknown, fallback: T): T {\n if (typeof value !== 'string') return fallback\n try {\n return JSON.parse(value) as T\n } catch {\n return fallback\n }\n}\n\n/**\n * Transform raw trace spans into structured TurnData for graders.\n *\n * Extraction logic:\n * - messages: from `chat.sendMessage` spans, ordered by startedAt\n * - toolCalls: from `autonomous.tool` spans with terminal status, deduped by span id, ordered by endedAt\n * - stateMutations: from `state.save` spans where changed_keys has length > 0\n * - workflowSpans: from `handler.workflow` spans\n * - handler: from `handler.conversation` or `handler.workflow` span with terminal status\n */\nexport function transformSpans(spans: Span[]): TurnData {\n return {\n messages: extractMessages(spans),\n toolCalls: extractToolCalls(spans),\n stateMutations: extractStateMutations(spans),\n workflowSpans: extractWorkflowSpans(spans),\n ...extractHandler(spans),\n }\n}\n\nfunction extractMessages(spans: Span[]): string[] {\n return spans\n .filter((s) => s.name === 'chat.sendMessage' && data(s)['message.preview'])\n .sort((a, b) => a.timing.startedAt - b.timing.startedAt)\n .map((s) => String(data(s)['message.preview']))\n}\n\nfunction extractToolCalls(spans: Span[]): ToolCall[] {\n const toolSpans = spans.filter(\n (s) => s.name === 'autonomous.tool' && s.status !== 'running' && data(s)['autonomous.tool.name']\n )\n\n // Deduplicate by span id\n const seen = new Set<string>()\n const unique = toolSpans.filter((s) => {\n if (seen.has(s.id.span)) return false\n seen.add(s.id.span)\n return true\n })\n\n return unique\n .sort((a, b) => (a.timing.endedAt ?? Infinity) - (b.timing.endedAt ?? Infinity))\n .map((s) => {\n const d = data(s)\n const input = parseJsonOrFallback<Record<string, unknown>>(d['autonomous.tool.input'], {})\n return {\n name: String(d['autonomous.tool.name']),\n input,\n output: String(d['autonomous.tool.output'] ?? ''),\n status: String(d['autonomous.tool.status'] ?? 'unknown'),\n }\n })\n}\n\nfunction extractStateMutations(spans: Span[]): StateMutation[] {\n return spans\n .filter((s) => {\n if (s.name !== 'state.save') return false\n const d = data(s)\n const changedKeys = d['state.changed_keys']\n return Array.isArray(changedKeys) && changedKeys.length > 0\n })\n .map((s) => {\n const d = data(s)\n return {\n type: String(d['type'] ?? 'unknown'),\n changedKeys: (d['state.changed_keys'] as string[]) ?? [],\n previous: tryParseJson(d['state.previous_value']),\n current: tryParseJson(d['state.value']),\n swappedToFile: d['swapped_to_file'] === true,\n }\n })\n}\n\nfunction extractWorkflowSpans(spans: Span[]): WorkflowSpan[] {\n return spans\n .filter((s) => s.name === 'handler.workflow')\n .map((s) => {\n const d = data(s)\n const result: WorkflowSpan = {\n name: String(d['workflow.name'] || d['workflowName'] || ''),\n status: s.status as WorkflowSpan['status'],\n }\n const statusFinal = d['workflow.status.final']\n if (statusFinal) {\n result.statusFinal = String(statusFinal)\n }\n return result\n })\n}\n\nfunction extractHandler(spans: Span[]): { handlerDuration: number; handlerStatus: 'ok' | 'error' } {\n const handler = spans.find(\n (s)
|
|
5
|
-
"mappings": ";AASA,SAAS,KAAK,MAAqC;AACjD,SAAQ,KAAK,QAAQ,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,CAAC;AACpE;AAGA,SAAS,aAAa,OAAyB;AAC7C,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI;AACF,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB,QAAQ;
|
|
4
|
+
"sourcesContent": ["/**\n * Transformer: projects raw trace spans into grader-friendly TurnData.\n * Pure function \u2014 no side effects, no network calls.\n */\n\nimport type { Span } from './spans/trace'\nimport type { StateMutation, ToolCall, TurnData, WorkflowSpan } from './types'\n\n/** Safe accessor for span.data as a string-keyed record. */\nfunction data(span: Span): Record<string, unknown> {\n return (span.data && typeof span.data === 'object' ? span.data : {}) as Record<string, unknown>\n}\n\n/** Attempt to parse a JSON string. Returns parsed result, raw value on parse failure, or fallback if value is nullish. */\nfunction tryParseJson(value: unknown): unknown {\n if (value == null) return undefined\n if (typeof value !== 'string') return value\n try {\n return JSON.parse(value)\n } catch {\n // Not JSON \u2014 fall back to the raw value, per this function's contract\n return value\n }\n}\n\n/** Parse JSON with a strict fallback \u2014 returns fallback on parse failure instead of the raw string. */\nfunction parseJsonOrFallback<T>(value: unknown, fallback: T): T {\n if (typeof value !== 'string') return fallback\n try {\n return JSON.parse(value) as T\n } catch {\n // Not JSON \u2014 return the caller's fallback, per this function's contract\n return fallback\n }\n}\n\n/**\n * Transform raw trace spans into structured TurnData for graders.\n *\n * Extraction logic:\n * - messages: from `chat.sendMessage` spans, ordered by startedAt\n * - toolCalls: from `autonomous.tool` spans with terminal status, deduped by span id, ordered by endedAt\n * - stateMutations: from `state.save` spans where changed_keys has length > 0\n * - workflowSpans: from `handler.workflow` spans\n * - handler: from `handler.conversation`, `handler.event`, or `handler.workflow` span with terminal status\n */\nexport function transformSpans(spans: Span[]): TurnData {\n return {\n messages: extractMessages(spans),\n toolCalls: extractToolCalls(spans),\n stateMutations: extractStateMutations(spans),\n workflowSpans: extractWorkflowSpans(spans),\n ...extractHandler(spans),\n }\n}\n\nfunction extractMessages(spans: Span[]): string[] {\n return spans\n .filter((s) => s.name === 'chat.sendMessage' && data(s)['message.preview'])\n .sort((a, b) => a.timing.startedAt - b.timing.startedAt)\n .map((s) => String(data(s)['message.preview']))\n}\n\nfunction extractToolCalls(spans: Span[]): ToolCall[] {\n const toolSpans = spans.filter(\n (s) => s.name === 'autonomous.tool' && s.status !== 'running' && data(s)['autonomous.tool.name']\n )\n\n // Deduplicate by span id\n const seen = new Set<string>()\n const unique = toolSpans.filter((s) => {\n if (seen.has(s.id.span)) return false\n seen.add(s.id.span)\n return true\n })\n\n return unique\n .sort((a, b) => (a.timing.endedAt ?? Infinity) - (b.timing.endedAt ?? Infinity))\n .map((s) => {\n const d = data(s)\n const input = parseJsonOrFallback<Record<string, unknown>>(d['autonomous.tool.input'], {})\n return {\n name: String(d['autonomous.tool.name']),\n input,\n output: String(d['autonomous.tool.output'] ?? ''),\n status: String(d['autonomous.tool.status'] ?? 'unknown'),\n }\n })\n}\n\nfunction extractStateMutations(spans: Span[]): StateMutation[] {\n return spans\n .filter((s) => {\n if (s.name !== 'state.save') return false\n const d = data(s)\n const changedKeys = d['state.changed_keys']\n return Array.isArray(changedKeys) && changedKeys.length > 0\n })\n .map((s) => {\n const d = data(s)\n return {\n type: String(d['type'] ?? 'unknown'),\n changedKeys: (d['state.changed_keys'] as string[]) ?? [],\n previous: tryParseJson(d['state.previous_value']),\n current: tryParseJson(d['state.value']),\n swappedToFile: d['swapped_to_file'] === true,\n }\n })\n}\n\nfunction extractWorkflowSpans(spans: Span[]): WorkflowSpan[] {\n return spans\n .filter((s) => s.name === 'handler.workflow')\n .map((s) => {\n const d = data(s)\n const result: WorkflowSpan = {\n name: String(d['workflow.name'] || d['workflowName'] || ''),\n status: s.status as WorkflowSpan['status'],\n }\n const statusFinal = d['workflow.status.final']\n if (statusFinal) {\n result.statusFinal = String(statusFinal)\n }\n return result\n })\n}\n\nfunction extractHandler(spans: Span[]): { handlerDuration: number; handlerStatus: 'ok' | 'error' } {\n const handler = spans.find(\n (s) =>\n (s.name === 'handler.conversation' || s.name === 'handler.event' || s.name === 'handler.workflow') &&\n s.status !== 'running'\n )\n\n if (!handler) {\n return { handlerDuration: 0, handlerStatus: 'ok' }\n }\n\n return {\n handlerDuration: handler.timing.duration ?? 0,\n handlerStatus: handler.status === 'error' ? 'error' : 'ok',\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -4,30 +4,30 @@
|
|
|
4
4
|
* User-facing types live in @botpress/evals so eval authors can update eval
|
|
5
5
|
* tooling without tying the authoring API to the agent runtime package.
|
|
6
6
|
*/
|
|
7
|
+
import type { EvalDefinition as _EvalDefinition } from './definition';
|
|
7
8
|
export { Eval, type EvalDefinition, type EvalSetup, type ConversationTurn, type TurnAssertions, type OutcomeAssertions, type ResponseAssertion, type ToolAssertion, type StateAssertion, type WorkflowAssertion, type TimingAssertion, type MatchOperator, type NumericOperator, } from './definition';
|
|
8
|
-
export type { Span, SpanStatus } from './trace';
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
createEvent: (props: any) => Promise<unknown>;
|
|
20
|
-
}
|
|
21
|
-
export interface ChatClient {
|
|
22
|
-
connect: (props: {
|
|
23
|
-
webhookId: string;
|
|
24
|
-
}) => Promise<ChatClientConnection>;
|
|
25
|
-
}
|
|
9
|
+
export type { Span, SpanStatus } from './spans/trace';
|
|
10
|
+
export type { WaitOptions, WorkflowWaitOptions } from './spans/span-source';
|
|
11
|
+
import type { SpanSource } from './spans/span-source';
|
|
12
|
+
export type { SpanSource };
|
|
13
|
+
/**
|
|
14
|
+
* The @botpress/chat Client *class* (constructor) — not an instance. Callers
|
|
15
|
+
* inject it (the CLI passes its bundled chat client) and the runner calls the
|
|
16
|
+
* static `.connect()`. Typed via `typeof import(...)` so this types-only module
|
|
17
|
+
* doesn't pull in a value import.
|
|
18
|
+
*/
|
|
19
|
+
export type ChatClient = typeof import('@botpress/chat').Client;
|
|
26
20
|
export interface GraderResult {
|
|
27
21
|
assertion: string;
|
|
28
22
|
pass: boolean;
|
|
29
23
|
expected: string;
|
|
30
24
|
actual: string;
|
|
25
|
+
/**
|
|
26
|
+
* True when the assertion could not actually be evaluated (e.g. the llm_judge had no credentials,
|
|
27
|
+
* returned an empty response, or errored). Distinguishes a genuine pass from a "didn't run" pass.
|
|
28
|
+
* Callers that demand a trustworthy verdict (e.g. the benchmark) should treat `skipped` as a failure.
|
|
29
|
+
*/
|
|
30
|
+
skipped?: boolean;
|
|
31
31
|
}
|
|
32
32
|
export interface ToolCall {
|
|
33
33
|
name: string;
|
|
@@ -36,7 +36,7 @@ export interface ToolCall {
|
|
|
36
36
|
status: string;
|
|
37
37
|
}
|
|
38
38
|
export interface TurnReport {
|
|
39
|
-
|
|
39
|
+
turnIndex: number;
|
|
40
40
|
userMessage: string;
|
|
41
41
|
botResponse: string;
|
|
42
42
|
assertions: GraderResult[];
|
|
@@ -56,6 +56,8 @@ export interface EvalReport {
|
|
|
56
56
|
pass: boolean;
|
|
57
57
|
duration: number;
|
|
58
58
|
error?: string;
|
|
59
|
+
/** Stable EvalErrorCode when `error` came from a typed EvalRunnerError — lets consumers distinguish setup/config failures from bot failures. */
|
|
60
|
+
errorCode?: string;
|
|
59
61
|
}
|
|
60
62
|
export type EvalProgressEvent = {
|
|
61
63
|
type: 'suite_start';
|
|
@@ -69,14 +71,14 @@ export type EvalProgressEvent = {
|
|
|
69
71
|
type: 'turn_start';
|
|
70
72
|
evalName: string;
|
|
71
73
|
evalIndex: number;
|
|
72
|
-
|
|
74
|
+
turnIndex: number;
|
|
73
75
|
totalTurns: number;
|
|
74
76
|
userMessage: string;
|
|
75
77
|
} | {
|
|
76
78
|
type: 'turn_complete';
|
|
77
79
|
evalName: string;
|
|
78
80
|
evalIndex: number;
|
|
79
|
-
|
|
81
|
+
turnIndex: number;
|
|
80
82
|
totalTurns: number;
|
|
81
83
|
turnReport: TurnReport;
|
|
82
84
|
} | {
|
|
@@ -110,25 +112,30 @@ export interface EvalRunReport {
|
|
|
110
112
|
aborted?: boolean;
|
|
111
113
|
}
|
|
112
114
|
export interface BotConnection {
|
|
113
|
-
|
|
115
|
+
client: import('@botpress/client').Client;
|
|
114
116
|
botId: string;
|
|
115
|
-
token: string;
|
|
116
|
-
apiUrl: string;
|
|
117
117
|
}
|
|
118
118
|
export interface EvalLogger {
|
|
119
119
|
info: (message: string) => void;
|
|
120
120
|
warn: (message: string) => void;
|
|
121
121
|
error: (message: string) => void;
|
|
122
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* Fallback when no logger is injected (programmatic use outside the CLI).
|
|
125
|
+
* console rather than a no-op so warnings stay visible — a silent default
|
|
126
|
+
* would hide judge failures and skipped pre-flights, the exact swallow
|
|
127
|
+
* anti-pattern docs/ERROR-HANDLING.md bans. The CLI always injects its own
|
|
128
|
+
* structured logger via EvalRunnerConfig.logger.
|
|
129
|
+
*/
|
|
130
|
+
export declare const defaultLogger: EvalLogger;
|
|
123
131
|
export interface EvalRunnerConfig {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
agentPath: string;
|
|
132
|
+
/** Authenticated Botpress client. Used for state seeding, workflow triggers, webhook discovery, and LLM judge. */
|
|
133
|
+
client: import('@botpress/client').Client;
|
|
134
|
+
botId: string;
|
|
135
|
+
/** Path to the agent directory. Used to discover eval files from `<agentPath>/evals/`. Not needed when `definitions` is provided. */
|
|
136
|
+
agentPath?: string;
|
|
137
|
+
/** Pre-loaded eval definitions. When provided, `agentPath` is not used for eval discovery. */
|
|
138
|
+
definitions?: _EvalDefinition[];
|
|
132
139
|
/** URL of the dev server providing traces and config. Defaults to the discovered DevConsole URL. */
|
|
133
140
|
devServerUrl?: string;
|
|
134
141
|
/** Headers for dev-server requests, e.g. X-Agent-Path when routed through the singleton proxy. */
|
|
@@ -138,9 +145,16 @@ export interface EvalRunnerConfig {
|
|
|
138
145
|
* here so the eval engine does not depend on @botpress/adk.
|
|
139
146
|
*/
|
|
140
147
|
chatClient?: ChatClient;
|
|
141
|
-
onProgress?: (event: EvalProgressEvent) => void
|
|
148
|
+
onProgress?: (event: EvalProgressEvent) => void | Promise<void>;
|
|
142
149
|
/** Logger for warnings and errors. Defaults to console. */
|
|
143
150
|
logger?: EvalLogger;
|
|
151
|
+
/**
|
|
152
|
+
* Called for unexpected (internal-bug) eval failures that runEval folds
|
|
153
|
+
* into report.error — they never propagate to the CLI's command boundary,
|
|
154
|
+
* so without this hook they'd be invisible to error tracking. The CLI binds
|
|
155
|
+
* this to telemetry.captureException; evals itself stays telemetry-free.
|
|
156
|
+
*/
|
|
157
|
+
onException?: (error: unknown, properties?: Record<string, unknown>) => void;
|
|
144
158
|
/**
|
|
145
159
|
* Optional abort signal — when fired, the suite stops starting new evals.
|
|
146
160
|
* The currently running eval continues to completion (LLM calls in flight
|
|
@@ -155,6 +169,14 @@ export interface EvalRunnerConfig {
|
|
|
155
169
|
/** Model to use for llm_judge assertions (e.g. 'openai:gpt-4o'). Defaults to 'fast'. */
|
|
156
170
|
judgeModel?: string;
|
|
157
171
|
};
|
|
172
|
+
/** Factory for creating span sources. Each eval gets its own instance. Defaults to LocalSpanSource (SSE from dev server). */
|
|
173
|
+
createSpanSource?: () => SpanSource;
|
|
174
|
+
/** Externally-provided run ID. When set, the runner uses this instead of generating its own. */
|
|
175
|
+
runId?: string;
|
|
176
|
+
/** Pre-resolved chat integration webhook ID. Skips the getBot() discovery call when provided. */
|
|
177
|
+
chatWebhookId?: string;
|
|
178
|
+
/** Base URL for the chat service (e.g. https://chat.botpress.dev). Defaults to https://chat.botpress.cloud. */
|
|
179
|
+
chatBaseUrl?: string;
|
|
158
180
|
}
|
|
159
181
|
export interface EvalFilter {
|
|
160
182
|
names?: string[];
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,IAAI,EACJ,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAA;AAErB,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
package/dist/types.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/definition.ts"],
|
|
4
|
-
"sourcesContent": ["export type MatchOperator =\n | string\n | { equals: unknown }\n | { contains: string }\n | { not_contains: string }\n | { matches: string }\n | { in: unknown[] }\n | { exists: boolean }\n | { gte: number }\n | { lte: number }\n\nexport type ResponseAssertion =\n | { contains: string }\n | { not_contains: string }\n | { matches: string }\n | { llm_judge: string }\n// | { similar_to: string } TODO: uncomment this when it gets implemented\n\nexport type ToolAssertion =\n | { called: string; params?: Record<string, MatchOperator> }\n | { not_called: string }\n | { call_order: string[] }\n\nexport interface StateAssertion {\n path: string\n equals?: unknown\n changed?: boolean\n}\n\nexport interface WorkflowAssertion {\n name: string\n entered?: boolean\n completed?: boolean\n}\n\nexport type NumericOperator = { equals: number } | { gte: number } | { lte: number }\n\nexport interface TimingAssertion {\n response_time: NumericOperator\n}\n\nexport interface TurnAssertions {\n response?: ResponseAssertion[]\n tools?: ToolAssertion[]\n state?: StateAssertion[]\n workflow?: WorkflowAssertion[]\n timing?: TimingAssertion[]\n}\n\nexport interface ConversationTurn {\n user?: string\n event?: { type: string; payload?: Record<string, unknown> }\n expectSilence?: boolean\n assert?: TurnAssertions\n}\n\nexport interface OutcomeAssertions {\n state?: StateAssertion[]\n workflow?: WorkflowAssertion[]\n}\n\nexport interface EvalSetup {\n state?: {\n bot?: Record<string, unknown>\n user?: Record<string, unknown>\n conversation?: Record<string, unknown>\n }\n workflow?: {\n trigger: string\n input?: Record<string, unknown>\n }\n}\n\nexport interface EvalDefinition {\n name: string\n description?: string\n tags?: string[]\n type?: 'capability' | 'regression'\n setup?: EvalSetup\n conversation: ConversationTurn[]\n outcome?: OutcomeAssertions\n options?: {\n idleTimeout?: number\n judgePassThreshold?: number\n }\n}\n\nexport class Eval implements EvalDefinition {\n readonly name: string\n readonly description?: string\n readonly tags?: string[]\n readonly type?: 'capability' | 'regression'\n readonly setup?: EvalSetup\n readonly conversation: ConversationTurn[]\n readonly outcome?: OutcomeAssertions\n readonly options?: {\n idleTimeout?: number\n judgePassThreshold?: number\n }\n\n constructor(def: EvalDefinition) {\n this.name = def.name\n this.conversation = def.conversation\n if (def.description !== undefined) this.description = def.description\n if (def.tags !== undefined) this.tags = def.tags\n if (def.type !== undefined) this.type = def.type\n if (def.setup !== undefined) this.setup = def.setup\n if (def.outcome !== undefined) this.outcome = def.outcome\n if (def.options !== undefined) this.options = def.options\n }\n}\n"],
|
|
5
|
-
"mappings": ";
|
|
3
|
+
"sources": ["../src/definition.ts", "../src/types.ts"],
|
|
4
|
+
"sourcesContent": ["export type MatchOperator =\n | string\n | { equals: unknown }\n | { contains: string }\n | { not_contains: string }\n | { matches: string }\n | { in: unknown[] }\n | { exists: boolean }\n | { gte: number }\n | { lte: number }\n\nexport type ResponseAssertion =\n | { contains: string }\n | { not_contains: string }\n | { matches: string }\n | { llm_judge: string }\n// | { similar_to: string } TODO: uncomment this when it gets implemented\n\nexport type ToolAssertion =\n | { called: string; params?: Record<string, MatchOperator> }\n | { not_called: string }\n | { call_order: string[] }\n\nexport interface StateAssertion {\n path: string\n equals?: unknown\n changed?: boolean\n}\n\nexport interface WorkflowAssertion {\n name: string\n entered?: boolean\n completed?: boolean\n}\n\nexport type NumericOperator = { equals: number } | { gte: number } | { lte: number }\n\nexport interface TimingAssertion {\n response_time: NumericOperator\n}\n\nexport interface TurnAssertions {\n response?: ResponseAssertion[]\n tools?: ToolAssertion[]\n state?: StateAssertion[]\n workflow?: WorkflowAssertion[]\n timing?: TimingAssertion[]\n}\n\nexport interface ConversationTurn {\n user?: string\n event?: { payload: Record<string, unknown> }\n expectSilence?: boolean\n assert?: TurnAssertions\n /**\n * Run this turn in a NEW conversation under the same user. The prior\n * transcript is absent, so recall here can only come from user-scoped\n * persistence, not context. Ignored on the first turn.\n */\n newConversation?: boolean\n}\n\nexport interface OutcomeAssertions {\n state?: StateAssertion[]\n workflow?: WorkflowAssertion[]\n}\n\nexport interface EvalSetup {\n state?: {\n bot?: Record<string, unknown>\n user?: Record<string, unknown>\n conversation?: Record<string, unknown>\n }\n workflow?: {\n trigger: string\n input?: Record<string, unknown>\n }\n}\n\nexport interface EvalDefinition {\n name: string\n description?: string\n tags?: string[]\n type?: 'capability' | 'regression'\n setup?: EvalSetup\n conversation: ConversationTurn[]\n outcome?: OutcomeAssertions\n options?: {\n idleTimeout?: number\n /** @deprecated No-op: the LLM judge is boolean (zai.check); there is no score threshold. */\n judgePassThreshold?: number\n }\n}\n\nexport class Eval implements EvalDefinition {\n readonly name: string\n readonly description?: string\n readonly tags?: string[]\n readonly type?: 'capability' | 'regression'\n readonly setup?: EvalSetup\n readonly conversation: ConversationTurn[]\n readonly outcome?: OutcomeAssertions\n readonly options?: {\n idleTimeout?: number\n /** @deprecated No-op: the LLM judge is boolean (zai.check); there is no score threshold. */\n judgePassThreshold?: number\n }\n\n constructor(def: EvalDefinition) {\n this.name = def.name\n this.conversation = def.conversation\n if (def.description !== undefined) this.description = def.description\n if (def.tags !== undefined) this.tags = def.tags\n if (def.type !== undefined) this.type = def.type\n if (def.setup !== undefined) this.setup = def.setup\n if (def.outcome !== undefined) this.outcome = def.outcome\n if (def.options !== undefined) this.options = def.options\n }\n}\n", "/**\n * Eval type definitions.\n *\n * User-facing types live in @botpress/evals so eval authors can update eval\n * tooling without tying the authoring API to the agent runtime package.\n */\n\nimport type { EvalDefinition as _EvalDefinition } from './definition'\n\nexport {\n Eval,\n type EvalDefinition,\n type EvalSetup,\n type ConversationTurn,\n type TurnAssertions,\n type OutcomeAssertions,\n type ResponseAssertion,\n type ToolAssertion,\n type StateAssertion,\n type WorkflowAssertion,\n type TimingAssertion,\n type MatchOperator,\n type NumericOperator,\n} from './definition'\n\nexport type { Span, SpanStatus } from './spans/trace'\nexport type { WaitOptions, WorkflowWaitOptions } from './spans/span-source'\nimport type { SpanSource } from './spans/span-source'\nexport type { SpanSource }\n\n/**\n * The @botpress/chat Client *class* (constructor) \u2014 not an instance. Callers\n * inject it (the CLI passes its bundled chat client) and the runner calls the\n * static `.connect()`. Typed via `typeof import(...)` so this types-only module\n * doesn't pull in a value import.\n */\nexport type ChatClient = typeof import('@botpress/chat').Client\n\n// --- Grader result (universal currency for all graders) ---\n\nexport interface GraderResult {\n assertion: string\n pass: boolean\n expected: string\n actual: string\n /**\n * True when the assertion could not actually be evaluated (e.g. the llm_judge had no credentials,\n * returned an empty response, or errored). Distinguishes a genuine pass from a \"didn't run\" pass.\n * Callers that demand a trustworthy verdict (e.g. the benchmark) should treat `skipped` as a failure.\n */\n skipped?: boolean\n}\n\n// --- Tool call extracted from traces ---\n\nexport interface ToolCall {\n name: string\n input: Record<string, unknown>\n output: string\n status: string\n}\n\n// --- Turn report ---\n\nexport interface TurnReport {\n turnIndex: number\n userMessage: string\n botResponse: string\n assertions: GraderResult[]\n pass: boolean\n /** Time spent waiting for the bot to respond (ms) */\n botDuration: number\n /** Time spent fetching traces + running graders (ms) */\n evalDuration: number\n}\n\n// --- Single eval report ---\n\nexport interface EvalReport {\n name: string\n description?: string\n type?: 'capability' | 'regression'\n tags?: string[]\n turns: TurnReport[]\n outcomeAssertions: GraderResult[]\n pass: boolean\n duration: number\n error?: string\n /** Stable EvalErrorCode when `error` came from a typed EvalRunnerError \u2014 lets consumers distinguish setup/config failures from bot failures. */\n errorCode?: string\n}\n\n// --- Progress event for real-time UI updates ---\n\nexport type EvalProgressEvent =\n | { type: 'suite_start'; totalEvals: number }\n | { type: 'eval_start'; evalName: string; index: number; totalTurns: number }\n | {\n type: 'turn_start'\n evalName: string\n evalIndex: number\n turnIndex: number\n totalTurns: number\n userMessage: string\n }\n | {\n type: 'turn_complete'\n evalName: string\n evalIndex: number\n turnIndex: number\n totalTurns: number\n turnReport: TurnReport\n }\n | { type: 'eval_complete'; evalName: string; index: number; report: EvalReport }\n | { type: 'suite_complete'; report: EvalRunReport; error?: string }\n\n// --- Eval run report (full suite) ---\n\nexport interface EvalRunReport {\n id: string\n timestamp: string\n evals: EvalReport[]\n passed: number\n failed: number\n total: number\n duration: number\n filter?: {\n names?: string[]\n tags?: string[]\n type?: 'capability' | 'regression'\n }\n /**\n * True when the suite was aborted mid-run (e.g. user clicked Stop). The\n * persisted report is partial \u2014 `evals` reflects only the completed evals,\n * and `total` matches that count, not the original suite size.\n */\n aborted?: boolean\n}\n\n// --- Bot connection info ---\n\nexport interface BotConnection {\n client: import('@botpress/client').Client\n botId: string\n}\n\n// --- Logger interface ---\n\nexport interface EvalLogger {\n info: (message: string) => void\n warn: (message: string) => void\n error: (message: string) => void\n}\n\n/**\n * Fallback when no logger is injected (programmatic use outside the CLI).\n * console rather than a no-op so warnings stay visible \u2014 a silent default\n * would hide judge failures and skipped pre-flights, the exact swallow\n * anti-pattern docs/ERROR-HANDLING.md bans. The CLI always injects its own\n * structured logger via EvalRunnerConfig.logger.\n */\nexport const defaultLogger: EvalLogger = console\n\n// --- Eval runner configuration ---\n\nexport interface EvalRunnerConfig {\n /** Authenticated Botpress client. Used for state seeding, workflow triggers, webhook discovery, and LLM judge. */\n client: import('@botpress/client').Client\n botId: string\n /** Path to the agent directory. Used to discover eval files from `<agentPath>/evals/`. Not needed when `definitions` is provided. */\n agentPath?: string\n /** Pre-loaded eval definitions. When provided, `agentPath` is not used for eval discovery. */\n definitions?: _EvalDefinition[]\n /** URL of the dev server providing traces and config. Defaults to the discovered DevConsole URL. */\n devServerUrl?: string\n /** Headers for dev-server requests, e.g. X-Agent-Path when routed through the singleton proxy. */\n devServerHeaders?: Record<string, string>\n /**\n * Optional host-provided chat client. The CLI passes its bundled chat client\n * here so the eval engine does not depend on @botpress/adk.\n */\n chatClient?: ChatClient\n onProgress?: (event: EvalProgressEvent) => void | Promise<void>\n /** Logger for warnings and errors. Defaults to console. */\n logger?: EvalLogger\n /**\n * Called for unexpected (internal-bug) eval failures that runEval folds\n * into report.error \u2014 they never propagate to the CLI's command boundary,\n * so without this hook they'd be invisible to error tracking. The CLI binds\n * this to telemetry.captureException; evals itself stays telemetry-free.\n */\n onException?: (error: unknown, properties?: Record<string, unknown>) => void\n /**\n * Optional abort signal \u2014 when fired, the suite stops starting new evals.\n * The currently running eval continues to completion (LLM calls in flight\n * cannot always be cancelled), but no further evals are started.\n */\n signal?: AbortSignal\n /** Bot-level eval options from agent.config.ts. Cascades: eval > agent config > default. */\n evalOptions?: {\n idleTimeout?: number\n /** LLM judge pass threshold (integer, 1-5). Values outside this range are clamped. Cascades: eval > agent config > default (3). */\n judgePassThreshold?: number\n /** Model to use for llm_judge assertions (e.g. 'openai:gpt-4o'). Defaults to 'fast'. */\n judgeModel?: string\n }\n /** Factory for creating span sources. Each eval gets its own instance. Defaults to LocalSpanSource (SSE from dev server). */\n createSpanSource?: () => SpanSource\n /** Externally-provided run ID. When set, the runner uses this instead of generating its own. */\n runId?: string\n /** Pre-resolved chat integration webhook ID. Skips the getBot() discovery call when provided. */\n chatWebhookId?: string\n /** Base URL for the chat service (e.g. https://chat.botpress.dev). Defaults to https://chat.botpress.cloud. */\n chatBaseUrl?: string\n}\n\n// --- Eval suite filter ---\n\nexport interface EvalFilter {\n names?: string[]\n tags?: string[]\n type?: 'capability' | 'regression'\n}\n\n// --- Transformer types (trace-driven eval engine) ---\n\nexport interface StateMutation {\n type: string // 'bot', 'user', 'conversation'\n changedKeys: string[]\n previous: unknown\n current: unknown\n swappedToFile: boolean // data['swapped_to_file'] === true\n}\n\nexport interface WorkflowSpan {\n name: string\n status: 'running' | 'ok' | 'error'\n statusFinal?: string // 'completed', 'continue', 'failed'\n}\n\nexport interface TurnData {\n messages: string[]\n toolCalls: ToolCall[]\n stateMutations: StateMutation[]\n workflowSpans: WorkflowSpan[]\n handlerDuration: number\n handlerStatus: 'ok' | 'error'\n}\n"],
|
|
5
|
+
"mappings": ";AA8FO,IAAM,OAAN,MAAqC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAMT,YAAY,KAAqB;AAC/B,SAAK,OAAO,IAAI;AAChB,SAAK,eAAe,IAAI;AACxB,QAAI,IAAI,gBAAgB,OAAW,MAAK,cAAc,IAAI;AAC1D,QAAI,IAAI,SAAS,OAAW,MAAK,OAAO,IAAI;AAC5C,QAAI,IAAI,SAAS,OAAW,MAAK,OAAO,IAAI;AAC5C,QAAI,IAAI,UAAU,OAAW,MAAK,QAAQ,IAAI;AAC9C,QAAI,IAAI,YAAY,OAAW,MAAK,UAAU,IAAI;AAClD,QAAI,IAAI,YAAY,OAAW,MAAK,UAAU,IAAI;AAAA,EACpD;AACF;;;AC2CO,IAAM,gBAA4B;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@botpress/evals",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-alpha.0",
|
|
4
4
|
"description": "Evaluation definitions and runner for ADK-based Botpress agents",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"adk",
|
|
@@ -24,6 +24,49 @@
|
|
|
24
24
|
"type": "module",
|
|
25
25
|
"main": "./dist/index.js",
|
|
26
26
|
"types": "./dist/index.d.ts",
|
|
27
|
+
"typesVersions": {
|
|
28
|
+
"*": {
|
|
29
|
+
"manifest": [
|
|
30
|
+
"./dist/manifest.d.ts"
|
|
31
|
+
],
|
|
32
|
+
"stores": [
|
|
33
|
+
"./dist/stores/index.d.ts"
|
|
34
|
+
],
|
|
35
|
+
"stores/vortex": [
|
|
36
|
+
"./dist/stores/vortex-eval-store-entry.d.ts"
|
|
37
|
+
],
|
|
38
|
+
"spans": [
|
|
39
|
+
"./dist/spans/index.d.ts"
|
|
40
|
+
],
|
|
41
|
+
"runner": [
|
|
42
|
+
"./dist/runner.d.ts"
|
|
43
|
+
],
|
|
44
|
+
"loader": [
|
|
45
|
+
"./dist/loader.d.ts"
|
|
46
|
+
],
|
|
47
|
+
"client": [
|
|
48
|
+
"./dist/client.d.ts"
|
|
49
|
+
],
|
|
50
|
+
"graders": [
|
|
51
|
+
"./dist/graders/index.d.ts"
|
|
52
|
+
],
|
|
53
|
+
"trace": [
|
|
54
|
+
"./dist/spans/trace.d.ts"
|
|
55
|
+
],
|
|
56
|
+
"transformer": [
|
|
57
|
+
"./dist/transformer.d.ts"
|
|
58
|
+
],
|
|
59
|
+
"types": [
|
|
60
|
+
"./dist/types.d.ts"
|
|
61
|
+
],
|
|
62
|
+
"sse-collector": [
|
|
63
|
+
"./dist/spans/sse-collector.d.ts"
|
|
64
|
+
],
|
|
65
|
+
"definition": [
|
|
66
|
+
"./dist/definition.d.ts"
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
},
|
|
27
70
|
"exports": {
|
|
28
71
|
".": {
|
|
29
72
|
"types": "./dist/index.d.ts",
|
|
@@ -49,17 +92,33 @@
|
|
|
49
92
|
"types": "./dist/loader.d.ts",
|
|
50
93
|
"import": "./dist/loader.js"
|
|
51
94
|
},
|
|
95
|
+
"./manifest": {
|
|
96
|
+
"types": "./dist/manifest.d.ts",
|
|
97
|
+
"import": "./dist/manifest.js"
|
|
98
|
+
},
|
|
52
99
|
"./runner": {
|
|
53
100
|
"types": "./dist/runner.d.ts",
|
|
54
101
|
"import": "./dist/runner.js"
|
|
55
102
|
},
|
|
103
|
+
"./spans": {
|
|
104
|
+
"types": "./dist/spans/index.d.ts",
|
|
105
|
+
"import": "./dist/spans/index.js"
|
|
106
|
+
},
|
|
107
|
+
"./stores": {
|
|
108
|
+
"types": "./dist/stores/index.d.ts",
|
|
109
|
+
"import": "./dist/stores/index.js"
|
|
110
|
+
},
|
|
111
|
+
"./stores/vortex": {
|
|
112
|
+
"types": "./dist/stores/vortex-eval-store-entry.d.ts",
|
|
113
|
+
"import": "./dist/stores/vortex-eval-store-entry.js"
|
|
114
|
+
},
|
|
56
115
|
"./sse-collector": {
|
|
57
|
-
"types": "./dist/sse-collector.d.ts",
|
|
58
|
-
"import": "./dist/sse-collector.js"
|
|
116
|
+
"types": "./dist/spans/sse-collector.d.ts",
|
|
117
|
+
"import": "./dist/spans/sse-collector.js"
|
|
59
118
|
},
|
|
60
119
|
"./trace": {
|
|
61
|
-
"types": "./dist/trace.d.ts",
|
|
62
|
-
"import": "./dist/trace.js"
|
|
120
|
+
"types": "./dist/spans/trace.d.ts",
|
|
121
|
+
"import": "./dist/spans/trace.js"
|
|
63
122
|
},
|
|
64
123
|
"./transformer": {
|
|
65
124
|
"types": "./dist/transformer.d.ts",
|
|
@@ -80,7 +139,8 @@
|
|
|
80
139
|
"dependencies": {
|
|
81
140
|
"@botpress/chat": "~0.5.5",
|
|
82
141
|
"@botpress/client": "~1.46.0",
|
|
83
|
-
"@botpress/cognitive": "~0.
|
|
142
|
+
"@botpress/cognitive": "~0.6.0",
|
|
143
|
+
"@botpress/zai": "~2.6.24"
|
|
84
144
|
},
|
|
85
145
|
"peerDependencies": {
|
|
86
146
|
"typescript": ">=4.5.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sse-collector.d.ts","sourceRoot":"","sources":["../src/sse-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAEnC,KAAK,SAAS,GAAG;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpE,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAA;IACf;;;;;OAKG;IACH,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B;AAED,UAAU,mBAAoB,SAAQ,WAAW;IAC/C,MAAM,EAAE,SAAS,GAAG,WAAW,CAAA;CAChC;AAgBD,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,OAAO,CAAwB;IAEvC,yEAAyE;IACzE,OAAO,CAAC,OAAO,CAA0B;IAEzC,iFAAiF;IACjF,OAAO,CAAC,aAAa,CAAoB;IAEzC,+EAA+E;IAC/E,OAAO,CAAC,eAAe,CAAoB;IAE3C,0CAA0C;IAC1C,OAAO,CAAC,OAAO,CAAkC;IAEjD,qDAAqD;IACrD,OAAO,CAAC,eAAe,CAA+B;IAEtD,8CAA8C;IAC9C,OAAO,CAAC,SAAS,CAAQ;IAEzB,yDAAyD;IACzD,OAAO,CAAC,WAAW,CAAqB;IAExC,sFAAsF;IACtF,OAAO,CAAC,aAAa,CAA4B;gBAErC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM;IAKtE;;;OAGG;IACG,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC/C;;;;OAIG;IACH,SAAS,IAAI,IAAI;IAYjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAM;IAEvC;;;;;;;;OAQG;IACG,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAuC3D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAQ;IAE7C;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IA4B3B;;;;OAIG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyC7E;;OAEG;IACH,YAAY,IAAI,IAAI,EAAE;IAUtB;;OAEG;IACH,WAAW,IAAI,IAAI,EAAE;IAIrB;;OAEG;IACH,UAAU,IAAI,IAAI;IAgBlB,qDAAqD;IACrD,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,iBAAiB,CAAwB;IAEjD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAEpD;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA2BxB;;OAEG;YACW,cAAc;IA2B5B;;;OAGG;IACH,OAAO,CAAC,cAAc;IA+BtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;;;;;;;;OASG;IACH,OAAO,CAAC,uBAAuB;IAc/B;;OAEG;IACH,OAAO,CAAC,yBAAyB;CAmBlC"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/sse-collector.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * SSECollector \u2014 connects to the ADK dev server's SSE trace stream,\n * accumulates spans, and provides promise-based wait methods for\n * turn completion and workflow signals.\n *\n * Uses fetch() + async iteration with manual SSE line parsing\n * (Bun does not have native EventSource).\n */\n\nimport type { Span } from './trace'\n\ntype SSEFilter = { conversationId: string } | { workflowId: string }\n\ninterface WaitOptions {\n timeout: number\n /**\n * Optional abort signal \u2014 when fired, the wait rejects immediately rather\n * than burning the full timeout. Used by the runner so Stop unblocks\n * pending workflow assertions (otherwise a single negative-result wait\n * can hold the suite hostage for `idleTimeout` per assertion).\n */\n abortSignal?: AbortSignal\n}\n\ninterface WorkflowWaitOptions extends WaitOptions {\n signal: 'entered' | 'completed'\n}\n\n/**\n * Unique key for span deduplication.\n */\nfunction spanKey(span: Span): string {\n return `${span.id.trace}:${span.id.span}`\n}\n\n/**\n * Type-safe accessor for span.data fields.\n */\nfunction spanData(span: Span): Record<string, unknown> {\n return span.data && typeof span.data === 'object' ? (span.data as Record<string, unknown>) : {}\n}\n\nexport class SSECollector {\n private devServerUrl: string\n private headers: Record<string, string>\n\n /** All spans accumulated since connect(), keyed by spanKey for dedup. */\n private spanMap = new Map<string, Span>()\n\n /** Index into spanMap insertion order marking where the current turn started. */\n private turnStartKeys = new Set<string>()\n\n /** Handler span IDs seen before the current turn (for startTurn filtering). */\n private seenHandlerKeys = new Set<string>()\n\n /** Callbacks waiting for span updates. */\n private waiters: Array<(span: Span) => void> = []\n\n /** AbortController for the active SSE connection. */\n private abortController: AbortController | null = null\n\n /** Whether the background loop is running. */\n private connected = false\n\n /** Error from the SSE stream if it died unexpectedly. */\n private streamError: Error | null = null\n\n /** Set while a settle phase is in flight; called by disconnect() to short-circuit. */\n private _cancelSettle: (() => void) | null = null\n\n constructor(devServerUrl: string, headers: Record<string, string> = {}) {\n this.devServerUrl = devServerUrl\n this.headers = headers\n }\n\n /**\n * Open a streaming SSE connection filtered by conversationId or workflowId.\n * Starts a background loop that parses SSE events and accumulates spans.\n */\n async connect(filter: SSEFilter): Promise<void> {\n const attributeName = 'conversationId' in filter ? 'conversationId' : 'workflowId'\n const attributeValue = 'conversationId' in filter ? filter.conversationId : filter.workflowId\n\n const url = `${this.devServerUrl}/api/traces/stream?attributeName=${encodeURIComponent(attributeName)}&attributeValue=${encodeURIComponent(attributeValue)}`\n\n this.abortController = new AbortController()\n\n const response = await fetch(url, {\n headers: { ...this.headers, Accept: 'text/event-stream' },\n signal: this.abortController.signal,\n })\n\n if (!response.ok) {\n throw new Error(`SSE connection failed: ${response.status} ${response.statusText}`)\n }\n\n if (!response.body) {\n throw new Error('SSE response has no body')\n }\n\n this.connected = true\n\n // Start background parsing loop\n this._consumeStream(response.body).catch((err) => {\n if (this.connected) {\n this.streamError = err instanceof Error ? err : new Error(String(err))\n }\n })\n\n // Wait for the initial snapshot to arrive before returning.\n // This ensures that connect() resolves only after the snapshot\n // has been processed so callers can immediately check spans.\n await this._waitForSnapshot()\n }\n\n /**\n * Mark the beginning of a new turn.\n * Records which handler.conversation span IDs have been seen so far,\n * so waitForTurnComplete() only resolves on NEW handler completions.\n */\n startTurn(): void {\n // Snapshot the current set of span keys as the turn boundary\n this.turnStartKeys = new Set(this.spanMap.keys())\n\n // Record all handler.conversation spans seen so far\n for (const [key, span] of this.spanMap) {\n if (span.name === 'handler.conversation') {\n this.seenHandlerKeys.add(key)\n }\n }\n }\n\n private static readonly SETTLE_MS = 100\n\n /**\n * Wait for a handler.conversation span to reach terminal status (ok or error).\n * Only considers spans NOT seen before the last startTurn() call.\n *\n * After the handler closes, waits for a quiet period (no new spans for SETTLE_MS)\n * to ensure all child spans (tool calls, messages, state saves) have arrived.\n * The runtime's HttpSpanExporter fires POSTs without awaiting them, so child\n * spans may arrive slightly after the handler close event.\n */\n async waitForTurnComplete(opts: WaitOptions): Promise<void> {\n // Check if a completed handler already exists (e.g. from snapshot)\n if (this._hasNewCompletedHandler()) {\n return this._settleAfterHandler()\n }\n if (opts.abortSignal?.aborted) {\n throw new Error('waitForTurnComplete aborted')\n }\n\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n this._removeWaiter(waiter)\n opts.abortSignal?.removeEventListener('abort', onAbort)\n const reason = this.streamError\n ? `SSE stream died: ${this.streamError.message}`\n : 'no handler.conversation span completed'\n reject(new Error(`waitForTurnComplete timed out after ${opts.timeout}ms \u2014 ${reason}`))\n }, opts.timeout)\n\n const onAbort = () => {\n clearTimeout(timer)\n this._removeWaiter(waiter)\n reject(new Error('waitForTurnComplete aborted'))\n }\n opts.abortSignal?.addEventListener('abort', onAbort, { once: true })\n\n const waiter = (_span: Span) => {\n if (this._hasNewCompletedHandler()) {\n clearTimeout(timer)\n this._removeWaiter(waiter)\n opts.abortSignal?.removeEventListener('abort', onAbort)\n this._settleAfterHandler().then(resolve, reject)\n }\n }\n\n this.waiters.push(waiter)\n })\n }\n\n private static readonly MAX_SETTLE_MS = 2_000\n\n /**\n * After the handler span closes, wait for spans to stop arriving.\n * Resolves when no new spans arrive for SETTLE_MS, or after MAX_SETTLE_MS hard cap.\n *\n * Exposes a cancellation hook via _cancelSettle so disconnect() can short-\n * circuit an in-flight settle phase and avoid leaking timers for up to 2s.\n */\n private _settleAfterHandler(): Promise<void> {\n return new Promise<void>((resolve) => {\n let resolved = false\n const done = () => {\n if (resolved) return\n resolved = true\n clearTimeout(hardCap)\n clearTimeout(settleTimer)\n this._removeWaiter(settleWaiter)\n this._cancelSettle = null\n resolve()\n }\n\n const hardCap = setTimeout(done, SSECollector.MAX_SETTLE_MS)\n\n let settleTimer = setTimeout(done, SSECollector.SETTLE_MS)\n\n const settleWaiter = () => {\n if (resolved) return\n clearTimeout(settleTimer)\n settleTimer = setTimeout(done, SSECollector.SETTLE_MS)\n }\n\n this.waiters.push(settleWaiter)\n this._cancelSettle = done\n })\n }\n\n /**\n * Wait for a handler.workflow span with matching workflow name.\n * - signal 'entered': resolves when the span appears (any status)\n * - signal 'completed': resolves when the span has status !== 'running'\n */\n async waitForWorkflow(name: string, opts: WorkflowWaitOptions): Promise<void> {\n // Check if condition is already met\n if (this._matchesWorkflowCondition(name, opts.signal)) {\n return\n }\n if (opts.abortSignal?.aborted) {\n throw new Error(`waitForWorkflow(\"${name}\", { signal: \"${opts.signal}\" }) aborted`)\n }\n\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n this._removeWaiter(waiter)\n opts.abortSignal?.removeEventListener('abort', onAbort)\n const reason = this.streamError ? `SSE stream died: ${this.streamError.message}` : 'span not found'\n reject(\n new Error(\n `waitForWorkflow(\"${name}\", { signal: \"${opts.signal}\" }) timed out after ${opts.timeout}ms \u2014 ${reason}`\n )\n )\n }, opts.timeout)\n\n const onAbort = () => {\n clearTimeout(timer)\n this._removeWaiter(waiter)\n reject(new Error(`waitForWorkflow(\"${name}\", { signal: \"${opts.signal}\" }) aborted`))\n }\n opts.abortSignal?.addEventListener('abort', onAbort, { once: true })\n\n const waiter = (_span: Span) => {\n if (this._matchesWorkflowCondition(name, opts.signal)) {\n clearTimeout(timer)\n this._removeWaiter(waiter)\n opts.abortSignal?.removeEventListener('abort', onAbort)\n resolve()\n }\n }\n\n this.waiters.push(waiter)\n })\n }\n\n /**\n * Return spans accumulated since the last startTurn() call.\n */\n getTurnSpans(): Span[] {\n const result: Span[] = []\n for (const [key, span] of this.spanMap) {\n if (!this.turnStartKeys.has(key)) {\n result.push(span)\n }\n }\n return result\n }\n\n /**\n * Return all spans accumulated since connect().\n */\n getAllSpans(): Span[] {\n return Array.from(this.spanMap.values())\n }\n\n /**\n * Close the SSE connection and clean up.\n */\n disconnect(): void {\n this.connected = false\n this.abortController?.abort()\n this.abortController = null\n // Short-circuit an in-flight settle phase so its hardCap / settleTimer\n // don't fire after disconnect.\n this._cancelSettle?.()\n this._cancelSettle = null\n // Waiters hold setTimeout references that will reject on their own;\n // clearing the array just prevents further notifications.\n this.waiters = []\n this.snapshotResolvers = []\n }\n\n // \u2500\u2500 Private \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** Whether we have received the initial snapshot. */\n private snapshotReceived = false\n private snapshotResolvers: Array<() => void> = []\n\n private static readonly SNAPSHOT_TIMEOUT_MS = 10_000\n\n /**\n * Returns a promise that resolves once the snapshot event has been processed,\n * or rejects after a timeout to prevent connect() from hanging indefinitely.\n */\n private _waitForSnapshot(): Promise<void> {\n if (this.snapshotReceived) {\n return Promise.resolve()\n }\n return new Promise<void>((resolve, reject) => {\n let settled = false\n const resolver = () => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n resolve()\n }\n const timer = setTimeout(() => {\n if (settled) return\n settled = true\n const idx = this.snapshotResolvers.indexOf(resolver)\n if (idx !== -1) this.snapshotResolvers.splice(idx, 1)\n reject(\n new Error(\n `SSE snapshot not received within ${SSECollector.SNAPSHOT_TIMEOUT_MS}ms \u2014 is the dev server healthy?`\n )\n )\n }, SSECollector.SNAPSHOT_TIMEOUT_MS)\n this.snapshotResolvers.push(resolver)\n })\n }\n\n /**\n * Consume the ReadableStream body, parse SSE lines, and dispatch events.\n */\n private async _consumeStream(body: ReadableStream<Uint8Array>): Promise<void> {\n const decoder = new TextDecoder()\n let buffer = ''\n\n const reader = body.getReader()\n\n try {\n while (this.connected) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n\n // Split on double-newline boundaries to get complete SSE events\n const parts = buffer.split('\\n\\n')\n // The last part may be incomplete \u2014 keep it in the buffer\n buffer = parts.pop() ?? ''\n\n for (const part of parts) {\n this._parseSSEBlock(part)\n }\n }\n } finally {\n reader.releaseLock()\n }\n }\n\n /**\n * Parse a single SSE event block (text between \\n\\n boundaries).\n * Extracts event name and data payload.\n */\n private _parseSSEBlock(block: string): void {\n const lines = block.split('\\n')\n let eventName = ''\n let dataLine = ''\n\n for (const line of lines) {\n if (line.startsWith('event:')) {\n eventName = line.slice('event:'.length).trim()\n } else if (line.startsWith('data:')) {\n const value = line.slice('data:'.length).trim()\n dataLine = dataLine ? `${dataLine}\\n${value}` : value\n }\n // id: and retry: lines are ignored\n }\n\n if (!eventName || !dataLine) {\n // Could be a retry: line or empty block \u2014 skip\n if (!this.snapshotReceived && block.includes('retry:')) {\n // The retry line comes before the snapshot; don't resolve yet\n }\n return\n }\n\n try {\n const payload = JSON.parse(dataLine)\n this._handleEvent(eventName, payload)\n } catch {\n // Malformed JSON \u2014 skip\n }\n }\n\n /**\n * Dispatch a parsed SSE event to the appropriate handler.\n */\n private _handleEvent(eventName: string, payload: unknown): void {\n if (eventName === 'snapshot') {\n const data = payload as { spans: Span[] }\n const spans = Array.isArray(data.spans) ? data.spans : []\n for (const span of spans) {\n this._upsertSpan(span)\n }\n this.snapshotReceived = true\n for (const resolve of this.snapshotResolvers) {\n resolve()\n }\n this.snapshotResolvers = []\n } else if (eventName === 'update') {\n const data = payload as { span: Span }\n if (data.span) {\n this._upsertSpan(data.span)\n this._notifyWaiters(data.span)\n }\n }\n // keepalive events are intentionally ignored\n }\n\n /**\n * Insert or replace a span in the map (dedup by trace+span ID).\n */\n private _upsertSpan(span: Span): void {\n this.spanMap.set(spanKey(span), span)\n }\n\n /**\n * Notify all waiters that a new span was received.\n */\n private _notifyWaiters(span: Span): void {\n // Copy the array since waiters may remove themselves during iteration\n const current = [...this.waiters]\n for (const waiter of current) {\n waiter(span)\n }\n }\n\n /**\n * Remove a waiter callback from the list.\n */\n private _removeWaiter(fn: (span: Span) => void): void {\n const idx = this.waiters.indexOf(fn)\n if (idx !== -1) {\n this.waiters.splice(idx, 1)\n }\n }\n\n /**\n * Check if there is a handler.conversation span that:\n * 1. Was NOT seen before startTurn()\n * 2. Has terminal status (ok or error)\n *\n * Marks the matched key as consumed so the same handler span cannot\n * satisfy both the current turn's settle phase AND the next turn's\n * waitForTurnComplete check (which would otherwise resolve instantly\n * against stale data instead of waiting for the new turn's handler).\n */\n private _hasNewCompletedHandler(): boolean {\n for (const [key, span] of this.spanMap) {\n if (\n span.name === 'handler.conversation' &&\n !this.seenHandlerKeys.has(key) &&\n (span.status === 'ok' || span.status === 'error')\n ) {\n this.seenHandlerKeys.add(key)\n return true\n }\n }\n return false\n }\n\n /**\n * Check if a handler.workflow span matches the given condition.\n */\n private _matchesWorkflowCondition(name: string, signal: 'entered' | 'completed'): boolean {\n for (const span of this.spanMap.values()) {\n if (span.name !== 'handler.workflow') continue\n\n const d = spanData(span)\n const wfName = d['workflow.name'] || d['workflowName']\n if (wfName !== name) continue\n\n if (signal === 'entered') {\n // Any status means the workflow was entered\n return true\n }\n\n if (signal === 'completed') {\n return span.status === 'ok' || span.status === 'error'\n }\n }\n return false\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/dist/trace.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,CAAA;AAEnD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,aAAa,GAAG,YAAY,CAAA;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAA;AAEzD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,UAAU,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,UAAU,CAAA;IAClB,OAAO,EAAE,WAAW,CAAA;IACpB,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,EAAE,YAAY,CAAA;CACvB"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|