@jeffreycao/copilot-api 1.10.10 → 1.10.12
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 +44 -207
- package/README.zh-CN.md +38 -203
- package/dist/{auth-CeZtnQE_.js → auth-9cNGmKTS.js} +2 -2
- package/dist/{auth-CeZtnQE_.js.map → auth-9cNGmKTS.js.map} +1 -1
- package/dist/{check-usage-CTShKCvR.js → check-usage-TtF-fhRm.js} +2 -2
- package/dist/{check-usage-CTShKCvR.js.map → check-usage-TtF-fhRm.js.map} +1 -1
- package/dist/main.js +3 -3
- package/dist/{server-D5O9IzAY.js → server-C3iJWAUP.js} +156 -122
- package/dist/server-C3iJWAUP.js.map +1 -0
- package/dist/{start-BhPxHgu8.js → start-DSzP59pP.js} +3 -3
- package/dist/{start-BhPxHgu8.js.map → start-DSzP59pP.js.map} +1 -1
- package/dist/{token-1SfgxCRm.js → token-CQHif3s_.js} +34 -13
- package/dist/token-CQHif3s_.js.map +1 -0
- package/package.json +1 -1
- package/dist/server-D5O9IzAY.js.map +0 -1
- package/dist/token-1SfgxCRm.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as compactSystemPromptStarts, B as createWebSocketUrl, C as prepareForCompact, D as compactAutoContinuePromptStarts, F as normalizeCodexResponsesEvent, H as state, I as generateTraceId, L as requestContext, N as createStandardizedCodexResponsesEventStream, O as compactMessageSections, P as forwardCodexResponses, R as resolveTraceId$1, S as copilotWebSocketHeaders, T as prepareMessageProxyHeaders, U as logCodexRateLimitsEvent, _ as getCopilotUsage, b as copilotBaseUrl, d as generateRequestIdFromPayload, f as getRootSessionId, g as sleep, h as parseUserIdMetadata, m as isNullish, p as getUUID, r as setupCodexToken, s as cacheModels, v as HTTPError, w as prepareInteractionHeaders, x as copilotHeaders, y as forwardError, z as createPooledWebSocketStream } from "./token-
|
|
1
|
+
import { A as compactSystemPromptStarts, B as createWebSocketUrl, C as prepareForCompact, D as compactAutoContinuePromptStarts, F as normalizeCodexResponsesEvent, H as state, I as generateTraceId, L as requestContext, N as createStandardizedCodexResponsesEventStream, O as compactMessageSections, P as forwardCodexResponses, R as resolveTraceId$1, S as copilotWebSocketHeaders, T as prepareMessageProxyHeaders, U as logCodexRateLimitsEvent, _ as getCopilotUsage, b as copilotBaseUrl, d as generateRequestIdFromPayload, f as getRootSessionId, g as sleep, h as parseUserIdMetadata, m as isNullish, p as getUUID, r as setupCodexToken, s as cacheModels, v as HTTPError, w as prepareInteractionHeaders, x as copilotHeaders, y as forwardError, z as createPooledWebSocketStream } from "./token-CQHif3s_.js";
|
|
2
2
|
import { _ as setModelMappings, a as getModelMappings, c as getReasoningEffortForModel, d as isResponsesApiContextManagementModel, f as isResponsesApiWebSearchEnabled, g as resolveMappedModel, i as getExtraPromptForModel, l as getSmallModel, n as getClaudeTokenMultiplier, o as getProviderConfig, p as isResponsesApiWebSocketEnabled, r as getConfig, s as getRawProviderConfig, t as getAnthropicApiKey, u as isMessagesApiEnabled, y as PATHS } from "./config-ztdkLu9o.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-wA-fLduL.js";
|
|
4
4
|
import consola from "consola";
|
|
@@ -985,7 +985,7 @@ const logCopilotQuotaSnapshots = (snapshots) => {
|
|
|
985
985
|
const logCopilotRateLimitUsage = (usage) => {
|
|
986
986
|
const d = new Date(usage.resetAt);
|
|
987
987
|
const dateStr = Number.isNaN(d.getTime()) ? usage.resetAt : d.toLocaleString();
|
|
988
|
-
consola.
|
|
988
|
+
consola.log(`Copilot ${usage.type} quota remaining: ${usage.remaining}, resets at: ${dateStr}`);
|
|
989
989
|
};
|
|
990
990
|
const isCopilotQuotaSnapshot = (value) => {
|
|
991
991
|
if (!value || typeof value !== "object") return false;
|
|
@@ -1024,11 +1024,11 @@ const createChatCompletions = async (payload, options) => {
|
|
|
1024
1024
|
};
|
|
1025
1025
|
//#endregion
|
|
1026
1026
|
//#region src/routes/chat-completions/handler.ts
|
|
1027
|
-
const logger$
|
|
1027
|
+
const logger$7 = createHandlerLogger("chat-completions-handler");
|
|
1028
1028
|
async function handleCompletion$1(c) {
|
|
1029
1029
|
await checkRateLimit(state);
|
|
1030
1030
|
let payload = await c.req.json();
|
|
1031
|
-
debugJsonTail(logger$
|
|
1031
|
+
debugJsonTail(logger$7, "Request payload:", {
|
|
1032
1032
|
value: payload,
|
|
1033
1033
|
tailLength: 400
|
|
1034
1034
|
});
|
|
@@ -1043,12 +1043,12 @@ async function handleCompletion$1(c) {
|
|
|
1043
1043
|
...payload,
|
|
1044
1044
|
max_tokens: selectedModel?.capabilities.limits.max_output_tokens
|
|
1045
1045
|
};
|
|
1046
|
-
debugJson(logger$
|
|
1046
|
+
debugJson(logger$7, "Set max_tokens to:", payload.max_tokens);
|
|
1047
1047
|
}
|
|
1048
1048
|
const requestId = generateRequestIdFromPayload(payload);
|
|
1049
|
-
logger$
|
|
1049
|
+
logger$7.debug("Generated request ID:", requestId);
|
|
1050
1050
|
const sessionId = getUUID(requestId);
|
|
1051
|
-
logger$
|
|
1051
|
+
logger$7.debug("Extracted session ID:", sessionId);
|
|
1052
1052
|
const recordUsage = createCopilotTokenUsageRecorder({
|
|
1053
1053
|
endpoint: "chat_completions",
|
|
1054
1054
|
fallbackSessionId: sessionId,
|
|
@@ -1059,15 +1059,15 @@ async function handleCompletion$1(c) {
|
|
|
1059
1059
|
sessionId
|
|
1060
1060
|
});
|
|
1061
1061
|
if (isNonStreaming$1(response)) {
|
|
1062
|
-
debugJson(logger$
|
|
1062
|
+
debugJson(logger$7, "Non-streaming response:", response);
|
|
1063
1063
|
recordUsage(normalizeOpenAIUsage(response.usage));
|
|
1064
1064
|
return c.json(response);
|
|
1065
1065
|
}
|
|
1066
|
-
logger$
|
|
1066
|
+
logger$7.debug("Streaming response");
|
|
1067
1067
|
return streamSSE(c, async (stream) => {
|
|
1068
1068
|
let usage = {};
|
|
1069
1069
|
for await (const chunk of response) {
|
|
1070
|
-
debugJson(logger$
|
|
1070
|
+
debugJson(logger$7, "Streaming chunk:", chunk);
|
|
1071
1071
|
const parsedChunk = parseChatCompletionChunk(chunk);
|
|
1072
1072
|
if (parsedChunk?.usage) usage = normalizeOpenAIUsage(parsedChunk.usage);
|
|
1073
1073
|
await stream.writeSSE(chunk);
|
|
@@ -1750,7 +1750,7 @@ function getAnthropicToolUseBlocks(toolCalls) {
|
|
|
1750
1750
|
}
|
|
1751
1751
|
//#endregion
|
|
1752
1752
|
//#region src/routes/provider/messages/count-tokens-handler.ts
|
|
1753
|
-
const logger$
|
|
1753
|
+
const logger$6 = createHandlerLogger("provider-count-tokens-handler");
|
|
1754
1754
|
async function handleProviderCountTokens(c) {
|
|
1755
1755
|
const provider = c.req.param("provider");
|
|
1756
1756
|
return await handleProviderCountTokensForProvider(c, {
|
|
@@ -1772,7 +1772,7 @@ async function handleProviderCountTokensForProvider(c, options) {
|
|
|
1772
1772
|
toolContentSupportType: modelConfig?.toolContentSupportType ?? []
|
|
1773
1773
|
} : void 0), createFallbackModel(modelId));
|
|
1774
1774
|
const finalTokenCount = tokenCount.input + tokenCount.output;
|
|
1775
|
-
logger$
|
|
1775
|
+
logger$6.debug("provider.count_tokens.success", {
|
|
1776
1776
|
provider,
|
|
1777
1777
|
model: anthropicPayload.model,
|
|
1778
1778
|
input_tokens: finalTokenCount
|
|
@@ -3616,7 +3616,7 @@ async function forwardProviderModels(providerConfig, requestHeaders) {
|
|
|
3616
3616
|
}
|
|
3617
3617
|
//#endregion
|
|
3618
3618
|
//#region src/routes/provider/messages/handler.ts
|
|
3619
|
-
const logger$
|
|
3619
|
+
const logger$5 = createHandlerLogger("provider-messages-handler");
|
|
3620
3620
|
const OPENAI_COMPATIBLE_CONTEXT_CACHE_MARKER_LIMIT = 4;
|
|
3621
3621
|
const OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL = { type: "ephemeral" };
|
|
3622
3622
|
const OPENAI_COMPATIBLE_CONTEXT_CACHE_ROLES = new Set([
|
|
@@ -3642,7 +3642,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
3642
3642
|
try {
|
|
3643
3643
|
const modelConfig = providerConfig.models?.[payload.model];
|
|
3644
3644
|
applyModelDefaults(payload, modelConfig);
|
|
3645
|
-
debugJson(logger$
|
|
3645
|
+
debugJson(logger$5, "provider.messages.request", {
|
|
3646
3646
|
payload,
|
|
3647
3647
|
provider
|
|
3648
3648
|
});
|
|
@@ -3661,7 +3661,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
3661
3661
|
applyMissingExtraBody(payload, { extraBody: modelConfig?.extraBody });
|
|
3662
3662
|
const upstreamResponse = await forwardProviderMessages(providerConfig, payload, c.req.raw.headers);
|
|
3663
3663
|
if (!upstreamResponse.ok) {
|
|
3664
|
-
logger$
|
|
3664
|
+
logger$5.error("Failed to create responses", upstreamResponse);
|
|
3665
3665
|
throw new HTTPError("Failed to create responses", upstreamResponse);
|
|
3666
3666
|
}
|
|
3667
3667
|
const contentType = upstreamResponse.headers.get("content-type") ?? "";
|
|
@@ -3679,7 +3679,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
3679
3679
|
providerConfig
|
|
3680
3680
|
});
|
|
3681
3681
|
} catch (error) {
|
|
3682
|
-
logger$
|
|
3682
|
+
logger$5.error("provider.messages.error", {
|
|
3683
3683
|
provider,
|
|
3684
3684
|
error
|
|
3685
3685
|
});
|
|
@@ -3692,13 +3692,13 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
3692
3692
|
const responsesPayload = translateAnthropicMessagesToResponsesPayload(payload);
|
|
3693
3693
|
applyResponsesApiContextManagement(responsesPayload, selectedModel?.capabilities.limits.max_prompt_tokens);
|
|
3694
3694
|
compactInputByLatestCompaction(responsesPayload);
|
|
3695
|
-
debugJson(logger$
|
|
3695
|
+
debugJson(logger$5, "provider.messages.responses.request", {
|
|
3696
3696
|
payload: responsesPayload,
|
|
3697
3697
|
provider
|
|
3698
3698
|
});
|
|
3699
3699
|
const upstreamResponse = providerConfig.name === "codex" ? await forwardCodexResponses(responsesPayload, c.req.raw.headers, providerConfig.baseUrl) : await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers);
|
|
3700
3700
|
if (!upstreamResponse.ok) {
|
|
3701
|
-
logger$
|
|
3701
|
+
logger$5.error("Failed to create provider responses", upstreamResponse);
|
|
3702
3702
|
throw new HTTPError("Failed to create provider responses", upstreamResponse);
|
|
3703
3703
|
}
|
|
3704
3704
|
if (responsesPayload.stream) return streamResponsesProviderMessages({
|
|
@@ -3745,13 +3745,13 @@ const applyOpenAICompatibleExtraBodyThinkingBudget = (payload, options) => {
|
|
|
3745
3745
|
const handleOpenAICompatibleProviderMessages = async (c, options) => {
|
|
3746
3746
|
const { modelConfig, payload, provider, providerConfig } = options;
|
|
3747
3747
|
const openAIPayload = createOpenAICompatiblePayload(payload, modelConfig);
|
|
3748
|
-
debugJson(logger$
|
|
3748
|
+
debugJson(logger$5, "provider.messages.openai_compatible.request", {
|
|
3749
3749
|
payload: openAIPayload,
|
|
3750
3750
|
provider
|
|
3751
3751
|
});
|
|
3752
3752
|
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, openAIPayload, c.req.raw.headers);
|
|
3753
3753
|
if (!upstreamResponse.ok) {
|
|
3754
|
-
logger$
|
|
3754
|
+
logger$5.error("Failed to create openai-compatible responses", upstreamResponse);
|
|
3755
3755
|
throw new HTTPError("Failed to create openai-compatible responses", upstreamResponse);
|
|
3756
3756
|
}
|
|
3757
3757
|
const contentType = upstreamResponse.headers.get("content-type") ?? "";
|
|
@@ -3833,12 +3833,12 @@ const setContextCacheControl = (part) => {
|
|
|
3833
3833
|
part.cache_control = { ...OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL };
|
|
3834
3834
|
};
|
|
3835
3835
|
const streamProviderMessages = ({ c, payload, provider, providerConfig, upstreamResponse }) => {
|
|
3836
|
-
logger$
|
|
3836
|
+
logger$5.debug("provider.messages.streaming");
|
|
3837
3837
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider);
|
|
3838
3838
|
return streamSSE(c, async (stream) => {
|
|
3839
3839
|
let usage = {};
|
|
3840
3840
|
for await (const chunk of events(upstreamResponse)) {
|
|
3841
|
-
logger$
|
|
3841
|
+
logger$5.debug("provider.messages.raw_stream_event:", chunk.data);
|
|
3842
3842
|
const eventName = chunk.event;
|
|
3843
3843
|
if (eventName === "ping") {
|
|
3844
3844
|
await stream.writeSSE({
|
|
@@ -3864,7 +3864,7 @@ const streamProviderMessages = ({ c, payload, provider, providerConfig, upstream
|
|
|
3864
3864
|
});
|
|
3865
3865
|
};
|
|
3866
3866
|
const streamOpenAICompatibleProviderMessages = ({ c, payload, provider, upstreamResponse }) => {
|
|
3867
|
-
logger$
|
|
3867
|
+
logger$5.debug("provider.messages.openai_compatible.streaming");
|
|
3868
3868
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider);
|
|
3869
3869
|
return streamSSE(c, async (stream) => {
|
|
3870
3870
|
let usage = {};
|
|
@@ -3876,7 +3876,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, payload, provider, upstream
|
|
|
3876
3876
|
thinkingBlockOpen: false
|
|
3877
3877
|
};
|
|
3878
3878
|
for await (const chunk of events(upstreamResponse)) {
|
|
3879
|
-
logger$
|
|
3879
|
+
logger$5.debug("provider.messages.openai_compatible.raw_stream_event:", chunk.data);
|
|
3880
3880
|
if (chunk.event === "ping") {
|
|
3881
3881
|
await stream.writeSSE({
|
|
3882
3882
|
event: "ping",
|
|
@@ -3894,7 +3894,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, payload, provider, upstream
|
|
|
3894
3894
|
const events = translateChunkToAnthropicEvents(parsed, streamState);
|
|
3895
3895
|
for (const event of events) {
|
|
3896
3896
|
const eventData = JSON.stringify(event);
|
|
3897
|
-
debugLazy(logger$
|
|
3897
|
+
debugLazy(logger$5, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
|
|
3898
3898
|
await stream.writeSSE({
|
|
3899
3899
|
event: event.type,
|
|
3900
3900
|
data: eventData
|
|
@@ -3903,7 +3903,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, payload, provider, upstream
|
|
|
3903
3903
|
}
|
|
3904
3904
|
for (const event of flushPendingAnthropicStreamEvents(streamState)) {
|
|
3905
3905
|
const eventData = JSON.stringify(event);
|
|
3906
|
-
debugLazy(logger$
|
|
3906
|
+
debugLazy(logger$5, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
|
|
3907
3907
|
await stream.writeSSE({
|
|
3908
3908
|
event: event.type,
|
|
3909
3909
|
data: eventData
|
|
@@ -3913,13 +3913,13 @@ const streamOpenAICompatibleProviderMessages = ({ c, payload, provider, upstream
|
|
|
3913
3913
|
});
|
|
3914
3914
|
};
|
|
3915
3915
|
const streamResponsesProviderMessages = ({ c, payload, provider, providerConfig, upstreamResponse }) => {
|
|
3916
|
-
logger$
|
|
3916
|
+
logger$5.debug("provider.messages.responses.streaming", { provider });
|
|
3917
3917
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider);
|
|
3918
3918
|
return streamSSE(c, async (stream) => {
|
|
3919
3919
|
let usage = {};
|
|
3920
3920
|
const streamState = createResponsesStreamState({ toolSearchName: resolveBridgeToolSearchName(payload.tools) });
|
|
3921
3921
|
for await (const chunk of events(upstreamResponse)) {
|
|
3922
|
-
logger$
|
|
3922
|
+
logger$5.debug("provider.messages.responses.raw_stream_event:", chunk.data);
|
|
3923
3923
|
if (chunk.event === "ping") {
|
|
3924
3924
|
await stream.writeSSE({
|
|
3925
3925
|
event: "ping",
|
|
@@ -3937,7 +3937,7 @@ const streamResponsesProviderMessages = ({ c, payload, provider, providerConfig,
|
|
|
3937
3937
|
const events = translateResponsesStreamEvent(parsed, streamState);
|
|
3938
3938
|
for (const event of events) {
|
|
3939
3939
|
const eventData = JSON.stringify(event);
|
|
3940
|
-
debugLazy(logger$
|
|
3940
|
+
debugLazy(logger$5, () => ["provider.messages.responses.translated_event:", eventData]);
|
|
3941
3941
|
await stream.writeSSE({
|
|
3942
3942
|
event: event.type,
|
|
3943
3943
|
data: eventData
|
|
@@ -3958,7 +3958,7 @@ const parseOpenAICompatibleStreamChunk = (data) => {
|
|
|
3958
3958
|
try {
|
|
3959
3959
|
return JSON.parse(data);
|
|
3960
3960
|
} catch (error) {
|
|
3961
|
-
logger$
|
|
3961
|
+
logger$5.error("provider.messages.openai_compatible.parse_chunk_error", {
|
|
3962
3962
|
data,
|
|
3963
3963
|
error
|
|
3964
3964
|
});
|
|
@@ -3971,7 +3971,7 @@ const parseResponsesProviderStreamChunk = (data, providerConfig) => {
|
|
|
3971
3971
|
if (providerConfig.name === "codex") logCodexRateLimitsEvent(parsed);
|
|
3972
3972
|
return providerConfig.name === "codex" ? normalizeCodexResponsesEvent(parsed) : parsed;
|
|
3973
3973
|
} catch (error) {
|
|
3974
|
-
logger$
|
|
3974
|
+
logger$5.error("provider.messages.responses.parse_chunk_error", {
|
|
3975
3975
|
provider: providerConfig.name,
|
|
3976
3976
|
data,
|
|
3977
3977
|
error
|
|
@@ -4002,7 +4002,7 @@ const parseProviderStreamEvent = (data, providerConfig) => {
|
|
|
4002
4002
|
usage: {}
|
|
4003
4003
|
};
|
|
4004
4004
|
} catch (error) {
|
|
4005
|
-
logger$
|
|
4005
|
+
logger$5.error("provider.messages.streaming.adjust_tokens_error", {
|
|
4006
4006
|
error,
|
|
4007
4007
|
originalData: data
|
|
4008
4008
|
});
|
|
@@ -4014,22 +4014,22 @@ const respondProviderMessagesJson = (c, options) => {
|
|
|
4014
4014
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider);
|
|
4015
4015
|
adjustInputTokens(providerConfig, body.usage);
|
|
4016
4016
|
recordUsage(normalizeAnthropicUsage(body.usage));
|
|
4017
|
-
debugJson(logger$
|
|
4017
|
+
debugJson(logger$5, "provider.messages.no_stream result:", body);
|
|
4018
4018
|
return c.json(body);
|
|
4019
4019
|
};
|
|
4020
4020
|
const respondOpenAICompatibleProviderMessagesJson = (c, options) => {
|
|
4021
4021
|
const { body, payload, provider } = options;
|
|
4022
4022
|
createProviderMessagesUsageRecorder(payload, provider)(normalizeOpenAIUsage(body.usage));
|
|
4023
4023
|
const anthropicResponse = translateToAnthropic(body);
|
|
4024
|
-
debugJson(logger$
|
|
4024
|
+
debugJson(logger$5, "provider.messages.openai_compatible.no_stream result:", anthropicResponse);
|
|
4025
4025
|
return c.json(anthropicResponse);
|
|
4026
4026
|
};
|
|
4027
4027
|
const respondResponsesProviderMessagesJson = (c, options) => {
|
|
4028
4028
|
const { body, payload, provider, providerConfig } = options;
|
|
4029
4029
|
createProviderMessagesUsageRecorder(payload, provider)(normalizeResponsesUsage(body.usage));
|
|
4030
4030
|
const anthropicResponse = translateResponsesResultToAnthropic(body, { toolSearchName: resolveBridgeToolSearchName(payload.tools) });
|
|
4031
|
-
debugJson(logger$
|
|
4032
|
-
if (providerConfig.name === "codex") logger$
|
|
4031
|
+
debugJson(logger$5, "provider.messages.responses.no_stream result:", anthropicResponse);
|
|
4032
|
+
if (providerConfig.name === "codex") logger$5.debug("provider.messages.codex.no_stream.result");
|
|
4033
4033
|
return c.json(anthropicResponse);
|
|
4034
4034
|
};
|
|
4035
4035
|
const createProviderMessagesUsageRecorder = (payload, provider) => createProviderTokenUsageRecorder({
|
|
@@ -4041,7 +4041,7 @@ const createProviderMessagesUsageRecorder = (payload, provider) => createProvide
|
|
|
4041
4041
|
const adjustInputTokens = (providerConfig, usage) => {
|
|
4042
4042
|
if (!providerConfig.adjustInputTokens || !usage) return;
|
|
4043
4043
|
usage.input_tokens = Math.max(0, (usage.input_tokens ?? 0) - (usage.cache_read_input_tokens ?? 0) - (usage.cache_creation_input_tokens ?? 0));
|
|
4044
|
-
debugJson(logger$
|
|
4044
|
+
debugJson(logger$5, "provider.messages.adjusted_usage:", usage);
|
|
4045
4045
|
};
|
|
4046
4046
|
//#endregion
|
|
4047
4047
|
//#region src/services/copilot/create-messages.ts
|
|
@@ -4628,7 +4628,7 @@ const parseSubagentMarkerFromSystemReminder = (text) => {
|
|
|
4628
4628
|
};
|
|
4629
4629
|
//#endregion
|
|
4630
4630
|
//#region src/routes/messages/handler.ts
|
|
4631
|
-
const logger$
|
|
4631
|
+
const logger$4 = createHandlerLogger("messages-handler");
|
|
4632
4632
|
const messagesFlowHandlers = {
|
|
4633
4633
|
handleWithChatCompletions,
|
|
4634
4634
|
handleWithMessagesApi,
|
|
@@ -4638,7 +4638,7 @@ async function handleCompletion(c) {
|
|
|
4638
4638
|
const anthropicPayload = await c.req.json();
|
|
4639
4639
|
const requestedModel = anthropicPayload.model;
|
|
4640
4640
|
anthropicPayload.model = resolveMappedModel(anthropicPayload.model);
|
|
4641
|
-
if (anthropicPayload.model !== requestedModel) logger$
|
|
4641
|
+
if (anthropicPayload.model !== requestedModel) logger$4.debug(`Resolved model mapping: ${requestedModel} -> ${anthropicPayload.model}`);
|
|
4642
4642
|
const providerModelAlias = parseProviderModelAlias(anthropicPayload.model);
|
|
4643
4643
|
if (providerModelAlias) {
|
|
4644
4644
|
anthropicPayload.model = providerModelAlias.model;
|
|
@@ -4648,24 +4648,24 @@ async function handleCompletion(c) {
|
|
|
4648
4648
|
});
|
|
4649
4649
|
}
|
|
4650
4650
|
await checkRateLimit(state);
|
|
4651
|
-
debugJson(logger$
|
|
4651
|
+
debugJson(logger$4, "Anthropic request payload:", anthropicPayload);
|
|
4652
4652
|
sanitizeIdeTools(anthropicPayload);
|
|
4653
4653
|
const subagentMarker = parseSubagentMarkerFromFirstUser(anthropicPayload);
|
|
4654
|
-
if (subagentMarker) debugJson(logger$
|
|
4654
|
+
if (subagentMarker) debugJson(logger$4, "Detected Subagent marker:", subagentMarker);
|
|
4655
4655
|
const sessionId = getRootSessionId(anthropicPayload, c);
|
|
4656
|
-
logger$
|
|
4656
|
+
logger$4.debug("Extracted session ID:", sessionId);
|
|
4657
4657
|
const compactType = getCompactType(anthropicPayload);
|
|
4658
4658
|
const anthropicBeta = c.req.header("anthropic-beta");
|
|
4659
|
-
logger$
|
|
4659
|
+
logger$4.debug("Anthropic Beta header:", anthropicBeta);
|
|
4660
4660
|
const noTools = !anthropicPayload.tools || anthropicPayload.tools.length === 0;
|
|
4661
4661
|
if (anthropicBeta && noTools && compactType === 0) anthropicPayload.model = getSmallModel();
|
|
4662
|
-
if (compactType) logger$
|
|
4662
|
+
if (compactType) logger$4.debug("Compact request type:", compactType);
|
|
4663
4663
|
const lastMessageCacheControl = getLastMessageContentCacheControl(anthropicPayload.messages.at(-1));
|
|
4664
4664
|
stripToolReferenceTurnBoundary(anthropicPayload);
|
|
4665
4665
|
mergeToolResultForClaude(anthropicPayload, { skipLastMessage: compactType === 1 });
|
|
4666
4666
|
applyLastMessageCacheControl(anthropicPayload, lastMessageCacheControl);
|
|
4667
4667
|
const requestId = generateRequestIdFromPayload(anthropicPayload, sessionId);
|
|
4668
|
-
logger$
|
|
4668
|
+
logger$4.debug("Generated request ID:", requestId);
|
|
4669
4669
|
if (state.manualApprove) await awaitApproval();
|
|
4670
4670
|
const selectedModel = findEndpointModel(anthropicPayload.model);
|
|
4671
4671
|
anthropicPayload.model = selectedModel?.id ?? anthropicPayload.model;
|
|
@@ -4676,7 +4676,7 @@ async function handleCompletion(c) {
|
|
|
4676
4676
|
requestId,
|
|
4677
4677
|
sessionId,
|
|
4678
4678
|
compactType,
|
|
4679
|
-
logger: logger$
|
|
4679
|
+
logger: logger$4
|
|
4680
4680
|
});
|
|
4681
4681
|
if (shouldUseResponsesApi(selectedModel, compactType)) return await messagesFlowHandlers.handleWithResponsesApi(c, anthropicPayload, {
|
|
4682
4682
|
subagentMarker,
|
|
@@ -4684,14 +4684,14 @@ async function handleCompletion(c) {
|
|
|
4684
4684
|
requestId,
|
|
4685
4685
|
sessionId,
|
|
4686
4686
|
compactType,
|
|
4687
|
-
logger: logger$
|
|
4687
|
+
logger: logger$4
|
|
4688
4688
|
});
|
|
4689
4689
|
return await messagesFlowHandlers.handleWithChatCompletions(c, anthropicPayload, {
|
|
4690
4690
|
subagentMarker,
|
|
4691
4691
|
requestId,
|
|
4692
4692
|
sessionId,
|
|
4693
4693
|
compactType,
|
|
4694
|
-
logger: logger$
|
|
4694
|
+
logger: logger$4
|
|
4695
4695
|
});
|
|
4696
4696
|
}
|
|
4697
4697
|
const MESSAGES_ENDPOINT = "/v1/messages";
|
|
@@ -4766,7 +4766,7 @@ providerMessageRoutes.post("/count_tokens", async (c) => {
|
|
|
4766
4766
|
});
|
|
4767
4767
|
//#endregion
|
|
4768
4768
|
//#region src/routes/provider/models/route.ts
|
|
4769
|
-
const logger$
|
|
4769
|
+
const logger$3 = createHandlerLogger("provider-models-handler");
|
|
4770
4770
|
const providerModelRoutes = new Hono();
|
|
4771
4771
|
providerModelRoutes.get("/", async (c) => {
|
|
4772
4772
|
const provider = c.req.param("provider") ?? "";
|
|
@@ -4785,13 +4785,13 @@ providerModelRoutes.get("/", async (c) => {
|
|
|
4785
4785
|
});
|
|
4786
4786
|
}
|
|
4787
4787
|
const upstreamResponse = await forwardProviderModels(providerConfig, c.req.raw.headers);
|
|
4788
|
-
logger$
|
|
4788
|
+
logger$3.debug("provider.models.response", {
|
|
4789
4789
|
provider,
|
|
4790
4790
|
statusCode: upstreamResponse.status
|
|
4791
4791
|
});
|
|
4792
4792
|
return createProviderProxyResponse(upstreamResponse);
|
|
4793
4793
|
} catch (error) {
|
|
4794
|
-
logger$
|
|
4794
|
+
logger$3.error("provider.models.error", {
|
|
4795
4795
|
provider,
|
|
4796
4796
|
error
|
|
4797
4797
|
});
|
|
@@ -4799,6 +4799,109 @@ providerModelRoutes.get("/", async (c) => {
|
|
|
4799
4799
|
}
|
|
4800
4800
|
});
|
|
4801
4801
|
//#endregion
|
|
4802
|
+
//#region src/routes/provider/responses/handler.ts
|
|
4803
|
+
const logger$2 = createHandlerLogger("provider-responses-handler");
|
|
4804
|
+
async function handleProviderResponsesForProvider(c, options) {
|
|
4805
|
+
const { payload, provider } = options;
|
|
4806
|
+
debugJson(logger$2, "Responses request payload:", {
|
|
4807
|
+
payload,
|
|
4808
|
+
provider
|
|
4809
|
+
});
|
|
4810
|
+
const providerConfig = await resolveProviderConfig(provider);
|
|
4811
|
+
if (providerConfig?.type !== "openai-responses") return c.json({ error: {
|
|
4812
|
+
message: `Provider '${provider}' does not support the /v1/responses endpoint`,
|
|
4813
|
+
type: "invalid_request_error"
|
|
4814
|
+
} }, 400);
|
|
4815
|
+
applyResponsesApiContextManagement(payload, (providerConfig.name === "codex" ? getModels().data.find((model) => model.id === payload.model) : void 0)?.capabilities.limits.max_prompt_tokens ?? 0);
|
|
4816
|
+
const contextManagement = payload.context_management;
|
|
4817
|
+
debugJson(logger$2, "Translated Responses request payload:", {
|
|
4818
|
+
contextManagement,
|
|
4819
|
+
provider
|
|
4820
|
+
});
|
|
4821
|
+
const upstreamResponse = providerConfig.name === "codex" ? await forwardCodexResponses(payload, c.req.raw.headers, providerConfig.baseUrl) : await forwardProviderResponses(providerConfig, payload, c.req.raw.headers);
|
|
4822
|
+
if (!upstreamResponse.ok) throw new HTTPError(`Failed to create ${provider} responses`, upstreamResponse);
|
|
4823
|
+
const recordUsage = createProviderResponsesUsageRecorder(payload, provider);
|
|
4824
|
+
if (providerConfig.name === "codex" && payload.stream) {
|
|
4825
|
+
let usage = {};
|
|
4826
|
+
return createProviderProxyResponse(upstreamResponse, createStandardizedCodexResponsesEventStream(getResponsesEvents(upstreamResponse), {
|
|
4827
|
+
onClose: () => {
|
|
4828
|
+
recordUsage(usage);
|
|
4829
|
+
},
|
|
4830
|
+
onChunk: (chunk) => {
|
|
4831
|
+
debugJson(logger$2, "Responses stream chunk:", chunk);
|
|
4832
|
+
},
|
|
4833
|
+
onEvent: (event) => {
|
|
4834
|
+
const nextUsage = getResponsesStreamEventUsage(event);
|
|
4835
|
+
if (nextUsage) usage = nextUsage;
|
|
4836
|
+
}
|
|
4837
|
+
}));
|
|
4838
|
+
}
|
|
4839
|
+
if (payload.stream) recordProviderResponsesStreamUsage(upstreamResponse.clone(), {
|
|
4840
|
+
normalizeCodex: providerConfig.name === "codex",
|
|
4841
|
+
provider,
|
|
4842
|
+
recordUsage
|
|
4843
|
+
}).catch((error) => {
|
|
4844
|
+
logger$2.warn("provider.responses.usage_stream_error", {
|
|
4845
|
+
provider,
|
|
4846
|
+
error: getErrorMessage(error)
|
|
4847
|
+
});
|
|
4848
|
+
});
|
|
4849
|
+
else recordUsage(normalizeResponsesUsage((await upstreamResponse.clone().json()).usage));
|
|
4850
|
+
return createProviderProxyResponse(upstreamResponse);
|
|
4851
|
+
}
|
|
4852
|
+
const getErrorMessage = (error) => {
|
|
4853
|
+
if (error instanceof Error && error.message) return error.message;
|
|
4854
|
+
return String(error);
|
|
4855
|
+
};
|
|
4856
|
+
const createProviderResponsesUsageRecorder = (payload, provider) => {
|
|
4857
|
+
const sessionAffinity = requestContext.getStore()?.sessionAffinity?.trim() || null;
|
|
4858
|
+
return createProviderTokenUsageRecorder({
|
|
4859
|
+
endpoint: "responses",
|
|
4860
|
+
model: payload.model,
|
|
4861
|
+
providerName: provider,
|
|
4862
|
+
sessionId: sessionAffinity ?? ""
|
|
4863
|
+
});
|
|
4864
|
+
};
|
|
4865
|
+
const recordProviderResponsesStreamUsage = async (upstreamResponse, options) => {
|
|
4866
|
+
let usage = {};
|
|
4867
|
+
try {
|
|
4868
|
+
for await (const chunk of getResponsesEvents(upstreamResponse)) {
|
|
4869
|
+
debugJson(logger$2, "Responses stream chunk:", chunk);
|
|
4870
|
+
if (!chunk.data || chunk.data === "[DONE]") continue;
|
|
4871
|
+
const parsed = parseProviderResponsesStreamEvent(chunk.data, {
|
|
4872
|
+
normalizeCodex: options.normalizeCodex,
|
|
4873
|
+
provider: options.provider
|
|
4874
|
+
});
|
|
4875
|
+
if (parsed) {
|
|
4876
|
+
const nextUsage = getResponsesStreamEventUsage(parsed);
|
|
4877
|
+
if (nextUsage) usage = nextUsage;
|
|
4878
|
+
}
|
|
4879
|
+
}
|
|
4880
|
+
} finally {
|
|
4881
|
+
options.recordUsage(usage);
|
|
4882
|
+
}
|
|
4883
|
+
};
|
|
4884
|
+
const parseProviderResponsesStreamEvent = (data, options) => {
|
|
4885
|
+
try {
|
|
4886
|
+
const parsed = JSON.parse(data);
|
|
4887
|
+
return options.normalizeCodex ? normalizeCodexResponsesEvent(parsed) : parsed;
|
|
4888
|
+
} catch (error) {
|
|
4889
|
+
logger$2.error("provider.responses.parse_chunk_error", {
|
|
4890
|
+
provider: options.provider,
|
|
4891
|
+
data,
|
|
4892
|
+
error
|
|
4893
|
+
});
|
|
4894
|
+
return null;
|
|
4895
|
+
}
|
|
4896
|
+
};
|
|
4897
|
+
const getResponsesStreamEventUsage = (event) => {
|
|
4898
|
+
if (event.type === "response.completed" || event.type === "response.failed" || event.type === "response.incomplete") return normalizeResponsesUsage(event.response.usage);
|
|
4899
|
+
return null;
|
|
4900
|
+
};
|
|
4901
|
+
const getResponsesEvents = (response) => {
|
|
4902
|
+
return events(response);
|
|
4903
|
+
};
|
|
4904
|
+
//#endregion
|
|
4802
4905
|
//#region src/routes/responses/stream-id-sync.ts
|
|
4803
4906
|
const createStreamIdTracker = () => ({ outputItems: /* @__PURE__ */ new Map() });
|
|
4804
4907
|
const fixStreamIds = (data, event, tracker) => {
|
|
@@ -4844,7 +4947,6 @@ const responsesHandlerDependencies = {
|
|
|
4844
4947
|
};
|
|
4845
4948
|
const handleResponses = async (c) => {
|
|
4846
4949
|
const payload = await c.req.json();
|
|
4847
|
-
debugJson(logger$1, "Responses request payload:", payload);
|
|
4848
4950
|
const providerModelAlias = parseProviderModelAlias(payload.model);
|
|
4849
4951
|
if (providerModelAlias) {
|
|
4850
4952
|
payload.model = providerModelAlias.model;
|
|
@@ -4853,6 +4955,7 @@ const handleResponses = async (c) => {
|
|
|
4853
4955
|
provider: providerModelAlias.provider
|
|
4854
4956
|
});
|
|
4855
4957
|
}
|
|
4958
|
+
debugJson(logger$1, "Responses request payload:", payload);
|
|
4856
4959
|
await responsesHandlerDependencies.checkRateLimit(state);
|
|
4857
4960
|
const requestId = generateRequestIdFromPayload({ messages: payload.input });
|
|
4858
4961
|
logger$1.debug("Generated request ID:", requestId);
|
|
@@ -4909,30 +5012,6 @@ const handleResponses = async (c) => {
|
|
|
4909
5012
|
recordUsage(normalizeResponsesUsage(response.usage));
|
|
4910
5013
|
return c.json(response);
|
|
4911
5014
|
};
|
|
4912
|
-
const handleProviderResponsesForProvider = async (c, options) => {
|
|
4913
|
-
const { payload, provider } = options;
|
|
4914
|
-
const providerConfig = await resolveProviderConfig(provider);
|
|
4915
|
-
if (providerConfig?.type !== "openai-responses") return c.json({ error: {
|
|
4916
|
-
message: `Provider '${provider}' does not support the /v1/responses endpoint`,
|
|
4917
|
-
type: "invalid_request_error"
|
|
4918
|
-
} }, 400);
|
|
4919
|
-
const upstreamResponse = providerConfig.name === "codex" ? await forwardCodexResponses(payload, c.req.raw.headers, providerConfig.baseUrl) : await forwardProviderResponses(providerConfig, payload, c.req.raw.headers);
|
|
4920
|
-
if (!upstreamResponse.ok) throw new HTTPError(`Failed to create ${provider} responses`, upstreamResponse);
|
|
4921
|
-
const recordUsage = createProviderResponsesUsageRecorder(payload, provider);
|
|
4922
|
-
if (payload.stream) recordProviderResponsesStreamUsage(upstreamResponse.clone(), {
|
|
4923
|
-
normalizeCodex: providerConfig.name === "codex",
|
|
4924
|
-
provider,
|
|
4925
|
-
recordUsage
|
|
4926
|
-
}).catch((error) => {
|
|
4927
|
-
logger$1.warn("provider.responses.usage_stream_error", {
|
|
4928
|
-
provider,
|
|
4929
|
-
error: getErrorMessage(error)
|
|
4930
|
-
});
|
|
4931
|
-
});
|
|
4932
|
-
else recordUsage(normalizeResponsesUsage((await upstreamResponse.clone().json()).usage));
|
|
4933
|
-
if (providerConfig.name === "codex" && payload.stream) return createProviderProxyResponse(upstreamResponse, createStandardizedCodexResponsesEventStream(getResponsesEvents(upstreamResponse)));
|
|
4934
|
-
return createProviderProxyResponse(upstreamResponse);
|
|
4935
|
-
};
|
|
4936
5015
|
const isAsyncIterable = (value) => Boolean(value) && typeof value[Symbol.asyncIterator] === "function";
|
|
4937
5016
|
const isStreamingRequested = (payload) => Boolean(payload.stream);
|
|
4938
5017
|
const parseResponsesStreamEvent = (chunk) => {
|
|
@@ -4944,51 +5023,6 @@ const parseResponsesStreamEvent = (chunk) => {
|
|
|
4944
5023
|
return null;
|
|
4945
5024
|
}
|
|
4946
5025
|
};
|
|
4947
|
-
const getErrorMessage = (error) => {
|
|
4948
|
-
if (error instanceof Error && error.message) return error.message;
|
|
4949
|
-
return String(error);
|
|
4950
|
-
};
|
|
4951
|
-
const createProviderResponsesUsageRecorder = (payload, provider) => {
|
|
4952
|
-
const sessionAffinity = requestContext.getStore()?.sessionAffinity?.trim() || null;
|
|
4953
|
-
return createProviderTokenUsageRecorder({
|
|
4954
|
-
endpoint: "responses",
|
|
4955
|
-
model: payload.model,
|
|
4956
|
-
providerName: provider,
|
|
4957
|
-
sessionId: sessionAffinity ?? ""
|
|
4958
|
-
});
|
|
4959
|
-
};
|
|
4960
|
-
const recordProviderResponsesStreamUsage = async (upstreamResponse, options) => {
|
|
4961
|
-
let usage = {};
|
|
4962
|
-
try {
|
|
4963
|
-
for await (const chunk of getResponsesEvents(upstreamResponse)) {
|
|
4964
|
-
debugJson(logger$1, "Responses stream chunk:", chunk);
|
|
4965
|
-
if (!chunk.data || chunk.data === "[DONE]") continue;
|
|
4966
|
-
const parsed = parseProviderResponsesStreamEvent(chunk.data, {
|
|
4967
|
-
normalizeCodex: options.normalizeCodex,
|
|
4968
|
-
provider: options.provider
|
|
4969
|
-
});
|
|
4970
|
-
if (parsed?.type === "response.completed" || parsed?.type === "response.failed" || parsed?.type === "response.incomplete") usage = normalizeResponsesUsage(parsed.response.usage);
|
|
4971
|
-
}
|
|
4972
|
-
} finally {
|
|
4973
|
-
options.recordUsage(usage);
|
|
4974
|
-
}
|
|
4975
|
-
};
|
|
4976
|
-
const parseProviderResponsesStreamEvent = (data, options) => {
|
|
4977
|
-
try {
|
|
4978
|
-
const parsed = JSON.parse(data);
|
|
4979
|
-
return options.normalizeCodex ? normalizeCodexResponsesEvent(parsed) : parsed;
|
|
4980
|
-
} catch (error) {
|
|
4981
|
-
logger$1.error("provider.responses.parse_chunk_error", {
|
|
4982
|
-
provider: options.provider,
|
|
4983
|
-
data,
|
|
4984
|
-
error
|
|
4985
|
-
});
|
|
4986
|
-
return null;
|
|
4987
|
-
}
|
|
4988
|
-
};
|
|
4989
|
-
const getResponsesEvents = (response) => {
|
|
4990
|
-
return events(response);
|
|
4991
|
-
};
|
|
4992
5026
|
const removeWebSearchTool = (payload) => {
|
|
4993
5027
|
if (!Array.isArray(payload.tools) || payload.tools.length === 0) return;
|
|
4994
5028
|
payload.tools = payload.tools.filter((t) => {
|
|
@@ -5121,4 +5155,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
|
|
|
5121
5155
|
//#endregion
|
|
5122
5156
|
export { server };
|
|
5123
5157
|
|
|
5124
|
-
//# sourceMappingURL=server-
|
|
5158
|
+
//# sourceMappingURL=server-C3iJWAUP.js.map
|