@agentplugged/claw 0.1.0 → 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.
- package/dist/cli.js +3 -7
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -5
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -40
- package/dist/index.js.map +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +363 -77
- package/dist/router/index.js.map +1 -1
- package/dist/router/logger.d.ts +3 -0
- package/dist/router/logger.d.ts.map +1 -1
- package/dist/router/logger.js +8 -5
- package/dist/router/logger.js.map +1 -1
- package/dist/router/types.d.ts +6 -9
- package/dist/router/types.d.ts.map +1 -1
- package/dist/sidecar/auth.d.ts.map +1 -1
- package/dist/sidecar/auth.js +7 -11
- package/dist/sidecar/auth.js.map +1 -1
- package/dist/sidecar/index.js +104 -21
- package/dist/sidecar/index.js.map +1 -1
- package/dist/sidecar/routes/addons.d.ts.map +1 -1
- package/dist/sidecar/routes/addons.js +3 -13
- package/dist/sidecar/routes/addons.js.map +1 -1
- package/dist/sidecar/routes/api-keys.d.ts +4 -0
- package/dist/sidecar/routes/api-keys.d.ts.map +1 -0
- package/dist/sidecar/routes/api-keys.js +221 -0
- package/dist/sidecar/routes/api-keys.js.map +1 -0
- package/dist/sidecar/routes/bindings.d.ts +5 -0
- package/dist/sidecar/routes/bindings.d.ts.map +1 -0
- package/dist/sidecar/routes/bindings.js +64 -0
- package/dist/sidecar/routes/bindings.js.map +1 -0
- package/dist/sidecar/routes/channels.d.ts.map +1 -1
- package/dist/sidecar/routes/channels.js +71 -75
- package/dist/sidecar/routes/channels.js.map +1 -1
- package/dist/sidecar/routes/crons.d.ts +5 -0
- package/dist/sidecar/routes/crons.d.ts.map +1 -0
- package/dist/sidecar/routes/crons.js +81 -0
- package/dist/sidecar/routes/crons.js.map +1 -0
- package/dist/sidecar/routes/health.d.ts.map +1 -1
- package/dist/sidecar/routes/health.js +1 -5
- package/dist/sidecar/routes/health.js.map +1 -1
- package/dist/sidecar/routes/kitchen-proxy.d.ts +5 -0
- package/dist/sidecar/routes/kitchen-proxy.d.ts.map +1 -0
- package/dist/sidecar/routes/kitchen-proxy.js +29 -0
- package/dist/sidecar/routes/kitchen-proxy.js.map +1 -0
- package/dist/sidecar/routes/memory.d.ts +0 -2
- package/dist/sidecar/routes/memory.d.ts.map +1 -1
- package/dist/sidecar/routes/memory.js +116 -113
- package/dist/sidecar/routes/memory.js.map +1 -1
- package/dist/sidecar/routes/metrics.js +5 -5
- package/dist/sidecar/routes/restart.d.ts.map +1 -1
- package/dist/sidecar/routes/restart.js +11 -2
- package/dist/sidecar/routes/restart.js.map +1 -1
- package/dist/sidecar/routes/router-config.d.ts +0 -1
- package/dist/sidecar/routes/router-config.d.ts.map +1 -1
- package/dist/sidecar/routes/router-config.js +2 -139
- package/dist/sidecar/routes/router-config.js.map +1 -1
- package/dist/sidecar/routes/skills.d.ts.map +1 -1
- package/dist/sidecar/routes/skills.js +23 -19
- package/dist/sidecar/routes/skills.js.map +1 -1
- package/dist/sidecar/routes/soul.d.ts +11 -0
- package/dist/sidecar/routes/soul.d.ts.map +1 -1
- package/dist/sidecar/routes/soul.js +59 -34
- package/dist/sidecar/routes/soul.js.map +1 -1
- package/dist/sidecar/routes/system.d.ts +7 -0
- package/dist/sidecar/routes/system.d.ts.map +1 -0
- package/dist/sidecar/routes/system.js +49 -0
- package/dist/sidecar/routes/system.js.map +1 -0
- package/dist/sidecar/routes/team.d.ts.map +1 -1
- package/dist/sidecar/routes/team.js +121 -74
- package/dist/sidecar/routes/team.js.map +1 -1
- package/dist/sidecar/routes/update.d.ts.map +1 -1
- package/dist/sidecar/routes/update.js +24 -10
- package/dist/sidecar/routes/update.js.map +1 -1
- package/dist/sidecar/routes/workflow.d.ts +8 -0
- package/dist/sidecar/routes/workflow.d.ts.map +1 -0
- package/dist/sidecar/routes/workflow.js +232 -0
- package/dist/sidecar/routes/workflow.js.map +1 -0
- package/dist/sidecar/utils.d.ts +14 -0
- package/dist/sidecar/utils.d.ts.map +1 -1
- package/dist/sidecar/utils.js +35 -1
- package/dist/sidecar/utils.js.map +1 -1
- package/package.json +1 -1
package/dist/router/index.js
CHANGED
|
@@ -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
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
93
|
+
// Read the full body to parse model info for logging
|
|
94
|
+
let bodyStr;
|
|
74
95
|
try {
|
|
75
|
-
|
|
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
|
|
101
|
+
let parsedBody;
|
|
81
102
|
try {
|
|
82
|
-
|
|
103
|
+
parsedBody = JSON.parse(bodyStr);
|
|
83
104
|
}
|
|
84
105
|
catch {
|
|
85
106
|
return sendError(res, 400, "Invalid JSON body");
|
|
86
107
|
}
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
252
|
+
bodyStr = await readBody(req);
|
|
96
253
|
}
|
|
97
|
-
catch
|
|
98
|
-
|
|
99
|
-
return sendError(res, 503, err.message);
|
|
254
|
+
catch {
|
|
255
|
+
return sendError(res, 400, "Failed to read request body");
|
|
100
256
|
}
|
|
101
|
-
|
|
102
|
-
let chatResponse;
|
|
257
|
+
let parsedBody;
|
|
103
258
|
try {
|
|
104
|
-
|
|
259
|
+
parsedBody = JSON.parse(bodyStr);
|
|
105
260
|
}
|
|
106
|
-
catch
|
|
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
|
|
111
|
-
provider:
|
|
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]
|
|
123
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
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.
|
|
174
|
-
|
|
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
|
-
//
|
|
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
|
|
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
|
|
198
|
-
console.log(
|
|
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...");
|
package/dist/router/index.js.map
CHANGED
|
@@ -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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"}
|
package/dist/router/logger.d.ts
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/router/logger.js
CHANGED
|
@@ -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:
|
|
110
|
-
strategy:
|
|
111
|
-
fallback:
|
|
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;
|
|
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"}
|
package/dist/router/types.d.ts
CHANGED
|
@@ -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;
|