@jeffreycao/copilot-api 1.14.7 → 1.14.8
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 +5 -1
- package/README.zh-CN.md +5 -1
- package/dist/main.js +1 -1
- package/dist/{server-CF0okzl9.js → server-BayMzJcy.js} +267 -110
- package/dist/server-BayMzJcy.js.map +1 -0
- package/dist/{start-juT2yVlW.js → start-C-ugrdZG.js} +2 -2
- package/dist/{start-juT2yVlW.js.map → start-C-ugrdZG.js.map} +1 -1
- package/package.json +1 -1
- package/dist/server-CF0okzl9.js.map +0 -1
|
@@ -444,25 +444,74 @@ async function forwardProviderModels(providerConfig, requestHeaders) {
|
|
|
444
444
|
headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders)
|
|
445
445
|
});
|
|
446
446
|
}
|
|
447
|
+
/** Align with Codex images: long-running generation/edits need a generous cap. */
|
|
448
|
+
const PROVIDER_IMAGES_TIMEOUT_MS = 900 * 1e3;
|
|
449
|
+
const providerImagesDispatcher = { dispatch(options, handler) {
|
|
450
|
+
return getGlobalDispatcher().dispatch({
|
|
451
|
+
...options,
|
|
452
|
+
bodyTimeout: PROVIDER_IMAGES_TIMEOUT_MS,
|
|
453
|
+
headersTimeout: PROVIDER_IMAGES_TIMEOUT_MS
|
|
454
|
+
}, handler);
|
|
455
|
+
} };
|
|
456
|
+
function resolveProviderRequestUrl(providerConfig, requestUrl, path) {
|
|
457
|
+
const upstreamUrl = new URL(`${providerConfig.baseUrl}${path}`);
|
|
458
|
+
upstreamUrl.search = new URL(requestUrl, "http://localhost").search;
|
|
459
|
+
return upstreamUrl.toString();
|
|
460
|
+
}
|
|
461
|
+
async function forwardProviderAlphaSearch(providerConfig, request) {
|
|
462
|
+
const headers = buildProviderUpstreamHeaders(providerConfig, request.headers);
|
|
463
|
+
const body = await request.arrayBuffer();
|
|
464
|
+
return await fetch(resolveProviderRequestUrl(providerConfig, request.url, "/v1/alpha/search"), {
|
|
465
|
+
method: "POST",
|
|
466
|
+
headers,
|
|
467
|
+
body
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
async function forwardProviderImages(providerConfig, request, operation) {
|
|
471
|
+
const headers = buildProviderUpstreamHeaders(providerConfig, request.headers);
|
|
472
|
+
const contentType = request.headers.get("content-type");
|
|
473
|
+
if (contentType) headers["content-type"] = contentType;
|
|
474
|
+
else if (operation === "edits") delete headers["content-type"];
|
|
475
|
+
const init = {
|
|
476
|
+
method: "POST",
|
|
477
|
+
headers,
|
|
478
|
+
body: request.body,
|
|
479
|
+
duplex: "half",
|
|
480
|
+
signal: AbortSignal.timeout(PROVIDER_IMAGES_TIMEOUT_MS)
|
|
481
|
+
};
|
|
482
|
+
const upstreamUrl = resolveProviderRequestUrl(providerConfig, request.url, `/v1/images/${operation}`);
|
|
483
|
+
if (typeof Bun !== "undefined") return await fetch(upstreamUrl, init);
|
|
484
|
+
return await fetch$1(upstreamUrl, {
|
|
485
|
+
...init,
|
|
486
|
+
dispatcher: providerImagesDispatcher
|
|
487
|
+
});
|
|
488
|
+
}
|
|
447
489
|
//#endregion
|
|
448
490
|
//#region src/routes/alpha-search/route.ts
|
|
449
|
-
const logger$
|
|
491
|
+
const logger$14 = createHandlerLogger("alpha-search-handler");
|
|
450
492
|
const alphaSearchRoutes = new Hono();
|
|
493
|
+
/**
|
|
494
|
+
* Handles Codex alpha-search proxying. Pass `resolvedProviderConfig` when the
|
|
495
|
+
* caller already resolved the codex provider to avoid a second resolve.
|
|
496
|
+
*/
|
|
497
|
+
async function handleCodexAlphaSearch(c, resolvedProviderConfig) {
|
|
498
|
+
if (!(resolvedProviderConfig ?? await resolveProviderConfig("codex"))) return c.json({ error: {
|
|
499
|
+
message: "Provider 'codex' not found or disabled",
|
|
500
|
+
type: "invalid_request_error"
|
|
501
|
+
} }, 404);
|
|
502
|
+
await debugJsonAsync(logger$14, "alpha_search.codex.request", async () => ({ body: await c.req.raw.clone().text() }));
|
|
503
|
+
const upstreamResponse = await forwardCodexAlphaSearch(c.req.raw);
|
|
504
|
+
await debugJsonAsync(logger$14, "alpha_search.codex.response", async () => ({
|
|
505
|
+
body: await upstreamResponse.clone().text(),
|
|
506
|
+
statusCode: upstreamResponse.status
|
|
507
|
+
}));
|
|
508
|
+
return createProviderProxyResponse(upstreamResponse);
|
|
509
|
+
}
|
|
451
510
|
alphaSearchRoutes.post("/", async (c) => {
|
|
452
511
|
try {
|
|
453
|
-
|
|
454
|
-
message: "Provider 'codex' not found or disabled",
|
|
455
|
-
type: "invalid_request_error"
|
|
456
|
-
} }, 404);
|
|
457
|
-
await debugJsonAsync(logger$11, "alpha_search.codex.request", async () => ({ body: await c.req.raw.clone().text() }));
|
|
458
|
-
const upstreamResponse = await forwardCodexAlphaSearch(c.req.raw);
|
|
459
|
-
await debugJsonAsync(logger$11, "alpha_search.codex.response", async () => ({
|
|
460
|
-
body: await upstreamResponse.clone().text(),
|
|
461
|
-
statusCode: upstreamResponse.status
|
|
462
|
-
}));
|
|
463
|
-
return createProviderProxyResponse(upstreamResponse);
|
|
512
|
+
return await handleCodexAlphaSearch(c);
|
|
464
513
|
} catch (error) {
|
|
465
|
-
logger$
|
|
514
|
+
logger$14.error("alpha_search.codex.error", { error });
|
|
466
515
|
return await forwardError(c, error);
|
|
467
516
|
}
|
|
468
517
|
});
|
|
@@ -1594,7 +1643,7 @@ const setContextCacheControl = (part) => {
|
|
|
1594
1643
|
};
|
|
1595
1644
|
//#endregion
|
|
1596
1645
|
//#region src/routes/provider/chat-completions/handler.ts
|
|
1597
|
-
const logger$
|
|
1646
|
+
const logger$13 = createHandlerLogger("provider-chat-completions-handler");
|
|
1598
1647
|
async function handleProviderChatCompletionsForProvider(c, options) {
|
|
1599
1648
|
const { payload, provider } = options;
|
|
1600
1649
|
const providerConfig = await resolveProviderConfig(provider);
|
|
@@ -1608,13 +1657,13 @@ async function handleProviderChatCompletionsForProvider(c, options) {
|
|
|
1608
1657
|
applyProviderStreamOptions(payload);
|
|
1609
1658
|
applyDashScopePreserveThinkingDefault(payload, providerConfig);
|
|
1610
1659
|
applyProviderContextCache(payload, modelConfig, providerConfig);
|
|
1611
|
-
debugJson(logger$
|
|
1660
|
+
debugJson(logger$13, "provider.chat_completions.request", {
|
|
1612
1661
|
payload,
|
|
1613
1662
|
provider
|
|
1614
1663
|
});
|
|
1615
1664
|
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, payload, c.req.raw.headers);
|
|
1616
1665
|
if (!upstreamResponse.ok) {
|
|
1617
|
-
logger$
|
|
1666
|
+
logger$13.error("Failed to create provider chat completions", {
|
|
1618
1667
|
provider,
|
|
1619
1668
|
statusCode: upstreamResponse.status
|
|
1620
1669
|
});
|
|
@@ -1628,7 +1677,7 @@ async function handleProviderChatCompletionsForProvider(c, options) {
|
|
|
1628
1677
|
});
|
|
1629
1678
|
const responseBody = await upstreamResponse.clone().json();
|
|
1630
1679
|
recordUsage(normalizeOpenAIUsage(responseBody.usage));
|
|
1631
|
-
debugJson(logger$
|
|
1680
|
+
debugJson(logger$13, "provider.chat_completions.response", responseBody);
|
|
1632
1681
|
return createProviderProxyResponse(upstreamResponse);
|
|
1633
1682
|
}
|
|
1634
1683
|
const applyProviderModelDefaults = (payload, modelConfig) => {
|
|
@@ -1658,12 +1707,12 @@ const createProviderChatCompletionsUsageRecorder = (payload, provider, modelConf
|
|
|
1658
1707
|
providerName: provider
|
|
1659
1708
|
});
|
|
1660
1709
|
const streamProviderChatCompletions = (c, upstreamResponse, options) => {
|
|
1661
|
-
logger$
|
|
1710
|
+
logger$13.debug("provider.chat_completions.streaming", { provider: options.provider });
|
|
1662
1711
|
return streamSSE(c, async (stream) => {
|
|
1663
1712
|
let usage = {};
|
|
1664
1713
|
try {
|
|
1665
1714
|
for await (const chunk of events(upstreamResponse)) {
|
|
1666
|
-
debugJson(logger$
|
|
1715
|
+
debugJson(logger$13, "provider.chat_completions.stream_chunk", chunk);
|
|
1667
1716
|
if (chunk.data && chunk.data !== "[DONE]") {
|
|
1668
1717
|
const parsedChunk = parseChatCompletionChunkData(chunk.data);
|
|
1669
1718
|
if (parsedChunk?.usage) usage = normalizeOpenAIUsage(parsedChunk.usage);
|
|
@@ -1790,7 +1839,7 @@ const createChatCompletions = async (payload, options) => {
|
|
|
1790
1839
|
};
|
|
1791
1840
|
//#endregion
|
|
1792
1841
|
//#region src/routes/chat-completions/handler.ts
|
|
1793
|
-
const logger$
|
|
1842
|
+
const logger$12 = createHandlerLogger("chat-completions-handler");
|
|
1794
1843
|
async function handleCompletion$1(c) {
|
|
1795
1844
|
let payload = await c.req.json();
|
|
1796
1845
|
const requestedModel = payload.model;
|
|
@@ -1804,23 +1853,23 @@ async function handleCompletion$1(c) {
|
|
|
1804
1853
|
provider: providerModelAlias.provider
|
|
1805
1854
|
});
|
|
1806
1855
|
}
|
|
1807
|
-
debugJson(logger$
|
|
1856
|
+
debugJson(logger$12, "Request payload:", payload);
|
|
1808
1857
|
const selectedModel = state.models?.data.find((model) => model.id === payload.model);
|
|
1809
1858
|
if (isNullish(payload.max_tokens) && isNullish(payload.max_completion_tokens)) {
|
|
1810
1859
|
payload = {
|
|
1811
1860
|
...payload,
|
|
1812
1861
|
max_tokens: selectedModel?.capabilities.limits.max_output_tokens
|
|
1813
1862
|
};
|
|
1814
|
-
debugJson(logger$
|
|
1863
|
+
debugJson(logger$12, "Set max_tokens to:", payload.max_tokens);
|
|
1815
1864
|
}
|
|
1816
1865
|
if (payload.model.includes("gpt")) {
|
|
1817
1866
|
if (isNullish(payload.max_completion_tokens)) payload.max_completion_tokens = payload.max_tokens;
|
|
1818
1867
|
delete payload.max_tokens;
|
|
1819
1868
|
}
|
|
1820
1869
|
const requestId = generateRequestIdFromPayload(payload);
|
|
1821
|
-
logger$
|
|
1870
|
+
logger$12.debug("Generated request ID:", requestId);
|
|
1822
1871
|
const sessionId = getUUID(requestId);
|
|
1823
|
-
logger$
|
|
1872
|
+
logger$12.debug("Extracted session ID:", sessionId);
|
|
1824
1873
|
const recordUsage = createCopilotTokenUsageRecorder({
|
|
1825
1874
|
endpoint: "chat_completions",
|
|
1826
1875
|
fallbackSessionId: sessionId,
|
|
@@ -1831,18 +1880,18 @@ async function handleCompletion$1(c) {
|
|
|
1831
1880
|
sessionId
|
|
1832
1881
|
});
|
|
1833
1882
|
if (isNonStreaming$1(response)) {
|
|
1834
|
-
debugJson(logger$
|
|
1883
|
+
debugJson(logger$12, "Non-streaming response:", response);
|
|
1835
1884
|
recordUsage({
|
|
1836
1885
|
...normalizeOpenAIUsage(response.usage),
|
|
1837
1886
|
total_nano_aiu: normalizeOptionalToken(response.copilot_usage?.total_nano_aiu)
|
|
1838
1887
|
});
|
|
1839
1888
|
return c.json(response);
|
|
1840
1889
|
}
|
|
1841
|
-
logger$
|
|
1890
|
+
logger$12.debug("Streaming response");
|
|
1842
1891
|
return streamSSE(c, async (stream) => {
|
|
1843
1892
|
let usage = {};
|
|
1844
1893
|
for await (const chunk of response) {
|
|
1845
|
-
debugJson(logger$
|
|
1894
|
+
debugJson(logger$12, "Streaming chunk:", chunk);
|
|
1846
1895
|
const parsedChunk = parseChatCompletionChunk(chunk);
|
|
1847
1896
|
if (parsedChunk?.usage || parsedChunk?.copilot_usage) usage = {
|
|
1848
1897
|
...normalizeOpenAIUsage(parsedChunk.usage),
|
|
@@ -1965,31 +2014,35 @@ async function forwardCodexImages(request, operation) {
|
|
|
1965
2014
|
}
|
|
1966
2015
|
//#endregion
|
|
1967
2016
|
//#region src/routes/images/route.ts
|
|
1968
|
-
const logger$
|
|
2017
|
+
const logger$11 = createHandlerLogger("images-handler");
|
|
1969
2018
|
const imageRoutes = new Hono();
|
|
1970
2019
|
const imageRouteDependencies = { debugJsonAsync };
|
|
1971
|
-
function getContentMetadata(headers) {
|
|
2020
|
+
function getContentMetadata$1(headers) {
|
|
1972
2021
|
return {
|
|
1973
2022
|
contentType: headers.get("content-type"),
|
|
1974
2023
|
contentLength: headers.get("content-length")
|
|
1975
2024
|
};
|
|
1976
2025
|
}
|
|
1977
|
-
|
|
2026
|
+
/**
|
|
2027
|
+
* Handles Codex images proxying. Pass `resolvedProviderConfig` when the
|
|
2028
|
+
* caller already resolved the codex provider to avoid a second resolve.
|
|
2029
|
+
*/
|
|
2030
|
+
async function handleCodexImages(c, operation, resolvedProviderConfig) {
|
|
1978
2031
|
try {
|
|
1979
|
-
if (!await resolveProviderConfig("codex")) return c.json({ error: {
|
|
2032
|
+
if (!(resolvedProviderConfig ?? await resolveProviderConfig("codex"))) return c.json({ error: {
|
|
1980
2033
|
message: "Provider 'codex' not found or disabled",
|
|
1981
2034
|
type: "invalid_request_error"
|
|
1982
2035
|
} }, 404);
|
|
1983
|
-
if (operation === "generations") await imageRouteDependencies.debugJsonAsync(logger$
|
|
1984
|
-
else debugJson(logger$
|
|
2036
|
+
if (operation === "generations") await imageRouteDependencies.debugJsonAsync(logger$11, "images.generations.codex.request", async () => ({ body: await c.req.raw.clone().text() }));
|
|
2037
|
+
else debugJson(logger$11, "images.edits.codex.request", getContentMetadata$1(c.req.raw.headers));
|
|
1985
2038
|
const upstreamResponse = await forwardCodexImages(c.req.raw, operation);
|
|
1986
|
-
debugJson(logger$
|
|
1987
|
-
...getContentMetadata(upstreamResponse.headers),
|
|
2039
|
+
debugJson(logger$11, `images.${operation}.codex.response`, {
|
|
2040
|
+
...getContentMetadata$1(upstreamResponse.headers),
|
|
1988
2041
|
statusCode: upstreamResponse.status
|
|
1989
2042
|
});
|
|
1990
2043
|
return createProviderProxyResponse(upstreamResponse);
|
|
1991
2044
|
} catch (error) {
|
|
1992
|
-
logger$
|
|
2045
|
+
logger$11.error(`images.${operation}.codex.error`, { error });
|
|
1993
2046
|
return await forwardError(c, error);
|
|
1994
2047
|
}
|
|
1995
2048
|
}
|
|
@@ -3033,7 +3086,7 @@ const prepareMessagesApiPayload = (payload, selectedModel) => {
|
|
|
3033
3086
|
};
|
|
3034
3087
|
//#endregion
|
|
3035
3088
|
//#region src/routes/provider/messages/count-tokens-handler.ts
|
|
3036
|
-
const logger$
|
|
3089
|
+
const logger$10 = createHandlerLogger("provider-count-tokens-handler");
|
|
3037
3090
|
async function handleProviderCountTokens(c) {
|
|
3038
3091
|
const provider = c.req.param("provider");
|
|
3039
3092
|
return await handleProviderCountTokensForProvider(c, {
|
|
@@ -3056,7 +3109,7 @@ async function handleProviderCountTokensForProvider(c, options) {
|
|
|
3056
3109
|
toolContentSupportType: modelConfig?.toolContentSupportType ?? []
|
|
3057
3110
|
} : void 0), createFallbackModel(modelId));
|
|
3058
3111
|
const finalTokenCount = tokenCount.input + tokenCount.output;
|
|
3059
|
-
logger$
|
|
3112
|
+
logger$10.debug("provider.count_tokens.success", {
|
|
3060
3113
|
provider,
|
|
3061
3114
|
model: anthropicPayload.model,
|
|
3062
3115
|
input_tokens: finalTokenCount
|
|
@@ -5418,7 +5471,7 @@ function getModels() {
|
|
|
5418
5471
|
}
|
|
5419
5472
|
//#endregion
|
|
5420
5473
|
//#region src/routes/provider/messages/handler.ts
|
|
5421
|
-
const logger$
|
|
5474
|
+
const logger$9 = createHandlerLogger("provider-messages-handler");
|
|
5422
5475
|
async function handleProviderMessages(c) {
|
|
5423
5476
|
const provider = c.req.param("provider");
|
|
5424
5477
|
return await handleProviderMessagesForProvider(c, {
|
|
@@ -5436,7 +5489,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
5436
5489
|
try {
|
|
5437
5490
|
const modelConfig = providerConfig.models?.[payload.model];
|
|
5438
5491
|
const effectiveType = resolveEffectiveProviderType(providerConfig, payload.model);
|
|
5439
|
-
debugJson(logger$
|
|
5492
|
+
debugJson(logger$9, "provider.messages.request", {
|
|
5440
5493
|
payload,
|
|
5441
5494
|
provider
|
|
5442
5495
|
});
|
|
@@ -5469,7 +5522,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
5469
5522
|
});
|
|
5470
5523
|
}
|
|
5471
5524
|
applyMissingExtraBody(payload, { extraBody: modelConfig?.extraBody });
|
|
5472
|
-
debugJson(logger$
|
|
5525
|
+
debugJson(logger$9, "Translated provider.messages.request", {
|
|
5473
5526
|
payload,
|
|
5474
5527
|
provider
|
|
5475
5528
|
});
|
|
@@ -5479,7 +5532,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
5479
5532
|
authType: resolveProviderAuthType(providerConfig.name, void 0, effectiveType)
|
|
5480
5533
|
}, payload, c.req.raw.headers);
|
|
5481
5534
|
if (!upstreamResponse.ok) {
|
|
5482
|
-
logger$
|
|
5535
|
+
logger$9.error("Failed to create responses", upstreamResponse);
|
|
5483
5536
|
throw new HTTPError("Failed to create responses", upstreamResponse);
|
|
5484
5537
|
}
|
|
5485
5538
|
const contentType = upstreamResponse.headers.get("content-type") ?? "";
|
|
@@ -5499,7 +5552,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
5499
5552
|
provider
|
|
5500
5553
|
});
|
|
5501
5554
|
} catch (error) {
|
|
5502
|
-
logger$
|
|
5555
|
+
logger$9.error("provider.messages.error", {
|
|
5503
5556
|
provider,
|
|
5504
5557
|
error
|
|
5505
5558
|
});
|
|
@@ -5509,7 +5562,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
5509
5562
|
const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
5510
5563
|
const { modelConfig, payload, provider, providerConfig } = options;
|
|
5511
5564
|
const responsesPayload = prepareWebSearchResponsesPayload(payload);
|
|
5512
|
-
debugJson(logger$
|
|
5565
|
+
debugJson(logger$9, "provider.messages.responses.web_search.request", {
|
|
5513
5566
|
payload: responsesPayload,
|
|
5514
5567
|
provider
|
|
5515
5568
|
});
|
|
@@ -5520,7 +5573,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
5520
5573
|
errorMessagePrefix: `${provider} web search responses stream`,
|
|
5521
5574
|
parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
|
|
5522
5575
|
upstreamResponse,
|
|
5523
|
-
logger: logger$
|
|
5576
|
+
logger: logger$9
|
|
5524
5577
|
}),
|
|
5525
5578
|
modelConfig,
|
|
5526
5579
|
payload,
|
|
@@ -5537,7 +5590,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
5537
5590
|
}
|
|
5538
5591
|
const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers);
|
|
5539
5592
|
if (!upstreamResponse.ok) {
|
|
5540
|
-
logger$
|
|
5593
|
+
logger$9.error("Failed to create provider web search responses", {
|
|
5541
5594
|
provider,
|
|
5542
5595
|
upstreamResponse
|
|
5543
5596
|
});
|
|
@@ -5548,7 +5601,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
5548
5601
|
errorMessagePrefix: `${provider} web search responses stream`,
|
|
5549
5602
|
parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
|
|
5550
5603
|
upstreamResponse: events(upstreamResponse),
|
|
5551
|
-
logger: logger$
|
|
5604
|
+
logger: logger$9
|
|
5552
5605
|
}),
|
|
5553
5606
|
modelConfig,
|
|
5554
5607
|
payload,
|
|
@@ -5570,7 +5623,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
5570
5623
|
const responsesPayload = translateAnthropicMessagesToResponsesPayload(payload);
|
|
5571
5624
|
if (providerConfig.name === "codex" && !wantsStream) responsesPayload.stream = true;
|
|
5572
5625
|
if (applyResponsesApiContextManagement(responsesPayload, selectedModel?.capabilities.limits.max_prompt_tokens, { source: "messages" })) compactInputByLatestCompaction(responsesPayload);
|
|
5573
|
-
debugJson(logger$
|
|
5626
|
+
debugJson(logger$9, "provider.messages.responses.request", {
|
|
5574
5627
|
payload: responsesPayload,
|
|
5575
5628
|
provider
|
|
5576
5629
|
});
|
|
@@ -5591,7 +5644,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
5591
5644
|
errorMessagePrefix: `${provider} messages responses stream`,
|
|
5592
5645
|
parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
|
|
5593
5646
|
upstreamResponse,
|
|
5594
|
-
logger: logger$
|
|
5647
|
+
logger: logger$9
|
|
5595
5648
|
}),
|
|
5596
5649
|
modelConfig,
|
|
5597
5650
|
payload,
|
|
@@ -5611,7 +5664,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
5611
5664
|
}
|
|
5612
5665
|
const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers);
|
|
5613
5666
|
if (!upstreamResponse.ok) {
|
|
5614
|
-
logger$
|
|
5667
|
+
logger$9.error("Failed to create provider responses", upstreamResponse);
|
|
5615
5668
|
throw new HTTPError("Failed to create provider responses", upstreamResponse);
|
|
5616
5669
|
}
|
|
5617
5670
|
if (responsesPayload.stream) return streamResponsesProviderMessages({
|
|
@@ -5662,13 +5715,13 @@ const applyOpenAICompatibleExtraBodyThinkingBudget = (payload, options) => {
|
|
|
5662
5715
|
const handleOpenAICompatibleProviderMessages = async (c, options) => {
|
|
5663
5716
|
const { modelConfig, payload, provider, providerConfig } = options;
|
|
5664
5717
|
const openAIPayload = createOpenAICompatiblePayload(payload, modelConfig, providerConfig);
|
|
5665
|
-
debugJson(logger$
|
|
5718
|
+
debugJson(logger$9, "provider.messages.openai_compatible.request", {
|
|
5666
5719
|
payload: openAIPayload,
|
|
5667
5720
|
provider
|
|
5668
5721
|
});
|
|
5669
5722
|
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, openAIPayload, c.req.raw.headers);
|
|
5670
5723
|
if (!upstreamResponse.ok) {
|
|
5671
|
-
logger$
|
|
5724
|
+
logger$9.error("Failed to create openai-compatible responses", upstreamResponse);
|
|
5672
5725
|
throw new HTTPError("Failed to create openai-compatible responses", upstreamResponse);
|
|
5673
5726
|
}
|
|
5674
5727
|
const contentType = upstreamResponse.headers.get("content-type") ?? "";
|
|
@@ -5723,12 +5776,12 @@ const applyOpenAICompatibleRequestOverrides = (payload, options) => {
|
|
|
5723
5776
|
for (const key of allowedKeys) if (Object.hasOwn(options.source, key)) payload[key] = options.source[key];
|
|
5724
5777
|
};
|
|
5725
5778
|
const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, upstreamResponse }) => {
|
|
5726
|
-
logger$
|
|
5779
|
+
logger$9.debug("provider.messages.streaming");
|
|
5727
5780
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency);
|
|
5728
5781
|
return streamSSE(c, async (stream) => {
|
|
5729
5782
|
let usage = {};
|
|
5730
5783
|
for await (const chunk of events(upstreamResponse)) {
|
|
5731
|
-
logger$
|
|
5784
|
+
logger$9.debug("provider.messages.raw_stream_event:", chunk.data);
|
|
5732
5785
|
const eventName = chunk.event;
|
|
5733
5786
|
if (eventName === "ping") {
|
|
5734
5787
|
await stream.writeSSE({
|
|
@@ -5754,7 +5807,7 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
|
|
|
5754
5807
|
});
|
|
5755
5808
|
};
|
|
5756
5809
|
const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, upstreamResponse }) => {
|
|
5757
|
-
logger$
|
|
5810
|
+
logger$9.debug("provider.messages.openai_compatible.streaming");
|
|
5758
5811
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency);
|
|
5759
5812
|
return streamSSE(c, async (stream) => {
|
|
5760
5813
|
let usage = {};
|
|
@@ -5766,7 +5819,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
5766
5819
|
thinkingBlockOpen: false
|
|
5767
5820
|
};
|
|
5768
5821
|
for await (const chunk of events(upstreamResponse)) {
|
|
5769
|
-
logger$
|
|
5822
|
+
logger$9.debug("provider.messages.openai_compatible.raw_stream_event:", chunk.data);
|
|
5770
5823
|
if (chunk.event === "ping") {
|
|
5771
5824
|
await stream.writeSSE({
|
|
5772
5825
|
event: "ping",
|
|
@@ -5784,7 +5837,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
5784
5837
|
const events = translateChunkToAnthropicEvents(parsed, streamState);
|
|
5785
5838
|
for (const event of events) {
|
|
5786
5839
|
const eventData = JSON.stringify(event);
|
|
5787
|
-
debugLazy(logger$
|
|
5840
|
+
debugLazy(logger$9, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
|
|
5788
5841
|
await stream.writeSSE({
|
|
5789
5842
|
event: event.type,
|
|
5790
5843
|
data: eventData
|
|
@@ -5793,7 +5846,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
5793
5846
|
}
|
|
5794
5847
|
for (const event of flushPendingAnthropicStreamEvents(streamState)) {
|
|
5795
5848
|
const eventData = JSON.stringify(event);
|
|
5796
|
-
debugLazy(logger$
|
|
5849
|
+
debugLazy(logger$9, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
|
|
5797
5850
|
await stream.writeSSE({
|
|
5798
5851
|
event: event.type,
|
|
5799
5852
|
data: eventData
|
|
@@ -5803,13 +5856,13 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
5803
5856
|
});
|
|
5804
5857
|
};
|
|
5805
5858
|
const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, providerConfig, upstreamResponse }) => {
|
|
5806
|
-
logger$
|
|
5859
|
+
logger$9.debug("provider.messages.responses.streaming", { provider });
|
|
5807
5860
|
const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency);
|
|
5808
5861
|
return streamSSE(c, async (stream) => {
|
|
5809
5862
|
let usage = {};
|
|
5810
5863
|
const streamState = createResponsesStreamState({ toolSearchName: resolveBridgeToolSearchName(payload.tools) });
|
|
5811
5864
|
for await (const chunk of upstreamResponse) {
|
|
5812
|
-
logger$
|
|
5865
|
+
logger$9.debug("provider.messages.responses.raw_stream_event:", chunk.data);
|
|
5813
5866
|
if (chunk.event === "ping") {
|
|
5814
5867
|
await stream.writeSSE({
|
|
5815
5868
|
event: "ping",
|
|
@@ -5827,7 +5880,7 @@ const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurre
|
|
|
5827
5880
|
const events = translateResponsesStreamEvent(parsed, streamState);
|
|
5828
5881
|
for (const event of events) {
|
|
5829
5882
|
const eventData = JSON.stringify(event);
|
|
5830
|
-
debugLazy(logger$
|
|
5883
|
+
debugLazy(logger$9, () => ["provider.messages.responses.translated_event:", eventData]);
|
|
5831
5884
|
await stream.writeSSE({
|
|
5832
5885
|
event: event.type,
|
|
5833
5886
|
data: eventData
|
|
@@ -5851,7 +5904,7 @@ const parseOpenAICompatibleStreamChunk = (data) => {
|
|
|
5851
5904
|
try {
|
|
5852
5905
|
return JSON.parse(data);
|
|
5853
5906
|
} catch (error) {
|
|
5854
|
-
logger$
|
|
5907
|
+
logger$9.error("provider.messages.openai_compatible.parse_chunk_error", {
|
|
5855
5908
|
data,
|
|
5856
5909
|
error
|
|
5857
5910
|
});
|
|
@@ -5864,7 +5917,7 @@ const parseResponsesProviderStreamChunk = (data, providerConfig) => {
|
|
|
5864
5917
|
if (providerConfig.name === "codex") logCodexRateLimitsEvent(parsed);
|
|
5865
5918
|
return parsed;
|
|
5866
5919
|
} catch (error) {
|
|
5867
|
-
logger$
|
|
5920
|
+
logger$9.error("provider.messages.responses.parse_chunk_error", {
|
|
5868
5921
|
provider: providerConfig.name,
|
|
5869
5922
|
data,
|
|
5870
5923
|
error
|
|
@@ -5889,7 +5942,7 @@ const parseProviderStreamEvent = (data) => {
|
|
|
5889
5942
|
usage: {}
|
|
5890
5943
|
};
|
|
5891
5944
|
} catch (error) {
|
|
5892
|
-
logger$
|
|
5945
|
+
logger$9.error("provider.messages.streaming.adjust_tokens_error", {
|
|
5893
5946
|
error,
|
|
5894
5947
|
originalData: data
|
|
5895
5948
|
});
|
|
@@ -5899,34 +5952,34 @@ const parseProviderStreamEvent = (data) => {
|
|
|
5899
5952
|
const respondProviderMessagesJson = (c, options) => {
|
|
5900
5953
|
const { body, modelConfig, payload, pricingCurrency, provider } = options;
|
|
5901
5954
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency)(normalizeAnthropicUsage(body.usage));
|
|
5902
|
-
debugJson(logger$
|
|
5955
|
+
debugJson(logger$9, "provider.messages.no_stream result:", body);
|
|
5903
5956
|
return c.json(body);
|
|
5904
5957
|
};
|
|
5905
5958
|
const respondOpenAICompatibleProviderMessagesJson = (c, options) => {
|
|
5906
5959
|
const { body, modelConfig, payload, pricingCurrency, provider } = options;
|
|
5907
5960
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency)(normalizeOpenAIUsage(body.usage));
|
|
5908
5961
|
const anthropicResponse = translateToAnthropic(body);
|
|
5909
|
-
debugJson(logger$
|
|
5962
|
+
debugJson(logger$9, "provider.messages.openai_compatible.no_stream result:", anthropicResponse);
|
|
5910
5963
|
return c.json(anthropicResponse);
|
|
5911
5964
|
};
|
|
5912
5965
|
const respondResponsesProviderMessagesJson = (c, options) => {
|
|
5913
5966
|
const { body, modelConfig, payload, pricingCurrency, provider, providerConfig } = options;
|
|
5914
5967
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency)(normalizeResponsesUsage(body.usage));
|
|
5915
5968
|
const anthropicResponse = translateResponsesResultToAnthropic(body, { toolSearchName: resolveBridgeToolSearchName(payload.tools) });
|
|
5916
|
-
debugJson(logger$
|
|
5917
|
-
if (providerConfig.name === "codex") logger$
|
|
5969
|
+
debugJson(logger$9, "provider.messages.responses.no_stream result:", anthropicResponse);
|
|
5970
|
+
if (providerConfig.name === "codex") logger$9.debug("provider.messages.codex.no_stream.result");
|
|
5918
5971
|
return c.json(anthropicResponse);
|
|
5919
5972
|
};
|
|
5920
5973
|
const respondWebSearchProviderMessagesJson = (c, options) => {
|
|
5921
5974
|
const { body, modelConfig, payload, pricingCurrency, provider } = options;
|
|
5922
5975
|
createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency)(normalizeResponsesUsage(body.usage));
|
|
5923
5976
|
const { extract, response } = reconstructWebSearchResponse(payload, body, { requestId: body.id || `${provider}:${payload.model}` });
|
|
5924
|
-
debugJson(logger$
|
|
5977
|
+
debugJson(logger$9, `Web search via responses: ${extract.queries.length} quer(y/ies), ${extract.sources.length} source(s)`, body);
|
|
5925
5978
|
if (!payload.stream) return c.json(response);
|
|
5926
5979
|
return streamSSE(c, async (stream) => {
|
|
5927
5980
|
for (const event of buildSyntheticStreamEvents(response)) {
|
|
5928
5981
|
const data = JSON.stringify(event);
|
|
5929
|
-
logger$
|
|
5982
|
+
logger$9.debug(`Web search stream event`, data);
|
|
5930
5983
|
await stream.writeSSE({
|
|
5931
5984
|
event: event.type,
|
|
5932
5985
|
data
|
|
@@ -6285,7 +6338,7 @@ const parseSubagentMarkerFromSystemReminder = (text) => {
|
|
|
6285
6338
|
};
|
|
6286
6339
|
//#endregion
|
|
6287
6340
|
//#region src/routes/messages/handler.ts
|
|
6288
|
-
const logger$
|
|
6341
|
+
const logger$8 = createHandlerLogger("messages-handler");
|
|
6289
6342
|
const messagesFlowHandlers = {
|
|
6290
6343
|
handleWithChatCompletions,
|
|
6291
6344
|
handleWithMessagesApi,
|
|
@@ -6297,7 +6350,7 @@ async function handleCompletion(c) {
|
|
|
6297
6350
|
anthropicPayload.model = resolveMappedModel(anthropicPayload.model);
|
|
6298
6351
|
if (anthropicPayload.model !== requestedModel) consola.debug(`Resolved model mapping: ${requestedModel} -> ${anthropicPayload.model}`);
|
|
6299
6352
|
const webSearchResult = await tryHandleWebSearch(c, anthropicPayload, {
|
|
6300
|
-
logger: logger$
|
|
6353
|
+
logger: logger$8,
|
|
6301
6354
|
forwardToProvider: (ctx, payload, provider) => handleProviderMessagesForProvider(ctx, {
|
|
6302
6355
|
payload,
|
|
6303
6356
|
provider
|
|
@@ -6312,18 +6365,18 @@ async function handleCompletion(c) {
|
|
|
6312
6365
|
provider: providerModelAlias.provider
|
|
6313
6366
|
});
|
|
6314
6367
|
}
|
|
6315
|
-
debugJson(logger$
|
|
6368
|
+
debugJson(logger$8, "Anthropic request payload:", anthropicPayload);
|
|
6316
6369
|
normalizeSystemMessages(anthropicPayload);
|
|
6317
6370
|
sanitizeIdeTools(anthropicPayload);
|
|
6318
6371
|
const subagentMarker = parseSubagentMarkerFromFirstUser(anthropicPayload);
|
|
6319
|
-
if (subagentMarker) debugJson(logger$
|
|
6372
|
+
if (subagentMarker) debugJson(logger$8, "Detected Subagent marker:", subagentMarker);
|
|
6320
6373
|
let sessionId = getRootSessionId(anthropicPayload, c);
|
|
6321
6374
|
const compactType = getCompactType(anthropicPayload);
|
|
6322
6375
|
const anthropicBeta = c.req.header("anthropic-beta");
|
|
6323
|
-
logger$
|
|
6376
|
+
logger$8.debug("Anthropic Beta header:", anthropicBeta);
|
|
6324
6377
|
const noTools = !anthropicPayload.tools || anthropicPayload.tools.length === 0;
|
|
6325
6378
|
if (anthropicBeta && noTools && compactType === 0) anthropicPayload.model = getSmallModel();
|
|
6326
|
-
if (compactType) logger$
|
|
6379
|
+
if (compactType) logger$8.debug("Compact request type:", compactType);
|
|
6327
6380
|
if (!state.tokenBasedBilling) {
|
|
6328
6381
|
const lastMessageCacheControl = getLastMessageContentCacheControl(anthropicPayload.messages.at(-1));
|
|
6329
6382
|
stripToolReferenceTurnBoundary(anthropicPayload);
|
|
@@ -6331,9 +6384,9 @@ async function handleCompletion(c) {
|
|
|
6331
6384
|
applyLastMessageCacheControl(anthropicPayload, lastMessageCacheControl);
|
|
6332
6385
|
}
|
|
6333
6386
|
const requestId = generateRequestIdFromPayload(anthropicPayload, sessionId);
|
|
6334
|
-
logger$
|
|
6387
|
+
logger$8.debug("Generated request ID:", requestId);
|
|
6335
6388
|
if (!sessionId) sessionId = getUUID(requestId);
|
|
6336
|
-
logger$
|
|
6389
|
+
logger$8.debug("Extracted session ID:", sessionId);
|
|
6337
6390
|
const selectedModel = findEndpointModel(anthropicPayload.model);
|
|
6338
6391
|
anthropicPayload.model = selectedModel?.id ?? anthropicPayload.model;
|
|
6339
6392
|
if (shouldUseMessagesApi(selectedModel)) return await messagesFlowHandlers.handleWithMessagesApi(c, anthropicPayload, {
|
|
@@ -6343,7 +6396,7 @@ async function handleCompletion(c) {
|
|
|
6343
6396
|
requestId,
|
|
6344
6397
|
sessionId,
|
|
6345
6398
|
compactType,
|
|
6346
|
-
logger: logger$
|
|
6399
|
+
logger: logger$8
|
|
6347
6400
|
});
|
|
6348
6401
|
if (shouldUseResponsesApi(selectedModel, compactType)) return await messagesFlowHandlers.handleWithResponsesApi(c, anthropicPayload, {
|
|
6349
6402
|
subagentMarker,
|
|
@@ -6351,7 +6404,7 @@ async function handleCompletion(c) {
|
|
|
6351
6404
|
requestId,
|
|
6352
6405
|
sessionId,
|
|
6353
6406
|
compactType,
|
|
6354
|
-
logger: logger$
|
|
6407
|
+
logger: logger$8
|
|
6355
6408
|
});
|
|
6356
6409
|
return await messagesFlowHandlers.handleWithChatCompletions(c, anthropicPayload, {
|
|
6357
6410
|
subagentMarker,
|
|
@@ -6359,7 +6412,7 @@ async function handleCompletion(c) {
|
|
|
6359
6412
|
requestId,
|
|
6360
6413
|
sessionId,
|
|
6361
6414
|
compactType,
|
|
6362
|
-
logger: logger$
|
|
6415
|
+
logger: logger$8
|
|
6363
6416
|
});
|
|
6364
6417
|
}
|
|
6365
6418
|
const MESSAGES_ENDPOINT = "/v1/messages";
|
|
@@ -6388,17 +6441,46 @@ messageRoutes.post("/count_tokens", async (c) => {
|
|
|
6388
6441
|
}
|
|
6389
6442
|
});
|
|
6390
6443
|
//#endregion
|
|
6444
|
+
//#region src/routes/models/codex-models.ts
|
|
6445
|
+
const logger$7 = createHandlerLogger("codex-models-handler");
|
|
6446
|
+
const CODEX_USER_AGENT_PATTERN = /^codex/iu;
|
|
6447
|
+
function isCodexUserAgent(userAgent) {
|
|
6448
|
+
return CODEX_USER_AGENT_PATTERN.test(userAgent?.trim() ?? "");
|
|
6449
|
+
}
|
|
6450
|
+
async function logCodexModelsResponse(response) {
|
|
6451
|
+
try {
|
|
6452
|
+
const responseText = await response.clone().text();
|
|
6453
|
+
debugJson(logger$7, "models.codex.response", {
|
|
6454
|
+
statusCode: response.status,
|
|
6455
|
+
models: responseText
|
|
6456
|
+
});
|
|
6457
|
+
} catch (error) {
|
|
6458
|
+
logger$7.warn("models.codex.response_log_error", { error });
|
|
6459
|
+
}
|
|
6460
|
+
}
|
|
6461
|
+
/**
|
|
6462
|
+
* Proxies a models request to the fixed Codex upstream models endpoint.
|
|
6463
|
+
* Returns a 404 JSON response when the codex provider is unavailable.
|
|
6464
|
+
* Pass `resolvedProviderConfig` when the caller already resolved the codex
|
|
6465
|
+
* provider to avoid a second resolve.
|
|
6466
|
+
*/
|
|
6467
|
+
async function handleCodexModelsProxy(c, resolvedProviderConfig) {
|
|
6468
|
+
if (!(resolvedProviderConfig ?? await resolveProviderConfig("codex"))) return c.json({ error: {
|
|
6469
|
+
message: "Provider 'codex' not found or disabled",
|
|
6470
|
+
type: "invalid_request_error"
|
|
6471
|
+
} }, 404);
|
|
6472
|
+
const upstreamResponse = await forwardCodexModels(c.req.url, c.req.raw.headers);
|
|
6473
|
+
await logCodexModelsResponse(upstreamResponse);
|
|
6474
|
+
return createProviderProxyResponse(upstreamResponse);
|
|
6475
|
+
}
|
|
6476
|
+
//#endregion
|
|
6391
6477
|
//#region src/routes/models/route.ts
|
|
6392
6478
|
const modelRoutes = new Hono();
|
|
6393
|
-
const logger$
|
|
6479
|
+
const logger$6 = createHandlerLogger("models-handler");
|
|
6394
6480
|
const EPOCH_ISO = (/* @__PURE__ */ new Date(0)).toISOString();
|
|
6395
|
-
const CODEX_USER_AGENT_PATTERN = /^codex/iu;
|
|
6396
6481
|
function isRecord(value) {
|
|
6397
6482
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6398
6483
|
}
|
|
6399
|
-
function isCodexUserAgent(userAgent) {
|
|
6400
|
-
return CODEX_USER_AGENT_PATTERN.test(userAgent?.trim() ?? "");
|
|
6401
|
-
}
|
|
6402
6484
|
function normalizeCopilotModel(model) {
|
|
6403
6485
|
const contextWindow = model.capabilities?.limits?.max_context_window_tokens ?? 0;
|
|
6404
6486
|
const clientId = toClientModelId(model.id);
|
|
@@ -6443,7 +6525,7 @@ async function getProviderModels(provider, requestHeaders) {
|
|
|
6443
6525
|
if (providerConfig.name === "codex") return getModels().data.map((model) => normalizeProviderModel(providerConfig.name, model)).filter((model) => model !== null);
|
|
6444
6526
|
const response = await forwardProviderModels(providerConfig, requestHeaders);
|
|
6445
6527
|
if (!response.ok) {
|
|
6446
|
-
logger$
|
|
6528
|
+
logger$6.warn("models.provider.skip_non_ok", {
|
|
6447
6529
|
provider,
|
|
6448
6530
|
statusCode: response.status
|
|
6449
6531
|
});
|
|
@@ -6451,12 +6533,12 @@ async function getProviderModels(provider, requestHeaders) {
|
|
|
6451
6533
|
}
|
|
6452
6534
|
const body = await response.json();
|
|
6453
6535
|
if (!isRecord(body) || !Array.isArray(body.data)) {
|
|
6454
|
-
logger$
|
|
6536
|
+
logger$6.warn("models.provider.skip_invalid_body", { provider });
|
|
6455
6537
|
return [];
|
|
6456
6538
|
}
|
|
6457
6539
|
return body.data.map((model) => normalizeProviderModel(providerConfig.name, model)).filter((model) => model !== null);
|
|
6458
6540
|
} catch (error) {
|
|
6459
|
-
logger$
|
|
6541
|
+
logger$6.warn("models.provider.skip_error", {
|
|
6460
6542
|
provider,
|
|
6461
6543
|
error
|
|
6462
6544
|
});
|
|
@@ -6474,28 +6556,9 @@ async function getAggregatedModels(requestHeaders) {
|
|
|
6474
6556
|
return true;
|
|
6475
6557
|
});
|
|
6476
6558
|
}
|
|
6477
|
-
async function logCodexModelsResponse(response) {
|
|
6478
|
-
try {
|
|
6479
|
-
const responseText = await response.clone().text();
|
|
6480
|
-
debugJson(logger$4, "models.codex.response", {
|
|
6481
|
-
statusCode: response.status,
|
|
6482
|
-
models: responseText
|
|
6483
|
-
});
|
|
6484
|
-
} catch (error) {
|
|
6485
|
-
logger$4.warn("models.codex.response_log_error", { error });
|
|
6486
|
-
}
|
|
6487
|
-
}
|
|
6488
6559
|
modelRoutes.get("/", async (c) => {
|
|
6489
6560
|
try {
|
|
6490
|
-
if (isCodexUserAgent(c.req.header("user-agent")))
|
|
6491
|
-
if (!await resolveProviderConfig("codex")) return c.json({ error: {
|
|
6492
|
-
message: "Provider 'codex' not found or disabled",
|
|
6493
|
-
type: "invalid_request_error"
|
|
6494
|
-
} }, 404);
|
|
6495
|
-
const upstreamResponse = await forwardCodexModels(c.req.url, c.req.raw.headers);
|
|
6496
|
-
await logCodexModelsResponse(upstreamResponse);
|
|
6497
|
-
return createProviderProxyResponse(upstreamResponse);
|
|
6498
|
-
}
|
|
6561
|
+
if (isCodexUserAgent(c.req.header("user-agent"))) return await handleCodexModelsProxy(c);
|
|
6499
6562
|
const models = await getAggregatedModels(c.req.raw.headers);
|
|
6500
6563
|
return c.json({
|
|
6501
6564
|
object: "list",
|
|
@@ -6507,6 +6570,82 @@ modelRoutes.get("/", async (c) => {
|
|
|
6507
6570
|
}
|
|
6508
6571
|
});
|
|
6509
6572
|
//#endregion
|
|
6573
|
+
//#region src/routes/provider/alpha-search/route.ts
|
|
6574
|
+
const logger$5 = createHandlerLogger("provider-alpha-search-handler");
|
|
6575
|
+
const providerAlphaSearchRoutes = new Hono();
|
|
6576
|
+
providerAlphaSearchRoutes.post("/", async (c) => {
|
|
6577
|
+
const provider = c.req.param("provider") ?? "";
|
|
6578
|
+
try {
|
|
6579
|
+
const providerConfig = await resolveProviderConfig(provider);
|
|
6580
|
+
if (!providerConfig) return c.json({ error: {
|
|
6581
|
+
message: `Provider '${provider}' not found or disabled`,
|
|
6582
|
+
type: "invalid_request_error"
|
|
6583
|
+
} }, 404);
|
|
6584
|
+
if (providerConfig.name === "codex") return await handleCodexAlphaSearch(c, providerConfig);
|
|
6585
|
+
await debugJsonAsync(logger$5, "provider.alpha_search.request", async () => ({
|
|
6586
|
+
body: await c.req.raw.clone().text(),
|
|
6587
|
+
provider
|
|
6588
|
+
}));
|
|
6589
|
+
const upstreamResponse = await forwardProviderAlphaSearch(providerConfig, c.req.raw);
|
|
6590
|
+
await debugJsonAsync(logger$5, "provider.alpha_search.response", async () => ({
|
|
6591
|
+
body: await upstreamResponse.clone().text(),
|
|
6592
|
+
provider,
|
|
6593
|
+
statusCode: upstreamResponse.status
|
|
6594
|
+
}));
|
|
6595
|
+
return createProviderProxyResponse(upstreamResponse);
|
|
6596
|
+
} catch (error) {
|
|
6597
|
+
logger$5.error("provider.alpha_search.error", {
|
|
6598
|
+
provider,
|
|
6599
|
+
error
|
|
6600
|
+
});
|
|
6601
|
+
return await forwardError(c, error);
|
|
6602
|
+
}
|
|
6603
|
+
});
|
|
6604
|
+
//#endregion
|
|
6605
|
+
//#region src/routes/provider/images/route.ts
|
|
6606
|
+
const logger$4 = createHandlerLogger("provider-images-handler");
|
|
6607
|
+
const providerImageRoutes = new Hono();
|
|
6608
|
+
function getContentMetadata(headers) {
|
|
6609
|
+
return {
|
|
6610
|
+
contentType: headers.get("content-type"),
|
|
6611
|
+
contentLength: headers.get("content-length")
|
|
6612
|
+
};
|
|
6613
|
+
}
|
|
6614
|
+
async function handleProviderImages(c, operation) {
|
|
6615
|
+
const provider = c.req.param("provider") ?? "";
|
|
6616
|
+
try {
|
|
6617
|
+
const providerConfig = await resolveProviderConfig(provider);
|
|
6618
|
+
if (!providerConfig) return c.json({ error: {
|
|
6619
|
+
message: `Provider '${provider}' not found or disabled`,
|
|
6620
|
+
type: "invalid_request_error"
|
|
6621
|
+
} }, 404);
|
|
6622
|
+
if (providerConfig.name === "codex") return await handleCodexImages(c, operation, providerConfig);
|
|
6623
|
+
if (operation === "generations") await debugJsonAsync(logger$4, "provider.images.generations.request", async () => ({
|
|
6624
|
+
body: await c.req.raw.clone().text(),
|
|
6625
|
+
provider
|
|
6626
|
+
}));
|
|
6627
|
+
else debugJson(logger$4, "provider.images.edits.request", {
|
|
6628
|
+
...getContentMetadata(c.req.raw.headers),
|
|
6629
|
+
provider
|
|
6630
|
+
});
|
|
6631
|
+
const upstreamResponse = await forwardProviderImages(providerConfig, c.req.raw, operation);
|
|
6632
|
+
debugJson(logger$4, `provider.images.${operation}.response`, {
|
|
6633
|
+
...getContentMetadata(upstreamResponse.headers),
|
|
6634
|
+
provider,
|
|
6635
|
+
statusCode: upstreamResponse.status
|
|
6636
|
+
});
|
|
6637
|
+
return createProviderProxyResponse(upstreamResponse);
|
|
6638
|
+
} catch (error) {
|
|
6639
|
+
logger$4.error(`provider.images.${operation}.error`, {
|
|
6640
|
+
provider,
|
|
6641
|
+
error
|
|
6642
|
+
});
|
|
6643
|
+
return await forwardError(c, error);
|
|
6644
|
+
}
|
|
6645
|
+
}
|
|
6646
|
+
providerImageRoutes.post("/generations", (c) => handleProviderImages(c, "generations"));
|
|
6647
|
+
providerImageRoutes.post("/edits", (c) => handleProviderImages(c, "edits"));
|
|
6648
|
+
//#endregion
|
|
6510
6649
|
//#region src/routes/provider/messages/route.ts
|
|
6511
6650
|
const providerMessageRoutes = new Hono();
|
|
6512
6651
|
providerMessageRoutes.post("/", async (c) => {
|
|
@@ -6536,6 +6675,7 @@ providerModelRoutes.get("/", async (c) => {
|
|
|
6536
6675
|
type: "invalid_request_error"
|
|
6537
6676
|
} }, 404);
|
|
6538
6677
|
if (providerConfig.name === "codex") {
|
|
6678
|
+
if (isCodexUserAgent(c.req.header("user-agent"))) return await handleCodexModelsProxy(c, providerConfig);
|
|
6539
6679
|
const models = getModels();
|
|
6540
6680
|
return c.json({
|
|
6541
6681
|
object: "list",
|
|
@@ -6690,6 +6830,20 @@ const isResponsesStream = (value) => {
|
|
|
6690
6830
|
return Boolean(value) && typeof value[Symbol.asyncIterator] === "function";
|
|
6691
6831
|
};
|
|
6692
6832
|
//#endregion
|
|
6833
|
+
//#region src/routes/provider/responses/route.ts
|
|
6834
|
+
const providerResponsesRoutes = new Hono();
|
|
6835
|
+
providerResponsesRoutes.post("/", async (c) => {
|
|
6836
|
+
try {
|
|
6837
|
+
const provider = c.req.param("provider") ?? "";
|
|
6838
|
+
return await handleProviderResponsesForProvider(c, {
|
|
6839
|
+
payload: await c.req.json(),
|
|
6840
|
+
provider
|
|
6841
|
+
});
|
|
6842
|
+
} catch (error) {
|
|
6843
|
+
return await forwardError(c, error);
|
|
6844
|
+
}
|
|
6845
|
+
});
|
|
6846
|
+
//#endregion
|
|
6693
6847
|
//#region src/routes/responses/stream-id-sync.ts
|
|
6694
6848
|
const createStreamIdTracker = () => ({ outputItems: /* @__PURE__ */ new Map() });
|
|
6695
6849
|
const fixStreamIds = (data, event, tracker) => {
|
|
@@ -6990,7 +7144,10 @@ server.route("/v1/images", imageRoutes);
|
|
|
6990
7144
|
server.route("/v1/messages", messageRoutes);
|
|
6991
7145
|
server.route("/:provider/v1/messages", providerMessageRoutes);
|
|
6992
7146
|
server.route("/:provider/v1/models", providerModelRoutes);
|
|
7147
|
+
server.route("/:provider/v1/responses", providerResponsesRoutes);
|
|
7148
|
+
server.route("/:provider/v1/alpha/search", providerAlphaSearchRoutes);
|
|
7149
|
+
server.route("/:provider/v1/images", providerImageRoutes);
|
|
6993
7150
|
//#endregion
|
|
6994
7151
|
export { server };
|
|
6995
7152
|
|
|
6996
|
-
//# sourceMappingURL=server-
|
|
7153
|
+
//# sourceMappingURL=server-BayMzJcy.js.map
|