@jeffreycao/copilot-api 1.13.0 → 1.13.2

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,5 +1,5 @@
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-CQxppJtD.js";
2
- import { B as forwardError, C as prepareInteractionHeaders, D as compactMessageSections, E as compactAutoContinuePromptStarts, F as resolveTraceId$1, I as createPooledWebSocketStream, L as createWebSocketUrl, M as forwardCodexResponses, N as generateTraceId, P as requestContext, R as state, S as prepareForCompact, _ as getCopilotUsage, b as copilotHeaders, d as generateRequestIdFromPayload, f as getRootSessionId, g as sleep, h as parseUserIdMetadata, k as compactSystemPromptStarts, m as isNullish, p as getUUID, r as setupCodexToken, w as prepareMessageProxyHeaders, x as copilotWebSocketHeaders, y as copilotBaseUrl, z as HTTPError } from "./token-CFArcYwb.js";
1
+ import { S as setModelMappings, a as getExtraPromptForModel, c as getModelResponsesApiCompactThreshold$1, d as getReasoningEffortForModel, f as getSmallModel, g as isResponsesApiWebSocketEnabled, h as isResponsesApiWebSearchEnabled, i as getConfig, l as getProviderConfig, m as isResponsesApiContextManagementEnabled, n as getAnthropicApiKey, o as getMessageApiWebSearchModel, p as isMessagesApiEnabled, r as getClaudeTokenMultiplier, s as getModelMappings, u as getRawProviderConfig, v as listEnabledProviders, w as PATHS, x as resolveMappedModel } from "./config-DODTXsGz.js";
2
+ import { B as forwardError, C as prepareInteractionHeaders, D as compactMessageSections, E as compactAutoContinuePromptStarts, F as resolveTraceId$1, I as createPooledWebSocketStream, L as createWebSocketUrl, M as forwardCodexResponses, N as generateTraceId, P as requestContext, R as state, S as prepareForCompact, _ as getCopilotUsage, b as copilotHeaders, d as generateRequestIdFromPayload, f as getRootSessionId, g as sleep, h as parseUserIdMetadata, k as compactSystemPromptStarts, m as isNullish, p as getUUID, r as setupCodexToken, w as prepareMessageProxyHeaders, x as copilotWebSocketHeaders, y as copilotBaseUrl, z as HTTPError } from "./token-DigcCxDR.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-OX6iPJ9D.js";
4
4
  import consola from "consola";
5
5
  import { createHash } from "node:crypto";
@@ -1397,7 +1397,7 @@ async function forwardProviderModels(providerConfig, requestHeaders) {
1397
1397
  }
1398
1398
  //#endregion
1399
1399
  //#region src/routes/provider/chat-completions/handler.ts
1400
- const logger$8 = createHandlerLogger("provider-chat-completions-handler");
1400
+ const logger$9 = createHandlerLogger("provider-chat-completions-handler");
1401
1401
  async function handleProviderChatCompletionsForProvider(c, options) {
1402
1402
  const { payload, provider } = options;
1403
1403
  const providerConfig = await resolveProviderConfig(provider);
@@ -1409,13 +1409,13 @@ async function handleProviderChatCompletionsForProvider(c, options) {
1409
1409
  applyProviderModelDefaults(payload, modelConfig);
1410
1410
  applyMissingExtraBody$1(payload, { extraBody: modelConfig?.extraBody });
1411
1411
  applyProviderStreamOptions(payload);
1412
- debugJson(logger$8, "provider.chat_completions.request", {
1412
+ debugJson(logger$9, "provider.chat_completions.request", {
1413
1413
  payload,
1414
1414
  provider
1415
1415
  });
1416
1416
  const upstreamResponse = await forwardProviderChatCompletions(providerConfig, payload, c.req.raw.headers);
1417
1417
  if (!upstreamResponse.ok) {
1418
- logger$8.error("Failed to create provider chat completions", {
1418
+ logger$9.error("Failed to create provider chat completions", {
1419
1419
  provider,
1420
1420
  statusCode: upstreamResponse.status
1421
1421
  });
@@ -1429,7 +1429,7 @@ async function handleProviderChatCompletionsForProvider(c, options) {
1429
1429
  });
1430
1430
  const responseBody = await upstreamResponse.clone().json();
1431
1431
  recordUsage(normalizeOpenAIUsage(responseBody.usage));
1432
- debugJson(logger$8, "provider.chat_completions.response", responseBody);
1432
+ debugJson(logger$9, "provider.chat_completions.response", responseBody);
1433
1433
  return createProviderProxyResponse(upstreamResponse);
1434
1434
  }
1435
1435
  const applyProviderModelDefaults = (payload, modelConfig) => {
@@ -1455,12 +1455,12 @@ const createProviderChatCompletionsUsageRecorder = (payload, provider, modelConf
1455
1455
  providerName: provider
1456
1456
  });
1457
1457
  const streamProviderChatCompletions = (c, upstreamResponse, options) => {
1458
- logger$8.debug("provider.chat_completions.streaming", { provider: options.provider });
1458
+ logger$9.debug("provider.chat_completions.streaming", { provider: options.provider });
1459
1459
  return streamSSE(c, async (stream) => {
1460
1460
  let usage = {};
1461
1461
  try {
1462
1462
  for await (const chunk of events(upstreamResponse)) {
1463
- debugJson(logger$8, "provider.chat_completions.stream_chunk", chunk);
1463
+ debugJson(logger$9, "provider.chat_completions.stream_chunk", chunk);
1464
1464
  if (chunk.data && chunk.data !== "[DONE]") {
1465
1465
  const parsedChunk = parseChatCompletionChunkData(chunk.data);
1466
1466
  if (parsedChunk?.usage) usage = normalizeOpenAIUsage(parsedChunk.usage);
@@ -1587,7 +1587,7 @@ const createChatCompletions = async (payload, options) => {
1587
1587
  };
1588
1588
  //#endregion
1589
1589
  //#region src/routes/chat-completions/handler.ts
1590
- const logger$7 = createHandlerLogger("chat-completions-handler");
1590
+ const logger$8 = createHandlerLogger("chat-completions-handler");
1591
1591
  async function handleCompletion$1(c) {
1592
1592
  let payload = await c.req.json();
1593
1593
  const requestedModel = payload.model;
@@ -1602,7 +1602,7 @@ async function handleCompletion$1(c) {
1602
1602
  });
1603
1603
  }
1604
1604
  await checkRateLimit(state);
1605
- debugJson(logger$7, "Request payload:", payload);
1605
+ debugJson(logger$8, "Request payload:", payload);
1606
1606
  const selectedModel = state.models?.data.find((model) => model.id === payload.model);
1607
1607
  if (state.manualApprove) await awaitApproval();
1608
1608
  if (isNullish(payload.max_tokens) && isNullish(payload.max_completion_tokens)) {
@@ -1610,16 +1610,16 @@ async function handleCompletion$1(c) {
1610
1610
  ...payload,
1611
1611
  max_tokens: selectedModel?.capabilities.limits.max_output_tokens
1612
1612
  };
1613
- debugJson(logger$7, "Set max_tokens to:", payload.max_tokens);
1613
+ debugJson(logger$8, "Set max_tokens to:", payload.max_tokens);
1614
1614
  }
1615
1615
  if (payload.model.includes("gpt")) {
1616
1616
  if (isNullish(payload.max_completion_tokens)) payload.max_completion_tokens = payload.max_tokens;
1617
1617
  delete payload.max_tokens;
1618
1618
  }
1619
1619
  const requestId = generateRequestIdFromPayload(payload);
1620
- logger$7.debug("Generated request ID:", requestId);
1620
+ logger$8.debug("Generated request ID:", requestId);
1621
1621
  const sessionId = getUUID(requestId);
1622
- logger$7.debug("Extracted session ID:", sessionId);
1622
+ logger$8.debug("Extracted session ID:", sessionId);
1623
1623
  const recordUsage = createCopilotTokenUsageRecorder({
1624
1624
  endpoint: "chat_completions",
1625
1625
  fallbackSessionId: sessionId,
@@ -1630,18 +1630,18 @@ async function handleCompletion$1(c) {
1630
1630
  sessionId
1631
1631
  });
1632
1632
  if (isNonStreaming$1(response)) {
1633
- debugJson(logger$7, "Non-streaming response:", response);
1633
+ debugJson(logger$8, "Non-streaming response:", response);
1634
1634
  recordUsage({
1635
1635
  ...normalizeOpenAIUsage(response.usage),
1636
1636
  total_nano_aiu: normalizeOptionalToken(response.copilot_usage?.total_nano_aiu)
1637
1637
  });
1638
1638
  return c.json(response);
1639
1639
  }
1640
- logger$7.debug("Streaming response");
1640
+ logger$8.debug("Streaming response");
1641
1641
  return streamSSE(c, async (stream) => {
1642
1642
  let usage = {};
1643
1643
  for await (const chunk of response) {
1644
- debugJson(logger$7, "Streaming chunk:", chunk);
1644
+ debugJson(logger$8, "Streaming chunk:", chunk);
1645
1645
  const parsedChunk = parseChatCompletionChunk(chunk);
1646
1646
  if (parsedChunk?.usage || parsedChunk?.copilot_usage) usage = {
1647
1647
  ...normalizeOpenAIUsage(parsedChunk.usage),
@@ -2749,7 +2749,7 @@ const prepareMessagesApiPayload = (payload, selectedModel) => {
2749
2749
  };
2750
2750
  //#endregion
2751
2751
  //#region src/routes/provider/messages/count-tokens-handler.ts
2752
- const logger$6 = createHandlerLogger("provider-count-tokens-handler");
2752
+ const logger$7 = createHandlerLogger("provider-count-tokens-handler");
2753
2753
  async function handleProviderCountTokens(c) {
2754
2754
  const provider = c.req.param("provider");
2755
2755
  return await handleProviderCountTokensForProvider(c, {
@@ -2772,7 +2772,7 @@ async function handleProviderCountTokensForProvider(c, options) {
2772
2772
  toolContentSupportType: modelConfig?.toolContentSupportType ?? []
2773
2773
  } : void 0), createFallbackModel(modelId));
2774
2774
  const finalTokenCount = tokenCount.input + tokenCount.output;
2775
- logger$6.debug("provider.count_tokens.success", {
2775
+ logger$7.debug("provider.count_tokens.success", {
2776
2776
  provider,
2777
2777
  model: anthropicPayload.model,
2778
2778
  input_tokens: finalTokenCount
@@ -3909,9 +3909,9 @@ const mapResponsesUsage = (response) => {
3909
3909
  ...response.usage?.input_tokens_details?.cached_tokens !== void 0 && { cache_read_input_tokens: response.usage.input_tokens_details.cached_tokens }
3910
3910
  };
3911
3911
  };
3912
- const isRecord = (value) => typeof value === "object" && value !== null;
3913
- const isResponseOutputText = (block) => isRecord(block) && "type" in block && block.type === "output_text";
3914
- const isResponseOutputRefusal = (block) => isRecord(block) && "type" in block && block.type === "refusal";
3912
+ const isRecord$1 = (value) => typeof value === "object" && value !== null;
3913
+ const isResponseOutputText = (block) => isRecord$1(block) && "type" in block && block.type === "output_text";
3914
+ const isResponseOutputRefusal = (block) => isRecord$1(block) && "type" in block && block.type === "refusal";
3915
3915
  const convertToolResultContent = (content) => {
3916
3916
  if (typeof content === "string") return content;
3917
3917
  if (Array.isArray(content)) {
@@ -5169,7 +5169,7 @@ function getModels() {
5169
5169
  }
5170
5170
  //#endregion
5171
5171
  //#region src/routes/provider/messages/handler.ts
5172
- const logger$5 = createHandlerLogger("provider-messages-handler");
5172
+ const logger$6 = createHandlerLogger("provider-messages-handler");
5173
5173
  const OPENAI_COMPATIBLE_CONTEXT_CACHE_MARKER_LIMIT = 4;
5174
5174
  const OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL = { type: "ephemeral" };
5175
5175
  const OPENAI_COMPATIBLE_CONTEXT_CACHE_ROLES = new Set([
@@ -5194,7 +5194,7 @@ async function handleProviderMessagesForProvider(c, options) {
5194
5194
  } }, 404);
5195
5195
  try {
5196
5196
  const modelConfig = providerConfig.models?.[payload.model];
5197
- debugJson(logger$5, "provider.messages.request", {
5197
+ debugJson(logger$6, "provider.messages.request", {
5198
5198
  payload,
5199
5199
  provider
5200
5200
  });
@@ -5227,13 +5227,13 @@ async function handleProviderMessagesForProvider(c, options) {
5227
5227
  });
5228
5228
  }
5229
5229
  applyMissingExtraBody(payload, { extraBody: modelConfig?.extraBody });
5230
- debugJson(logger$5, "Translated provider.messages.request", {
5230
+ debugJson(logger$6, "Translated provider.messages.request", {
5231
5231
  payload,
5232
5232
  provider
5233
5233
  });
5234
5234
  const upstreamResponse = await forwardProviderMessages(providerConfig, payload, c.req.raw.headers);
5235
5235
  if (!upstreamResponse.ok) {
5236
- logger$5.error("Failed to create responses", upstreamResponse);
5236
+ logger$6.error("Failed to create responses", upstreamResponse);
5237
5237
  throw new HTTPError("Failed to create responses", upstreamResponse);
5238
5238
  }
5239
5239
  const contentType = upstreamResponse.headers.get("content-type") ?? "";
@@ -5253,7 +5253,7 @@ async function handleProviderMessagesForProvider(c, options) {
5253
5253
  provider
5254
5254
  });
5255
5255
  } catch (error) {
5256
- logger$5.error("provider.messages.error", {
5256
+ logger$6.error("provider.messages.error", {
5257
5257
  provider,
5258
5258
  error
5259
5259
  });
@@ -5267,7 +5267,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
5267
5267
  responsesPayload.stream = true;
5268
5268
  applyResponsesApiContextManagement(responsesPayload, selectedModel?.capabilities.limits.max_prompt_tokens);
5269
5269
  compactInputByLatestCompaction(responsesPayload);
5270
- debugJson(logger$5, "provider.messages.responses.web_search.request", {
5270
+ debugJson(logger$6, "provider.messages.responses.web_search.request", {
5271
5271
  payload: responsesPayload,
5272
5272
  provider
5273
5273
  });
@@ -5278,7 +5278,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
5278
5278
  errorMessagePrefix: `${provider} web search responses stream`,
5279
5279
  parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
5280
5280
  upstreamResponse,
5281
- logger: logger$5
5281
+ logger: logger$6
5282
5282
  }),
5283
5283
  modelConfig,
5284
5284
  payload,
@@ -5295,7 +5295,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
5295
5295
  }
5296
5296
  const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers);
5297
5297
  if (!upstreamResponse.ok) {
5298
- logger$5.error("Failed to create provider web search responses", {
5298
+ logger$6.error("Failed to create provider web search responses", {
5299
5299
  provider,
5300
5300
  upstreamResponse
5301
5301
  });
@@ -5306,7 +5306,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
5306
5306
  errorMessagePrefix: `${provider} web search responses stream`,
5307
5307
  parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
5308
5308
  upstreamResponse: events(upstreamResponse),
5309
- logger: logger$5
5309
+ logger: logger$6
5310
5310
  }),
5311
5311
  modelConfig,
5312
5312
  payload,
@@ -5327,7 +5327,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
5327
5327
  const responsesPayload = translateAnthropicMessagesToResponsesPayload(payload);
5328
5328
  applyResponsesApiContextManagement(responsesPayload, selectedModel?.capabilities.limits.max_prompt_tokens);
5329
5329
  compactInputByLatestCompaction(responsesPayload);
5330
- debugJson(logger$5, "provider.messages.responses.request", {
5330
+ debugJson(logger$6, "provider.messages.responses.request", {
5331
5331
  payload: responsesPayload,
5332
5332
  provider
5333
5333
  });
@@ -5353,7 +5353,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
5353
5353
  }
5354
5354
  const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers);
5355
5355
  if (!upstreamResponse.ok) {
5356
- logger$5.error("Failed to create provider responses", upstreamResponse);
5356
+ logger$6.error("Failed to create provider responses", upstreamResponse);
5357
5357
  throw new HTTPError("Failed to create provider responses", upstreamResponse);
5358
5358
  }
5359
5359
  if (responsesPayload.stream) return streamResponsesProviderMessages({
@@ -5404,13 +5404,13 @@ const applyOpenAICompatibleExtraBodyThinkingBudget = (payload, options) => {
5404
5404
  const handleOpenAICompatibleProviderMessages = async (c, options) => {
5405
5405
  const { modelConfig, payload, provider, providerConfig } = options;
5406
5406
  const openAIPayload = createOpenAICompatiblePayload(payload, modelConfig);
5407
- debugJson(logger$5, "provider.messages.openai_compatible.request", {
5407
+ debugJson(logger$6, "provider.messages.openai_compatible.request", {
5408
5408
  payload: openAIPayload,
5409
5409
  provider
5410
5410
  });
5411
5411
  const upstreamResponse = await forwardProviderChatCompletions(providerConfig, openAIPayload, c.req.raw.headers);
5412
5412
  if (!upstreamResponse.ok) {
5413
- logger$5.error("Failed to create openai-compatible responses", upstreamResponse);
5413
+ logger$6.error("Failed to create openai-compatible responses", upstreamResponse);
5414
5414
  throw new HTTPError("Failed to create openai-compatible responses", upstreamResponse);
5415
5415
  }
5416
5416
  const contentType = upstreamResponse.headers.get("content-type") ?? "";
@@ -5496,12 +5496,12 @@ const setContextCacheControl = (part) => {
5496
5496
  part.cache_control = { ...OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL };
5497
5497
  };
5498
5498
  const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, upstreamResponse }) => {
5499
- logger$5.debug("provider.messages.streaming");
5499
+ logger$6.debug("provider.messages.streaming");
5500
5500
  const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency);
5501
5501
  return streamSSE(c, async (stream) => {
5502
5502
  let usage = {};
5503
5503
  for await (const chunk of events(upstreamResponse)) {
5504
- logger$5.debug("provider.messages.raw_stream_event:", chunk.data);
5504
+ logger$6.debug("provider.messages.raw_stream_event:", chunk.data);
5505
5505
  const eventName = chunk.event;
5506
5506
  if (eventName === "ping") {
5507
5507
  await stream.writeSSE({
@@ -5527,7 +5527,7 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
5527
5527
  });
5528
5528
  };
5529
5529
  const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, upstreamResponse }) => {
5530
- logger$5.debug("provider.messages.openai_compatible.streaming");
5530
+ logger$6.debug("provider.messages.openai_compatible.streaming");
5531
5531
  const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency);
5532
5532
  return streamSSE(c, async (stream) => {
5533
5533
  let usage = {};
@@ -5539,7 +5539,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
5539
5539
  thinkingBlockOpen: false
5540
5540
  };
5541
5541
  for await (const chunk of events(upstreamResponse)) {
5542
- logger$5.debug("provider.messages.openai_compatible.raw_stream_event:", chunk.data);
5542
+ logger$6.debug("provider.messages.openai_compatible.raw_stream_event:", chunk.data);
5543
5543
  if (chunk.event === "ping") {
5544
5544
  await stream.writeSSE({
5545
5545
  event: "ping",
@@ -5557,7 +5557,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
5557
5557
  const events = translateChunkToAnthropicEvents(parsed, streamState);
5558
5558
  for (const event of events) {
5559
5559
  const eventData = JSON.stringify(event);
5560
- debugLazy(logger$5, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
5560
+ debugLazy(logger$6, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
5561
5561
  await stream.writeSSE({
5562
5562
  event: event.type,
5563
5563
  data: eventData
@@ -5566,7 +5566,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
5566
5566
  }
5567
5567
  for (const event of flushPendingAnthropicStreamEvents(streamState)) {
5568
5568
  const eventData = JSON.stringify(event);
5569
- debugLazy(logger$5, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
5569
+ debugLazy(logger$6, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
5570
5570
  await stream.writeSSE({
5571
5571
  event: event.type,
5572
5572
  data: eventData
@@ -5576,13 +5576,13 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
5576
5576
  });
5577
5577
  };
5578
5578
  const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, providerConfig, upstreamResponse }) => {
5579
- logger$5.debug("provider.messages.responses.streaming", { provider });
5579
+ logger$6.debug("provider.messages.responses.streaming", { provider });
5580
5580
  const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency);
5581
5581
  return streamSSE(c, async (stream) => {
5582
5582
  let usage = {};
5583
5583
  const streamState = createResponsesStreamState({ toolSearchName: resolveBridgeToolSearchName(payload.tools) });
5584
5584
  for await (const chunk of upstreamResponse) {
5585
- logger$5.debug("provider.messages.responses.raw_stream_event:", chunk.data);
5585
+ logger$6.debug("provider.messages.responses.raw_stream_event:", chunk.data);
5586
5586
  if (chunk.event === "ping") {
5587
5587
  await stream.writeSSE({
5588
5588
  event: "ping",
@@ -5600,7 +5600,7 @@ const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurre
5600
5600
  const events = translateResponsesStreamEvent(parsed, streamState);
5601
5601
  for (const event of events) {
5602
5602
  const eventData = JSON.stringify(event);
5603
- debugLazy(logger$5, () => ["provider.messages.responses.translated_event:", eventData]);
5603
+ debugLazy(logger$6, () => ["provider.messages.responses.translated_event:", eventData]);
5604
5604
  await stream.writeSSE({
5605
5605
  event: event.type,
5606
5606
  data: eventData
@@ -5624,7 +5624,7 @@ const parseOpenAICompatibleStreamChunk = (data) => {
5624
5624
  try {
5625
5625
  return JSON.parse(data);
5626
5626
  } catch (error) {
5627
- logger$5.error("provider.messages.openai_compatible.parse_chunk_error", {
5627
+ logger$6.error("provider.messages.openai_compatible.parse_chunk_error", {
5628
5628
  data,
5629
5629
  error
5630
5630
  });
@@ -5637,7 +5637,7 @@ const parseResponsesProviderStreamChunk = (data, providerConfig) => {
5637
5637
  if (providerConfig.name === "codex") logCodexRateLimitsEvent(parsed);
5638
5638
  return parsed;
5639
5639
  } catch (error) {
5640
- logger$5.error("provider.messages.responses.parse_chunk_error", {
5640
+ logger$6.error("provider.messages.responses.parse_chunk_error", {
5641
5641
  provider: providerConfig.name,
5642
5642
  data,
5643
5643
  error
@@ -5662,7 +5662,7 @@ const parseProviderStreamEvent = (data) => {
5662
5662
  usage: {}
5663
5663
  };
5664
5664
  } catch (error) {
5665
- logger$5.error("provider.messages.streaming.adjust_tokens_error", {
5665
+ logger$6.error("provider.messages.streaming.adjust_tokens_error", {
5666
5666
  error,
5667
5667
  originalData: data
5668
5668
  });
@@ -5672,29 +5672,29 @@ const parseProviderStreamEvent = (data) => {
5672
5672
  const respondProviderMessagesJson = (c, options) => {
5673
5673
  const { body, modelConfig, payload, pricingCurrency, provider } = options;
5674
5674
  createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency)(normalizeAnthropicUsage(body.usage));
5675
- debugJson(logger$5, "provider.messages.no_stream result:", body);
5675
+ debugJson(logger$6, "provider.messages.no_stream result:", body);
5676
5676
  return c.json(body);
5677
5677
  };
5678
5678
  const respondOpenAICompatibleProviderMessagesJson = (c, options) => {
5679
5679
  const { body, modelConfig, payload, pricingCurrency, provider } = options;
5680
5680
  createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency)(normalizeOpenAIUsage(body.usage));
5681
5681
  const anthropicResponse = translateToAnthropic(body);
5682
- debugJson(logger$5, "provider.messages.openai_compatible.no_stream result:", anthropicResponse);
5682
+ debugJson(logger$6, "provider.messages.openai_compatible.no_stream result:", anthropicResponse);
5683
5683
  return c.json(anthropicResponse);
5684
5684
  };
5685
5685
  const respondResponsesProviderMessagesJson = (c, options) => {
5686
5686
  const { body, modelConfig, payload, pricingCurrency, provider, providerConfig } = options;
5687
5687
  createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency)(normalizeResponsesUsage(body.usage));
5688
5688
  const anthropicResponse = translateResponsesResultToAnthropic(body, { toolSearchName: resolveBridgeToolSearchName(payload.tools) });
5689
- debugJson(logger$5, "provider.messages.responses.no_stream result:", anthropicResponse);
5690
- if (providerConfig.name === "codex") logger$5.debug("provider.messages.codex.no_stream.result");
5689
+ debugJson(logger$6, "provider.messages.responses.no_stream result:", anthropicResponse);
5690
+ if (providerConfig.name === "codex") logger$6.debug("provider.messages.codex.no_stream.result");
5691
5691
  return c.json(anthropicResponse);
5692
5692
  };
5693
5693
  const respondWebSearchProviderMessagesJson = (c, options) => {
5694
5694
  const { body, modelConfig, payload, pricingCurrency, provider } = options;
5695
5695
  createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency)(normalizeResponsesUsage(body.usage));
5696
5696
  const { extract, response } = reconstructWebSearchResponse(payload, body, { requestId: body.id || `${provider}:${payload.model}` });
5697
- logger$5.debug(`provider.messages.responses.web_search: ${extract.queries.length} quer(y/ies), ${extract.sources.length} source(s)`);
5697
+ logger$6.debug(`provider.messages.responses.web_search: ${extract.queries.length} quer(y/ies), ${extract.sources.length} source(s)`);
5698
5698
  if (!payload.stream) return c.json(response);
5699
5699
  return streamSSE(c, async (stream) => {
5700
5700
  for (const event of buildSyntheticStreamEvents(response)) await stream.writeSSE({
@@ -5999,7 +5999,7 @@ const parseAnthropicStreamEvent = (data) => {
5999
5999
  };
6000
6000
  //#endregion
6001
6001
  //#region src/routes/messages/handler.ts
6002
- const logger$4 = createHandlerLogger("messages-handler");
6002
+ const logger$5 = createHandlerLogger("messages-handler");
6003
6003
  const messagesFlowHandlers = {
6004
6004
  handleWithChatCompletions,
6005
6005
  handleWithMessagesApi,
@@ -6011,7 +6011,7 @@ async function handleCompletion(c) {
6011
6011
  anthropicPayload.model = resolveMappedModel(anthropicPayload.model);
6012
6012
  if (anthropicPayload.model !== requestedModel) consola.debug(`Resolved model mapping: ${requestedModel} -> ${anthropicPayload.model}`);
6013
6013
  const webSearchResult = await tryHandleWebSearch(c, anthropicPayload, {
6014
- logger: logger$4,
6014
+ logger: logger$5,
6015
6015
  forwardToProvider: (ctx, payload, provider) => handleProviderMessagesForProvider(ctx, {
6016
6016
  payload,
6017
6017
  provider
@@ -6026,19 +6026,19 @@ async function handleCompletion(c) {
6026
6026
  provider: providerModelAlias.provider
6027
6027
  });
6028
6028
  }
6029
- debugJson(logger$4, "Anthropic request payload:", anthropicPayload);
6029
+ debugJson(logger$5, "Anthropic request payload:", anthropicPayload);
6030
6030
  normalizeSystemMessages(anthropicPayload);
6031
6031
  await checkRateLimit(state);
6032
6032
  sanitizeIdeTools(anthropicPayload);
6033
6033
  const subagentMarker = parseSubagentMarkerFromFirstUser(anthropicPayload);
6034
- if (subagentMarker) debugJson(logger$4, "Detected Subagent marker:", subagentMarker);
6034
+ if (subagentMarker) debugJson(logger$5, "Detected Subagent marker:", subagentMarker);
6035
6035
  let sessionId = getRootSessionId(anthropicPayload, c);
6036
6036
  const compactType = getCompactType(anthropicPayload);
6037
6037
  const anthropicBeta = c.req.header("anthropic-beta");
6038
- logger$4.debug("Anthropic Beta header:", anthropicBeta);
6038
+ logger$5.debug("Anthropic Beta header:", anthropicBeta);
6039
6039
  const noTools = !anthropicPayload.tools || anthropicPayload.tools.length === 0;
6040
6040
  if (anthropicBeta && noTools && compactType === 0) anthropicPayload.model = getSmallModel();
6041
- if (compactType) logger$4.debug("Compact request type:", compactType);
6041
+ if (compactType) logger$5.debug("Compact request type:", compactType);
6042
6042
  if (!state.tokenBasedBilling) {
6043
6043
  const lastMessageCacheControl = getLastMessageContentCacheControl(anthropicPayload.messages.at(-1));
6044
6044
  stripToolReferenceTurnBoundary(anthropicPayload);
@@ -6046,9 +6046,9 @@ async function handleCompletion(c) {
6046
6046
  applyLastMessageCacheControl(anthropicPayload, lastMessageCacheControl);
6047
6047
  }
6048
6048
  const requestId = generateRequestIdFromPayload(anthropicPayload, sessionId);
6049
- logger$4.debug("Generated request ID:", requestId);
6049
+ logger$5.debug("Generated request ID:", requestId);
6050
6050
  if (!sessionId) sessionId = getUUID(requestId);
6051
- logger$4.debug("Extracted session ID:", sessionId);
6051
+ logger$5.debug("Extracted session ID:", sessionId);
6052
6052
  if (state.manualApprove) await awaitApproval();
6053
6053
  const selectedModel = findEndpointModel(anthropicPayload.model);
6054
6054
  anthropicPayload.model = selectedModel?.id ?? anthropicPayload.model;
@@ -6059,7 +6059,7 @@ async function handleCompletion(c) {
6059
6059
  requestId,
6060
6060
  sessionId,
6061
6061
  compactType,
6062
- logger: logger$4
6062
+ logger: logger$5
6063
6063
  });
6064
6064
  if (shouldUseResponsesApi(selectedModel, compactType)) return await messagesFlowHandlers.handleWithResponsesApi(c, anthropicPayload, {
6065
6065
  subagentMarker,
@@ -6067,7 +6067,7 @@ async function handleCompletion(c) {
6067
6067
  requestId,
6068
6068
  sessionId,
6069
6069
  compactType,
6070
- logger: logger$4
6070
+ logger: logger$5
6071
6071
  });
6072
6072
  return await messagesFlowHandlers.handleWithChatCompletions(c, anthropicPayload, {
6073
6073
  subagentMarker,
@@ -6075,7 +6075,7 @@ async function handleCompletion(c) {
6075
6075
  requestId,
6076
6076
  sessionId,
6077
6077
  compactType,
6078
- logger: logger$4
6078
+ logger: logger$5
6079
6079
  });
6080
6080
  }
6081
6081
  const MESSAGES_ENDPOINT = "/v1/messages";
@@ -6106,23 +6106,89 @@ messageRoutes.post("/count_tokens", async (c) => {
6106
6106
  //#endregion
6107
6107
  //#region src/routes/models/route.ts
6108
6108
  const modelRoutes = new Hono();
6109
- modelRoutes.get("/", async (c) => {
6109
+ const logger$4 = createHandlerLogger("models-handler");
6110
+ const EPOCH_ISO = (/* @__PURE__ */ new Date(0)).toISOString();
6111
+ function isRecord(value) {
6112
+ return typeof value === "object" && value !== null && !Array.isArray(value);
6113
+ }
6114
+ function normalizeCopilotModel(model) {
6115
+ const contextWindow = model.capabilities?.limits?.max_context_window_tokens ?? 0;
6116
+ const clientId = toClientModelId(model.id);
6117
+ return {
6118
+ claude_model_id: contextWindow >= 1e6 ? `${clientId}[1m]` : clientId,
6119
+ ...model,
6120
+ id: clientId,
6121
+ object: "model",
6122
+ type: "model",
6123
+ created: 0,
6124
+ created_at: EPOCH_ISO,
6125
+ owned_by: model.vendor,
6126
+ display_name: model.name
6127
+ };
6128
+ }
6129
+ function getStringField(model, field) {
6130
+ const value = model[field];
6131
+ return typeof value === "string" && value.trim() ? value : void 0;
6132
+ }
6133
+ function normalizeProviderModel(provider, model) {
6134
+ if (!isRecord(model)) return null;
6135
+ const rawId = getStringField(model, "id");
6136
+ if (!rawId) return null;
6137
+ const id = `${provider}/${rawId}`;
6138
+ const name = getStringField(model, "display_name") ?? getStringField(model, "name") ?? rawId;
6139
+ const ownedBy = getStringField(model, "owned_by") ?? getStringField(model, "vendor") ?? provider;
6140
+ return {
6141
+ ...model,
6142
+ id,
6143
+ object: getStringField(model, "object") ?? "model",
6144
+ type: getStringField(model, "type") ?? "model",
6145
+ created: typeof model.created === "number" ? model.created : 0,
6146
+ created_at: getStringField(model, "created_at") ?? EPOCH_ISO,
6147
+ owned_by: ownedBy,
6148
+ display_name: name
6149
+ };
6150
+ }
6151
+ async function getProviderModels(provider, requestHeaders) {
6110
6152
  try {
6111
- const models = state.models?.data.map((model) => {
6112
- const contextWindow = model.capabilities?.limits?.max_context_window_tokens ?? 0;
6113
- const clientId = toClientModelId(model.id);
6114
- return {
6115
- claude_model_id: contextWindow >= 1e6 ? `${clientId}[1m]` : clientId,
6116
- ...model,
6117
- id: clientId,
6118
- object: "model",
6119
- type: "model",
6120
- created: 0,
6121
- created_at: (/* @__PURE__ */ new Date(0)).toISOString(),
6122
- owned_by: model.vendor,
6123
- display_name: model.name
6124
- };
6153
+ const providerConfig = await resolveProviderConfig(provider);
6154
+ if (!providerConfig) return [];
6155
+ if (providerConfig.name === "codex") return getModels().data.map((model) => normalizeProviderModel(providerConfig.name, model)).filter((model) => model !== null);
6156
+ const response = await forwardProviderModels(providerConfig, requestHeaders);
6157
+ if (!response.ok) {
6158
+ logger$4.warn("models.provider.skip_non_ok", {
6159
+ provider,
6160
+ statusCode: response.status
6161
+ });
6162
+ return [];
6163
+ }
6164
+ const body = await response.json();
6165
+ if (!isRecord(body) || !Array.isArray(body.data)) {
6166
+ logger$4.warn("models.provider.skip_invalid_body", { provider });
6167
+ return [];
6168
+ }
6169
+ return body.data.map((model) => normalizeProviderModel(providerConfig.name, model)).filter((model) => model !== null);
6170
+ } catch (error) {
6171
+ logger$4.warn("models.provider.skip_error", {
6172
+ provider,
6173
+ error
6125
6174
  });
6175
+ return [];
6176
+ }
6177
+ }
6178
+ async function getAggregatedModels(requestHeaders) {
6179
+ const copilotModels = state.models?.data.map(normalizeCopilotModel) ?? [];
6180
+ const providerModelsByProvider = await Promise.all(listEnabledProviders().map((provider) => getProviderModels(provider, requestHeaders)));
6181
+ const models = [...copilotModels, ...providerModelsByProvider.flat()];
6182
+ const seenModelIds = /* @__PURE__ */ new Set();
6183
+ return models.filter((model) => {
6184
+ if (seenModelIds.has(model.id)) return false;
6185
+ seenModelIds.add(model.id);
6186
+ return true;
6187
+ });
6188
+ }
6189
+ modelRoutes.get("/", async (c) => {
6190
+ try {
6191
+ const models = await getAggregatedModels(c.req.raw.headers);
6126
6192
  return c.json({
6127
6193
  object: "list",
6128
6194
  data: models,
@@ -6612,4 +6678,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
6612
6678
  //#endregion
6613
6679
  export { server };
6614
6680
 
6615
- //# sourceMappingURL=server-7U9OZLf0.js.map
6681
+ //# sourceMappingURL=server-s_0_JChu.js.map