xiaodcs-copilot-api 2.3.9-public.1 → 2.3.9-public.3
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 +37 -40
- package/README.zh-CN.md +36 -39
- package/dist/{auth-CjmmJgDK.js → auth-BiVetBYt.js} +1 -1
- package/dist/auth-Bu4MXadr.js +2 -0
- package/dist/main.js +2 -2
- package/dist/{models-CoULksS5.js → models-YMUf33c-.js} +1 -1
- package/dist/{server-BCVUMIDI.js → server-CFQmvoAJ.js} +276 -143
- package/dist/{start-CoLFu4xs.js → start-FFVCi8su.js} +4 -4
- package/dist/{token-rjUSsykd.js → token-D9svRIYW.js} +73 -453
- package/package.json +4 -3
- package/dist/auth-GVwXd8KL.js +0 -2
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { A as isResponsesApiWebSearchEnabled, C as getClaudeTokenMultiplier, D as isAlphaSearchCodexPriorityEnabled, E as getResponsesTransportConfig, O as isMessagesApiEnabled, P as PATHS, S as getClaudeAutoModel, T as getMessageApiWebSearchModel, _ as resolveMappedModel, b as getAlphaSearchModel, d as getModelResponsesApiCompactThreshold$1, f as getReasoningEffortForModel, g as isGpt56OrAbove, h as isContextManagementEnabledForResponses, i as listEnabledProviders, j as isResponsesApiWebSocketEnabled, k as isResponsesApiCompactionRecoveryEnabled, l as getExtraPromptForModel, m as isContextManagementEnabledForMessages, n as getRawProviderConfig, o as resolveEffectiveProviderType, p as getSmallModel, s as resolveProviderAuthType, t as getProviderConfig, u as getModelMappings, v as setModelMappings, x as getAnthropicApiKey } from "./config-SytZjLq8.js";
|
|
2
|
-
import {
|
|
2
|
+
import { B as fetchResponsesWithLifecycle, C as compactAutoContinuePromptStarts, D as compactTextOnlyGuard, E as compactSystemPromptStarts, F as forwardCodexResponses, G as createWebSocketUrl, H as encodePoolKeyPart, I as generateTraceId, J as forwardError, K as state, L as requestContext, N as CODEX_API_BASE_URL, O as createAuthMiddleware, P as buildCodexRequestHeaders, R as resolveTraceId$1, U as isTerminalResponsesStreamChunk, V as createResponsesSafeStream, W as createPooledWebSocketStream, b as prepareInteractionHeaders, c as getUUID, d as isResponsesStream$1, f as parseUserIdMetadata, g as copilotHeaders, h as copilotBaseUrl, k as getConfiguredAdminApiKeys, l as isAsyncIterable, o as generateRequestIdFromPayload, p as getCopilotUsage, q as HTTPError, r as setupCodexToken, s as getRootSessionId, u as isNullish, v as copilotWebSocketHeaders, w as compactMessageSections, x as prepareMessageProxyHeaders, y as prepareForCompact, z as createResponsesHttpEventStream } from "./token-D9svRIYW.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-Ds1vbmGG.js";
|
|
4
|
-
import { i as toClientModelId, r as normalizeSdkModelId, t as findEndpointModel } from "./models-
|
|
4
|
+
import { i as toClientModelId, r as normalizeSdkModelId, t as findEndpointModel } from "./models-YMUf33c-.js";
|
|
5
5
|
import consola from "consola";
|
|
6
6
|
import { createHash, randomUUID } from "node:crypto";
|
|
7
7
|
import fs, { readFileSync } from "node:fs";
|
|
8
8
|
import path from "node:path";
|
|
9
9
|
import fs$1 from "node:fs/promises";
|
|
10
|
-
import "undici";
|
|
10
|
+
import { fetch as fetch$1, getGlobalDispatcher } from "undici";
|
|
11
11
|
import { events } from "fetch-event-stream";
|
|
12
12
|
import { z } from "zod";
|
|
13
13
|
import { Hono } from "hono";
|
|
@@ -2630,12 +2630,12 @@ var ResponsesCompactionRecovery = class {
|
|
|
2630
2630
|
if (this.shutdownController.signal.aborted) abortRequest();
|
|
2631
2631
|
let response;
|
|
2632
2632
|
try {
|
|
2633
|
-
response = await
|
|
2633
|
+
response = await this.fetcher(`${copilotBaseUrl(state)}/responses`, {
|
|
2634
2634
|
body: prepared.body,
|
|
2635
2635
|
headers,
|
|
2636
2636
|
method: "POST",
|
|
2637
2637
|
signal: requestController.signal
|
|
2638
|
-
})
|
|
2638
|
+
});
|
|
2639
2639
|
} finally {
|
|
2640
2640
|
clearTimeout(timeout);
|
|
2641
2641
|
this.shutdownController.signal.removeEventListener("abort", abortRequest);
|
|
@@ -2986,12 +2986,11 @@ const createResponses = async (payload, { vision, initiator, subagentMarker, req
|
|
|
2986
2986
|
consola.log(`<-- model: ${payload.model}`);
|
|
2987
2987
|
const effectiveTransport = effectiveCompactType === 1 ? "http" : transport;
|
|
2988
2988
|
if (payload.stream === true && effectiveTransport === "websocket") {
|
|
2989
|
-
const
|
|
2989
|
+
const stream = createPooledResponsesWebSocketStream(prepareResponsesWebSocketRequest(payload, headers, {
|
|
2990
2990
|
requestId,
|
|
2991
2991
|
signal,
|
|
2992
2992
|
subagentMarker
|
|
2993
|
-
});
|
|
2994
|
-
const stream = await withModelTrafficControl(() => createPooledResponsesWebSocketStream(websocketRequest), signal);
|
|
2993
|
+
}));
|
|
2995
2994
|
return compactionRecoveryEnabled ? createResponsesDependencies.recovery.observeStream(stream, {
|
|
2996
2995
|
payload,
|
|
2997
2996
|
sessionId,
|
|
@@ -3046,7 +3045,7 @@ const observeCompactionRecoveryResponse = (response, context) => {
|
|
|
3046
3045
|
return response;
|
|
3047
3046
|
};
|
|
3048
3047
|
const isResponsesStream = (response) => typeof response[Symbol.asyncIterator] === "function";
|
|
3049
|
-
const createHttpResponses = async (payload, headers, body, signal) =>
|
|
3048
|
+
const createHttpResponses = async (payload, headers, body, signal) => {
|
|
3050
3049
|
const transportConfig = getResponsesTransportConfig();
|
|
3051
3050
|
const response = await fetchResponsesWithLifecycle(`${copilotBaseUrl(state)}/responses`, {
|
|
3052
3051
|
method: "POST",
|
|
@@ -3064,7 +3063,7 @@ const createHttpResponses = async (payload, headers, body, signal) => await with
|
|
|
3064
3063
|
}
|
|
3065
3064
|
if (payload.stream) return createResponsesSafeStream(createResponsesHttpEventStream(response, signal), { signal });
|
|
3066
3065
|
return await response.json();
|
|
3067
|
-
}
|
|
3066
|
+
};
|
|
3068
3067
|
const prepareResponsesWebSocketRequest = (payload, preparedHeaders, options) => {
|
|
3069
3068
|
const initiator = getResponsesWebSocketInitiator(preparedHeaders);
|
|
3070
3069
|
return {
|
|
@@ -3145,6 +3144,20 @@ const createResponsesWebSocketStreamChunk = (data) => {
|
|
|
3145
3144
|
}
|
|
3146
3145
|
};
|
|
3147
3146
|
//#endregion
|
|
3147
|
+
//#region src/lib/timeout-dispatcher.ts
|
|
3148
|
+
/**
|
|
3149
|
+
* Node's global fetch keeps Undici's shorter default headers/body timeouts.
|
|
3150
|
+
* Wrap the global dispatcher so long-running requests (e.g. image
|
|
3151
|
+
* generation) get an explicit cap.
|
|
3152
|
+
*/
|
|
3153
|
+
const createTimeoutDispatcher = (timeoutMs) => ({ dispatch(options, handler) {
|
|
3154
|
+
return getGlobalDispatcher().dispatch({
|
|
3155
|
+
...options,
|
|
3156
|
+
bodyTimeout: timeoutMs,
|
|
3157
|
+
headersTimeout: timeoutMs
|
|
3158
|
+
}, handler);
|
|
3159
|
+
} });
|
|
3160
|
+
//#endregion
|
|
3148
3161
|
//#region src/services/providers/provider-proxy.ts
|
|
3149
3162
|
const SHARED_FORWARDABLE_HEADERS = ["accept", "user-agent"];
|
|
3150
3163
|
const ANTHROPIC_FORWARDABLE_HEADERS = ["anthropic-version", "anthropic-beta"];
|
|
@@ -3189,28 +3202,26 @@ function createProviderProxyResponse(upstreamResponse, body) {
|
|
|
3189
3202
|
statusText: upstreamResponse.statusText
|
|
3190
3203
|
});
|
|
3191
3204
|
}
|
|
3192
|
-
async function forwardProviderMessages(providerConfig, payload, requestHeaders
|
|
3205
|
+
async function forwardProviderMessages(providerConfig, payload, requestHeaders) {
|
|
3193
3206
|
consola.log(`<-- model: ${payload.model}`);
|
|
3194
|
-
return await
|
|
3207
|
+
return await fetch(`${providerConfig.baseUrl}/v1/messages`, {
|
|
3195
3208
|
method: "POST",
|
|
3196
3209
|
headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),
|
|
3197
|
-
body: JSON.stringify(payload)
|
|
3198
|
-
|
|
3199
|
-
}), options.signal);
|
|
3210
|
+
body: JSON.stringify(payload)
|
|
3211
|
+
});
|
|
3200
3212
|
}
|
|
3201
|
-
async function forwardProviderChatCompletions(providerConfig, payload, requestHeaders
|
|
3213
|
+
async function forwardProviderChatCompletions(providerConfig, payload, requestHeaders) {
|
|
3202
3214
|
consola.log(`<-- model: ${payload.model}`);
|
|
3203
|
-
return await
|
|
3215
|
+
return await fetch(`${providerConfig.baseUrl}/v1/chat/completions`, {
|
|
3204
3216
|
method: "POST",
|
|
3205
3217
|
headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),
|
|
3206
|
-
body: JSON.stringify(payload)
|
|
3207
|
-
|
|
3208
|
-
}), options.signal);
|
|
3218
|
+
body: JSON.stringify(payload)
|
|
3219
|
+
});
|
|
3209
3220
|
}
|
|
3210
3221
|
async function forwardProviderResponses(providerConfig, payload, requestHeaders, options = {}) {
|
|
3211
3222
|
consola.log(`<-- model: ${payload.model}`);
|
|
3212
3223
|
const transportConfig = getResponsesTransportConfig();
|
|
3213
|
-
return await
|
|
3224
|
+
return await fetchResponsesWithLifecycle(`${providerConfig.baseUrl}/v1/responses`, {
|
|
3214
3225
|
method: "POST",
|
|
3215
3226
|
headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),
|
|
3216
3227
|
body: JSON.stringify(payload)
|
|
@@ -3218,7 +3229,7 @@ async function forwardProviderResponses(providerConfig, payload, requestHeaders,
|
|
|
3218
3229
|
headersTimeoutMs: transportConfig.headersTimeoutMs,
|
|
3219
3230
|
signal: options.signal,
|
|
3220
3231
|
streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
|
|
3221
|
-
})
|
|
3232
|
+
});
|
|
3222
3233
|
}
|
|
3223
3234
|
const PROVIDER_MODELS_TIMEOUT_MS = 15e3;
|
|
3224
3235
|
async function forwardProviderModels(providerConfig, requestHeaders) {
|
|
@@ -3228,6 +3239,9 @@ async function forwardProviderModels(providerConfig, requestHeaders) {
|
|
|
3228
3239
|
signal: AbortSignal.timeout(PROVIDER_MODELS_TIMEOUT_MS)
|
|
3229
3240
|
});
|
|
3230
3241
|
}
|
|
3242
|
+
/** Align with Codex images: long-running generation/edits need a generous cap. */
|
|
3243
|
+
const PROVIDER_IMAGES_TIMEOUT_MS = 900 * 1e3;
|
|
3244
|
+
const providerImagesDispatcher = createTimeoutDispatcher(PROVIDER_IMAGES_TIMEOUT_MS);
|
|
3231
3245
|
function resolveProviderRequestUrl(providerConfig, requestUrl, path) {
|
|
3232
3246
|
const upstreamUrl = new URL(`${providerConfig.baseUrl}${path}`);
|
|
3233
3247
|
upstreamUrl.search = new URL(requestUrl, "http://localhost").search;
|
|
@@ -3236,16 +3250,34 @@ function resolveProviderRequestUrl(providerConfig, requestUrl, path) {
|
|
|
3236
3250
|
async function forwardProviderAlphaSearch(providerConfig, request) {
|
|
3237
3251
|
const headers = buildProviderUpstreamHeaders(providerConfig, request.headers);
|
|
3238
3252
|
const body = await request.arrayBuffer();
|
|
3239
|
-
return await
|
|
3253
|
+
return await fetch(resolveProviderRequestUrl(providerConfig, request.url, "/v1/alpha/search"), {
|
|
3240
3254
|
method: "POST",
|
|
3241
3255
|
headers,
|
|
3242
|
-
body
|
|
3243
|
-
|
|
3244
|
-
|
|
3256
|
+
body
|
|
3257
|
+
});
|
|
3258
|
+
}
|
|
3259
|
+
async function forwardProviderImages(providerConfig, request, operation) {
|
|
3260
|
+
const headers = buildProviderUpstreamHeaders(providerConfig, request.headers);
|
|
3261
|
+
const contentType = request.headers.get("content-type");
|
|
3262
|
+
if (contentType) headers["content-type"] = contentType;
|
|
3263
|
+
else if (operation === "edits") delete headers["content-type"];
|
|
3264
|
+
const init = {
|
|
3265
|
+
method: "POST",
|
|
3266
|
+
headers,
|
|
3267
|
+
body: request.body,
|
|
3268
|
+
duplex: "half",
|
|
3269
|
+
signal: AbortSignal.timeout(PROVIDER_IMAGES_TIMEOUT_MS)
|
|
3270
|
+
};
|
|
3271
|
+
const upstreamUrl = resolveProviderRequestUrl(providerConfig, request.url, `/v1/images/${operation}`);
|
|
3272
|
+
if (typeof Bun !== "undefined") return await fetch(upstreamUrl, init);
|
|
3273
|
+
return await fetch$1(upstreamUrl, {
|
|
3274
|
+
...init,
|
|
3275
|
+
dispatcher: providerImagesDispatcher
|
|
3276
|
+
});
|
|
3245
3277
|
}
|
|
3246
3278
|
//#endregion
|
|
3247
3279
|
//#region src/routes/alpha-search/alpha-search-responses.ts
|
|
3248
|
-
const logger$
|
|
3280
|
+
const logger$16 = createHandlerLogger("alpha-search-responses-handler");
|
|
3249
3281
|
const SESSION_TTL_MS = 3600 * 1e3;
|
|
3250
3282
|
const MAX_SESSIONS = 128;
|
|
3251
3283
|
const MAX_URL_REFERENCES = 256;
|
|
@@ -3603,14 +3635,14 @@ function createRemoteResponsesPayload(request, model, instruction) {
|
|
|
3603
3635
|
};
|
|
3604
3636
|
}
|
|
3605
3637
|
async function requestProviderSearch(c, providerConfig, payload, model, sessionId) {
|
|
3606
|
-
debugJson(logger$
|
|
3638
|
+
debugJson(logger$16, "Alpha search provider Responses request:", {
|
|
3607
3639
|
payload,
|
|
3608
3640
|
provider: providerConfig.name
|
|
3609
3641
|
});
|
|
3610
3642
|
const upstreamResponse = await forwardProviderResponses(providerConfig, payload, c.req.raw.headers, { signal: c.req.raw.signal });
|
|
3611
3643
|
if (!upstreamResponse.ok) throw new HTTPError(`Failed to create ${providerConfig.name} responses for alpha search`, upstreamResponse);
|
|
3612
3644
|
const result = await upstreamResponse.json();
|
|
3613
|
-
debugJson(logger$
|
|
3645
|
+
debugJson(logger$16, "Alpha search provider Responses result:", {
|
|
3614
3646
|
provider: providerConfig.name,
|
|
3615
3647
|
result
|
|
3616
3648
|
});
|
|
@@ -3626,7 +3658,7 @@ async function requestProviderSearch(c, providerConfig, payload, model, sessionI
|
|
|
3626
3658
|
return result;
|
|
3627
3659
|
}
|
|
3628
3660
|
async function requestCopilotSearch(payload, model, requestId, sessionId, signal) {
|
|
3629
|
-
debugJson(logger$
|
|
3661
|
+
debugJson(logger$16, "Alpha search Copilot Responses request:", payload);
|
|
3630
3662
|
const result = await alphaSearchResponsesDependencies.createResponses(payload, {
|
|
3631
3663
|
vision: false,
|
|
3632
3664
|
initiator: "agent",
|
|
@@ -3635,7 +3667,7 @@ async function requestCopilotSearch(payload, model, requestId, sessionId, signal
|
|
|
3635
3667
|
sessionId,
|
|
3636
3668
|
signal
|
|
3637
3669
|
});
|
|
3638
|
-
debugJson(logger$
|
|
3670
|
+
debugJson(logger$16, "Alpha search Copilot Responses result:", result);
|
|
3639
3671
|
alphaSearchResponsesDependencies.createUsageRecorder(model, sessionId)({
|
|
3640
3672
|
...normalizeResponsesUsage(result.usage),
|
|
3641
3673
|
total_nano_aiu: normalizeOptionalToken(result.copilot_usage?.total_nano_aiu)
|
|
@@ -3742,16 +3774,15 @@ async function forwardCodexAlphaSearch(request) {
|
|
|
3742
3774
|
if (!headers.has("accept")) headers.set("accept", "application/json");
|
|
3743
3775
|
const body = await request.arrayBuffer();
|
|
3744
3776
|
if (!headers.has("content-type")) headers.set("content-type", "application/json");
|
|
3745
|
-
return await
|
|
3777
|
+
return await fetch(resolveCodexAlphaSearchUrl(request.url), {
|
|
3746
3778
|
method: "POST",
|
|
3747
3779
|
headers,
|
|
3748
|
-
body
|
|
3749
|
-
|
|
3750
|
-
}), request.signal);
|
|
3780
|
+
body
|
|
3781
|
+
});
|
|
3751
3782
|
}
|
|
3752
3783
|
//#endregion
|
|
3753
3784
|
//#region src/routes/alpha-search/route.ts
|
|
3754
|
-
const logger$
|
|
3785
|
+
const logger$15 = createHandlerLogger("alpha-search-handler");
|
|
3755
3786
|
const alphaSearchRoutes = new Hono();
|
|
3756
3787
|
const alphaSearchRouteDependencies = {
|
|
3757
3788
|
findEndpointModel,
|
|
@@ -3771,9 +3802,9 @@ function parseDebugBody(body) {
|
|
|
3771
3802
|
}
|
|
3772
3803
|
}
|
|
3773
3804
|
async function forwardCodexAlphaSearchRequest(request) {
|
|
3774
|
-
await debugJsonAsync(logger$
|
|
3805
|
+
await debugJsonAsync(logger$15, "alpha_search.codex.request", async () => ({ body: parseDebugBody(await request.clone().text()) }));
|
|
3775
3806
|
const upstreamResponse = await alphaSearchRouteDependencies.forwardCodexAlphaSearch(request);
|
|
3776
|
-
await debugJsonAsync(logger$
|
|
3807
|
+
await debugJsonAsync(logger$15, "alpha_search.codex.response", async () => ({
|
|
3777
3808
|
body: parseDebugBody(await upstreamResponse.clone().text()),
|
|
3778
3809
|
statusCode: upstreamResponse.status
|
|
3779
3810
|
}));
|
|
@@ -3884,7 +3915,7 @@ alphaSearchRoutes.post("/", async (c) => {
|
|
|
3884
3915
|
try {
|
|
3885
3916
|
return await handleAlphaSearchRequest(c);
|
|
3886
3917
|
} catch (error) {
|
|
3887
|
-
logger$
|
|
3918
|
+
logger$15.error("alpha_search.error", { error });
|
|
3888
3919
|
return await forwardError(c, error);
|
|
3889
3920
|
}
|
|
3890
3921
|
});
|
|
@@ -4012,7 +4043,7 @@ const normalizeProviderResponsesReasoningEffort = (payload, providerConfig) => {
|
|
|
4012
4043
|
};
|
|
4013
4044
|
//#endregion
|
|
4014
4045
|
//#region src/routes/provider/chat-completions/handler.ts
|
|
4015
|
-
const logger$
|
|
4046
|
+
const logger$14 = createHandlerLogger("provider-chat-completions-handler");
|
|
4016
4047
|
async function handleProviderChatCompletionsForProvider(c, options) {
|
|
4017
4048
|
const { payload, provider } = options;
|
|
4018
4049
|
const providerConfig = await resolveProviderConfig(provider);
|
|
@@ -4026,13 +4057,13 @@ async function handleProviderChatCompletionsForProvider(c, options) {
|
|
|
4026
4057
|
applyProviderStreamOptions(payload);
|
|
4027
4058
|
applyDashScopePreserveThinkingDefault(payload, providerConfig);
|
|
4028
4059
|
applyProviderContextCache(payload, modelConfig, providerConfig);
|
|
4029
|
-
debugJson(logger$
|
|
4060
|
+
debugJson(logger$14, "provider.chat_completions.request", {
|
|
4030
4061
|
payload,
|
|
4031
4062
|
provider
|
|
4032
4063
|
});
|
|
4033
|
-
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, payload, c.req.raw.headers
|
|
4064
|
+
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, payload, c.req.raw.headers);
|
|
4034
4065
|
if (!upstreamResponse.ok) {
|
|
4035
|
-
logger$
|
|
4066
|
+
logger$14.error("Failed to create provider chat completions", {
|
|
4036
4067
|
provider,
|
|
4037
4068
|
statusCode: upstreamResponse.status
|
|
4038
4069
|
});
|
|
@@ -4046,7 +4077,7 @@ async function handleProviderChatCompletionsForProvider(c, options) {
|
|
|
4046
4077
|
});
|
|
4047
4078
|
const responseBody = await upstreamResponse.clone().json();
|
|
4048
4079
|
recordUsage(normalizeOpenAIUsage(responseBody.usage));
|
|
4049
|
-
debugJson(logger$
|
|
4080
|
+
debugJson(logger$14, "provider.chat_completions.response", responseBody);
|
|
4050
4081
|
return createProviderProxyResponse(upstreamResponse);
|
|
4051
4082
|
}
|
|
4052
4083
|
const applyProviderStreamOptions = (payload) => {
|
|
@@ -4068,12 +4099,12 @@ const createProviderChatCompletionsUsageRecorder = (payload, provider, modelConf
|
|
|
4068
4099
|
providerName: provider
|
|
4069
4100
|
});
|
|
4070
4101
|
const streamProviderChatCompletions = (c, upstreamResponse, options) => {
|
|
4071
|
-
logger$
|
|
4102
|
+
logger$14.debug("provider.chat_completions.streaming", { provider: options.provider });
|
|
4072
4103
|
return streamSSE(c, async (stream) => {
|
|
4073
4104
|
let usage = {};
|
|
4074
4105
|
try {
|
|
4075
4106
|
for await (const chunk of events(upstreamResponse)) {
|
|
4076
|
-
debugJson(logger$
|
|
4107
|
+
debugJson(logger$14, "provider.chat_completions.stream_chunk", chunk);
|
|
4077
4108
|
if (chunk.data && chunk.data !== "[DONE]") {
|
|
4078
4109
|
const parsedChunk = parseChatCompletionChunkData(chunk.data);
|
|
4079
4110
|
if (parsedChunk?.usage) usage = normalizeOpenAIUsage(parsedChunk.usage);
|
|
@@ -4097,8 +4128,7 @@ const parseChatCompletionChunkData = (data) => {
|
|
|
4097
4128
|
};
|
|
4098
4129
|
//#endregion
|
|
4099
4130
|
//#region src/services/copilot/create-chat-completions.ts
|
|
4100
|
-
const createChatCompletions = async (payload, options) =>
|
|
4101
|
-
const createChatCompletionsUpstream = async (payload, options) => {
|
|
4131
|
+
const createChatCompletions = async (payload, options) => {
|
|
4102
4132
|
if (!state.copilotToken) throw new Error("Copilot token not found");
|
|
4103
4133
|
const enableVision = payload.messages.some((x) => typeof x.content !== "string" && x.content?.some((x) => x.type === "image_url"));
|
|
4104
4134
|
let isAgentCall = false;
|
|
@@ -4116,8 +4146,7 @@ const createChatCompletionsUpstream = async (payload, options) => {
|
|
|
4116
4146
|
const response = await fetch(`${copilotBaseUrl(state)}/chat/completions`, {
|
|
4117
4147
|
method: "POST",
|
|
4118
4148
|
headers,
|
|
4119
|
-
body: JSON.stringify(payload)
|
|
4120
|
-
signal: options.signal
|
|
4149
|
+
body: JSON.stringify(payload)
|
|
4121
4150
|
});
|
|
4122
4151
|
logCopilotRateLimits(response.headers);
|
|
4123
4152
|
if (!response.ok) {
|
|
@@ -4129,7 +4158,7 @@ const createChatCompletionsUpstream = async (payload, options) => {
|
|
|
4129
4158
|
};
|
|
4130
4159
|
//#endregion
|
|
4131
4160
|
//#region src/routes/chat-completions/handler.ts
|
|
4132
|
-
const logger$
|
|
4161
|
+
const logger$13 = createHandlerLogger("chat-completions-handler");
|
|
4133
4162
|
async function handleCompletion$1(c) {
|
|
4134
4163
|
let payload = await c.req.json();
|
|
4135
4164
|
const requestedModel = payload.model;
|
|
@@ -4143,7 +4172,7 @@ async function handleCompletion$1(c) {
|
|
|
4143
4172
|
provider: providerModelAlias.provider
|
|
4144
4173
|
});
|
|
4145
4174
|
}
|
|
4146
|
-
debugJson(logger$
|
|
4175
|
+
debugJson(logger$13, "Request payload:", payload);
|
|
4147
4176
|
const selectedModel = findEndpointModel(payload.model);
|
|
4148
4177
|
payload.model = selectedModel?.id ?? payload.model;
|
|
4149
4178
|
if (isNullish(payload.max_tokens) && isNullish(payload.max_completion_tokens)) {
|
|
@@ -4151,16 +4180,16 @@ async function handleCompletion$1(c) {
|
|
|
4151
4180
|
...payload,
|
|
4152
4181
|
max_tokens: selectedModel?.capabilities.limits.max_output_tokens
|
|
4153
4182
|
};
|
|
4154
|
-
debugJson(logger$
|
|
4183
|
+
debugJson(logger$13, "Set max_tokens to:", payload.max_tokens);
|
|
4155
4184
|
}
|
|
4156
4185
|
if (payload.model.includes("gpt")) {
|
|
4157
4186
|
if (isNullish(payload.max_completion_tokens)) payload.max_completion_tokens = payload.max_tokens;
|
|
4158
4187
|
delete payload.max_tokens;
|
|
4159
4188
|
}
|
|
4160
4189
|
const requestId = generateRequestIdFromPayload(payload);
|
|
4161
|
-
logger$
|
|
4190
|
+
logger$13.debug("Generated request ID:", requestId);
|
|
4162
4191
|
const sessionId = getUUID(requestId);
|
|
4163
|
-
logger$
|
|
4192
|
+
logger$13.debug("Extracted session ID:", sessionId);
|
|
4164
4193
|
const recordUsage = createCopilotTokenUsageRecorder({
|
|
4165
4194
|
endpoint: "chat_completions",
|
|
4166
4195
|
fallbackSessionId: sessionId,
|
|
@@ -4168,22 +4197,21 @@ async function handleCompletion$1(c) {
|
|
|
4168
4197
|
});
|
|
4169
4198
|
const response = await createChatCompletions(payload, {
|
|
4170
4199
|
requestId,
|
|
4171
|
-
sessionId
|
|
4172
|
-
signal: c.req.raw.signal
|
|
4200
|
+
sessionId
|
|
4173
4201
|
});
|
|
4174
4202
|
if (isNonStreaming$1(response)) {
|
|
4175
|
-
debugJson(logger$
|
|
4203
|
+
debugJson(logger$13, "Non-streaming response:", response);
|
|
4176
4204
|
recordUsage({
|
|
4177
4205
|
...normalizeOpenAIUsage(response.usage),
|
|
4178
4206
|
total_nano_aiu: normalizeOptionalToken(response.copilot_usage?.total_nano_aiu)
|
|
4179
4207
|
});
|
|
4180
4208
|
return c.json(response);
|
|
4181
4209
|
}
|
|
4182
|
-
logger$
|
|
4210
|
+
logger$13.debug("Streaming response");
|
|
4183
4211
|
return streamSSE(c, async (stream) => {
|
|
4184
4212
|
let usage = {};
|
|
4185
4213
|
for await (const chunk of response) {
|
|
4186
|
-
debugJson(logger$
|
|
4214
|
+
debugJson(logger$13, "Streaming chunk:", chunk);
|
|
4187
4215
|
const parsedChunk = parseChatCompletionChunk(chunk);
|
|
4188
4216
|
if (parsedChunk?.usage || parsedChunk?.copilot_usage) usage = {
|
|
4189
4217
|
...normalizeOpenAIUsage(parsedChunk.usage),
|
|
@@ -4242,14 +4270,12 @@ configRoutes.post("/model-mappings", async (c) => {
|
|
|
4242
4270
|
});
|
|
4243
4271
|
//#endregion
|
|
4244
4272
|
//#region src/services/copilot/create-embeddings.ts
|
|
4245
|
-
const createEmbeddings = async (payload
|
|
4246
|
-
const createEmbeddingsUpstream = async (payload, signal) => {
|
|
4273
|
+
const createEmbeddings = async (payload) => {
|
|
4247
4274
|
if (!state.copilotToken) throw new Error("Copilot token not found");
|
|
4248
4275
|
const response = await fetch(`${copilotBaseUrl(state)}/embeddings`, {
|
|
4249
4276
|
method: "POST",
|
|
4250
4277
|
headers: copilotHeaders(state),
|
|
4251
|
-
body: JSON.stringify(payload)
|
|
4252
|
-
signal
|
|
4278
|
+
body: JSON.stringify(payload)
|
|
4253
4279
|
});
|
|
4254
4280
|
if (!response.ok) throw new HTTPError("Failed to create embeddings", response);
|
|
4255
4281
|
return await response.json();
|
|
@@ -4260,7 +4286,7 @@ const embeddingRoutes = new Hono();
|
|
|
4260
4286
|
embeddingRoutes.post("/", async (c) => {
|
|
4261
4287
|
try {
|
|
4262
4288
|
const paylod = await c.req.json();
|
|
4263
|
-
const response = await createEmbeddings(paylod
|
|
4289
|
+
const response = await createEmbeddings(paylod);
|
|
4264
4290
|
createCopilotTokenUsageRecorder({
|
|
4265
4291
|
endpoint: "embeddings",
|
|
4266
4292
|
model: paylod.model
|
|
@@ -4274,6 +4300,69 @@ embeddingRoutes.post("/", async (c) => {
|
|
|
4274
4300
|
}
|
|
4275
4301
|
});
|
|
4276
4302
|
//#endregion
|
|
4303
|
+
//#region src/services/codex/images.ts
|
|
4304
|
+
const CODEX_IMAGES_TIMEOUT_MS = 900 * 1e3;
|
|
4305
|
+
const codexImagesDispatcher = createTimeoutDispatcher(CODEX_IMAGES_TIMEOUT_MS);
|
|
4306
|
+
function resolveCodexImagesUrl(requestUrl, operation) {
|
|
4307
|
+
const upstreamUrl = new URL(`${CODEX_API_BASE_URL}/codex/images/${operation}`);
|
|
4308
|
+
upstreamUrl.search = new URL(requestUrl, "http://localhost").search;
|
|
4309
|
+
return upstreamUrl.toString();
|
|
4310
|
+
}
|
|
4311
|
+
async function forwardCodexImages(request, operation) {
|
|
4312
|
+
const headers = buildCodexRequestHeaders(request.headers);
|
|
4313
|
+
if (!headers.has("accept")) headers.set("accept", "application/json");
|
|
4314
|
+
if (operation === "generations" && !headers.has("content-type")) headers.set("content-type", "application/json");
|
|
4315
|
+
const init = {
|
|
4316
|
+
method: "POST",
|
|
4317
|
+
headers,
|
|
4318
|
+
body: request.body,
|
|
4319
|
+
duplex: "half",
|
|
4320
|
+
signal: AbortSignal.timeout(CODEX_IMAGES_TIMEOUT_MS)
|
|
4321
|
+
};
|
|
4322
|
+
const upstreamUrl = resolveCodexImagesUrl(request.url, operation);
|
|
4323
|
+
if (typeof Bun !== "undefined") return await fetch(upstreamUrl, init);
|
|
4324
|
+
return await fetch$1(upstreamUrl, {
|
|
4325
|
+
...init,
|
|
4326
|
+
dispatcher: codexImagesDispatcher
|
|
4327
|
+
});
|
|
4328
|
+
}
|
|
4329
|
+
//#endregion
|
|
4330
|
+
//#region src/routes/images/route.ts
|
|
4331
|
+
const logger$12 = createHandlerLogger("images-handler");
|
|
4332
|
+
const imageRoutes = new Hono();
|
|
4333
|
+
const imageRouteDependencies = { debugJsonAsync };
|
|
4334
|
+
function getContentMetadata$1(headers) {
|
|
4335
|
+
return {
|
|
4336
|
+
contentType: headers.get("content-type"),
|
|
4337
|
+
contentLength: headers.get("content-length")
|
|
4338
|
+
};
|
|
4339
|
+
}
|
|
4340
|
+
/**
|
|
4341
|
+
* Handles Codex images proxying. Pass `resolvedProviderConfig` when the
|
|
4342
|
+
* caller already resolved the codex provider to avoid a second resolve.
|
|
4343
|
+
*/
|
|
4344
|
+
async function handleCodexImages(c, operation, resolvedProviderConfig) {
|
|
4345
|
+
try {
|
|
4346
|
+
if (!(resolvedProviderConfig ?? await resolveProviderConfig("codex"))) return c.json({ error: {
|
|
4347
|
+
message: "Provider 'codex' not found or disabled",
|
|
4348
|
+
type: "invalid_request_error"
|
|
4349
|
+
} }, 404);
|
|
4350
|
+
if (operation === "generations") await imageRouteDependencies.debugJsonAsync(logger$12, "images.generations.codex.request", async () => ({ body: await c.req.raw.clone().text() }));
|
|
4351
|
+
else debugJson(logger$12, "images.edits.codex.request", getContentMetadata$1(c.req.raw.headers));
|
|
4352
|
+
const upstreamResponse = await forwardCodexImages(c.req.raw, operation);
|
|
4353
|
+
debugJson(logger$12, `images.${operation}.codex.response`, {
|
|
4354
|
+
...getContentMetadata$1(upstreamResponse.headers),
|
|
4355
|
+
statusCode: upstreamResponse.status
|
|
4356
|
+
});
|
|
4357
|
+
return createProviderProxyResponse(upstreamResponse);
|
|
4358
|
+
} catch (error) {
|
|
4359
|
+
logger$12.error(`images.${operation}.codex.error`, { error });
|
|
4360
|
+
return await forwardError(c, error);
|
|
4361
|
+
}
|
|
4362
|
+
}
|
|
4363
|
+
imageRoutes.post("/generations", (c) => handleCodexImages(c, "generations"));
|
|
4364
|
+
imageRoutes.post("/edits", (c) => handleCodexImages(c, "edits"));
|
|
4365
|
+
//#endregion
|
|
4277
4366
|
//#region src/lib/tokenizer.ts
|
|
4278
4367
|
const ENCODING_MAP = {
|
|
4279
4368
|
o200k_base: () => import("gpt-tokenizer/encoding/o200k_base"),
|
|
@@ -5282,7 +5371,7 @@ const prepareMessagesApiPayload = (payload, selectedModel) => {
|
|
|
5282
5371
|
};
|
|
5283
5372
|
//#endregion
|
|
5284
5373
|
//#region src/routes/provider/messages/count-tokens-handler.ts
|
|
5285
|
-
const logger$
|
|
5374
|
+
const logger$11 = createHandlerLogger("provider-count-tokens-handler");
|
|
5286
5375
|
async function handleProviderCountTokens(c) {
|
|
5287
5376
|
const provider = c.req.param("provider");
|
|
5288
5377
|
return await handleProviderCountTokensForProvider(c, {
|
|
@@ -5305,7 +5394,7 @@ async function handleProviderCountTokensForProvider(c, options) {
|
|
|
5305
5394
|
toolContentSupportType: modelConfig?.toolContentSupportType ?? []
|
|
5306
5395
|
} : void 0), createFallbackModel(modelId));
|
|
5307
5396
|
const finalTokenCount = tokenCount.input + tokenCount.output;
|
|
5308
|
-
logger$
|
|
5397
|
+
logger$11.debug("provider.count_tokens.success", {
|
|
5309
5398
|
provider,
|
|
5310
5399
|
model: anthropicPayload.model,
|
|
5311
5400
|
input_tokens: finalTokenCount
|
|
@@ -7506,7 +7595,7 @@ function getModels() {
|
|
|
7506
7595
|
}
|
|
7507
7596
|
//#endregion
|
|
7508
7597
|
//#region src/routes/provider/messages/handler.ts
|
|
7509
|
-
const logger$
|
|
7598
|
+
const logger$10 = createHandlerLogger("provider-messages-handler");
|
|
7510
7599
|
const providerMessagesHandlerDependencies = { resolveProviderConfig };
|
|
7511
7600
|
async function handleProviderMessages(c) {
|
|
7512
7601
|
const provider = c.req.param("provider");
|
|
@@ -7531,7 +7620,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
7531
7620
|
try {
|
|
7532
7621
|
const modelConfig = providerConfig.models?.[payload.model];
|
|
7533
7622
|
const effectiveType = resolveEffectiveProviderType(providerConfig, payload.model);
|
|
7534
|
-
debugJson(logger$
|
|
7623
|
+
debugJson(logger$10, "provider.messages.request", {
|
|
7535
7624
|
payload,
|
|
7536
7625
|
provider
|
|
7537
7626
|
});
|
|
@@ -7567,7 +7656,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
7567
7656
|
});
|
|
7568
7657
|
}
|
|
7569
7658
|
applyMissingExtraBody(payload, { extraBody: modelConfig?.extraBody });
|
|
7570
|
-
debugJson(logger$
|
|
7659
|
+
debugJson(logger$10, "Translated provider.messages.request", {
|
|
7571
7660
|
payload,
|
|
7572
7661
|
provider
|
|
7573
7662
|
});
|
|
@@ -7575,9 +7664,9 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
7575
7664
|
...providerConfig,
|
|
7576
7665
|
type: effectiveType,
|
|
7577
7666
|
authType: resolveProviderAuthType(providerConfig.name, void 0, effectiveType)
|
|
7578
|
-
}, payload, c.req.raw.headers
|
|
7667
|
+
}, payload, c.req.raw.headers);
|
|
7579
7668
|
if (!upstreamResponse.ok) {
|
|
7580
|
-
logger$
|
|
7669
|
+
logger$10.error("Failed to create responses", upstreamResponse);
|
|
7581
7670
|
throw new HTTPError("Failed to create responses", upstreamResponse);
|
|
7582
7671
|
}
|
|
7583
7672
|
const contentType = upstreamResponse.headers.get("content-type") ?? "";
|
|
@@ -7599,7 +7688,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
7599
7688
|
usageEndpoint
|
|
7600
7689
|
});
|
|
7601
7690
|
} catch (error) {
|
|
7602
|
-
logger$
|
|
7691
|
+
logger$10.error("provider.messages.error", {
|
|
7603
7692
|
provider,
|
|
7604
7693
|
error
|
|
7605
7694
|
});
|
|
@@ -7610,8 +7699,8 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
7610
7699
|
const { modelConfig, payload, provider, providerConfig, usageEndpoint } = options;
|
|
7611
7700
|
const responsesPayload = prepareWebSearchResponsesPayload(payload);
|
|
7612
7701
|
const normalizedReasoningEffort = normalizeProviderResponsesReasoningEffort(responsesPayload, providerConfig);
|
|
7613
|
-
if (normalizedReasoningEffort) logger$
|
|
7614
|
-
debugJson(logger$
|
|
7702
|
+
if (normalizedReasoningEffort) logger$10.debug(`Normalized reasoning effort from ${normalizedReasoningEffort.from} to ${normalizedReasoningEffort.to} based on the provider model configuration`);
|
|
7703
|
+
debugJson(logger$10, "provider.messages.responses.web_search.request", {
|
|
7615
7704
|
payload: responsesPayload,
|
|
7616
7705
|
provider
|
|
7617
7706
|
});
|
|
@@ -7622,7 +7711,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
7622
7711
|
errorMessagePrefix: `${provider} web search responses stream`,
|
|
7623
7712
|
parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
|
|
7624
7713
|
upstreamResponse,
|
|
7625
|
-
logger: logger$
|
|
7714
|
+
logger: logger$10
|
|
7626
7715
|
}),
|
|
7627
7716
|
modelConfig,
|
|
7628
7717
|
payload,
|
|
@@ -7641,7 +7730,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
7641
7730
|
}
|
|
7642
7731
|
const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers, { signal: c.req.raw.signal });
|
|
7643
7732
|
if (!upstreamResponse.ok) {
|
|
7644
|
-
logger$
|
|
7733
|
+
logger$10.error("Failed to create provider web search responses", {
|
|
7645
7734
|
provider,
|
|
7646
7735
|
upstreamResponse
|
|
7647
7736
|
});
|
|
@@ -7652,7 +7741,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
7652
7741
|
errorMessagePrefix: `${provider} web search responses stream`,
|
|
7653
7742
|
parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
|
|
7654
7743
|
upstreamResponse: createResponsesHttpEventStream(upstreamResponse, c.req.raw.signal),
|
|
7655
|
-
logger: logger$
|
|
7744
|
+
logger: logger$10
|
|
7656
7745
|
}),
|
|
7657
7746
|
modelConfig,
|
|
7658
7747
|
payload,
|
|
@@ -7675,10 +7764,10 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
7675
7764
|
const wantsStream = payload.stream === true;
|
|
7676
7765
|
const responsesPayload = translateAnthropicMessagesToResponsesPayload(payload);
|
|
7677
7766
|
const normalizedMessagesReasoningEffort = normalizeProviderResponsesReasoningEffort(responsesPayload, providerConfig);
|
|
7678
|
-
if (normalizedMessagesReasoningEffort) logger$
|
|
7767
|
+
if (normalizedMessagesReasoningEffort) logger$10.debug(`Normalized reasoning effort from ${normalizedMessagesReasoningEffort.from} to ${normalizedMessagesReasoningEffort.to} based on the provider model configuration`);
|
|
7679
7768
|
if (providerConfig.name === "codex" && !wantsStream) responsesPayload.stream = true;
|
|
7680
7769
|
if (applyResponsesApiContextManagement(responsesPayload, selectedModel?.capabilities.limits.max_prompt_tokens, { source: "messages" })) compactInputByLatestCompaction(responsesPayload);
|
|
7681
|
-
debugJson(logger$
|
|
7770
|
+
debugJson(logger$10, "provider.messages.responses.request", {
|
|
7682
7771
|
payload: responsesPayload,
|
|
7683
7772
|
provider
|
|
7684
7773
|
});
|
|
@@ -7700,7 +7789,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
7700
7789
|
errorMessagePrefix: `${provider} messages responses stream`,
|
|
7701
7790
|
parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
|
|
7702
7791
|
upstreamResponse,
|
|
7703
|
-
logger: logger$
|
|
7792
|
+
logger: logger$10
|
|
7704
7793
|
}),
|
|
7705
7794
|
modelConfig,
|
|
7706
7795
|
payload,
|
|
@@ -7722,7 +7811,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
7722
7811
|
}
|
|
7723
7812
|
const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers, { signal: c.req.raw.signal });
|
|
7724
7813
|
if (!upstreamResponse.ok) {
|
|
7725
|
-
logger$
|
|
7814
|
+
logger$10.error("Failed to create provider responses", upstreamResponse);
|
|
7726
7815
|
throw new HTTPError("Failed to create provider responses", upstreamResponse);
|
|
7727
7816
|
}
|
|
7728
7817
|
if (responsesPayload.stream) return streamResponsesProviderMessages({
|
|
@@ -7767,13 +7856,13 @@ const applyOpenAICompatibleExtraBodyThinkingBudget = (payload, options) => {
|
|
|
7767
7856
|
const handleOpenAICompatibleProviderMessages = async (c, options) => {
|
|
7768
7857
|
const { modelConfig, payload, provider, providerConfig, usageEndpoint } = options;
|
|
7769
7858
|
const openAIPayload = createOpenAICompatiblePayload(payload, modelConfig, providerConfig);
|
|
7770
|
-
debugJson(logger$
|
|
7859
|
+
debugJson(logger$10, "provider.messages.openai_compatible.request", {
|
|
7771
7860
|
payload: openAIPayload,
|
|
7772
7861
|
provider
|
|
7773
7862
|
});
|
|
7774
|
-
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, openAIPayload, c.req.raw.headers
|
|
7863
|
+
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, openAIPayload, c.req.raw.headers);
|
|
7775
7864
|
if (!upstreamResponse.ok) {
|
|
7776
|
-
logger$
|
|
7865
|
+
logger$10.error("Failed to create openai-compatible responses", upstreamResponse);
|
|
7777
7866
|
throw new HTTPError("Failed to create openai-compatible responses", upstreamResponse);
|
|
7778
7867
|
}
|
|
7779
7868
|
const contentType = upstreamResponse.headers.get("content-type") ?? "";
|
|
@@ -7830,7 +7919,7 @@ const applyOpenAICompatibleRequestOverrides = (payload, options) => {
|
|
|
7830
7919
|
for (const key of allowedKeys) if (Object.hasOwn(options.source, key)) payload[key] = options.source[key];
|
|
7831
7920
|
};
|
|
7832
7921
|
const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, upstreamResponse, usageEndpoint }) => {
|
|
7833
|
-
logger$
|
|
7922
|
+
logger$10.debug("provider.messages.streaming");
|
|
7834
7923
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint);
|
|
7835
7924
|
return streamSSE(c, async (stream) => {
|
|
7836
7925
|
let usage = {};
|
|
@@ -7842,7 +7931,7 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
|
|
|
7842
7931
|
};
|
|
7843
7932
|
try {
|
|
7844
7933
|
for await (const chunk of events(upstreamResponse)) {
|
|
7845
|
-
logger$
|
|
7934
|
+
logger$10.debug("provider.messages.raw_stream_event:", chunk.data);
|
|
7846
7935
|
const eventName = chunk.event;
|
|
7847
7936
|
if (eventName === "ping") {
|
|
7848
7937
|
await stream.writeSSE({
|
|
@@ -7871,13 +7960,13 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
|
|
|
7871
7960
|
});
|
|
7872
7961
|
}
|
|
7873
7962
|
} catch (error) {
|
|
7874
|
-
logger$
|
|
7963
|
+
logger$10.warn("provider.messages.stream_interrupted:", {
|
|
7875
7964
|
error,
|
|
7876
7965
|
provider
|
|
7877
7966
|
});
|
|
7878
7967
|
}
|
|
7879
7968
|
if (!messageStopSeen && !errorSeen) {
|
|
7880
|
-
logger$
|
|
7969
|
+
logger$10.warn("provider.messages.stream_incomplete:", { provider });
|
|
7881
7970
|
const errorEvent = translateErrorToAnthropicErrorEvent();
|
|
7882
7971
|
await stream.writeSSE({
|
|
7883
7972
|
event: errorEvent.type,
|
|
@@ -7888,7 +7977,7 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
|
|
|
7888
7977
|
});
|
|
7889
7978
|
};
|
|
7890
7979
|
const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, upstreamResponse, usageEndpoint }) => {
|
|
7891
|
-
logger$
|
|
7980
|
+
logger$10.debug("provider.messages.openai_compatible.streaming");
|
|
7892
7981
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint);
|
|
7893
7982
|
return streamSSE(c, async (stream) => {
|
|
7894
7983
|
let usage = {};
|
|
@@ -7902,7 +7991,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
7902
7991
|
};
|
|
7903
7992
|
try {
|
|
7904
7993
|
for await (const chunk of events(upstreamResponse)) {
|
|
7905
|
-
logger$
|
|
7994
|
+
logger$10.debug("provider.messages.openai_compatible.raw_stream_event:", chunk.data);
|
|
7906
7995
|
if (chunk.event === "ping") {
|
|
7907
7996
|
await stream.writeSSE({
|
|
7908
7997
|
event: "ping",
|
|
@@ -7920,7 +8009,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
7920
8009
|
const events = translateChunkToAnthropicEvents(parsed, streamState);
|
|
7921
8010
|
for (const event of events) {
|
|
7922
8011
|
const eventData = JSON.stringify(event);
|
|
7923
|
-
debugLazy(logger$
|
|
8012
|
+
debugLazy(logger$10, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
|
|
7924
8013
|
await stream.writeSSE({
|
|
7925
8014
|
event: event.type,
|
|
7926
8015
|
data: eventData
|
|
@@ -7928,21 +8017,21 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
7928
8017
|
}
|
|
7929
8018
|
}
|
|
7930
8019
|
} catch (error) {
|
|
7931
|
-
logger$
|
|
8020
|
+
logger$10.warn("provider.messages.openai_compatible.stream_interrupted:", {
|
|
7932
8021
|
error,
|
|
7933
8022
|
provider
|
|
7934
8023
|
});
|
|
7935
8024
|
}
|
|
7936
8025
|
for (const event of flushPendingAnthropicStreamEvents(streamState)) {
|
|
7937
8026
|
const eventData = JSON.stringify(event);
|
|
7938
|
-
debugLazy(logger$
|
|
8027
|
+
debugLazy(logger$10, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
|
|
7939
8028
|
await stream.writeSSE({
|
|
7940
8029
|
event: event.type,
|
|
7941
8030
|
data: eventData
|
|
7942
8031
|
});
|
|
7943
8032
|
}
|
|
7944
8033
|
if (!streamState.messageCompleted) {
|
|
7945
|
-
logger$
|
|
8034
|
+
logger$10.warn("provider.messages.openai_compatible.stream_incomplete:", { provider });
|
|
7946
8035
|
const errorEvent = translateErrorToAnthropicErrorEvent();
|
|
7947
8036
|
await stream.writeSSE({
|
|
7948
8037
|
event: errorEvent.type,
|
|
@@ -7953,13 +8042,13 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
7953
8042
|
});
|
|
7954
8043
|
};
|
|
7955
8044
|
const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, providerConfig, upstreamResponse, usageEndpoint }) => {
|
|
7956
|
-
logger$
|
|
8045
|
+
logger$10.debug("provider.messages.responses.streaming", { provider });
|
|
7957
8046
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint);
|
|
7958
8047
|
return streamSSE(c, async (stream) => {
|
|
7959
8048
|
let usage = {};
|
|
7960
8049
|
const streamState = createResponsesStreamState({ toolSearchName: resolveBridgeToolSearchName(payload.tools) });
|
|
7961
8050
|
for await (const chunk of upstreamResponse) {
|
|
7962
|
-
logger$
|
|
8051
|
+
logger$10.debug("provider.messages.responses.raw_stream_event:", chunk.data);
|
|
7963
8052
|
if (chunk.event === "ping") {
|
|
7964
8053
|
await stream.writeSSE({
|
|
7965
8054
|
event: "ping",
|
|
@@ -7977,7 +8066,7 @@ const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurre
|
|
|
7977
8066
|
const events = translateResponsesStreamEvent(parsed, streamState);
|
|
7978
8067
|
for (const event of events) {
|
|
7979
8068
|
const eventData = JSON.stringify(event);
|
|
7980
|
-
debugLazy(logger$
|
|
8069
|
+
debugLazy(logger$10, () => ["provider.messages.responses.translated_event:", eventData]);
|
|
7981
8070
|
await stream.writeSSE({
|
|
7982
8071
|
event: event.type,
|
|
7983
8072
|
data: eventData
|
|
@@ -7998,7 +8087,7 @@ const parseOpenAICompatibleStreamChunk = (data) => {
|
|
|
7998
8087
|
try {
|
|
7999
8088
|
return JSON.parse(data);
|
|
8000
8089
|
} catch (error) {
|
|
8001
|
-
logger$
|
|
8090
|
+
logger$10.error("provider.messages.openai_compatible.parse_chunk_error", {
|
|
8002
8091
|
data,
|
|
8003
8092
|
error
|
|
8004
8093
|
});
|
|
@@ -8011,7 +8100,7 @@ const parseResponsesProviderStreamChunk = (data, providerConfig) => {
|
|
|
8011
8100
|
if (providerConfig.name === "codex") logCodexRateLimitsEvent(parsed);
|
|
8012
8101
|
return parsed;
|
|
8013
8102
|
} catch (error) {
|
|
8014
|
-
logger$
|
|
8103
|
+
logger$10.error("provider.messages.responses.parse_chunk_error", {
|
|
8015
8104
|
provider: providerConfig.name,
|
|
8016
8105
|
data,
|
|
8017
8106
|
error
|
|
@@ -8039,7 +8128,7 @@ const parseProviderStreamEvent = (data) => {
|
|
|
8039
8128
|
usage: {}
|
|
8040
8129
|
};
|
|
8041
8130
|
} catch (error) {
|
|
8042
|
-
logger$
|
|
8131
|
+
logger$10.error("provider.messages.streaming.adjust_tokens_error", {
|
|
8043
8132
|
error,
|
|
8044
8133
|
originalData: data
|
|
8045
8134
|
});
|
|
@@ -8101,34 +8190,34 @@ const respondProviderMessagesJson = (c, options) => {
|
|
|
8101
8190
|
const { body, modelConfig, payload, pricingCurrency, provider, usageEndpoint } = options;
|
|
8102
8191
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint)(normalizeAnthropicUsage(body.usage));
|
|
8103
8192
|
if (provider === "openrouter") normalizeOpenRouterThinkingSignatures(body);
|
|
8104
|
-
debugJson(logger$
|
|
8193
|
+
debugJson(logger$10, "provider.messages.no_stream result:", body);
|
|
8105
8194
|
return c.json(body);
|
|
8106
8195
|
};
|
|
8107
8196
|
const respondOpenAICompatibleProviderMessagesJson = (c, options) => {
|
|
8108
8197
|
const { body, modelConfig, payload, pricingCurrency, provider, usageEndpoint } = options;
|
|
8109
8198
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint)(normalizeOpenAIUsage(body.usage));
|
|
8110
8199
|
const anthropicResponse = translateToAnthropic(body);
|
|
8111
|
-
debugJson(logger$
|
|
8200
|
+
debugJson(logger$10, "provider.messages.openai_compatible.no_stream result:", anthropicResponse);
|
|
8112
8201
|
return c.json(anthropicResponse);
|
|
8113
8202
|
};
|
|
8114
8203
|
const respondResponsesProviderMessagesJson = (c, options) => {
|
|
8115
8204
|
const { body, modelConfig, payload, pricingCurrency, provider, providerConfig, usageEndpoint } = options;
|
|
8116
8205
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint)(normalizeResponsesUsage(body.usage));
|
|
8117
8206
|
const anthropicResponse = translateResponsesResultToAnthropic(body, { toolSearchName: resolveBridgeToolSearchName(payload.tools) });
|
|
8118
|
-
debugJson(logger$
|
|
8119
|
-
if (providerConfig.name === "codex") logger$
|
|
8207
|
+
debugJson(logger$10, "provider.messages.responses.no_stream result:", anthropicResponse);
|
|
8208
|
+
if (providerConfig.name === "codex") logger$10.debug("provider.messages.codex.no_stream.result");
|
|
8120
8209
|
return c.json(anthropicResponse);
|
|
8121
8210
|
};
|
|
8122
8211
|
const respondWebSearchProviderMessagesJson = (c, options) => {
|
|
8123
8212
|
const { body, modelConfig, payload, pricingCurrency, provider, usageEndpoint } = options;
|
|
8124
8213
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint)(normalizeResponsesUsage(body.usage));
|
|
8125
8214
|
const { extract, response } = reconstructWebSearchResponse(payload, body, { requestId: body.id || `${provider}:${payload.model}` });
|
|
8126
|
-
debugJson(logger$
|
|
8215
|
+
debugJson(logger$10, `Web search via responses: ${extract.queries.length} quer(y/ies), ${extract.sources.length} source(s)`, body);
|
|
8127
8216
|
if (!payload.stream) return c.json(response);
|
|
8128
8217
|
return streamSSE(c, async (stream) => {
|
|
8129
8218
|
for (const event of buildSyntheticStreamEvents(response)) {
|
|
8130
8219
|
const data = JSON.stringify(event);
|
|
8131
|
-
logger$
|
|
8220
|
+
logger$10.debug(`Web search stream event`, data);
|
|
8132
8221
|
await stream.writeSSE({
|
|
8133
8222
|
event: event.type,
|
|
8134
8223
|
data
|
|
@@ -8161,8 +8250,7 @@ const buildAnthropicBetaHeader = (anthropicBetaHeader, thinking, _model) => {
|
|
|
8161
8250
|
}
|
|
8162
8251
|
if (thinking?.budget_tokens && !isAdaptiveThinking) return INTERLEAVED_THINKING_BETA;
|
|
8163
8252
|
};
|
|
8164
|
-
const createMessages = async (payload, anthropicBetaHeader, options) =>
|
|
8165
|
-
const createMessagesUpstream = async (payload, anthropicBetaHeader, options) => {
|
|
8253
|
+
const createMessages = async (payload, anthropicBetaHeader, options) => {
|
|
8166
8254
|
if (!state.copilotToken) throw new Error("Copilot token not found");
|
|
8167
8255
|
const enableVision = payload.messages.some((message) => {
|
|
8168
8256
|
if (!Array.isArray(message.content)) return false;
|
|
@@ -8185,8 +8273,7 @@ const createMessagesUpstream = async (payload, anthropicBetaHeader, options) =>
|
|
|
8185
8273
|
const response = await fetch(`${copilotBaseUrl(state)}/v1/messages`, {
|
|
8186
8274
|
method: "POST",
|
|
8187
8275
|
headers,
|
|
8188
|
-
body: JSON.stringify(payload)
|
|
8189
|
-
signal: options.signal
|
|
8276
|
+
body: JSON.stringify(payload)
|
|
8190
8277
|
});
|
|
8191
8278
|
logCopilotRateLimits(response.headers);
|
|
8192
8279
|
if (!response.ok) {
|
|
@@ -8224,8 +8311,7 @@ const handleWithChatCompletions = async (c, anthropicPayload, options) => {
|
|
|
8224
8311
|
subagentMarker,
|
|
8225
8312
|
requestId,
|
|
8226
8313
|
sessionId,
|
|
8227
|
-
compactType
|
|
8228
|
-
signal: c.req?.raw.signal
|
|
8314
|
+
compactType
|
|
8229
8315
|
});
|
|
8230
8316
|
if (isNonStreaming(response)) {
|
|
8231
8317
|
debugJson(logger, "Non-streaming response from Copilot:", response);
|
|
@@ -8380,8 +8466,7 @@ const handleWithMessagesApi = async (c, anthropicPayload, options) => {
|
|
|
8380
8466
|
subagentMarker,
|
|
8381
8467
|
requestId,
|
|
8382
8468
|
sessionId,
|
|
8383
|
-
compactType
|
|
8384
|
-
signal: c.req?.raw.signal
|
|
8469
|
+
compactType
|
|
8385
8470
|
});
|
|
8386
8471
|
if (isAsyncIterable(response)) {
|
|
8387
8472
|
logger.debug("Streaming response from Copilot (Messages API)");
|
|
@@ -8520,7 +8605,7 @@ const parseSubagentMarkerFromSystemReminder = (text) => {
|
|
|
8520
8605
|
};
|
|
8521
8606
|
//#endregion
|
|
8522
8607
|
//#region src/routes/messages/handler.ts
|
|
8523
|
-
const logger$
|
|
8608
|
+
const logger$9 = createHandlerLogger("messages-handler");
|
|
8524
8609
|
const messagesFlowHandlers = {
|
|
8525
8610
|
handleWithChatCompletions,
|
|
8526
8611
|
handleWithMessagesApi,
|
|
@@ -8535,7 +8620,7 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
|
|
|
8535
8620
|
if (anthropicPayload.model !== requestedModel) consola.debug(`Resolved model mapping: ${requestedModel} -> ${anthropicPayload.model}`);
|
|
8536
8621
|
if (!dispatchOptions.skipWebSearch) {
|
|
8537
8622
|
const webSearchResult = await tryHandleWebSearch(c, anthropicPayload, {
|
|
8538
|
-
logger: logger$
|
|
8623
|
+
logger: logger$9,
|
|
8539
8624
|
forwardToProvider: (ctx, payload, provider) => handleProviderMessagesForProvider(ctx, {
|
|
8540
8625
|
payload,
|
|
8541
8626
|
provider
|
|
@@ -8558,21 +8643,21 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
|
|
|
8558
8643
|
usageEndpoint: dispatchOptions.usageEndpoint
|
|
8559
8644
|
});
|
|
8560
8645
|
}
|
|
8561
|
-
debugJson(logger$
|
|
8646
|
+
debugJson(logger$9, "Anthropic request payload:", anthropicPayload);
|
|
8562
8647
|
normalizeSystemMessages(anthropicPayload);
|
|
8563
8648
|
sanitizeIdeTools(anthropicPayload);
|
|
8564
8649
|
const subagentMarker = dispatchOptions.subagentMarker ?? parseSubagentMarkerFromFirstUser(anthropicPayload);
|
|
8565
|
-
if (subagentMarker) debugJson(logger$
|
|
8650
|
+
if (subagentMarker) debugJson(logger$9, "Detected Subagent marker:", subagentMarker);
|
|
8566
8651
|
let sessionId = dispatchOptions.sessionId ?? getRootSessionId(anthropicPayload, c);
|
|
8567
8652
|
const compactType = dispatchOptions.compactType ?? getCompactType(anthropicPayload);
|
|
8568
8653
|
const anthropicBeta = c.req.header("anthropic-beta");
|
|
8569
|
-
logger$
|
|
8654
|
+
logger$9.debug("Anthropic Beta header:", anthropicBeta);
|
|
8570
8655
|
if (!state.tokenBasedBilling && !shouldUseClaudeAutoModel) {
|
|
8571
8656
|
const tools = anthropicPayload.tools;
|
|
8572
8657
|
const noTools = !tools || tools.length === 0;
|
|
8573
8658
|
if (anthropicBeta && noTools && compactType === 0) anthropicPayload.model = getSmallModel();
|
|
8574
8659
|
}
|
|
8575
|
-
if (compactType) logger$
|
|
8660
|
+
if (compactType) logger$9.debug("Compact request type:", compactType);
|
|
8576
8661
|
if (!state.tokenBasedBilling) {
|
|
8577
8662
|
const lastMessageCacheControl = getLastMessageContentCacheControl(anthropicPayload.messages.at(-1));
|
|
8578
8663
|
stripToolReferenceTurnBoundary(anthropicPayload);
|
|
@@ -8580,9 +8665,9 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
|
|
|
8580
8665
|
applyLastMessageCacheControl(anthropicPayload, lastMessageCacheControl);
|
|
8581
8666
|
}
|
|
8582
8667
|
const requestId = dispatchOptions.requestId ?? generateRequestIdFromPayload(anthropicPayload, sessionId);
|
|
8583
|
-
logger$
|
|
8668
|
+
logger$9.debug("Generated request ID:", requestId);
|
|
8584
8669
|
if (!sessionId) sessionId = getUUID(requestId);
|
|
8585
|
-
logger$
|
|
8670
|
+
logger$9.debug("Extracted session ID:", sessionId);
|
|
8586
8671
|
const selectedModel = findEndpointModel(anthropicPayload.model);
|
|
8587
8672
|
anthropicPayload.model = selectedModel?.id ?? anthropicPayload.model;
|
|
8588
8673
|
if (shouldUseMessagesApi(selectedModel)) return await messagesFlowHandlers.handleWithMessagesApi(c, anthropicPayload, {
|
|
@@ -8592,7 +8677,7 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
|
|
|
8592
8677
|
requestId,
|
|
8593
8678
|
sessionId,
|
|
8594
8679
|
compactType,
|
|
8595
|
-
logger: logger$
|
|
8680
|
+
logger: logger$9,
|
|
8596
8681
|
usageEndpoint: dispatchOptions.usageEndpoint
|
|
8597
8682
|
});
|
|
8598
8683
|
if (shouldUseResponsesApi(selectedModel, compactType)) return await messagesFlowHandlers.handleWithResponsesApi(c, anthropicPayload, {
|
|
@@ -8601,7 +8686,7 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
|
|
|
8601
8686
|
requestId,
|
|
8602
8687
|
sessionId,
|
|
8603
8688
|
compactType,
|
|
8604
|
-
logger: logger$
|
|
8689
|
+
logger: logger$9,
|
|
8605
8690
|
usageEndpoint: dispatchOptions.usageEndpoint
|
|
8606
8691
|
});
|
|
8607
8692
|
return await messagesFlowHandlers.handleWithChatCompletions(c, anthropicPayload, {
|
|
@@ -8610,7 +8695,7 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
|
|
|
8610
8695
|
requestId,
|
|
8611
8696
|
sessionId,
|
|
8612
8697
|
compactType,
|
|
8613
|
-
logger: logger$
|
|
8698
|
+
logger: logger$9,
|
|
8614
8699
|
usageEndpoint: dispatchOptions.usageEndpoint
|
|
8615
8700
|
});
|
|
8616
8701
|
}
|
|
@@ -8641,7 +8726,7 @@ messageRoutes.post("/count_tokens", async (c) => {
|
|
|
8641
8726
|
});
|
|
8642
8727
|
//#endregion
|
|
8643
8728
|
//#region src/routes/models/codex-models.ts
|
|
8644
|
-
const logger$
|
|
8729
|
+
const logger$8 = createHandlerLogger("codex-models-handler");
|
|
8645
8730
|
const CODEX_USER_AGENT_PATTERN = /^codex/iu;
|
|
8646
8731
|
const FALLBACK_AVAILABLE_IN_PLANS = [
|
|
8647
8732
|
"business",
|
|
@@ -8912,12 +8997,12 @@ function shouldInjectMessagesToolCallTips(userAgent, targetModel) {
|
|
|
8912
8997
|
async function logCodexModelsResponse(response) {
|
|
8913
8998
|
try {
|
|
8914
8999
|
const models = await response.clone().json();
|
|
8915
|
-
debugJson(logger$
|
|
9000
|
+
debugJson(logger$8, "models.codex.response", {
|
|
8916
9001
|
statusCode: response.status,
|
|
8917
9002
|
models
|
|
8918
9003
|
});
|
|
8919
9004
|
} catch (error) {
|
|
8920
|
-
logger$
|
|
9005
|
+
logger$8.warn("models.codex.response_log_error", { error });
|
|
8921
9006
|
}
|
|
8922
9007
|
}
|
|
8923
9008
|
/**
|
|
@@ -8937,7 +9022,7 @@ async function handleCodexModelsProxy(c, resolvedProviderConfig) {
|
|
|
8937
9022
|
}
|
|
8938
9023
|
async function handleMergedCodexModels(c, candidatesRequest, options = {}) {
|
|
8939
9024
|
const [upstreamCatalog, candidates] = await Promise.all([tryGetCodexCatalog(c), Promise.resolve(candidatesRequest).catch((error) => {
|
|
8940
|
-
logger$
|
|
9025
|
+
logger$8.warn("models.codex.candidates_error", { error });
|
|
8941
9026
|
return [];
|
|
8942
9027
|
})]);
|
|
8943
9028
|
const candidatesBySlug = new Map(candidates.map((candidate) => [candidate.slug, candidate]));
|
|
@@ -8973,7 +9058,7 @@ async function handleMergedCodexModels(c, candidatesRequest, options = {}) {
|
|
|
8973
9058
|
...upstreamCatalog ?? {},
|
|
8974
9059
|
models
|
|
8975
9060
|
};
|
|
8976
|
-
debugJson(logger$
|
|
9061
|
+
debugJson(logger$8, "models.codex.merged_response", {
|
|
8977
9062
|
upstreamCount: upstreamModels.length,
|
|
8978
9063
|
codexProviderAliasCount: codexProviderAliases.length,
|
|
8979
9064
|
syntheticCount: syntheticModels.length,
|
|
@@ -9068,17 +9153,17 @@ async function tryGetCodexCatalog(c) {
|
|
|
9068
9153
|
if (!await resolveProviderConfig("codex")) return null;
|
|
9069
9154
|
const response = await forwardCodexModels(c.req.url, c.req.raw.headers);
|
|
9070
9155
|
if (!response.ok) {
|
|
9071
|
-
logger$
|
|
9156
|
+
logger$8.warn("models.codex.catalog_fallback", { statusCode: response.status });
|
|
9072
9157
|
return null;
|
|
9073
9158
|
}
|
|
9074
9159
|
const body = await response.json();
|
|
9075
9160
|
if (!isCodexModelsResponse(body)) {
|
|
9076
|
-
logger$
|
|
9161
|
+
logger$8.warn("models.codex.catalog_invalid");
|
|
9077
9162
|
return null;
|
|
9078
9163
|
}
|
|
9079
9164
|
return body;
|
|
9080
9165
|
} catch (error) {
|
|
9081
|
-
logger$
|
|
9166
|
+
logger$8.warn("models.codex.catalog_error", { error });
|
|
9082
9167
|
return null;
|
|
9083
9168
|
}
|
|
9084
9169
|
}
|
|
@@ -9103,7 +9188,7 @@ function isRecord$2(value) {
|
|
|
9103
9188
|
//#endregion
|
|
9104
9189
|
//#region src/routes/models/route.ts
|
|
9105
9190
|
const modelRoutes = new Hono();
|
|
9106
|
-
const logger$
|
|
9191
|
+
const logger$7 = createHandlerLogger("models-handler");
|
|
9107
9192
|
const EPOCH_ISO = (/* @__PURE__ */ new Date(0)).toISOString();
|
|
9108
9193
|
const RESPONSES_ENDPOINTS = new Set(["/responses", "ws:/responses"]);
|
|
9109
9194
|
const MESSAGES_ENDPOINT = "/v1/messages";
|
|
@@ -9139,7 +9224,7 @@ function getBuiltinProviderModelRecords(provider) {
|
|
|
9139
9224
|
}
|
|
9140
9225
|
function getFallbackProviderModelRecords(provider, reason, details = {}) {
|
|
9141
9226
|
const fallbackModels = getBuiltinProviderModelRecords(provider);
|
|
9142
|
-
logger$
|
|
9227
|
+
logger$7.warn(`models.provider.fallback_${reason}`, {
|
|
9143
9228
|
provider,
|
|
9144
9229
|
...details,
|
|
9145
9230
|
fallbackModelCount: fallbackModels.length
|
|
@@ -9187,7 +9272,7 @@ async function getProviderModels(provider, requestHeaders) {
|
|
|
9187
9272
|
return normalizeProviderModels(providerConfig.name, models);
|
|
9188
9273
|
} catch (error) {
|
|
9189
9274
|
if (provider === "codex") {
|
|
9190
|
-
logger$
|
|
9275
|
+
logger$7.warn("models.provider.skip_error", {
|
|
9191
9276
|
provider,
|
|
9192
9277
|
error
|
|
9193
9278
|
});
|
|
@@ -9234,7 +9319,7 @@ function getCopilotCodexCandidates() {
|
|
|
9234
9319
|
if (getCopilotFastTierBaseModelId(models, model.id)) continue;
|
|
9235
9320
|
if (isCopilotCodexCandidate(model)) candidates.push(createCopilotCodexCandidate(model, Boolean(findCopilotFastTierModel(models, model.id))));
|
|
9236
9321
|
} catch (error) {
|
|
9237
|
-
logger$
|
|
9322
|
+
logger$7.warn("models.codex.copilot_skip_error", {
|
|
9238
9323
|
modelId: model.id,
|
|
9239
9324
|
error
|
|
9240
9325
|
});
|
|
@@ -9285,7 +9370,7 @@ async function getProviderCodexCandidates(provider, requestHeaders) {
|
|
|
9285
9370
|
}
|
|
9286
9371
|
return candidates;
|
|
9287
9372
|
} catch (error) {
|
|
9288
|
-
logger$
|
|
9373
|
+
logger$7.warn("models.codex.provider_skip_error", {
|
|
9289
9374
|
provider,
|
|
9290
9375
|
error
|
|
9291
9376
|
});
|
|
@@ -9392,7 +9477,7 @@ modelRoutes.get("/", async (c) => {
|
|
|
9392
9477
|
});
|
|
9393
9478
|
//#endregion
|
|
9394
9479
|
//#region src/routes/provider/alpha-search/route.ts
|
|
9395
|
-
const logger$
|
|
9480
|
+
const logger$6 = createHandlerLogger("provider-alpha-search-handler");
|
|
9396
9481
|
const providerAlphaSearchRoutes = new Hono();
|
|
9397
9482
|
const providerAlphaSearchRouteDependencies = {
|
|
9398
9483
|
createProviderProxyResponse,
|
|
@@ -9409,19 +9494,19 @@ providerAlphaSearchRoutes.post("/", async (c) => {
|
|
|
9409
9494
|
type: "invalid_request_error"
|
|
9410
9495
|
} }, 404);
|
|
9411
9496
|
if (providerConfig.name === "codex") return await providerAlphaSearchRouteDependencies.handleAlphaSearchRequest(c, providerConfig);
|
|
9412
|
-
await debugJsonAsync(logger$
|
|
9497
|
+
await debugJsonAsync(logger$6, "provider.alpha_search.request", async () => ({
|
|
9413
9498
|
body: await c.req.raw.clone().text(),
|
|
9414
9499
|
provider
|
|
9415
9500
|
}));
|
|
9416
9501
|
const upstreamResponse = await providerAlphaSearchRouteDependencies.forwardProviderAlphaSearch(providerConfig, c.req.raw);
|
|
9417
|
-
await debugJsonAsync(logger$
|
|
9502
|
+
await debugJsonAsync(logger$6, "provider.alpha_search.response", async () => ({
|
|
9418
9503
|
body: await upstreamResponse.clone().text(),
|
|
9419
9504
|
provider,
|
|
9420
9505
|
statusCode: upstreamResponse.status
|
|
9421
9506
|
}));
|
|
9422
9507
|
return providerAlphaSearchRouteDependencies.createProviderProxyResponse(upstreamResponse);
|
|
9423
9508
|
} catch (error) {
|
|
9424
|
-
logger$
|
|
9509
|
+
logger$6.error("provider.alpha_search.error", {
|
|
9425
9510
|
provider,
|
|
9426
9511
|
error
|
|
9427
9512
|
});
|
|
@@ -9429,6 +9514,50 @@ providerAlphaSearchRoutes.post("/", async (c) => {
|
|
|
9429
9514
|
}
|
|
9430
9515
|
});
|
|
9431
9516
|
//#endregion
|
|
9517
|
+
//#region src/routes/provider/images/route.ts
|
|
9518
|
+
const logger$5 = createHandlerLogger("provider-images-handler");
|
|
9519
|
+
const providerImageRoutes = new Hono();
|
|
9520
|
+
function getContentMetadata(headers) {
|
|
9521
|
+
return {
|
|
9522
|
+
contentType: headers.get("content-type"),
|
|
9523
|
+
contentLength: headers.get("content-length")
|
|
9524
|
+
};
|
|
9525
|
+
}
|
|
9526
|
+
async function handleProviderImages(c, operation) {
|
|
9527
|
+
const provider = c.req.param("provider") ?? "";
|
|
9528
|
+
try {
|
|
9529
|
+
const providerConfig = await resolveProviderConfig(provider);
|
|
9530
|
+
if (!providerConfig) return c.json({ error: {
|
|
9531
|
+
message: `Provider '${provider}' not found or disabled`,
|
|
9532
|
+
type: "invalid_request_error"
|
|
9533
|
+
} }, 404);
|
|
9534
|
+
if (providerConfig.name === "codex") return await handleCodexImages(c, operation, providerConfig);
|
|
9535
|
+
if (operation === "generations") await debugJsonAsync(logger$5, "provider.images.generations.request", async () => ({
|
|
9536
|
+
body: await c.req.raw.clone().text(),
|
|
9537
|
+
provider
|
|
9538
|
+
}));
|
|
9539
|
+
else debugJson(logger$5, "provider.images.edits.request", {
|
|
9540
|
+
...getContentMetadata(c.req.raw.headers),
|
|
9541
|
+
provider
|
|
9542
|
+
});
|
|
9543
|
+
const upstreamResponse = await forwardProviderImages(providerConfig, c.req.raw, operation);
|
|
9544
|
+
debugJson(logger$5, `provider.images.${operation}.response`, {
|
|
9545
|
+
...getContentMetadata(upstreamResponse.headers),
|
|
9546
|
+
provider,
|
|
9547
|
+
statusCode: upstreamResponse.status
|
|
9548
|
+
});
|
|
9549
|
+
return createProviderProxyResponse(upstreamResponse);
|
|
9550
|
+
} catch (error) {
|
|
9551
|
+
logger$5.error(`provider.images.${operation}.error`, {
|
|
9552
|
+
provider,
|
|
9553
|
+
error
|
|
9554
|
+
});
|
|
9555
|
+
return await forwardError(c, error);
|
|
9556
|
+
}
|
|
9557
|
+
}
|
|
9558
|
+
providerImageRoutes.post("/generations", (c) => handleProviderImages(c, "generations"));
|
|
9559
|
+
providerImageRoutes.post("/edits", (c) => handleProviderImages(c, "edits"));
|
|
9560
|
+
//#endregion
|
|
9432
9561
|
//#region src/routes/provider/messages/route.ts
|
|
9433
9562
|
const providerMessageRoutes = new Hono();
|
|
9434
9563
|
providerMessageRoutes.post("/", async (c) => {
|
|
@@ -11560,18 +11689,22 @@ server.route("/usage", usageRoute);
|
|
|
11560
11689
|
server.route("/token-usage", tokenUsageRoute);
|
|
11561
11690
|
server.route("/responses", responsesRoutes);
|
|
11562
11691
|
server.route("/alpha/search", alphaSearchRoutes);
|
|
11692
|
+
server.route("/images", imageRoutes);
|
|
11563
11693
|
server.route("/v1/chat/completions", completionRoutes);
|
|
11564
11694
|
server.route("/v1/models", modelRoutes);
|
|
11565
11695
|
server.route("/v1/embeddings", embeddingRoutes);
|
|
11566
11696
|
server.route("/v1/responses", responsesRoutes);
|
|
11567
11697
|
server.route("/v1/alpha/search", alphaSearchRoutes);
|
|
11698
|
+
server.route("/v1/images", imageRoutes);
|
|
11568
11699
|
server.route("/v1/messages", messageRoutes);
|
|
11569
11700
|
server.route("/:provider/v1/messages", providerMessageRoutes);
|
|
11570
11701
|
server.route("/:provider/v1/models", providerModelRoutes);
|
|
11571
11702
|
server.route("/:provider/v1/responses", providerResponsesRoutes);
|
|
11572
11703
|
server.route("/:provider/v1/alpha/search", providerAlphaSearchRoutes);
|
|
11704
|
+
server.route("/:provider/v1/images", providerImageRoutes);
|
|
11573
11705
|
server.route("/:provider/models", providerModelRoutes);
|
|
11574
11706
|
server.route("/:provider/responses", providerResponsesRoutes);
|
|
11575
11707
|
server.route("/:provider/alpha/search", providerAlphaSearchRoutes);
|
|
11708
|
+
server.route("/:provider/images", providerImageRoutes);
|
|
11576
11709
|
//#endregion
|
|
11577
11710
|
export { server };
|