llm-relay 0.0.1

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/sse.js ADDED
@@ -0,0 +1,105 @@
1
+ export function reconstructFromSse(raw) {
2
+ const blocks = new Map();
3
+ let stopReason = null;
4
+ let usage;
5
+ for (const data of iterateDataPayloads(raw)) {
6
+ const evt = safeParse(data);
7
+ if (!evt || typeof evt !== "object")
8
+ continue;
9
+ const type = evt.type;
10
+ switch (type) {
11
+ case "message_start": {
12
+ const msg = evt.message;
13
+ if (msg?.usage)
14
+ usage = { ...msg.usage };
15
+ break;
16
+ }
17
+ case "content_block_start": {
18
+ const index = numberOr(evt.index, -1);
19
+ const cb = evt.content_block ?? {};
20
+ blocks.set(index, {
21
+ type: typeof cb.type === "string" ? cb.type : "unknown",
22
+ text: "",
23
+ partialJson: "",
24
+ id: typeof cb.id === "string" ? cb.id : undefined,
25
+ name: typeof cb.name === "string" ? cb.name : undefined,
26
+ seedInput: "input" in cb ? cb.input : undefined,
27
+ });
28
+ break;
29
+ }
30
+ case "content_block_delta": {
31
+ const index = numberOr(evt.index, -1);
32
+ const delta = evt.delta ?? {};
33
+ const acc = blocks.get(index);
34
+ if (!acc)
35
+ break;
36
+ if (delta.type === "text_delta" && typeof delta.text === "string") {
37
+ acc.text += delta.text;
38
+ }
39
+ else if (delta.type === "input_json_delta" &&
40
+ typeof delta.partial_json === "string") {
41
+ acc.partialJson += delta.partial_json;
42
+ }
43
+ break;
44
+ }
45
+ case "message_delta": {
46
+ const delta = evt.delta;
47
+ if (delta && "stop_reason" in delta)
48
+ stopReason = delta.stop_reason ?? stopReason;
49
+ const u = evt.usage;
50
+ if (u)
51
+ usage = { ...usage, ...u };
52
+ break;
53
+ }
54
+ default:
55
+ break; // content_block_stop, message_stop, ping — no state to fold
56
+ }
57
+ }
58
+ const ordered = [...blocks.entries()].sort((a, b) => a[0] - b[0]);
59
+ const content = ordered.map(([, acc]) => finalizeBlock(acc));
60
+ return { content, stop_reason: stopReason, usage };
61
+ }
62
+ function finalizeBlock(acc) {
63
+ if (acc.type === "text") {
64
+ return { type: "text", text: acc.text };
65
+ }
66
+ if (acc.type === "tool_use") {
67
+ let input = acc.seedInput ?? {};
68
+ if (acc.partialJson.length > 0) {
69
+ const parsed = safeParse(acc.partialJson);
70
+ // If the streamed tool JSON is malformed/incomplete, surface the raw
71
+ // string so the validator flags input_not_object rather than silently
72
+ // treating it as {}.
73
+ input = parsed === undefined ? acc.partialJson : parsed;
74
+ }
75
+ return { type: "tool_use", id: acc.id ?? "", name: acc.name ?? "", input };
76
+ }
77
+ return { type: acc.type };
78
+ }
79
+ /** Yield each `data:` payload from an SSE byte stream (handles multi-line data). */
80
+ function* iterateDataPayloads(raw) {
81
+ // Frames are separated by a blank line. Within a frame, concatenate all
82
+ // `data:` lines (SSE allows multiple).
83
+ const frames = raw.split(/\r?\n\r?\n/);
84
+ for (const frame of frames) {
85
+ const dataLines = [];
86
+ for (const line of frame.split(/\r?\n/)) {
87
+ if (line.startsWith("data:"))
88
+ dataLines.push(line.slice(5).trimStart());
89
+ }
90
+ if (dataLines.length > 0)
91
+ yield dataLines.join("\n");
92
+ }
93
+ }
94
+ function safeParse(s) {
95
+ try {
96
+ return JSON.parse(s);
97
+ }
98
+ catch {
99
+ return undefined;
100
+ }
101
+ }
102
+ function numberOr(v, fallback) {
103
+ return typeof v === "number" && Number.isFinite(v) ? v : fallback;
104
+ }
105
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { type AssistantMessage, type JsonSchema } from "./anthropic.js";
2
+ export interface ValidationError {
3
+ kind: "unknown_tool" | "input_not_object" | "schema_violation" | "stop_reason_mismatch";
4
+ blockIndex: number | null;
5
+ tool: string | null;
6
+ path?: string;
7
+ message: string;
8
+ }
9
+ export interface ValidationResult {
10
+ valid: boolean;
11
+ errors: ValidationError[];
12
+ /** tool_use blocks seen. */
13
+ toolUseCount: number;
14
+ /**
15
+ * tool_use blocks that could not be schema-checked (declared tool with no
16
+ * input_schema, or a schema Ajv could not compile). NOT a failure and NOT a
17
+ * clean pass — surfaced as its own verdict so "uncompilable schema" is never
18
+ * silently counted as valid.
19
+ */
20
+ uncheckableCount: number;
21
+ }
22
+ /**
23
+ * Deterministic tool_use gate. NO LLM. Turns a silently-broken tool call (empty
24
+ * args, wrong schema, hallucinated tool, or a tool_use without the matching
25
+ * stop_reason) into an explicit result the caller can log (detect mode) or act
26
+ * on (repair mode, later).
27
+ */
28
+ export declare class ToolUseValidator {
29
+ private readonly ajv;
30
+ private readonly cache;
31
+ constructor();
32
+ /** Returns a compiled validator, or null if the schema could not compile. */
33
+ private compiledFor;
34
+ validate(assistant: AssistantMessage, tools: Map<string, JsonSchema | null>): ValidationResult;
35
+ }
@@ -0,0 +1,126 @@
1
+ import Ajv2020Import from "ajv/dist/2020.js";
2
+ import { isToolUseBlock, } from "./anthropic.js";
3
+ // ajv is a CJS module; under NodeNext the default import is not seen as
4
+ // constructable, so cast to its constructor type. At runtime `module.exports`
5
+ // IS the class, so `new Ajv2020(...)` works. We use the 2020-12 dialect because
6
+ // tool schemas from Pydantic-v2 / zod-to-json-schema commonly declare it; a
7
+ // draft-07-only Ajv throws on those and would force an accept-all fallback.
8
+ const Ajv2020 = Ajv2020Import;
9
+ /**
10
+ * Deterministic tool_use gate. NO LLM. Turns a silently-broken tool call (empty
11
+ * args, wrong schema, hallucinated tool, or a tool_use without the matching
12
+ * stop_reason) into an explicit result the caller can log (detect mode) or act
13
+ * on (repair mode, later).
14
+ */
15
+ export class ToolUseValidator {
16
+ ajv;
17
+ cache = new Map();
18
+ constructor() {
19
+ // Non-strict so vendor schemas (unknown formats/keywords) aren't rejected by
20
+ // the validator itself. allErrors surfaces every violation.
21
+ this.ajv = new Ajv2020({ strict: false, allErrors: true });
22
+ }
23
+ /** Returns a compiled validator, or null if the schema could not compile. */
24
+ compiledFor(name, schema) {
25
+ const key = `${name}::${stableStringify(schema)}`;
26
+ if (this.cache.has(key))
27
+ return this.cache.get(key) ?? null;
28
+ let fn;
29
+ try {
30
+ // Strip $schema so a declared dialect Ajv2020 doesn't recognize (e.g.
31
+ // draft-07) can't throw on meta-schema resolution; the structural keywords
32
+ // tools use validate the same under the 2020-12 dialect.
33
+ const { $schema: _ignored, ...rest } = schema;
34
+ fn = this.ajv.compile(rest);
35
+ }
36
+ catch {
37
+ fn = null; // uncheckable — recorded, never treated as pass
38
+ }
39
+ this.cache.set(key, fn);
40
+ return fn;
41
+ }
42
+ validate(assistant, tools) {
43
+ const errors = [];
44
+ const blocks = Array.isArray(assistant.content)
45
+ ? assistant.content
46
+ : [];
47
+ let toolUseCount = 0;
48
+ let uncheckableCount = 0;
49
+ blocks.forEach((block, blockIndex) => {
50
+ if (!isToolUseBlock(block))
51
+ return;
52
+ toolUseCount++;
53
+ const { name, input } = block;
54
+ if (!tools.has(name)) {
55
+ errors.push({
56
+ kind: "unknown_tool",
57
+ blockIndex,
58
+ tool: name,
59
+ message: `tool_use references tool "${name}" not present in request tools[]`,
60
+ });
61
+ return;
62
+ }
63
+ // input must be a JSON object for ANY tool, schema or not.
64
+ if (typeof input !== "object" || input === null || Array.isArray(input)) {
65
+ errors.push({
66
+ kind: "input_not_object",
67
+ blockIndex,
68
+ tool: name,
69
+ message: `tool_use.input is not a JSON object (got ${describe(input)})`,
70
+ });
71
+ return;
72
+ }
73
+ const schema = tools.get(name) ?? null;
74
+ if (schema === null) {
75
+ uncheckableCount++; // declared built-in/typed tool, no schema to check
76
+ return;
77
+ }
78
+ const validate = this.compiledFor(name, schema);
79
+ if (validate === null) {
80
+ uncheckableCount++; // schema would not compile
81
+ return;
82
+ }
83
+ if (!validate(input)) {
84
+ for (const err of validate.errors ?? []) {
85
+ errors.push({
86
+ kind: "schema_violation",
87
+ blockIndex,
88
+ tool: name,
89
+ path: err.instancePath || "/",
90
+ message: `${err.instancePath || "(root)"} ${err.message ?? "failed schema"}`,
91
+ });
92
+ }
93
+ }
94
+ });
95
+ // stop_reason consistency: a tool_use block requires stop_reason "tool_use",
96
+ // else the harness will not execute the tool (loop stalls).
97
+ if (toolUseCount > 0 && assistant.stop_reason !== "tool_use") {
98
+ errors.push({
99
+ kind: "stop_reason_mismatch",
100
+ blockIndex: null,
101
+ tool: null,
102
+ message: `response has ${toolUseCount} tool_use block(s) but stop_reason is "${assistant.stop_reason}" (expected "tool_use")`,
103
+ });
104
+ }
105
+ return { valid: errors.length === 0, errors, toolUseCount, uncheckableCount };
106
+ }
107
+ }
108
+ function describe(v) {
109
+ if (v === null)
110
+ return "null";
111
+ if (Array.isArray(v))
112
+ return "array";
113
+ return typeof v;
114
+ }
115
+ /** Deterministic key for schema caching (order-independent). */
116
+ function stableStringify(v) {
117
+ if (v === null || typeof v !== "object")
118
+ return JSON.stringify(v);
119
+ if (Array.isArray(v))
120
+ return `[${v.map(stableStringify).join(",")}]`;
121
+ const keys = Object.keys(v).sort();
122
+ return `{${keys
123
+ .map((k) => `${JSON.stringify(k)}:${stableStringify(v[k])}`)
124
+ .join(",")}}`;
125
+ }
126
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}