@agentplugged/claw 0.1.1 → 0.2.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.
Files changed (88) hide show
  1. package/dist/cli.js +3 -7
  2. package/dist/cli.js.map +1 -1
  3. package/dist/config.d.ts +1 -2
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +5 -5
  6. package/dist/config.js.map +1 -1
  7. package/dist/index.d.ts +0 -9
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +21 -40
  10. package/dist/index.js.map +1 -1
  11. package/dist/router/index.d.ts.map +1 -1
  12. package/dist/router/index.js +380 -77
  13. package/dist/router/index.js.map +1 -1
  14. package/dist/router/logger.d.ts +3 -0
  15. package/dist/router/logger.d.ts.map +1 -1
  16. package/dist/router/logger.js +8 -5
  17. package/dist/router/logger.js.map +1 -1
  18. package/dist/router/types.d.ts +6 -9
  19. package/dist/router/types.d.ts.map +1 -1
  20. package/dist/sidecar/auth.d.ts.map +1 -1
  21. package/dist/sidecar/auth.js +7 -11
  22. package/dist/sidecar/auth.js.map +1 -1
  23. package/dist/sidecar/index.js +104 -21
  24. package/dist/sidecar/index.js.map +1 -1
  25. package/dist/sidecar/routes/addons.d.ts.map +1 -1
  26. package/dist/sidecar/routes/addons.js +3 -13
  27. package/dist/sidecar/routes/addons.js.map +1 -1
  28. package/dist/sidecar/routes/api-keys.d.ts +4 -0
  29. package/dist/sidecar/routes/api-keys.d.ts.map +1 -0
  30. package/dist/sidecar/routes/api-keys.js +221 -0
  31. package/dist/sidecar/routes/api-keys.js.map +1 -0
  32. package/dist/sidecar/routes/backup.js +3 -3
  33. package/dist/sidecar/routes/backup.js.map +1 -1
  34. package/dist/sidecar/routes/bindings.d.ts +5 -0
  35. package/dist/sidecar/routes/bindings.d.ts.map +1 -0
  36. package/dist/sidecar/routes/bindings.js +64 -0
  37. package/dist/sidecar/routes/bindings.js.map +1 -0
  38. package/dist/sidecar/routes/channels.d.ts.map +1 -1
  39. package/dist/sidecar/routes/channels.js +71 -75
  40. package/dist/sidecar/routes/channels.js.map +1 -1
  41. package/dist/sidecar/routes/crons.d.ts +5 -0
  42. package/dist/sidecar/routes/crons.d.ts.map +1 -0
  43. package/dist/sidecar/routes/crons.js +81 -0
  44. package/dist/sidecar/routes/crons.js.map +1 -0
  45. package/dist/sidecar/routes/health.d.ts.map +1 -1
  46. package/dist/sidecar/routes/health.js +1 -5
  47. package/dist/sidecar/routes/health.js.map +1 -1
  48. package/dist/sidecar/routes/kitchen-proxy.d.ts +5 -0
  49. package/dist/sidecar/routes/kitchen-proxy.d.ts.map +1 -0
  50. package/dist/sidecar/routes/kitchen-proxy.js +29 -0
  51. package/dist/sidecar/routes/kitchen-proxy.js.map +1 -0
  52. package/dist/sidecar/routes/memory.d.ts +0 -2
  53. package/dist/sidecar/routes/memory.d.ts.map +1 -1
  54. package/dist/sidecar/routes/memory.js +116 -113
  55. package/dist/sidecar/routes/memory.js.map +1 -1
  56. package/dist/sidecar/routes/metrics.d.ts.map +1 -1
  57. package/dist/sidecar/routes/metrics.js +30 -1
  58. package/dist/sidecar/routes/metrics.js.map +1 -1
  59. package/dist/sidecar/routes/restart.d.ts.map +1 -1
  60. package/dist/sidecar/routes/restart.js +13 -4
  61. package/dist/sidecar/routes/restart.js.map +1 -1
  62. package/dist/sidecar/routes/router-config.d.ts +0 -1
  63. package/dist/sidecar/routes/router-config.d.ts.map +1 -1
  64. package/dist/sidecar/routes/router-config.js +2 -139
  65. package/dist/sidecar/routes/router-config.js.map +1 -1
  66. package/dist/sidecar/routes/soul.d.ts +11 -0
  67. package/dist/sidecar/routes/soul.d.ts.map +1 -1
  68. package/dist/sidecar/routes/soul.js +58 -33
  69. package/dist/sidecar/routes/soul.js.map +1 -1
  70. package/dist/sidecar/routes/system.d.ts +7 -0
  71. package/dist/sidecar/routes/system.d.ts.map +1 -0
  72. package/dist/sidecar/routes/system.js +49 -0
  73. package/dist/sidecar/routes/system.js.map +1 -0
  74. package/dist/sidecar/routes/team.d.ts.map +1 -1
  75. package/dist/sidecar/routes/team.js +121 -74
  76. package/dist/sidecar/routes/team.js.map +1 -1
  77. package/dist/sidecar/routes/update.d.ts.map +1 -1
  78. package/dist/sidecar/routes/update.js +24 -10
  79. package/dist/sidecar/routes/update.js.map +1 -1
  80. package/dist/sidecar/routes/workflow.d.ts +8 -0
  81. package/dist/sidecar/routes/workflow.d.ts.map +1 -0
  82. package/dist/sidecar/routes/workflow.js +232 -0
  83. package/dist/sidecar/routes/workflow.js.map +1 -0
  84. package/dist/sidecar/utils.d.ts +14 -0
  85. package/dist/sidecar/utils.d.ts.map +1 -1
  86. package/dist/sidecar/utils.js +35 -1
  87. package/dist/sidecar/utils.js.map +1 -1
  88. package/package.json +1 -1
@@ -35,12 +35,37 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.createRouterServer = createRouterServer;
37
37
  const http = __importStar(require("http"));
38
+ const https = __importStar(require("https"));
38
39
  const config_1 = require("../config");
39
- const classifier_1 = require("./classifier");
40
- const strategy_1 = require("./strategy");
41
- const fallback_1 = require("./fallback");
42
40
  const logger_1 = require("./logger");
43
- const leak_detector_1 = require("./leak-detector");
41
+ const MODEL_PRICING = new Map([
42
+ // Anthropic
43
+ ["claude-haiku-4-5-20251001", { inputPrice: 0.80, outputPrice: 4.00 }],
44
+ ["claude-sonnet-4-6", { inputPrice: 3.00, outputPrice: 15.00 }],
45
+ ["claude-opus-4-6", { inputPrice: 15.00, outputPrice: 75.00 }],
46
+ // Google
47
+ ["gemini-2.0-flash", { inputPrice: 0.10, outputPrice: 0.40 }],
48
+ ["gemini-2.0-pro", { inputPrice: 1.25, outputPrice: 5.00 }],
49
+ ["gemini-2.5-pro", { inputPrice: 1.25, outputPrice: 10.00 }],
50
+ // OpenAI
51
+ ["gpt-4o-mini", { inputPrice: 0.15, outputPrice: 0.60 }],
52
+ ["gpt-4o", { inputPrice: 2.50, outputPrice: 10.00 }],
53
+ ["o3", { inputPrice: 10.00, outputPrice: 40.00 }],
54
+ ]);
55
+ // ---------------------------------------------------------------------------
56
+ // Server-side API key injection
57
+ // When LLM_API_KEY is set, the router injects it into upstream requests
58
+ // instead of forwarding the client's key. This keeps the real API key
59
+ // isolated in the router process (running as clawsidecar) — the agent
60
+ // process (agentplugged) never sees it.
61
+ // ---------------------------------------------------------------------------
62
+ const SERVER_API_KEY = process.env.LLM_API_KEY ?? null;
63
+ if (SERVER_API_KEY) {
64
+ console.log("[router] Key injection mode: server-side API key will be used (client keys ignored)");
65
+ }
66
+ else {
67
+ console.log("[router] Passthrough mode: forwarding client API keys to upstream");
68
+ }
44
69
  // ---------------------------------------------------------------------------
45
70
  // Helpers
46
71
  // ---------------------------------------------------------------------------
@@ -65,104 +90,380 @@ function sendError(res, status, message) {
65
90
  error: { message, type: "router_error", code: status },
66
91
  });
67
92
  }
93
+ function getModelPricing(model) {
94
+ return MODEL_PRICING.get(model) ?? { inputPrice: 0, outputPrice: 0 };
95
+ }
68
96
  // ---------------------------------------------------------------------------
69
- // Request handler
97
+ // Passthrough proxy — forwards requests transparently to upstream APIs
98
+ // and logs metrics from the response. Supports both JSON and SSE streams.
70
99
  // ---------------------------------------------------------------------------
71
- async function handleChatCompletions(req, res, config, db) {
100
+ /**
101
+ * Passthrough handler for Anthropic Messages API (/v1/messages).
102
+ * Forwards the request to api.anthropic.com, pipes the response back,
103
+ * and logs metrics after the response completes.
104
+ */
105
+ async function handleAnthropicPassthrough(req, res, db) {
72
106
  const startMs = Date.now();
73
- let body;
107
+ // Read the full body to parse model info for logging
108
+ let bodyStr;
74
109
  try {
75
- body = await readBody(req);
110
+ bodyStr = await readBody(req);
76
111
  }
77
112
  catch {
78
113
  return sendError(res, 400, "Failed to read request body");
79
114
  }
80
- let request;
115
+ let parsedBody;
81
116
  try {
82
- request = JSON.parse(body);
117
+ parsedBody = JSON.parse(bodyStr);
83
118
  }
84
119
  catch {
85
120
  return sendError(res, 400, "Invalid JSON body");
86
121
  }
87
- if (!request.messages || !Array.isArray(request.messages)) {
88
- return sendError(res, 400, "Missing or invalid 'messages' field");
122
+ const model = parsedBody.model ?? "unknown";
123
+ const isStream = parsedBody.stream === true;
124
+ // Build upstream headers — forward all relevant headers
125
+ const upstreamHeaders = {
126
+ "Content-Type": "application/json",
127
+ "Content-Length": Buffer.byteLength(bodyStr).toString(),
128
+ };
129
+ // Forward Anthropic-specific headers — inject server key if available
130
+ const apiKey = SERVER_API_KEY ?? req.headers["x-api-key"];
131
+ if (apiKey) {
132
+ upstreamHeaders["x-api-key"] = apiKey;
133
+ }
134
+ const anthropicVersion = req.headers["anthropic-version"];
135
+ if (anthropicVersion) {
136
+ upstreamHeaders["anthropic-version"] = anthropicVersion;
137
+ }
138
+ const anthropicBeta = req.headers["anthropic-beta"];
139
+ if (anthropicBeta) {
140
+ upstreamHeaders["anthropic-beta"] = anthropicBeta;
89
141
  }
90
- // Classify complexity (synchronous, <5ms)
91
- const complexity = (0, classifier_1.classifyComplexity)(request.messages);
92
- // Select the best model for this request
93
- let selected;
142
+ const upstreamPath = req.url ?? "/v1/messages";
143
+ const options = {
144
+ hostname: "api.anthropic.com",
145
+ port: 443,
146
+ path: upstreamPath,
147
+ method: "POST",
148
+ headers: upstreamHeaders,
149
+ };
150
+ const proxyReq = https.request(options, (proxyRes) => {
151
+ const statusCode = proxyRes.statusCode ?? 500;
152
+ if (isStream && statusCode >= 200 && statusCode < 300) {
153
+ // --- SSE streaming mode ---
154
+ // Pipe the upstream SSE stream directly to the client.
155
+ // Collect chunks to parse usage from the final message_stop event.
156
+ const streamChunks = [];
157
+ res.writeHead(statusCode, {
158
+ "Content-Type": proxyRes.headers["content-type"] ?? "text/event-stream",
159
+ "Cache-Control": "no-cache",
160
+ Connection: "keep-alive",
161
+ });
162
+ proxyReq.on("error", () => {
163
+ // Connection dropped during stream — nothing to do
164
+ });
165
+ proxyRes.on("data", (chunk) => {
166
+ streamChunks.push(chunk);
167
+ res.write(chunk);
168
+ });
169
+ proxyRes.on("end", () => {
170
+ res.end();
171
+ const latencyMs = Date.now() - startMs;
172
+ // Parse SSE chunks to extract usage from the final event
173
+ const fullStream = Buffer.concat(streamChunks).toString("utf-8");
174
+ const usage = extractAnthropicStreamUsage(fullStream);
175
+ const pricing = getModelPricing(model);
176
+ const cost = (0, logger_1.calculateCost)(usage.inputTokens, usage.outputTokens, pricing.inputPrice, pricing.outputPrice);
177
+ (0, logger_1.logRouterRequest)(db, {
178
+ timestamp: new Date().toISOString(),
179
+ model,
180
+ provider: "anthropic",
181
+ inputTokens: usage.inputTokens,
182
+ outputTokens: usage.outputTokens,
183
+ cost,
184
+ latencyMs,
185
+ success: statusCode >= 200 && statusCode < 400,
186
+ });
187
+ console.log(`[router] Anthropic stream ${model} | ${usage.inputTokens}+${usage.outputTokens} tokens | ${latencyMs}ms | $${cost.toFixed(6)}`);
188
+ });
189
+ }
190
+ else {
191
+ // --- Non-streaming mode ---
192
+ // Collect the full response, log metrics, then forward to client.
193
+ const chunks = [];
194
+ proxyRes.on("data", (chunk) => chunks.push(chunk));
195
+ proxyRes.on("end", () => {
196
+ const responseBody = Buffer.concat(chunks);
197
+ const latencyMs = Date.now() - startMs;
198
+ // Forward the response headers and body to the original client
199
+ const responseHeaders = {};
200
+ for (const [key, value] of Object.entries(proxyRes.headers)) {
201
+ if (value) {
202
+ responseHeaders[key] = value;
203
+ }
204
+ }
205
+ res.writeHead(statusCode, responseHeaders);
206
+ res.end(responseBody);
207
+ // Parse response for metrics logging
208
+ let inputTokens = 0;
209
+ let outputTokens = 0;
210
+ if (statusCode >= 200 && statusCode < 300) {
211
+ try {
212
+ const responseJson = JSON.parse(responseBody.toString("utf-8"));
213
+ inputTokens = responseJson.usage?.input_tokens ?? 0;
214
+ outputTokens = responseJson.usage?.output_tokens ?? 0;
215
+ }
216
+ catch {
217
+ // Response not JSON — skip metric extraction
218
+ }
219
+ }
220
+ const pricing = getModelPricing(model);
221
+ const cost = (0, logger_1.calculateCost)(inputTokens, outputTokens, pricing.inputPrice, pricing.outputPrice);
222
+ (0, logger_1.logRouterRequest)(db, {
223
+ timestamp: new Date().toISOString(),
224
+ model,
225
+ provider: "anthropic",
226
+ inputTokens,
227
+ outputTokens,
228
+ cost,
229
+ latencyMs,
230
+ success: statusCode >= 200 && statusCode < 400,
231
+ error: statusCode >= 400 ? `HTTP ${statusCode}` : undefined,
232
+ });
233
+ console.log(`[router] Anthropic ${model} | ${inputTokens}+${outputTokens} tokens | ${latencyMs}ms | $${cost.toFixed(6)}${statusCode >= 400 ? ` | ERROR ${statusCode}` : ""}`);
234
+ });
235
+ }
236
+ });
237
+ proxyReq.on("error", (err) => {
238
+ const latencyMs = Date.now() - startMs;
239
+ (0, logger_1.logRouterRequest)(db, {
240
+ timestamp: new Date().toISOString(),
241
+ model,
242
+ provider: "anthropic",
243
+ inputTokens: 0,
244
+ outputTokens: 0,
245
+ cost: 0,
246
+ latencyMs,
247
+ success: false,
248
+ error: err.message,
249
+ });
250
+ console.error("[router] Anthropic proxy error:", err.message);
251
+ if (!res.headersSent) {
252
+ sendError(res, 502, `Upstream error: ${err.message}`);
253
+ }
254
+ });
255
+ proxyReq.write(bodyStr);
256
+ proxyReq.end();
257
+ }
258
+ /**
259
+ * Passthrough handler for OpenAI Chat Completions API (/v1/chat/completions).
260
+ * Used when the request comes from OpenClaw (via OPENAI_BASE_URL override).
261
+ */
262
+ async function handleOpenAiPassthrough(req, res, db) {
263
+ const startMs = Date.now();
264
+ let bodyStr;
94
265
  try {
95
- selected = (0, strategy_1.selectModel)(complexity, config.strategy, config.providers);
266
+ bodyStr = await readBody(req);
96
267
  }
97
- catch (err) {
98
- console.error("[router] Model selection failed:", err);
99
- return sendError(res, 503, err.message);
268
+ catch {
269
+ return sendError(res, 400, "Failed to read request body");
100
270
  }
101
- // Forward with fallback
102
- let chatResponse;
271
+ let parsedBody;
103
272
  try {
104
- chatResponse = await (0, fallback_1.forwardWithFallback)(request, selected, config.providers);
273
+ parsedBody = JSON.parse(bodyStr);
274
+ }
275
+ catch {
276
+ return sendError(res, 400, "Invalid JSON body");
105
277
  }
106
- catch (err) {
278
+ const model = parsedBody.model ?? "unknown";
279
+ const isStream = parsedBody.stream === true;
280
+ const upstreamHeaders = {
281
+ "Content-Type": "application/json",
282
+ "Content-Length": Buffer.byteLength(bodyStr).toString(),
283
+ };
284
+ // Inject server key if available, otherwise forward client's auth
285
+ const auth = SERVER_API_KEY
286
+ ? `Bearer ${SERVER_API_KEY}`
287
+ : req.headers["authorization"];
288
+ if (auth) {
289
+ upstreamHeaders["Authorization"] = auth;
290
+ }
291
+ const upstreamPath = req.url ?? "/v1/chat/completions";
292
+ const options = {
293
+ hostname: "api.openai.com",
294
+ port: 443,
295
+ path: upstreamPath,
296
+ method: "POST",
297
+ headers: upstreamHeaders,
298
+ };
299
+ const proxyReq = https.request(options, (proxyRes) => {
300
+ const statusCode = proxyRes.statusCode ?? 500;
301
+ if (isStream && statusCode >= 200 && statusCode < 300) {
302
+ // --- SSE streaming mode ---
303
+ const streamChunks = [];
304
+ res.writeHead(statusCode, {
305
+ "Content-Type": proxyRes.headers["content-type"] ?? "text/event-stream",
306
+ "Cache-Control": "no-cache",
307
+ Connection: "keep-alive",
308
+ });
309
+ proxyRes.on("data", (chunk) => {
310
+ streamChunks.push(chunk);
311
+ res.write(chunk);
312
+ });
313
+ proxyRes.on("end", () => {
314
+ res.end();
315
+ const latencyMs = Date.now() - startMs;
316
+ const fullStream = Buffer.concat(streamChunks).toString("utf-8");
317
+ const usage = extractOpenAiStreamUsage(fullStream);
318
+ const pricing = getModelPricing(model);
319
+ const cost = (0, logger_1.calculateCost)(usage.inputTokens, usage.outputTokens, pricing.inputPrice, pricing.outputPrice);
320
+ (0, logger_1.logRouterRequest)(db, {
321
+ timestamp: new Date().toISOString(),
322
+ model,
323
+ provider: "openai",
324
+ inputTokens: usage.inputTokens,
325
+ outputTokens: usage.outputTokens,
326
+ cost,
327
+ latencyMs,
328
+ success: true,
329
+ });
330
+ console.log(`[router] OpenAI stream ${model} | ${usage.inputTokens}+${usage.outputTokens} tokens | ${latencyMs}ms | $${cost.toFixed(6)}`);
331
+ });
332
+ }
333
+ else {
334
+ // --- Non-streaming mode ---
335
+ const chunks = [];
336
+ proxyRes.on("data", (chunk) => chunks.push(chunk));
337
+ proxyRes.on("end", () => {
338
+ const responseBody = Buffer.concat(chunks);
339
+ const latencyMs = Date.now() - startMs;
340
+ const responseHeaders = {};
341
+ for (const [key, value] of Object.entries(proxyRes.headers)) {
342
+ if (value) {
343
+ responseHeaders[key] = value;
344
+ }
345
+ }
346
+ res.writeHead(statusCode, responseHeaders);
347
+ res.end(responseBody);
348
+ let inputTokens = 0;
349
+ let outputTokens = 0;
350
+ if (statusCode >= 200 && statusCode < 300) {
351
+ try {
352
+ const responseJson = JSON.parse(responseBody.toString("utf-8"));
353
+ inputTokens = responseJson.usage?.prompt_tokens ?? 0;
354
+ outputTokens = responseJson.usage?.completion_tokens ?? 0;
355
+ }
356
+ catch {
357
+ // Response not JSON — skip metric extraction
358
+ }
359
+ }
360
+ const pricing = getModelPricing(model);
361
+ const cost = (0, logger_1.calculateCost)(inputTokens, outputTokens, pricing.inputPrice, pricing.outputPrice);
362
+ (0, logger_1.logRouterRequest)(db, {
363
+ timestamp: new Date().toISOString(),
364
+ model,
365
+ provider: "openai",
366
+ inputTokens,
367
+ outputTokens,
368
+ cost,
369
+ latencyMs,
370
+ success: statusCode >= 200 && statusCode < 400,
371
+ error: statusCode >= 400 ? `HTTP ${statusCode}` : undefined,
372
+ });
373
+ console.log(`[router] OpenAI ${model} | ${inputTokens}+${outputTokens} tokens | ${latencyMs}ms | $${cost.toFixed(6)}${statusCode >= 400 ? ` | ERROR ${statusCode}` : ""}`);
374
+ });
375
+ }
376
+ });
377
+ proxyReq.on("error", (err) => {
107
378
  const latencyMs = Date.now() - startMs;
108
379
  (0, logger_1.logRouterRequest)(db, {
109
380
  timestamp: new Date().toISOString(),
110
- model: selected.model.id,
111
- provider: selected.provider.name,
381
+ model,
382
+ provider: "openai",
112
383
  inputTokens: 0,
113
384
  outputTokens: 0,
114
385
  cost: 0,
115
386
  latencyMs,
116
- complexity,
117
- strategy: config.strategy,
118
- fallback: false,
119
387
  success: false,
120
388
  error: err.message,
121
389
  });
122
- console.error("[router] All providers failed:", err);
123
- return sendError(res, 502, err.message);
390
+ console.error("[router] OpenAI proxy error:", err.message);
391
+ if (!res.headersSent) {
392
+ sendError(res, 502, `Upstream error: ${err.message}`);
393
+ }
394
+ });
395
+ proxyReq.write(bodyStr);
396
+ proxyReq.end();
397
+ }
398
+ // ---------------------------------------------------------------------------
399
+ // SSE stream usage extraction
400
+ // ---------------------------------------------------------------------------
401
+ /**
402
+ * Parse Anthropic SSE stream to extract usage from the `message_delta` event
403
+ * (which contains the final usage block).
404
+ */
405
+ function extractAnthropicStreamUsage(stream) {
406
+ let inputTokens = 0;
407
+ let outputTokens = 0;
408
+ // Anthropic sends usage in the message_start event (input_tokens)
409
+ // and in the message_delta event (output_tokens).
410
+ const lines = stream.split("\n");
411
+ for (const line of lines) {
412
+ if (!line.startsWith("data: "))
413
+ continue;
414
+ const data = line.slice(6);
415
+ if (data === "[DONE]")
416
+ continue;
417
+ try {
418
+ const event = JSON.parse(data);
419
+ // message_start contains initial usage (input_tokens)
420
+ if (event.type === "message_start" && event.message?.usage) {
421
+ inputTokens = event.message.usage.input_tokens ?? 0;
422
+ }
423
+ // message_delta contains final usage (output_tokens)
424
+ if (event.type === "message_delta" && event.usage) {
425
+ outputTokens = event.usage.output_tokens ?? 0;
426
+ }
427
+ }
428
+ catch {
429
+ // Skip non-JSON SSE lines
430
+ }
124
431
  }
125
- const latencyMs = Date.now() - startMs;
126
- const { response, usedFallback } = chatResponse;
127
- const inputTokens = response.usage?.prompt_tokens ?? 0;
128
- const outputTokens = response.usage?.completion_tokens ?? 0;
129
- const cost = (0, logger_1.calculateCost)(inputTokens, outputTokens, selected.model.inputPrice, selected.model.outputPrice);
130
- // Leak detection — scan response content before sending to client
131
- let leakDetected = false;
132
- if (response.choices) {
133
- for (const choice of response.choices) {
134
- const content = choice.message?.content;
135
- if (typeof content === "string") {
136
- const result = (0, leak_detector_1.detectLeaks)(content);
137
- if (result.leaked) {
138
- leakDetected = true;
139
- console.warn(`[router] Leak detected in response (model=${selected.model.id}): ${result.findings.length} finding(s)`, result.findings.map((f) => `${f.type}: ${f.match}`));
140
- choice.message.content = (0, leak_detector_1.sanitizeResponse)(content);
141
- }
432
+ return { inputTokens, outputTokens };
433
+ }
434
+ /**
435
+ * Parse OpenAI SSE stream to extract usage from the final chunk
436
+ * (which may contain a usage field if stream_options.include_usage was set).
437
+ */
438
+ function extractOpenAiStreamUsage(stream) {
439
+ let inputTokens = 0;
440
+ let outputTokens = 0;
441
+ const lines = stream.split("\n");
442
+ for (const line of lines) {
443
+ if (!line.startsWith("data: "))
444
+ continue;
445
+ const data = line.slice(6);
446
+ if (data === "[DONE]")
447
+ continue;
448
+ try {
449
+ const event = JSON.parse(data);
450
+ // OpenAI may include usage in the final chunk
451
+ if (event.usage) {
452
+ inputTokens = event.usage.prompt_tokens ?? 0;
453
+ outputTokens = event.usage.completion_tokens ?? 0;
142
454
  }
143
455
  }
456
+ catch {
457
+ // Skip non-JSON SSE lines
458
+ }
144
459
  }
145
- // Persist log (synchronous — non-blocking on the happy path since it's fast)
146
- (0, logger_1.logRouterRequest)(db, {
147
- timestamp: new Date().toISOString(),
148
- model: selected.model.id,
149
- provider: selected.provider.name,
150
- inputTokens,
151
- outputTokens,
152
- cost,
153
- latencyMs,
154
- complexity,
155
- strategy: config.strategy,
156
- fallback: usedFallback,
157
- success: true,
158
- leakDetected,
159
- });
160
- sendJson(res, 200, response);
460
+ return { inputTokens, outputTokens };
161
461
  }
162
462
  // ---------------------------------------------------------------------------
163
463
  // Server factory
164
464
  // ---------------------------------------------------------------------------
165
465
  function createRouterServer(config, db) {
466
+ console.log("[router] Mode: transparent passthrough proxy");
166
467
  const server = http.createServer(async (req, res) => {
167
468
  const method = req.method?.toUpperCase();
168
469
  const url = req.url ?? "/";
@@ -170,16 +471,21 @@ function createRouterServer(config, db) {
170
471
  if (method === "GET" && url === "/health") {
171
472
  return sendJson(res, 200, {
172
473
  status: "ok",
173
- version: "0.1.0",
174
- strategy: config.strategy,
175
- providers: config.providers
176
- .filter((p) => p.enabled)
177
- .map((p) => p.name),
474
+ version: "0.3.0",
475
+ mode: "passthrough",
178
476
  });
179
477
  }
180
- // Chat completionsOpenAI-compatible endpoint
478
+ // Anthropic Messages API passthrough to api.anthropic.com
479
+ if (method === "POST" && url.startsWith("/v1/messages")) {
480
+ return handleAnthropicPassthrough(req, res, db);
481
+ }
482
+ // OpenAI Embeddings API — passthrough to api.openai.com
483
+ if (method === "POST" && url === "/v1/embeddings") {
484
+ return handleOpenAiPassthrough(req, res, db);
485
+ }
486
+ // OpenAI Chat Completions API — passthrough to api.openai.com
181
487
  if (method === "POST" && url === "/v1/chat/completions") {
182
- return handleChatCompletions(req, res, config, db);
488
+ return handleOpenAiPassthrough(req, res, db);
183
489
  }
184
490
  // 404 for everything else
185
491
  return sendError(res, 404, `Route not found: ${method} ${url}`);
@@ -193,12 +499,9 @@ if (require.main === module) {
193
499
  const config = (0, config_1.loadConfig)();
194
500
  const db = (0, logger_1.openDatabase)(config.dataDir);
195
501
  const server = createRouterServer(config, db);
196
- server.listen(config.routerPort, () => {
197
- console.log(`[router] Claw Router Proxy listening on port ${config.routerPort}`);
198
- console.log(`[router] Strategy: ${config.strategy} | Providers: ${config.providers
199
- .filter((p) => p.enabled)
200
- .map((p) => p.name)
201
- .join(", ") || "none"}`);
502
+ server.listen(config.routerPort, "127.0.0.1", () => {
503
+ console.log(`[router] Claw Router Proxy listening on http://127.0.0.1:${config.routerPort}`);
504
+ console.log("[router] Mode: transparent passthrough proxy + cost logging");
202
505
  });
203
506
  process.on("SIGTERM", () => {
204
507
  console.log("[router] Shutting down...");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,9 @@ export declare function openDatabase(dataDir: string): Database.Database;
8
8
  /**
9
9
  * Inserts a log entry synchronously (SQLite writes are fast enough for this use case).
10
10
  * Called after every proxied request.
11
+ *
12
+ * Note: the DB schema retains complexity/strategy/fallback columns for backward
13
+ * compatibility with existing dashboards, but they are always set to defaults.
11
14
  */
12
15
  export declare function logRouterRequest(db: Database.Database, entry: RouterLogEntry): void;
13
16
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/router/logger.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAyBzC;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAa/D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,cAAc,GACpB,IAAI,CAmCN;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,GACtB,MAAM,CAKR"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/router/logger.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAyBzC;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAa/D;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,cAAc,GACpB,IAAI,CAmCN;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,GACtB,MAAM,CAKR"}
@@ -54,8 +54,8 @@ CREATE TABLE IF NOT EXISTS router_logs (
54
54
  output_tokens INTEGER NOT NULL DEFAULT 0,
55
55
  cost REAL NOT NULL DEFAULT 0,
56
56
  latency_ms INTEGER NOT NULL DEFAULT 0,
57
- complexity TEXT NOT NULL,
58
- strategy TEXT NOT NULL,
57
+ complexity TEXT NOT NULL DEFAULT 'passthrough',
58
+ strategy TEXT NOT NULL DEFAULT 'passthrough',
59
59
  fallback INTEGER NOT NULL DEFAULT 0,
60
60
  success INTEGER NOT NULL DEFAULT 1,
61
61
  error TEXT,
@@ -82,6 +82,9 @@ function openDatabase(dataDir) {
82
82
  /**
83
83
  * Inserts a log entry synchronously (SQLite writes are fast enough for this use case).
84
84
  * Called after every proxied request.
85
+ *
86
+ * Note: the DB schema retains complexity/strategy/fallback columns for backward
87
+ * compatibility with existing dashboards, but they are always set to defaults.
85
88
  */
86
89
  function logRouterRequest(db, entry) {
87
90
  try {
@@ -106,9 +109,9 @@ function logRouterRequest(db, entry) {
106
109
  outputTokens: entry.outputTokens,
107
110
  cost: entry.cost,
108
111
  latencyMs: entry.latencyMs,
109
- complexity: entry.complexity,
110
- strategy: entry.strategy,
111
- fallback: entry.fallback ? 1 : 0,
112
+ complexity: "passthrough",
113
+ strategy: "passthrough",
114
+ fallback: 0,
112
115
  success: entry.success ? 1 : 0,
113
116
  error: entry.error ?? null,
114
117
  leakDetected: entry.leakDetected ? 1 : 0,
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/router/logger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,oCAaC;AAMD,4CAsCC;AAMD,sCAUC;AAzGD,oEAAsC;AACtC,uCAAyB;AACzB,2CAA6B;AAG7B,uEAAuE;AACvE,6EAA6E;AAC7E,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;CAmBlB,CAAC;AAEF;;;GAGG;AACH,SAAgB,YAAY,CAAC,OAAe;IAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,yDAAyD;IACzD,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEpB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAC9B,EAAqB,EACrB,KAAqB;IAErB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;KAYvB,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC;YACP,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;YAC1B,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACzC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,qCAAqC;QACrC,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAC3B,WAAmB,EACnB,YAAoB,EACpB,cAAsB,EACtB,eAAuB;IAEvB,OAAO,CACL,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,cAAc;QAC1C,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,eAAe,CAC7C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/router/logger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,oCAaC;AASD,4CAsCC;AAMD,sCAUC;AA5GD,oEAAsC;AACtC,uCAAyB;AACzB,2CAA6B;AAG7B,uEAAuE;AACvE,6EAA6E;AAC7E,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;CAmBlB,CAAC;AAEF;;;GAGG;AACH,SAAgB,YAAY,CAAC,OAAe;IAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,yDAAyD;IACzD,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEpB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC9B,EAAqB,EACrB,KAAqB;IAErB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;KAYvB,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC;YACP,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,UAAU,EAAE,aAAa;YACzB,QAAQ,EAAE,aAAa;YACvB,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;YAC1B,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACzC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,qCAAqC;QACrC,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAC3B,WAAmB,EACnB,YAAoB,EACpB,cAAsB,EACtB,eAAuB;IAEvB,OAAO,CACL,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,cAAc;QAC1C,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,eAAe,CAC7C,CAAC;AACJ,CAAC"}