@jeffreycao/copilot-api 1.9.8 → 1.9.10

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/dist/main.js CHANGED
@@ -44,7 +44,7 @@ bindElectronFetch();
44
44
  const { auth } = await import("./auth-CWEhhJYn.js");
45
45
  const { checkUsage } = await import("./check-usage-B5yr4fpk.js");
46
46
  const { debug } = await import("./debug-DcC7ZPH0.js");
47
- const { start } = await import("./start-BCBe4icv.js");
47
+ const { start } = await import("./start-CpqH2Ekm.js");
48
48
  const main = defineCommand({
49
49
  meta: {
50
50
  name: "copilot-api",
@@ -1496,7 +1496,7 @@ function mapContent(content, options = {}) {
1496
1496
  });
1497
1497
  break;
1498
1498
  }
1499
- if (contentParts.length === 0) return null;
1499
+ if (contentParts.length === 0) return "";
1500
1500
  return contentParts;
1501
1501
  }
1502
1502
  function createDocumentTextPart() {
@@ -3227,9 +3227,13 @@ function closeThinkingBlockIfOpen(state$1, events$1) {
3227
3227
 
3228
3228
  //#endregion
3229
3229
  //#region src/routes/messages/api-flows.ts
3230
+ const COPILOT_CONTEXT_CACHE_SYSTEM_MARKER_LIMIT = 2;
3231
+ const COPILOT_CONTEXT_CACHE_NON_SYSTEM_MARKER_LIMIT = 2;
3232
+ const COPILOT_CONTEXT_CACHE_CONTROL = { type: "ephemeral" };
3230
3233
  const handleWithChatCompletions = async (c, anthropicPayload, options) => {
3231
3234
  const { logger: logger$7, subagentMarker, requestId, sessionId, compactType } = options;
3232
3235
  const openAIPayload = translateToOpenAI(anthropicPayload);
3236
+ prepareCopilotChatCompletionsPayload(openAIPayload);
3233
3237
  const recordUsage = createCopilotUsageRecorder({
3234
3238
  endpoint: "chat_completions",
3235
3239
  fallbackSessionId: sessionId,
@@ -3401,6 +3405,26 @@ const handleWithMessagesApi = async (c, anthropicPayload, options) => {
3401
3405
  recordUsage(normalizeAnthropicUsage(response.usage));
3402
3406
  return c.json(response);
3403
3407
  };
3408
+ const prepareCopilotChatCompletionsPayload = (payload) => {
3409
+ applyCopilotContextCache(payload);
3410
+ };
3411
+ const applyCopilotContextCache = (payload) => {
3412
+ const messageIndexes = selectCopilotContextCacheMessageIndexes(payload.messages);
3413
+ for (const messageIndex of messageIndexes) {
3414
+ const message = payload.messages[messageIndex];
3415
+ message.copilot_cache_control = { ...COPILOT_CONTEXT_CACHE_CONTROL };
3416
+ }
3417
+ };
3418
+ const selectCopilotContextCacheMessageIndexes = (messages) => {
3419
+ const systemIndexes = messages.flatMap((message, index) => message.role === "system" && isCopilotContextCacheEligible(message) ? [index] : []).slice(0, COPILOT_CONTEXT_CACHE_SYSTEM_MARKER_LIMIT);
3420
+ const reverseNonSystemIndexes = messages.flatMap((message, index) => message.role !== "system" && isCopilotContextCacheEligible(message) ? [index] : []).reverse().slice(0, COPILOT_CONTEXT_CACHE_NON_SYSTEM_MARKER_LIMIT);
3421
+ return uniqueIndexes$1([...systemIndexes, ...reverseNonSystemIndexes]).sort((a, b) => a - b);
3422
+ };
3423
+ const isCopilotContextCacheEligible = (message) => {
3424
+ if (typeof message.content === "string") return message.content.length > 0;
3425
+ return Array.isArray(message.content) && message.content.length > 0;
3426
+ };
3427
+ const uniqueIndexes$1 = (indexes) => [...new Set(indexes)];
3404
3428
  const isNonStreaming = (response) => Object.hasOwn(response, "choices");
3405
3429
  const isAsyncIterable$1 = (value) => Boolean(value) && typeof value[Symbol.asyncIterator] === "function";
3406
3430
  const createCopilotUsageRecorder = (options) => createCopilotTokenUsageRecorder({
@@ -3469,6 +3493,11 @@ const parseSubagentMarkerFromSystemReminder = (text) => {
3469
3493
  //#endregion
3470
3494
  //#region src/routes/messages/handler.ts
3471
3495
  const logger$5 = createHandlerLogger("messages-handler");
3496
+ const messagesFlowHandlers = {
3497
+ handleWithChatCompletions,
3498
+ handleWithMessagesApi,
3499
+ handleWithResponsesApi
3500
+ };
3472
3501
  async function handleCompletion(c) {
3473
3502
  await checkRateLimit(state);
3474
3503
  const anthropicPayload = await c.req.json();
@@ -3491,7 +3520,7 @@ async function handleCompletion(c) {
3491
3520
  if (state.manualApprove) await awaitApproval();
3492
3521
  const selectedModel = findEndpointModel(anthropicPayload.model);
3493
3522
  anthropicPayload.model = selectedModel?.id ?? anthropicPayload.model;
3494
- if (shouldUseMessagesApi(selectedModel)) return await handleWithMessagesApi(c, anthropicPayload, {
3523
+ if (shouldUseMessagesApi(selectedModel)) return await messagesFlowHandlers.handleWithMessagesApi(c, anthropicPayload, {
3495
3524
  anthropicBetaHeader: anthropicBeta,
3496
3525
  subagentMarker,
3497
3526
  selectedModel,
@@ -3500,7 +3529,7 @@ async function handleCompletion(c) {
3500
3529
  compactType,
3501
3530
  logger: logger$5
3502
3531
  });
3503
- if (shouldUseResponsesApi(selectedModel)) return await handleWithResponsesApi(c, anthropicPayload, {
3532
+ if (shouldUseResponsesApi(selectedModel)) return await messagesFlowHandlers.handleWithResponsesApi(c, anthropicPayload, {
3504
3533
  subagentMarker,
3505
3534
  selectedModel,
3506
3535
  requestId,
@@ -3508,7 +3537,7 @@ async function handleCompletion(c) {
3508
3537
  compactType,
3509
3538
  logger: logger$5
3510
3539
  });
3511
- return await handleWithChatCompletions(c, anthropicPayload, {
3540
+ return await messagesFlowHandlers.handleWithChatCompletions(c, anthropicPayload, {
3512
3541
  subagentMarker,
3513
3542
  requestId,
3514
3543
  sessionId,
@@ -4310,4 +4339,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
4310
4339
 
4311
4340
  //#endregion
4312
4341
  export { server };
4313
- //# sourceMappingURL=server-D4FT8suK.js.map
4342
+ //# sourceMappingURL=server-BG69Fgym.js.map