@jeffreycao/copilot-api 1.12.7 → 1.12.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.
@@ -1,12 +1,12 @@
1
- import { S as PATHS, a as getMessageApiWebSearchModel, b as setModelMappings, c as getProviderConfig, d as getSmallModel, g as isResponsesApiWebSocketEnabled, h as isResponsesApiWebSearchEnabled, i as getExtraPromptForModel, l as getRawProviderConfig, m as isResponsesApiContextManagementEnabled, n as getClaudeTokenMultiplier, o as getModelMappings, p as isMessagesApiEnabled, r as getConfig, s as getModelResponsesApiCompactThreshold$1, t as getAnthropicApiKey, u as getReasoningEffortForModel, y as resolveMappedModel } from "./config-B-_X-1gj.js";
2
- import { C as prepareMessageProxyHeaders, E as compactMessageSections, F as createPooledWebSocketStream, I as createWebSocketUrl, L as state, M as generateTraceId, N as requestContext, O as compactSystemPromptStarts, P as resolveTraceId$1, R as HTTPError, 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 forwardError } from "./token-CIpQTF2M.js";
1
+ import { C as setModelMappings, S as resolveMappedModel, T as PATHS, _ as isResponsesApiWebSocketEnabled, a as getExtraPromptForModel, c as getModelResponsesApiCompactThreshold$1, d as getReasoningEffortForModel, f as getSmallModel, g as isResponsesApiWebSearchEnabled, h as isResponsesApiContextManagementEnabled, i as getConfig, l as getProviderConfig, m as isMessagesApiEnabled, n as getAnthropicApiKey, o as getMessageApiWebSearchModel, r as getClaudeTokenMultiplier, s as getModelMappings, u as getRawProviderConfig } from "./config-B71_S_hQ.js";
2
+ import { C as prepareMessageProxyHeaders, E as compactMessageSections, F as createPooledWebSocketStream, I as createWebSocketUrl, L as state, M as generateTraceId, N as requestContext, O as compactSystemPromptStarts, P as resolveTraceId$1, R as HTTPError, 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 forwardError } from "./token-fpw8tAQS.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-D3SN0jX-.js";
4
4
  import consola from "consola";
5
5
  import { createHash } from "node:crypto";
6
- import { events } from "fetch-event-stream";
7
6
  import fs, { readFileSync } from "node:fs";
8
7
  import fs$1 from "node:fs/promises";
9
8
  import path from "node:path";
9
+ import { events } from "fetch-event-stream";
10
10
  import { z } from "zod";
11
11
  import { Hono } from "hono";
12
12
  import { cors } from "hono/cors";
@@ -1309,18 +1309,18 @@ async function handleCompletion$1(c) {
1309
1309
  await checkRateLimit(state);
1310
1310
  debugJson(logger$7, "Request payload:", payload);
1311
1311
  const selectedModel = state.models?.data.find((model) => model.id === payload.model);
1312
- if (selectedModel?.id === "gpt-5.4") return c.json({ error: {
1313
- message: "Please use `/v1/responses` or `/v1/messages` API",
1314
- type: "invalid_request_error"
1315
- } }, 400);
1316
1312
  if (state.manualApprove) await awaitApproval();
1317
- if (isNullish(payload.max_tokens)) {
1313
+ if (isNullish(payload.max_tokens) && isNullish(payload.max_completion_tokens)) {
1318
1314
  payload = {
1319
1315
  ...payload,
1320
1316
  max_tokens: selectedModel?.capabilities.limits.max_output_tokens
1321
1317
  };
1322
1318
  debugJson(logger$7, "Set max_tokens to:", payload.max_tokens);
1323
1319
  }
1320
+ if (payload.model.includes("gpt")) {
1321
+ if (isNullish(payload.max_completion_tokens)) payload.max_completion_tokens = payload.max_tokens;
1322
+ delete payload.max_tokens;
1323
+ }
1324
1324
  const requestId = generateRequestIdFromPayload(payload);
1325
1325
  logger$7.debug("Generated request ID:", requestId);
1326
1326
  const sessionId = getUUID(requestId);
@@ -1664,6 +1664,7 @@ function translateToOpenAI(payload, options = {}) {
1664
1664
  const modelId = payload.model;
1665
1665
  const model = state.models?.data.find((m) => m.id === modelId);
1666
1666
  const thinkingBudget = getThinkingBudget(payload, model);
1667
+ const reasoningEffort = getReasoningEffort(payload, options);
1667
1668
  return {
1668
1669
  model: modelId,
1669
1670
  messages: translateAnthropicMessagesToOpenAI(payload, modelId, {
@@ -1678,12 +1679,22 @@ function translateToOpenAI(payload, options = {}) {
1678
1679
  user: payload.metadata?.user_id,
1679
1680
  tools: translateAnthropicToolsToOpenAI(payload.tools),
1680
1681
  tool_choice: translateAnthropicToolChoiceToOpenAI(payload.tool_choice),
1681
- thinking_budget: thinkingBudget
1682
+ thinking_budget: thinkingBudget,
1683
+ ...reasoningEffort ? { reasoning_effort: reasoningEffort } : {}
1682
1684
  };
1683
1685
  }
1686
+ function getReasoningEffort(payload, options) {
1687
+ const effort = payload.output_config?.effort;
1688
+ if (!effort) return;
1689
+ if (!options.validateReasoningEffort) return effort;
1690
+ const supportedEfforts = options.reasoningEffortSupport;
1691
+ if (!supportedEfforts || supportedEfforts.length === 0) return;
1692
+ if (supportedEfforts.includes(effort)) return effort;
1693
+ return supportedEfforts.at(-1);
1694
+ }
1684
1695
  function getThinkingBudget(payload, model) {
1685
1696
  const thinking = payload.thinking;
1686
- if (model && thinking) {
1697
+ if (model && thinking?.budget_tokens !== void 0) {
1687
1698
  const maxThinkingBudget = Math.min(model.capabilities.supports.max_thinking_budget ?? 0, (model.capabilities.limits.max_output_tokens ?? 0) - 1);
1688
1699
  thinking.budget_tokens ??= maxThinkingBudget;
1689
1700
  if (maxThinkingBudget > 0) {
@@ -4917,14 +4928,12 @@ async function handleProviderMessagesForProvider(c, options) {
4917
4928
  c,
4918
4929
  payload,
4919
4930
  provider,
4920
- providerConfig,
4921
4931
  upstreamResponse
4922
4932
  });
4923
4933
  return respondProviderMessagesJson(c, {
4924
4934
  body: await upstreamResponse.json(),
4925
4935
  payload,
4926
- provider,
4927
- providerConfig
4936
+ provider
4928
4937
  });
4929
4938
  } catch (error) {
4930
4939
  logger$5.error("provider.messages.error", {
@@ -5149,7 +5158,7 @@ const applyContextCacheControl = (message) => {
5149
5158
  const setContextCacheControl = (part) => {
5150
5159
  part.cache_control = { ...OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL };
5151
5160
  };
5152
- const streamProviderMessages = ({ c, payload, provider, providerConfig, upstreamResponse }) => {
5161
+ const streamProviderMessages = ({ c, payload, provider, upstreamResponse }) => {
5153
5162
  logger$5.debug("provider.messages.streaming");
5154
5163
  const recordUsage = createProviderMessagesUsageRecorder(payload, provider);
5155
5164
  return streamSSE(c, async (stream) => {
@@ -5167,7 +5176,7 @@ const streamProviderMessages = ({ c, payload, provider, providerConfig, upstream
5167
5176
  let data = chunk.data;
5168
5177
  if (!data) continue;
5169
5178
  if (chunk.data === "[DONE]") break;
5170
- const parsed = parseProviderStreamEvent(data, providerConfig);
5179
+ const parsed = parseProviderStreamEvent(data);
5171
5180
  if (parsed) {
5172
5181
  usage = mergeAnthropicUsage(usage, parsed.usage);
5173
5182
  data = parsed.data;
@@ -5299,24 +5308,18 @@ const parseResponsesProviderStreamChunk = (data, providerConfig) => {
5299
5308
  return null;
5300
5309
  }
5301
5310
  };
5302
- const parseProviderStreamEvent = (data, providerConfig) => {
5311
+ const parseProviderStreamEvent = (data) => {
5303
5312
  try {
5304
5313
  const parsed = JSON.parse(data);
5305
- if (parsed.type === "message_start") {
5306
- adjustInputTokens(providerConfig, parsed.message.usage);
5307
- return {
5308
- data: JSON.stringify(parsed),
5309
- model: parsed.message.model,
5310
- usage: normalizeAnthropicUsage(parsed.message.usage)
5311
- };
5312
- }
5313
- if (parsed.type === "message_delta") {
5314
- adjustInputTokens(providerConfig, parsed.usage);
5315
- return {
5316
- data: JSON.stringify(parsed),
5317
- usage: normalizeAnthropicUsage(parsed.usage)
5318
- };
5319
- }
5314
+ if (parsed.type === "message_start") return {
5315
+ data: JSON.stringify(parsed),
5316
+ model: parsed.message.model,
5317
+ usage: normalizeAnthropicUsage(parsed.message.usage)
5318
+ };
5319
+ if (parsed.type === "message_delta") return {
5320
+ data: JSON.stringify(parsed),
5321
+ usage: normalizeAnthropicUsage(parsed.usage)
5322
+ };
5320
5323
  return {
5321
5324
  data: JSON.stringify(parsed),
5322
5325
  usage: {}
@@ -5330,10 +5333,8 @@ const parseProviderStreamEvent = (data, providerConfig) => {
5330
5333
  }
5331
5334
  };
5332
5335
  const respondProviderMessagesJson = (c, options) => {
5333
- const { body, payload, provider, providerConfig } = options;
5334
- const recordUsage = createProviderMessagesUsageRecorder(payload, provider);
5335
- adjustInputTokens(providerConfig, body.usage);
5336
- recordUsage(normalizeAnthropicUsage(body.usage));
5336
+ const { body, payload, provider } = options;
5337
+ createProviderMessagesUsageRecorder(payload, provider)(normalizeAnthropicUsage(body.usage));
5337
5338
  debugJson(logger$5, "provider.messages.no_stream result:", body);
5338
5339
  return c.json(body);
5339
5340
  };
@@ -5371,11 +5372,6 @@ const createProviderMessagesUsageRecorder = (payload, provider) => createProvide
5371
5372
  providerName: provider,
5372
5373
  sessionId: parseUserIdMetadata(payload.metadata?.user_id).sessionId
5373
5374
  });
5374
- const adjustInputTokens = (providerConfig, usage) => {
5375
- if (!providerConfig.adjustInputTokens || !usage) return;
5376
- usage.input_tokens = Math.max(0, (usage.input_tokens ?? 0) - (usage.cache_read_input_tokens ?? 0) - (usage.cache_creation_input_tokens ?? 0));
5377
- debugJson(logger$5, "provider.messages.adjusted_usage:", usage);
5378
- };
5379
5375
  //#endregion
5380
5376
  //#region src/services/copilot/create-messages.ts
5381
5377
  const INTERLEAVED_THINKING_BETA = "interleaved-thinking-2025-05-14";
@@ -5437,8 +5433,11 @@ const messagesApiFlowDependencies = {
5437
5433
  createResponses
5438
5434
  };
5439
5435
  const handleWithChatCompletions = async (c, anthropicPayload, options) => {
5440
- const { logger, subagentMarker, requestId, sessionId, compactType } = options;
5441
- const openAIPayload = translateToOpenAI(anthropicPayload);
5436
+ const { logger, selectedModel, subagentMarker, requestId, sessionId, compactType } = options;
5437
+ const openAIPayload = translateToOpenAI(anthropicPayload, {
5438
+ validateReasoningEffort: true,
5439
+ reasoningEffortSupport: selectedModel?.capabilities.supports.reasoning_effort
5440
+ });
5442
5441
  prepareCopilotChatCompletionsPayload(openAIPayload);
5443
5442
  const recordUsage = createCopilotUsageRecorder({
5444
5443
  endpoint: "chat_completions",
@@ -5723,6 +5722,7 @@ async function handleCompletion(c) {
5723
5722
  });
5724
5723
  return await messagesFlowHandlers.handleWithChatCompletions(c, anthropicPayload, {
5725
5724
  subagentMarker,
5725
+ selectedModel,
5726
5726
  requestId,
5727
5727
  sessionId,
5728
5728
  compactType,
@@ -6254,4 +6254,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
6254
6254
  //#endregion
6255
6255
  export { server };
6256
6256
 
6257
- //# sourceMappingURL=server-ypsjdIs5.js.map
6257
+ //# sourceMappingURL=server-DQXpAOIW.js.map