@jeffreycao/copilot-api 1.10.30 → 1.10.32
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 +11 -4
- package/README.zh-CN.md +11 -4
- package/dist/{auth-aKVIYJgv.js → auth-D9rXn0sD.js} +3 -3
- package/dist/{auth-aKVIYJgv.js.map → auth-D9rXn0sD.js.map} +1 -1
- package/dist/{check-usage-VAhq_UvP.js → check-usage-CpiDMOc1.js} +3 -3
- package/dist/{check-usage-VAhq_UvP.js.map → check-usage-CpiDMOc1.js.map} +1 -1
- package/dist/{config-BVmeo70f.js → config-CgDUUqnp.js} +21 -4
- package/dist/config-CgDUUqnp.js.map +1 -0
- package/dist/{debug-9GrBfKqc.js → debug-BEVHlRGL.js} +2 -2
- package/dist/{debug-9GrBfKqc.js.map → debug-BEVHlRGL.js.map} +1 -1
- package/dist/main.js +4 -4
- package/dist/{server--Ep7172f.js → server-DD7IeSJq.js} +234 -138
- package/dist/server-DD7IeSJq.js.map +1 -0
- package/dist/{start-CZE3AE-H.js → start-Co9B7ZYe.js} +4 -4
- package/dist/{start-CZE3AE-H.js.map → start-Co9B7ZYe.js.map} +1 -1
- package/dist/{token-BmkxB4rI.js → token-Cr5nwGMh.js} +2 -2
- package/dist/{token-BmkxB4rI.js.map → token-Cr5nwGMh.js.map} +1 -1
- package/package.json +1 -1
- package/dist/config-BVmeo70f.js.map +0 -1
- package/dist/server--Ep7172f.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { _ as
|
|
2
|
-
import { B as forwardError, C as prepareMessageProxyHeaders, E as compactMessageSections, F as createPooledWebSocketStream, I as createWebSocketUrl, M as generateTraceId, N as requestContext, O as compactSystemPromptStarts, P as resolveTraceId$1, R as state, S as prepareInteractionHeaders, T as compactAutoContinuePromptStarts, _ as getCopilotUsage, b as copilotWebSocketHeaders, d as generateRequestIdFromPayload, f as getRootSessionId, g as sleep, h as parseUserIdMetadata, j as forwardCodexResponses, m as isNullish, p as getUUID, r as setupCodexToken, s as cacheModels, v as copilotBaseUrl, x as prepareForCompact, y as copilotHeaders, z as HTTPError } from "./token-
|
|
1
|
+
import { _ as resolveMappedModel, a as getModelMappings, b as PATHS, c as getRawProviderConfig, d as isMessagesApiEnabled, f as isResponsesApiContextManagementEnabled, i as getExtraPromptForModel, l as getReasoningEffortForModel, m as isResponsesApiWebSocketEnabled, n as getClaudeTokenMultiplier, o as getModelResponsesApiCompactThreshold$1, p as isResponsesApiWebSearchEnabled, r as getConfig, s as getProviderConfig, t as getAnthropicApiKey, u as getSmallModel, v as setModelMappings } from "./config-CgDUUqnp.js";
|
|
2
|
+
import { B as forwardError, C as prepareMessageProxyHeaders, E as compactMessageSections, F as createPooledWebSocketStream, I as createWebSocketUrl, M as generateTraceId, N as requestContext, O as compactSystemPromptStarts, P as resolveTraceId$1, R as state, S as prepareInteractionHeaders, T as compactAutoContinuePromptStarts, _ as getCopilotUsage, b as copilotWebSocketHeaders, d as generateRequestIdFromPayload, f as getRootSessionId, g as sleep, h as parseUserIdMetadata, j as forwardCodexResponses, m as isNullish, p as getUUID, r as setupCodexToken, s as cacheModels, v as copilotBaseUrl, x as prepareForCompact, y as copilotHeaders, z as HTTPError } from "./token-Cr5nwGMh.js";
|
|
3
3
|
import { a as isDeferredToolName, c as parseMcpToolSearchSentinel, d as shouldEnableResponsesToolSearch, i as isBridgeToolSearchName, l as resolveBridgeToolSearchName, o as listDeferredToolNames, r as formatToolSearchBridgeArguments, s as normalizeToolSearchBridgeArguments, t as BRIDGE_TOOL_SEARCH_NAME, u as selectDeferredToolsByNames } from "./tool-search-wA-fLduL.js";
|
|
4
4
|
import consola from "consola";
|
|
5
5
|
import { createHash } from "node:crypto";
|
|
@@ -273,6 +273,36 @@ const createHandlerLogger = (name) => {
|
|
|
273
273
|
return instance;
|
|
274
274
|
};
|
|
275
275
|
//#endregion
|
|
276
|
+
//#region src/lib/provider-model.ts
|
|
277
|
+
const parseProviderModelAlias = (model) => {
|
|
278
|
+
const separatorIndex = model.indexOf("/");
|
|
279
|
+
if (separatorIndex <= 0 || separatorIndex === model.length - 1) return null;
|
|
280
|
+
const provider = model.slice(0, separatorIndex).trim();
|
|
281
|
+
const providerModel = model.slice(separatorIndex + 1).trim();
|
|
282
|
+
if (!provider || !providerModel) return null;
|
|
283
|
+
return {
|
|
284
|
+
model: providerModel,
|
|
285
|
+
provider
|
|
286
|
+
};
|
|
287
|
+
};
|
|
288
|
+
const createFallbackModel = (modelId) => ({
|
|
289
|
+
capabilities: {
|
|
290
|
+
family: "provider",
|
|
291
|
+
limits: {},
|
|
292
|
+
object: "model_capabilities",
|
|
293
|
+
supports: {},
|
|
294
|
+
tokenizer: "o200k_base",
|
|
295
|
+
type: "chat"
|
|
296
|
+
},
|
|
297
|
+
id: modelId,
|
|
298
|
+
model_picker_enabled: false,
|
|
299
|
+
name: modelId,
|
|
300
|
+
object: "model",
|
|
301
|
+
preview: false,
|
|
302
|
+
vendor: "provider",
|
|
303
|
+
version: "unknown"
|
|
304
|
+
});
|
|
305
|
+
//#endregion
|
|
276
306
|
//#region src/lib/rate-limit.ts
|
|
277
307
|
async function checkRateLimit(state) {
|
|
278
308
|
if (state.rateLimitSeconds === void 0) return;
|
|
@@ -920,6 +950,188 @@ function mergeAnthropicUsage(current, next) {
|
|
|
920
950
|
};
|
|
921
951
|
}
|
|
922
952
|
//#endregion
|
|
953
|
+
//#region src/lib/provider-resolver.ts
|
|
954
|
+
function isMissingCodexCredentialsError(error) {
|
|
955
|
+
return error instanceof Error && error.message === "Codex credentials not found. Run `copilot-api auth login --provider codex` first.";
|
|
956
|
+
}
|
|
957
|
+
async function resolveProviderConfig(providerName) {
|
|
958
|
+
const normalizedProviderName = providerName.trim();
|
|
959
|
+
if (!normalizedProviderName) return null;
|
|
960
|
+
if (normalizedProviderName === "codex") {
|
|
961
|
+
if (getRawProviderConfig(normalizedProviderName)?.enabled === false) return null;
|
|
962
|
+
try {
|
|
963
|
+
await setupCodexToken();
|
|
964
|
+
} catch (error) {
|
|
965
|
+
if (isMissingCodexCredentialsError(error)) return null;
|
|
966
|
+
throw error;
|
|
967
|
+
}
|
|
968
|
+
const providerConfig = getProviderConfig(normalizedProviderName);
|
|
969
|
+
if (!providerConfig) return null;
|
|
970
|
+
return {
|
|
971
|
+
...providerConfig,
|
|
972
|
+
apiKey: state.codexAccessToken ?? providerConfig.apiKey
|
|
973
|
+
};
|
|
974
|
+
}
|
|
975
|
+
return getProviderConfig(normalizedProviderName);
|
|
976
|
+
}
|
|
977
|
+
//#endregion
|
|
978
|
+
//#region src/services/providers/provider-proxy.ts
|
|
979
|
+
const SHARED_FORWARDABLE_HEADERS = ["accept", "user-agent"];
|
|
980
|
+
const ANTHROPIC_FORWARDABLE_HEADERS = ["anthropic-version", "anthropic-beta"];
|
|
981
|
+
const STRIPPED_RESPONSE_HEADERS = [
|
|
982
|
+
"connection",
|
|
983
|
+
"content-encoding",
|
|
984
|
+
"content-length",
|
|
985
|
+
"keep-alive",
|
|
986
|
+
"proxy-authenticate",
|
|
987
|
+
"proxy-authorization",
|
|
988
|
+
"te",
|
|
989
|
+
"trailer",
|
|
990
|
+
"transfer-encoding",
|
|
991
|
+
"upgrade"
|
|
992
|
+
];
|
|
993
|
+
function buildProviderUpstreamHeaders(providerConfig, requestHeaders) {
|
|
994
|
+
const authHeaders = {};
|
|
995
|
+
if (providerConfig.authType === "x-api-key") authHeaders["x-api-key"] = providerConfig.apiKey;
|
|
996
|
+
else authHeaders.authorization = `Bearer ${providerConfig.apiKey}`;
|
|
997
|
+
const headers = {
|
|
998
|
+
"content-type": "application/json",
|
|
999
|
+
accept: "application/json",
|
|
1000
|
+
...authHeaders
|
|
1001
|
+
};
|
|
1002
|
+
for (const headerName of SHARED_FORWARDABLE_HEADERS) {
|
|
1003
|
+
const headerValue = requestHeaders.get(headerName);
|
|
1004
|
+
if (headerValue) headers[headerName] = headerValue;
|
|
1005
|
+
}
|
|
1006
|
+
if (providerConfig.type !== "anthropic") return headers;
|
|
1007
|
+
for (const headerName of ANTHROPIC_FORWARDABLE_HEADERS) {
|
|
1008
|
+
const headerValue = requestHeaders.get(headerName);
|
|
1009
|
+
if (headerValue) headers[headerName] = headerValue;
|
|
1010
|
+
}
|
|
1011
|
+
return headers;
|
|
1012
|
+
}
|
|
1013
|
+
function createProviderProxyResponse(upstreamResponse, body) {
|
|
1014
|
+
const headers = new Headers(upstreamResponse.headers);
|
|
1015
|
+
for (const headerName of STRIPPED_RESPONSE_HEADERS) headers.delete(headerName);
|
|
1016
|
+
return new Response(body ?? upstreamResponse.body, {
|
|
1017
|
+
headers,
|
|
1018
|
+
status: upstreamResponse.status,
|
|
1019
|
+
statusText: upstreamResponse.statusText
|
|
1020
|
+
});
|
|
1021
|
+
}
|
|
1022
|
+
async function forwardProviderMessages(providerConfig, payload, requestHeaders) {
|
|
1023
|
+
return await fetch(`${providerConfig.baseUrl}/v1/messages`, {
|
|
1024
|
+
method: "POST",
|
|
1025
|
+
headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),
|
|
1026
|
+
body: JSON.stringify(payload)
|
|
1027
|
+
});
|
|
1028
|
+
}
|
|
1029
|
+
async function forwardProviderChatCompletions(providerConfig, payload, requestHeaders) {
|
|
1030
|
+
return await fetch(`${providerConfig.baseUrl}/v1/chat/completions`, {
|
|
1031
|
+
method: "POST",
|
|
1032
|
+
headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),
|
|
1033
|
+
body: JSON.stringify(payload)
|
|
1034
|
+
});
|
|
1035
|
+
}
|
|
1036
|
+
async function forwardProviderResponses(providerConfig, payload, requestHeaders) {
|
|
1037
|
+
return await fetch(`${providerConfig.baseUrl}/v1/responses`, {
|
|
1038
|
+
method: "POST",
|
|
1039
|
+
headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),
|
|
1040
|
+
body: JSON.stringify(payload)
|
|
1041
|
+
});
|
|
1042
|
+
}
|
|
1043
|
+
async function forwardProviderModels(providerConfig, requestHeaders) {
|
|
1044
|
+
return await fetch(`${providerConfig.baseUrl}/v1/models`, {
|
|
1045
|
+
method: "GET",
|
|
1046
|
+
headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders)
|
|
1047
|
+
});
|
|
1048
|
+
}
|
|
1049
|
+
//#endregion
|
|
1050
|
+
//#region src/routes/provider/chat-completions/handler.ts
|
|
1051
|
+
const logger$8 = createHandlerLogger("provider-chat-completions-handler");
|
|
1052
|
+
async function handleProviderChatCompletionsForProvider(c, options) {
|
|
1053
|
+
const { payload, provider } = options;
|
|
1054
|
+
const providerConfig = await resolveProviderConfig(provider);
|
|
1055
|
+
if (providerConfig?.type !== "openai-compatible") return c.json({ error: {
|
|
1056
|
+
message: `Provider '${provider}' does not support the /v1/chat/completions endpoint`,
|
|
1057
|
+
type: "invalid_request_error"
|
|
1058
|
+
} }, 400);
|
|
1059
|
+
const modelConfig = providerConfig.models?.[payload.model];
|
|
1060
|
+
applyProviderModelDefaults(payload, modelConfig);
|
|
1061
|
+
applyMissingExtraBody$1(payload, { extraBody: modelConfig?.extraBody });
|
|
1062
|
+
applyProviderStreamOptions(payload);
|
|
1063
|
+
debugJson(logger$8, "provider.chat_completions.request", {
|
|
1064
|
+
payload,
|
|
1065
|
+
provider
|
|
1066
|
+
});
|
|
1067
|
+
const upstreamResponse = await forwardProviderChatCompletions(providerConfig, payload, c.req.raw.headers);
|
|
1068
|
+
if (!upstreamResponse.ok) {
|
|
1069
|
+
logger$8.error("Failed to create provider chat completions", {
|
|
1070
|
+
provider,
|
|
1071
|
+
statusCode: upstreamResponse.status
|
|
1072
|
+
});
|
|
1073
|
+
throw new HTTPError(`Failed to create ${provider} chat completions`, upstreamResponse);
|
|
1074
|
+
}
|
|
1075
|
+
const recordUsage = createProviderChatCompletionsUsageRecorder(payload, provider);
|
|
1076
|
+
const contentType = upstreamResponse.headers.get("content-type") ?? "";
|
|
1077
|
+
if (Boolean(payload.stream) && contentType.includes("text/event-stream")) return streamProviderChatCompletions(c, upstreamResponse, {
|
|
1078
|
+
provider,
|
|
1079
|
+
recordUsage
|
|
1080
|
+
});
|
|
1081
|
+
const responseBody = await upstreamResponse.clone().json();
|
|
1082
|
+
recordUsage(normalizeOpenAIUsage(responseBody.usage));
|
|
1083
|
+
debugJson(logger$8, "provider.chat_completions.response", responseBody);
|
|
1084
|
+
return createProviderProxyResponse(upstreamResponse);
|
|
1085
|
+
}
|
|
1086
|
+
const applyProviderModelDefaults = (payload, modelConfig) => {
|
|
1087
|
+
payload.temperature ??= modelConfig?.temperature;
|
|
1088
|
+
payload.top_p ??= modelConfig?.topP;
|
|
1089
|
+
payload.top_k ??= modelConfig?.topK;
|
|
1090
|
+
};
|
|
1091
|
+
const applyMissingExtraBody$1 = (payload, options) => {
|
|
1092
|
+
for (const [key, value] of Object.entries(options.extraBody ?? {})) if (!Object.hasOwn(payload, key)) payload[key] = value;
|
|
1093
|
+
};
|
|
1094
|
+
const applyProviderStreamOptions = (payload) => {
|
|
1095
|
+
if (!payload.stream) return;
|
|
1096
|
+
payload.stream_options = {
|
|
1097
|
+
...payload.stream_options ?? {},
|
|
1098
|
+
include_usage: true
|
|
1099
|
+
};
|
|
1100
|
+
};
|
|
1101
|
+
const createProviderChatCompletionsUsageRecorder = (payload, provider) => createProviderTokenUsageRecorder({
|
|
1102
|
+
endpoint: "chat_completions",
|
|
1103
|
+
model: payload.model,
|
|
1104
|
+
providerName: provider
|
|
1105
|
+
});
|
|
1106
|
+
const streamProviderChatCompletions = (c, upstreamResponse, options) => {
|
|
1107
|
+
logger$8.debug("provider.chat_completions.streaming", { provider: options.provider });
|
|
1108
|
+
return streamSSE(c, async (stream) => {
|
|
1109
|
+
let usage = {};
|
|
1110
|
+
try {
|
|
1111
|
+
for await (const chunk of events(upstreamResponse)) {
|
|
1112
|
+
debugJson(logger$8, "provider.chat_completions.stream_chunk", chunk);
|
|
1113
|
+
if (chunk.data && chunk.data !== "[DONE]") {
|
|
1114
|
+
const parsedChunk = parseChatCompletionChunkData(chunk.data);
|
|
1115
|
+
if (parsedChunk?.usage) usage = normalizeOpenAIUsage(parsedChunk.usage);
|
|
1116
|
+
}
|
|
1117
|
+
await stream.writeSSE({
|
|
1118
|
+
event: chunk.event,
|
|
1119
|
+
data: chunk.data ?? ""
|
|
1120
|
+
});
|
|
1121
|
+
}
|
|
1122
|
+
} finally {
|
|
1123
|
+
options.recordUsage(usage);
|
|
1124
|
+
}
|
|
1125
|
+
});
|
|
1126
|
+
};
|
|
1127
|
+
const parseChatCompletionChunkData = (data) => {
|
|
1128
|
+
try {
|
|
1129
|
+
return JSON.parse(data);
|
|
1130
|
+
} catch {
|
|
1131
|
+
return null;
|
|
1132
|
+
}
|
|
1133
|
+
};
|
|
1134
|
+
//#endregion
|
|
923
1135
|
//#region src/lib/copilot-rate-limit.ts
|
|
924
1136
|
const copilotRateLimitTypes = ["session", "weekly"];
|
|
925
1137
|
const copilotRateLimitHeaders = {
|
|
@@ -1029,12 +1241,17 @@ async function handleCompletion$1(c) {
|
|
|
1029
1241
|
let payload = await c.req.json();
|
|
1030
1242
|
const requestedModel = payload.model;
|
|
1031
1243
|
payload.model = resolveMappedModel(payload.model);
|
|
1032
|
-
if (payload.model !== requestedModel)
|
|
1244
|
+
if (payload.model !== requestedModel) consola.debug(`Resolved model mapping: ${requestedModel} -> ${payload.model}`);
|
|
1245
|
+
const providerModelAlias = parseProviderModelAlias(payload.model);
|
|
1246
|
+
if (providerModelAlias) {
|
|
1247
|
+
payload.model = providerModelAlias.model;
|
|
1248
|
+
return await handleProviderChatCompletionsForProvider(c, {
|
|
1249
|
+
payload,
|
|
1250
|
+
provider: providerModelAlias.provider
|
|
1251
|
+
});
|
|
1252
|
+
}
|
|
1033
1253
|
await checkRateLimit(state);
|
|
1034
|
-
|
|
1035
|
-
value: payload,
|
|
1036
|
-
tailLength: 400
|
|
1037
|
-
});
|
|
1254
|
+
debugJson(logger$7, "Request payload:", payload);
|
|
1038
1255
|
const selectedModel = state.models?.data.find((model) => model.id === payload.model);
|
|
1039
1256
|
if (selectedModel?.id === "gpt-5.4") return c.json({ error: {
|
|
1040
1257
|
message: "Please use `/v1/responses` or `/v1/messages` API",
|
|
@@ -1156,36 +1373,6 @@ embeddingRoutes.post("/", async (c) => {
|
|
|
1156
1373
|
}
|
|
1157
1374
|
});
|
|
1158
1375
|
//#endregion
|
|
1159
|
-
//#region src/lib/provider-model.ts
|
|
1160
|
-
const parseProviderModelAlias = (model) => {
|
|
1161
|
-
const separatorIndex = model.indexOf("/");
|
|
1162
|
-
if (separatorIndex <= 0 || separatorIndex === model.length - 1) return null;
|
|
1163
|
-
const provider = model.slice(0, separatorIndex).trim();
|
|
1164
|
-
const providerModel = model.slice(separatorIndex + 1).trim();
|
|
1165
|
-
if (!provider || !providerModel) return null;
|
|
1166
|
-
return {
|
|
1167
|
-
model: providerModel,
|
|
1168
|
-
provider
|
|
1169
|
-
};
|
|
1170
|
-
};
|
|
1171
|
-
const createFallbackModel = (modelId) => ({
|
|
1172
|
-
capabilities: {
|
|
1173
|
-
family: "provider",
|
|
1174
|
-
limits: {},
|
|
1175
|
-
object: "model_capabilities",
|
|
1176
|
-
supports: {},
|
|
1177
|
-
tokenizer: "o200k_base",
|
|
1178
|
-
type: "chat"
|
|
1179
|
-
},
|
|
1180
|
-
id: modelId,
|
|
1181
|
-
model_picker_enabled: false,
|
|
1182
|
-
name: modelId,
|
|
1183
|
-
object: "model",
|
|
1184
|
-
preview: false,
|
|
1185
|
-
vendor: "provider",
|
|
1186
|
-
version: "unknown"
|
|
1187
|
-
});
|
|
1188
|
-
//#endregion
|
|
1189
1376
|
//#region src/lib/tokenizer.ts
|
|
1190
1377
|
const ENCODING_MAP = {
|
|
1191
1378
|
o200k_base: () => import("gpt-tokenizer/encoding/o200k_base"),
|
|
@@ -1403,31 +1590,6 @@ const getTokenCount = async (payload, model) => {
|
|
|
1403
1590
|
};
|
|
1404
1591
|
};
|
|
1405
1592
|
//#endregion
|
|
1406
|
-
//#region src/lib/provider-resolver.ts
|
|
1407
|
-
function isMissingCodexCredentialsError(error) {
|
|
1408
|
-
return error instanceof Error && error.message === "Codex credentials not found. Run `copilot-api auth login --provider codex` first.";
|
|
1409
|
-
}
|
|
1410
|
-
async function resolveProviderConfig(providerName) {
|
|
1411
|
-
const normalizedProviderName = providerName.trim();
|
|
1412
|
-
if (!normalizedProviderName) return null;
|
|
1413
|
-
if (normalizedProviderName === "codex") {
|
|
1414
|
-
if (getRawProviderConfig(normalizedProviderName)?.enabled === false) return null;
|
|
1415
|
-
try {
|
|
1416
|
-
await setupCodexToken();
|
|
1417
|
-
} catch (error) {
|
|
1418
|
-
if (isMissingCodexCredentialsError(error)) return null;
|
|
1419
|
-
throw error;
|
|
1420
|
-
}
|
|
1421
|
-
const providerConfig = getProviderConfig(normalizedProviderName);
|
|
1422
|
-
if (!providerConfig) return null;
|
|
1423
|
-
return {
|
|
1424
|
-
...providerConfig,
|
|
1425
|
-
apiKey: state.codexAccessToken ?? providerConfig.apiKey
|
|
1426
|
-
};
|
|
1427
|
-
}
|
|
1428
|
-
return getProviderConfig(normalizedProviderName);
|
|
1429
|
-
}
|
|
1430
|
-
//#endregion
|
|
1431
1593
|
//#region src/routes/messages/utils.ts
|
|
1432
1594
|
function mapOpenAIStopReasonToAnthropic(finishReason) {
|
|
1433
1595
|
if (finishReason === null) return null;
|
|
@@ -3806,6 +3968,7 @@ const stringifyToolSearchArguments = (argumentsValue) => {
|
|
|
3806
3968
|
};
|
|
3807
3969
|
const DEFAULT_RESPONSES_COMPACT_THRESHOLD_RATIO = .9;
|
|
3808
3970
|
const responsesUtilsDependencies = {
|
|
3971
|
+
getModelResponsesApiCompactThreshold: getModelResponsesApiCompactThreshold$1,
|
|
3809
3972
|
isResponsesApiContextManagementEnabled,
|
|
3810
3973
|
isResponsesApiWebSocketEnabled
|
|
3811
3974
|
};
|
|
@@ -3909,6 +4072,11 @@ const resolveResponsesCompactThreshold = (maxPromptTokens, compactThresholdRatio
|
|
|
3909
4072
|
if (typeof maxPromptTokens === "number" && maxPromptTokens > 0) return Math.floor(maxPromptTokens * compactThresholdRatio);
|
|
3910
4073
|
return 2e5 * compactThresholdRatio;
|
|
3911
4074
|
};
|
|
4075
|
+
const getModelResponsesApiCompactThreshold = (model) => {
|
|
4076
|
+
const threshold = responsesUtilsDependencies.getModelResponsesApiCompactThreshold(model);
|
|
4077
|
+
if (typeof threshold !== "number" || !Number.isFinite(threshold) || threshold <= 0) return;
|
|
4078
|
+
return threshold;
|
|
4079
|
+
};
|
|
3912
4080
|
const createCompactionContextManagement = (compactThreshold) => [{
|
|
3913
4081
|
type: "compaction",
|
|
3914
4082
|
compact_threshold: compactThreshold
|
|
@@ -3916,7 +4084,7 @@ const createCompactionContextManagement = (compactThreshold) => [{
|
|
|
3916
4084
|
const applyResponsesApiContextManagement = (payload, maxPromptTokens, compactThresholdRatio = DEFAULT_RESPONSES_COMPACT_THRESHOLD_RATIO) => {
|
|
3917
4085
|
if (payload.context_management !== void 0) return;
|
|
3918
4086
|
if (!responsesUtilsDependencies.isResponsesApiContextManagementEnabled()) return;
|
|
3919
|
-
payload.context_management = createCompactionContextManagement(resolveResponsesCompactThreshold(maxPromptTokens, compactThresholdRatio));
|
|
4087
|
+
payload.context_management = createCompactionContextManagement(getModelResponsesApiCompactThreshold(payload.model) ?? resolveResponsesCompactThreshold(maxPromptTokens, compactThresholdRatio));
|
|
3920
4088
|
};
|
|
3921
4089
|
const compactInputByLatestCompaction = (payload) => {
|
|
3922
4090
|
if (!Array.isArray(payload.input) || payload.input.length === 0) return;
|
|
@@ -4022,78 +4190,6 @@ function getModels() {
|
|
|
4022
4190
|
};
|
|
4023
4191
|
}
|
|
4024
4192
|
//#endregion
|
|
4025
|
-
//#region src/services/providers/provider-proxy.ts
|
|
4026
|
-
const SHARED_FORWARDABLE_HEADERS = ["accept", "user-agent"];
|
|
4027
|
-
const ANTHROPIC_FORWARDABLE_HEADERS = ["anthropic-version", "anthropic-beta"];
|
|
4028
|
-
const STRIPPED_RESPONSE_HEADERS = [
|
|
4029
|
-
"connection",
|
|
4030
|
-
"content-encoding",
|
|
4031
|
-
"content-length",
|
|
4032
|
-
"keep-alive",
|
|
4033
|
-
"proxy-authenticate",
|
|
4034
|
-
"proxy-authorization",
|
|
4035
|
-
"te",
|
|
4036
|
-
"trailer",
|
|
4037
|
-
"transfer-encoding",
|
|
4038
|
-
"upgrade"
|
|
4039
|
-
];
|
|
4040
|
-
function buildProviderUpstreamHeaders(providerConfig, requestHeaders) {
|
|
4041
|
-
const authHeaders = {};
|
|
4042
|
-
if (providerConfig.authType === "x-api-key") authHeaders["x-api-key"] = providerConfig.apiKey;
|
|
4043
|
-
else authHeaders.authorization = `Bearer ${providerConfig.apiKey}`;
|
|
4044
|
-
const headers = {
|
|
4045
|
-
"content-type": "application/json",
|
|
4046
|
-
accept: "application/json",
|
|
4047
|
-
...authHeaders
|
|
4048
|
-
};
|
|
4049
|
-
for (const headerName of SHARED_FORWARDABLE_HEADERS) {
|
|
4050
|
-
const headerValue = requestHeaders.get(headerName);
|
|
4051
|
-
if (headerValue) headers[headerName] = headerValue;
|
|
4052
|
-
}
|
|
4053
|
-
if (providerConfig.type !== "anthropic") return headers;
|
|
4054
|
-
for (const headerName of ANTHROPIC_FORWARDABLE_HEADERS) {
|
|
4055
|
-
const headerValue = requestHeaders.get(headerName);
|
|
4056
|
-
if (headerValue) headers[headerName] = headerValue;
|
|
4057
|
-
}
|
|
4058
|
-
return headers;
|
|
4059
|
-
}
|
|
4060
|
-
function createProviderProxyResponse(upstreamResponse, body) {
|
|
4061
|
-
const headers = new Headers(upstreamResponse.headers);
|
|
4062
|
-
for (const headerName of STRIPPED_RESPONSE_HEADERS) headers.delete(headerName);
|
|
4063
|
-
return new Response(body ?? upstreamResponse.body, {
|
|
4064
|
-
headers,
|
|
4065
|
-
status: upstreamResponse.status,
|
|
4066
|
-
statusText: upstreamResponse.statusText
|
|
4067
|
-
});
|
|
4068
|
-
}
|
|
4069
|
-
async function forwardProviderMessages(providerConfig, payload, requestHeaders) {
|
|
4070
|
-
return await fetch(`${providerConfig.baseUrl}/v1/messages`, {
|
|
4071
|
-
method: "POST",
|
|
4072
|
-
headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),
|
|
4073
|
-
body: JSON.stringify(payload)
|
|
4074
|
-
});
|
|
4075
|
-
}
|
|
4076
|
-
async function forwardProviderChatCompletions(providerConfig, payload, requestHeaders) {
|
|
4077
|
-
return await fetch(`${providerConfig.baseUrl}/v1/chat/completions`, {
|
|
4078
|
-
method: "POST",
|
|
4079
|
-
headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),
|
|
4080
|
-
body: JSON.stringify(payload)
|
|
4081
|
-
});
|
|
4082
|
-
}
|
|
4083
|
-
async function forwardProviderResponses(providerConfig, payload, requestHeaders) {
|
|
4084
|
-
return await fetch(`${providerConfig.baseUrl}/v1/responses`, {
|
|
4085
|
-
method: "POST",
|
|
4086
|
-
headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),
|
|
4087
|
-
body: JSON.stringify(payload)
|
|
4088
|
-
});
|
|
4089
|
-
}
|
|
4090
|
-
async function forwardProviderModels(providerConfig, requestHeaders) {
|
|
4091
|
-
return await fetch(`${providerConfig.baseUrl}/v1/models`, {
|
|
4092
|
-
method: "GET",
|
|
4093
|
-
headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders)
|
|
4094
|
-
});
|
|
4095
|
-
}
|
|
4096
|
-
//#endregion
|
|
4097
4193
|
//#region src/routes/provider/messages/handler.ts
|
|
4098
4194
|
const logger$5 = createHandlerLogger("provider-messages-handler");
|
|
4099
4195
|
const OPENAI_COMPATIBLE_CONTEXT_CACHE_MARKER_LIMIT = 4;
|
|
@@ -4877,7 +4973,7 @@ async function handleCompletion(c) {
|
|
|
4877
4973
|
const anthropicPayload = await c.req.json();
|
|
4878
4974
|
const requestedModel = anthropicPayload.model;
|
|
4879
4975
|
anthropicPayload.model = resolveMappedModel(anthropicPayload.model);
|
|
4880
|
-
if (anthropicPayload.model !== requestedModel)
|
|
4976
|
+
if (anthropicPayload.model !== requestedModel) consola.debug(`Resolved model mapping: ${requestedModel} -> ${anthropicPayload.model}`);
|
|
4881
4977
|
const providerModelAlias = parseProviderModelAlias(anthropicPayload.model);
|
|
4882
4978
|
if (providerModelAlias) {
|
|
4883
4979
|
anthropicPayload.model = providerModelAlias.model;
|
|
@@ -5195,7 +5291,7 @@ const handleResponses = async (c) => {
|
|
|
5195
5291
|
const payload = await c.req.json();
|
|
5196
5292
|
const requestedModel = payload.model;
|
|
5197
5293
|
payload.model = resolveMappedModel(payload.model);
|
|
5198
|
-
if (payload.model !== requestedModel)
|
|
5294
|
+
if (payload.model !== requestedModel) consola.debug(`Resolved model mapping: ${requestedModel} -> ${payload.model}`);
|
|
5199
5295
|
const providerModelAlias = parseProviderModelAlias(payload.model);
|
|
5200
5296
|
if (providerModelAlias) {
|
|
5201
5297
|
payload.model = providerModelAlias.model;
|
|
@@ -5437,4 +5533,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
|
|
|
5437
5533
|
//#endregion
|
|
5438
5534
|
export { server };
|
|
5439
5535
|
|
|
5440
|
-
//# sourceMappingURL=server
|
|
5536
|
+
//# sourceMappingURL=server-DD7IeSJq.js.map
|