@jeffreycao/copilot-api 2.5.1 → 2.5.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 +8 -4
- package/README.zh-CN.md +8 -4
- package/dist/auth-BZLuISLH.js +2 -0
- package/dist/{auth-DmWqSrc5.js → auth-BjbkSiVc.js} +3 -3
- package/dist/{auth-DmWqSrc5.js.map → auth-BjbkSiVc.js.map} +1 -1
- package/dist/{config-Cb0atQ6i.js → config-DYtohLpX.js} +42 -30
- package/dist/config-DYtohLpX.js.map +1 -0
- package/dist/{debug-Clt-tTwv.js → debug-CcgIYPL-.js} +2 -2
- package/dist/{debug-Clt-tTwv.js.map → debug-CcgIYPL-.js.map} +1 -1
- package/dist/main.js +3 -3
- package/dist/{models-DvNveb2V.js → models-DRiRPEy3.js} +2 -2
- package/dist/{models-DvNveb2V.js.map → models-DRiRPEy3.js.map} +1 -1
- package/dist/{server-D5XuGc4z.js → server-DriTUys0.js} +190 -80
- package/dist/server-DriTUys0.js.map +1 -0
- package/dist/{start-Br5i1XfC.js → start-DJrCCMlX.js} +28 -11
- package/dist/{start-Br5i1XfC.js.map → start-DJrCCMlX.js.map} +1 -1
- package/dist/{token-DYqRXNhu.js → token-Bm_dyi5a.js} +79 -66
- package/dist/token-Bm_dyi5a.js.map +1 -0
- package/package.json +1 -1
- package/dist/auth-DwBD3QBJ.js +0 -2
- package/dist/config-Cb0atQ6i.js.map +0 -1
- package/dist/server-D5XuGc4z.js.map +0 -1
- package/dist/token-DYqRXNhu.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { A as isResponsesApiWebSocketEnabled, C as getClaudeTokenMultiplier, D as isAlphaSearchCodexPriorityEnabled, E as
|
|
2
|
-
import {
|
|
1
|
+
import { A as isResponsesApiWebSocketEnabled, C as getClaudeTokenMultiplier, D as isAlphaSearchCodexPriorityEnabled, E as getUpstreamTransportConfig, N as PATHS, O as isMessagesApiEnabled, 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, k as isResponsesApiWebSearchEnabled, 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-DYtohLpX.js";
|
|
2
|
+
import { A as compactTextOnlyGuard, B as requestContext, C as prepareInteractionHeaders, D as compactMessageSections, E as compactAutoContinuePromptStarts, G as encodePoolKeyPart, H as fetchUpstreamWithLifecycle, I as CODEX_API_BASE_URL, J as createWebSocketUrl, K as isTerminalResponsesStreamChunk, L as buildCodexRequestHeaders, M as getConfiguredAdminApiKeys, R as forwardCodexResponses, S as prepareForCompact, U as createResponsesHttpEventStream, V as resolveTraceId$1, W as createResponsesSafeStream, X as HTTPError, Y as state, Z as forwardError, c as getUUID, d as isResponsesStream, f as parseUserIdMetadata, j as createAuthMiddleware, k as compactSystemPromptStarts, l as isAsyncIterable, m as getCopilotUsage, o as generateRequestIdFromPayload, p as sleep, q as createPooledWebSocketStream, r as setupCodexToken, s as getRootSessionId, u as isNullish, v as copilotBaseUrl, w as prepareMessageProxyHeaders, x as copilotWebSocketHeaders, y as copilotHeaders, z as generateTraceId } from "./token-Bm_dyi5a.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-DRiRPEy3.js";
|
|
5
5
|
import consola from "consola";
|
|
6
6
|
import { createHash } from "node:crypto";
|
|
7
7
|
import fs, { createWriteStream, readFileSync, rmSync } from "node:fs";
|
|
@@ -516,6 +516,36 @@ const builtinProviderModelRegistry = new class BuiltinProviderModelRegistry {
|
|
|
516
516
|
output: 28
|
|
517
517
|
}
|
|
518
518
|
},
|
|
519
|
+
"ZHIPU/GLM-5.3": {
|
|
520
|
+
contextWindow: 1048576,
|
|
521
|
+
inputModalities: ["text"],
|
|
522
|
+
maxOutputTokens: 131072,
|
|
523
|
+
pricing: {
|
|
524
|
+
cachedInput: 2,
|
|
525
|
+
input: 8,
|
|
526
|
+
output: 28
|
|
527
|
+
},
|
|
528
|
+
reasoningEfforts: [
|
|
529
|
+
"low",
|
|
530
|
+
"high",
|
|
531
|
+
"max"
|
|
532
|
+
]
|
|
533
|
+
},
|
|
534
|
+
"ZHIPU/GLM-5.3-Flash": {
|
|
535
|
+
contextWindow: 1048576,
|
|
536
|
+
inputModalities: ["text", "image"],
|
|
537
|
+
maxOutputTokens: 131072,
|
|
538
|
+
pricing: {
|
|
539
|
+
cachedInput: .23,
|
|
540
|
+
input: .8,
|
|
541
|
+
output: 2.8
|
|
542
|
+
},
|
|
543
|
+
reasoningEfforts: [
|
|
544
|
+
"low",
|
|
545
|
+
"high",
|
|
546
|
+
"max"
|
|
547
|
+
]
|
|
548
|
+
},
|
|
519
549
|
"qwen3.7-max": {
|
|
520
550
|
contextWindow: 1e6,
|
|
521
551
|
inputModalities: ["text"],
|
|
@@ -540,6 +570,30 @@ const builtinProviderModelRegistry = new class BuiltinProviderModelRegistry {
|
|
|
540
570
|
output: 36
|
|
541
571
|
}
|
|
542
572
|
},
|
|
573
|
+
"qwen3.8-max-0902": {
|
|
574
|
+
contextWindow: 1e6,
|
|
575
|
+
inputModalities: ["text", "image"],
|
|
576
|
+
maxOutputTokens: 131072,
|
|
577
|
+
pricing: {
|
|
578
|
+
cachedInput: 1.5,
|
|
579
|
+
cacheCreationInput: 15,
|
|
580
|
+
explicitCachedInput: 1,
|
|
581
|
+
input: 12,
|
|
582
|
+
output: 36
|
|
583
|
+
}
|
|
584
|
+
},
|
|
585
|
+
"qwen3.8-flash": {
|
|
586
|
+
contextWindow: 1e6,
|
|
587
|
+
inputModalities: ["text", "image"],
|
|
588
|
+
maxOutputTokens: 131072,
|
|
589
|
+
pricing: {
|
|
590
|
+
cachedInput: .1,
|
|
591
|
+
cacheCreationInput: 1.25,
|
|
592
|
+
explicitCachedInput: .1,
|
|
593
|
+
input: .8,
|
|
594
|
+
output: 2.7
|
|
595
|
+
}
|
|
596
|
+
},
|
|
543
597
|
"deepseek-v4-flash-0731": {
|
|
544
598
|
contextWindow: 1e6,
|
|
545
599
|
inputModalities: ["text"],
|
|
@@ -947,7 +1001,8 @@ const builtinProviderModelRegistry = new class BuiltinProviderModelRegistry {
|
|
|
947
1001
|
this.modelCatalog = BuiltinProviderModelRegistry.catalog;
|
|
948
1002
|
}
|
|
949
1003
|
getModelConfig(providerName, modelName) {
|
|
950
|
-
|
|
1004
|
+
const models = this.modelCatalog[this.normalizeKey(providerName)];
|
|
1005
|
+
return models?.[modelName.trim()] ?? models?.[this.normalizeKey(modelName)];
|
|
951
1006
|
}
|
|
952
1007
|
getModelIds(providerName) {
|
|
953
1008
|
return Object.keys(this.modelCatalog[this.normalizeKey(providerName)] ?? {});
|
|
@@ -2156,7 +2211,9 @@ const isCopilotQuotaSnapshot = (value) => {
|
|
|
2156
2211
|
};
|
|
2157
2212
|
//#endregion
|
|
2158
2213
|
//#region src/services/copilot/create-responses.ts
|
|
2159
|
-
const
|
|
2214
|
+
const ROOT_AGENT_MESSAGE_DELAY_MS = 1e3;
|
|
2215
|
+
const createResponsesDependencies = { sleep };
|
|
2216
|
+
const createResponses = async (payload, { vision, initiator, subagentMarker, requestId, sessionId, compactType, transport = "http", clientSignal }) => {
|
|
2160
2217
|
if (!state.copilotToken) throw new Error("Copilot token not found");
|
|
2161
2218
|
const headers = {
|
|
2162
2219
|
...copilotHeaders(state, requestId, vision),
|
|
@@ -2167,22 +2224,30 @@ const createResponses = async (payload, { vision, initiator, subagentMarker, req
|
|
|
2167
2224
|
payload.service_tier = void 0;
|
|
2168
2225
|
consola.log(`<-- model: ${payload.model}`);
|
|
2169
2226
|
const effectiveTransport = compactType === 1 ? "http" : transport;
|
|
2170
|
-
if (payload.stream === true && effectiveTransport === "websocket")
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
|
|
2227
|
+
if (payload.stream === true && effectiveTransport === "websocket") {
|
|
2228
|
+
clientSignal?.throwIfAborted();
|
|
2229
|
+
if (shouldDelaySubagentRequestAfterRootMessage(payload.input)) await createResponsesDependencies.sleep(ROOT_AGENT_MESSAGE_DELAY_MS);
|
|
2230
|
+
return createPooledResponsesWebSocketStream(prepareResponsesWebSocketRequest(payload, headers, {
|
|
2231
|
+
requestId,
|
|
2232
|
+
subagentMarker
|
|
2233
|
+
}), clientSignal);
|
|
2234
|
+
}
|
|
2235
|
+
return await createHttpResponses(payload, headers, clientSignal);
|
|
2236
|
+
};
|
|
2237
|
+
const shouldDelaySubagentRequestAfterRootMessage = (input) => {
|
|
2238
|
+
if (!Array.isArray(input)) return false;
|
|
2239
|
+
const lastItem = input.at(-1);
|
|
2240
|
+
return typeof lastItem === "object" && lastItem !== null && "type" in lastItem && lastItem.type === "agent_message" && "author" in lastItem && lastItem.author === "/root";
|
|
2176
2241
|
};
|
|
2177
|
-
const createHttpResponses = async (payload, headers,
|
|
2178
|
-
const transportConfig =
|
|
2179
|
-
const response = await
|
|
2242
|
+
const createHttpResponses = async (payload, headers, clientSignal) => {
|
|
2243
|
+
const transportConfig = getUpstreamTransportConfig();
|
|
2244
|
+
const response = await fetchUpstreamWithLifecycle(`${copilotBaseUrl(state)}/responses`, {
|
|
2180
2245
|
method: "POST",
|
|
2181
2246
|
headers,
|
|
2182
2247
|
body: JSON.stringify(payload)
|
|
2183
2248
|
}, {
|
|
2249
|
+
clientSignal,
|
|
2184
2250
|
headersTimeoutMs: transportConfig.headersTimeoutMs,
|
|
2185
|
-
signal,
|
|
2186
2251
|
streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
|
|
2187
2252
|
});
|
|
2188
2253
|
logCopilotRateLimits(response.headers);
|
|
@@ -2190,7 +2255,7 @@ const createHttpResponses = async (payload, headers, signal) => {
|
|
|
2190
2255
|
consola.error("Failed to create responses", response);
|
|
2191
2256
|
throw new HTTPError("Failed to create responses", response);
|
|
2192
2257
|
}
|
|
2193
|
-
if (payload.stream) return createResponsesSafeStream(createResponsesHttpEventStream(response
|
|
2258
|
+
if (payload.stream) return createResponsesSafeStream(createResponsesHttpEventStream(response));
|
|
2194
2259
|
return await response.json();
|
|
2195
2260
|
};
|
|
2196
2261
|
const prepareResponsesWebSocketRequest = (payload, preparedHeaders, options) => {
|
|
@@ -2199,7 +2264,6 @@ const prepareResponsesWebSocketRequest = (payload, preparedHeaders, options) =>
|
|
|
2199
2264
|
headers: copilotWebSocketHeaders(preparedHeaders),
|
|
2200
2265
|
poolKey: buildResponsesWebSocketPoolKey(payload, options),
|
|
2201
2266
|
payload: buildResponsesWebSocketPayload(payload, initiator),
|
|
2202
|
-
signal: options.signal,
|
|
2203
2267
|
url: buildResponsesWebSocketUrl(copilotBaseUrl(state))
|
|
2204
2268
|
};
|
|
2205
2269
|
};
|
|
@@ -2220,9 +2284,10 @@ const buildResponsesWebSocketPoolKey = (payload, { requestId, subagentMarker })
|
|
|
2220
2284
|
const getResponsesWebSocketInitiator = (preparedHeaders) => {
|
|
2221
2285
|
return getHeaderValue(preparedHeaders, "x-initiator")?.toLowerCase() === "agent" ? "agent" : "user";
|
|
2222
2286
|
};
|
|
2223
|
-
const createPooledResponsesWebSocketStream = (request) => {
|
|
2224
|
-
|
|
2225
|
-
|
|
2287
|
+
const createPooledResponsesWebSocketStream = (request, clientSignal) => createResponsesSafeStream(createClientPreflightStream(createPooledWebSocketStream(request, { ...getResponsesWebSocketOptions() }), clientSignal));
|
|
2288
|
+
const getResponsesWebSocketOptions = () => {
|
|
2289
|
+
const transportConfig = getUpstreamTransportConfig();
|
|
2290
|
+
return {
|
|
2226
2291
|
createChunk: createResponsesWebSocketStreamChunk,
|
|
2227
2292
|
maxBufferedBytes: transportConfig.websocketMaxBufferedBytes,
|
|
2228
2293
|
maxBufferedMessages: transportConfig.websocketMaxBufferedMessages,
|
|
@@ -2233,7 +2298,11 @@ const createPooledResponsesWebSocketStream = (request) => {
|
|
|
2233
2298
|
streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,
|
|
2234
2299
|
streamErrorMessage: "Upstream connection lost, Responses websocket stream error",
|
|
2235
2300
|
terminalChunkMissingMessage: "Responses websocket ended without a terminal response, retry your request."
|
|
2236
|
-
}
|
|
2301
|
+
};
|
|
2302
|
+
};
|
|
2303
|
+
const createClientPreflightStream = async function* (source, clientSignal) {
|
|
2304
|
+
if (clientSignal?.aborted) return;
|
|
2305
|
+
yield* source;
|
|
2237
2306
|
};
|
|
2238
2307
|
const buildResponsesWebSocketPayload = (payload, initiator) => {
|
|
2239
2308
|
const websocketPayload = {
|
|
@@ -2345,38 +2414,48 @@ function createProviderProxyResponse(upstreamResponse, body) {
|
|
|
2345
2414
|
statusText: upstreamResponse.statusText
|
|
2346
2415
|
});
|
|
2347
2416
|
}
|
|
2348
|
-
async function forwardProviderMessages(providerConfig, payload, requestHeaders) {
|
|
2417
|
+
async function forwardProviderMessages(providerConfig, payload, requestHeaders, options = {}) {
|
|
2349
2418
|
consola.log(`<-- model: ${payload.model}`);
|
|
2350
2419
|
const headers = buildProviderUpstreamHeaders(providerConfig, requestHeaders);
|
|
2351
2420
|
applyOpencodeSessionHeader(providerConfig, headers, resolveOpencodeMessagesSession(payload));
|
|
2352
|
-
|
|
2421
|
+
const transportConfig = getUpstreamTransportConfig();
|
|
2422
|
+
return await fetchUpstreamWithLifecycle(`${providerConfig.baseUrl}/v1/messages`, {
|
|
2353
2423
|
method: "POST",
|
|
2354
2424
|
headers,
|
|
2355
2425
|
body: JSON.stringify(payload)
|
|
2426
|
+
}, {
|
|
2427
|
+
clientSignal: options.clientSignal,
|
|
2428
|
+
headersTimeoutMs: transportConfig.headersTimeoutMs,
|
|
2429
|
+
streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
|
|
2356
2430
|
});
|
|
2357
2431
|
}
|
|
2358
|
-
async function forwardProviderChatCompletions(providerConfig, payload, requestHeaders) {
|
|
2432
|
+
async function forwardProviderChatCompletions(providerConfig, payload, requestHeaders, options = {}) {
|
|
2359
2433
|
consola.log(`<-- model: ${payload.model}`);
|
|
2360
2434
|
const headers = buildProviderUpstreamHeaders(providerConfig, requestHeaders);
|
|
2361
2435
|
applyOpencodeSessionHeader(providerConfig, headers, payload.prompt_cache_key?.trim() || void 0);
|
|
2362
|
-
|
|
2436
|
+
const transportConfig = getUpstreamTransportConfig();
|
|
2437
|
+
return await fetchUpstreamWithLifecycle(`${providerConfig.baseUrl}/v1/chat/completions`, {
|
|
2363
2438
|
method: "POST",
|
|
2364
2439
|
headers,
|
|
2365
2440
|
body: JSON.stringify(payload)
|
|
2441
|
+
}, {
|
|
2442
|
+
clientSignal: options.clientSignal,
|
|
2443
|
+
headersTimeoutMs: transportConfig.headersTimeoutMs,
|
|
2444
|
+
streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
|
|
2366
2445
|
});
|
|
2367
2446
|
}
|
|
2368
2447
|
async function forwardProviderResponses(providerConfig, payload, requestHeaders, options = {}) {
|
|
2369
2448
|
consola.log(`<-- model: ${payload.model}`);
|
|
2370
|
-
const transportConfig =
|
|
2449
|
+
const transportConfig = getUpstreamTransportConfig();
|
|
2371
2450
|
const headers = buildProviderUpstreamHeaders(providerConfig, requestHeaders);
|
|
2372
2451
|
applyOpencodeSessionHeader(providerConfig, headers, payload.prompt_cache_key?.trim() || void 0);
|
|
2373
|
-
return await
|
|
2452
|
+
return await fetchUpstreamWithLifecycle(`${providerConfig.baseUrl}/v1/responses`, {
|
|
2374
2453
|
method: "POST",
|
|
2375
2454
|
headers,
|
|
2376
2455
|
body: JSON.stringify(payload)
|
|
2377
2456
|
}, {
|
|
2378
2457
|
headersTimeoutMs: transportConfig.headersTimeoutMs,
|
|
2379
|
-
|
|
2458
|
+
clientSignal: options.clientSignal,
|
|
2380
2459
|
streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
|
|
2381
2460
|
});
|
|
2382
2461
|
}
|
|
@@ -2396,13 +2475,18 @@ function resolveProviderRequestUrl(providerConfig, requestUrl, path) {
|
|
|
2396
2475
|
upstreamUrl.search = new URL(requestUrl, "http://localhost").search;
|
|
2397
2476
|
return upstreamUrl.toString();
|
|
2398
2477
|
}
|
|
2399
|
-
async function forwardProviderAlphaSearch(providerConfig, request) {
|
|
2478
|
+
async function forwardProviderAlphaSearch(providerConfig, request, options = {}) {
|
|
2400
2479
|
const headers = buildProviderUpstreamHeaders(providerConfig, request.headers);
|
|
2401
2480
|
const body = await request.arrayBuffer();
|
|
2402
|
-
|
|
2481
|
+
const transportConfig = getUpstreamTransportConfig();
|
|
2482
|
+
return await fetchUpstreamWithLifecycle(resolveProviderRequestUrl(providerConfig, request.url, "/v1/alpha/search"), {
|
|
2403
2483
|
method: "POST",
|
|
2404
2484
|
headers,
|
|
2405
2485
|
body
|
|
2486
|
+
}, {
|
|
2487
|
+
clientSignal: options.clientSignal,
|
|
2488
|
+
headersTimeoutMs: transportConfig.headersTimeoutMs,
|
|
2489
|
+
streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
|
|
2406
2490
|
});
|
|
2407
2491
|
}
|
|
2408
2492
|
async function forwardProviderImages(providerConfig, request, operation) {
|
|
@@ -2788,7 +2872,7 @@ async function requestProviderSearch(c, providerConfig, payload, model, sessionI
|
|
|
2788
2872
|
payload,
|
|
2789
2873
|
provider: providerConfig.name
|
|
2790
2874
|
});
|
|
2791
|
-
const upstreamResponse = await forwardProviderResponses(providerConfig, payload, c.req.raw.headers, {
|
|
2875
|
+
const upstreamResponse = await forwardProviderResponses(providerConfig, payload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
|
|
2792
2876
|
if (!upstreamResponse.ok) throw new HTTPError(`Failed to create ${providerConfig.name} responses for alpha search`, upstreamResponse);
|
|
2793
2877
|
const result = await upstreamResponse.json();
|
|
2794
2878
|
debugJson(logger$17, "Alpha search provider Responses result:", {
|
|
@@ -2806,7 +2890,7 @@ async function requestProviderSearch(c, providerConfig, payload, model, sessionI
|
|
|
2806
2890
|
})(normalizeResponsesUsage(result.usage));
|
|
2807
2891
|
return result;
|
|
2808
2892
|
}
|
|
2809
|
-
async function requestCopilotSearch(payload, model, requestId, sessionId,
|
|
2893
|
+
async function requestCopilotSearch(payload, model, requestId, sessionId, clientSignal) {
|
|
2810
2894
|
debugJson(logger$17, "Alpha search Copilot Responses request:", payload);
|
|
2811
2895
|
const result = await alphaSearchResponsesDependencies.createResponses(payload, {
|
|
2812
2896
|
vision: false,
|
|
@@ -2814,7 +2898,7 @@ async function requestCopilotSearch(payload, model, requestId, sessionId, signal
|
|
|
2814
2898
|
transport: "http",
|
|
2815
2899
|
requestId,
|
|
2816
2900
|
sessionId,
|
|
2817
|
-
|
|
2901
|
+
clientSignal
|
|
2818
2902
|
});
|
|
2819
2903
|
debugJson(logger$17, "Alpha search Copilot Responses result:", result);
|
|
2820
2904
|
alphaSearchResponsesDependencies.createUsageRecorder(model, sessionId)({
|
|
@@ -3069,6 +3153,18 @@ alphaSearchRoutes.post("/", async (c) => {
|
|
|
3069
3153
|
}
|
|
3070
3154
|
});
|
|
3071
3155
|
//#endregion
|
|
3156
|
+
//#region src/lib/sse.ts
|
|
3157
|
+
async function writeSSEIfConnected(stream, message) {
|
|
3158
|
+
if (stream.aborted) return false;
|
|
3159
|
+
try {
|
|
3160
|
+
await stream.writeSSE(message);
|
|
3161
|
+
return true;
|
|
3162
|
+
} catch (error) {
|
|
3163
|
+
if (stream.aborted) return false;
|
|
3164
|
+
throw error;
|
|
3165
|
+
}
|
|
3166
|
+
}
|
|
3167
|
+
//#endregion
|
|
3072
3168
|
//#region src/lib/dashscope.ts
|
|
3073
3169
|
const OPENAI_COMPATIBLE_CONTEXT_CACHE_MARKER_LIMIT = 4;
|
|
3074
3170
|
const OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL = { type: "ephemeral" };
|
|
@@ -3210,7 +3306,7 @@ async function handleProviderChatCompletionsForProvider(c, options) {
|
|
|
3210
3306
|
payload,
|
|
3211
3307
|
provider
|
|
3212
3308
|
});
|
|
3213
|
-
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, payload, c.req.raw.headers);
|
|
3309
|
+
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, payload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
|
|
3214
3310
|
if (!upstreamResponse.ok) {
|
|
3215
3311
|
logger$15.error("Failed to create provider chat completions", {
|
|
3216
3312
|
provider,
|
|
@@ -3258,7 +3354,7 @@ const streamProviderChatCompletions = (c, upstreamResponse, options) => {
|
|
|
3258
3354
|
const parsedChunk = parseChatCompletionChunkData(chunk.data);
|
|
3259
3355
|
if (parsedChunk?.usage) usage = normalizeOpenAIUsage(parsedChunk.usage);
|
|
3260
3356
|
}
|
|
3261
|
-
await stream
|
|
3357
|
+
await writeSSEIfConnected(stream, {
|
|
3262
3358
|
event: chunk.event,
|
|
3263
3359
|
data: chunk.data ?? ""
|
|
3264
3360
|
});
|
|
@@ -3292,10 +3388,15 @@ const createChatCompletions = async (payload, options) => {
|
|
|
3292
3388
|
prepareInteractionHeaders(options.sessionId, Boolean(options.subagentMarker), headers);
|
|
3293
3389
|
prepareForCompact(headers, options.compactType);
|
|
3294
3390
|
consola.log(`<-- model: ${payload.model}`);
|
|
3295
|
-
const
|
|
3391
|
+
const transportConfig = getUpstreamTransportConfig();
|
|
3392
|
+
const response = await fetchUpstreamWithLifecycle(`${copilotBaseUrl(state)}/chat/completions`, {
|
|
3296
3393
|
method: "POST",
|
|
3297
3394
|
headers,
|
|
3298
3395
|
body: JSON.stringify(payload)
|
|
3396
|
+
}, {
|
|
3397
|
+
clientSignal: options.clientSignal,
|
|
3398
|
+
headersTimeoutMs: transportConfig.headersTimeoutMs,
|
|
3399
|
+
streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
|
|
3299
3400
|
});
|
|
3300
3401
|
logCopilotRateLimits(response.headers);
|
|
3301
3402
|
if (!response.ok) {
|
|
@@ -3345,6 +3446,7 @@ async function handleCompletion$1(c) {
|
|
|
3345
3446
|
model: payload.model
|
|
3346
3447
|
});
|
|
3347
3448
|
const response = await createChatCompletions(payload, {
|
|
3449
|
+
clientSignal: c.req.raw.signal,
|
|
3348
3450
|
requestId,
|
|
3349
3451
|
sessionId
|
|
3350
3452
|
});
|
|
@@ -3366,7 +3468,7 @@ async function handleCompletion$1(c) {
|
|
|
3366
3468
|
...normalizeOpenAIUsage(parsedChunk.usage),
|
|
3367
3469
|
total_nano_aiu: normalizeOptionalToken(parsedChunk.copilot_usage?.total_nano_aiu)
|
|
3368
3470
|
};
|
|
3369
|
-
await stream
|
|
3471
|
+
await writeSSEIfConnected(stream, chunk);
|
|
3370
3472
|
}
|
|
3371
3473
|
recordUsage(usage);
|
|
3372
3474
|
});
|
|
@@ -6579,7 +6681,8 @@ const MESSAGES_TOOL_CALL_TIPS = [
|
|
|
6579
6681
|
"- Construct all tools.exec_command(...) arguments strictly according to its tool definition, and use OS/shell-compatible commands for Windows, Linux, and macOS.",
|
|
6580
6682
|
"- Always assign the awaited tools.exec_command(...) call to a variable and forward the full result with text(JSON.stringify(r)); unforwarded output is silently dropped and makes results look empty.",
|
|
6581
6683
|
"- Yielded execution is not truncated output. Resume a running `cell_id` with `functions.wait`, and a live `session_id` with `tools.write_stdin`, until the command reaches a terminal result.",
|
|
6582
|
-
"- Read files with the OS-native command (Get-Content/Test-Path on Windows PowerShell, cat/ls on POSIX), quote paths containing spaces, and verify the forwarded output is non-empty before concluding a file was read."
|
|
6684
|
+
"- Read files with the OS-native command (Get-Content/Test-Path on Windows PowerShell, cat/ls on POSIX), quote paths containing spaces, and verify the forwarded output is non-empty before concluding a file was read.",
|
|
6685
|
+
"- For long-running commands, keep the returned `session_id` and poll it with `tools.write_stdin` until the command finishes; do not redirect output to a temp file and read it back in a second call."
|
|
6583
6686
|
].join("\n");
|
|
6584
6687
|
const COMPACTION_REPLAY_PROMPT = "The previous conversation was compacted. Continue from this handoff summary:\n\n";
|
|
6585
6688
|
const MAX_DEVELOPER_PROMPTS = 5;
|
|
@@ -7667,7 +7770,7 @@ const handleWebSearchViaResponses = async (c, payload, options) => {
|
|
|
7667
7770
|
subagentMarker: options.subagentMarker,
|
|
7668
7771
|
requestId: options.requestId,
|
|
7669
7772
|
sessionId: options.sessionId,
|
|
7670
|
-
|
|
7773
|
+
clientSignal: c.req?.raw?.signal,
|
|
7671
7774
|
compactType: options.compactType
|
|
7672
7775
|
});
|
|
7673
7776
|
const result = isWebSearchResponsesStream(upstreamResult) ? await collectResponsesStreamResult({
|
|
@@ -7686,7 +7789,7 @@ const handleWebSearchViaResponses = async (c, payload, options) => {
|
|
|
7686
7789
|
for (const event of buildSyntheticStreamEvents(response)) {
|
|
7687
7790
|
const data = JSON.stringify(event);
|
|
7688
7791
|
logger.debug(`Web search stream event`, data);
|
|
7689
|
-
await stream
|
|
7792
|
+
await writeSSEIfConnected(stream, {
|
|
7690
7793
|
event: event.type,
|
|
7691
7794
|
data
|
|
7692
7795
|
});
|
|
@@ -8005,7 +8108,7 @@ async function handleProviderMessagesForProvider(c, options) {
|
|
|
8005
8108
|
...providerConfig,
|
|
8006
8109
|
type: effectiveType,
|
|
8007
8110
|
authType: resolveOverrideProviderAuthType(providerConfig, effectiveType)
|
|
8008
|
-
}, payload, c.req.raw.headers);
|
|
8111
|
+
}, payload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
|
|
8009
8112
|
if (!upstreamResponse.ok) {
|
|
8010
8113
|
logger$10.error("Failed to create responses", upstreamResponse);
|
|
8011
8114
|
throw new HTTPError("Failed to create responses", upstreamResponse);
|
|
@@ -8046,7 +8149,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
8046
8149
|
provider
|
|
8047
8150
|
});
|
|
8048
8151
|
if (providerConfig.name === "codex") {
|
|
8049
|
-
const upstreamResponse = await forwardCodexResponses(responsesPayload, c.req.raw.headers, providerConfig.baseUrl, {
|
|
8152
|
+
const upstreamResponse = await forwardCodexResponses(responsesPayload, c.req.raw.headers, providerConfig.baseUrl, { clientSignal: c.req.raw.signal });
|
|
8050
8153
|
if (isResponsesStream(upstreamResponse)) return respondWebSearchProviderMessagesJson(c, {
|
|
8051
8154
|
body: await collectResponsesStreamResult({
|
|
8052
8155
|
errorMessagePrefix: `${provider} web search responses stream`,
|
|
@@ -8069,7 +8172,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
8069
8172
|
usageEndpoint
|
|
8070
8173
|
});
|
|
8071
8174
|
}
|
|
8072
|
-
const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers, {
|
|
8175
|
+
const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
|
|
8073
8176
|
if (!upstreamResponse.ok) {
|
|
8074
8177
|
logger$10.error("Failed to create provider web search responses", {
|
|
8075
8178
|
provider,
|
|
@@ -8081,7 +8184,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
8081
8184
|
body: await collectResponsesStreamResult({
|
|
8082
8185
|
errorMessagePrefix: `${provider} web search responses stream`,
|
|
8083
8186
|
parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
|
|
8084
|
-
upstreamResponse: createResponsesHttpEventStream(upstreamResponse
|
|
8187
|
+
upstreamResponse: createResponsesHttpEventStream(upstreamResponse),
|
|
8085
8188
|
logger: logger$10
|
|
8086
8189
|
}),
|
|
8087
8190
|
modelConfig,
|
|
@@ -8113,7 +8216,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
8113
8216
|
provider
|
|
8114
8217
|
});
|
|
8115
8218
|
if (providerConfig.name === "codex") {
|
|
8116
|
-
const upstreamResponse = await forwardCodexResponses(responsesPayload, c.req.raw.headers, providerConfig.baseUrl, {
|
|
8219
|
+
const upstreamResponse = await forwardCodexResponses(responsesPayload, c.req.raw.headers, providerConfig.baseUrl, { clientSignal: c.req.raw.signal });
|
|
8117
8220
|
if (isResponsesStream(upstreamResponse)) {
|
|
8118
8221
|
if (wantsStream) return streamResponsesProviderMessages({
|
|
8119
8222
|
c,
|
|
@@ -8150,7 +8253,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
8150
8253
|
usageEndpoint
|
|
8151
8254
|
});
|
|
8152
8255
|
}
|
|
8153
|
-
const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers, {
|
|
8256
|
+
const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
|
|
8154
8257
|
if (!upstreamResponse.ok) {
|
|
8155
8258
|
logger$10.error("Failed to create provider responses", upstreamResponse);
|
|
8156
8259
|
throw new HTTPError("Failed to create provider responses", upstreamResponse);
|
|
@@ -8162,7 +8265,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
8162
8265
|
pricingCurrency: providerConfig.pricingCurrency,
|
|
8163
8266
|
provider,
|
|
8164
8267
|
providerConfig,
|
|
8165
|
-
upstreamResponse: createResponsesSafeStream(createResponsesHttpEventStream(upstreamResponse
|
|
8268
|
+
upstreamResponse: createResponsesSafeStream(createResponsesHttpEventStream(upstreamResponse)),
|
|
8166
8269
|
usageEndpoint
|
|
8167
8270
|
});
|
|
8168
8271
|
return respondResponsesProviderMessagesJson(c, {
|
|
@@ -8201,7 +8304,7 @@ const handleOpenAICompatibleProviderMessages = async (c, options) => {
|
|
|
8201
8304
|
payload: openAIPayload,
|
|
8202
8305
|
provider
|
|
8203
8306
|
});
|
|
8204
|
-
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, openAIPayload, c.req.raw.headers);
|
|
8307
|
+
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, openAIPayload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
|
|
8205
8308
|
if (!upstreamResponse.ok) {
|
|
8206
8309
|
logger$10.error("Failed to create openai-compatible responses", upstreamResponse);
|
|
8207
8310
|
throw new HTTPError("Failed to create openai-compatible responses", upstreamResponse);
|
|
@@ -8283,7 +8386,7 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
|
|
|
8283
8386
|
logger$10.debug("provider.messages.raw_stream_event:", chunk.data);
|
|
8284
8387
|
const eventName = chunk.event;
|
|
8285
8388
|
if (eventName === "ping") {
|
|
8286
|
-
await stream
|
|
8389
|
+
await writeSSEIfConnected(stream, {
|
|
8287
8390
|
event: "ping",
|
|
8288
8391
|
data: "{\"type\":\"ping\"}"
|
|
8289
8392
|
});
|
|
@@ -8303,7 +8406,7 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
|
|
|
8303
8406
|
data,
|
|
8304
8407
|
event: eventName
|
|
8305
8408
|
}];
|
|
8306
|
-
for (const streamEvent of streamEvents) await stream
|
|
8409
|
+
for (const streamEvent of streamEvents) await writeSSEIfConnected(stream, {
|
|
8307
8410
|
event: streamEvent.event,
|
|
8308
8411
|
data: streamEvent.data
|
|
8309
8412
|
});
|
|
@@ -8317,7 +8420,7 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
|
|
|
8317
8420
|
if (!messageStopSeen && !errorSeen) {
|
|
8318
8421
|
logger$10.warn("provider.messages.stream_incomplete:", { provider });
|
|
8319
8422
|
const errorEvent = translateErrorToAnthropicErrorEvent();
|
|
8320
|
-
await stream
|
|
8423
|
+
await writeSSEIfConnected(stream, {
|
|
8321
8424
|
event: errorEvent.type,
|
|
8322
8425
|
data: JSON.stringify(errorEvent)
|
|
8323
8426
|
});
|
|
@@ -8342,7 +8445,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
8342
8445
|
for await (const chunk of events(upstreamResponse)) {
|
|
8343
8446
|
logger$10.debug("provider.messages.openai_compatible.raw_stream_event:", chunk.data);
|
|
8344
8447
|
if (chunk.event === "ping") {
|
|
8345
|
-
await stream
|
|
8448
|
+
await writeSSEIfConnected(stream, {
|
|
8346
8449
|
event: "ping",
|
|
8347
8450
|
data: "{\"type\":\"ping\"}"
|
|
8348
8451
|
});
|
|
@@ -8359,7 +8462,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
8359
8462
|
for (const event of events) {
|
|
8360
8463
|
const eventData = JSON.stringify(event);
|
|
8361
8464
|
debugLazy(logger$10, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
|
|
8362
|
-
await stream
|
|
8465
|
+
await writeSSEIfConnected(stream, {
|
|
8363
8466
|
event: event.type,
|
|
8364
8467
|
data: eventData
|
|
8365
8468
|
});
|
|
@@ -8374,7 +8477,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
8374
8477
|
for (const event of flushPendingAnthropicStreamEvents(streamState)) {
|
|
8375
8478
|
const eventData = JSON.stringify(event);
|
|
8376
8479
|
debugLazy(logger$10, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
|
|
8377
|
-
await stream
|
|
8480
|
+
await writeSSEIfConnected(stream, {
|
|
8378
8481
|
event: event.type,
|
|
8379
8482
|
data: eventData
|
|
8380
8483
|
});
|
|
@@ -8382,7 +8485,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
|
|
|
8382
8485
|
if (!streamState.messageCompleted) {
|
|
8383
8486
|
logger$10.warn("provider.messages.openai_compatible.stream_incomplete:", { provider });
|
|
8384
8487
|
const errorEvent = translateErrorToAnthropicErrorEvent();
|
|
8385
|
-
await stream
|
|
8488
|
+
await writeSSEIfConnected(stream, {
|
|
8386
8489
|
event: errorEvent.type,
|
|
8387
8490
|
data: JSON.stringify(errorEvent)
|
|
8388
8491
|
});
|
|
@@ -8399,7 +8502,7 @@ const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurre
|
|
|
8399
8502
|
for await (const chunk of upstreamResponse) {
|
|
8400
8503
|
logger$10.debug("provider.messages.responses.raw_stream_event:", chunk.data);
|
|
8401
8504
|
if (chunk.event === "ping") {
|
|
8402
|
-
await stream
|
|
8505
|
+
await writeSSEIfConnected(stream, {
|
|
8403
8506
|
event: "ping",
|
|
8404
8507
|
data: "{\"type\":\"ping\"}"
|
|
8405
8508
|
});
|
|
@@ -8416,7 +8519,7 @@ const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurre
|
|
|
8416
8519
|
for (const event of events) {
|
|
8417
8520
|
const eventData = JSON.stringify(event);
|
|
8418
8521
|
debugLazy(logger$10, () => ["provider.messages.responses.translated_event:", eventData]);
|
|
8419
|
-
await stream
|
|
8522
|
+
await writeSSEIfConnected(stream, {
|
|
8420
8523
|
event: event.type,
|
|
8421
8524
|
data: eventData
|
|
8422
8525
|
});
|
|
@@ -8424,7 +8527,7 @@ const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurre
|
|
|
8424
8527
|
}
|
|
8425
8528
|
if (!streamState.messageCompleted) {
|
|
8426
8529
|
const errorEvent = buildErrorEvent(`${provider} stream ended without a completion event, retry your request.`);
|
|
8427
|
-
await stream
|
|
8530
|
+
await writeSSEIfConnected(stream, {
|
|
8428
8531
|
event: errorEvent.type,
|
|
8429
8532
|
data: JSON.stringify(errorEvent)
|
|
8430
8533
|
});
|
|
@@ -8567,7 +8670,7 @@ const respondWebSearchProviderMessagesJson = (c, options) => {
|
|
|
8567
8670
|
for (const event of buildSyntheticStreamEvents(response)) {
|
|
8568
8671
|
const data = JSON.stringify(event);
|
|
8569
8672
|
logger$10.debug(`Web search stream event`, data);
|
|
8570
|
-
await stream
|
|
8673
|
+
await writeSSEIfConnected(stream, {
|
|
8571
8674
|
event: event.type,
|
|
8572
8675
|
data
|
|
8573
8676
|
});
|
|
@@ -8619,10 +8722,15 @@ const createMessages = async (payload, anthropicBetaHeader, options) => {
|
|
|
8619
8722
|
const anthropicBeta = buildAnthropicBetaHeader(anthropicBetaHeader, payload.thinking, payload.model);
|
|
8620
8723
|
if (anthropicBeta) headers["anthropic-beta"] = anthropicBeta;
|
|
8621
8724
|
consola.log(`<-- model: ${payload.model}`);
|
|
8622
|
-
const
|
|
8725
|
+
const transportConfig = getUpstreamTransportConfig();
|
|
8726
|
+
const response = await fetchUpstreamWithLifecycle(`${copilotBaseUrl(state)}/v1/messages`, {
|
|
8623
8727
|
method: "POST",
|
|
8624
8728
|
headers,
|
|
8625
8729
|
body: JSON.stringify(payload)
|
|
8730
|
+
}, {
|
|
8731
|
+
clientSignal: options.clientSignal,
|
|
8732
|
+
headersTimeoutMs: transportConfig.headersTimeoutMs,
|
|
8733
|
+
streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
|
|
8626
8734
|
});
|
|
8627
8735
|
logCopilotRateLimits(response.headers);
|
|
8628
8736
|
if (!response.ok) {
|
|
@@ -8657,6 +8765,7 @@ const handleWithChatCompletions = async (c, anthropicPayload, options) => {
|
|
|
8657
8765
|
});
|
|
8658
8766
|
debugJson(logger, "Translated OpenAI request payload:", openAIPayload);
|
|
8659
8767
|
const response = await messagesApiFlowDependencies.createChatCompletions(openAIPayload, {
|
|
8768
|
+
clientSignal: c.req?.raw?.signal,
|
|
8660
8769
|
subagentMarker,
|
|
8661
8770
|
requestId,
|
|
8662
8771
|
sessionId,
|
|
@@ -8697,7 +8806,7 @@ const handleWithChatCompletions = async (c, anthropicPayload, options) => {
|
|
|
8697
8806
|
for (const event of events) {
|
|
8698
8807
|
const eventData = JSON.stringify(event);
|
|
8699
8808
|
debugLazy(logger, () => ["Translated Anthropic event:", eventData]);
|
|
8700
|
-
await stream
|
|
8809
|
+
await writeSSEIfConnected(stream, {
|
|
8701
8810
|
event: event.type,
|
|
8702
8811
|
data: eventData
|
|
8703
8812
|
});
|
|
@@ -8709,7 +8818,7 @@ const handleWithChatCompletions = async (c, anthropicPayload, options) => {
|
|
|
8709
8818
|
for (const event of flushPendingAnthropicStreamEvents(streamState)) {
|
|
8710
8819
|
const eventData = JSON.stringify(event);
|
|
8711
8820
|
debugLazy(logger, () => ["Translated Anthropic event:", eventData]);
|
|
8712
|
-
await stream
|
|
8821
|
+
await writeSSEIfConnected(stream, {
|
|
8713
8822
|
event: event.type,
|
|
8714
8823
|
data: eventData
|
|
8715
8824
|
});
|
|
@@ -8717,7 +8826,7 @@ const handleWithChatCompletions = async (c, anthropicPayload, options) => {
|
|
|
8717
8826
|
if (!streamState.messageCompleted) {
|
|
8718
8827
|
logger.warn("Chat completions stream ended without completion; sending error event");
|
|
8719
8828
|
const errorEvent = translateErrorToAnthropicErrorEvent();
|
|
8720
|
-
await stream
|
|
8829
|
+
await writeSSEIfConnected(stream, {
|
|
8721
8830
|
event: errorEvent.type,
|
|
8722
8831
|
data: JSON.stringify(errorEvent)
|
|
8723
8832
|
});
|
|
@@ -8741,7 +8850,7 @@ const handleWithResponsesApi = async (c, anthropicPayload, options) => {
|
|
|
8741
8850
|
const response = await messagesApiFlowDependencies.createResponses(responsesPayload, {
|
|
8742
8851
|
vision,
|
|
8743
8852
|
initiator,
|
|
8744
|
-
|
|
8853
|
+
clientSignal: c.req?.raw?.signal,
|
|
8745
8854
|
transport,
|
|
8746
8855
|
...requestOptions
|
|
8747
8856
|
});
|
|
@@ -8752,7 +8861,7 @@ const handleWithResponsesApi = async (c, anthropicPayload, options) => {
|
|
|
8752
8861
|
let usage = {};
|
|
8753
8862
|
for await (const chunk of response) {
|
|
8754
8863
|
if (chunk.event === "ping") {
|
|
8755
|
-
await stream
|
|
8864
|
+
await writeSSEIfConnected(stream, {
|
|
8756
8865
|
event: "ping",
|
|
8757
8866
|
data: "{\"type\":\"ping\"}"
|
|
8758
8867
|
});
|
|
@@ -8770,7 +8879,7 @@ const handleWithResponsesApi = async (c, anthropicPayload, options) => {
|
|
|
8770
8879
|
for (const event of events) {
|
|
8771
8880
|
const eventData = JSON.stringify(event);
|
|
8772
8881
|
debugLazy(logger, () => ["Translated Anthropic event:", eventData]);
|
|
8773
|
-
await stream
|
|
8882
|
+
await writeSSEIfConnected(stream, {
|
|
8774
8883
|
event: event.type,
|
|
8775
8884
|
data: eventData
|
|
8776
8885
|
});
|
|
@@ -8783,7 +8892,7 @@ const handleWithResponsesApi = async (c, anthropicPayload, options) => {
|
|
|
8783
8892
|
if (!streamState.messageCompleted) {
|
|
8784
8893
|
logger.warn("Responses stream ended without completion; sending error event");
|
|
8785
8894
|
const errorEvent = buildErrorEvent("Responses stream ended without completion, retry your request.");
|
|
8786
|
-
await stream
|
|
8895
|
+
await writeSSEIfConnected(stream, {
|
|
8787
8896
|
event: errorEvent.type,
|
|
8788
8897
|
data: JSON.stringify(errorEvent)
|
|
8789
8898
|
});
|
|
@@ -8812,6 +8921,7 @@ const handleWithMessagesApi = async (c, anthropicPayload, options) => {
|
|
|
8812
8921
|
});
|
|
8813
8922
|
debugJson(logger, "Translated Messages payload:", anthropicPayload);
|
|
8814
8923
|
const response = await messagesApiFlowDependencies.createMessages(anthropicPayload, anthropicBetaHeader, {
|
|
8924
|
+
clientSignal: c.req?.raw?.signal,
|
|
8815
8925
|
subagentMarker,
|
|
8816
8926
|
requestId,
|
|
8817
8927
|
sessionId,
|
|
@@ -8841,7 +8951,7 @@ const handleWithMessagesApi = async (c, anthropicPayload, options) => {
|
|
|
8841
8951
|
});
|
|
8842
8952
|
if (parsedEvent?.type === "message_stop" || eventName === "message_stop") messageStopSeen = true;
|
|
8843
8953
|
else if (parsedEvent?.type === "error" || eventName === "error") errorSeen = true;
|
|
8844
|
-
await stream
|
|
8954
|
+
await writeSSEIfConnected(stream, {
|
|
8845
8955
|
event: eventName,
|
|
8846
8956
|
data
|
|
8847
8957
|
});
|
|
@@ -8852,7 +8962,7 @@ const handleWithMessagesApi = async (c, anthropicPayload, options) => {
|
|
|
8852
8962
|
if (!messageStopSeen && !errorSeen) {
|
|
8853
8963
|
logger.warn("Messages stream ended without completion; sending error event");
|
|
8854
8964
|
const errorEvent = translateErrorToAnthropicErrorEvent();
|
|
8855
|
-
await stream
|
|
8965
|
+
await writeSSEIfConnected(stream, {
|
|
8856
8966
|
event: errorEvent.type,
|
|
8857
8967
|
data: JSON.stringify(errorEvent)
|
|
8858
8968
|
});
|
|
@@ -10875,7 +10985,7 @@ providerAlphaSearchRoutes.post("/", async (c) => {
|
|
|
10875
10985
|
body: await c.req.raw.clone().text(),
|
|
10876
10986
|
provider
|
|
10877
10987
|
}));
|
|
10878
|
-
const upstreamResponse = await providerAlphaSearchRouteDependencies.forwardProviderAlphaSearch(providerConfig, c.req.raw);
|
|
10988
|
+
const upstreamResponse = await providerAlphaSearchRouteDependencies.forwardProviderAlphaSearch(providerConfig, c.req.raw, { clientSignal: c.req.raw.signal });
|
|
10879
10989
|
await debugJsonAsync(logger$6, "provider.alpha_search.response", async () => ({
|
|
10880
10990
|
body: await upstreamResponse.clone().text(),
|
|
10881
10991
|
provider,
|
|
@@ -11875,7 +11985,7 @@ async function handleResponsesViaMessages(c, options) {
|
|
|
11875
11985
|
debugJson(logger$3, "Translated Responses result:", result);
|
|
11876
11986
|
if (!translation.messagesPayload.stream) return c.json(result);
|
|
11877
11987
|
return streamSSE(c, async (stream) => {
|
|
11878
|
-
for (const event of responsesResultToStreamEvents(result)) await stream
|
|
11988
|
+
for (const event of responsesResultToStreamEvents(result)) await writeSSEIfConnected(stream, {
|
|
11879
11989
|
event: event.type,
|
|
11880
11990
|
data: JSON.stringify(event)
|
|
11881
11991
|
});
|
|
@@ -11892,7 +12002,7 @@ function streamTranslatedMessagesEvents(c, response, context) {
|
|
|
11892
12002
|
return streamSSE(c, async (stream) => {
|
|
11893
12003
|
for await (const event of translateMessagesStream(events(response), context)) {
|
|
11894
12004
|
debugJson(logger$3, "Translated Responses stream event:", event);
|
|
11895
|
-
await stream
|
|
12005
|
+
await writeSSEIfConnected(stream, {
|
|
11896
12006
|
event: event.type,
|
|
11897
12007
|
data: JSON.stringify(event)
|
|
11898
12008
|
});
|
|
@@ -11943,7 +12053,7 @@ async function handleProviderResponsesForProvider(c, options) {
|
|
|
11943
12053
|
});
|
|
11944
12054
|
const modelConfig = providerConfig.models?.[payload.model];
|
|
11945
12055
|
if (providerConfig.name === "codex") {
|
|
11946
|
-
const upstreamResponse = await forwardCodexResponses(payload, c.req.raw.headers, providerConfig.baseUrl, {
|
|
12056
|
+
const upstreamResponse = await forwardCodexResponses(payload, c.req.raw.headers, providerConfig.baseUrl, { clientSignal: c.req.raw.signal });
|
|
11947
12057
|
const recordUsage = createProviderResponsesUsageRecorder(payload, provider, modelConfig, providerConfig.pricingCurrency);
|
|
11948
12058
|
if (payload.stream && isResponsesStream(upstreamResponse)) return streamProviderResponses(c, upstreamResponse, {
|
|
11949
12059
|
normalizeCodex: true,
|
|
@@ -11954,10 +12064,10 @@ async function handleProviderResponsesForProvider(c, options) {
|
|
|
11954
12064
|
recordUsage(normalizeResponsesUsage(responseBody.usage));
|
|
11955
12065
|
return c.json(responseBody);
|
|
11956
12066
|
}
|
|
11957
|
-
const upstreamResponse = await forwardProviderResponses(providerConfig, payload, c.req.raw.headers, {
|
|
12067
|
+
const upstreamResponse = await forwardProviderResponses(providerConfig, payload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
|
|
11958
12068
|
if (!upstreamResponse.ok) throw new HTTPError(`Failed to create ${provider} responses`, upstreamResponse);
|
|
11959
12069
|
const recordUsage = createProviderResponsesUsageRecorder(payload, provider, modelConfig, providerConfig.pricingCurrency);
|
|
11960
|
-
if (payload.stream) return streamProviderResponses(c, getResponsesEvents(upstreamResponse
|
|
12070
|
+
if (payload.stream) return streamProviderResponses(c, getResponsesEvents(upstreamResponse), {
|
|
11961
12071
|
normalizeCodex: false,
|
|
11962
12072
|
provider,
|
|
11963
12073
|
recordUsage
|
|
@@ -12025,7 +12135,7 @@ const streamProviderResponses = async (c, upstreamResponse, options) => {
|
|
|
12025
12135
|
const nextUsage = getResponsesStreamEventUsage(event);
|
|
12026
12136
|
if (nextUsage) usage = nextUsage;
|
|
12027
12137
|
}
|
|
12028
|
-
await stream
|
|
12138
|
+
await writeSSEIfConnected(stream, {
|
|
12029
12139
|
data: responseChunk.data ?? "",
|
|
12030
12140
|
event: responseChunk.event
|
|
12031
12141
|
});
|
|
@@ -12057,7 +12167,7 @@ const getResponsesStreamEventUsage = (event) => {
|
|
|
12057
12167
|
if (event.type === "response.completed" || event.type === "response.failed" || event.type === "response.incomplete") return normalizeResponsesUsage(event.response.usage);
|
|
12058
12168
|
return null;
|
|
12059
12169
|
};
|
|
12060
|
-
const getResponsesEvents = (response
|
|
12170
|
+
const getResponsesEvents = (response) => createResponsesSafeStream(createResponsesHttpEventStream(response));
|
|
12061
12171
|
//#endregion
|
|
12062
12172
|
//#region src/routes/provider/responses/route.ts
|
|
12063
12173
|
const providerResponsesRoutes = new Hono();
|
|
@@ -12190,7 +12300,7 @@ const handleResponses = async (c) => {
|
|
|
12190
12300
|
subagentMarker,
|
|
12191
12301
|
requestId,
|
|
12192
12302
|
sessionId: fallbackSessionId,
|
|
12193
|
-
|
|
12303
|
+
clientSignal: c.req.raw.signal,
|
|
12194
12304
|
transport: responsesTransport
|
|
12195
12305
|
});
|
|
12196
12306
|
if (isStreamingRequested(payload) && isAsyncIterable(response)) {
|
|
@@ -12208,7 +12318,7 @@ const handleResponses = async (c) => {
|
|
|
12208
12318
|
total_nano_aiu: normalizeOptionalToken(parsedEvent.copilot_usage?.total_nano_aiu)
|
|
12209
12319
|
};
|
|
12210
12320
|
const processedData = fixStreamIds(chunk.data ?? "", chunk.event, idTracker);
|
|
12211
|
-
await stream
|
|
12321
|
+
await writeSSEIfConnected(stream, {
|
|
12212
12322
|
id: chunk.id,
|
|
12213
12323
|
event: chunk.event,
|
|
12214
12324
|
data: processedData
|
|
@@ -12443,4 +12553,4 @@ createServer();
|
|
|
12443
12553
|
//#endregion
|
|
12444
12554
|
export { createServer };
|
|
12445
12555
|
|
|
12446
|
-
//# sourceMappingURL=server-
|
|
12556
|
+
//# sourceMappingURL=server-DriTUys0.js.map
|