@jeffreycao/copilot-api 2.7.25 → 2.7.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +1 -1
- package/dist/{server-BVFWtgJW.js → server-C1Y_Wrlf.js} +227 -141
- package/dist/server-C1Y_Wrlf.js.map +1 -0
- package/dist/{start-BwZgU78t.js → start-ChSjFGvj.js} +2 -2
- package/dist/{start-BwZgU78t.js.map → start-ChSjFGvj.js.map} +1 -1
- package/package.json +1 -1
- package/dist/server-BVFWtgJW.js.map +0 -1
|
@@ -2193,7 +2193,7 @@ async function forwardProviderImages(providerConfig, request, operation) {
|
|
|
2193
2193
|
}
|
|
2194
2194
|
//#endregion
|
|
2195
2195
|
//#region src/routes/alpha-search/alpha-search-responses.ts
|
|
2196
|
-
const logger$
|
|
2196
|
+
const logger$20 = createHandlerLogger("alpha-search-responses-handler");
|
|
2197
2197
|
const SESSION_TTL_MS = 36e5;
|
|
2198
2198
|
const MAX_SESSIONS = 128;
|
|
2199
2199
|
const MAX_URL_REFERENCES = 256;
|
|
@@ -2551,14 +2551,14 @@ function createRemoteResponsesPayload(request, model, instruction) {
|
|
|
2551
2551
|
};
|
|
2552
2552
|
}
|
|
2553
2553
|
async function requestProviderSearch(c, providerConfig, payload, model, sessionId) {
|
|
2554
|
-
debugJson(logger$
|
|
2554
|
+
debugJson(logger$20, "Alpha search provider Responses request:", {
|
|
2555
2555
|
payload,
|
|
2556
2556
|
provider: providerConfig.name
|
|
2557
2557
|
});
|
|
2558
2558
|
const upstreamResponse = await forwardProviderResponses(providerConfig, payload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
|
|
2559
2559
|
if (!upstreamResponse.ok) throw new HTTPError(`Failed to create ${providerConfig.name} responses for alpha search`, upstreamResponse);
|
|
2560
2560
|
const result = await upstreamResponse.json();
|
|
2561
|
-
debugJson(logger$
|
|
2561
|
+
debugJson(logger$20, "Alpha search provider Responses result:", {
|
|
2562
2562
|
provider: providerConfig.name,
|
|
2563
2563
|
result
|
|
2564
2564
|
});
|
|
@@ -2574,7 +2574,7 @@ async function requestProviderSearch(c, providerConfig, payload, model, sessionI
|
|
|
2574
2574
|
return result;
|
|
2575
2575
|
}
|
|
2576
2576
|
async function requestCopilotSearch(payload, model, requestId, sessionId, clientSignal) {
|
|
2577
|
-
debugJson(logger$
|
|
2577
|
+
debugJson(logger$20, "Alpha search Copilot Responses request:", payload);
|
|
2578
2578
|
const result = await alphaSearchResponsesDependencies.createResponses(payload, {
|
|
2579
2579
|
vision: false,
|
|
2580
2580
|
initiator: "agent",
|
|
@@ -2583,7 +2583,7 @@ async function requestCopilotSearch(payload, model, requestId, sessionId, client
|
|
|
2583
2583
|
sessionId,
|
|
2584
2584
|
clientSignal
|
|
2585
2585
|
});
|
|
2586
|
-
debugJson(logger$
|
|
2586
|
+
debugJson(logger$20, "Alpha search Copilot Responses result:", result);
|
|
2587
2587
|
alphaSearchResponsesDependencies.createUsageRecorder(model, sessionId)({
|
|
2588
2588
|
...normalizeResponsesUsage(result.usage),
|
|
2589
2589
|
total_nano_aiu: normalizeOptionalToken(result.copilot_usage?.total_nano_aiu)
|
|
@@ -2698,7 +2698,7 @@ async function forwardCodexAlphaSearch(request) {
|
|
|
2698
2698
|
}
|
|
2699
2699
|
//#endregion
|
|
2700
2700
|
//#region src/routes/alpha-search/route.ts
|
|
2701
|
-
const logger$
|
|
2701
|
+
const logger$19 = createHandlerLogger("alpha-search-handler");
|
|
2702
2702
|
const alphaSearchRoutes = new Hono();
|
|
2703
2703
|
const alphaSearchRouteDependencies = {
|
|
2704
2704
|
findEndpointModel,
|
|
@@ -2718,9 +2718,9 @@ function parseDebugBody(body) {
|
|
|
2718
2718
|
}
|
|
2719
2719
|
}
|
|
2720
2720
|
async function forwardCodexAlphaSearchRequest(request) {
|
|
2721
|
-
await debugJsonAsync(logger$
|
|
2721
|
+
await debugJsonAsync(logger$19, "alpha_search.codex.request", async () => ({ body: parseDebugBody(await request.clone().text()) }));
|
|
2722
2722
|
const upstreamResponse = await alphaSearchRouteDependencies.forwardCodexAlphaSearch(request);
|
|
2723
|
-
await debugJsonAsync(logger$
|
|
2723
|
+
await debugJsonAsync(logger$19, "alpha_search.codex.response", async () => ({
|
|
2724
2724
|
body: parseDebugBody(await upstreamResponse.clone().text()),
|
|
2725
2725
|
statusCode: upstreamResponse.status
|
|
2726
2726
|
}));
|
|
@@ -2831,7 +2831,7 @@ alphaSearchRoutes.post("/", async (c) => {
|
|
|
2831
2831
|
try {
|
|
2832
2832
|
return await handleAlphaSearchRequest(c);
|
|
2833
2833
|
} catch (error) {
|
|
2834
|
-
logger$
|
|
2834
|
+
logger$19.error("alpha_search.error", { error });
|
|
2835
2835
|
return await forwardError(c, error);
|
|
2836
2836
|
}
|
|
2837
2837
|
});
|
|
@@ -2978,7 +2978,7 @@ const normalizeProviderResponsesReasoningEffort = (payload, providerConfig) => {
|
|
|
2978
2978
|
};
|
|
2979
2979
|
//#endregion
|
|
2980
2980
|
//#region src/routes/provider/chat-completions/handler.ts
|
|
2981
|
-
const logger$
|
|
2981
|
+
const logger$18 = createHandlerLogger("provider-chat-completions-handler");
|
|
2982
2982
|
async function handleProviderChatCompletionsForProvider(c, options) {
|
|
2983
2983
|
const { payload, provider } = options;
|
|
2984
2984
|
const configuredProvider = await resolveProviderConfig(provider);
|
|
@@ -2993,13 +2993,13 @@ async function handleProviderChatCompletionsForProvider(c, options) {
|
|
|
2993
2993
|
applyProviderStreamOptions(payload);
|
|
2994
2994
|
applyDashScopePreserveThinkingDefault(payload, providerConfig);
|
|
2995
2995
|
applyProviderContextCache(payload, modelConfig, providerConfig);
|
|
2996
|
-
debugJson(logger$
|
|
2996
|
+
debugJson(logger$18, "provider.chat_completions.request", {
|
|
2997
2997
|
payload,
|
|
2998
2998
|
provider
|
|
2999
2999
|
});
|
|
3000
3000
|
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, payload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
|
|
3001
3001
|
if (!upstreamResponse.ok) {
|
|
3002
|
-
logger$
|
|
3002
|
+
logger$18.error("Failed to create provider chat completions", {
|
|
3003
3003
|
provider,
|
|
3004
3004
|
statusCode: upstreamResponse.status
|
|
3005
3005
|
});
|
|
@@ -3013,7 +3013,7 @@ async function handleProviderChatCompletionsForProvider(c, options) {
|
|
|
3013
3013
|
});
|
|
3014
3014
|
const responseBody = await upstreamResponse.clone().json();
|
|
3015
3015
|
recordUsage(normalizeOpenAIUsage(responseBody.usage));
|
|
3016
|
-
debugJson(logger$
|
|
3016
|
+
debugJson(logger$18, "provider.chat_completions.response", responseBody);
|
|
3017
3017
|
return createProviderProxyResponse(upstreamResponse);
|
|
3018
3018
|
}
|
|
3019
3019
|
const applyProviderStreamOptions = (payload) => {
|
|
@@ -3035,12 +3035,12 @@ const createProviderChatCompletionsUsageRecorder = (payload, provider, modelConf
|
|
|
3035
3035
|
providerName: provider
|
|
3036
3036
|
});
|
|
3037
3037
|
const streamProviderChatCompletions = (c, upstreamResponse, options) => {
|
|
3038
|
-
logger$
|
|
3038
|
+
logger$18.debug("provider.chat_completions.streaming", { provider: options.provider });
|
|
3039
3039
|
return streamSSE(c, async (stream) => {
|
|
3040
3040
|
let usage = {};
|
|
3041
3041
|
try {
|
|
3042
3042
|
for await (const chunk of events(upstreamResponse)) {
|
|
3043
|
-
debugJson(logger$
|
|
3043
|
+
debugJson(logger$18, "provider.chat_completions.stream_chunk", chunk);
|
|
3044
3044
|
if (chunk.data && chunk.data !== "[DONE]") {
|
|
3045
3045
|
const parsedChunk = parseChatCompletionChunkData(chunk.data);
|
|
3046
3046
|
if (parsedChunk?.usage) usage = normalizeOpenAIUsage(parsedChunk.usage);
|
|
@@ -3099,7 +3099,7 @@ const createChatCompletions = async (payload, options) => {
|
|
|
3099
3099
|
};
|
|
3100
3100
|
//#endregion
|
|
3101
3101
|
//#region src/routes/chat-completions/handler.ts
|
|
3102
|
-
const logger$
|
|
3102
|
+
const logger$17 = createHandlerLogger("chat-completions-handler");
|
|
3103
3103
|
async function handleCompletion$1(c) {
|
|
3104
3104
|
let payload = await c.req.json();
|
|
3105
3105
|
const requestedModel = payload.model;
|
|
@@ -3113,7 +3113,7 @@ async function handleCompletion$1(c) {
|
|
|
3113
3113
|
provider: providerModelAlias.provider
|
|
3114
3114
|
});
|
|
3115
3115
|
}
|
|
3116
|
-
debugJson(logger$
|
|
3116
|
+
debugJson(logger$17, "Request payload:", payload);
|
|
3117
3117
|
const selectedModel = findEndpointModel(payload.model);
|
|
3118
3118
|
payload.model = selectedModel?.id ?? payload.model;
|
|
3119
3119
|
if (isNullish(payload.max_tokens) && isNullish(payload.max_completion_tokens)) {
|
|
@@ -3121,16 +3121,16 @@ async function handleCompletion$1(c) {
|
|
|
3121
3121
|
...payload,
|
|
3122
3122
|
max_tokens: selectedModel?.capabilities.limits.max_output_tokens
|
|
3123
3123
|
};
|
|
3124
|
-
debugJson(logger$
|
|
3124
|
+
debugJson(logger$17, "Set max_tokens to:", payload.max_tokens);
|
|
3125
3125
|
}
|
|
3126
3126
|
if (payload.model.includes("gpt")) {
|
|
3127
3127
|
if (isNullish(payload.max_completion_tokens)) payload.max_completion_tokens = payload.max_tokens;
|
|
3128
3128
|
delete payload.max_tokens;
|
|
3129
3129
|
}
|
|
3130
3130
|
const requestId = generateRequestIdFromPayload(payload);
|
|
3131
|
-
logger$
|
|
3131
|
+
logger$17.debug("Generated request ID:", requestId);
|
|
3132
3132
|
const sessionId = getUUID(requestId);
|
|
3133
|
-
logger$
|
|
3133
|
+
logger$17.debug("Extracted session ID:", sessionId);
|
|
3134
3134
|
const recordUsage = createCopilotTokenUsageRecorder({
|
|
3135
3135
|
endpoint: "chat_completions",
|
|
3136
3136
|
fallbackSessionId: sessionId,
|
|
@@ -3142,18 +3142,18 @@ async function handleCompletion$1(c) {
|
|
|
3142
3142
|
sessionId
|
|
3143
3143
|
});
|
|
3144
3144
|
if (isNonStreaming$1(response)) {
|
|
3145
|
-
debugJson(logger$
|
|
3145
|
+
debugJson(logger$17, "Non-streaming response:", response);
|
|
3146
3146
|
recordUsage({
|
|
3147
3147
|
...normalizeOpenAIUsage(response.usage),
|
|
3148
3148
|
total_nano_aiu: normalizeOptionalToken(response.copilot_usage?.total_nano_aiu)
|
|
3149
3149
|
});
|
|
3150
3150
|
return c.json(response);
|
|
3151
3151
|
}
|
|
3152
|
-
logger$
|
|
3152
|
+
logger$17.debug("Streaming response");
|
|
3153
3153
|
return streamSSE(c, async (stream) => {
|
|
3154
3154
|
let usage = {};
|
|
3155
3155
|
for await (const chunk of response) {
|
|
3156
|
-
debugJson(logger$
|
|
3156
|
+
debugJson(logger$17, "Streaming chunk:", chunk);
|
|
3157
3157
|
const parsedChunk = parseChatCompletionChunk(chunk);
|
|
3158
3158
|
if (parsedChunk?.usage || parsedChunk?.copilot_usage) usage = {
|
|
3159
3159
|
...normalizeOpenAIUsage(parsedChunk.usage),
|
|
@@ -3383,7 +3383,7 @@ async function forwardCodexImages(request, operation) {
|
|
|
3383
3383
|
}
|
|
3384
3384
|
//#endregion
|
|
3385
3385
|
//#region src/routes/images/shared.ts
|
|
3386
|
-
const logger$
|
|
3386
|
+
const logger$16 = createHandlerLogger("images-handler");
|
|
3387
3387
|
const imageRouteDependencies = {
|
|
3388
3388
|
debugJsonAsync,
|
|
3389
3389
|
getImageEditModel,
|
|
@@ -3431,16 +3431,16 @@ async function handleCodexImages(c, operation, resolvedProviderConfig, request =
|
|
|
3431
3431
|
message: "Provider 'codex' not found or disabled",
|
|
3432
3432
|
type: "invalid_request_error"
|
|
3433
3433
|
} }, 404);
|
|
3434
|
-
if (operation === "generations") await imageRouteDependencies.debugJsonAsync(logger$
|
|
3435
|
-
else debugJson(logger$
|
|
3434
|
+
if (operation === "generations") await imageRouteDependencies.debugJsonAsync(logger$16, "images.generations.codex.request", async () => ({ body: await request.clone().text() }));
|
|
3435
|
+
else debugJson(logger$16, "images.edits.codex.request", getContentMetadata(request.headers));
|
|
3436
3436
|
const upstreamResponse = await forwardCodexImages(request, operation);
|
|
3437
|
-
debugJson(logger$
|
|
3437
|
+
debugJson(logger$16, `images.${operation}.codex.response`, {
|
|
3438
3438
|
...getContentMetadata(upstreamResponse.headers),
|
|
3439
3439
|
statusCode: upstreamResponse.status
|
|
3440
3440
|
});
|
|
3441
3441
|
return createProviderProxyResponse(upstreamResponse);
|
|
3442
3442
|
} catch (error) {
|
|
3443
|
-
logger$
|
|
3443
|
+
logger$16.error(`images.${operation}.codex.error`, { error });
|
|
3444
3444
|
return await forwardError(c, error);
|
|
3445
3445
|
}
|
|
3446
3446
|
}
|
|
@@ -3459,7 +3459,7 @@ async function routeImagesRequest(c, operation, parsed) {
|
|
|
3459
3459
|
const request = parsed.createRequest(providerModelAlias.model);
|
|
3460
3460
|
if (providerConfig.name === "codex") return await handleCodexImages(c, operation, providerConfig, request);
|
|
3461
3461
|
return await forwardProviderImagesWithLogging(providerConfig, request, operation, {
|
|
3462
|
-
logger: logger$
|
|
3462
|
+
logger: logger$16,
|
|
3463
3463
|
provider: providerModelAlias.provider
|
|
3464
3464
|
});
|
|
3465
3465
|
}
|
|
@@ -3953,12 +3953,12 @@ async function forwardXaiImages(providerConfig, request, operation, payload) {
|
|
|
3953
3953
|
method: "POST",
|
|
3954
3954
|
signal: request.signal
|
|
3955
3955
|
}), operation, {
|
|
3956
|
-
logger: logger$
|
|
3956
|
+
logger: logger$16,
|
|
3957
3957
|
provider: "xai"
|
|
3958
3958
|
}), void 0, {
|
|
3959
3959
|
clientSignal: request.signal,
|
|
3960
3960
|
onImageUrl: (url) => {
|
|
3961
|
-
logger$
|
|
3961
|
+
logger$16.info("images.xai.output.url", JSON.stringify({
|
|
3962
3962
|
operation,
|
|
3963
3963
|
url
|
|
3964
3964
|
}));
|
|
@@ -3982,7 +3982,7 @@ async function handleXaiImageEdit(c, model, parsed) {
|
|
|
3982
3982
|
}
|
|
3983
3983
|
//#endregion
|
|
3984
3984
|
//#region src/routes/images/temp-form-data.ts
|
|
3985
|
-
const logger$
|
|
3985
|
+
const logger$15 = createHandlerLogger("images-temp-form-data");
|
|
3986
3986
|
const multipartStagingDependencies = { createWriteStream };
|
|
3987
3987
|
/**
|
|
3988
3988
|
* Matches the images forwarding timeouts: an upstream upload may take that
|
|
@@ -4174,7 +4174,7 @@ async function stageMultipartBodyToDisk(body, contentType, limitOverrides = {})
|
|
|
4174
4174
|
recursive: true
|
|
4175
4175
|
});
|
|
4176
4176
|
} catch (error) {
|
|
4177
|
-
logger$
|
|
4177
|
+
logger$15.warn("Failed to remove staged images temp directory", {
|
|
4178
4178
|
directory,
|
|
4179
4179
|
error
|
|
4180
4180
|
});
|
|
@@ -4196,7 +4196,7 @@ async function stageMultipartBodyToDisk(body, contentType, limitOverrides = {})
|
|
|
4196
4196
|
recursive: true
|
|
4197
4197
|
});
|
|
4198
4198
|
} catch (error) {
|
|
4199
|
-
logger$
|
|
4199
|
+
logger$15.warn("Failed to remove staged images temp directory on exit", {
|
|
4200
4200
|
directory,
|
|
4201
4201
|
error
|
|
4202
4202
|
});
|
|
@@ -4277,7 +4277,7 @@ async function handleImagesEdits(c) {
|
|
|
4277
4277
|
} }, error instanceof MultipartBodyTooLargeError ? 413 : 400);
|
|
4278
4278
|
const invalidRequest = xaiImagesRequestErrorResponse(c, error);
|
|
4279
4279
|
if (invalidRequest) return invalidRequest;
|
|
4280
|
-
logger$
|
|
4280
|
+
logger$16.error("images.edits.error", { error });
|
|
4281
4281
|
return await forwardError(c, error);
|
|
4282
4282
|
}
|
|
4283
4283
|
}
|
|
@@ -4329,7 +4329,7 @@ async function handleImagesGenerations(c) {
|
|
|
4329
4329
|
} catch (error) {
|
|
4330
4330
|
const invalidRequest = xaiImagesRequestErrorResponse(c, error);
|
|
4331
4331
|
if (invalidRequest) return invalidRequest;
|
|
4332
|
-
logger$
|
|
4332
|
+
logger$16.error("images.generations.error", { error });
|
|
4333
4333
|
return await forwardError(c, error);
|
|
4334
4334
|
}
|
|
4335
4335
|
}
|
|
@@ -5431,7 +5431,7 @@ const prepareMessagesApiPayload = (payload, selectedModel) => {
|
|
|
5431
5431
|
};
|
|
5432
5432
|
//#endregion
|
|
5433
5433
|
//#region src/routes/provider/messages/count-tokens-handler.ts
|
|
5434
|
-
const logger$
|
|
5434
|
+
const logger$14 = createHandlerLogger("provider-count-tokens-handler");
|
|
5435
5435
|
async function handleProviderCountTokens(c) {
|
|
5436
5436
|
const provider = c.req.param("provider");
|
|
5437
5437
|
const payload = await c.req.json();
|
|
@@ -5459,7 +5459,7 @@ async function handleProviderCountTokensForProvider(c, options) {
|
|
|
5459
5459
|
const selectedModel = createFallbackModel(modelId);
|
|
5460
5460
|
const tokenCount = await getTokenCount(openAIPayload, selectedModel);
|
|
5461
5461
|
const finalTokenCount = tokenCount.input + tokenCount.output;
|
|
5462
|
-
logger$
|
|
5462
|
+
logger$14.debug("provider.count_tokens.success", {
|
|
5463
5463
|
provider,
|
|
5464
5464
|
model: anthropicPayload.model,
|
|
5465
5465
|
input_tokens: finalTokenCount
|
|
@@ -8988,9 +8988,9 @@ async function forwardGoogleGenerateContent(provider, model, payload, requestHea
|
|
|
8988
8988
|
}
|
|
8989
8989
|
//#endregion
|
|
8990
8990
|
//#region src/routes/provider/messages/google-handler.ts
|
|
8991
|
-
const logger$
|
|
8991
|
+
const logger$13 = createHandlerLogger("provider-google-messages");
|
|
8992
8992
|
async function handleGoogleProviderMessages(c, payload, provider, usageEndpoint) {
|
|
8993
|
-
debugJson(logger$
|
|
8993
|
+
debugJson(logger$13, "provider.messages.google.original_request", payload);
|
|
8994
8994
|
const translated = translateAnthropicToGoogle(payload);
|
|
8995
8995
|
const modelConfig = provider.models?.[payload.model];
|
|
8996
8996
|
const extraGenerationConfig = modelConfig?.extraBody?.generationConfig;
|
|
@@ -8999,7 +8999,7 @@ async function handleGoogleProviderMessages(c, payload, provider, usageEndpoint)
|
|
|
8999
8999
|
for (const [key, value] of Object.entries(extraGenerationConfig)) if (generationConfig[key] === void 0) generationConfig[key] = value;
|
|
9000
9000
|
}
|
|
9001
9001
|
applyMissingExtraBody(translated, { extraBody: modelConfig?.extraBody });
|
|
9002
|
-
debugJson(logger$
|
|
9002
|
+
debugJson(logger$13, "provider.messages.google.request", translated);
|
|
9003
9003
|
const controller = new AbortController();
|
|
9004
9004
|
const signal = AbortSignal.any([controller.signal, c.req.raw.signal]);
|
|
9005
9005
|
const upstream = await forwardGoogleGenerateContent(provider, payload.model, translated, c.req.raw.headers, {
|
|
@@ -9026,7 +9026,7 @@ async function handleGoogleProviderMessages(c, payload, provider, usageEndpoint)
|
|
|
9026
9026
|
stream.onAbort(() => controller.abort());
|
|
9027
9027
|
const writeEvents = async (items) => {
|
|
9028
9028
|
for (const item of items) {
|
|
9029
|
-
debugJson(logger$
|
|
9029
|
+
debugJson(logger$13, "provider.messages.google.translated_event:", item);
|
|
9030
9030
|
await writeSSEIfConnected(stream, {
|
|
9031
9031
|
event: item.type,
|
|
9032
9032
|
data: JSON.stringify(item)
|
|
@@ -9038,14 +9038,14 @@ async function handleGoogleProviderMessages(c, payload, provider, usageEndpoint)
|
|
|
9038
9038
|
if (response.headers.get("content-type")?.includes("text/event-stream")) for await (const event of events(response, signal)) {
|
|
9039
9039
|
if (!event.data || event.data === "[DONE]") continue;
|
|
9040
9040
|
const response = JSON.parse(event.data);
|
|
9041
|
-
debugJson(logger$
|
|
9041
|
+
debugJson(logger$13, "provider.messages.google.raw_stream_event:", response);
|
|
9042
9042
|
await writeEvents(translator.push(response));
|
|
9043
9043
|
}
|
|
9044
9044
|
else await writeEvents(translator.push(await response.json()));
|
|
9045
9045
|
if (!signal.aborted) await writeEvents(translator.finish());
|
|
9046
9046
|
} catch (error) {
|
|
9047
9047
|
if (!signal.aborted) {
|
|
9048
|
-
logger$
|
|
9048
|
+
logger$13.warn("provider.messages.google.stream_interrupted", error);
|
|
9049
9049
|
await writeEvents([{
|
|
9050
9050
|
type: "error",
|
|
9051
9051
|
error: {
|
|
@@ -9062,7 +9062,7 @@ async function handleGoogleProviderMessages(c, payload, provider, usageEndpoint)
|
|
|
9062
9062
|
}
|
|
9063
9063
|
//#endregion
|
|
9064
9064
|
//#region src/routes/provider/messages/handler.ts
|
|
9065
|
-
const logger$
|
|
9065
|
+
const logger$12 = createHandlerLogger("provider-messages-handler");
|
|
9066
9066
|
const providerMessagesHandlerDependencies = { resolveProviderConfig };
|
|
9067
9067
|
async function handleProviderMessages(c) {
|
|
9068
9068
|
const provider = c.req.param("provider");
|
|
@@ -9090,7 +9090,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
9090
9090
|
const providerConfig = resolveProviderConfigForModel(configuredProvider, payload.model);
|
|
9091
9091
|
const modelConfig = providerConfig.models?.[payload.model];
|
|
9092
9092
|
const effectiveType = providerConfig.type;
|
|
9093
|
-
debugJson(logger$
|
|
9093
|
+
debugJson(logger$12, "provider.messages.request", {
|
|
9094
9094
|
payload,
|
|
9095
9095
|
provider
|
|
9096
9096
|
});
|
|
@@ -9131,13 +9131,13 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
9131
9131
|
});
|
|
9132
9132
|
}
|
|
9133
9133
|
applyMissingExtraBody(payload, { extraBody: modelConfig?.extraBody });
|
|
9134
|
-
debugJson(logger$
|
|
9134
|
+
debugJson(logger$12, "Translated provider.messages.request", {
|
|
9135
9135
|
payload,
|
|
9136
9136
|
provider
|
|
9137
9137
|
});
|
|
9138
9138
|
const upstreamResponse = await forwardProviderMessages(providerConfig, payload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
|
|
9139
9139
|
if (!upstreamResponse.ok) {
|
|
9140
|
-
logger$
|
|
9140
|
+
logger$12.error("Failed to create responses", upstreamResponse);
|
|
9141
9141
|
throw new HTTPError("Failed to create responses", upstreamResponse);
|
|
9142
9142
|
}
|
|
9143
9143
|
const contentType = upstreamResponse.headers.get("content-type") ?? "";
|
|
@@ -9160,7 +9160,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
9160
9160
|
usageEndpoint
|
|
9161
9161
|
});
|
|
9162
9162
|
} catch (error) {
|
|
9163
|
-
logger$
|
|
9163
|
+
logger$12.error("provider.messages.error", {
|
|
9164
9164
|
provider,
|
|
9165
9165
|
error
|
|
9166
9166
|
});
|
|
@@ -9171,8 +9171,8 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
9171
9171
|
const { modelConfig, payload, provider, providerConfig, usageEndpoint } = options;
|
|
9172
9172
|
const responsesPayload = prepareWebSearchResponsesPayload(payload);
|
|
9173
9173
|
const normalizedReasoningEffort = normalizeProviderResponsesReasoningEffort(responsesPayload, providerConfig);
|
|
9174
|
-
if (normalizedReasoningEffort) logger$
|
|
9175
|
-
debugJson(logger$
|
|
9174
|
+
if (normalizedReasoningEffort) logger$12.debug(`Normalized reasoning effort from ${normalizedReasoningEffort.from} to ${normalizedReasoningEffort.to} based on the provider model configuration`);
|
|
9175
|
+
debugJson(logger$12, "provider.messages.responses.web_search.request", {
|
|
9176
9176
|
payload: responsesPayload,
|
|
9177
9177
|
provider
|
|
9178
9178
|
});
|
|
@@ -9183,7 +9183,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
9183
9183
|
errorMessagePrefix: `${provider} web search responses stream`,
|
|
9184
9184
|
parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
|
|
9185
9185
|
upstreamResponse,
|
|
9186
|
-
logger: logger$
|
|
9186
|
+
logger: logger$12
|
|
9187
9187
|
});
|
|
9188
9188
|
return respondWebSearchProviderMessagesJson(c, {
|
|
9189
9189
|
body,
|
|
@@ -9205,7 +9205,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
9205
9205
|
}
|
|
9206
9206
|
const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
|
|
9207
9207
|
if (!upstreamResponse.ok) {
|
|
9208
|
-
logger$
|
|
9208
|
+
logger$12.error("Failed to create provider web search responses", {
|
|
9209
9209
|
provider,
|
|
9210
9210
|
upstreamResponse
|
|
9211
9211
|
});
|
|
@@ -9216,7 +9216,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
9216
9216
|
errorMessagePrefix: `${provider} web search responses stream`,
|
|
9217
9217
|
parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
|
|
9218
9218
|
upstreamResponse: createResponsesHttpEventStream(upstreamResponse),
|
|
9219
|
-
logger: logger$
|
|
9219
|
+
logger: logger$12
|
|
9220
9220
|
});
|
|
9221
9221
|
return respondWebSearchProviderMessagesJson(c, {
|
|
9222
9222
|
body,
|
|
@@ -9243,10 +9243,10 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
9243
9243
|
const wantsStream = payload.stream === true;
|
|
9244
9244
|
const responsesPayload = translateAnthropicMessagesToResponsesPayload(payload);
|
|
9245
9245
|
const normalizedMessagesReasoningEffort = normalizeProviderResponsesReasoningEffort(responsesPayload, providerConfig);
|
|
9246
|
-
if (normalizedMessagesReasoningEffort) logger$
|
|
9246
|
+
if (normalizedMessagesReasoningEffort) logger$12.debug(`Normalized reasoning effort from ${normalizedMessagesReasoningEffort.from} to ${normalizedMessagesReasoningEffort.to} based on the provider model configuration`);
|
|
9247
9247
|
if (providerConfig.name === "codex" && !wantsStream) responsesPayload.stream = true;
|
|
9248
9248
|
if (applyResponsesApiContextManagement(responsesPayload, selectedModel?.capabilities.limits.max_prompt_tokens, { source: "messages" })) compactInputByLatestCompaction(responsesPayload);
|
|
9249
|
-
debugJson(logger$
|
|
9249
|
+
debugJson(logger$12, "provider.messages.responses.request", {
|
|
9250
9250
|
payload: responsesPayload,
|
|
9251
9251
|
provider
|
|
9252
9252
|
});
|
|
@@ -9267,7 +9267,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
9267
9267
|
errorMessagePrefix: `${provider} messages responses stream`,
|
|
9268
9268
|
parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
|
|
9269
9269
|
upstreamResponse,
|
|
9270
|
-
logger: logger$
|
|
9270
|
+
logger: logger$12
|
|
9271
9271
|
});
|
|
9272
9272
|
return respondResponsesProviderMessagesJson(c, {
|
|
9273
9273
|
body,
|
|
@@ -9291,7 +9291,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
9291
9291
|
}
|
|
9292
9292
|
const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
|
|
9293
9293
|
if (!upstreamResponse.ok) {
|
|
9294
|
-
logger$
|
|
9294
|
+
logger$12.error("Failed to create provider responses", upstreamResponse);
|
|
9295
9295
|
throw new HTTPError("Failed to create provider responses", upstreamResponse);
|
|
9296
9296
|
}
|
|
9297
9297
|
if (responsesPayload.stream) return streamResponsesProviderMessages({
|
|
@@ -9337,13 +9337,13 @@ const applyOpenAICompatibleExtraBodyThinkingBudget = (payload, options) => {
|
|
|
9337
9337
|
const handleOpenAICompatibleProviderMessages = async (c, options) => {
|
|
9338
9338
|
const { modelConfig, payload, provider, providerConfig, usageEndpoint } = options;
|
|
9339
9339
|
const openAIPayload = createOpenAICompatiblePayload(payload, modelConfig, providerConfig);
|
|
9340
|
-
debugJson(logger$
|
|
9340
|
+
debugJson(logger$12, "provider.messages.openai_compatible.request", {
|
|
9341
9341
|
payload: openAIPayload,
|
|
9342
9342
|
provider
|
|
9343
9343
|
});
|
|
9344
9344
|
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, openAIPayload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
|
|
9345
9345
|
if (!upstreamResponse.ok) {
|
|
9346
|
-
logger$
|
|
9346
|
+
logger$12.error("Failed to create openai-compatible responses", upstreamResponse);
|
|
9347
9347
|
throw new HTTPError("Failed to create openai-compatible responses", upstreamResponse);
|
|
9348
9348
|
}
|
|
9349
9349
|
const contentType = upstreamResponse.headers.get("content-type") ?? "";
|
|
@@ -9424,7 +9424,7 @@ const applyOpenAICompatibleRequestOverrides = (payload, options) => {
|
|
|
9424
9424
|
for (const key of allowedKeys) if (Object.hasOwn(options.source, key)) payload[key] = options.source[key];
|
|
9425
9425
|
};
|
|
9426
9426
|
const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, upstreamResponse, usageEndpoint }) => {
|
|
9427
|
-
logger$
|
|
9427
|
+
logger$12.debug("provider.messages.streaming");
|
|
9428
9428
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint);
|
|
9429
9429
|
return streamSSE(c, async (stream) => {
|
|
9430
9430
|
let usage = {};
|
|
@@ -9436,7 +9436,7 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
|
|
|
9436
9436
|
};
|
|
9437
9437
|
try {
|
|
9438
9438
|
for await (const chunk of events(upstreamResponse)) {
|
|
9439
|
-
logger$
|
|
9439
|
+
logger$12.debug("provider.messages.raw_stream_event:", chunk.data);
|
|
9440
9440
|
const eventName = chunk.event;
|
|
9441
9441
|
if (eventName === "ping") {
|
|
9442
9442
|
await writeSSEIfConnected(stream, {
|
|
@@ -9465,13 +9465,13 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
|
|
|
9465
9465
|
});
|
|
9466
9466
|
}
|
|
9467
9467
|
} catch (error) {
|
|
9468
|
-
logger$
|
|
9468
|
+
logger$12.warn("provider.messages.stream_interrupted:", {
|
|
9469
9469
|
error,
|
|
9470
9470
|
provider
|
|
9471
9471
|
});
|
|
9472
9472
|
}
|
|
9473
9473
|
if (!messageStopSeen && !errorSeen) {
|
|
9474
|
-
logger$
|
|
9474
|
+
logger$12.warn("provider.messages.stream_incomplete:", { provider });
|
|
9475
9475
|
const errorEvent = translateErrorToAnthropicErrorEvent();
|
|
9476
9476
|
await writeSSEIfConnected(stream, {
|
|
9477
9477
|
event: errorEvent.type,
|
|
@@ -9482,7 +9482,7 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
|
|
|
9482
9482
|
});
|
|
9483
9483
|
};
|
|
9484
9484
|
const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, upstreamResponse, usageEndpoint }) => {
|
|
9485
|
-
logger$
|
|
9485
|
+
logger$12.debug("provider.messages.openai_compatible.streaming");
|
|
9486
9486
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint);
|
|
9487
9487
|
return streamSSE(c, async (stream) => {
|
|
9488
9488
|
let usage = {};
|
|
@@ -9496,7 +9496,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
9496
9496
|
};
|
|
9497
9497
|
try {
|
|
9498
9498
|
for await (const chunk of events(upstreamResponse)) {
|
|
9499
|
-
logger$
|
|
9499
|
+
logger$12.debug("provider.messages.openai_compatible.raw_stream_event:", chunk.data);
|
|
9500
9500
|
if (chunk.event === "ping") {
|
|
9501
9501
|
await writeSSEIfConnected(stream, {
|
|
9502
9502
|
event: "ping",
|
|
@@ -9514,7 +9514,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
9514
9514
|
const events = translateChunkToAnthropicEvents(parsed, streamState);
|
|
9515
9515
|
for (const event of events) {
|
|
9516
9516
|
const eventData = JSON.stringify(event);
|
|
9517
|
-
debugLazy(logger$
|
|
9517
|
+
debugLazy(logger$12, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
|
|
9518
9518
|
await writeSSEIfConnected(stream, {
|
|
9519
9519
|
event: event.type,
|
|
9520
9520
|
data: eventData
|
|
@@ -9522,21 +9522,21 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
9522
9522
|
}
|
|
9523
9523
|
}
|
|
9524
9524
|
} catch (error) {
|
|
9525
|
-
logger$
|
|
9525
|
+
logger$12.warn("provider.messages.openai_compatible.stream_interrupted:", {
|
|
9526
9526
|
error,
|
|
9527
9527
|
provider
|
|
9528
9528
|
});
|
|
9529
9529
|
}
|
|
9530
9530
|
for (const event of flushPendingAnthropicStreamEvents(streamState)) {
|
|
9531
9531
|
const eventData = JSON.stringify(event);
|
|
9532
|
-
debugLazy(logger$
|
|
9532
|
+
debugLazy(logger$12, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
|
|
9533
9533
|
await writeSSEIfConnected(stream, {
|
|
9534
9534
|
event: event.type,
|
|
9535
9535
|
data: eventData
|
|
9536
9536
|
});
|
|
9537
9537
|
}
|
|
9538
9538
|
if (!streamState.messageCompleted) {
|
|
9539
|
-
logger$
|
|
9539
|
+
logger$12.warn("provider.messages.openai_compatible.stream_incomplete:", { provider });
|
|
9540
9540
|
const errorEvent = translateErrorToAnthropicErrorEvent();
|
|
9541
9541
|
await writeSSEIfConnected(stream, {
|
|
9542
9542
|
event: errorEvent.type,
|
|
@@ -9547,13 +9547,13 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
9547
9547
|
});
|
|
9548
9548
|
};
|
|
9549
9549
|
const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, providerConfig, upstreamResponse, usageEndpoint }) => {
|
|
9550
|
-
logger$
|
|
9550
|
+
logger$12.debug("provider.messages.responses.streaming", { provider });
|
|
9551
9551
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint);
|
|
9552
9552
|
return streamSSE(c, async (stream) => {
|
|
9553
9553
|
let usage = {};
|
|
9554
9554
|
const streamState = createResponsesStreamState({ toolSearchName: resolveBridgeToolSearchName(payload.tools) });
|
|
9555
9555
|
for await (const chunk of upstreamResponse) {
|
|
9556
|
-
logger$
|
|
9556
|
+
logger$12.debug("provider.messages.responses.raw_stream_event:", chunk.data);
|
|
9557
9557
|
if (chunk.event === "ping") {
|
|
9558
9558
|
await writeSSEIfConnected(stream, {
|
|
9559
9559
|
event: "ping",
|
|
@@ -9571,7 +9571,7 @@ const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurre
|
|
|
9571
9571
|
const events = translateResponsesStreamEvent(parsed, streamState);
|
|
9572
9572
|
for (const event of events) {
|
|
9573
9573
|
const eventData = JSON.stringify(event);
|
|
9574
|
-
debugLazy(logger$
|
|
9574
|
+
debugLazy(logger$12, () => ["provider.messages.responses.translated_event:", eventData]);
|
|
9575
9575
|
await writeSSEIfConnected(stream, {
|
|
9576
9576
|
event: event.type,
|
|
9577
9577
|
data: eventData
|
|
@@ -9592,7 +9592,7 @@ const parseOpenAICompatibleStreamChunk = (data) => {
|
|
|
9592
9592
|
try {
|
|
9593
9593
|
return JSON.parse(data);
|
|
9594
9594
|
} catch (error) {
|
|
9595
|
-
logger$
|
|
9595
|
+
logger$12.error("provider.messages.openai_compatible.parse_chunk_error", {
|
|
9596
9596
|
data,
|
|
9597
9597
|
error
|
|
9598
9598
|
});
|
|
@@ -9605,7 +9605,7 @@ const parseResponsesProviderStreamChunk = (data, providerConfig) => {
|
|
|
9605
9605
|
if (providerConfig.name === "codex") logCodexRateLimitsEvent(parsed);
|
|
9606
9606
|
return parsed;
|
|
9607
9607
|
} catch (error) {
|
|
9608
|
-
logger$
|
|
9608
|
+
logger$12.error("provider.messages.responses.parse_chunk_error", {
|
|
9609
9609
|
provider: providerConfig.name,
|
|
9610
9610
|
data,
|
|
9611
9611
|
error
|
|
@@ -9633,7 +9633,7 @@ const parseProviderStreamEvent = (data) => {
|
|
|
9633
9633
|
usage: {}
|
|
9634
9634
|
};
|
|
9635
9635
|
} catch (error) {
|
|
9636
|
-
logger$
|
|
9636
|
+
logger$12.error("provider.messages.streaming.adjust_tokens_error", {
|
|
9637
9637
|
error,
|
|
9638
9638
|
originalData: data
|
|
9639
9639
|
});
|
|
@@ -9695,34 +9695,34 @@ const respondProviderMessagesJson = (c, options) => {
|
|
|
9695
9695
|
const { body, modelConfig, payload, pricingCurrency, provider, usageEndpoint } = options;
|
|
9696
9696
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint)(normalizeAnthropicUsage(body.usage));
|
|
9697
9697
|
if (provider === "openrouter") normalizeOpenRouterThinkingSignatures(body);
|
|
9698
|
-
debugJson(logger$
|
|
9698
|
+
debugJson(logger$12, "provider.messages.no_stream result:", body);
|
|
9699
9699
|
return c.json(body);
|
|
9700
9700
|
};
|
|
9701
9701
|
const respondOpenAICompatibleProviderMessagesJson = (c, options) => {
|
|
9702
9702
|
const { body, modelConfig, payload, pricingCurrency, provider, usageEndpoint } = options;
|
|
9703
9703
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint)(normalizeOpenAIUsage(body.usage));
|
|
9704
9704
|
const anthropicResponse = translateToAnthropic(body);
|
|
9705
|
-
debugJson(logger$
|
|
9705
|
+
debugJson(logger$12, "provider.messages.openai_compatible.no_stream result:", anthropicResponse);
|
|
9706
9706
|
return c.json(anthropicResponse);
|
|
9707
9707
|
};
|
|
9708
9708
|
const respondResponsesProviderMessagesJson = (c, options) => {
|
|
9709
9709
|
const { body, modelConfig, payload, pricingCurrency, provider, providerConfig, usageEndpoint } = options;
|
|
9710
9710
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint)(normalizeResponsesUsage(body.usage));
|
|
9711
9711
|
const anthropicResponse = translateResponsesResultToAnthropic(body, { toolSearchName: resolveBridgeToolSearchName(payload.tools) });
|
|
9712
|
-
debugJson(logger$
|
|
9713
|
-
if (providerConfig.name === "codex") logger$
|
|
9712
|
+
debugJson(logger$12, "provider.messages.responses.no_stream result:", anthropicResponse);
|
|
9713
|
+
if (providerConfig.name === "codex") logger$12.debug("provider.messages.codex.no_stream.result");
|
|
9714
9714
|
return c.json(anthropicResponse);
|
|
9715
9715
|
};
|
|
9716
9716
|
const respondWebSearchProviderMessagesJson = (c, options) => {
|
|
9717
9717
|
const { body, modelConfig, payload, pricingCurrency, provider, usageEndpoint } = options;
|
|
9718
9718
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint)(normalizeResponsesUsage(body.usage));
|
|
9719
9719
|
const { extract, response } = reconstructWebSearchResponse(payload, body, { requestId: body.id || `${provider}:${payload.model}` });
|
|
9720
|
-
debugJson(logger$
|
|
9720
|
+
debugJson(logger$12, `Web search via responses: ${extract.queries.length} quer(y/ies), ${extract.sources.length} source(s)`, body);
|
|
9721
9721
|
if (!payload.stream) return c.json(response);
|
|
9722
9722
|
return streamSSE(c, async (stream) => {
|
|
9723
9723
|
for (const event of buildSyntheticStreamEvents(response)) {
|
|
9724
9724
|
const data = JSON.stringify(event);
|
|
9725
|
-
logger$
|
|
9725
|
+
logger$12.debug(`Web search stream event`, data);
|
|
9726
9726
|
await writeSSEIfConnected(stream, {
|
|
9727
9727
|
event: event.type,
|
|
9728
9728
|
data
|
|
@@ -10128,7 +10128,7 @@ const parseSubagentMarkerFromSystemReminder = (text) => {
|
|
|
10128
10128
|
};
|
|
10129
10129
|
//#endregion
|
|
10130
10130
|
//#region src/routes/messages/handler.ts
|
|
10131
|
-
const logger$
|
|
10131
|
+
const logger$11 = createHandlerLogger("messages-handler");
|
|
10132
10132
|
const messagesFlowHandlers = {
|
|
10133
10133
|
handleWithChatCompletions,
|
|
10134
10134
|
handleWithMessagesApi,
|
|
@@ -10146,7 +10146,7 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
|
|
|
10146
10146
|
if (anthropicPayload.model !== requestedModel) consola.debug(`Resolved model mapping: ${requestedModel} -> ${anthropicPayload.model}`);
|
|
10147
10147
|
if (!dispatchOptions.skipWebSearch) {
|
|
10148
10148
|
const webSearchResult = await tryHandleWebSearch(c, anthropicPayload, {
|
|
10149
|
-
logger: logger$
|
|
10149
|
+
logger: logger$11,
|
|
10150
10150
|
forwardToProvider: (ctx, payload, provider) => handleProviderMessagesForProvider(ctx, {
|
|
10151
10151
|
payload,
|
|
10152
10152
|
provider
|
|
@@ -10170,15 +10170,15 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
|
|
|
10170
10170
|
usageEndpoint: dispatchOptions.usageEndpoint
|
|
10171
10171
|
});
|
|
10172
10172
|
}
|
|
10173
|
-
debugJson(logger$
|
|
10173
|
+
debugJson(logger$11, "Anthropic request payload:", anthropicPayload);
|
|
10174
10174
|
normalizeSystemMessages(anthropicPayload);
|
|
10175
10175
|
sanitizeIdeTools(anthropicPayload);
|
|
10176
10176
|
const subagentMarker = dispatchOptions.subagentMarker ?? parseSubagentMarkerFromFirstUser(anthropicPayload);
|
|
10177
|
-
if (subagentMarker) debugJson(logger$
|
|
10177
|
+
if (subagentMarker) debugJson(logger$11, "Detected Subagent marker:", subagentMarker);
|
|
10178
10178
|
let sessionId = dispatchOptions.sessionId ?? getRootSessionId(anthropicPayload, c);
|
|
10179
10179
|
const compactType = dispatchOptions.compactType ?? getCompactType(anthropicPayload);
|
|
10180
10180
|
const anthropicBeta = c.req.header("anthropic-beta");
|
|
10181
|
-
logger$
|
|
10181
|
+
logger$11.debug("Anthropic Beta header:", anthropicBeta);
|
|
10182
10182
|
if (!state.tokenBasedBilling && !shouldUseClaudeAutoModel) {
|
|
10183
10183
|
const tools = anthropicPayload.tools;
|
|
10184
10184
|
const noTools = !tools || tools.length === 0;
|
|
@@ -10188,7 +10188,7 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
|
|
|
10188
10188
|
anthropicPayload.model = smallModel;
|
|
10189
10189
|
}
|
|
10190
10190
|
}
|
|
10191
|
-
if (compactType) logger$
|
|
10191
|
+
if (compactType) logger$11.debug("Compact request type:", compactType);
|
|
10192
10192
|
if (!state.tokenBasedBilling) {
|
|
10193
10193
|
const lastMessageCacheControl = getLastMessageContentCacheControl(anthropicPayload.messages.at(-1));
|
|
10194
10194
|
stripToolReferenceTurnBoundary(anthropicPayload);
|
|
@@ -10196,9 +10196,9 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
|
|
|
10196
10196
|
applyLastMessageCacheControl(anthropicPayload, lastMessageCacheControl);
|
|
10197
10197
|
}
|
|
10198
10198
|
const requestId = dispatchOptions.requestId ?? generateRequestIdFromPayload(anthropicPayload, sessionId);
|
|
10199
|
-
logger$
|
|
10199
|
+
logger$11.debug("Generated request ID:", requestId);
|
|
10200
10200
|
if (!sessionId) sessionId = getUUID(requestId);
|
|
10201
|
-
logger$
|
|
10201
|
+
logger$11.debug("Extracted session ID:", sessionId);
|
|
10202
10202
|
const selectedModel = findEndpointModel(anthropicPayload.model);
|
|
10203
10203
|
anthropicPayload.model = selectedModel?.id ?? anthropicPayload.model;
|
|
10204
10204
|
appendClaudeContinuationMessage(anthropicPayload);
|
|
@@ -10209,7 +10209,7 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
|
|
|
10209
10209
|
requestId,
|
|
10210
10210
|
sessionId,
|
|
10211
10211
|
compactType,
|
|
10212
|
-
logger: logger$
|
|
10212
|
+
logger: logger$11,
|
|
10213
10213
|
usageEndpoint: dispatchOptions.usageEndpoint
|
|
10214
10214
|
});
|
|
10215
10215
|
if (shouldUseResponsesApi(selectedModel, compactType)) return await messagesFlowHandlers.handleWithResponsesApi(c, anthropicPayload, {
|
|
@@ -10218,7 +10218,7 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
|
|
|
10218
10218
|
requestId,
|
|
10219
10219
|
sessionId,
|
|
10220
10220
|
compactType,
|
|
10221
|
-
logger: logger$
|
|
10221
|
+
logger: logger$11,
|
|
10222
10222
|
usageEndpoint: dispatchOptions.usageEndpoint
|
|
10223
10223
|
});
|
|
10224
10224
|
return await messagesFlowHandlers.handleWithChatCompletions(c, anthropicPayload, {
|
|
@@ -10227,7 +10227,7 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
|
|
|
10227
10227
|
requestId,
|
|
10228
10228
|
sessionId,
|
|
10229
10229
|
compactType,
|
|
10230
|
-
logger: logger$
|
|
10230
|
+
logger: logger$11,
|
|
10231
10231
|
usageEndpoint: dispatchOptions.usageEndpoint
|
|
10232
10232
|
});
|
|
10233
10233
|
}
|
|
@@ -10274,7 +10274,7 @@ function withModelDisplayName(model, provider) {
|
|
|
10274
10274
|
}
|
|
10275
10275
|
//#endregion
|
|
10276
10276
|
//#region src/routes/models/model-discovery.ts
|
|
10277
|
-
const logger$
|
|
10277
|
+
const logger$10 = createHandlerLogger("models-handler");
|
|
10278
10278
|
const EPOCH_ISO = (/* @__PURE__ */ new Date(0)).toISOString();
|
|
10279
10279
|
function isRecord(value) {
|
|
10280
10280
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -10323,7 +10323,7 @@ function getStringList(value) {
|
|
|
10323
10323
|
}
|
|
10324
10324
|
function getFallbackProviderModelRecords(provider, reason, details = {}) {
|
|
10325
10325
|
const fallbackModels = getLocalProviderModelRecords(provider, getRawProviderConfig(provider)) ?? getBuiltinProviderModelRecords(provider);
|
|
10326
|
-
logger$
|
|
10326
|
+
logger$10.warn(`models.provider.fallback_${reason}`, {
|
|
10327
10327
|
provider,
|
|
10328
10328
|
...details,
|
|
10329
10329
|
fallbackModelCount: fallbackModels.length
|
|
@@ -10389,7 +10389,7 @@ async function getProviderModels(provider, requestHeaders, selectModels) {
|
|
|
10389
10389
|
return normalizeProviderModels(providerConfig.name, selectModels?.(providerConfig, models) ?? models, providerConfig);
|
|
10390
10390
|
} catch (error) {
|
|
10391
10391
|
if (provider === "codex") {
|
|
10392
|
-
logger$
|
|
10392
|
+
logger$10.warn("models.provider.skip_error", {
|
|
10393
10393
|
provider,
|
|
10394
10394
|
error
|
|
10395
10395
|
});
|
|
@@ -10553,7 +10553,7 @@ function getModelMetadata(provider, modelId, model, config) {
|
|
|
10553
10553
|
}
|
|
10554
10554
|
//#endregion
|
|
10555
10555
|
//#region src/routes/models/codex-model-candidates.ts
|
|
10556
|
-
const logger$
|
|
10556
|
+
const logger$9 = createHandlerLogger("models-handler");
|
|
10557
10557
|
const RESPONSES_ENDPOINTS = /* @__PURE__ */ new Set(["/responses", "ws:/responses"]);
|
|
10558
10558
|
const MESSAGES_ENDPOINT = "/v1/messages";
|
|
10559
10559
|
const CHAT_COMPLETIONS_ENDPOINT = "/chat/completions";
|
|
@@ -10577,7 +10577,7 @@ function getCopilotCodexCandidates() {
|
|
|
10577
10577
|
for (const model of getCopilotModelRecords()) try {
|
|
10578
10578
|
if (isCopilotCodexCandidate(model)) candidates.push(createCopilotCodexCandidate(model));
|
|
10579
10579
|
} catch (error) {
|
|
10580
|
-
logger$
|
|
10580
|
+
logger$9.warn("models.codex.copilot_skip_error", {
|
|
10581
10581
|
modelId: model.id,
|
|
10582
10582
|
error
|
|
10583
10583
|
});
|
|
@@ -10617,7 +10617,7 @@ async function getProviderCodexCandidates(provider, requestHeaders) {
|
|
|
10617
10617
|
}
|
|
10618
10618
|
return candidates;
|
|
10619
10619
|
} catch (error) {
|
|
10620
|
-
logger$
|
|
10620
|
+
logger$9.warn("models.codex.provider_skip_error", {
|
|
10621
10621
|
provider,
|
|
10622
10622
|
error
|
|
10623
10623
|
});
|
|
@@ -12183,7 +12183,7 @@ var models = [
|
|
|
12183
12183
|
];
|
|
12184
12184
|
//#endregion
|
|
12185
12185
|
//#region src/routes/models/codex-models.ts
|
|
12186
|
-
const logger$
|
|
12186
|
+
const logger$8 = createHandlerLogger("codex-models-handler");
|
|
12187
12187
|
const CODEX_USER_AGENT_PATTERN = /^codex/iu;
|
|
12188
12188
|
const DEFAULT_REASONING_EFFORTS = [
|
|
12189
12189
|
"high",
|
|
@@ -12226,7 +12226,7 @@ async function handleCodexModelsProxy(c, resolvedProviderConfig) {
|
|
|
12226
12226
|
});
|
|
12227
12227
|
} catch (error) {
|
|
12228
12228
|
if (!isCodexCatalogTimeout(error)) throw error;
|
|
12229
|
-
logger$
|
|
12229
|
+
logger$8.warn("models.codex.catalog_timeout", { error });
|
|
12230
12230
|
catalog = { models: FALLBACK_CODEX_MODELS };
|
|
12231
12231
|
}
|
|
12232
12232
|
if (!isCodexModelsResponse(catalog)) return c.json({ error: {
|
|
@@ -12249,7 +12249,7 @@ async function handleCodexModels(c) {
|
|
|
12249
12249
|
}
|
|
12250
12250
|
async function handleMergedCodexModels(c, candidatesRequest, options = {}) {
|
|
12251
12251
|
const [upstreamCatalogResult, candidates] = await Promise.all([tryGetCodexCatalog(c), Promise.resolve(candidatesRequest).catch((error) => {
|
|
12252
|
-
logger$
|
|
12252
|
+
logger$8.warn("models.codex.candidates_error", { error });
|
|
12253
12253
|
return [];
|
|
12254
12254
|
})]);
|
|
12255
12255
|
const upstreamCatalog = upstreamCatalogResult?.catalog;
|
|
@@ -12399,17 +12399,17 @@ async function tryGetCodexCatalog(c) {
|
|
|
12399
12399
|
if (!await resolveProviderConfig("codex")) return null;
|
|
12400
12400
|
const response = await forwardCodexModels(c.req.url, c.req.raw.headers);
|
|
12401
12401
|
if (!response.ok) {
|
|
12402
|
-
logger$
|
|
12402
|
+
logger$8.warn("models.codex.catalog_fallback", { statusCode: response.status });
|
|
12403
12403
|
return null;
|
|
12404
12404
|
}
|
|
12405
12405
|
const body = await response.json();
|
|
12406
12406
|
if (!isCodexModelsResponse(body)) {
|
|
12407
|
-
logger$
|
|
12407
|
+
logger$8.warn("models.codex.catalog_invalid");
|
|
12408
12408
|
return null;
|
|
12409
12409
|
}
|
|
12410
12410
|
return { catalog: body };
|
|
12411
12411
|
} catch (error) {
|
|
12412
|
-
logger$
|
|
12412
|
+
logger$8.warn("models.codex.catalog_error", { error });
|
|
12413
12413
|
return null;
|
|
12414
12414
|
}
|
|
12415
12415
|
}
|
|
@@ -12571,7 +12571,7 @@ modelRoutes.get("/", async (c) => {
|
|
|
12571
12571
|
});
|
|
12572
12572
|
//#endregion
|
|
12573
12573
|
//#region src/routes/provider/alpha-search/route.ts
|
|
12574
|
-
const logger$
|
|
12574
|
+
const logger$7 = createHandlerLogger("provider-alpha-search-handler");
|
|
12575
12575
|
const providerAlphaSearchRoutes = new Hono();
|
|
12576
12576
|
const providerAlphaSearchRouteDependencies = {
|
|
12577
12577
|
createProviderProxyResponse,
|
|
@@ -12588,19 +12588,19 @@ providerAlphaSearchRoutes.post("/", async (c) => {
|
|
|
12588
12588
|
type: "invalid_request_error"
|
|
12589
12589
|
} }, 404);
|
|
12590
12590
|
if (providerConfig.name === "codex") return await providerAlphaSearchRouteDependencies.handleAlphaSearchRequest(c, providerConfig);
|
|
12591
|
-
await debugJsonAsync(logger$
|
|
12591
|
+
await debugJsonAsync(logger$7, "provider.alpha_search.request", async () => ({
|
|
12592
12592
|
body: await c.req.raw.clone().text(),
|
|
12593
12593
|
provider
|
|
12594
12594
|
}));
|
|
12595
12595
|
const upstreamResponse = await providerAlphaSearchRouteDependencies.forwardProviderAlphaSearch(providerConfig, c.req.raw, { clientSignal: c.req.raw.signal });
|
|
12596
|
-
await debugJsonAsync(logger$
|
|
12596
|
+
await debugJsonAsync(logger$7, "provider.alpha_search.response", async () => ({
|
|
12597
12597
|
body: await upstreamResponse.clone().text(),
|
|
12598
12598
|
provider,
|
|
12599
12599
|
statusCode: upstreamResponse.status
|
|
12600
12600
|
}));
|
|
12601
12601
|
return providerAlphaSearchRouteDependencies.createProviderProxyResponse(upstreamResponse);
|
|
12602
12602
|
} catch (error) {
|
|
12603
|
-
logger$
|
|
12603
|
+
logger$7.error("provider.alpha_search.error", {
|
|
12604
12604
|
provider,
|
|
12605
12605
|
error
|
|
12606
12606
|
});
|
|
@@ -12609,7 +12609,7 @@ providerAlphaSearchRoutes.post("/", async (c) => {
|
|
|
12609
12609
|
});
|
|
12610
12610
|
//#endregion
|
|
12611
12611
|
//#region src/routes/provider/images/route.ts
|
|
12612
|
-
const logger$
|
|
12612
|
+
const logger$6 = createHandlerLogger("provider-images-handler");
|
|
12613
12613
|
const providerImageRoutes = new Hono();
|
|
12614
12614
|
async function handleProviderImages(c, operation) {
|
|
12615
12615
|
const provider = c.req.param("provider") ?? "";
|
|
@@ -12621,11 +12621,11 @@ async function handleProviderImages(c, operation) {
|
|
|
12621
12621
|
} }, 404);
|
|
12622
12622
|
if (providerConfig.name === "codex") return await handleCodexImages(c, operation, providerConfig);
|
|
12623
12623
|
return await forwardProviderImagesWithLogging(providerConfig, c.req.raw, operation, {
|
|
12624
|
-
logger: logger$
|
|
12624
|
+
logger: logger$6,
|
|
12625
12625
|
provider
|
|
12626
12626
|
});
|
|
12627
12627
|
} catch (error) {
|
|
12628
|
-
logger$
|
|
12628
|
+
logger$6.error(`provider.images.${operation}.error`, {
|
|
12629
12629
|
provider,
|
|
12630
12630
|
error
|
|
12631
12631
|
});
|
|
@@ -12653,7 +12653,7 @@ providerMessageRoutes.post("/count_tokens", async (c) => {
|
|
|
12653
12653
|
});
|
|
12654
12654
|
//#endregion
|
|
12655
12655
|
//#region src/routes/provider/models/route.ts
|
|
12656
|
-
const logger$
|
|
12656
|
+
const logger$5 = createHandlerLogger("provider-models-handler");
|
|
12657
12657
|
const providerModelRoutes = new Hono();
|
|
12658
12658
|
providerModelRoutes.get("/", async (c) => {
|
|
12659
12659
|
const provider = c.req.param("provider") ?? "";
|
|
@@ -12685,7 +12685,7 @@ providerModelRoutes.get("/", async (c) => {
|
|
|
12685
12685
|
});
|
|
12686
12686
|
}
|
|
12687
12687
|
const upstreamResponse = await forwardProviderModels(providerConfig, c.req.raw.headers);
|
|
12688
|
-
logger$
|
|
12688
|
+
logger$5.debug("provider.models.response", {
|
|
12689
12689
|
provider,
|
|
12690
12690
|
statusCode: upstreamResponse.status
|
|
12691
12691
|
});
|
|
@@ -12708,7 +12708,7 @@ providerModelRoutes.get("/", async (c) => {
|
|
|
12708
12708
|
}
|
|
12709
12709
|
return createProviderProxyResponse(upstreamResponse);
|
|
12710
12710
|
} catch (error) {
|
|
12711
|
-
logger$
|
|
12711
|
+
logger$5.error("provider.models.error", {
|
|
12712
12712
|
provider,
|
|
12713
12713
|
error
|
|
12714
12714
|
});
|
|
@@ -13581,7 +13581,7 @@ function parseAnthropicEvent(data) {
|
|
|
13581
13581
|
}
|
|
13582
13582
|
//#endregion
|
|
13583
13583
|
//#region src/routes/responses/messages-handler.ts
|
|
13584
|
-
const logger$
|
|
13584
|
+
const logger$4 = createHandlerLogger("responses-messages-handler");
|
|
13585
13585
|
const responsesMessagesDependencies = { handleCompletionPayload };
|
|
13586
13586
|
async function handleResponsesViaMessages(c, options) {
|
|
13587
13587
|
try {
|
|
@@ -13595,7 +13595,7 @@ async function handleResponsesViaMessages(c, options) {
|
|
|
13595
13595
|
toolCallTips: isCodexUserAgent(c.req.header("user-agent"))
|
|
13596
13596
|
});
|
|
13597
13597
|
const context = translation;
|
|
13598
|
-
debugJson(logger$
|
|
13598
|
+
debugJson(logger$4, "Translated Messages request:", {
|
|
13599
13599
|
payload: translation.messagesPayload,
|
|
13600
13600
|
publicModel: options.publicModel,
|
|
13601
13601
|
targetModel: options.targetModel,
|
|
@@ -13619,7 +13619,7 @@ async function handleResponsesViaMessages(c, options) {
|
|
|
13619
13619
|
const body = await messagesResponse.json();
|
|
13620
13620
|
if (!isAnthropicResponse(body)) throw new ResponsesMessagesTranslationError("Messages API returned an invalid response body", 502);
|
|
13621
13621
|
const result = translateAnthropicToResponses(body, context);
|
|
13622
|
-
debugJson(logger$
|
|
13622
|
+
debugJson(logger$4, "Translated Responses result:", result);
|
|
13623
13623
|
if (!translation.messagesPayload.stream) return c.json(result);
|
|
13624
13624
|
return streamSSE(c, async (stream) => {
|
|
13625
13625
|
for (const event of responsesResultToStreamEvents(result)) await writeSSEIfConnected(stream, {
|
|
@@ -13638,7 +13638,7 @@ async function handleResponsesViaMessages(c, options) {
|
|
|
13638
13638
|
function streamTranslatedMessagesEvents(c, response, context) {
|
|
13639
13639
|
return streamSSE(c, async (stream) => {
|
|
13640
13640
|
for await (const event of translateMessagesStream(events(response), context)) {
|
|
13641
|
-
debugJson(logger$
|
|
13641
|
+
debugJson(logger$4, "Translated Responses stream event:", event);
|
|
13642
13642
|
await writeSSEIfConnected(stream, {
|
|
13643
13643
|
event: event.type,
|
|
13644
13644
|
data: JSON.stringify(event)
|
|
@@ -13665,14 +13665,14 @@ const getCodexTaskTitleModel = (userAgent, input, provider) => {
|
|
|
13665
13665
|
};
|
|
13666
13666
|
//#endregion
|
|
13667
13667
|
//#region src/routes/provider/responses/handler.ts
|
|
13668
|
-
const logger$
|
|
13668
|
+
const logger$3 = createHandlerLogger("provider-responses-handler");
|
|
13669
13669
|
const providerResponsesHandlerDependencies = { resolveProviderConfig };
|
|
13670
13670
|
async function handleProviderResponsesForProvider(c, options) {
|
|
13671
13671
|
const { payload, provider } = options;
|
|
13672
13672
|
const taskTitleModel = getCodexTaskTitleModel(c.req.header("user-agent"), payload.input, provider);
|
|
13673
13673
|
if (taskTitleModel) payload.model = taskTitleModel;
|
|
13674
13674
|
const publicModel = taskTitleModel ?? options.publicModel ?? payload.model;
|
|
13675
|
-
debugJson(logger$
|
|
13675
|
+
debugJson(logger$3, "Responses request payload:", {
|
|
13676
13676
|
payload,
|
|
13677
13677
|
provider
|
|
13678
13678
|
});
|
|
@@ -13684,7 +13684,7 @@ async function handleProviderResponsesForProvider(c, options) {
|
|
|
13684
13684
|
} }, 400);
|
|
13685
13685
|
const effectiveType = providerConfig.type;
|
|
13686
13686
|
const normalizedReasoningEffort = normalizeProviderResponsesReasoningEffort(payload, providerConfig);
|
|
13687
|
-
if (normalizedReasoningEffort) logger$
|
|
13687
|
+
if (normalizedReasoningEffort) logger$3.debug(`Normalized reasoning effort from ${normalizedReasoningEffort.from} to ${normalizedReasoningEffort.to} based on the provider model configuration`);
|
|
13688
13688
|
if (shouldFallbackToMessages$1(c, payload.model, effectiveType)) {
|
|
13689
13689
|
filterReasoningForTransport(payload, true);
|
|
13690
13690
|
return await handleResponsesViaMessages(c, {
|
|
@@ -13703,7 +13703,7 @@ async function handleProviderResponsesForProvider(c, options) {
|
|
|
13703
13703
|
compactThresholdRatio: .8,
|
|
13704
13704
|
source: "responses"
|
|
13705
13705
|
})) compactInputByLatestCompaction(payload);
|
|
13706
|
-
debugJson(logger$
|
|
13706
|
+
debugJson(logger$3, "Translated Responses request payload:", {
|
|
13707
13707
|
contextManagement: payload.context_management,
|
|
13708
13708
|
provider
|
|
13709
13709
|
});
|
|
@@ -13777,7 +13777,7 @@ const streamProviderResponses = async (c, upstreamResponse, options) => {
|
|
|
13777
13777
|
return streamSSE(c, async (stream) => {
|
|
13778
13778
|
let usage = {};
|
|
13779
13779
|
const writeChunk = async (chunk) => {
|
|
13780
|
-
debugJson(logger$
|
|
13780
|
+
debugJson(logger$3, "Responses stream chunk:", chunk);
|
|
13781
13781
|
let responseChunk = chunk;
|
|
13782
13782
|
let event = null;
|
|
13783
13783
|
if (chunk.data && chunk.data !== "[DONE]") {
|
|
@@ -13815,7 +13815,7 @@ const parseProviderResponsesStreamEvent = (data, options) => {
|
|
|
13815
13815
|
if (options.normalizeCodex) logCodexRateLimitsEvent(parsed);
|
|
13816
13816
|
return parsed;
|
|
13817
13817
|
} catch (error) {
|
|
13818
|
-
logger$
|
|
13818
|
+
logger$3.error("provider.responses.parse_chunk_error", {
|
|
13819
13819
|
provider: options.provider,
|
|
13820
13820
|
data,
|
|
13821
13821
|
error
|
|
@@ -13881,7 +13881,7 @@ const handleItemId = (parsed, tracker) => {
|
|
|
13881
13881
|
};
|
|
13882
13882
|
//#endregion
|
|
13883
13883
|
//#region src/routes/responses/handler.ts
|
|
13884
|
-
const logger$
|
|
13884
|
+
const logger$2 = createHandlerLogger("responses-handler");
|
|
13885
13885
|
const responsesHandlerDependencies = {
|
|
13886
13886
|
createResponses,
|
|
13887
13887
|
findEndpointModel,
|
|
@@ -13905,7 +13905,7 @@ const handleResponses = async (c) => {
|
|
|
13905
13905
|
const taskTitleModel = getCodexTaskTitleModel(c.req.header("user-agent"), payload.input, "copilot");
|
|
13906
13906
|
if (taskTitleModel) payload.model = taskTitleModel;
|
|
13907
13907
|
const publicModel = taskTitleModel ?? requestedModel;
|
|
13908
|
-
debugJson(logger$
|
|
13908
|
+
debugJson(logger$2, "Responses request payload:", payload);
|
|
13909
13909
|
const store = requestContext.getStore();
|
|
13910
13910
|
const rootSessionId = store?.rootSessionId;
|
|
13911
13911
|
const sessionAffinity = store?.sessionAffinity;
|
|
@@ -13913,16 +13913,16 @@ const handleResponses = async (c) => {
|
|
|
13913
13913
|
rootSessionId,
|
|
13914
13914
|
sessionAffinity
|
|
13915
13915
|
});
|
|
13916
|
-
if (subagentMarker) debugJson(logger$
|
|
13916
|
+
if (subagentMarker) debugJson(logger$2, "Detected Codex subagent headers:", subagentMarker);
|
|
13917
13917
|
const sessionId = rootSessionId ? getUUID(rootSessionId) : void 0;
|
|
13918
13918
|
const requestId = sessionAffinity ? getUUID(sessionAffinity + "_") : generateRequestIdFromPayload({ messages: payload.input }, sessionId);
|
|
13919
|
-
logger$
|
|
13919
|
+
logger$2.debug("Generated request ID:", requestId);
|
|
13920
13920
|
const fallbackSessionId = sessionId ?? getUUID(requestId);
|
|
13921
|
-
logger$
|
|
13921
|
+
logger$2.debug("Extracted session ID:", fallbackSessionId);
|
|
13922
13922
|
const selectedModel = responsesHandlerDependencies.findEndpointModel(payload.model);
|
|
13923
13923
|
payload.model = selectedModel?.id ?? payload.model;
|
|
13924
13924
|
const normalizedReasoningEffort = normalizeResponsesReasoningEffort(payload, selectedModel?.capabilities?.supports?.reasoning_effort);
|
|
13925
|
-
if (normalizedReasoningEffort) logger$
|
|
13925
|
+
if (normalizedReasoningEffort) logger$2.debug(`Normalized reasoning effort from ${normalizedReasoningEffort.from} to ${normalizedReasoningEffort.to} based on the selected model capabilities`);
|
|
13926
13926
|
const responsesTransport = getResponsesTransportForModel(selectedModel);
|
|
13927
13927
|
if (shouldFallbackToMessages(c, payload.model, selectedModel, responsesTransport)) {
|
|
13928
13928
|
filterReasoningForTransport(payload, true);
|
|
@@ -13946,22 +13946,22 @@ const handleResponses = async (c) => {
|
|
|
13946
13946
|
model: payload.model
|
|
13947
13947
|
});
|
|
13948
13948
|
const normalizedAgentMessageCount = normalizeGuardianAgentMessages(payload);
|
|
13949
|
-
if (normalizedAgentMessageCount > 0) logger$
|
|
13949
|
+
if (normalizedAgentMessageCount > 0) logger$2.debug(`Translated ${normalizedAgentMessageCount} Guardian agent message(s) to user messages before forwarding to Copilot Responses`);
|
|
13950
13950
|
const sanitizedUnsupportedFieldCount = sanitizeUnsupportedInputFields(payload);
|
|
13951
|
-
if (sanitizedUnsupportedFieldCount > 0) logger$
|
|
13951
|
+
if (sanitizedUnsupportedFieldCount > 0) logger$2.debug(`Removed ${sanitizedUnsupportedFieldCount} unsupported input field(s) before forwarding to Copilot Responses`);
|
|
13952
13952
|
const normalizedImageDetailCount = normalizeInputImageDetails(payload);
|
|
13953
|
-
if (normalizedImageDetailCount > 0) logger$
|
|
13953
|
+
if (normalizedImageDetailCount > 0) logger$2.debug(`Normalized ${normalizedImageDetailCount} unsupported input image detail value(s) before forwarding to Copilot Responses`);
|
|
13954
13954
|
removeUnsupportedTools(payload);
|
|
13955
13955
|
fillEmptyNamespaceToolDescriptions(payload);
|
|
13956
13956
|
if (!responsesHandlerDependencies.isResponsesApiWebSearchEnabled()) removeWebSearchTool(payload);
|
|
13957
13957
|
const sanitizedImageCount = sanitizeOversizedInputImages(payload, selectedModel?.capabilities.limits.vision?.max_prompt_image_size);
|
|
13958
|
-
if (sanitizedImageCount > 0) logger$
|
|
13958
|
+
if (sanitizedImageCount > 0) logger$2.warn(`Omitted ${sanitizedImageCount} oversized input image(s) before forwarding to Copilot Responses`);
|
|
13959
13959
|
const maxPromptTokens = selectedModel?.capabilities.limits.max_prompt_tokens;
|
|
13960
13960
|
if (applyResponsesApiContextManagement(payload, maxPromptTokens, {
|
|
13961
13961
|
compactThresholdRatio: .8,
|
|
13962
13962
|
source: "responses"
|
|
13963
13963
|
})) compactInputByLatestCompaction(payload);
|
|
13964
|
-
debugJson(logger$
|
|
13964
|
+
debugJson(logger$2, "Translated Responses payload:", payload);
|
|
13965
13965
|
const { vision, initiator: inferredInitiator } = getResponsesRequestOptions(payload);
|
|
13966
13966
|
const initiator = subagentMarker ? "agent" : inferredInitiator;
|
|
13967
13967
|
const response = await responsesHandlerDependencies.createResponses(payload, {
|
|
@@ -13974,14 +13974,14 @@ const handleResponses = async (c) => {
|
|
|
13974
13974
|
transport: responsesTransport
|
|
13975
13975
|
});
|
|
13976
13976
|
if (isStreamingRequested(payload) && isAsyncIterable(response)) {
|
|
13977
|
-
logger$
|
|
13977
|
+
logger$2.debug("Forwarding native Responses stream");
|
|
13978
13978
|
return streamSSE(c, async (stream) => {
|
|
13979
13979
|
const idTracker = createStreamIdTracker();
|
|
13980
13980
|
let usage = {};
|
|
13981
13981
|
const iterator = response[Symbol.asyncIterator]();
|
|
13982
13982
|
try {
|
|
13983
13983
|
for await (const chunk of { [Symbol.asyncIterator]: () => iterator }) {
|
|
13984
|
-
debugJson(logger$
|
|
13984
|
+
debugJson(logger$2, "Responses stream chunk:", chunk);
|
|
13985
13985
|
const parsedEvent = parseResponsesStreamEvent(chunk);
|
|
13986
13986
|
if (parsedEvent?.type === "response.completed" || parsedEvent?.type === "response.failed" || parsedEvent?.type === "response.incomplete") usage = {
|
|
13987
13987
|
...normalizeResponsesUsage(parsedEvent.response.usage),
|
|
@@ -14000,7 +14000,7 @@ const handleResponses = async (c) => {
|
|
|
14000
14000
|
}
|
|
14001
14001
|
});
|
|
14002
14002
|
}
|
|
14003
|
-
debugJsonTail(logger$
|
|
14003
|
+
debugJsonTail(logger$2, "Forwarding native Responses result:", {
|
|
14004
14004
|
value: response,
|
|
14005
14005
|
tailLength: 400
|
|
14006
14006
|
});
|
|
@@ -14048,7 +14048,7 @@ const removeUnsupportedTools = (payload) => {
|
|
|
14048
14048
|
}
|
|
14049
14049
|
return true;
|
|
14050
14050
|
});
|
|
14051
|
-
if (dropped.length > 0) logger$
|
|
14051
|
+
if (dropped.length > 0) logger$2.debug("Removed unsupported tools:", dropped);
|
|
14052
14052
|
};
|
|
14053
14053
|
const fillEmptyNamespaceToolDescriptions = (payload) => {
|
|
14054
14054
|
fillEmptyNamespaceDescriptions(payload.tools);
|
|
@@ -14152,6 +14152,90 @@ usageRoute.get("/", async (c) => {
|
|
|
14152
14152
|
}
|
|
14153
14153
|
});
|
|
14154
14154
|
//#endregion
|
|
14155
|
+
//#region src/services/xai/videos.ts
|
|
14156
|
+
var XaiVideosRequestError = class extends Error {
|
|
14157
|
+
constructor(message) {
|
|
14158
|
+
super(message);
|
|
14159
|
+
this.name = "XaiVideosRequestError";
|
|
14160
|
+
}
|
|
14161
|
+
};
|
|
14162
|
+
function encodeRequestId(requestId) {
|
|
14163
|
+
if (!requestId.trim() || requestId === "." || requestId === ".." || /[/\\]/u.test(requestId)) throw new XaiVideosRequestError("request_id must be a single path segment");
|
|
14164
|
+
return encodeURIComponent(requestId);
|
|
14165
|
+
}
|
|
14166
|
+
/** Submits or queries a native xAI video job without polling or retrying. */
|
|
14167
|
+
async function forwardXaiVideos(providerConfig, request, videoRequest) {
|
|
14168
|
+
const endpoint = videoRequest.operation === "generations" ? "videos/generations" : `videos/${encodeRequestId(videoRequest.requestId)}`;
|
|
14169
|
+
const upstreamUrl = new URL(resolveProviderEndpointUrl(providerConfig, endpoint));
|
|
14170
|
+
upstreamUrl.search = new URL(request.url).search;
|
|
14171
|
+
const headers = buildProviderUpstreamHeaders(providerConfig, request.headers);
|
|
14172
|
+
const transport = getUpstreamTransportConfig();
|
|
14173
|
+
return await fetchUpstreamWithLifecycle(upstreamUrl, {
|
|
14174
|
+
method: videoRequest.operation === "generations" ? "POST" : "GET",
|
|
14175
|
+
headers,
|
|
14176
|
+
body: videoRequest.operation === "generations" ? JSON.stringify(videoRequest.payload) : void 0
|
|
14177
|
+
}, {
|
|
14178
|
+
clientSignal: request.signal,
|
|
14179
|
+
headersTimeoutMs: transport.headersTimeoutMs,
|
|
14180
|
+
streamInactivityTimeoutMs: transport.streamInactivityTimeoutMs
|
|
14181
|
+
});
|
|
14182
|
+
}
|
|
14183
|
+
//#endregion
|
|
14184
|
+
//#region src/routes/videos/route.ts
|
|
14185
|
+
const logger$1 = createHandlerLogger("videos-handler");
|
|
14186
|
+
const SUPPORTED_VIDEO_MODEL = "grok-imagine-video-1.5";
|
|
14187
|
+
const videoRouteDependencies = {
|
|
14188
|
+
resolveMappedModel,
|
|
14189
|
+
resolveProviderConfig
|
|
14190
|
+
};
|
|
14191
|
+
const videoRoutes = new Hono();
|
|
14192
|
+
async function parseGenerationRequest(request) {
|
|
14193
|
+
let payload;
|
|
14194
|
+
try {
|
|
14195
|
+
payload = await request.json();
|
|
14196
|
+
} catch {
|
|
14197
|
+
throw new XaiVideosRequestError("Video generation body must be JSON");
|
|
14198
|
+
}
|
|
14199
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) throw new XaiVideosRequestError("Video generation body must be a JSON object");
|
|
14200
|
+
if (!("model" in payload) || typeof payload.model !== "string" || !payload.model.trim()) throw new XaiVideosRequestError("model is required and must be a string");
|
|
14201
|
+
const mappedModel = videoRouteDependencies.resolveMappedModel(payload.model);
|
|
14202
|
+
const alias = parseProviderModelAlias(mappedModel);
|
|
14203
|
+
if (alias?.provider.toLowerCase() !== "xai" || alias.model !== SUPPORTED_VIDEO_MODEL) throw new XaiVideosRequestError(`Video generation only supports xai/${SUPPORTED_VIDEO_MODEL}`);
|
|
14204
|
+
return {
|
|
14205
|
+
operation: "generations",
|
|
14206
|
+
payload: {
|
|
14207
|
+
...payload,
|
|
14208
|
+
model: alias.model
|
|
14209
|
+
}
|
|
14210
|
+
};
|
|
14211
|
+
}
|
|
14212
|
+
async function handleVideos(c, operation) {
|
|
14213
|
+
try {
|
|
14214
|
+
c.req.raw.signal.throwIfAborted();
|
|
14215
|
+
const videoRequest = operation === "generations" ? await parseGenerationRequest(c.req.raw) : {
|
|
14216
|
+
operation: "result",
|
|
14217
|
+
requestId: c.req.param("request_id") ?? ""
|
|
14218
|
+
};
|
|
14219
|
+
const providerConfig = await videoRouteDependencies.resolveProviderConfig("xai");
|
|
14220
|
+
if (!providerConfig) return c.json({ error: {
|
|
14221
|
+
message: "Provider 'xai' not found or disabled",
|
|
14222
|
+
type: "invalid_request_error"
|
|
14223
|
+
} }, 404);
|
|
14224
|
+
const upstreamResponse = await forwardXaiVideos(providerConfig, c.req.raw, videoRequest);
|
|
14225
|
+
debugJson(logger$1, `videos.${operation}.response`, { statusCode: upstreamResponse.status });
|
|
14226
|
+
return createProviderProxyResponse(upstreamResponse);
|
|
14227
|
+
} catch (error) {
|
|
14228
|
+
if (error instanceof XaiVideosRequestError && !c.req.raw.signal.aborted) return c.json({ error: {
|
|
14229
|
+
message: error.message,
|
|
14230
|
+
type: "invalid_request_error"
|
|
14231
|
+
} }, 400);
|
|
14232
|
+
logger$1.error(`videos.${operation}.error`, { error });
|
|
14233
|
+
return await forwardError(c, error);
|
|
14234
|
+
}
|
|
14235
|
+
}
|
|
14236
|
+
videoRoutes.post("/generations", (c) => handleVideos(c, "generations"));
|
|
14237
|
+
videoRoutes.get("/:request_id", (c) => handleVideos(c, "result"));
|
|
14238
|
+
//#endregion
|
|
14155
14239
|
//#region src/server.ts
|
|
14156
14240
|
function resolveSameOriginCorsOrigin(origin, context) {
|
|
14157
14241
|
if (!origin) return null;
|
|
@@ -14197,12 +14281,14 @@ function createServer(options = {}) {
|
|
|
14197
14281
|
server.route("/responses", responsesRoutes);
|
|
14198
14282
|
server.route("/alpha/search", alphaSearchRoutes);
|
|
14199
14283
|
server.route("/images", imageRoutes);
|
|
14284
|
+
server.route("/videos", videoRoutes);
|
|
14200
14285
|
server.route("/v1/chat/completions", completionRoutes);
|
|
14201
14286
|
server.route("/v1/models", modelRoutes);
|
|
14202
14287
|
server.route("/v1/embeddings", embeddingRoutes);
|
|
14203
14288
|
server.route("/v1/responses", responsesRoutes);
|
|
14204
14289
|
server.route("/v1/alpha/search", alphaSearchRoutes);
|
|
14205
14290
|
server.route("/v1/images", imageRoutes);
|
|
14291
|
+
server.route("/v1/videos", videoRoutes);
|
|
14206
14292
|
server.route("/v1/messages", messageRoutes);
|
|
14207
14293
|
server.route("/:provider/v1/messages", providerMessageRoutes);
|
|
14208
14294
|
server.route("/:provider/v1/models", providerModelRoutes);
|
|
@@ -14219,4 +14305,4 @@ createServer();
|
|
|
14219
14305
|
//#endregion
|
|
14220
14306
|
export { createServer };
|
|
14221
14307
|
|
|
14222
|
-
//# sourceMappingURL=server-
|
|
14308
|
+
//# sourceMappingURL=server-C1Y_Wrlf.js.map
|