@jeffreycao/copilot-api 1.13.0 → 1.13.2
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 +14 -33
- package/README.zh-CN.md +14 -33
- package/dist/auth-78zODZMk.js +2 -0
- package/dist/{auth-DcYySZhC.js → auth-Bgl9wevd.js} +25 -23
- package/dist/auth-Bgl9wevd.js.map +1 -0
- package/dist/{config-CQxppJtD.js → config-DODTXsGz.js} +3 -7
- package/dist/config-DODTXsGz.js.map +1 -0
- package/dist/{debug-IUKehQot.js → debug-CjJqlHl_.js} +2 -2
- package/dist/{debug-IUKehQot.js.map → debug-CjJqlHl_.js.map} +1 -1
- package/dist/main.js +3 -3
- package/dist/{server-7U9OZLf0.js → server-s_0_JChu.js} +144 -78
- package/dist/server-s_0_JChu.js.map +1 -0
- package/dist/{start-Dq2b9vPm.js → start-cdHEufWN.js} +5 -5
- package/dist/{start-Dq2b9vPm.js.map → start-cdHEufWN.js.map} +1 -1
- package/dist/{token-CFArcYwb.js → token-DigcCxDR.js} +2 -1929
- package/dist/token-DigcCxDR.js.map +1 -0
- package/package.json +1 -1
- package/pages/index.html +42 -16
- package/dist/auth-BwQ7Vhzt.js +0 -2
- package/dist/auth-DcYySZhC.js.map +0 -1
- package/dist/config-CQxppJtD.js.map +0 -1
- package/dist/server-7U9OZLf0.js.map +0 -1
- package/dist/token-CFArcYwb.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { B as forwardError, C as prepareInteractionHeaders, D as compactMessageSections, E as compactAutoContinuePromptStarts, F as resolveTraceId$1, I as createPooledWebSocketStream, L as createWebSocketUrl, M as forwardCodexResponses, N as generateTraceId, P as requestContext, R as state, S as prepareForCompact, _ as getCopilotUsage, b as copilotHeaders, d as generateRequestIdFromPayload, f as getRootSessionId, g as sleep, h as parseUserIdMetadata, k as compactSystemPromptStarts, m as isNullish, p as getUUID, r as setupCodexToken, w as prepareMessageProxyHeaders, x as copilotWebSocketHeaders, y as copilotBaseUrl, z as HTTPError } from "./token-
|
|
1
|
+
import { S as setModelMappings, a as getExtraPromptForModel, c as getModelResponsesApiCompactThreshold$1, d as getReasoningEffortForModel, f as getSmallModel, g as isResponsesApiWebSocketEnabled, h as isResponsesApiWebSearchEnabled, i as getConfig, l as getProviderConfig, m as isResponsesApiContextManagementEnabled, n as getAnthropicApiKey, o as getMessageApiWebSearchModel, p as isMessagesApiEnabled, r as getClaudeTokenMultiplier, s as getModelMappings, u as getRawProviderConfig, v as listEnabledProviders, w as PATHS, x as resolveMappedModel } from "./config-DODTXsGz.js";
|
|
2
|
+
import { B as forwardError, C as prepareInteractionHeaders, D as compactMessageSections, E as compactAutoContinuePromptStarts, F as resolveTraceId$1, I as createPooledWebSocketStream, L as createWebSocketUrl, M as forwardCodexResponses, N as generateTraceId, P as requestContext, R as state, S as prepareForCompact, _ as getCopilotUsage, b as copilotHeaders, d as generateRequestIdFromPayload, f as getRootSessionId, g as sleep, h as parseUserIdMetadata, k as compactSystemPromptStarts, m as isNullish, p as getUUID, r as setupCodexToken, w as prepareMessageProxyHeaders, x as copilotWebSocketHeaders, y as copilotBaseUrl, z as HTTPError } from "./token-DigcCxDR.js";
|
|
3
3
|
import { a as isDeferredToolName, c as parseMcpToolSearchSentinel, d as shouldEnableResponsesToolSearch, i as isBridgeToolSearchName, l as resolveBridgeToolSearchName, o as listDeferredToolNames, r as formatToolSearchBridgeArguments, s as normalizeToolSearchBridgeArguments, t as BRIDGE_TOOL_SEARCH_NAME, u as selectDeferredToolsByNames } from "./tool-search-OX6iPJ9D.js";
|
|
4
4
|
import consola from "consola";
|
|
5
5
|
import { createHash } from "node:crypto";
|
|
@@ -1397,7 +1397,7 @@ async function forwardProviderModels(providerConfig, requestHeaders) {
|
|
|
1397
1397
|
}
|
|
1398
1398
|
//#endregion
|
|
1399
1399
|
//#region src/routes/provider/chat-completions/handler.ts
|
|
1400
|
-
const logger$
|
|
1400
|
+
const logger$9 = createHandlerLogger("provider-chat-completions-handler");
|
|
1401
1401
|
async function handleProviderChatCompletionsForProvider(c, options) {
|
|
1402
1402
|
const { payload, provider } = options;
|
|
1403
1403
|
const providerConfig = await resolveProviderConfig(provider);
|
|
@@ -1409,13 +1409,13 @@ async function handleProviderChatCompletionsForProvider(c, options) {
|
|
|
1409
1409
|
applyProviderModelDefaults(payload, modelConfig);
|
|
1410
1410
|
applyMissingExtraBody$1(payload, { extraBody: modelConfig?.extraBody });
|
|
1411
1411
|
applyProviderStreamOptions(payload);
|
|
1412
|
-
debugJson(logger$
|
|
1412
|
+
debugJson(logger$9, "provider.chat_completions.request", {
|
|
1413
1413
|
payload,
|
|
1414
1414
|
provider
|
|
1415
1415
|
});
|
|
1416
1416
|
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, payload, c.req.raw.headers);
|
|
1417
1417
|
if (!upstreamResponse.ok) {
|
|
1418
|
-
logger$
|
|
1418
|
+
logger$9.error("Failed to create provider chat completions", {
|
|
1419
1419
|
provider,
|
|
1420
1420
|
statusCode: upstreamResponse.status
|
|
1421
1421
|
});
|
|
@@ -1429,7 +1429,7 @@ async function handleProviderChatCompletionsForProvider(c, options) {
|
|
|
1429
1429
|
});
|
|
1430
1430
|
const responseBody = await upstreamResponse.clone().json();
|
|
1431
1431
|
recordUsage(normalizeOpenAIUsage(responseBody.usage));
|
|
1432
|
-
debugJson(logger$
|
|
1432
|
+
debugJson(logger$9, "provider.chat_completions.response", responseBody);
|
|
1433
1433
|
return createProviderProxyResponse(upstreamResponse);
|
|
1434
1434
|
}
|
|
1435
1435
|
const applyProviderModelDefaults = (payload, modelConfig) => {
|
|
@@ -1455,12 +1455,12 @@ const createProviderChatCompletionsUsageRecorder = (payload, provider, modelConf
|
|
|
1455
1455
|
providerName: provider
|
|
1456
1456
|
});
|
|
1457
1457
|
const streamProviderChatCompletions = (c, upstreamResponse, options) => {
|
|
1458
|
-
logger$
|
|
1458
|
+
logger$9.debug("provider.chat_completions.streaming", { provider: options.provider });
|
|
1459
1459
|
return streamSSE(c, async (stream) => {
|
|
1460
1460
|
let usage = {};
|
|
1461
1461
|
try {
|
|
1462
1462
|
for await (const chunk of events(upstreamResponse)) {
|
|
1463
|
-
debugJson(logger$
|
|
1463
|
+
debugJson(logger$9, "provider.chat_completions.stream_chunk", chunk);
|
|
1464
1464
|
if (chunk.data && chunk.data !== "[DONE]") {
|
|
1465
1465
|
const parsedChunk = parseChatCompletionChunkData(chunk.data);
|
|
1466
1466
|
if (parsedChunk?.usage) usage = normalizeOpenAIUsage(parsedChunk.usage);
|
|
@@ -1587,7 +1587,7 @@ const createChatCompletions = async (payload, options) => {
|
|
|
1587
1587
|
};
|
|
1588
1588
|
//#endregion
|
|
1589
1589
|
//#region src/routes/chat-completions/handler.ts
|
|
1590
|
-
const logger$
|
|
1590
|
+
const logger$8 = createHandlerLogger("chat-completions-handler");
|
|
1591
1591
|
async function handleCompletion$1(c) {
|
|
1592
1592
|
let payload = await c.req.json();
|
|
1593
1593
|
const requestedModel = payload.model;
|
|
@@ -1602,7 +1602,7 @@ async function handleCompletion$1(c) {
|
|
|
1602
1602
|
});
|
|
1603
1603
|
}
|
|
1604
1604
|
await checkRateLimit(state);
|
|
1605
|
-
debugJson(logger$
|
|
1605
|
+
debugJson(logger$8, "Request payload:", payload);
|
|
1606
1606
|
const selectedModel = state.models?.data.find((model) => model.id === payload.model);
|
|
1607
1607
|
if (state.manualApprove) await awaitApproval();
|
|
1608
1608
|
if (isNullish(payload.max_tokens) && isNullish(payload.max_completion_tokens)) {
|
|
@@ -1610,16 +1610,16 @@ async function handleCompletion$1(c) {
|
|
|
1610
1610
|
...payload,
|
|
1611
1611
|
max_tokens: selectedModel?.capabilities.limits.max_output_tokens
|
|
1612
1612
|
};
|
|
1613
|
-
debugJson(logger$
|
|
1613
|
+
debugJson(logger$8, "Set max_tokens to:", payload.max_tokens);
|
|
1614
1614
|
}
|
|
1615
1615
|
if (payload.model.includes("gpt")) {
|
|
1616
1616
|
if (isNullish(payload.max_completion_tokens)) payload.max_completion_tokens = payload.max_tokens;
|
|
1617
1617
|
delete payload.max_tokens;
|
|
1618
1618
|
}
|
|
1619
1619
|
const requestId = generateRequestIdFromPayload(payload);
|
|
1620
|
-
logger$
|
|
1620
|
+
logger$8.debug("Generated request ID:", requestId);
|
|
1621
1621
|
const sessionId = getUUID(requestId);
|
|
1622
|
-
logger$
|
|
1622
|
+
logger$8.debug("Extracted session ID:", sessionId);
|
|
1623
1623
|
const recordUsage = createCopilotTokenUsageRecorder({
|
|
1624
1624
|
endpoint: "chat_completions",
|
|
1625
1625
|
fallbackSessionId: sessionId,
|
|
@@ -1630,18 +1630,18 @@ async function handleCompletion$1(c) {
|
|
|
1630
1630
|
sessionId
|
|
1631
1631
|
});
|
|
1632
1632
|
if (isNonStreaming$1(response)) {
|
|
1633
|
-
debugJson(logger$
|
|
1633
|
+
debugJson(logger$8, "Non-streaming response:", response);
|
|
1634
1634
|
recordUsage({
|
|
1635
1635
|
...normalizeOpenAIUsage(response.usage),
|
|
1636
1636
|
total_nano_aiu: normalizeOptionalToken(response.copilot_usage?.total_nano_aiu)
|
|
1637
1637
|
});
|
|
1638
1638
|
return c.json(response);
|
|
1639
1639
|
}
|
|
1640
|
-
logger$
|
|
1640
|
+
logger$8.debug("Streaming response");
|
|
1641
1641
|
return streamSSE(c, async (stream) => {
|
|
1642
1642
|
let usage = {};
|
|
1643
1643
|
for await (const chunk of response) {
|
|
1644
|
-
debugJson(logger$
|
|
1644
|
+
debugJson(logger$8, "Streaming chunk:", chunk);
|
|
1645
1645
|
const parsedChunk = parseChatCompletionChunk(chunk);
|
|
1646
1646
|
if (parsedChunk?.usage || parsedChunk?.copilot_usage) usage = {
|
|
1647
1647
|
...normalizeOpenAIUsage(parsedChunk.usage),
|
|
@@ -2749,7 +2749,7 @@ const prepareMessagesApiPayload = (payload, selectedModel) => {
|
|
|
2749
2749
|
};
|
|
2750
2750
|
//#endregion
|
|
2751
2751
|
//#region src/routes/provider/messages/count-tokens-handler.ts
|
|
2752
|
-
const logger$
|
|
2752
|
+
const logger$7 = createHandlerLogger("provider-count-tokens-handler");
|
|
2753
2753
|
async function handleProviderCountTokens(c) {
|
|
2754
2754
|
const provider = c.req.param("provider");
|
|
2755
2755
|
return await handleProviderCountTokensForProvider(c, {
|
|
@@ -2772,7 +2772,7 @@ async function handleProviderCountTokensForProvider(c, options) {
|
|
|
2772
2772
|
toolContentSupportType: modelConfig?.toolContentSupportType ?? []
|
|
2773
2773
|
} : void 0), createFallbackModel(modelId));
|
|
2774
2774
|
const finalTokenCount = tokenCount.input + tokenCount.output;
|
|
2775
|
-
logger$
|
|
2775
|
+
logger$7.debug("provider.count_tokens.success", {
|
|
2776
2776
|
provider,
|
|
2777
2777
|
model: anthropicPayload.model,
|
|
2778
2778
|
input_tokens: finalTokenCount
|
|
@@ -3909,9 +3909,9 @@ const mapResponsesUsage = (response) => {
|
|
|
3909
3909
|
...response.usage?.input_tokens_details?.cached_tokens !== void 0 && { cache_read_input_tokens: response.usage.input_tokens_details.cached_tokens }
|
|
3910
3910
|
};
|
|
3911
3911
|
};
|
|
3912
|
-
const isRecord = (value) => typeof value === "object" && value !== null;
|
|
3913
|
-
const isResponseOutputText = (block) => isRecord(block) && "type" in block && block.type === "output_text";
|
|
3914
|
-
const isResponseOutputRefusal = (block) => isRecord(block) && "type" in block && block.type === "refusal";
|
|
3912
|
+
const isRecord$1 = (value) => typeof value === "object" && value !== null;
|
|
3913
|
+
const isResponseOutputText = (block) => isRecord$1(block) && "type" in block && block.type === "output_text";
|
|
3914
|
+
const isResponseOutputRefusal = (block) => isRecord$1(block) && "type" in block && block.type === "refusal";
|
|
3915
3915
|
const convertToolResultContent = (content) => {
|
|
3916
3916
|
if (typeof content === "string") return content;
|
|
3917
3917
|
if (Array.isArray(content)) {
|
|
@@ -5169,7 +5169,7 @@ function getModels() {
|
|
|
5169
5169
|
}
|
|
5170
5170
|
//#endregion
|
|
5171
5171
|
//#region src/routes/provider/messages/handler.ts
|
|
5172
|
-
const logger$
|
|
5172
|
+
const logger$6 = createHandlerLogger("provider-messages-handler");
|
|
5173
5173
|
const OPENAI_COMPATIBLE_CONTEXT_CACHE_MARKER_LIMIT = 4;
|
|
5174
5174
|
const OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL = { type: "ephemeral" };
|
|
5175
5175
|
const OPENAI_COMPATIBLE_CONTEXT_CACHE_ROLES = new Set([
|
|
@@ -5194,7 +5194,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
5194
5194
|
} }, 404);
|
|
5195
5195
|
try {
|
|
5196
5196
|
const modelConfig = providerConfig.models?.[payload.model];
|
|
5197
|
-
debugJson(logger$
|
|
5197
|
+
debugJson(logger$6, "provider.messages.request", {
|
|
5198
5198
|
payload,
|
|
5199
5199
|
provider
|
|
5200
5200
|
});
|
|
@@ -5227,13 +5227,13 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
5227
5227
|
});
|
|
5228
5228
|
}
|
|
5229
5229
|
applyMissingExtraBody(payload, { extraBody: modelConfig?.extraBody });
|
|
5230
|
-
debugJson(logger$
|
|
5230
|
+
debugJson(logger$6, "Translated provider.messages.request", {
|
|
5231
5231
|
payload,
|
|
5232
5232
|
provider
|
|
5233
5233
|
});
|
|
5234
5234
|
const upstreamResponse = await forwardProviderMessages(providerConfig, payload, c.req.raw.headers);
|
|
5235
5235
|
if (!upstreamResponse.ok) {
|
|
5236
|
-
logger$
|
|
5236
|
+
logger$6.error("Failed to create responses", upstreamResponse);
|
|
5237
5237
|
throw new HTTPError("Failed to create responses", upstreamResponse);
|
|
5238
5238
|
}
|
|
5239
5239
|
const contentType = upstreamResponse.headers.get("content-type") ?? "";
|
|
@@ -5253,7 +5253,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
5253
5253
|
provider
|
|
5254
5254
|
});
|
|
5255
5255
|
} catch (error) {
|
|
5256
|
-
logger$
|
|
5256
|
+
logger$6.error("provider.messages.error", {
|
|
5257
5257
|
provider,
|
|
5258
5258
|
error
|
|
5259
5259
|
});
|
|
@@ -5267,7 +5267,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
5267
5267
|
responsesPayload.stream = true;
|
|
5268
5268
|
applyResponsesApiContextManagement(responsesPayload, selectedModel?.capabilities.limits.max_prompt_tokens);
|
|
5269
5269
|
compactInputByLatestCompaction(responsesPayload);
|
|
5270
|
-
debugJson(logger$
|
|
5270
|
+
debugJson(logger$6, "provider.messages.responses.web_search.request", {
|
|
5271
5271
|
payload: responsesPayload,
|
|
5272
5272
|
provider
|
|
5273
5273
|
});
|
|
@@ -5278,7 +5278,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
5278
5278
|
errorMessagePrefix: `${provider} web search responses stream`,
|
|
5279
5279
|
parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
|
|
5280
5280
|
upstreamResponse,
|
|
5281
|
-
logger: logger$
|
|
5281
|
+
logger: logger$6
|
|
5282
5282
|
}),
|
|
5283
5283
|
modelConfig,
|
|
5284
5284
|
payload,
|
|
@@ -5295,7 +5295,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
5295
5295
|
}
|
|
5296
5296
|
const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers);
|
|
5297
5297
|
if (!upstreamResponse.ok) {
|
|
5298
|
-
logger$
|
|
5298
|
+
logger$6.error("Failed to create provider web search responses", {
|
|
5299
5299
|
provider,
|
|
5300
5300
|
upstreamResponse
|
|
5301
5301
|
});
|
|
@@ -5306,7 +5306,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
5306
5306
|
errorMessagePrefix: `${provider} web search responses stream`,
|
|
5307
5307
|
parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
|
|
5308
5308
|
upstreamResponse: events(upstreamResponse),
|
|
5309
|
-
logger: logger$
|
|
5309
|
+
logger: logger$6
|
|
5310
5310
|
}),
|
|
5311
5311
|
modelConfig,
|
|
5312
5312
|
payload,
|
|
@@ -5327,7 +5327,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
5327
5327
|
const responsesPayload = translateAnthropicMessagesToResponsesPayload(payload);
|
|
5328
5328
|
applyResponsesApiContextManagement(responsesPayload, selectedModel?.capabilities.limits.max_prompt_tokens);
|
|
5329
5329
|
compactInputByLatestCompaction(responsesPayload);
|
|
5330
|
-
debugJson(logger$
|
|
5330
|
+
debugJson(logger$6, "provider.messages.responses.request", {
|
|
5331
5331
|
payload: responsesPayload,
|
|
5332
5332
|
provider
|
|
5333
5333
|
});
|
|
@@ -5353,7 +5353,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
5353
5353
|
}
|
|
5354
5354
|
const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers);
|
|
5355
5355
|
if (!upstreamResponse.ok) {
|
|
5356
|
-
logger$
|
|
5356
|
+
logger$6.error("Failed to create provider responses", upstreamResponse);
|
|
5357
5357
|
throw new HTTPError("Failed to create provider responses", upstreamResponse);
|
|
5358
5358
|
}
|
|
5359
5359
|
if (responsesPayload.stream) return streamResponsesProviderMessages({
|
|
@@ -5404,13 +5404,13 @@ const applyOpenAICompatibleExtraBodyThinkingBudget = (payload, options) => {
|
|
|
5404
5404
|
const handleOpenAICompatibleProviderMessages = async (c, options) => {
|
|
5405
5405
|
const { modelConfig, payload, provider, providerConfig } = options;
|
|
5406
5406
|
const openAIPayload = createOpenAICompatiblePayload(payload, modelConfig);
|
|
5407
|
-
debugJson(logger$
|
|
5407
|
+
debugJson(logger$6, "provider.messages.openai_compatible.request", {
|
|
5408
5408
|
payload: openAIPayload,
|
|
5409
5409
|
provider
|
|
5410
5410
|
});
|
|
5411
5411
|
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, openAIPayload, c.req.raw.headers);
|
|
5412
5412
|
if (!upstreamResponse.ok) {
|
|
5413
|
-
logger$
|
|
5413
|
+
logger$6.error("Failed to create openai-compatible responses", upstreamResponse);
|
|
5414
5414
|
throw new HTTPError("Failed to create openai-compatible responses", upstreamResponse);
|
|
5415
5415
|
}
|
|
5416
5416
|
const contentType = upstreamResponse.headers.get("content-type") ?? "";
|
|
@@ -5496,12 +5496,12 @@ const setContextCacheControl = (part) => {
|
|
|
5496
5496
|
part.cache_control = { ...OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL };
|
|
5497
5497
|
};
|
|
5498
5498
|
const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, upstreamResponse }) => {
|
|
5499
|
-
logger$
|
|
5499
|
+
logger$6.debug("provider.messages.streaming");
|
|
5500
5500
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency);
|
|
5501
5501
|
return streamSSE(c, async (stream) => {
|
|
5502
5502
|
let usage = {};
|
|
5503
5503
|
for await (const chunk of events(upstreamResponse)) {
|
|
5504
|
-
logger$
|
|
5504
|
+
logger$6.debug("provider.messages.raw_stream_event:", chunk.data);
|
|
5505
5505
|
const eventName = chunk.event;
|
|
5506
5506
|
if (eventName === "ping") {
|
|
5507
5507
|
await stream.writeSSE({
|
|
@@ -5527,7 +5527,7 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
|
|
|
5527
5527
|
});
|
|
5528
5528
|
};
|
|
5529
5529
|
const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, upstreamResponse }) => {
|
|
5530
|
-
logger$
|
|
5530
|
+
logger$6.debug("provider.messages.openai_compatible.streaming");
|
|
5531
5531
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency);
|
|
5532
5532
|
return streamSSE(c, async (stream) => {
|
|
5533
5533
|
let usage = {};
|
|
@@ -5539,7 +5539,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
5539
5539
|
thinkingBlockOpen: false
|
|
5540
5540
|
};
|
|
5541
5541
|
for await (const chunk of events(upstreamResponse)) {
|
|
5542
|
-
logger$
|
|
5542
|
+
logger$6.debug("provider.messages.openai_compatible.raw_stream_event:", chunk.data);
|
|
5543
5543
|
if (chunk.event === "ping") {
|
|
5544
5544
|
await stream.writeSSE({
|
|
5545
5545
|
event: "ping",
|
|
@@ -5557,7 +5557,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
5557
5557
|
const events = translateChunkToAnthropicEvents(parsed, streamState);
|
|
5558
5558
|
for (const event of events) {
|
|
5559
5559
|
const eventData = JSON.stringify(event);
|
|
5560
|
-
debugLazy(logger$
|
|
5560
|
+
debugLazy(logger$6, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
|
|
5561
5561
|
await stream.writeSSE({
|
|
5562
5562
|
event: event.type,
|
|
5563
5563
|
data: eventData
|
|
@@ -5566,7 +5566,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
5566
5566
|
}
|
|
5567
5567
|
for (const event of flushPendingAnthropicStreamEvents(streamState)) {
|
|
5568
5568
|
const eventData = JSON.stringify(event);
|
|
5569
|
-
debugLazy(logger$
|
|
5569
|
+
debugLazy(logger$6, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
|
|
5570
5570
|
await stream.writeSSE({
|
|
5571
5571
|
event: event.type,
|
|
5572
5572
|
data: eventData
|
|
@@ -5576,13 +5576,13 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
5576
5576
|
});
|
|
5577
5577
|
};
|
|
5578
5578
|
const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, providerConfig, upstreamResponse }) => {
|
|
5579
|
-
logger$
|
|
5579
|
+
logger$6.debug("provider.messages.responses.streaming", { provider });
|
|
5580
5580
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency);
|
|
5581
5581
|
return streamSSE(c, async (stream) => {
|
|
5582
5582
|
let usage = {};
|
|
5583
5583
|
const streamState = createResponsesStreamState({ toolSearchName: resolveBridgeToolSearchName(payload.tools) });
|
|
5584
5584
|
for await (const chunk of upstreamResponse) {
|
|
5585
|
-
logger$
|
|
5585
|
+
logger$6.debug("provider.messages.responses.raw_stream_event:", chunk.data);
|
|
5586
5586
|
if (chunk.event === "ping") {
|
|
5587
5587
|
await stream.writeSSE({
|
|
5588
5588
|
event: "ping",
|
|
@@ -5600,7 +5600,7 @@ const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurre
|
|
|
5600
5600
|
const events = translateResponsesStreamEvent(parsed, streamState);
|
|
5601
5601
|
for (const event of events) {
|
|
5602
5602
|
const eventData = JSON.stringify(event);
|
|
5603
|
-
debugLazy(logger$
|
|
5603
|
+
debugLazy(logger$6, () => ["provider.messages.responses.translated_event:", eventData]);
|
|
5604
5604
|
await stream.writeSSE({
|
|
5605
5605
|
event: event.type,
|
|
5606
5606
|
data: eventData
|
|
@@ -5624,7 +5624,7 @@ const parseOpenAICompatibleStreamChunk = (data) => {
|
|
|
5624
5624
|
try {
|
|
5625
5625
|
return JSON.parse(data);
|
|
5626
5626
|
} catch (error) {
|
|
5627
|
-
logger$
|
|
5627
|
+
logger$6.error("provider.messages.openai_compatible.parse_chunk_error", {
|
|
5628
5628
|
data,
|
|
5629
5629
|
error
|
|
5630
5630
|
});
|
|
@@ -5637,7 +5637,7 @@ const parseResponsesProviderStreamChunk = (data, providerConfig) => {
|
|
|
5637
5637
|
if (providerConfig.name === "codex") logCodexRateLimitsEvent(parsed);
|
|
5638
5638
|
return parsed;
|
|
5639
5639
|
} catch (error) {
|
|
5640
|
-
logger$
|
|
5640
|
+
logger$6.error("provider.messages.responses.parse_chunk_error", {
|
|
5641
5641
|
provider: providerConfig.name,
|
|
5642
5642
|
data,
|
|
5643
5643
|
error
|
|
@@ -5662,7 +5662,7 @@ const parseProviderStreamEvent = (data) => {
|
|
|
5662
5662
|
usage: {}
|
|
5663
5663
|
};
|
|
5664
5664
|
} catch (error) {
|
|
5665
|
-
logger$
|
|
5665
|
+
logger$6.error("provider.messages.streaming.adjust_tokens_error", {
|
|
5666
5666
|
error,
|
|
5667
5667
|
originalData: data
|
|
5668
5668
|
});
|
|
@@ -5672,29 +5672,29 @@ const parseProviderStreamEvent = (data) => {
|
|
|
5672
5672
|
const respondProviderMessagesJson = (c, options) => {
|
|
5673
5673
|
const { body, modelConfig, payload, pricingCurrency, provider } = options;
|
|
5674
5674
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency)(normalizeAnthropicUsage(body.usage));
|
|
5675
|
-
debugJson(logger$
|
|
5675
|
+
debugJson(logger$6, "provider.messages.no_stream result:", body);
|
|
5676
5676
|
return c.json(body);
|
|
5677
5677
|
};
|
|
5678
5678
|
const respondOpenAICompatibleProviderMessagesJson = (c, options) => {
|
|
5679
5679
|
const { body, modelConfig, payload, pricingCurrency, provider } = options;
|
|
5680
5680
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency)(normalizeOpenAIUsage(body.usage));
|
|
5681
5681
|
const anthropicResponse = translateToAnthropic(body);
|
|
5682
|
-
debugJson(logger$
|
|
5682
|
+
debugJson(logger$6, "provider.messages.openai_compatible.no_stream result:", anthropicResponse);
|
|
5683
5683
|
return c.json(anthropicResponse);
|
|
5684
5684
|
};
|
|
5685
5685
|
const respondResponsesProviderMessagesJson = (c, options) => {
|
|
5686
5686
|
const { body, modelConfig, payload, pricingCurrency, provider, providerConfig } = options;
|
|
5687
5687
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency)(normalizeResponsesUsage(body.usage));
|
|
5688
5688
|
const anthropicResponse = translateResponsesResultToAnthropic(body, { toolSearchName: resolveBridgeToolSearchName(payload.tools) });
|
|
5689
|
-
debugJson(logger$
|
|
5690
|
-
if (providerConfig.name === "codex") logger$
|
|
5689
|
+
debugJson(logger$6, "provider.messages.responses.no_stream result:", anthropicResponse);
|
|
5690
|
+
if (providerConfig.name === "codex") logger$6.debug("provider.messages.codex.no_stream.result");
|
|
5691
5691
|
return c.json(anthropicResponse);
|
|
5692
5692
|
};
|
|
5693
5693
|
const respondWebSearchProviderMessagesJson = (c, options) => {
|
|
5694
5694
|
const { body, modelConfig, payload, pricingCurrency, provider } = options;
|
|
5695
5695
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency)(normalizeResponsesUsage(body.usage));
|
|
5696
5696
|
const { extract, response } = reconstructWebSearchResponse(payload, body, { requestId: body.id || `${provider}:${payload.model}` });
|
|
5697
|
-
logger$
|
|
5697
|
+
logger$6.debug(`provider.messages.responses.web_search: ${extract.queries.length} quer(y/ies), ${extract.sources.length} source(s)`);
|
|
5698
5698
|
if (!payload.stream) return c.json(response);
|
|
5699
5699
|
return streamSSE(c, async (stream) => {
|
|
5700
5700
|
for (const event of buildSyntheticStreamEvents(response)) await stream.writeSSE({
|
|
@@ -5999,7 +5999,7 @@ const parseAnthropicStreamEvent = (data) => {
|
|
|
5999
5999
|
};
|
|
6000
6000
|
//#endregion
|
|
6001
6001
|
//#region src/routes/messages/handler.ts
|
|
6002
|
-
const logger$
|
|
6002
|
+
const logger$5 = createHandlerLogger("messages-handler");
|
|
6003
6003
|
const messagesFlowHandlers = {
|
|
6004
6004
|
handleWithChatCompletions,
|
|
6005
6005
|
handleWithMessagesApi,
|
|
@@ -6011,7 +6011,7 @@ async function handleCompletion(c) {
|
|
|
6011
6011
|
anthropicPayload.model = resolveMappedModel(anthropicPayload.model);
|
|
6012
6012
|
if (anthropicPayload.model !== requestedModel) consola.debug(`Resolved model mapping: ${requestedModel} -> ${anthropicPayload.model}`);
|
|
6013
6013
|
const webSearchResult = await tryHandleWebSearch(c, anthropicPayload, {
|
|
6014
|
-
logger: logger$
|
|
6014
|
+
logger: logger$5,
|
|
6015
6015
|
forwardToProvider: (ctx, payload, provider) => handleProviderMessagesForProvider(ctx, {
|
|
6016
6016
|
payload,
|
|
6017
6017
|
provider
|
|
@@ -6026,19 +6026,19 @@ async function handleCompletion(c) {
|
|
|
6026
6026
|
provider: providerModelAlias.provider
|
|
6027
6027
|
});
|
|
6028
6028
|
}
|
|
6029
|
-
debugJson(logger$
|
|
6029
|
+
debugJson(logger$5, "Anthropic request payload:", anthropicPayload);
|
|
6030
6030
|
normalizeSystemMessages(anthropicPayload);
|
|
6031
6031
|
await checkRateLimit(state);
|
|
6032
6032
|
sanitizeIdeTools(anthropicPayload);
|
|
6033
6033
|
const subagentMarker = parseSubagentMarkerFromFirstUser(anthropicPayload);
|
|
6034
|
-
if (subagentMarker) debugJson(logger$
|
|
6034
|
+
if (subagentMarker) debugJson(logger$5, "Detected Subagent marker:", subagentMarker);
|
|
6035
6035
|
let sessionId = getRootSessionId(anthropicPayload, c);
|
|
6036
6036
|
const compactType = getCompactType(anthropicPayload);
|
|
6037
6037
|
const anthropicBeta = c.req.header("anthropic-beta");
|
|
6038
|
-
logger$
|
|
6038
|
+
logger$5.debug("Anthropic Beta header:", anthropicBeta);
|
|
6039
6039
|
const noTools = !anthropicPayload.tools || anthropicPayload.tools.length === 0;
|
|
6040
6040
|
if (anthropicBeta && noTools && compactType === 0) anthropicPayload.model = getSmallModel();
|
|
6041
|
-
if (compactType) logger$
|
|
6041
|
+
if (compactType) logger$5.debug("Compact request type:", compactType);
|
|
6042
6042
|
if (!state.tokenBasedBilling) {
|
|
6043
6043
|
const lastMessageCacheControl = getLastMessageContentCacheControl(anthropicPayload.messages.at(-1));
|
|
6044
6044
|
stripToolReferenceTurnBoundary(anthropicPayload);
|
|
@@ -6046,9 +6046,9 @@ async function handleCompletion(c) {
|
|
|
6046
6046
|
applyLastMessageCacheControl(anthropicPayload, lastMessageCacheControl);
|
|
6047
6047
|
}
|
|
6048
6048
|
const requestId = generateRequestIdFromPayload(anthropicPayload, sessionId);
|
|
6049
|
-
logger$
|
|
6049
|
+
logger$5.debug("Generated request ID:", requestId);
|
|
6050
6050
|
if (!sessionId) sessionId = getUUID(requestId);
|
|
6051
|
-
logger$
|
|
6051
|
+
logger$5.debug("Extracted session ID:", sessionId);
|
|
6052
6052
|
if (state.manualApprove) await awaitApproval();
|
|
6053
6053
|
const selectedModel = findEndpointModel(anthropicPayload.model);
|
|
6054
6054
|
anthropicPayload.model = selectedModel?.id ?? anthropicPayload.model;
|
|
@@ -6059,7 +6059,7 @@ async function handleCompletion(c) {
|
|
|
6059
6059
|
requestId,
|
|
6060
6060
|
sessionId,
|
|
6061
6061
|
compactType,
|
|
6062
|
-
logger: logger$
|
|
6062
|
+
logger: logger$5
|
|
6063
6063
|
});
|
|
6064
6064
|
if (shouldUseResponsesApi(selectedModel, compactType)) return await messagesFlowHandlers.handleWithResponsesApi(c, anthropicPayload, {
|
|
6065
6065
|
subagentMarker,
|
|
@@ -6067,7 +6067,7 @@ async function handleCompletion(c) {
|
|
|
6067
6067
|
requestId,
|
|
6068
6068
|
sessionId,
|
|
6069
6069
|
compactType,
|
|
6070
|
-
logger: logger$
|
|
6070
|
+
logger: logger$5
|
|
6071
6071
|
});
|
|
6072
6072
|
return await messagesFlowHandlers.handleWithChatCompletions(c, anthropicPayload, {
|
|
6073
6073
|
subagentMarker,
|
|
@@ -6075,7 +6075,7 @@ async function handleCompletion(c) {
|
|
|
6075
6075
|
requestId,
|
|
6076
6076
|
sessionId,
|
|
6077
6077
|
compactType,
|
|
6078
|
-
logger: logger$
|
|
6078
|
+
logger: logger$5
|
|
6079
6079
|
});
|
|
6080
6080
|
}
|
|
6081
6081
|
const MESSAGES_ENDPOINT = "/v1/messages";
|
|
@@ -6106,23 +6106,89 @@ messageRoutes.post("/count_tokens", async (c) => {
|
|
|
6106
6106
|
//#endregion
|
|
6107
6107
|
//#region src/routes/models/route.ts
|
|
6108
6108
|
const modelRoutes = new Hono();
|
|
6109
|
-
|
|
6109
|
+
const logger$4 = createHandlerLogger("models-handler");
|
|
6110
|
+
const EPOCH_ISO = (/* @__PURE__ */ new Date(0)).toISOString();
|
|
6111
|
+
function isRecord(value) {
|
|
6112
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6113
|
+
}
|
|
6114
|
+
function normalizeCopilotModel(model) {
|
|
6115
|
+
const contextWindow = model.capabilities?.limits?.max_context_window_tokens ?? 0;
|
|
6116
|
+
const clientId = toClientModelId(model.id);
|
|
6117
|
+
return {
|
|
6118
|
+
claude_model_id: contextWindow >= 1e6 ? `${clientId}[1m]` : clientId,
|
|
6119
|
+
...model,
|
|
6120
|
+
id: clientId,
|
|
6121
|
+
object: "model",
|
|
6122
|
+
type: "model",
|
|
6123
|
+
created: 0,
|
|
6124
|
+
created_at: EPOCH_ISO,
|
|
6125
|
+
owned_by: model.vendor,
|
|
6126
|
+
display_name: model.name
|
|
6127
|
+
};
|
|
6128
|
+
}
|
|
6129
|
+
function getStringField(model, field) {
|
|
6130
|
+
const value = model[field];
|
|
6131
|
+
return typeof value === "string" && value.trim() ? value : void 0;
|
|
6132
|
+
}
|
|
6133
|
+
function normalizeProviderModel(provider, model) {
|
|
6134
|
+
if (!isRecord(model)) return null;
|
|
6135
|
+
const rawId = getStringField(model, "id");
|
|
6136
|
+
if (!rawId) return null;
|
|
6137
|
+
const id = `${provider}/${rawId}`;
|
|
6138
|
+
const name = getStringField(model, "display_name") ?? getStringField(model, "name") ?? rawId;
|
|
6139
|
+
const ownedBy = getStringField(model, "owned_by") ?? getStringField(model, "vendor") ?? provider;
|
|
6140
|
+
return {
|
|
6141
|
+
...model,
|
|
6142
|
+
id,
|
|
6143
|
+
object: getStringField(model, "object") ?? "model",
|
|
6144
|
+
type: getStringField(model, "type") ?? "model",
|
|
6145
|
+
created: typeof model.created === "number" ? model.created : 0,
|
|
6146
|
+
created_at: getStringField(model, "created_at") ?? EPOCH_ISO,
|
|
6147
|
+
owned_by: ownedBy,
|
|
6148
|
+
display_name: name
|
|
6149
|
+
};
|
|
6150
|
+
}
|
|
6151
|
+
async function getProviderModels(provider, requestHeaders) {
|
|
6110
6152
|
try {
|
|
6111
|
-
const
|
|
6112
|
-
|
|
6113
|
-
|
|
6114
|
-
|
|
6115
|
-
|
|
6116
|
-
|
|
6117
|
-
|
|
6118
|
-
|
|
6119
|
-
|
|
6120
|
-
|
|
6121
|
-
|
|
6122
|
-
|
|
6123
|
-
|
|
6124
|
-
};
|
|
6153
|
+
const providerConfig = await resolveProviderConfig(provider);
|
|
6154
|
+
if (!providerConfig) return [];
|
|
6155
|
+
if (providerConfig.name === "codex") return getModels().data.map((model) => normalizeProviderModel(providerConfig.name, model)).filter((model) => model !== null);
|
|
6156
|
+
const response = await forwardProviderModels(providerConfig, requestHeaders);
|
|
6157
|
+
if (!response.ok) {
|
|
6158
|
+
logger$4.warn("models.provider.skip_non_ok", {
|
|
6159
|
+
provider,
|
|
6160
|
+
statusCode: response.status
|
|
6161
|
+
});
|
|
6162
|
+
return [];
|
|
6163
|
+
}
|
|
6164
|
+
const body = await response.json();
|
|
6165
|
+
if (!isRecord(body) || !Array.isArray(body.data)) {
|
|
6166
|
+
logger$4.warn("models.provider.skip_invalid_body", { provider });
|
|
6167
|
+
return [];
|
|
6168
|
+
}
|
|
6169
|
+
return body.data.map((model) => normalizeProviderModel(providerConfig.name, model)).filter((model) => model !== null);
|
|
6170
|
+
} catch (error) {
|
|
6171
|
+
logger$4.warn("models.provider.skip_error", {
|
|
6172
|
+
provider,
|
|
6173
|
+
error
|
|
6125
6174
|
});
|
|
6175
|
+
return [];
|
|
6176
|
+
}
|
|
6177
|
+
}
|
|
6178
|
+
async function getAggregatedModels(requestHeaders) {
|
|
6179
|
+
const copilotModels = state.models?.data.map(normalizeCopilotModel) ?? [];
|
|
6180
|
+
const providerModelsByProvider = await Promise.all(listEnabledProviders().map((provider) => getProviderModels(provider, requestHeaders)));
|
|
6181
|
+
const models = [...copilotModels, ...providerModelsByProvider.flat()];
|
|
6182
|
+
const seenModelIds = /* @__PURE__ */ new Set();
|
|
6183
|
+
return models.filter((model) => {
|
|
6184
|
+
if (seenModelIds.has(model.id)) return false;
|
|
6185
|
+
seenModelIds.add(model.id);
|
|
6186
|
+
return true;
|
|
6187
|
+
});
|
|
6188
|
+
}
|
|
6189
|
+
modelRoutes.get("/", async (c) => {
|
|
6190
|
+
try {
|
|
6191
|
+
const models = await getAggregatedModels(c.req.raw.headers);
|
|
6126
6192
|
return c.json({
|
|
6127
6193
|
object: "list",
|
|
6128
6194
|
data: models,
|
|
@@ -6612,4 +6678,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
|
|
|
6612
6678
|
//#endregion
|
|
6613
6679
|
export { server };
|
|
6614
6680
|
|
|
6615
|
-
//# sourceMappingURL=server-
|
|
6681
|
+
//# sourceMappingURL=server-s_0_JChu.js.map
|