@zhouzhengchang/token-party 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/config.example.yaml +34 -0
  2. package/dashboard/assets/index-BOghvbFW.js +131 -0
  3. package/dashboard/assets/index-CEcLJoXS.css +1 -0
  4. package/dashboard/index.html +13 -0
  5. package/dist/adapters/anthropic-to-openai.d.ts +35 -0
  6. package/dist/adapters/anthropic-to-openai.d.ts.map +1 -0
  7. package/dist/adapters/anthropic-to-openai.js +62 -0
  8. package/dist/adapters/anthropic-to-openai.js.map +1 -0
  9. package/dist/adapters/openai-to-anthropic.d.ts +42 -0
  10. package/dist/adapters/openai-to-anthropic.d.ts.map +1 -0
  11. package/dist/adapters/openai-to-anthropic.js +75 -0
  12. package/dist/adapters/openai-to-anthropic.js.map +1 -0
  13. package/dist/cli.d.ts +3 -0
  14. package/dist/cli.d.ts.map +1 -0
  15. package/dist/cli.js +77 -0
  16. package/dist/cli.js.map +1 -0
  17. package/dist/config.d.ts +6 -0
  18. package/dist/config.d.ts.map +1 -0
  19. package/dist/config.js +69 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/index.d.ts +2 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +17 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/metrics/collector.d.ts +14 -0
  26. package/dist/metrics/collector.d.ts.map +1 -0
  27. package/dist/metrics/collector.js +20 -0
  28. package/dist/metrics/collector.js.map +1 -0
  29. package/dist/proxy/auth.d.ts +6 -0
  30. package/dist/proxy/auth.d.ts.map +1 -0
  31. package/dist/proxy/auth.js +16 -0
  32. package/dist/proxy/auth.js.map +1 -0
  33. package/dist/proxy/forwarder.d.ts +6 -0
  34. package/dist/proxy/forwarder.d.ts.map +1 -0
  35. package/dist/proxy/forwarder.js +443 -0
  36. package/dist/proxy/forwarder.js.map +1 -0
  37. package/dist/proxy/router.d.ts +9 -0
  38. package/dist/proxy/router.d.ts.map +1 -0
  39. package/dist/proxy/router.js +29 -0
  40. package/dist/proxy/router.js.map +1 -0
  41. package/dist/routes/anthropic.d.ts +4 -0
  42. package/dist/routes/anthropic.d.ts.map +1 -0
  43. package/dist/routes/anthropic.js +37 -0
  44. package/dist/routes/anthropic.js.map +1 -0
  45. package/dist/routes/api.d.ts +3 -0
  46. package/dist/routes/api.d.ts.map +1 -0
  47. package/dist/routes/api.js +157 -0
  48. package/dist/routes/api.js.map +1 -0
  49. package/dist/routes/openai.d.ts +4 -0
  50. package/dist/routes/openai.d.ts.map +1 -0
  51. package/dist/routes/openai.js +49 -0
  52. package/dist/routes/openai.js.map +1 -0
  53. package/dist/server.d.ts +3 -0
  54. package/dist/server.d.ts.map +1 -0
  55. package/dist/server.js +38 -0
  56. package/dist/server.js.map +1 -0
  57. package/dist/store/db.d.ts +4 -0
  58. package/dist/store/db.d.ts.map +1 -0
  59. package/dist/store/db.js +49 -0
  60. package/dist/store/db.js.map +1 -0
  61. package/dist/store/log-writer.d.ts +17 -0
  62. package/dist/store/log-writer.d.ts.map +1 -0
  63. package/dist/store/log-writer.js +29 -0
  64. package/dist/store/log-writer.js.map +1 -0
  65. package/dist/types/config.d.ts +157 -0
  66. package/dist/types/config.d.ts.map +1 -0
  67. package/dist/types/config.js +28 -0
  68. package/dist/types/config.js.map +1 -0
  69. package/dist/types/env.d.ts +7 -0
  70. package/dist/types/env.d.ts.map +1 -0
  71. package/dist/types/env.js +2 -0
  72. package/dist/types/env.js.map +1 -0
  73. package/package.json +37 -0
@@ -0,0 +1,443 @@
1
+ import { streamSSE } from "hono/streaming";
2
+ import { nanoid } from "nanoid";
3
+ import { writeLog, headersToRecord } from "../store/log-writer.js";
4
+ import { recordRequest } from "../metrics/collector.js";
5
+ import { createGunzip, createInflate, createBrotliDecompress, createZstdDecompress } from "node:zlib";
6
+ import { Readable } from "node:stream";
7
+ export async function forwardRequest(c, provider, targetPath, transformedBody, entryProtocol) {
8
+ const requestId = nanoid();
9
+ const startTime = Date.now();
10
+ const body = transformedBody ?? (await c.req.json());
11
+ const isStreaming = body?.stream === true;
12
+ const model = body?.model ?? "unknown";
13
+ const entry = entryProtocol ?? provider.type;
14
+ const needsStreamConversion = isStreaming && entry !== provider.type;
15
+ const isResponsesApi = !!body?.input && !body?.messages;
16
+ // Request usage in streaming for OpenAI chat completions (not responses API)
17
+ if (isStreaming && provider.type === "openai" && !isResponsesApi && !body.stream_options) {
18
+ body.stream_options = { include_usage: true };
19
+ }
20
+ const targetUrl = `${provider.baseUrl}${targetPath}`;
21
+ const upstreamHeaders = {};
22
+ const skipHeaders = new Set(["host", "connection", "content-length"]);
23
+ c.req.raw.headers.forEach((value, key) => {
24
+ if (!skipHeaders.has(key.toLowerCase())) {
25
+ upstreamHeaders[key] = value;
26
+ }
27
+ });
28
+ if (provider.type === "openai") {
29
+ upstreamHeaders["authorization"] = `Bearer ${provider.apiKey}`;
30
+ }
31
+ else if (provider.type === "anthropic") {
32
+ delete upstreamHeaders["authorization"];
33
+ upstreamHeaders["x-api-key"] = provider.apiKey;
34
+ upstreamHeaders["anthropic-version"] ??= "2023-06-01";
35
+ }
36
+ // Capture incoming request headers (sanitize auth)
37
+ const reqHeaders = {};
38
+ c.req.raw.headers.forEach((value, key) => {
39
+ if (key.toLowerCase() === "authorization") {
40
+ reqHeaders[key] = value.slice(0, 10) + "****";
41
+ }
42
+ else {
43
+ reqHeaders[key] = value;
44
+ }
45
+ });
46
+ const logFile = writeLog(requestId, {
47
+ type: "request",
48
+ timestamp: startTime,
49
+ headers: { ...reqHeaders, "x-target-url": targetUrl, "x-entry-protocol": entry, "x-provider-type": provider.type },
50
+ body,
51
+ });
52
+ const token = c.get("authToken");
53
+ try {
54
+ const response = await fetch(targetUrl, {
55
+ method: "POST",
56
+ headers: upstreamHeaders,
57
+ body: JSON.stringify(body),
58
+ });
59
+ const respHeaders = headersToRecord(response.headers);
60
+ const latencyMs = Date.now() - startTime;
61
+ if (isStreaming && response.ok) {
62
+ c.header("Content-Type", "text/event-stream");
63
+ c.header("Cache-Control", "no-cache");
64
+ c.header("Connection", "keep-alive");
65
+ return streamSSE(c, async (s) => {
66
+ const reader = decompressResponse(response).getReader();
67
+ const decoder = new TextDecoder();
68
+ let buffer = "";
69
+ let fullContent = "";
70
+ let rawEvents = [];
71
+ let usage;
72
+ let chunkId = `chatcmpl-${requestId}`;
73
+ const o2aConverter = new OpenaiToAnthropicStreamConverter();
74
+ try {
75
+ while (true) {
76
+ const { done, value } = await reader.read();
77
+ if (done)
78
+ break;
79
+ buffer += decoder.decode(value, { stream: true });
80
+ const lines = buffer.split("\n");
81
+ buffer = lines.pop() ?? "";
82
+ for (const line of lines) {
83
+ if (!line.startsWith("data: "))
84
+ continue;
85
+ const data = line.slice(6).trim();
86
+ if (data === "[DONE]") {
87
+ await s.writeSSE({ data: "[DONE]" });
88
+ continue;
89
+ }
90
+ try {
91
+ const parsed = JSON.parse(data);
92
+ rawEvents.push(parsed);
93
+ if (needsStreamConversion && provider.type === "anthropic" && entry === "openai") {
94
+ const converted = convertAnthropicChunkToOpenai(parsed, model, chunkId);
95
+ if (converted) {
96
+ if (converted.content)
97
+ fullContent += converted.content;
98
+ await s.writeSSE({ data: JSON.stringify(converted.chunk) });
99
+ }
100
+ if (parsed.type === "message_delta" && parsed.usage) {
101
+ usage = { input_tokens: parsed.usage.input_tokens ?? 0, output_tokens: parsed.usage.output_tokens ?? 0 };
102
+ }
103
+ if (parsed.type === "message_start" && parsed.message?.usage) {
104
+ usage = { ...usage, input_tokens: parsed.message.usage.input_tokens ?? 0 };
105
+ }
106
+ }
107
+ else if (needsStreamConversion && provider.type === "openai" && entry === "anthropic") {
108
+ const converted = o2aConverter.convert(parsed, model);
109
+ if (converted) {
110
+ for (const event of converted.events) {
111
+ await s.writeSSE({ event: event.type, data: JSON.stringify(event.data) });
112
+ }
113
+ if (converted.content)
114
+ fullContent += converted.content;
115
+ }
116
+ if (parsed.usage) {
117
+ usage = { input_tokens: parsed.usage.prompt_tokens ?? 0, output_tokens: parsed.usage.completion_tokens ?? 0 };
118
+ }
119
+ }
120
+ else {
121
+ // Same protocol, pass through — preserve event type
122
+ if (parsed.type) {
123
+ await s.writeSSE({ event: parsed.type, data });
124
+ }
125
+ else {
126
+ await s.writeSSE({ data });
127
+ }
128
+ if (provider.type === "anthropic" && parsed.type === "content_block_delta") {
129
+ if (parsed.delta?.text)
130
+ fullContent += parsed.delta.text;
131
+ if (parsed.delta?.thinking)
132
+ fullContent += parsed.delta.thinking;
133
+ }
134
+ else if (provider.type === "openai" && parsed.choices?.[0]?.delta?.content) {
135
+ fullContent += parsed.choices[0].delta.content;
136
+ }
137
+ else if (parsed.type === "response.output_text.delta" && parsed.delta) {
138
+ fullContent += parsed.delta;
139
+ }
140
+ usage = extractUsageFromChunk(parsed, provider.type) ?? usage;
141
+ }
142
+ }
143
+ catch { }
144
+ }
145
+ }
146
+ }
147
+ finally {
148
+ // Fallback: scan raw events for usage if not captured during streaming
149
+ if (!usage) {
150
+ for (let i = rawEvents.length - 1; i >= 0; i--) {
151
+ const evt = rawEvents[i];
152
+ if (evt.type === "response.completed" && evt.response?.usage) {
153
+ usage = {
154
+ input_tokens: evt.response.usage.input_tokens ?? 0,
155
+ output_tokens: evt.response.usage.output_tokens ?? 0,
156
+ };
157
+ break;
158
+ }
159
+ if (evt.usage && typeof evt.usage === "object" && (evt.usage.prompt_tokens || evt.usage.completion_tokens || evt.usage.input_tokens || evt.usage.output_tokens || evt.usage.total_tokens)) {
160
+ usage = {
161
+ input_tokens: evt.usage.prompt_tokens ?? evt.usage.input_tokens ?? 0,
162
+ output_tokens: evt.usage.completion_tokens ?? evt.usage.output_tokens ?? 0,
163
+ };
164
+ break;
165
+ }
166
+ }
167
+ }
168
+ writeLog(requestId, {
169
+ type: "response",
170
+ timestamp: Date.now(),
171
+ headers: respHeaders,
172
+ streaming: true,
173
+ streamContent: fullContent,
174
+ body: rawEvents,
175
+ usage,
176
+ });
177
+ recordRequest({
178
+ id: requestId,
179
+ tokenId: token.key,
180
+ providerId: provider.id,
181
+ model,
182
+ inputTokens: usage?.input_tokens ?? 0,
183
+ outputTokens: usage?.output_tokens ?? 0,
184
+ latencyMs: Date.now() - startTime,
185
+ status: response.status,
186
+ logFile,
187
+ });
188
+ }
189
+ });
190
+ }
191
+ const responseBody = await decompressJson(response);
192
+ const usage = extractUsage(responseBody, provider.type);
193
+ writeLog(requestId, {
194
+ type: "response",
195
+ timestamp: Date.now(),
196
+ headers: respHeaders,
197
+ body: responseBody,
198
+ usage,
199
+ });
200
+ recordRequest({
201
+ id: requestId,
202
+ tokenId: token.key,
203
+ providerId: provider.id,
204
+ model,
205
+ inputTokens: usage?.input_tokens ?? 0,
206
+ outputTokens: usage?.output_tokens ?? 0,
207
+ latencyMs,
208
+ status: response.status,
209
+ logFile,
210
+ });
211
+ return c.json(responseBody, response.status);
212
+ }
213
+ catch (error) {
214
+ const latencyMs = Date.now() - startTime;
215
+ writeLog(requestId, {
216
+ type: "response",
217
+ timestamp: Date.now(),
218
+ error: error.message,
219
+ });
220
+ recordRequest({
221
+ id: requestId,
222
+ tokenId: token.key,
223
+ providerId: provider.id,
224
+ model,
225
+ inputTokens: 0,
226
+ outputTokens: 0,
227
+ latencyMs,
228
+ status: 502,
229
+ logFile,
230
+ error: error.message,
231
+ });
232
+ return c.json({ error: "Upstream request failed", detail: error.message }, 502);
233
+ }
234
+ }
235
+ // --- Anthropic SSE chunk → OpenAI SSE chunk ---
236
+ function convertAnthropicChunkToOpenai(parsed, model, id) {
237
+ if (parsed.type === "content_block_delta" && parsed.delta?.type === "text_delta") {
238
+ const text = parsed.delta.text ?? "";
239
+ return {
240
+ content: text,
241
+ chunk: {
242
+ id,
243
+ object: "chat.completion.chunk",
244
+ created: Math.floor(Date.now() / 1000),
245
+ model,
246
+ choices: [{ index: 0, delta: { content: text }, finish_reason: null }],
247
+ },
248
+ };
249
+ }
250
+ if (parsed.type === "message_start") {
251
+ return {
252
+ content: "",
253
+ chunk: {
254
+ id,
255
+ object: "chat.completion.chunk",
256
+ created: Math.floor(Date.now() / 1000),
257
+ model,
258
+ choices: [{ index: 0, delta: { role: "assistant", content: "" }, finish_reason: null }],
259
+ },
260
+ };
261
+ }
262
+ if (parsed.type === "message_delta") {
263
+ const finishReason = parsed.delta?.stop_reason === "end_turn" ? "stop"
264
+ : parsed.delta?.stop_reason === "max_tokens" ? "length" : "stop";
265
+ return {
266
+ content: "",
267
+ chunk: {
268
+ id,
269
+ object: "chat.completion.chunk",
270
+ created: Math.floor(Date.now() / 1000),
271
+ model,
272
+ choices: [{ index: 0, delta: {}, finish_reason: finishReason }],
273
+ usage: parsed.usage ? {
274
+ prompt_tokens: parsed.usage.input_tokens ?? 0,
275
+ completion_tokens: parsed.usage.output_tokens ?? 0,
276
+ total_tokens: (parsed.usage.input_tokens ?? 0) + (parsed.usage.output_tokens ?? 0),
277
+ } : undefined,
278
+ },
279
+ };
280
+ }
281
+ return null;
282
+ }
283
+ // --- OpenAI SSE chunk → Anthropic SSE events ---
284
+ class OpenaiToAnthropicStreamConverter {
285
+ started = false;
286
+ msgId = "";
287
+ inputTokens = 0;
288
+ convert(parsed, model) {
289
+ const events = [];
290
+ let content = "";
291
+ const choice = parsed.choices?.[0];
292
+ if (!choice) {
293
+ if (parsed.usage && typeof parsed.usage === "object" && (parsed.usage.prompt_tokens || parsed.usage.completion_tokens)) {
294
+ this.inputTokens = parsed.usage.prompt_tokens ?? 0;
295
+ events.push({
296
+ type: "message_delta",
297
+ data: {
298
+ type: "message_delta",
299
+ delta: {},
300
+ usage: {
301
+ input_tokens: parsed.usage.prompt_tokens ?? 0,
302
+ output_tokens: parsed.usage.completion_tokens ?? 0,
303
+ },
304
+ },
305
+ });
306
+ return { events, content: "" };
307
+ }
308
+ return null;
309
+ }
310
+ if (!this.started) {
311
+ this.started = true;
312
+ this.msgId = parsed.id ?? `msg_${Date.now()}`;
313
+ events.push({
314
+ type: "message_start",
315
+ data: {
316
+ type: "message_start",
317
+ message: {
318
+ id: this.msgId,
319
+ type: "message",
320
+ role: "assistant",
321
+ model,
322
+ content: [],
323
+ usage: { input_tokens: this.inputTokens, output_tokens: 0 },
324
+ },
325
+ },
326
+ });
327
+ events.push({
328
+ type: "content_block_start",
329
+ data: { type: "content_block_start", index: 0, content_block: { type: "text", text: "" } },
330
+ });
331
+ }
332
+ if (choice.delta?.content) {
333
+ content = choice.delta.content;
334
+ events.push({
335
+ type: "content_block_delta",
336
+ data: {
337
+ type: "content_block_delta",
338
+ index: 0,
339
+ delta: { type: "text_delta", text: content },
340
+ },
341
+ });
342
+ }
343
+ if (choice.finish_reason) {
344
+ const stopReason = choice.finish_reason === "stop" ? "end_turn"
345
+ : choice.finish_reason === "length" ? "max_tokens" : "end_turn";
346
+ events.push({
347
+ type: "content_block_stop",
348
+ data: { type: "content_block_stop", index: 0 },
349
+ });
350
+ events.push({
351
+ type: "message_delta",
352
+ data: {
353
+ type: "message_delta",
354
+ delta: { stop_reason: stopReason },
355
+ usage: parsed.usage ? {
356
+ input_tokens: parsed.usage.prompt_tokens ?? 0,
357
+ output_tokens: parsed.usage.completion_tokens ?? 0,
358
+ } : { output_tokens: 0 },
359
+ },
360
+ });
361
+ }
362
+ return events.length > 0 ? { events, content } : null;
363
+ }
364
+ }
365
+ // --- Usage extraction ---
366
+ function extractUsage(body, providerType) {
367
+ if (!body?.usage)
368
+ return undefined;
369
+ if (providerType === "openai") {
370
+ return {
371
+ input_tokens: body.usage.prompt_tokens ?? body.usage.input_tokens ?? 0,
372
+ output_tokens: body.usage.completion_tokens ?? body.usage.output_tokens ?? 0,
373
+ };
374
+ }
375
+ if (providerType === "anthropic") {
376
+ return {
377
+ input_tokens: body.usage.input_tokens ?? 0,
378
+ output_tokens: body.usage.output_tokens ?? 0,
379
+ };
380
+ }
381
+ return undefined;
382
+ }
383
+ function extractUsageFromChunk(parsed, providerType) {
384
+ if (providerType === "openai") {
385
+ if (parsed.type === "response.completed" && parsed.response?.usage) {
386
+ return {
387
+ input_tokens: parsed.response.usage.input_tokens ?? 0,
388
+ output_tokens: parsed.response.usage.output_tokens ?? 0,
389
+ };
390
+ }
391
+ if (parsed.usage) {
392
+ return {
393
+ input_tokens: parsed.usage.prompt_tokens ?? parsed.usage.input_tokens ?? 0,
394
+ output_tokens: parsed.usage.completion_tokens ?? parsed.usage.output_tokens ?? 0,
395
+ };
396
+ }
397
+ }
398
+ if (providerType === "anthropic") {
399
+ if (parsed.type === "message_delta" && parsed.usage) {
400
+ return { input_tokens: parsed.usage.input_tokens ?? 0, output_tokens: parsed.usage.output_tokens ?? 0 };
401
+ }
402
+ if (parsed.type === "message_start" && parsed.message?.usage) {
403
+ return { input_tokens: parsed.message.usage.input_tokens ?? 0, output_tokens: 0 };
404
+ }
405
+ }
406
+ return undefined;
407
+ }
408
+ async function decompressJson(response) {
409
+ const encoding = response.headers.get("content-encoding");
410
+ if (!encoding || !["zstd"].includes(encoding)) {
411
+ return response.json();
412
+ }
413
+ const stream = decompressResponse(response);
414
+ const reader = stream.getReader();
415
+ const decoder = new TextDecoder();
416
+ let text = "";
417
+ while (true) {
418
+ const { done, value } = await reader.read();
419
+ if (done)
420
+ break;
421
+ text += decoder.decode(value, { stream: true });
422
+ }
423
+ return JSON.parse(text);
424
+ }
425
+ function decompressResponse(response) {
426
+ const encoding = response.headers.get("content-encoding");
427
+ if (!encoding || !response.body)
428
+ return response.body;
429
+ const decompressors = {
430
+ gzip: createGunzip,
431
+ deflate: createInflate,
432
+ br: createBrotliDecompress,
433
+ zstd: createZstdDecompress,
434
+ };
435
+ const create = decompressors[encoding];
436
+ if (!create)
437
+ return response.body;
438
+ const decompressor = create();
439
+ const nodeStream = Readable.fromWeb(response.body);
440
+ const decompressed = nodeStream.pipe(decompressor);
441
+ return Readable.toWeb(decompressed);
442
+ }
443
+ //# sourceMappingURL=forwarder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forwarder.js","sourceRoot":"","sources":["../../src/proxy/forwarder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Provider, Token } from "../types/config.js";
2
+ export interface RouteResult {
3
+ provider: Provider;
4
+ }
5
+ export declare function resolveProvider(model: string, token: Token): RouteResult | {
6
+ error: string;
7
+ };
8
+ export declare function listAvailableModels(token: Token): string[];
9
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/proxy/router.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAiB5F;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAa1D"}
@@ -0,0 +1,29 @@
1
+ import { getConfig } from "../config.js";
2
+ export function resolveProvider(model, token) {
3
+ const config = getConfig();
4
+ const candidateProviders = config.providers.filter((p) => p.enabled && p.models.includes(model));
5
+ if (candidateProviders.length === 0) {
6
+ return { error: `No provider available for model: ${model}` };
7
+ }
8
+ for (const allowedId of token.allowedProviders) {
9
+ const match = candidateProviders.find((p) => p.id === allowedId);
10
+ if (match)
11
+ return { provider: match };
12
+ }
13
+ return { error: `Token not authorized for any provider serving model: ${model}` };
14
+ }
15
+ export function listAvailableModels(token) {
16
+ const config = getConfig();
17
+ const models = new Set();
18
+ for (const provider of config.providers) {
19
+ if (!provider.enabled)
20
+ continue;
21
+ if (!token.allowedProviders.includes(provider.id))
22
+ continue;
23
+ for (const model of provider.models) {
24
+ models.add(model);
25
+ }
26
+ }
27
+ return [...models];
28
+ }
29
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/proxy/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzC,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,KAAY;IACzD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,MAAM,kBAAkB,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAChD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC7C,CAAC;IAEF,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,KAAK,EAAE,oCAAoC,KAAK,EAAE,EAAE,CAAC;IAChE,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QACjE,IAAI,KAAK;YAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,wDAAwD,KAAK,EAAE,EAAE,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAY;IAC9C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,SAAS;QAChC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,SAAS;QAC5D,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Hono } from "hono";
2
+ import type { AppEnv } from "../types/env.js";
3
+ export declare const anthropicRoutes: Hono<AppEnv, import("hono/types").BlankSchema, "/">;
4
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/routes/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,eAAO,MAAM,eAAe,qDAAqB,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { Hono } from "hono";
2
+ import { authMiddleware } from "../proxy/auth.js";
3
+ import { forwardRequest } from "../proxy/forwarder.js";
4
+ import { resolveProvider } from "../proxy/router.js";
5
+ import { anthropicToOpenai } from "../adapters/anthropic-to-openai.js";
6
+ export const anthropicRoutes = new Hono();
7
+ anthropicRoutes.use("/*", authMiddleware);
8
+ anthropicRoutes.post("/v1/messages", async (c) => {
9
+ const token = c.get("authToken");
10
+ const body = await c.req.json();
11
+ const model = body.model;
12
+ const result = resolveProvider(model, token);
13
+ if ("error" in result) {
14
+ return c.json({ error: result.error }, 400);
15
+ }
16
+ const { provider } = result;
17
+ if (provider.type === "anthropic") {
18
+ return forwardRequest(c, provider, "/v1/messages", body, "anthropic");
19
+ }
20
+ const openaiBody = anthropicToOpenai(body);
21
+ return forwardRequest(c, provider, "/chat/completions", openaiBody, "anthropic");
22
+ });
23
+ anthropicRoutes.all("/*", async (c) => {
24
+ const token = c.get("authToken");
25
+ const body = await c.req.json().catch(() => ({}));
26
+ const model = body.model ?? "";
27
+ const result = resolveProvider(model, token);
28
+ if ("error" in result) {
29
+ return c.json({ error: result.error }, 400);
30
+ }
31
+ if (result.provider.type !== "anthropic") {
32
+ return c.json({ error: "This endpoint requires an Anthropic-compatible provider" }, 400);
33
+ }
34
+ const path = new URL(c.req.url).pathname.replace(/^\/anthropic/, "");
35
+ return forwardRequest(c, result.provider, path, body, "anthropic");
36
+ });
37
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/routes/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAGvE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,IAAI,EAAU,CAAC;AAElD,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;AAE1C,eAAe,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAEzB,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7C,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAE5B,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,mBAAmB,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AACnF,CAAC,CAAC,CAAC;AAEH,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACpC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAE/B,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7C,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACzC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yDAAyD,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACrE,OAAO,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AACrE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Hono } from "hono";
2
+ export declare const apiRoutes: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
3
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/routes/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM5B,eAAO,MAAM,SAAS,4EAAa,CAAC"}