@agentplugged/claw 0.1.1 → 0.2.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.
Files changed (84) 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 +363 -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/bindings.d.ts +5 -0
  33. package/dist/sidecar/routes/bindings.d.ts.map +1 -0
  34. package/dist/sidecar/routes/bindings.js +64 -0
  35. package/dist/sidecar/routes/bindings.js.map +1 -0
  36. package/dist/sidecar/routes/channels.d.ts.map +1 -1
  37. package/dist/sidecar/routes/channels.js +71 -75
  38. package/dist/sidecar/routes/channels.js.map +1 -1
  39. package/dist/sidecar/routes/crons.d.ts +5 -0
  40. package/dist/sidecar/routes/crons.d.ts.map +1 -0
  41. package/dist/sidecar/routes/crons.js +81 -0
  42. package/dist/sidecar/routes/crons.js.map +1 -0
  43. package/dist/sidecar/routes/health.d.ts.map +1 -1
  44. package/dist/sidecar/routes/health.js +1 -5
  45. package/dist/sidecar/routes/health.js.map +1 -1
  46. package/dist/sidecar/routes/kitchen-proxy.d.ts +5 -0
  47. package/dist/sidecar/routes/kitchen-proxy.d.ts.map +1 -0
  48. package/dist/sidecar/routes/kitchen-proxy.js +29 -0
  49. package/dist/sidecar/routes/kitchen-proxy.js.map +1 -0
  50. package/dist/sidecar/routes/memory.d.ts +0 -2
  51. package/dist/sidecar/routes/memory.d.ts.map +1 -1
  52. package/dist/sidecar/routes/memory.js +116 -113
  53. package/dist/sidecar/routes/memory.js.map +1 -1
  54. package/dist/sidecar/routes/metrics.js +5 -5
  55. package/dist/sidecar/routes/restart.d.ts.map +1 -1
  56. package/dist/sidecar/routes/restart.js +11 -2
  57. package/dist/sidecar/routes/restart.js.map +1 -1
  58. package/dist/sidecar/routes/router-config.d.ts +0 -1
  59. package/dist/sidecar/routes/router-config.d.ts.map +1 -1
  60. package/dist/sidecar/routes/router-config.js +2 -139
  61. package/dist/sidecar/routes/router-config.js.map +1 -1
  62. package/dist/sidecar/routes/soul.d.ts +11 -0
  63. package/dist/sidecar/routes/soul.d.ts.map +1 -1
  64. package/dist/sidecar/routes/soul.js +58 -33
  65. package/dist/sidecar/routes/soul.js.map +1 -1
  66. package/dist/sidecar/routes/system.d.ts +7 -0
  67. package/dist/sidecar/routes/system.d.ts.map +1 -0
  68. package/dist/sidecar/routes/system.js +49 -0
  69. package/dist/sidecar/routes/system.js.map +1 -0
  70. package/dist/sidecar/routes/team.d.ts.map +1 -1
  71. package/dist/sidecar/routes/team.js +121 -74
  72. package/dist/sidecar/routes/team.js.map +1 -1
  73. package/dist/sidecar/routes/update.d.ts.map +1 -1
  74. package/dist/sidecar/routes/update.js +24 -10
  75. package/dist/sidecar/routes/update.js.map +1 -1
  76. package/dist/sidecar/routes/workflow.d.ts +8 -0
  77. package/dist/sidecar/routes/workflow.d.ts.map +1 -0
  78. package/dist/sidecar/routes/workflow.js +232 -0
  79. package/dist/sidecar/routes/workflow.js.map +1 -0
  80. package/dist/sidecar/utils.d.ts +14 -0
  81. package/dist/sidecar/utils.d.ts.map +1 -1
  82. package/dist/sidecar/utils.js +35 -1
  83. package/dist/sidecar/utils.js.map +1 -1
  84. package/package.json +1 -1
@@ -35,12 +35,23 @@ 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
+ ]);
44
55
  // ---------------------------------------------------------------------------
45
56
  // Helpers
46
57
  // ---------------------------------------------------------------------------
@@ -65,104 +76,377 @@ function sendError(res, status, message) {
65
76
  error: { message, type: "router_error", code: status },
66
77
  });
67
78
  }
79
+ function getModelPricing(model) {
80
+ return MODEL_PRICING.get(model) ?? { inputPrice: 0, outputPrice: 0 };
81
+ }
68
82
  // ---------------------------------------------------------------------------
69
- // Request handler
83
+ // Passthrough proxy — forwards requests transparently to upstream APIs
84
+ // and logs metrics from the response. Supports both JSON and SSE streams.
70
85
  // ---------------------------------------------------------------------------
71
- async function handleChatCompletions(req, res, config, db) {
86
+ /**
87
+ * Passthrough handler for Anthropic Messages API (/v1/messages).
88
+ * Forwards the request to api.anthropic.com, pipes the response back,
89
+ * and logs metrics after the response completes.
90
+ */
91
+ async function handleAnthropicPassthrough(req, res, db) {
72
92
  const startMs = Date.now();
73
- let body;
93
+ // Read the full body to parse model info for logging
94
+ let bodyStr;
74
95
  try {
75
- body = await readBody(req);
96
+ bodyStr = await readBody(req);
76
97
  }
77
98
  catch {
78
99
  return sendError(res, 400, "Failed to read request body");
79
100
  }
80
- let request;
101
+ let parsedBody;
81
102
  try {
82
- request = JSON.parse(body);
103
+ parsedBody = JSON.parse(bodyStr);
83
104
  }
84
105
  catch {
85
106
  return sendError(res, 400, "Invalid JSON body");
86
107
  }
87
- if (!request.messages || !Array.isArray(request.messages)) {
88
- return sendError(res, 400, "Missing or invalid 'messages' field");
108
+ const model = parsedBody.model ?? "unknown";
109
+ const isStream = parsedBody.stream === true;
110
+ // Build upstream headers — forward all relevant headers
111
+ const upstreamHeaders = {
112
+ "Content-Type": "application/json",
113
+ "Content-Length": Buffer.byteLength(bodyStr).toString(),
114
+ };
115
+ // Forward Anthropic-specific headers
116
+ const apiKey = req.headers["x-api-key"];
117
+ if (apiKey) {
118
+ upstreamHeaders["x-api-key"] = apiKey;
119
+ }
120
+ const anthropicVersion = req.headers["anthropic-version"];
121
+ if (anthropicVersion) {
122
+ upstreamHeaders["anthropic-version"] = anthropicVersion;
89
123
  }
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;
124
+ const anthropicBeta = req.headers["anthropic-beta"];
125
+ if (anthropicBeta) {
126
+ upstreamHeaders["anthropic-beta"] = anthropicBeta;
127
+ }
128
+ const upstreamPath = req.url ?? "/v1/messages";
129
+ const options = {
130
+ hostname: "api.anthropic.com",
131
+ port: 443,
132
+ path: upstreamPath,
133
+ method: "POST",
134
+ headers: upstreamHeaders,
135
+ };
136
+ const proxyReq = https.request(options, (proxyRes) => {
137
+ const statusCode = proxyRes.statusCode ?? 500;
138
+ if (isStream && statusCode >= 200 && statusCode < 300) {
139
+ // --- SSE streaming mode ---
140
+ // Pipe the upstream SSE stream directly to the client.
141
+ // Collect chunks to parse usage from the final message_stop event.
142
+ const streamChunks = [];
143
+ res.writeHead(statusCode, {
144
+ "Content-Type": proxyRes.headers["content-type"] ?? "text/event-stream",
145
+ "Cache-Control": "no-cache",
146
+ Connection: "keep-alive",
147
+ });
148
+ proxyReq.on("error", () => {
149
+ // Connection dropped during stream — nothing to do
150
+ });
151
+ proxyRes.on("data", (chunk) => {
152
+ streamChunks.push(chunk);
153
+ res.write(chunk);
154
+ });
155
+ proxyRes.on("end", () => {
156
+ res.end();
157
+ const latencyMs = Date.now() - startMs;
158
+ // Parse SSE chunks to extract usage from the final event
159
+ const fullStream = Buffer.concat(streamChunks).toString("utf-8");
160
+ const usage = extractAnthropicStreamUsage(fullStream);
161
+ const pricing = getModelPricing(model);
162
+ const cost = (0, logger_1.calculateCost)(usage.inputTokens, usage.outputTokens, pricing.inputPrice, pricing.outputPrice);
163
+ (0, logger_1.logRouterRequest)(db, {
164
+ timestamp: new Date().toISOString(),
165
+ model,
166
+ provider: "anthropic",
167
+ inputTokens: usage.inputTokens,
168
+ outputTokens: usage.outputTokens,
169
+ cost,
170
+ latencyMs,
171
+ success: statusCode >= 200 && statusCode < 400,
172
+ });
173
+ console.log(`[router] Anthropic stream ${model} | ${usage.inputTokens}+${usage.outputTokens} tokens | ${latencyMs}ms | $${cost.toFixed(6)}`);
174
+ });
175
+ }
176
+ else {
177
+ // --- Non-streaming mode ---
178
+ // Collect the full response, log metrics, then forward to client.
179
+ const chunks = [];
180
+ proxyRes.on("data", (chunk) => chunks.push(chunk));
181
+ proxyRes.on("end", () => {
182
+ const responseBody = Buffer.concat(chunks);
183
+ const latencyMs = Date.now() - startMs;
184
+ // Forward the response headers and body to the original client
185
+ const responseHeaders = {};
186
+ for (const [key, value] of Object.entries(proxyRes.headers)) {
187
+ if (value) {
188
+ responseHeaders[key] = value;
189
+ }
190
+ }
191
+ res.writeHead(statusCode, responseHeaders);
192
+ res.end(responseBody);
193
+ // Parse response for metrics logging
194
+ let inputTokens = 0;
195
+ let outputTokens = 0;
196
+ if (statusCode >= 200 && statusCode < 300) {
197
+ try {
198
+ const responseJson = JSON.parse(responseBody.toString("utf-8"));
199
+ inputTokens = responseJson.usage?.input_tokens ?? 0;
200
+ outputTokens = responseJson.usage?.output_tokens ?? 0;
201
+ }
202
+ catch {
203
+ // Response not JSON — skip metric extraction
204
+ }
205
+ }
206
+ const pricing = getModelPricing(model);
207
+ const cost = (0, logger_1.calculateCost)(inputTokens, outputTokens, pricing.inputPrice, pricing.outputPrice);
208
+ (0, logger_1.logRouterRequest)(db, {
209
+ timestamp: new Date().toISOString(),
210
+ model,
211
+ provider: "anthropic",
212
+ inputTokens,
213
+ outputTokens,
214
+ cost,
215
+ latencyMs,
216
+ success: statusCode >= 200 && statusCode < 400,
217
+ error: statusCode >= 400 ? `HTTP ${statusCode}` : undefined,
218
+ });
219
+ console.log(`[router] Anthropic ${model} | ${inputTokens}+${outputTokens} tokens | ${latencyMs}ms | $${cost.toFixed(6)}${statusCode >= 400 ? ` | ERROR ${statusCode}` : ""}`);
220
+ });
221
+ }
222
+ });
223
+ proxyReq.on("error", (err) => {
224
+ const latencyMs = Date.now() - startMs;
225
+ (0, logger_1.logRouterRequest)(db, {
226
+ timestamp: new Date().toISOString(),
227
+ model,
228
+ provider: "anthropic",
229
+ inputTokens: 0,
230
+ outputTokens: 0,
231
+ cost: 0,
232
+ latencyMs,
233
+ success: false,
234
+ error: err.message,
235
+ });
236
+ console.error("[router] Anthropic proxy error:", err.message);
237
+ if (!res.headersSent) {
238
+ sendError(res, 502, `Upstream error: ${err.message}`);
239
+ }
240
+ });
241
+ proxyReq.write(bodyStr);
242
+ proxyReq.end();
243
+ }
244
+ /**
245
+ * Passthrough handler for OpenAI Chat Completions API (/v1/chat/completions).
246
+ * Used when the request comes from OpenClaw (via OPENAI_BASE_URL override).
247
+ */
248
+ async function handleOpenAiPassthrough(req, res, db) {
249
+ const startMs = Date.now();
250
+ let bodyStr;
94
251
  try {
95
- selected = (0, strategy_1.selectModel)(complexity, config.strategy, config.providers);
252
+ bodyStr = await readBody(req);
96
253
  }
97
- catch (err) {
98
- console.error("[router] Model selection failed:", err);
99
- return sendError(res, 503, err.message);
254
+ catch {
255
+ return sendError(res, 400, "Failed to read request body");
100
256
  }
101
- // Forward with fallback
102
- let chatResponse;
257
+ let parsedBody;
103
258
  try {
104
- chatResponse = await (0, fallback_1.forwardWithFallback)(request, selected, config.providers);
259
+ parsedBody = JSON.parse(bodyStr);
105
260
  }
106
- catch (err) {
261
+ catch {
262
+ return sendError(res, 400, "Invalid JSON body");
263
+ }
264
+ const model = parsedBody.model ?? "unknown";
265
+ const isStream = parsedBody.stream === true;
266
+ const upstreamHeaders = {
267
+ "Content-Type": "application/json",
268
+ "Content-Length": Buffer.byteLength(bodyStr).toString(),
269
+ };
270
+ const auth = req.headers["authorization"];
271
+ if (auth) {
272
+ upstreamHeaders["Authorization"] = auth;
273
+ }
274
+ const upstreamPath = req.url ?? "/v1/chat/completions";
275
+ const options = {
276
+ hostname: "api.openai.com",
277
+ port: 443,
278
+ path: upstreamPath,
279
+ method: "POST",
280
+ headers: upstreamHeaders,
281
+ };
282
+ const proxyReq = https.request(options, (proxyRes) => {
283
+ const statusCode = proxyRes.statusCode ?? 500;
284
+ if (isStream && statusCode >= 200 && statusCode < 300) {
285
+ // --- SSE streaming mode ---
286
+ const streamChunks = [];
287
+ res.writeHead(statusCode, {
288
+ "Content-Type": proxyRes.headers["content-type"] ?? "text/event-stream",
289
+ "Cache-Control": "no-cache",
290
+ Connection: "keep-alive",
291
+ });
292
+ proxyRes.on("data", (chunk) => {
293
+ streamChunks.push(chunk);
294
+ res.write(chunk);
295
+ });
296
+ proxyRes.on("end", () => {
297
+ res.end();
298
+ const latencyMs = Date.now() - startMs;
299
+ const fullStream = Buffer.concat(streamChunks).toString("utf-8");
300
+ const usage = extractOpenAiStreamUsage(fullStream);
301
+ const pricing = getModelPricing(model);
302
+ const cost = (0, logger_1.calculateCost)(usage.inputTokens, usage.outputTokens, pricing.inputPrice, pricing.outputPrice);
303
+ (0, logger_1.logRouterRequest)(db, {
304
+ timestamp: new Date().toISOString(),
305
+ model,
306
+ provider: "openai",
307
+ inputTokens: usage.inputTokens,
308
+ outputTokens: usage.outputTokens,
309
+ cost,
310
+ latencyMs,
311
+ success: true,
312
+ });
313
+ console.log(`[router] OpenAI stream ${model} | ${usage.inputTokens}+${usage.outputTokens} tokens | ${latencyMs}ms | $${cost.toFixed(6)}`);
314
+ });
315
+ }
316
+ else {
317
+ // --- Non-streaming mode ---
318
+ const chunks = [];
319
+ proxyRes.on("data", (chunk) => chunks.push(chunk));
320
+ proxyRes.on("end", () => {
321
+ const responseBody = Buffer.concat(chunks);
322
+ const latencyMs = Date.now() - startMs;
323
+ const responseHeaders = {};
324
+ for (const [key, value] of Object.entries(proxyRes.headers)) {
325
+ if (value) {
326
+ responseHeaders[key] = value;
327
+ }
328
+ }
329
+ res.writeHead(statusCode, responseHeaders);
330
+ res.end(responseBody);
331
+ let inputTokens = 0;
332
+ let outputTokens = 0;
333
+ if (statusCode >= 200 && statusCode < 300) {
334
+ try {
335
+ const responseJson = JSON.parse(responseBody.toString("utf-8"));
336
+ inputTokens = responseJson.usage?.prompt_tokens ?? 0;
337
+ outputTokens = responseJson.usage?.completion_tokens ?? 0;
338
+ }
339
+ catch {
340
+ // Response not JSON — skip metric extraction
341
+ }
342
+ }
343
+ const pricing = getModelPricing(model);
344
+ const cost = (0, logger_1.calculateCost)(inputTokens, outputTokens, pricing.inputPrice, pricing.outputPrice);
345
+ (0, logger_1.logRouterRequest)(db, {
346
+ timestamp: new Date().toISOString(),
347
+ model,
348
+ provider: "openai",
349
+ inputTokens,
350
+ outputTokens,
351
+ cost,
352
+ latencyMs,
353
+ success: statusCode >= 200 && statusCode < 400,
354
+ error: statusCode >= 400 ? `HTTP ${statusCode}` : undefined,
355
+ });
356
+ console.log(`[router] OpenAI ${model} | ${inputTokens}+${outputTokens} tokens | ${latencyMs}ms | $${cost.toFixed(6)}${statusCode >= 400 ? ` | ERROR ${statusCode}` : ""}`);
357
+ });
358
+ }
359
+ });
360
+ proxyReq.on("error", (err) => {
107
361
  const latencyMs = Date.now() - startMs;
108
362
  (0, logger_1.logRouterRequest)(db, {
109
363
  timestamp: new Date().toISOString(),
110
- model: selected.model.id,
111
- provider: selected.provider.name,
364
+ model,
365
+ provider: "openai",
112
366
  inputTokens: 0,
113
367
  outputTokens: 0,
114
368
  cost: 0,
115
369
  latencyMs,
116
- complexity,
117
- strategy: config.strategy,
118
- fallback: false,
119
370
  success: false,
120
371
  error: err.message,
121
372
  });
122
- console.error("[router] All providers failed:", err);
123
- return sendError(res, 502, err.message);
373
+ console.error("[router] OpenAI proxy error:", err.message);
374
+ if (!res.headersSent) {
375
+ sendError(res, 502, `Upstream error: ${err.message}`);
376
+ }
377
+ });
378
+ proxyReq.write(bodyStr);
379
+ proxyReq.end();
380
+ }
381
+ // ---------------------------------------------------------------------------
382
+ // SSE stream usage extraction
383
+ // ---------------------------------------------------------------------------
384
+ /**
385
+ * Parse Anthropic SSE stream to extract usage from the `message_delta` event
386
+ * (which contains the final usage block).
387
+ */
388
+ function extractAnthropicStreamUsage(stream) {
389
+ let inputTokens = 0;
390
+ let outputTokens = 0;
391
+ // Anthropic sends usage in the message_start event (input_tokens)
392
+ // and in the message_delta event (output_tokens).
393
+ const lines = stream.split("\n");
394
+ for (const line of lines) {
395
+ if (!line.startsWith("data: "))
396
+ continue;
397
+ const data = line.slice(6);
398
+ if (data === "[DONE]")
399
+ continue;
400
+ try {
401
+ const event = JSON.parse(data);
402
+ // message_start contains initial usage (input_tokens)
403
+ if (event.type === "message_start" && event.message?.usage) {
404
+ inputTokens = event.message.usage.input_tokens ?? 0;
405
+ }
406
+ // message_delta contains final usage (output_tokens)
407
+ if (event.type === "message_delta" && event.usage) {
408
+ outputTokens = event.usage.output_tokens ?? 0;
409
+ }
410
+ }
411
+ catch {
412
+ // Skip non-JSON SSE lines
413
+ }
124
414
  }
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
- }
415
+ return { inputTokens, outputTokens };
416
+ }
417
+ /**
418
+ * Parse OpenAI SSE stream to extract usage from the final chunk
419
+ * (which may contain a usage field if stream_options.include_usage was set).
420
+ */
421
+ function extractOpenAiStreamUsage(stream) {
422
+ let inputTokens = 0;
423
+ let outputTokens = 0;
424
+ const lines = stream.split("\n");
425
+ for (const line of lines) {
426
+ if (!line.startsWith("data: "))
427
+ continue;
428
+ const data = line.slice(6);
429
+ if (data === "[DONE]")
430
+ continue;
431
+ try {
432
+ const event = JSON.parse(data);
433
+ // OpenAI may include usage in the final chunk
434
+ if (event.usage) {
435
+ inputTokens = event.usage.prompt_tokens ?? 0;
436
+ outputTokens = event.usage.completion_tokens ?? 0;
142
437
  }
143
438
  }
439
+ catch {
440
+ // Skip non-JSON SSE lines
441
+ }
144
442
  }
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);
443
+ return { inputTokens, outputTokens };
161
444
  }
162
445
  // ---------------------------------------------------------------------------
163
446
  // Server factory
164
447
  // ---------------------------------------------------------------------------
165
448
  function createRouterServer(config, db) {
449
+ console.log("[router] Mode: transparent passthrough proxy");
166
450
  const server = http.createServer(async (req, res) => {
167
451
  const method = req.method?.toUpperCase();
168
452
  const url = req.url ?? "/";
@@ -170,16 +454,21 @@ function createRouterServer(config, db) {
170
454
  if (method === "GET" && url === "/health") {
171
455
  return sendJson(res, 200, {
172
456
  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),
457
+ version: "0.3.0",
458
+ mode: "passthrough",
178
459
  });
179
460
  }
180
- // Chat completionsOpenAI-compatible endpoint
461
+ // Anthropic Messages API passthrough to api.anthropic.com
462
+ if (method === "POST" && url.startsWith("/v1/messages")) {
463
+ return handleAnthropicPassthrough(req, res, db);
464
+ }
465
+ // OpenAI Embeddings API — passthrough to api.openai.com
466
+ if (method === "POST" && url === "/v1/embeddings") {
467
+ return handleOpenAiPassthrough(req, res, db);
468
+ }
469
+ // OpenAI Chat Completions API — passthrough to api.openai.com
181
470
  if (method === "POST" && url === "/v1/chat/completions") {
182
- return handleChatCompletions(req, res, config, db);
471
+ return handleOpenAiPassthrough(req, res, db);
183
472
  }
184
473
  // 404 for everything else
185
474
  return sendError(res, 404, `Route not found: ${method} ${url}`);
@@ -193,12 +482,9 @@ if (require.main === module) {
193
482
  const config = (0, config_1.loadConfig)();
194
483
  const db = (0, logger_1.openDatabase)(config.dataDir);
195
484
  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"}`);
485
+ server.listen(config.routerPort, "127.0.0.1", () => {
486
+ console.log(`[router] Claw Router Proxy listening on http://127.0.0.1:${config.routerPort}`);
487
+ console.log("[router] Mode: transparent passthrough proxy + cost logging");
202
488
  });
203
489
  process.on("SIGTERM", () => {
204
490
  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"}
@@ -1,3 +1,9 @@
1
+ export interface ChatMessage {
2
+ role: "system" | "user" | "assistant" | "tool";
3
+ content: string;
4
+ tool_calls?: ToolCall[];
5
+ tool_call_id?: string;
6
+ }
1
7
  export interface ToolFunction {
2
8
  name: string;
3
9
  description?: string;
@@ -15,12 +21,6 @@ export interface ToolCall {
15
21
  arguments: string;
16
22
  };
17
23
  }
18
- export interface ChatMessage {
19
- role: "system" | "user" | "assistant" | "tool";
20
- content: string;
21
- tool_calls?: ToolCall[];
22
- tool_call_id?: string;
23
- }
24
24
  export interface ChatCompletionRequest {
25
25
  model: string;
26
26
  messages: ChatMessage[];
@@ -53,9 +53,6 @@ export interface RouterLogEntry {
53
53
  outputTokens: number;
54
54
  cost: number;
55
55
  latencyMs: number;
56
- complexity: string;
57
- strategy: string;
58
- fallback: boolean;
59
56
  success: boolean;
60
57
  error?: string;
61
58
  leakDetected?: boolean;