和 Claude Code 对齐,分两类:
常规操作(每轮 LLM 调用前都做,和上下文长度无关):Budget Reduction
级联压缩(按 Tier 1→2→3→4→5 顺序升级,成本低的先做,前一级不够才上后一级):
| 名称 | 做什么 | 触发条件 | 调 LLM | 破缓存 | 状态 | |
|---|---|---|---|---|---|---|
| 常规 | Budget Reduction | 截断超大单个输出 | 单个 tool_result > 4000 字符 | 否 | 否 | ✅ |
| Tier 1 | Microcompact | 旧工具输出清理 | 工具调用 ≥ 50 次(之后每 25 次)/ 空闲 90 分钟 | 否 | cache-aware 不破 | ✅ |
| Tier 2 | Snip | 删最旧几轮 | Tier 1 后仍超预算 | 否 | 是 | ✅ |
| Tier 3 | Context Collapse | 分段摘要 | Tier 2 后仍超,~90% | 是(每段一次) | 是 | ⏳ |
| Tier 4 | Auto-Compact | 全量摘要 | Tier 3 后仍超 / 用户 /compact | 是(一次) | 是 | ✅ |
| Tier 5 | Reactive | 紧急压缩 | API 返回 413 | 是 | 是 | ⏳ |
级联逻辑:每轮 LLM 调用前,从 Tier 1 开始检查。满足条件就执行,执行完重新检查是否还超。还超就进入下一个 Tier。
注:Tier 3 和 Tier 4 在 Claude Code 逆向分析中被描述为"overlapping strategies",不一定严格级联。/compact 手动命令直接触发 Tier 4,跳过 Tier 1-3。
Claude Code 是线性对话没有 DAG,不需要这一层。我们有函数调用节点(🟢),需要额外处理。
render_context 的 callers/subcalls/expose 控制和 Claude Code 一致。每轮 LLM 调用前都做,和上下文长度无关。
context/tool_aging/truncate.py: middle_truncate、context/tool_aging/policy.py: MAX_TOOL_RESULT_CHARS = 4000Budget Reduction 之后,按 Tier 顺序检查。前一级做完仍超阈值才上后一级。
和 Claude Code 一致。清理旧 🟡 工具输出。
cache_edits,beta header context-management-2025-06-27)服务端清除旧 tool_result。客户端消息不变,缓存不破。sentinel 做了字节级归一化(byte-stable),重复操作不改变已缓存内容context/microcompact.py、context/rules/microcompact.py和 Claude Code 一致。直接删最旧的几轮对话。不做摘要,不调 LLM。
context/snip.py和 Claude Code 一致。分段 LLM 摘要,原始消息保留(可回滚)。
和 Claude Code 一致。全量 LLM 摘要,替换所有旧消息。不可回滚。
/compact(直接跳到这里)/compact 或 /compact 保留数据库迁移的讨论。建议在 60% 时手动做context/engine.py: compact()API 返回 413(prompt too long)时的紧急压缩。每轮至多触发一次。都失败则终止。
每轮 LLM 调用前:
1. Budget Reduction → 截断超大工具输出(每轮都做)
2. 级联检查(按 Tier 顺序):
Tier 1: Microcompact 条件满足?→ 清旧工具输出
Tier 2: 仍超阈值?→ Snip 删旧轮
Tier 3: 仍超阈值?→ Context Collapse 分段摘要
Tier 4: 仍超阈值?→ Auto-Compact 全量摘要
3. 调 LLM
4. 如果 API 返回 413:
Tier 5: Reactive → 紧急压缩 → 重试
→ 失败则终止
场景:200K context,持续工作几小时,中间调用了 research_agent。
🔵 user → 🔵 assistant,Budget Reduction 检查工具输出,没超的跳过。级联都不触发。
工具调用超过 50 次。Microcompact cache-aware 首次触发,清理旧工具输出,释放约 15K tokens。之后每 25 次再清一轮。Tier 2-5 不触发。
函数运行中:内部 🟡 工具调用展开。Budget Reduction 截断超大输出。函数结束后 expose=io 隐藏内部子树,节点走常规级联。
Microcompact 做了还是超。Snip 删最旧 5 轮(包括已完成的函数节点),降到阈值以下。Tier 3-5 不触发。
反复 Snip 后可删的不多了。Context Collapse 分段摘要。还不够则 Auto-Compact 全量摘要。很少发生。
压缩后正常对话。再次超阈值时重复级联。大模型想查旧的函数内部过程,可以通过工具读取 DAG 子节点。
| 我们 | Claude Code | 说明 |
|---|---|---|
| §2 函数节点生命周期 | 无 | 我们独有(DAG + expose=io) |
| §3 Budget Reduction | Budget Reduction | 一致(4000 字符阈值,60/40 截断) |
| Tier 1 Microcompact | Tier 1 Microcompact | 一致。Anthropic provider 用 cache-aware path |
| Tier 2 Snip | Tier 2 Snip | 一致(整轮删) |
| Tier 3 Context Collapse | Tier 3 Context Collapse | 一致(分段摘要,可回滚) |
| Tier 4 Auto-Compact / /compact | Tier 4 Auto-Compact / /compact | 一致(全量摘要) |
| Tier 5 Reactive | Tier 5 Reactive | 一致(413 紧急压缩) |
来源:Claude Code 压缩参考(基于逆向分析,非官方文档)
| 步骤 | 做什么 | 状态 | 代码 |
|---|---|---|---|
| 1 | Budget Reduction — 截断超大输出(§3) | ✅ | context/tool_aging/truncate.py |
| 2 | Tier 1 Microcompact — 旧工具输出清理 | ✅ | context/microcompact.py |
| 3 | Tier 2 Snip — 删最旧几轮 | ✅ | context/snip.py |
| 4 | Tier 3 Context Collapse — 分段 LLM 摘要 | ⏳ | |
| 5 | Tier 4 Auto-Compact — 全量 LLM 摘要 | ✅ | context/engine.py |
| 6 | Tier 5 Reactive — 413 紧急压缩 | ⏳ | |
| 7 | /compact 命令 | ⏳ | |
| 8 | /context 命令(token 分布) | ✅ | _cli_chat/handlers.py |
| 9 | Anthropic Context Editing API 集成 | ⏳ |