@jeffreycao/copilot-api 2.1.8 → 2.1.9

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.
@@ -1,7 +1,7 @@
1
- import { A as isResponsesApiWebSocketEnabled, C as getClaudeTokenMultiplier, D as isAlphaSearchCodexPriorityEnabled, E as getResponsesTransportConfig, M 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, w as getConfig, x as getAnthropicApiKey } from "./config-DMrKDHiF.js";
2
- import { A as buildCodexRequestHeaders, B as createPooledWebSocketStream, C as compactAutoContinuePromptStarts, D as compactTextOnlyGuard, E as compactSystemPromptStarts, F as createResponsesHttpEventStream, H as state, I as fetchResponsesWithLifecycle, L as createResponsesSafeStream, M as generateTraceId, N as requestContext, P as resolveTraceId$1, R as encodePoolKeyPart, U as HTTPError, V as createWebSocketUrl, W as forwardError, b as prepareInteractionHeaders, c as getUUID, d as isResponsesStream, f as parseUserIdMetadata, g as copilotHeaders, h as copilotBaseUrl, j as forwardCodexResponses, k as CODEX_API_BASE_URL, l as isAsyncIterable, o as generateRequestIdFromPayload, p as getCopilotUsage, r as setupCodexToken, s as getRootSessionId, u as isNullish, v as copilotWebSocketHeaders, w as compactMessageSections, x as prepareMessageProxyHeaders, y as prepareForCompact, z as isTerminalResponsesStreamChunk } from "./token-DmNSTe37.js";
1
+ import { A as isResponsesApiWebSocketEnabled, C as getClaudeTokenMultiplier, D as isAlphaSearchCodexPriorityEnabled, E as getResponsesTransportConfig, M 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, w as getConfig, x as getAnthropicApiKey } from "./config-CHzejzwY.js";
2
+ import { A as buildCodexRequestHeaders, B as createPooledWebSocketStream, C as compactAutoContinuePromptStarts, D as compactTextOnlyGuard, E as compactSystemPromptStarts, F as createResponsesHttpEventStream, H as state, I as fetchResponsesWithLifecycle, L as createResponsesSafeStream, M as generateTraceId, N as requestContext, P as resolveTraceId$1, R as encodePoolKeyPart, U as HTTPError, V as createWebSocketUrl, W as forwardError, b as prepareInteractionHeaders, c as getUUID, d as isResponsesStream, f as parseUserIdMetadata, g as copilotHeaders, h as copilotBaseUrl, j as forwardCodexResponses, k as CODEX_API_BASE_URL, l as isAsyncIterable, o as generateRequestIdFromPayload, p as getCopilotUsage, r as setupCodexToken, s as getRootSessionId, u as isNullish, v as copilotWebSocketHeaders, w as compactMessageSections, x as prepareMessageProxyHeaders, y as prepareForCompact, z as isTerminalResponsesStreamChunk } from "./token-Ctj6sfG4.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-Do0TBzAz.js";
4
+ import { i as toClientModelId, r as normalizeSdkModelId, t as findEndpointModel } from "./models-CJuY4JZ5.js";
5
5
  import consola from "consola";
6
6
  import { createHash } from "node:crypto";
7
7
  import fs, { readFileSync } from "node:fs";
@@ -640,8 +640,19 @@ const builtinProviderModelRegistry = new class BuiltinProviderModelRegistry {
640
640
  output: 4.4
641
641
  }
642
642
  },
643
+ "glm-5.3": {
644
+ contextWindow: 1e6,
645
+ inputModalities: ["text"],
646
+ maxOutputTokens: 64e3,
647
+ pricing: {
648
+ cachedInput: .26,
649
+ input: 1.4,
650
+ output: 4.4
651
+ }
652
+ },
643
653
  "grok-4.5": {
644
654
  contextWindow: 5e5,
655
+ defaultReasoningEffort: "high",
645
656
  inputModalities: ["text", "image"],
646
657
  maxOutputTokens: 64e3,
647
658
  pricing: { tiers: [{
@@ -653,7 +664,12 @@ const builtinProviderModelRegistry = new class BuiltinProviderModelRegistry {
653
664
  cachedInput: 1,
654
665
  input: 4,
655
666
  output: 12
656
- }] }
667
+ }] },
668
+ reasoningEfforts: [
669
+ "low",
670
+ "medium",
671
+ "high"
672
+ ]
657
673
  },
658
674
  "deepseek-v4-flash": {
659
675
  contextWindow: 1e6,
@@ -2892,6 +2908,21 @@ const setContextCacheControl = (part) => {
2892
2908
  };
2893
2909
  //#endregion
2894
2910
  //#region src/routes/provider/utils.ts
2911
+ const RESPONSES_REASONING_EFFORTS = new Set([
2912
+ "none",
2913
+ "minimal",
2914
+ "low",
2915
+ "medium",
2916
+ "high",
2917
+ "xhigh",
2918
+ "max"
2919
+ ]);
2920
+ const REASONING_EFFORT_ALIASES = {
2921
+ minimal: "low",
2922
+ xhigh: "high",
2923
+ max: "high",
2924
+ ultra: "high"
2925
+ };
2895
2926
  const applyModelDefaults = (payload, modelConfig) => {
2896
2927
  payload.temperature ??= modelConfig?.temperature;
2897
2928
  payload.top_p ??= modelConfig?.topP;
@@ -2900,6 +2931,24 @@ const applyModelDefaults = (payload, modelConfig) => {
2900
2931
  const applyMissingExtraBody = (payload, options) => {
2901
2932
  for (const [key, value] of Object.entries(options.extraBody ?? {})) if (!Object.hasOwn(payload, key)) payload[key] = value;
2902
2933
  };
2934
+ const normalizeProviderResponsesReasoningEffort = (payload, providerConfig) => {
2935
+ const currentEffort = payload.reasoning?.effort;
2936
+ if (typeof currentEffort !== "string") return;
2937
+ const modelConfig = providerConfig.models?.[payload.model];
2938
+ const builtinModelConfig = builtinProviderModelRegistry.getModelConfig(providerConfig.name, payload.model);
2939
+ const configuredEfforts = normalizeResponsesReasoningEfforts(modelConfig?.reasoningEfforts);
2940
+ const builtinEfforts = normalizeResponsesReasoningEfforts(builtinModelConfig?.reasoningEfforts);
2941
+ const supportedEfforts = configuredEfforts.length > 0 ? configuredEfforts : builtinEfforts;
2942
+ if (supportedEfforts.length === 0 || supportedEfforts.includes(currentEffort)) return;
2943
+ const aliasedEffort = REASONING_EFFORT_ALIASES[currentEffort];
2944
+ const fallbackEffort = aliasedEffort && supportedEfforts.includes(aliasedEffort) ? aliasedEffort : selectSupportedReasoningEffort(supportedEfforts, modelConfig?.defaultReasoningEffort, builtinModelConfig?.defaultReasoningEffort);
2945
+ if (payload.reasoning && fallbackEffort) payload.reasoning.effort = fallbackEffort;
2946
+ };
2947
+ const normalizeResponsesReasoningEfforts = (efforts) => (efforts ?? []).filter((effort) => RESPONSES_REASONING_EFFORTS.has(effort));
2948
+ const selectSupportedReasoningEffort = (supportedEfforts, ...defaults) => {
2949
+ for (const defaultEffort of defaults) if (defaultEffort && supportedEfforts.includes(defaultEffort)) return defaultEffort;
2950
+ return supportedEfforts[0];
2951
+ };
2903
2952
  //#endregion
2904
2953
  //#region src/routes/provider/chat-completions/handler.ts
2905
2954
  const logger$14 = createHandlerLogger("provider-chat-completions-handler");
@@ -3449,9 +3498,6 @@ function mapOpenAIStopReasonToAnthropic(finishReason) {
3449
3498
  content_filter: "end_turn"
3450
3499
  }[finishReason];
3451
3500
  }
3452
- //#endregion
3453
- //#region src/routes/messages/non-stream-translation.ts
3454
- const THINKING_TEXT = "Thinking...";
3455
3501
  const COPILOT_TOOL_CONTENT_SUPPORT_TYPE = ["array", "image"];
3456
3502
  function translateToOpenAI(payload, options = {}) {
3457
3503
  const modelId = payload.model;
@@ -3602,7 +3648,7 @@ function handleAssistantMessage(message, modelId, capabilities) {
3602
3648
  if (message.content.length === 0) return [];
3603
3649
  const toolUseBlocks = message.content.filter((block) => block.type === "tool_use");
3604
3650
  let thinkingBlocks = message.content.filter((block) => block.type === "thinking");
3605
- if (modelId.startsWith("claude")) thinkingBlocks = thinkingBlocks.filter((b) => b.thinking && b.thinking !== "Thinking..." && b.signature && !b.signature.includes("@"));
3651
+ if (modelId.startsWith("claude")) thinkingBlocks = thinkingBlocks.filter((b) => b.thinking !== "Thinking..." && b.signature && !b.signature.includes("@"));
3606
3652
  const thinkingContents = thinkingBlocks.filter((b) => b.thinking && b.thinking !== "Thinking...").map((b) => b.thinking);
3607
3653
  const allThinkingContent = thinkingContents.length > 0 ? thinkingContents.join("\n\n") : void 0;
3608
3654
  const signature = thinkingBlocks.find((b) => b.signature)?.signature;
@@ -3764,7 +3810,7 @@ function getAnthropicThinkBlocks(reasoningText, reasoningOpaque) {
3764
3810
  }];
3765
3811
  if (reasoningOpaque && reasoningOpaque.length > 0) return [{
3766
3812
  type: "thinking",
3767
- thinking: THINKING_TEXT,
3813
+ thinking: "",
3768
3814
  signature: reasoningOpaque
3769
3815
  }];
3770
3816
  return [];
@@ -4614,7 +4660,7 @@ function handleReasoningOpaque(delta, events, state) {
4614
4660
  index: state.contentBlockIndex,
4615
4661
  delta: {
4616
4662
  type: "thinking_delta",
4617
- thinking: THINKING_TEXT
4663
+ thinking: ""
4618
4664
  }
4619
4665
  }, {
4620
4666
  type: "content_block_delta",
@@ -5195,7 +5241,7 @@ const createCompactionThinkingBlock = (item) => {
5195
5241
  if (!item.id || !item.encrypted_content) return null;
5196
5242
  return {
5197
5243
  type: "thinking",
5198
- thinking: THINKING_TEXT,
5244
+ thinking: "",
5199
5245
  signature: encodeCompactionCarrierSignature({
5200
5246
  id: item.id,
5201
5247
  encrypted_content: item.encrypted_content
@@ -5736,7 +5782,6 @@ const openFunctionCallBlock = (state, params) => {
5736
5782
  }
5737
5783
  const { blockIndex } = functionCallState;
5738
5784
  if (!state.openBlocks.has(blockIndex)) {
5739
- closeOpenBlocks(state, events);
5740
5785
  events.push({
5741
5786
  type: "content_block_start",
5742
5787
  index: blockIndex,
@@ -5966,6 +6011,7 @@ const createCompactionContextManagement = (compactThreshold) => [{
5966
6011
  compact_threshold: compactThreshold
5967
6012
  }];
5968
6013
  const applyResponsesApiContextManagement = (payload, maxPromptTokens, options) => {
6014
+ if (!payload.model.startsWith("gpt")) return false;
5969
6015
  if (responsesUtilsDependencies.isGpt56OrAbove(payload.model)) return false;
5970
6016
  if (hasTerminalCompactionTrigger(payload)) return isContextManagementEnabledForSource(options.source);
5971
6017
  if (payload.context_management !== void 0) return true;
@@ -6563,6 +6609,7 @@ async function handleProviderMessagesForProvider(c, options) {
6563
6609
  const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
6564
6610
  const { modelConfig, payload, provider, providerConfig, usageEndpoint } = options;
6565
6611
  const responsesPayload = prepareWebSearchResponsesPayload(payload);
6612
+ normalizeProviderResponsesReasoningEffort(responsesPayload, providerConfig);
6566
6613
  debugJson(logger$10, "provider.messages.responses.web_search.request", {
6567
6614
  payload: responsesPayload,
6568
6615
  provider
@@ -6626,6 +6673,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
6626
6673
  const selectedModel = providerConfig.name === "codex" ? getModels().data.find((model) => model.id === payload.model) : void 0;
6627
6674
  const wantsStream = payload.stream === true;
6628
6675
  const responsesPayload = translateAnthropicMessagesToResponsesPayload(payload);
6676
+ normalizeProviderResponsesReasoningEffort(responsesPayload, providerConfig);
6629
6677
  if (providerConfig.name === "codex" && !wantsStream) responsesPayload.stream = true;
6630
6678
  if (applyResponsesApiContextManagement(responsesPayload, selectedModel?.capabilities.limits.max_prompt_tokens, { source: "messages" })) compactInputByLatestCompaction(responsesPayload);
6631
6679
  debugJson(logger$10, "provider.messages.responses.request", {
@@ -8144,19 +8192,27 @@ async function getProviderCodexCandidates(provider, requestHeaders) {
8144
8192
  function isMessagesFallbackProviderType(type) {
8145
8193
  return type === "anthropic" || type === "openai-compatible";
8146
8194
  }
8195
+ function describeProviderAdapter(type) {
8196
+ if (type === "anthropic") return "Messages";
8197
+ if (type === "openai-responses") return "Messages-to-Responses";
8198
+ return "Messages-to-Chat";
8199
+ }
8147
8200
  function createProviderCodexCandidate(providerConfig, modelId, remoteModel, modelConfig, effectiveType) {
8148
8201
  const builtinModelConfig = builtinProviderModelRegistry.getModelConfig(providerConfig.name, modelId);
8149
8202
  const configuredReasoningEfforts = normalizeReasoningEfforts(modelConfig?.reasoningEfforts);
8150
- const reasoningEfforts = configuredReasoningEfforts.length > 0 ? configuredReasoningEfforts : normalizeRemoteReasoningEfforts(remoteModel);
8203
+ const remoteReasoningEfforts = normalizeRemoteReasoningEfforts(remoteModel);
8204
+ const builtinReasoningEfforts = normalizeReasoningEfforts(builtinModelConfig?.reasoningEfforts);
8205
+ const reasoningEfforts = configuredReasoningEfforts.length > 0 ? configuredReasoningEfforts : remoteReasoningEfforts.length > 0 ? remoteReasoningEfforts : builtinReasoningEfforts;
8151
8206
  const configuredModalities = normalizeInputModalities(modelConfig?.inputModalities);
8152
8207
  const remoteModalities = normalizeInputModalities(remoteModel?.input_modalities ?? remoteModel?.modalities);
8153
8208
  const builtinModalities = normalizeInputModalities(builtinModelConfig?.inputModalities);
8154
8209
  const displayName = getStringField$1(remoteModel ?? {}, "display_name") ?? getStringField$1(remoteModel ?? {}, "name") ?? modelId;
8155
- const adapterName = effectiveType === "anthropic" ? "Messages" : "Messages-to-Chat";
8210
+ const adapterName = describeProviderAdapter(effectiveType);
8211
+ const requiresCatalogMatch = effectiveType === "openai-responses" && modelId.startsWith("gpt");
8156
8212
  return {
8157
8213
  slug: `${providerConfig.name}/${modelId}`,
8158
8214
  catalogSlug: modelId,
8159
- catalogMatchRequired: effectiveType === "openai-responses",
8215
+ catalogMatchRequired: requiresCatalogMatch,
8160
8216
  providerName: providerConfig.name,
8161
8217
  displayName: `${displayName} (${providerConfig.name})`,
8162
8218
  description: `${displayName} through the ${providerConfig.name} ${adapterName} adapter.`,
@@ -8169,7 +8225,7 @@ function createProviderCodexCandidate(providerConfig, modelId, remoteModel, mode
8169
8225
  maxOutputTokens: positiveNumber(modelConfig?.maxOutputTokens ?? getFirstPositiveNumber(remoteModel, ["max_output_tokens"]) ?? builtinModelConfig?.maxOutputTokens, 32e3),
8170
8226
  inputModalities: resolveInputModalities(providerConfig.name, configuredModalities, remoteModalities, builtinModalities),
8171
8227
  reasoningEfforts,
8172
- defaultReasoningEffort: selectDefaultReasoningEffort(reasoningEfforts, modelConfig?.defaultReasoningEffort)
8228
+ defaultReasoningEffort: selectDefaultReasoningEffort(reasoningEfforts, modelConfig?.defaultReasoningEffort ?? builtinModelConfig?.defaultReasoningEffort)
8173
8229
  };
8174
8230
  }
8175
8231
  function normalizeRemoteReasoningEfforts(model) {
@@ -9939,7 +9995,8 @@ async function handleProviderResponsesForProvider(c, options) {
9939
9995
  type: "invalid_request_error"
9940
9996
  } }, 400);
9941
9997
  const effectiveType = resolveEffectiveProviderType(providerConfig, payload.model);
9942
- if (effectiveType === "anthropic" || effectiveType === "openai-compatible") return await handleResponsesViaMessages(c, {
9998
+ normalizeProviderResponsesReasoningEffort(payload, providerConfig);
9999
+ if (shouldFallbackToMessages$1(c, payload.model, effectiveType)) return await handleResponsesViaMessages(c, {
9943
10000
  payload,
9944
10001
  publicModel: options.publicModel ?? payload.model,
9945
10002
  targetModel: `${provider}/${payload.model}`
@@ -9980,6 +10037,11 @@ async function handleProviderResponsesForProvider(c, options) {
9980
10037
  recordUsage(normalizeResponsesUsage((await upstreamResponse.clone().json()).usage));
9981
10038
  return createProviderProxyResponse(upstreamResponse);
9982
10039
  }
10040
+ const shouldFallbackToMessages$1 = (c, modelId, effectiveType) => {
10041
+ if (effectiveType === "anthropic" || effectiveType === "openai-compatible") return true;
10042
+ if (isCodexUserAgent(c.req.header("user-agent"))) return !modelId.startsWith("gpt");
10043
+ return false;
10044
+ };
9983
10045
  const createProviderResponsesUsageRecorder = (payload, provider, modelConfig, pricingCurrency) => {
9984
10046
  const sessionAffinity = requestContext.getStore()?.sessionAffinity?.trim() || null;
9985
10047
  return createProviderTokenUsageRecorder({
@@ -10435,4 +10497,4 @@ server.route("/:provider/images", providerImageRoutes);
10435
10497
  //#endregion
10436
10498
  export { server };
10437
10499
 
10438
- //# sourceMappingURL=server-TnE0V9Un.js.map
10500
+ //# sourceMappingURL=server-tlEQmO0Y.js.map