@jeffreycao/copilot-api 1.2.4 → 1.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -0
- package/dist/{config-BD6sOCuT.js → config-CdXB2ktZ.js} +108 -7
- package/dist/config-CdXB2ktZ.js.map +1 -0
- package/dist/main.js +23 -11
- package/dist/main.js.map +1 -1
- package/dist/{server-BPTBrSfO.js → server-CtNjbKuO.js} +219 -53
- package/dist/server-CtNjbKuO.js.map +1 -0
- package/package.json +1 -1
- package/dist/config-BD6sOCuT.js.map +0 -1
- package/dist/server-BPTBrSfO.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { HTTPError, PATHS, cacheModels, copilotBaseUrl, copilotHeaders, forwardError, generateRequestIdFromPayload, getConfig, getCopilotUsage, getExtraPromptForModel, getReasoningEffortForModel, getRootSessionId, getSmallModel, getUUID, isNullish, isResponsesApiContextManagementModel, shouldCompactUseSmallModel, sleep, state } from "./config-
|
|
1
|
+
import { HTTPError, PATHS, cacheModels, copilotBaseUrl, copilotHeaders, forwardError, generateRequestIdFromPayload, getConfig, getCopilotUsage, getExtraPromptForModel, getProviderConfig, getReasoningEffortForModel, getRootSessionId, getSmallModel, getUUID, isNullish, isResponsesApiContextManagementModel, prepareInteractionHeaders, shouldCompactUseSmallModel, sleep, state } from "./config-CdXB2ktZ.js";
|
|
2
2
|
import consola from "consola";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import fs, { readFileSync } from "node:fs";
|
|
@@ -429,11 +429,7 @@ const createChatCompletions = async (payload, options) => {
|
|
|
429
429
|
...copilotHeaders(state, options.requestId, enableVision),
|
|
430
430
|
"x-initiator": isAgentCall ? "agent" : "user"
|
|
431
431
|
};
|
|
432
|
-
|
|
433
|
-
headers["x-initiator"] = "agent";
|
|
434
|
-
headers["x-interaction-type"] = "conversation-subagent";
|
|
435
|
-
}
|
|
436
|
-
if (options.sessionId) headers["x-interaction-id"] = options.sessionId;
|
|
432
|
+
prepareInteractionHeaders(options.sessionId, Boolean(options.subagentMarker), headers);
|
|
437
433
|
const response = await fetch(`${copilotBaseUrl(state)}/chat/completions`, {
|
|
438
434
|
method: "POST",
|
|
439
435
|
headers,
|
|
@@ -449,19 +445,19 @@ const createChatCompletions = async (payload, options) => {
|
|
|
449
445
|
|
|
450
446
|
//#endregion
|
|
451
447
|
//#region src/routes/chat-completions/handler.ts
|
|
452
|
-
const logger$
|
|
448
|
+
const logger$6 = createHandlerLogger("chat-completions-handler");
|
|
453
449
|
async function handleCompletion$1(c) {
|
|
454
450
|
await checkRateLimit(state);
|
|
455
451
|
let payload = await c.req.json();
|
|
456
|
-
logger$
|
|
452
|
+
logger$6.debug("Request payload:", JSON.stringify(payload).slice(-400));
|
|
457
453
|
const selectedModel = state.models?.data.find((model) => model.id === payload.model);
|
|
458
454
|
try {
|
|
459
455
|
if (selectedModel) {
|
|
460
456
|
const tokenCount = await getTokenCount(payload, selectedModel);
|
|
461
|
-
logger$
|
|
462
|
-
} else logger$
|
|
457
|
+
logger$6.info("Current token count:", tokenCount);
|
|
458
|
+
} else logger$6.warn("No model selected, skipping token count calculation");
|
|
463
459
|
} catch (error) {
|
|
464
|
-
logger$
|
|
460
|
+
logger$6.warn("Failed to calculate token count:", error);
|
|
465
461
|
}
|
|
466
462
|
if (state.manualApprove) await awaitApproval();
|
|
467
463
|
if (isNullish(payload.max_tokens)) {
|
|
@@ -469,24 +465,24 @@ async function handleCompletion$1(c) {
|
|
|
469
465
|
...payload,
|
|
470
466
|
max_tokens: selectedModel?.capabilities.limits.max_output_tokens
|
|
471
467
|
};
|
|
472
|
-
logger$
|
|
468
|
+
logger$6.debug("Set max_tokens to:", JSON.stringify(payload.max_tokens));
|
|
473
469
|
}
|
|
474
470
|
const requestId = generateRequestIdFromPayload(payload);
|
|
475
|
-
logger$
|
|
471
|
+
logger$6.debug("Generated request ID:", requestId);
|
|
476
472
|
const sessionId = getUUID(requestId);
|
|
477
|
-
logger$
|
|
473
|
+
logger$6.debug("Extracted session ID:", sessionId);
|
|
478
474
|
const response = await createChatCompletions(payload, {
|
|
479
475
|
requestId,
|
|
480
476
|
sessionId
|
|
481
477
|
});
|
|
482
478
|
if (isNonStreaming$1(response)) {
|
|
483
|
-
logger$
|
|
479
|
+
logger$6.debug("Non-streaming response:", JSON.stringify(response));
|
|
484
480
|
return c.json(response);
|
|
485
481
|
}
|
|
486
|
-
logger$
|
|
482
|
+
logger$6.debug("Streaming response");
|
|
487
483
|
return streamSSE(c, async (stream) => {
|
|
488
484
|
for await (const chunk of response) {
|
|
489
|
-
logger$
|
|
485
|
+
logger$6.debug("Streaming chunk:", JSON.stringify(chunk));
|
|
490
486
|
await stream.writeSSE(chunk);
|
|
491
487
|
}
|
|
492
488
|
});
|
|
@@ -823,11 +819,7 @@ const createResponses = async (payload, { vision, initiator, subagentMarker, req
|
|
|
823
819
|
...copilotHeaders(state, requestId, vision),
|
|
824
820
|
"x-initiator": initiator
|
|
825
821
|
};
|
|
826
|
-
|
|
827
|
-
headers["x-initiator"] = "agent";
|
|
828
|
-
headers["x-interaction-type"] = "conversation-subagent";
|
|
829
|
-
}
|
|
830
|
-
if (sessionId) headers["x-interaction-id"] = sessionId;
|
|
822
|
+
prepareInteractionHeaders(sessionId, Boolean(subagentMarker), headers);
|
|
831
823
|
payload.service_tier = null;
|
|
832
824
|
const response = await fetch(`${copilotBaseUrl(state)}/responses`, {
|
|
833
825
|
method: "POST",
|
|
@@ -1797,11 +1789,7 @@ const createMessages = async (payload, anthropicBetaHeader, options) => {
|
|
|
1797
1789
|
...copilotHeaders(state, options.requestId, enableVision),
|
|
1798
1790
|
"x-initiator": isInitiateRequest ? "user" : "agent"
|
|
1799
1791
|
};
|
|
1800
|
-
|
|
1801
|
-
headers["x-initiator"] = "agent";
|
|
1802
|
-
headers["x-interaction-type"] = "conversation-subagent";
|
|
1803
|
-
}
|
|
1804
|
-
if (options.sessionId) headers["x-interaction-id"] = options.sessionId;
|
|
1792
|
+
prepareInteractionHeaders(options.sessionId, Boolean(options.subagentMarker), headers);
|
|
1805
1793
|
const anthropicBeta = buildAnthropicBetaHeader(anthropicBetaHeader, payload.thinking);
|
|
1806
1794
|
if (anthropicBeta) headers["anthropic-beta"] = anthropicBeta;
|
|
1807
1795
|
const response = await fetch(`${copilotBaseUrl(state)}/v1/messages`, {
|
|
@@ -2114,27 +2102,27 @@ const parseSubagentMarkerFromSystemReminder = (text) => {
|
|
|
2114
2102
|
|
|
2115
2103
|
//#endregion
|
|
2116
2104
|
//#region src/routes/messages/handler.ts
|
|
2117
|
-
const logger$
|
|
2105
|
+
const logger$5 = createHandlerLogger("messages-handler");
|
|
2118
2106
|
const compactSystemPromptStart = "You are a helpful AI assistant tasked with summarizing conversations";
|
|
2119
2107
|
async function handleCompletion(c) {
|
|
2120
2108
|
await checkRateLimit(state);
|
|
2121
2109
|
const anthropicPayload = await c.req.json();
|
|
2122
|
-
logger$
|
|
2110
|
+
logger$5.debug("Anthropic request payload:", JSON.stringify(anthropicPayload));
|
|
2123
2111
|
const subagentMarker = parseSubagentMarkerFromFirstUser(anthropicPayload);
|
|
2124
|
-
if (subagentMarker) logger$
|
|
2112
|
+
if (subagentMarker) logger$5.debug("Detected Subagent marker:", JSON.stringify(subagentMarker));
|
|
2125
2113
|
const sessionId = getRootSessionId(anthropicPayload, c);
|
|
2126
|
-
logger$
|
|
2114
|
+
logger$5.debug("Extracted session ID:", sessionId);
|
|
2127
2115
|
const isCompact = isCompactRequest(anthropicPayload);
|
|
2128
2116
|
const anthropicBeta = c.req.header("anthropic-beta");
|
|
2129
|
-
logger$
|
|
2117
|
+
logger$5.debug("Anthropic Beta header:", anthropicBeta);
|
|
2130
2118
|
const noTools = !anthropicPayload.tools || anthropicPayload.tools.length === 0;
|
|
2131
2119
|
if (anthropicBeta && noTools && !isCompact) anthropicPayload.model = getSmallModel();
|
|
2132
2120
|
if (isCompact) {
|
|
2133
|
-
logger$
|
|
2121
|
+
logger$5.debug("Is compact request:", isCompact);
|
|
2134
2122
|
if (shouldCompactUseSmallModel()) anthropicPayload.model = getSmallModel();
|
|
2135
2123
|
} else mergeToolResultForClaude(anthropicPayload);
|
|
2136
2124
|
const requestId = generateRequestIdFromPayload(anthropicPayload, sessionId);
|
|
2137
|
-
logger$
|
|
2125
|
+
logger$5.debug("Generated request ID:", requestId);
|
|
2138
2126
|
if (state.manualApprove) await awaitApproval();
|
|
2139
2127
|
const selectedModel = state.models?.data.find((m) => m.id === anthropicPayload.model);
|
|
2140
2128
|
if (shouldUseMessagesApi(selectedModel)) return await handleWithMessagesApi(c, anthropicPayload, {
|
|
@@ -2161,19 +2149,19 @@ const MESSAGES_ENDPOINT = "/v1/messages";
|
|
|
2161
2149
|
const handleWithChatCompletions = async (c, anthropicPayload, options) => {
|
|
2162
2150
|
const { subagentMarker, requestId, sessionId } = options;
|
|
2163
2151
|
const openAIPayload = translateToOpenAI(anthropicPayload);
|
|
2164
|
-
logger$
|
|
2152
|
+
logger$5.debug("Translated OpenAI request payload:", JSON.stringify(openAIPayload));
|
|
2165
2153
|
const response = await createChatCompletions(openAIPayload, {
|
|
2166
2154
|
subagentMarker,
|
|
2167
2155
|
requestId,
|
|
2168
2156
|
sessionId
|
|
2169
2157
|
});
|
|
2170
2158
|
if (isNonStreaming(response)) {
|
|
2171
|
-
logger$
|
|
2159
|
+
logger$5.debug("Non-streaming response from Copilot:", JSON.stringify(response));
|
|
2172
2160
|
const anthropicResponse = translateToAnthropic(response);
|
|
2173
|
-
logger$
|
|
2161
|
+
logger$5.debug("Translated Anthropic response:", JSON.stringify(anthropicResponse));
|
|
2174
2162
|
return c.json(anthropicResponse);
|
|
2175
2163
|
}
|
|
2176
|
-
logger$
|
|
2164
|
+
logger$5.debug("Streaming response from Copilot");
|
|
2177
2165
|
return streamSSE(c, async (stream) => {
|
|
2178
2166
|
const streamState = {
|
|
2179
2167
|
messageStartSent: false,
|
|
@@ -2183,13 +2171,13 @@ const handleWithChatCompletions = async (c, anthropicPayload, options) => {
|
|
|
2183
2171
|
thinkingBlockOpen: false
|
|
2184
2172
|
};
|
|
2185
2173
|
for await (const rawEvent of response) {
|
|
2186
|
-
logger$
|
|
2174
|
+
logger$5.debug("Copilot raw stream event:", JSON.stringify(rawEvent));
|
|
2187
2175
|
if (rawEvent.data === "[DONE]") break;
|
|
2188
2176
|
if (!rawEvent.data) continue;
|
|
2189
2177
|
const chunk = JSON.parse(rawEvent.data);
|
|
2190
2178
|
const events$1 = translateChunkToAnthropicEvents(chunk, streamState);
|
|
2191
2179
|
for (const event of events$1) {
|
|
2192
|
-
logger$
|
|
2180
|
+
logger$5.debug("Translated Anthropic event:", JSON.stringify(event));
|
|
2193
2181
|
await stream.writeSSE({
|
|
2194
2182
|
event: event.type,
|
|
2195
2183
|
data: JSON.stringify(event)
|
|
@@ -2203,7 +2191,7 @@ const handleWithResponsesApi = async (c, anthropicPayload, options) => {
|
|
|
2203
2191
|
const responsesPayload = translateAnthropicMessagesToResponsesPayload(anthropicPayload);
|
|
2204
2192
|
applyResponsesApiContextManagement(responsesPayload, selectedModel?.capabilities.limits.max_prompt_tokens);
|
|
2205
2193
|
compactInputByLatestCompaction(responsesPayload);
|
|
2206
|
-
logger$
|
|
2194
|
+
logger$5.debug("Translated Responses payload:", JSON.stringify(responsesPayload));
|
|
2207
2195
|
const { vision, initiator } = getResponsesRequestOptions(responsesPayload);
|
|
2208
2196
|
const response = await createResponses(responsesPayload, {
|
|
2209
2197
|
vision,
|
|
@@ -2213,7 +2201,7 @@ const handleWithResponsesApi = async (c, anthropicPayload, options) => {
|
|
|
2213
2201
|
sessionId
|
|
2214
2202
|
});
|
|
2215
2203
|
if (responsesPayload.stream && isAsyncIterable$1(response)) {
|
|
2216
|
-
logger$
|
|
2204
|
+
logger$5.debug("Streaming response from Copilot (Responses API)");
|
|
2217
2205
|
return streamSSE(c, async (stream) => {
|
|
2218
2206
|
const streamState = createResponsesStreamState();
|
|
2219
2207
|
for await (const chunk of response) {
|
|
@@ -2226,23 +2214,23 @@ const handleWithResponsesApi = async (c, anthropicPayload, options) => {
|
|
|
2226
2214
|
}
|
|
2227
2215
|
const data = chunk.data;
|
|
2228
2216
|
if (!data) continue;
|
|
2229
|
-
logger$
|
|
2217
|
+
logger$5.debug("Responses raw stream event:", data);
|
|
2230
2218
|
const events$1 = translateResponsesStreamEvent(JSON.parse(data), streamState);
|
|
2231
2219
|
for (const event of events$1) {
|
|
2232
2220
|
const eventData = JSON.stringify(event);
|
|
2233
|
-
logger$
|
|
2221
|
+
logger$5.debug("Translated Anthropic event:", eventData);
|
|
2234
2222
|
await stream.writeSSE({
|
|
2235
2223
|
event: event.type,
|
|
2236
2224
|
data: eventData
|
|
2237
2225
|
});
|
|
2238
2226
|
}
|
|
2239
2227
|
if (streamState.messageCompleted) {
|
|
2240
|
-
logger$
|
|
2228
|
+
logger$5.debug("Message completed, ending stream");
|
|
2241
2229
|
break;
|
|
2242
2230
|
}
|
|
2243
2231
|
}
|
|
2244
2232
|
if (!streamState.messageCompleted) {
|
|
2245
|
-
logger$
|
|
2233
|
+
logger$5.warn("Responses stream ended without completion; sending error event");
|
|
2246
2234
|
const errorEvent = buildErrorEvent("Responses stream ended without completion");
|
|
2247
2235
|
await stream.writeSSE({
|
|
2248
2236
|
event: errorEvent.type,
|
|
@@ -2251,9 +2239,9 @@ const handleWithResponsesApi = async (c, anthropicPayload, options) => {
|
|
|
2251
2239
|
}
|
|
2252
2240
|
});
|
|
2253
2241
|
}
|
|
2254
|
-
logger$
|
|
2242
|
+
logger$5.debug("Non-streaming Responses result:", JSON.stringify(response).slice(-400));
|
|
2255
2243
|
const anthropicResponse = translateResponsesResultToAnthropic(response);
|
|
2256
|
-
logger$
|
|
2244
|
+
logger$5.debug("Translated Anthropic response:", JSON.stringify(anthropicResponse));
|
|
2257
2245
|
return c.json(anthropicResponse);
|
|
2258
2246
|
};
|
|
2259
2247
|
const handleWithMessagesApi = async (c, anthropicPayload, options) => {
|
|
@@ -2268,19 +2256,19 @@ const handleWithMessagesApi = async (c, anthropicPayload, options) => {
|
|
|
2268
2256
|
anthropicPayload.thinking = { type: "adaptive" };
|
|
2269
2257
|
anthropicPayload.output_config = { effort: getAnthropicEffortForModel(anthropicPayload.model) };
|
|
2270
2258
|
}
|
|
2271
|
-
logger$
|
|
2259
|
+
logger$5.debug("Translated Messages payload:", JSON.stringify(anthropicPayload));
|
|
2272
2260
|
const response = await createMessages(anthropicPayload, anthropicBetaHeader, {
|
|
2273
2261
|
subagentMarker,
|
|
2274
2262
|
requestId,
|
|
2275
2263
|
sessionId
|
|
2276
2264
|
});
|
|
2277
2265
|
if (isAsyncIterable$1(response)) {
|
|
2278
|
-
logger$
|
|
2266
|
+
logger$5.debug("Streaming response from Copilot (Messages API)");
|
|
2279
2267
|
return streamSSE(c, async (stream) => {
|
|
2280
2268
|
for await (const event of response) {
|
|
2281
2269
|
const eventName = event.event;
|
|
2282
2270
|
const data = event.data ?? "";
|
|
2283
|
-
logger$
|
|
2271
|
+
logger$5.debug("Messages raw stream event:", data);
|
|
2284
2272
|
await stream.writeSSE({
|
|
2285
2273
|
event: eventName,
|
|
2286
2274
|
data
|
|
@@ -2288,7 +2276,7 @@ const handleWithMessagesApi = async (c, anthropicPayload, options) => {
|
|
|
2288
2276
|
}
|
|
2289
2277
|
});
|
|
2290
2278
|
}
|
|
2291
|
-
logger$
|
|
2279
|
+
logger$5.debug("Non-streaming Messages result:", JSON.stringify(response).slice(-400));
|
|
2292
2280
|
return c.json(response);
|
|
2293
2281
|
};
|
|
2294
2282
|
const shouldUseResponsesApi = (selectedModel) => {
|
|
@@ -2399,6 +2387,182 @@ modelRoutes.get("/", async (c) => {
|
|
|
2399
2387
|
}
|
|
2400
2388
|
});
|
|
2401
2389
|
|
|
2390
|
+
//#endregion
|
|
2391
|
+
//#region src/routes/provider/messages/count-tokens-handler.ts
|
|
2392
|
+
const logger$4 = createHandlerLogger("provider-count-tokens-handler");
|
|
2393
|
+
const createFallbackModel = (modelId) => ({
|
|
2394
|
+
capabilities: {
|
|
2395
|
+
family: "provider",
|
|
2396
|
+
limits: {},
|
|
2397
|
+
object: "model_capabilities",
|
|
2398
|
+
supports: {},
|
|
2399
|
+
tokenizer: "o200k_base",
|
|
2400
|
+
type: "chat"
|
|
2401
|
+
},
|
|
2402
|
+
id: modelId,
|
|
2403
|
+
model_picker_enabled: false,
|
|
2404
|
+
name: modelId,
|
|
2405
|
+
object: "model",
|
|
2406
|
+
preview: false,
|
|
2407
|
+
vendor: "provider",
|
|
2408
|
+
version: "unknown"
|
|
2409
|
+
});
|
|
2410
|
+
async function handleProviderCountTokens(c) {
|
|
2411
|
+
const provider = c.req.param("provider");
|
|
2412
|
+
try {
|
|
2413
|
+
const anthropicPayload = await c.req.json();
|
|
2414
|
+
const openAIPayload = translateToOpenAI(anthropicPayload);
|
|
2415
|
+
const modelId = anthropicPayload.model.trim();
|
|
2416
|
+
let selectedModel = state.models?.data.find((model) => model.id === modelId);
|
|
2417
|
+
if (!selectedModel && modelId) selectedModel = createFallbackModel(modelId);
|
|
2418
|
+
if (!selectedModel) {
|
|
2419
|
+
logger$4.warn("provider.count_tokens.model_not_found", {
|
|
2420
|
+
provider,
|
|
2421
|
+
model: anthropicPayload.model
|
|
2422
|
+
});
|
|
2423
|
+
return c.json({ input_tokens: 1 });
|
|
2424
|
+
}
|
|
2425
|
+
const tokenCount = await getTokenCount(openAIPayload, selectedModel);
|
|
2426
|
+
const finalTokenCount = tokenCount.input + tokenCount.output;
|
|
2427
|
+
logger$4.debug("provider.count_tokens.success", {
|
|
2428
|
+
provider,
|
|
2429
|
+
model: anthropicPayload.model,
|
|
2430
|
+
input_tokens: finalTokenCount
|
|
2431
|
+
});
|
|
2432
|
+
return c.json({ input_tokens: finalTokenCount });
|
|
2433
|
+
} catch (error) {
|
|
2434
|
+
logger$4.error("provider.count_tokens.error", {
|
|
2435
|
+
provider,
|
|
2436
|
+
error
|
|
2437
|
+
});
|
|
2438
|
+
return c.json({ input_tokens: 1 });
|
|
2439
|
+
}
|
|
2440
|
+
}
|
|
2441
|
+
|
|
2442
|
+
//#endregion
|
|
2443
|
+
//#region src/services/providers/anthropic-proxy.ts
|
|
2444
|
+
const FORWARDABLE_HEADERS = [
|
|
2445
|
+
"anthropic-version",
|
|
2446
|
+
"anthropic-beta",
|
|
2447
|
+
"accept",
|
|
2448
|
+
"user-agent"
|
|
2449
|
+
];
|
|
2450
|
+
function buildProviderUpstreamHeaders(providerConfig, requestHeaders) {
|
|
2451
|
+
const headers = {
|
|
2452
|
+
"content-type": "application/json",
|
|
2453
|
+
accept: "application/json",
|
|
2454
|
+
"x-api-key": providerConfig.apiKey
|
|
2455
|
+
};
|
|
2456
|
+
for (const headerName of FORWARDABLE_HEADERS) {
|
|
2457
|
+
const headerValue = requestHeaders.get(headerName);
|
|
2458
|
+
if (headerValue) headers[headerName] = headerValue;
|
|
2459
|
+
}
|
|
2460
|
+
return headers;
|
|
2461
|
+
}
|
|
2462
|
+
async function forwardProviderMessages(providerConfig, payload, requestHeaders) {
|
|
2463
|
+
return await fetch(`${providerConfig.baseUrl}/v1/messages`, {
|
|
2464
|
+
method: "POST",
|
|
2465
|
+
headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),
|
|
2466
|
+
body: JSON.stringify(payload)
|
|
2467
|
+
});
|
|
2468
|
+
}
|
|
2469
|
+
async function forwardProviderModels(providerConfig, requestHeaders) {
|
|
2470
|
+
return await fetch(`${providerConfig.baseUrl}/v1/models`, {
|
|
2471
|
+
method: "GET",
|
|
2472
|
+
headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders)
|
|
2473
|
+
});
|
|
2474
|
+
}
|
|
2475
|
+
|
|
2476
|
+
//#endregion
|
|
2477
|
+
//#region src/routes/provider/messages/handler.ts
|
|
2478
|
+
const logger$3 = createHandlerLogger("provider-messages-handler");
|
|
2479
|
+
async function handleProviderMessages(c) {
|
|
2480
|
+
const provider = c.req.param("provider");
|
|
2481
|
+
const providerConfig = getProviderConfig(provider);
|
|
2482
|
+
if (!providerConfig) return c.json({ error: {
|
|
2483
|
+
message: `Provider '${provider}' not found or disabled`,
|
|
2484
|
+
type: "invalid_request_error"
|
|
2485
|
+
} }, 404);
|
|
2486
|
+
try {
|
|
2487
|
+
const payload = await c.req.json();
|
|
2488
|
+
payload.temperature ??= providerConfig.defaultTemperature;
|
|
2489
|
+
payload.top_p ??= providerConfig.defaultTopP;
|
|
2490
|
+
payload.top_k ??= providerConfig.defaultTopK;
|
|
2491
|
+
logger$3.debug("provider.messages.request", JSON.stringify({
|
|
2492
|
+
payload,
|
|
2493
|
+
provider
|
|
2494
|
+
}));
|
|
2495
|
+
const upstreamResponse = await forwardProviderMessages(providerConfig, payload, c.req.raw.headers);
|
|
2496
|
+
const contentType = upstreamResponse.headers.get("content-type") ?? "";
|
|
2497
|
+
if (Boolean(payload.stream) && contentType.includes("text/event-stream")) {
|
|
2498
|
+
logger$3.debug("provider.messages.streaming");
|
|
2499
|
+
return streamSSE(c, async (stream) => {
|
|
2500
|
+
for await (const event of events(upstreamResponse)) {
|
|
2501
|
+
const eventName = event.event;
|
|
2502
|
+
const data = event.data ?? "";
|
|
2503
|
+
logger$3.debug("provider.messages.raw_stream_event", data);
|
|
2504
|
+
await stream.writeSSE({
|
|
2505
|
+
event: eventName,
|
|
2506
|
+
data
|
|
2507
|
+
});
|
|
2508
|
+
}
|
|
2509
|
+
});
|
|
2510
|
+
}
|
|
2511
|
+
return upstreamResponse;
|
|
2512
|
+
} catch (error) {
|
|
2513
|
+
logger$3.error("provider.messages.error", {
|
|
2514
|
+
provider,
|
|
2515
|
+
error
|
|
2516
|
+
});
|
|
2517
|
+
throw error;
|
|
2518
|
+
}
|
|
2519
|
+
}
|
|
2520
|
+
|
|
2521
|
+
//#endregion
|
|
2522
|
+
//#region src/routes/provider/messages/route.ts
|
|
2523
|
+
const providerMessageRoutes = new Hono();
|
|
2524
|
+
providerMessageRoutes.post("/", async (c) => {
|
|
2525
|
+
try {
|
|
2526
|
+
return await handleProviderMessages(c);
|
|
2527
|
+
} catch (error) {
|
|
2528
|
+
return await forwardError(c, error);
|
|
2529
|
+
}
|
|
2530
|
+
});
|
|
2531
|
+
providerMessageRoutes.post("/count_tokens", async (c) => {
|
|
2532
|
+
try {
|
|
2533
|
+
return await handleProviderCountTokens(c);
|
|
2534
|
+
} catch (error) {
|
|
2535
|
+
return await forwardError(c, error);
|
|
2536
|
+
}
|
|
2537
|
+
});
|
|
2538
|
+
|
|
2539
|
+
//#endregion
|
|
2540
|
+
//#region src/routes/provider/models/route.ts
|
|
2541
|
+
const logger$2 = createHandlerLogger("provider-models-handler");
|
|
2542
|
+
const providerModelRoutes = new Hono();
|
|
2543
|
+
providerModelRoutes.get("/", async (c) => {
|
|
2544
|
+
const provider = c.req.param("provider") ?? "";
|
|
2545
|
+
try {
|
|
2546
|
+
const providerConfig = getProviderConfig(provider);
|
|
2547
|
+
if (!providerConfig) return c.json({ error: {
|
|
2548
|
+
message: `Provider '${provider}' not found or disabled`,
|
|
2549
|
+
type: "invalid_request_error"
|
|
2550
|
+
} }, 404);
|
|
2551
|
+
const upstreamResponse = await forwardProviderModels(providerConfig, c.req.raw.headers);
|
|
2552
|
+
logger$2.debug("provider.models.response", {
|
|
2553
|
+
provider,
|
|
2554
|
+
statusCode: upstreamResponse.status
|
|
2555
|
+
});
|
|
2556
|
+
return upstreamResponse;
|
|
2557
|
+
} catch (error) {
|
|
2558
|
+
logger$2.error("provider.models.error", {
|
|
2559
|
+
provider,
|
|
2560
|
+
error
|
|
2561
|
+
});
|
|
2562
|
+
return await forwardError(c, error);
|
|
2563
|
+
}
|
|
2564
|
+
});
|
|
2565
|
+
|
|
2402
2566
|
//#endregion
|
|
2403
2567
|
//#region src/routes/responses/stream-id-sync.ts
|
|
2404
2568
|
const createStreamIdTracker = () => ({ outputItems: /* @__PURE__ */ new Map() });
|
|
@@ -2584,7 +2748,9 @@ server.route("/v1/models", modelRoutes);
|
|
|
2584
2748
|
server.route("/v1/embeddings", embeddingRoutes);
|
|
2585
2749
|
server.route("/v1/responses", responsesRoutes);
|
|
2586
2750
|
server.route("/v1/messages", messageRoutes);
|
|
2751
|
+
server.route("/:provider/v1/messages", providerMessageRoutes);
|
|
2752
|
+
server.route("/:provider/v1/models", providerModelRoutes);
|
|
2587
2753
|
|
|
2588
2754
|
//#endregion
|
|
2589
2755
|
export { server };
|
|
2590
|
-
//# sourceMappingURL=server-
|
|
2756
|
+
//# sourceMappingURL=server-CtNjbKuO.js.map
|