@jeffreycao/copilot-api 1.9.7 → 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/README.md CHANGED
@@ -328,7 +328,7 @@ The following command line options are available for the `start` command:
328
328
  "glm-5.1": {
329
329
  "temperature": 0.7,
330
330
  "topP": 0.95,
331
- "contextCache": false,
331
+ "contextCache": true,
332
332
  "extraBody": {
333
333
  "preserve_thinking": true
334
334
  }
package/README.zh-CN.md CHANGED
@@ -332,7 +332,7 @@ Copilot API 现在使用子命令结构,主要命令包括:
332
332
  "glm-5.1": {
333
333
  "temperature": 0.7,
334
334
  "topP": 0.95,
335
- "contextCache": false,
335
+ "contextCache": true,
336
336
  "extraBody": {
337
337
  "preserve_thinking": true
338
338
  }
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-BgL68ZLT.js");
47
+ const { start } = await import("./start-CpqH2Ekm.js");
48
48
  const main = defineCommand({
49
49
  meta: {
50
50
  name: "copilot-api",
@@ -1496,6 +1496,7 @@ function mapContent(content, options = {}) {
1496
1496
  });
1497
1497
  break;
1498
1498
  }
1499
+ if (contentParts.length === 0) return "";
1499
1500
  return contentParts;
1500
1501
  }
1501
1502
  function createDocumentTextPart() {
@@ -3226,9 +3227,13 @@ function closeThinkingBlockIfOpen(state$1, events$1) {
3226
3227
 
3227
3228
  //#endregion
3228
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" };
3229
3233
  const handleWithChatCompletions = async (c, anthropicPayload, options) => {
3230
3234
  const { logger: logger$7, subagentMarker, requestId, sessionId, compactType } = options;
3231
3235
  const openAIPayload = translateToOpenAI(anthropicPayload);
3236
+ prepareCopilotChatCompletionsPayload(openAIPayload);
3232
3237
  const recordUsage = createCopilotUsageRecorder({
3233
3238
  endpoint: "chat_completions",
3234
3239
  fallbackSessionId: sessionId,
@@ -3400,6 +3405,26 @@ const handleWithMessagesApi = async (c, anthropicPayload, options) => {
3400
3405
  recordUsage(normalizeAnthropicUsage(response.usage));
3401
3406
  return c.json(response);
3402
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)];
3403
3428
  const isNonStreaming = (response) => Object.hasOwn(response, "choices");
3404
3429
  const isAsyncIterable$1 = (value) => Boolean(value) && typeof value[Symbol.asyncIterator] === "function";
3405
3430
  const createCopilotUsageRecorder = (options) => createCopilotTokenUsageRecorder({
@@ -3468,6 +3493,11 @@ const parseSubagentMarkerFromSystemReminder = (text) => {
3468
3493
  //#endregion
3469
3494
  //#region src/routes/messages/handler.ts
3470
3495
  const logger$5 = createHandlerLogger("messages-handler");
3496
+ const messagesFlowHandlers = {
3497
+ handleWithChatCompletions,
3498
+ handleWithMessagesApi,
3499
+ handleWithResponsesApi
3500
+ };
3471
3501
  async function handleCompletion(c) {
3472
3502
  await checkRateLimit(state);
3473
3503
  const anthropicPayload = await c.req.json();
@@ -3490,7 +3520,7 @@ async function handleCompletion(c) {
3490
3520
  if (state.manualApprove) await awaitApproval();
3491
3521
  const selectedModel = findEndpointModel(anthropicPayload.model);
3492
3522
  anthropicPayload.model = selectedModel?.id ?? anthropicPayload.model;
3493
- if (shouldUseMessagesApi(selectedModel)) return await handleWithMessagesApi(c, anthropicPayload, {
3523
+ if (shouldUseMessagesApi(selectedModel)) return await messagesFlowHandlers.handleWithMessagesApi(c, anthropicPayload, {
3494
3524
  anthropicBetaHeader: anthropicBeta,
3495
3525
  subagentMarker,
3496
3526
  selectedModel,
@@ -3499,7 +3529,7 @@ async function handleCompletion(c) {
3499
3529
  compactType,
3500
3530
  logger: logger$5
3501
3531
  });
3502
- if (shouldUseResponsesApi(selectedModel)) return await handleWithResponsesApi(c, anthropicPayload, {
3532
+ if (shouldUseResponsesApi(selectedModel)) return await messagesFlowHandlers.handleWithResponsesApi(c, anthropicPayload, {
3503
3533
  subagentMarker,
3504
3534
  selectedModel,
3505
3535
  requestId,
@@ -3507,7 +3537,7 @@ async function handleCompletion(c) {
3507
3537
  compactType,
3508
3538
  logger: logger$5
3509
3539
  });
3510
- return await handleWithChatCompletions(c, anthropicPayload, {
3540
+ return await messagesFlowHandlers.handleWithChatCompletions(c, anthropicPayload, {
3511
3541
  subagentMarker,
3512
3542
  requestId,
3513
3543
  sessionId,
@@ -4309,4 +4339,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
4309
4339
 
4310
4340
  //#endregion
4311
4341
  export { server };
4312
- //# sourceMappingURL=server-Bpu_LXg5.js.map
4342
+ //# sourceMappingURL=server-BG69Fgym.js.map