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/README.md +236 -0
- package/config.example.json +45 -0
- package/dist/anthropic.d.ts +49 -0
- package/dist/anthropic.js +35 -0
- package/dist/anthropic.js.map +1 -0
- package/dist/backend.d.ts +36 -0
- package/dist/backend.js +135 -0
- package/dist/backend.js.map +1 -0
- package/dist/catalog.d.ts +55 -0
- package/dist/catalog.js +148 -0
- package/dist/catalog.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +137 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +88 -0
- package/dist/config.js +248 -0
- package/dist/config.js.map +1 -0
- package/dist/emitSse.d.ts +18 -0
- package/dist/emitSse.js +88 -0
- package/dist/emitSse.js.map +1 -0
- package/dist/log.d.ts +26 -0
- package/dist/log.js +24 -0
- package/dist/log.js.map +1 -0
- package/dist/registry.d.ts +47 -0
- package/dist/registry.js +80 -0
- package/dist/registry.js.map +1 -0
- package/dist/repair.d.ts +24 -0
- package/dist/repair.js +44 -0
- package/dist/repair.js.map +1 -0
- package/dist/reshaper.d.ts +46 -0
- package/dist/reshaper.js +147 -0
- package/dist/reshaper.js.map +1 -0
- package/dist/server.d.ts +9 -0
- package/dist/server.js +619 -0
- package/dist/server.js.map +1 -0
- package/dist/sse.d.ts +2 -0
- package/dist/sse.js +105 -0
- package/dist/sse.js.map +1 -0
- package/dist/validator.d.ts +35 -0
- package/dist/validator.js +126 -0
- package/dist/validator.js.map +1 -0
- package/docs/tier-data.json +4601 -0
- package/package.json +39 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,619 @@
|
|
|
1
|
+
import { createServer } from "node:http";
|
|
2
|
+
import { once } from "node:events";
|
|
3
|
+
import { DEFAULT_ANTHROPIC_VERSION, resolveTarget, reshaperForTarget, RoutingError, } from "./config.js";
|
|
4
|
+
import { MetadataLogger } from "./log.js";
|
|
5
|
+
import { ToolUseValidator } from "./validator.js";
|
|
6
|
+
import { reconstructFromSse } from "./sse.js";
|
|
7
|
+
import { emitSse, emitSseTail } from "./emitSse.js";
|
|
8
|
+
import { repair, destructiveMatcher } from "./repair.js";
|
|
9
|
+
import { HttpReshaper } from "./reshaper.js";
|
|
10
|
+
import { fetchBackend, fetchOpenAiFront } from "./backend.js";
|
|
11
|
+
import { ModelCatalog } from "./catalog.js";
|
|
12
|
+
import { buildRegistry } from "./registry.js";
|
|
13
|
+
import { toolSchemaMap } from "./anthropic.js";
|
|
14
|
+
const HOP_BY_HOP = new Set([
|
|
15
|
+
"connection", "keep-alive", "proxy-authenticate", "proxy-authorization",
|
|
16
|
+
"te", "trailer", "transfer-encoding", "upgrade", "content-length", "content-encoding", "host",
|
|
17
|
+
]);
|
|
18
|
+
const INBOUND_AUTH = ["authorization", "x-api-key"];
|
|
19
|
+
const MAX_VALIDATE_BYTES = 8 * 1024 * 1024;
|
|
20
|
+
export function createProxy(cfg, deps = {}) {
|
|
21
|
+
const validator = new ToolUseValidator();
|
|
22
|
+
const logger = new MetadataLogger(cfg.log);
|
|
23
|
+
const isDestructive = destructiveMatcher(cfg.repair.destructiveTools);
|
|
24
|
+
const catalog = deps.catalog ?? new ModelCatalog();
|
|
25
|
+
// Reshaper selection is per-resolved-target: an explicit global reshaper (or an
|
|
26
|
+
// injected one) wins for every request; otherwise an openai target reshapes on
|
|
27
|
+
// itself (same base/model/key), built once per (provider, model) and cached.
|
|
28
|
+
const explicitReshaper = deps.reshaper ?? (cfg.reshaper ? new HttpReshaper(cfg.reshaper) : undefined);
|
|
29
|
+
const reshaperCache = new Map();
|
|
30
|
+
const resolveReshaper = (target) => {
|
|
31
|
+
if (explicitReshaper)
|
|
32
|
+
return explicitReshaper;
|
|
33
|
+
const spec = reshaperForTarget(target);
|
|
34
|
+
if (!spec)
|
|
35
|
+
return undefined;
|
|
36
|
+
const key = `${target.provider}::${target.model ?? ""}`;
|
|
37
|
+
let r = reshaperCache.get(key);
|
|
38
|
+
if (!r) {
|
|
39
|
+
r = new HttpReshaper(spec);
|
|
40
|
+
reshaperCache.set(key, r);
|
|
41
|
+
}
|
|
42
|
+
return r;
|
|
43
|
+
};
|
|
44
|
+
return createServer((req, res) => {
|
|
45
|
+
handle(req, res, cfg, { validator, logger, isDestructive, resolveReshaper, catalog }).catch((e) => {
|
|
46
|
+
failClosed(res, 502, `llm-relay internal error: ${e.message}`);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
async function handle(req, res, cfg, h) {
|
|
51
|
+
const started = Date.now();
|
|
52
|
+
const path = req.url ?? "/";
|
|
53
|
+
const reqBuf = await readBody(req);
|
|
54
|
+
let reqJson;
|
|
55
|
+
try {
|
|
56
|
+
reqJson = reqBuf.length ? JSON.parse(reqBuf.toString("utf8")) : undefined;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
reqJson = undefined;
|
|
60
|
+
}
|
|
61
|
+
const tools = toolSchemaMap(reqJson);
|
|
62
|
+
const hadTools = tools.size > 0;
|
|
63
|
+
const model = pickString(reqJson, "model");
|
|
64
|
+
const wantsStream = pickBool(reqJson, "stream");
|
|
65
|
+
const pathname = path.split("?")[0] ?? path;
|
|
66
|
+
// Discovery endpoint for a dispatcher (e.g. audit-tools): providers × live models
|
|
67
|
+
// (best-effort capability) + routing + raw leaderboard scores, one coherent view.
|
|
68
|
+
if (req.method === "GET" && pathname === "/registry") {
|
|
69
|
+
const view = await buildRegistry(cfg, h.catalog);
|
|
70
|
+
res.writeHead(200, { "content-type": "application/json" });
|
|
71
|
+
res.end(JSON.stringify(view));
|
|
72
|
+
h.logger.write(baseLog(started, path, model, false, false, 200, "skipped"));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const isCountTokens = req.method === "POST" && pathname === "/v1/messages/count_tokens";
|
|
76
|
+
const isMessages = req.method === "POST" && pathname.startsWith("/v1/messages") && !isCountTokens;
|
|
77
|
+
// Route the request's model to a concrete provider + backend model. A bad route
|
|
78
|
+
// (unknown provider, missing model) is a clean 400, never a crash.
|
|
79
|
+
let target;
|
|
80
|
+
try {
|
|
81
|
+
target = resolveTarget(model, cfg);
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
if (e instanceof RoutingError) {
|
|
85
|
+
failClosed(res, 400, `llm-relay routing: ${e.message}`);
|
|
86
|
+
h.logger.write(baseLog(started, path, model, hadTools, false, 400, "skipped"));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
throw e;
|
|
90
|
+
}
|
|
91
|
+
// OpenAI-compatible FRONT: a dispatcher (e.g. audit-tools) POSTs OpenAI Chat
|
|
92
|
+
// Completions with a namespaced model; route by target and reverse-proxy the
|
|
93
|
+
// upstream OpenAI response straight back (OpenAI in, OpenAI out).
|
|
94
|
+
if (req.method === "POST" && (pathname === "/v1/chat/completions" || pathname === "/chat/completions")) {
|
|
95
|
+
await openAiFrontPath(res, target, { reqJson, wantsStream, started, path, model, hadTools }, h);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// OpenAI-compatible backends expose ONLY /chat/completions — they have no
|
|
99
|
+
// count_tokens route and no other Anthropic paths. Rather than mistranslate
|
|
100
|
+
// those into a chat completion (yielding a spurious 400/garbage), answer
|
|
101
|
+
// count_tokens locally with a cheap estimate and reject other paths cleanly.
|
|
102
|
+
// For an Anthropic backend everything forwards as before (it speaks these).
|
|
103
|
+
if (target.kind === "openai") {
|
|
104
|
+
if (isCountTokens) {
|
|
105
|
+
const input_tokens = estimateInputTokens(reqJson);
|
|
106
|
+
res.writeHead(200, { "content-type": "application/json" });
|
|
107
|
+
res.end(JSON.stringify({ input_tokens }));
|
|
108
|
+
h.logger.write(baseLog(started, path, model, hadTools, false, 200, "skipped"));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (!isMessages) {
|
|
112
|
+
failClosed(res, 404, `llm-relay: path not supported for an openai backend: ${pathname}`);
|
|
113
|
+
h.logger.write(baseLog(started, path, model, hadTools, false, 404, "skipped"));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const controller = new AbortController();
|
|
118
|
+
const timer = setTimeout(() => controller.abort(), target.timeoutMs);
|
|
119
|
+
let backendRes;
|
|
120
|
+
try {
|
|
121
|
+
backendRes = await fetchBackend(target, {
|
|
122
|
+
path,
|
|
123
|
+
method: req.method ?? "POST",
|
|
124
|
+
reqBuf,
|
|
125
|
+
reqJson,
|
|
126
|
+
anthropicHeaders: buildForwardHeaders(req.headers, target),
|
|
127
|
+
wantsStream,
|
|
128
|
+
signal: controller.signal,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
clearTimeout(timer);
|
|
133
|
+
const aborted = controller.signal.aborted;
|
|
134
|
+
failClosed(res, aborted ? 504 : 502, aborted ? "backend timed out" : `backend unreachable: ${e.message}`);
|
|
135
|
+
h.logger.write(baseLog(started, path, model, hadTools, false, aborted ? 504 : 502, "skipped"));
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const streamed = (backendRes.headers.get("content-type") ?? "").includes("text/event-stream");
|
|
139
|
+
const willValidate = isMessages && hadTools && backendRes.status < 400;
|
|
140
|
+
const reshaper = h.resolveReshaper(target);
|
|
141
|
+
const doRepair = cfg.mode === "repair" && willValidate && reshaper !== undefined;
|
|
142
|
+
if (doRepair) {
|
|
143
|
+
await repairPath(res, backendRes, timer, { tools, model, wantsStream, streamed, started, path, hadTools, reshaper: reshaper }, h);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
await transparentPath(res, backendRes, timer, { tools, model, streamed, willValidate, started, path, hadTools }, h);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* OpenAI front: reverse-proxy the resolved target's /chat/completions to the client,
|
|
151
|
+
* verbatim (streaming or buffered). No Anthropic translation, no tool-call repair —
|
|
152
|
+
* this is the multiplexer path a dispatcher uses to reach many backends by namespace.
|
|
153
|
+
*/
|
|
154
|
+
async function openAiFrontPath(res, target, ctx, h) {
|
|
155
|
+
const controller = new AbortController();
|
|
156
|
+
const timer = setTimeout(() => controller.abort(), target.timeoutMs);
|
|
157
|
+
let upstream;
|
|
158
|
+
try {
|
|
159
|
+
upstream = await fetchOpenAiFront(target, { reqJson: ctx.reqJson, wantsStream: ctx.wantsStream, signal: controller.signal });
|
|
160
|
+
}
|
|
161
|
+
catch (e) {
|
|
162
|
+
clearTimeout(timer);
|
|
163
|
+
const aborted = controller.signal.aborted;
|
|
164
|
+
const status = aborted ? 504 : 502;
|
|
165
|
+
if (!res.headersSent) {
|
|
166
|
+
res.writeHead(status, { "content-type": "application/json" });
|
|
167
|
+
res.end(JSON.stringify({ error: { message: aborted ? "backend timed out" : `backend unreachable: ${e.message}`, type: "api_error" } }));
|
|
168
|
+
}
|
|
169
|
+
h.logger.write(baseLog(ctx.started, ctx.path, ctx.model, ctx.hadTools, false, status, "skipped"));
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
try {
|
|
173
|
+
res.writeHead(upstream.status, filterResponseHeaders(upstream.headers));
|
|
174
|
+
if (upstream.body) {
|
|
175
|
+
for await (const chunk of upstream.body) {
|
|
176
|
+
if (!res.write(Buffer.from(chunk)))
|
|
177
|
+
await once(res, "drain");
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
res.end();
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
clearTimeout(timer);
|
|
184
|
+
}
|
|
185
|
+
const streamed = (upstream.headers.get("content-type") ?? "").includes("text/event-stream");
|
|
186
|
+
h.logger.write(baseLog(ctx.started, ctx.path, ctx.model, ctx.hadTools, streamed, upstream.status, "skipped"));
|
|
187
|
+
}
|
|
188
|
+
/** detect/default: forward bytes unchanged, observe + log if applicable. */
|
|
189
|
+
async function transparentPath(res, backendRes, timer, ctx, h) {
|
|
190
|
+
res.writeHead(backendRes.status, filterResponseHeaders(backendRes.headers));
|
|
191
|
+
let assistant = null;
|
|
192
|
+
try {
|
|
193
|
+
if (!backendRes.body) {
|
|
194
|
+
res.end();
|
|
195
|
+
}
|
|
196
|
+
else if (ctx.streamed) {
|
|
197
|
+
const decoder = new TextDecoder();
|
|
198
|
+
let acc = "";
|
|
199
|
+
let overflow = false;
|
|
200
|
+
for await (const chunk of backendRes.body) {
|
|
201
|
+
if (!res.write(Buffer.from(chunk)))
|
|
202
|
+
await once(res, "drain");
|
|
203
|
+
if (ctx.willValidate && !overflow) {
|
|
204
|
+
acc += decoder.decode(chunk, { stream: true });
|
|
205
|
+
if (acc.length > MAX_VALIDATE_BYTES)
|
|
206
|
+
overflow = true;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
res.end();
|
|
210
|
+
if (ctx.willValidate && !overflow)
|
|
211
|
+
assistant = reconstructFromSse(acc + decoder.decode());
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
const bytes = Buffer.from(await backendRes.arrayBuffer());
|
|
215
|
+
res.end(bytes);
|
|
216
|
+
if (ctx.willValidate && bytes.length <= MAX_VALIDATE_BYTES)
|
|
217
|
+
assistant = parseAssistant(bytes.toString("utf8"));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
clearTimeout(timer);
|
|
222
|
+
}
|
|
223
|
+
let validated = "skipped";
|
|
224
|
+
let toolUseCount = 0;
|
|
225
|
+
let uncheckableCount = 0;
|
|
226
|
+
let errorKinds = [];
|
|
227
|
+
if (ctx.willValidate && assistant) {
|
|
228
|
+
const r = h.validator.validate(assistant, ctx.tools);
|
|
229
|
+
validated = r.errors.length > 0 ? "fail" : r.uncheckableCount > 0 ? "uncheckable" : "pass";
|
|
230
|
+
toolUseCount = r.toolUseCount;
|
|
231
|
+
uncheckableCount = r.uncheckableCount;
|
|
232
|
+
errorKinds = dedupe(r.errors.map((e) => e.kind));
|
|
233
|
+
}
|
|
234
|
+
h.logger.write({
|
|
235
|
+
...baseLog(ctx.started, ctx.path, ctx.model, ctx.hadTools, ctx.streamed, backendRes.status, validated),
|
|
236
|
+
toolUseCount, uncheckableCount, errorKinds,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
/** repair: route to the streaming or buffered variant. */
|
|
240
|
+
async function repairPath(res, backendRes, timer, ctx, h) {
|
|
241
|
+
if (ctx.streamed) {
|
|
242
|
+
await repairStreamingPath(res, backendRes, timer, ctx, h);
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
await repairBufferedPath(res, backendRes, timer, ctx, h);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* repair, streaming: forward text-block SSE frames to the client as they arrive;
|
|
250
|
+
* withhold everything from the first tool_use `content_block_start` onward. At
|
|
251
|
+
* end-of-stream, validate the reconstructed message — if the tool calls are valid,
|
|
252
|
+
* flush the withheld frames byte-for-byte (fully transparent); if invalid, repair
|
|
253
|
+
* and re-emit only the corrected trailing blocks. `message_start` and any leading
|
|
254
|
+
* text have already reached the client, so a pure-text response streams through
|
|
255
|
+
* with zero added latency.
|
|
256
|
+
*/
|
|
257
|
+
async function repairStreamingPath(res, backendRes, timer, ctx, h) {
|
|
258
|
+
const filtered = filterResponseHeaders(backendRes.headers);
|
|
259
|
+
const decoder = new TextDecoder();
|
|
260
|
+
let acc = ""; // full decoded stream, for reconstruction
|
|
261
|
+
let overflow = false; // acc exceeded the validate cap → give up repair
|
|
262
|
+
let work = Buffer.alloc(0); // raw bytes not yet split into complete frames
|
|
263
|
+
const held = []; // frames withheld from the client (first tool_use onward)
|
|
264
|
+
let buffering = false;
|
|
265
|
+
let firstToolUseIndex = -1;
|
|
266
|
+
let headWritten = false;
|
|
267
|
+
const ensureHead = () => {
|
|
268
|
+
if (!headWritten) {
|
|
269
|
+
res.writeHead(backendRes.status, filtered);
|
|
270
|
+
headWritten = true;
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
const forward = async (frame) => {
|
|
274
|
+
ensureHead();
|
|
275
|
+
if (!res.write(frame))
|
|
276
|
+
await once(res, "drain");
|
|
277
|
+
};
|
|
278
|
+
const flushHeld = async () => {
|
|
279
|
+
for (const f of held)
|
|
280
|
+
await forward(f);
|
|
281
|
+
held.length = 0;
|
|
282
|
+
};
|
|
283
|
+
const processFrame = async (frame) => {
|
|
284
|
+
if (!overflow) {
|
|
285
|
+
acc += frame.toString("utf8");
|
|
286
|
+
if (acc.length > MAX_VALIDATE_BYTES) {
|
|
287
|
+
// Too large to validate/repair safely: stop holding, stream the rest.
|
|
288
|
+
overflow = true;
|
|
289
|
+
if (buffering) {
|
|
290
|
+
await flushHeld();
|
|
291
|
+
buffering = false;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (buffering) {
|
|
296
|
+
held.push(frame);
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
const toolUseIdx = overflow ? null : frameOpensToolUse(frame);
|
|
300
|
+
if (toolUseIdx !== null) {
|
|
301
|
+
buffering = true;
|
|
302
|
+
firstToolUseIndex = toolUseIdx;
|
|
303
|
+
held.push(frame);
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
await forward(frame);
|
|
307
|
+
};
|
|
308
|
+
try {
|
|
309
|
+
if (backendRes.body) {
|
|
310
|
+
for await (const chunk of backendRes.body) {
|
|
311
|
+
work = work.length ? Buffer.concat([work, Buffer.from(chunk)]) : Buffer.from(chunk);
|
|
312
|
+
let end;
|
|
313
|
+
while ((end = frameEnd(work)) !== -1) {
|
|
314
|
+
const frame = work.subarray(0, end);
|
|
315
|
+
work = Buffer.from(work.subarray(end)); // detach from the growing buffer
|
|
316
|
+
await processFrame(frame);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
if (work.length)
|
|
321
|
+
await processFrame(work); // trailing partial frame
|
|
322
|
+
}
|
|
323
|
+
finally {
|
|
324
|
+
clearTimeout(timer);
|
|
325
|
+
}
|
|
326
|
+
let validated = "skipped";
|
|
327
|
+
let toolUseCount = 0;
|
|
328
|
+
let uncheckableCount = 0;
|
|
329
|
+
let errorKinds = [];
|
|
330
|
+
let repairOutcome = "none";
|
|
331
|
+
if (overflow || !buffering) {
|
|
332
|
+
// Nothing was withheld (pure text, or gave up): stream already complete.
|
|
333
|
+
if (!buffering) {
|
|
334
|
+
const assistant = overflow ? null : reconstructFromSse(acc);
|
|
335
|
+
if (assistant) {
|
|
336
|
+
const r = h.validator.validate(assistant, ctx.tools);
|
|
337
|
+
validated = r.errors.length > 0 ? "fail" : r.uncheckableCount > 0 ? "uncheckable" : "pass";
|
|
338
|
+
toolUseCount = r.toolUseCount;
|
|
339
|
+
uncheckableCount = r.uncheckableCount;
|
|
340
|
+
errorKinds = dedupe(r.errors.map((e) => e.kind));
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
ensureHead();
|
|
344
|
+
res.end();
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
const assistant = reconstructFromSse(acc);
|
|
348
|
+
const r = h.validator.validate(assistant, ctx.tools);
|
|
349
|
+
toolUseCount = r.toolUseCount;
|
|
350
|
+
uncheckableCount = r.uncheckableCount;
|
|
351
|
+
if (r.valid) {
|
|
352
|
+
validated = r.uncheckableCount > 0 ? "uncheckable" : "pass";
|
|
353
|
+
await flushHeld();
|
|
354
|
+
ensureHead();
|
|
355
|
+
res.end();
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
validated = "fail";
|
|
359
|
+
errorKinds = dedupe(r.errors.map((e) => e.kind));
|
|
360
|
+
const decision = await repair(assistant, ctx.tools, {
|
|
361
|
+
validator: h.validator,
|
|
362
|
+
reshaper: ctx.reshaper,
|
|
363
|
+
maxAttempts: 2,
|
|
364
|
+
isDestructive: h.isDestructive,
|
|
365
|
+
});
|
|
366
|
+
repairOutcome = decision.outcome;
|
|
367
|
+
ensureHead(); // message_start + leading text already forwarded
|
|
368
|
+
if (decision.outcome === "fixed" && decision.message) {
|
|
369
|
+
res.end(emitSseTail(decision.message, firstToolUseIndex));
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
// Head already committed — surface a mid-stream SSE error, never a fabricated call.
|
|
373
|
+
res.end(sseError(`llm-relay: tool call could not be repaired (${decision.outcome})`));
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
h.logger.write({
|
|
378
|
+
...baseLog(ctx.started, ctx.path, ctx.model, ctx.hadTools, true, backendRes.status, validated),
|
|
379
|
+
toolUseCount, uncheckableCount, errorKinds, repair: repairOutcome,
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
/** repair, buffered (non-streamed JSON): buffer, validate; if invalid, reshape and re-emit. */
|
|
383
|
+
async function repairBufferedPath(res, backendRes, timer, ctx, h) {
|
|
384
|
+
let bytes;
|
|
385
|
+
try {
|
|
386
|
+
bytes = Buffer.from(await backendRes.arrayBuffer());
|
|
387
|
+
}
|
|
388
|
+
finally {
|
|
389
|
+
clearTimeout(timer);
|
|
390
|
+
}
|
|
391
|
+
const assistant = ctx.streamed
|
|
392
|
+
? reconstructFromSse(bytes.toString("utf8"))
|
|
393
|
+
: parseAssistant(bytes.toString("utf8"));
|
|
394
|
+
const filtered = filterResponseHeaders(backendRes.headers);
|
|
395
|
+
let repairOutcome = "none";
|
|
396
|
+
let validated = "skipped";
|
|
397
|
+
let toolUseCount = 0;
|
|
398
|
+
let uncheckableCount = 0;
|
|
399
|
+
let errorKinds = [];
|
|
400
|
+
if (!assistant) {
|
|
401
|
+
// Couldn't parse — forward unchanged.
|
|
402
|
+
res.writeHead(backendRes.status, filtered);
|
|
403
|
+
res.end(bytes);
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
const r = h.validator.validate(assistant, ctx.tools);
|
|
407
|
+
toolUseCount = r.toolUseCount;
|
|
408
|
+
uncheckableCount = r.uncheckableCount;
|
|
409
|
+
if (r.valid) {
|
|
410
|
+
validated = r.uncheckableCount > 0 ? "uncheckable" : "pass";
|
|
411
|
+
res.writeHead(backendRes.status, filtered); // pass through untouched
|
|
412
|
+
res.end(bytes);
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
validated = "fail";
|
|
416
|
+
errorKinds = dedupe(r.errors.map((e) => e.kind));
|
|
417
|
+
const decision = await repair(assistant, ctx.tools, {
|
|
418
|
+
validator: h.validator,
|
|
419
|
+
reshaper: ctx.reshaper,
|
|
420
|
+
maxAttempts: 2,
|
|
421
|
+
isDestructive: h.isDestructive,
|
|
422
|
+
});
|
|
423
|
+
repairOutcome = decision.outcome;
|
|
424
|
+
if (decision.outcome === "fixed" && decision.message) {
|
|
425
|
+
emitFixed(res, backendRes.status, filtered, decision.message, ctx.wantsStream, ctx.model);
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
// fail-clean: loud, well-formed error rather than a silently broken call.
|
|
429
|
+
failClosed(res, 502, `llm-relay: tool call could not be repaired (${decision.outcome})`);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
h.logger.write({
|
|
434
|
+
...baseLog(ctx.started, ctx.path, ctx.model, ctx.hadTools, ctx.streamed, backendRes.status, validated),
|
|
435
|
+
toolUseCount, uncheckableCount, errorKinds, repair: repairOutcome,
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
function emitFixed(res, status, filtered, message, wantsStream, model) {
|
|
439
|
+
if (wantsStream) {
|
|
440
|
+
res.writeHead(status, { ...filtered, "content-type": "text/event-stream" });
|
|
441
|
+
res.end(emitSse(message));
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
res.writeHead(status, { ...filtered, "content-type": "application/json" });
|
|
445
|
+
res.end(JSON.stringify(toAnthropicMessage(message, model)));
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
function toAnthropicMessage(msg, model) {
|
|
449
|
+
return {
|
|
450
|
+
id: "msg_repair",
|
|
451
|
+
type: "message",
|
|
452
|
+
role: "assistant",
|
|
453
|
+
model: model ?? "",
|
|
454
|
+
content: msg.content,
|
|
455
|
+
stop_reason: msg.stop_reason ?? "end_turn",
|
|
456
|
+
stop_sequence: null,
|
|
457
|
+
usage: msg.usage ?? { input_tokens: 0, output_tokens: 0 },
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
function buildForwardHeaders(inbound, target) {
|
|
461
|
+
const apiKey = target.authEnv ? process.env[target.authEnv]?.trim() : undefined;
|
|
462
|
+
const stripAuth = !!apiKey;
|
|
463
|
+
const out = {};
|
|
464
|
+
for (const [k, v] of Object.entries(inbound)) {
|
|
465
|
+
const key = k.toLowerCase();
|
|
466
|
+
if (HOP_BY_HOP.has(key))
|
|
467
|
+
continue;
|
|
468
|
+
if (stripAuth && INBOUND_AUTH.includes(key))
|
|
469
|
+
continue;
|
|
470
|
+
if (v === undefined)
|
|
471
|
+
continue;
|
|
472
|
+
out[key] = Array.isArray(v) ? v.join(", ") : v;
|
|
473
|
+
}
|
|
474
|
+
if (!out["anthropic-version"])
|
|
475
|
+
out["anthropic-version"] = DEFAULT_ANTHROPIC_VERSION;
|
|
476
|
+
if (apiKey) {
|
|
477
|
+
if (target.authHeader === "authorization")
|
|
478
|
+
out["authorization"] = `Bearer ${apiKey}`;
|
|
479
|
+
else
|
|
480
|
+
out["x-api-key"] = apiKey;
|
|
481
|
+
}
|
|
482
|
+
return out;
|
|
483
|
+
}
|
|
484
|
+
function filterResponseHeaders(hh) {
|
|
485
|
+
const out = {};
|
|
486
|
+
hh.forEach((value, key) => {
|
|
487
|
+
if (!HOP_BY_HOP.has(key.toLowerCase()))
|
|
488
|
+
out[key] = value;
|
|
489
|
+
});
|
|
490
|
+
return out;
|
|
491
|
+
}
|
|
492
|
+
function parseAssistant(text) {
|
|
493
|
+
try {
|
|
494
|
+
const j = JSON.parse(text);
|
|
495
|
+
if (!Array.isArray(j.content))
|
|
496
|
+
return null;
|
|
497
|
+
return {
|
|
498
|
+
content: j.content,
|
|
499
|
+
stop_reason: (j.stop_reason ?? null),
|
|
500
|
+
usage: j.usage,
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
catch {
|
|
504
|
+
return null;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* End offset (exclusive) of the first complete SSE frame in `buf`, or -1 if no
|
|
509
|
+
* frame boundary is present yet. Frames are delimited by a blank line — `\n\n`
|
|
510
|
+
* (LF) or `\r\n\r\n` (CRLF); whichever boundary comes first wins. Operates on
|
|
511
|
+
* raw bytes so multibyte UTF-8 in event payloads is never split.
|
|
512
|
+
*/
|
|
513
|
+
function frameEnd(buf) {
|
|
514
|
+
const lf = buf.indexOf("\n\n", 0, "latin1");
|
|
515
|
+
const crlf = buf.indexOf("\r\n\r\n", 0, "latin1");
|
|
516
|
+
if (lf === -1 && crlf === -1)
|
|
517
|
+
return -1;
|
|
518
|
+
if (crlf !== -1 && (lf === -1 || crlf < lf))
|
|
519
|
+
return crlf + 4;
|
|
520
|
+
return lf + 2;
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* If `frame` is a `content_block_start` event opening a `tool_use` block, return
|
|
524
|
+
* its block index; otherwise null. This is the trigger to start withholding.
|
|
525
|
+
*/
|
|
526
|
+
function frameOpensToolUse(frame) {
|
|
527
|
+
const dataLines = [];
|
|
528
|
+
for (const line of frame.toString("utf8").split(/\r?\n/)) {
|
|
529
|
+
if (line.startsWith("data:"))
|
|
530
|
+
dataLines.push(line.slice(5).trimStart());
|
|
531
|
+
}
|
|
532
|
+
if (dataLines.length === 0)
|
|
533
|
+
return null;
|
|
534
|
+
let evt;
|
|
535
|
+
try {
|
|
536
|
+
evt = JSON.parse(dataLines.join("\n"));
|
|
537
|
+
}
|
|
538
|
+
catch {
|
|
539
|
+
return null;
|
|
540
|
+
}
|
|
541
|
+
if (typeof evt !== "object" || evt === null)
|
|
542
|
+
return null;
|
|
543
|
+
const e = evt;
|
|
544
|
+
if (e.type !== "content_block_start")
|
|
545
|
+
return null;
|
|
546
|
+
if (!e.content_block || e.content_block.type !== "tool_use")
|
|
547
|
+
return null;
|
|
548
|
+
return typeof e.index === "number" ? e.index : 0;
|
|
549
|
+
}
|
|
550
|
+
/** A single Anthropic-style SSE `error` event, for failing an already-open stream. */
|
|
551
|
+
function sseError(message) {
|
|
552
|
+
const data = JSON.stringify({ type: "error", error: { type: "api_error", message } });
|
|
553
|
+
return `event: error\ndata: ${data}\n\n`;
|
|
554
|
+
}
|
|
555
|
+
function readBody(req) {
|
|
556
|
+
return new Promise((resolve, reject) => {
|
|
557
|
+
const chunks = [];
|
|
558
|
+
req.on("data", (c) => chunks.push(c));
|
|
559
|
+
req.on("end", () => resolve(Buffer.concat(chunks)));
|
|
560
|
+
req.on("error", reject);
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
function failClosed(res, status, message) {
|
|
564
|
+
if (res.headersSent) {
|
|
565
|
+
res.end();
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
res.writeHead(status, { "content-type": "application/json" });
|
|
569
|
+
res.end(JSON.stringify({ type: "error", error: { type: "api_error", message } }));
|
|
570
|
+
}
|
|
571
|
+
function baseLog(started, path, model, hadTools, streamed, backendStatus, validated) {
|
|
572
|
+
return {
|
|
573
|
+
ts: new Date(started).toISOString(),
|
|
574
|
+
path, backendModel: model, hadTools, streamed, backendStatus, validated,
|
|
575
|
+
toolUseCount: 0, uncheckableCount: 0, errorKinds: [], repair: "none",
|
|
576
|
+
latencyMs: Date.now() - started,
|
|
577
|
+
};
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Cheap local token estimate for a /v1/messages/count_tokens request against an
|
|
581
|
+
* OpenAI backend (which has no native count_tokens). ~4 chars/token over all
|
|
582
|
+
* string content in system+messages+tools. Advisory only — the harness uses this
|
|
583
|
+
* for context-budget bookkeeping, not correctness.
|
|
584
|
+
*/
|
|
585
|
+
function estimateInputTokens(body) {
|
|
586
|
+
if (typeof body !== "object" || body === null)
|
|
587
|
+
return 0;
|
|
588
|
+
let chars = 0;
|
|
589
|
+
const walk = (v) => {
|
|
590
|
+
if (typeof v === "string")
|
|
591
|
+
chars += v.length;
|
|
592
|
+
else if (Array.isArray(v))
|
|
593
|
+
for (const x of v)
|
|
594
|
+
walk(x);
|
|
595
|
+
else if (v && typeof v === "object")
|
|
596
|
+
for (const x of Object.values(v))
|
|
597
|
+
walk(x);
|
|
598
|
+
};
|
|
599
|
+
const b = body;
|
|
600
|
+
walk(b.system);
|
|
601
|
+
walk(b.messages);
|
|
602
|
+
walk(b.tools);
|
|
603
|
+
return Math.max(1, Math.ceil(chars / 4));
|
|
604
|
+
}
|
|
605
|
+
function pickString(obj, key) {
|
|
606
|
+
if (typeof obj === "object" && obj !== null) {
|
|
607
|
+
const v = obj[key];
|
|
608
|
+
if (typeof v === "string")
|
|
609
|
+
return v;
|
|
610
|
+
}
|
|
611
|
+
return null;
|
|
612
|
+
}
|
|
613
|
+
function pickBool(obj, key) {
|
|
614
|
+
return typeof obj === "object" && obj !== null && obj[key] === true;
|
|
615
|
+
}
|
|
616
|
+
function dedupe(xs) {
|
|
617
|
+
return [...new Set(xs)];
|
|
618
|
+
}
|
|
619
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/sse.d.ts
ADDED