billion-context 0.1.97-pr.666.481 → 0.1.97-pr.667.482

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/index.js CHANGED
@@ -48726,6 +48726,7 @@ function mergeCompress(global2, provider, model) {
48726
48726
  const promptLevels = [global2?.prompts, provider?.prompts, model?.prompts].filter(Boolean);
48727
48727
  const rangeOf = (s3) => s3?.minCompressRangeChars ?? s3?.minCompressRange;
48728
48728
  const absorbLevels = [global2?.absorb, provider?.absorb, model?.absorb].filter(Boolean);
48729
+ const reasoningLevels = [global2?.reasoning, provider?.reasoning, model?.reasoning].filter(Boolean);
48729
48730
  return {
48730
48731
  modelContextLimit: pick("modelContextLimit"),
48731
48732
  maxContextLimit: pick("maxContextLimit"),
@@ -48739,7 +48740,11 @@ function mergeCompress(global2, provider, model) {
48739
48740
  acknowledgePromptsRisk: pick("acknowledgePromptsRisk"),
48740
48741
  absorb: absorbLevels.length > 0 ? Object.assign({}, ...absorbLevels) : void 0,
48741
48742
  stripImages: pick("stripImages"),
48742
- stripImagesKeepRecent: pick("stripImagesKeepRecent")
48743
+ stripImagesKeepRecent: pick("stripImagesKeepRecent"),
48744
+ // `reasoning` is a third nested-object field merged sub-field-wise
48745
+ // exactly like `absorb`/`prompts`: a model-level `threshold` must not
48746
+ // discard a provider-level `drop: false`.
48747
+ reasoning: reasoningLevels.length > 0 ? Object.assign({}, ...reasoningLevels) : void 0
48743
48748
  };
48744
48749
  }
48745
48750
  function resolveCompress(routes, upstreamUrl, model, global2) {
@@ -48819,6 +48824,49 @@ function resolveRequestConfig(base, routes, embeddedUrl, model, native, globalCo
48819
48824
  return applyCompressSettings(base, limit, compress);
48820
48825
  }
48821
48826
 
48827
+ // src/reasoning-drop.ts
48828
+ var DEFAULT_COMPRESS_REASONING = { drop: true, threshold: 2048 };
48829
+ function resolveReasoningDrop(cfg) {
48830
+ let threshold = DEFAULT_COMPRESS_REASONING.threshold;
48831
+ if (cfg?.threshold !== void 0) {
48832
+ const t = cfg.threshold;
48833
+ if (typeof t === "number" && Number.isFinite(t) && t >= 0) {
48834
+ threshold = Math.floor(t);
48835
+ }
48836
+ }
48837
+ return { drop: cfg?.drop !== false, threshold };
48838
+ }
48839
+ function dropCompressReasoning(messages, cfg) {
48840
+ const { drop, threshold } = resolveReasoningDrop(cfg);
48841
+ if (!drop || messages.length === 0) return messages;
48842
+ try {
48843
+ let lastUser = -1;
48844
+ for (let i = 0; i < messages.length; i++) {
48845
+ const m2 = messages[i];
48846
+ if (m2.role === "user" && m2.contentType === "text") lastUser = i;
48847
+ }
48848
+ if (lastUser < 0) return messages;
48849
+ const dropIdx = /* @__PURE__ */ new Set();
48850
+ for (let i = 0; i < lastUser; i++) {
48851
+ const m2 = messages[i];
48852
+ if (m2.contentType !== "tool-call" || m2.toolName !== "compress") continue;
48853
+ let total = 0;
48854
+ let j2 = i - 1;
48855
+ while (j2 >= 0 && messages[j2].contentType === "reasoning") {
48856
+ total += (messages[j2].text ?? "").length;
48857
+ j2--;
48858
+ }
48859
+ if (total > threshold) {
48860
+ for (let k2 = j2 + 1; k2 < i; k2++) dropIdx.add(k2);
48861
+ }
48862
+ }
48863
+ if (dropIdx.size === 0) return messages;
48864
+ return messages.filter((_2, idx) => !dropIdx.has(idx));
48865
+ } catch {
48866
+ return messages;
48867
+ }
48868
+ }
48869
+
48822
48870
  // src/strip-images.ts
48823
48871
  var DEFAULT_STRIP_IMAGES_KEEP_RECENT = 5;
48824
48872
  var IMAGE_PLACEHOLDER = "[image]";
@@ -59214,13 +59262,14 @@ ${bodyBuffer.toString("utf8")}`);
59214
59262
  await withSessionLock(session, async () => {
59215
59263
  const runPrepare = () => {
59216
59264
  const cs2 = resolveCompress(opts.routes, route?.rewrittenUrl, parsed.model, opts.compress);
59265
+ const reasoningCfg = cs2.reasoning;
59217
59266
  const keepRecent = cs2.stripImagesKeepRecent ?? DEFAULT_STRIP_IMAGES_KEEP_RECENT;
59218
59267
  const stripped = cs2.stripImages ? stripHistoricalImages(parsed, protocol, keepRecent) : { body: parsed, removed: 0 };
59219
59268
  if (opts.debug && stripped.removed > 0) {
59220
59269
  log2("info", `[debug] strip-images: dropped ${stripped.removed} historical image part(s), kept last ${keepRecent} (session=${session.id})`);
59221
59270
  }
59222
59271
  const work = stripped.body;
59223
- return countTokens ? prepareCountTokens(work, core, reqConfig, log2, session) : protocol === "anthropic" ? prepareAnthropic(work, req, opts, core, reqConfig, reqPrompts, log2, session, pluginMode) : protocol === "openai" ? prepareOpenai(work, req, opts, core, reqConfig, reqPrompts, log2, session, pluginMode, nativeWindow) : responsesCompact ? prepareResponsesCompact(stripped.removed > 0 ? Buffer.from(JSON.stringify(work)) : bodyBuffer, work, session, req, core, reqConfig, log2) : prepareResponses(work, req, opts, core, reqConfig, reqPrompts, log2, session, responsesIdentity, pluginMode, upstreamOrigin, nativeWindow);
59272
+ return countTokens ? prepareCountTokens(work, core, reqConfig, log2, session) : protocol === "anthropic" ? prepareAnthropic(work, req, opts, core, reqConfig, reqPrompts, log2, session, pluginMode, reasoningCfg) : protocol === "openai" ? prepareOpenai(work, req, opts, core, reqConfig, reqPrompts, log2, session, pluginMode, nativeWindow, reasoningCfg) : responsesCompact ? prepareResponsesCompact(stripped.removed > 0 ? Buffer.from(JSON.stringify(work)) : bodyBuffer, work, session, req, core, reqConfig, log2) : prepareResponses(work, req, opts, core, reqConfig, reqPrompts, log2, session, responsesIdentity, pluginMode, upstreamOrigin, nativeWindow, reasoningCfg);
59224
59273
  };
59225
59274
  const isCodexCompactTrigger = protocol === "responses" && !responsesCompact && isCodexClient(req.headers) && hasCompactionTrigger(parsed.input);
59226
59275
  if (isCodexCompactTrigger) {
@@ -59308,6 +59357,13 @@ ${bodyBuffer.toString("utf8")}`);
59308
59357
  }
59309
59358
  }
59310
59359
  var ACP_TAG_MARK = "<acp ";
59360
+ function withReasoningDrop(msgs, reasoning, log2, sessionId) {
59361
+ const out = dropCompressReasoning(msgs, reasoning);
59362
+ if (out.length !== msgs.length) {
59363
+ log2("info", `[${sessionId}] compress-reasoning: dropped ${msgs.length - out.length} reasoning message(s) from closed compress turns (#651)`);
59364
+ }
59365
+ return out;
59366
+ }
59311
59367
  function stripKernelSummaries(messages, state) {
59312
59368
  const carried = /* @__PURE__ */ new Set();
59313
59369
  for (const b2 of state.blocks) {
@@ -59409,12 +59465,13 @@ function effectiveTokenCount(session, msgs) {
59409
59465
  if (!session.metadata.anonymousPrefixAffinity) return 0;
59410
59466
  return estimateCoreMessagesUpper(msgs);
59411
59467
  }
59412
- function prepareAnthropic(parsed, req, opts, core, config, prompts, log2, session, pluginMode) {
59468
+ function prepareAnthropic(parsed, req, opts, core, config, prompts, log2, session, pluginMode, reasoning) {
59413
59469
  const sessionId = session.id;
59414
59470
  const stream2 = parsed.stream === true;
59415
59471
  ++session.stats.requests;
59416
59472
  session.hostCreditTokens = 0;
59417
59473
  const injectTools = opts.compress.injectTool && !pluginMode;
59474
+ const stripReasoning = (msgs) => withReasoningDrop(msgs, reasoning, log2, sessionId);
59418
59475
  if (isAutoModeClassifier(parsed)) {
59419
59476
  log2("info", `[${sessionId}] auto-mode classifier passthrough (skipping compress injection)`);
59420
59477
  return { body: JSON.stringify(parsed), session, processedMessages: [], originalMessages: [], anthropicSystem: parsed.system, protocol: "anthropic", stream: stream2, compressInjected: false, pluginMode, nudge: void 0, prompts };
@@ -59452,7 +59509,7 @@ function prepareAnthropic(parsed, req, opts, core, config, prompts, log2, sessio
59452
59509
  log2("info", diagTagSummary(turn.messages, sessionId, "text-only"));
59453
59510
  const willInjectNudge = opts.compress.injectNudge && !!turn.nudge && (turn.nudge.shouldInject || emergencyNudge(turn.nudge));
59454
59511
  log2("info", diagNudge(turn, sessionId, tokenCount, config.modelContextLimit, parsed.model, willInjectNudge));
59455
- processedMessages = stripKernelSummaries(turn.messages, turn.state);
59512
+ processedMessages = stripReasoning(stripKernelSummaries(turn.messages, turn.state));
59456
59513
  applyCompactionArchive(session, activeBefore, new Set(msgs.map((m2) => m2.id)), log2);
59457
59514
  reapOrphanBlocks(session, msgs, deactivateBlock);
59458
59515
  rebuiltMessages = coreToAnthropic(processedMessages, cacheControls);
@@ -59534,12 +59591,13 @@ function clampOutgoingOutput(rebuilt, field, ctx, sessionId, log2) {
59534
59591
  log2("info", `[${sessionId}] output budget clamped ${raw} -> ${capped} (input~${inputEstimate}, window=${ctx.nativeWindow}); prevents input+output overflow (#453)`);
59535
59592
  }
59536
59593
  }
59537
- function prepareOpenai(parsed, req, opts, core, config, prompts, log2, session, pluginMode, nativeWindow) {
59594
+ function prepareOpenai(parsed, req, opts, core, config, prompts, log2, session, pluginMode, nativeWindow, reasoning) {
59538
59595
  const sessionId = session.id;
59539
59596
  const stream2 = parsed.stream === true;
59540
59597
  ++session.stats.requests;
59541
59598
  session.hostCreditTokens = 0;
59542
59599
  let openaiSystemText = "";
59600
+ const stripReasoning = (msgs) => withReasoningDrop(msgs, reasoning, log2, sessionId);
59543
59601
  let openaiOutboundSystem;
59544
59602
  let processedMessages = [];
59545
59603
  let originalMessages = [];
@@ -59577,7 +59635,7 @@ function prepareOpenai(parsed, req, opts, core, config, prompts, log2, session,
59577
59635
  log2("info", diagTagSummary(turn.messages, sessionId, "text-only"));
59578
59636
  const willInjectNudge = opts.compress.injectNudge && !!turn.nudge && shouldInject && (turn.nudge.shouldInject || emergencyNudge(turn.nudge));
59579
59637
  log2("info", diagNudge(turn, sessionId, tokenCount, config.modelContextLimit, parsed.model, willInjectNudge));
59580
- processedMessages = stripKernelSummaries(turn.messages, turn.state);
59638
+ processedMessages = stripReasoning(stripKernelSummaries(turn.messages, turn.state));
59581
59639
  applyCompactionArchive(session, activeBefore, new Set(msgs.map((m2) => m2.id)), log2);
59582
59640
  reapOrphanBlocks(session, msgs, deactivateBlock);
59583
59641
  rebuiltMessages = systemToUser(coreToOpenai(processedMessages));
@@ -59617,11 +59675,12 @@ function prepareOpenai(parsed, req, opts, core, config, prompts, log2, session,
59617
59675
  markDirty(session);
59618
59676
  return { body: JSON.stringify(rebuilt), session, processedMessages, originalMessages, protocol: "openai", stream: stream2, compressInjected: injectTools, pluginMode, nudge, prompts, openaiSystemText, renderTags: "text-only" };
59619
59677
  }
59620
- function prepareResponses(parsed, req, opts, core, config, prompts, log2, session, identity, pluginMode, upstreamOrigin, nativeWindow) {
59678
+ function prepareResponses(parsed, req, opts, core, config, prompts, log2, session, identity, pluginMode, upstreamOrigin, nativeWindow, reasoning) {
59621
59679
  const sessionId = session.id;
59622
59680
  const stream2 = parsed.stream === true;
59623
59681
  ++session.stats.requests;
59624
59682
  session.hostCreditTokens = 0;
59683
+ const stripReasoning = (msgs) => withReasoningDrop(msgs, reasoning, log2, sessionId);
59625
59684
  if (reconcileNativeCompactionBoundary(session)) {
59626
59685
  log2("info", `[${sessionId}] reconciled ACP state after native Responses compact boundary`);
59627
59686
  }
@@ -59686,7 +59745,7 @@ function prepareResponses(parsed, req, opts, core, config, prompts, log2, sessio
59686
59745
  log2("info", diagTagSummary(turn.messages, sessionId, "text-only"));
59687
59746
  const willInjectNudge = opts.compress.injectNudge && !!turn.nudge && shouldInject && !isCompactionTrigger && (turn.nudge.shouldInject || emergencyNudge(turn.nudge));
59688
59747
  log2("info", diagNudge(turn, sessionId, tokenCount, config.modelContextLimit, parsed.model, willInjectNudge));
59689
- processedMessages = repairResponsesAssistantOrdering(stripKernelSummaries(turn.messages, turn.state), originalMessages);
59748
+ processedMessages = repairResponsesAssistantOrdering(stripReasoning(stripKernelSummaries(turn.messages, turn.state)), originalMessages);
59690
59749
  reapOrphanBlocks(session, msgs, deactivateBlock);
59691
59750
  rebuiltInput = patchResponsesInput(projection, processedMessages);
59692
59751
  const forgedSummaries = echoReplaced ? [] : session.metadata.codexForgedSummaries ?? [];