Skip to main content

CONTEXT_COLLAPSE — 上下文折叠

Feature Flag: FEATURE_CONTEXT_COLLAPSE=1 子 Feature: FEATURE_HISTORY_SNIP=1 实现状态:核心逻辑全部 Stub,布线完整 引用数:CONTEXT_COLLAPSE 20 + HISTORY_SNIP 16 = 36

一、功能概述

CONTEXT_COLLAPSE 让模型内省上下文窗口使用情况,并智能压缩旧消息。当对话接近上下文限制时,自动将旧消息折叠为压缩摘要,保留关键信息的同时释放 token 空间。

子 Feature

Feature功能
CONTEXT_COLLAPSE上下文折叠引擎(后台 LLM 调用压缩旧消息)
HISTORY_SNIPSnipTool — 标记消息进行折叠/修剪

二、实现架构

2.1 模块状态

模块文件状态
折叠核心src/services/contextCollapse/index.tsStub — 接口完整(ContextCollapseStatsCollapseResultDrainResult),函数全部空操作
折叠操作src/services/contextCollapse/operations.tsStubprojectView 为恒等函数
折叠持久化src/services/contextCollapse/persist.tsStubrestoreFromEntries 为空操作
CtxInspectToolsrc/tools/CtxInspectTool/缺失 — 目录不存在
SnipTool 提示src/tools/SnipTool/prompt.tsStub — 空工具名
SnipTool 实现src/tools/SnipTool/SnipTool.ts缺失
force-snip 命令src/commands/force-snip.js缺失
折叠读取搜索src/utils/collapseReadSearch.ts完整 — Snip 作为静默吸收操作
QueryEngine 集成src/QueryEngine.ts布线 — 导入并使用 snip 投影
Token 警告 UIsrc/components/TokenWarning.tsx布线 — 折叠进度标签

2.2 核心接口(已定义,待实现)

// contextCollapse/index.ts
interface ContextCollapseStats {
  // 上下文使用统计
}
interface CollapseResult {
  // 折叠操作结果
}
interface DrainResult {
  // 紧急释放结果
}

// 关键函数(全部 stub):
isContextCollapseEnabled()          // → false
applyCollapsesIfNeeded(messages)    // 透传
recoverFromOverflow(messages)       // 透传(413 恢复)
initContextCollapse()               // 空操作

2.3 预期数据流

对话持续增长


上下文接近限制(由 query.ts 检测)

      ├── 溢出检测 (query.ts:440,616,802)


applyCollapsesIfNeeded(messages) [需要实现]

      ├── 后台 LLM 调用压缩旧消息
      ├── 保留关键信息(决策、文件路径、错误)
      └── 替换旧消息为压缩摘要

      ├── 413 恢复 (query.ts:1093,1179)
      │   └── recoverFromOverflow() 紧急折叠


projectView() 过滤折叠后的消息视图


模型继续工作(在压缩后的上下文中)

2.4 HISTORY_SNIP 子功能

SnipTool 提供手动折叠能力:
  • /force-snip 命令 — 强制执行折叠
  • SnipTool — 标记特定消息进行折叠/修剪
  • collapseReadSearch.ts 已完整实现,将 Snip 作为静默吸收操作处理

2.5 集成点

文件位置说明
src/query.ts18,440,616,802,1093,1179溢出检测、413 恢复、折叠应用
src/QueryEngine.ts124,127,1301Snip 投影使用
src/utils/analyzeContext.ts1122跳过保留缓冲区显示
src/utils/sessionRestore.ts127,494恢复折叠状态
src/services/compact/autoCompact.ts179,215自动压缩时考虑折叠

三、需要补全的内容

优先级模块工作量说明
1services/contextCollapse/index.ts折叠状态机、LLM 调用、消息压缩
2services/contextCollapse/operations.tsprojectView() 消息过滤
3services/contextCollapse/persist.tsrestoreFromEntries() 磁盘持久化
4tools/CtxInspectTool/上下文内省工具(token 计数、已折叠范围)
5tools/SnipTool/SnipTool.tsSnip 工具实现
6commands/force-snip.js/force-snip 命令

四、关键设计决策

  1. 后台 LLM 压缩:折叠不是简单截断,而是用 LLM 生成压缩摘要保留关键信息
  2. 413 恢复:当 API 返回 413(请求过大)时,紧急折叠是最重要的恢复手段
  3. 与 autoCompact 协作:折叠和自动压缩(compact)是不同的机制,折叠在消息级别,压缩在对话级别
  4. 持久化:折叠状态持久化到磁盘,会话恢复时重载

五、使用方式

# 启用 context collapse
FEATURE_CONTEXT_COLLAPSE=1 bun run dev

# 启用 snip 子功能
FEATURE_CONTEXT_COLLAPSE=1 FEATURE_HISTORY_SNIP=1 bun run dev

六、文件索引

文件职责
src/services/contextCollapse/index.ts折叠核心(stub,接口已定义)
src/services/contextCollapse/operations.ts投影操作(stub)
src/services/contextCollapse/persist.ts持久化(stub)
src/utils/collapseReadSearch.tsSnip 吸收操作(完整)
src/query.ts溢出检测和 413 恢复集成
src/QueryEngine.tsSnip 投影使用
src/components/TokenWarning.tsx折叠进度 UI