SnipCompact与Microcompact解析
2026/4/27大约 3 分钟
SnipCompact与Microcompact解析
1. 结论先行
在当前 claude-code-rev 恢复版源码里:
snipCompact目前基本是空实现microcompact才是真正在工作的轻量上下文瘦身机制
它们在 query.ts 里的顺序是:
snipCompactmicrocompactcontextCollapseautocompact
2. SnipCompact 的实际状态
实现文件是:
src/services/compact/snipCompact.ts
当前文件里只有两个非常简单的导出:
snipCompactIfNeeded(...)isSnipBoundaryMessage()
其中:
snipCompactIfNeeded(...)直接返回原消息和changed: falseisSnipBoundaryMessage()恒为false
所以从“当前恢复版实际行为”出发,snipCompact 现在只是一个预留接口位。
它的意义主要在于:
- 在架构上占住“最早历史裁剪位点”
- 让
query.ts保留与上游设计一致的调用顺序
但在这份恢复树里,它并没有真正裁剪任何上下文。
3. Microcompact 的定位
实现文件是:
src/services/compact/microCompact.ts
microcompact 不是大摘要压缩,而是:
在不破坏整体会话语义的前提下,优先缩减旧工具结果带来的上下文成本。
它重点关注的不是 assistant 主文本,而是:
tool_result- 尤其是文件读写、Shell、搜索类工具留下的大输出
4. Microcompact 针对哪些工具
microCompact.ts 里定义了 COMPACTABLE_TOOLS。
主要包括:
- File Read / Write / Edit
- Shell 工具
- Grep / Glob
- Web Search / Web Fetch
这些工具有一个共同特点:
- 输出往往很长
- 对当下这轮有帮助
- 但在后续多轮对话里不一定还需要保留全文
5. Microcompact 的两条路径
microcompactMessages() 里有两条主要路径:
time-based microcompactcached microcompact
顺序是:
- 先检查 time-based trigger
- 若触发,则直接返回,不再进入 cached path
- 否则再尝试 cached microcompact
- 如果两者都不适用,就原样返回消息
6. Time-Based Microcompact
这一条路径的核心思想是:
如果距离上一次主循环 assistant 回复已经过去很久,说明服务端缓存大概率已经冷掉,那么旧工具结果继续保留全文就不划算了。
它会:
- 找出所有可压缩工具的
tool_use_id - 保留最近
N个 - 把更老的那些
tool_result.content直接替换成固定占位文案
固定占位文案是:
[Old tool result content cleared]
因此 time-based microcompact 的本质是:
直接改写本地消息内容,把旧工具结果清空成占位文本。
7. Cached Microcompact
这一条路径更高级。
它不直接改本地消息内容,而是:
- 记录哪些旧
tool_result应该从缓存前缀里删除 - 然后把删除指令延后到 API 层去注入
因此 cached microcompact 的重点不是“本地改内容”,而是:
让后续 API 请求在缓存层忽略某些旧工具结果。
8. 和 Autocompact 的区别
microcompact 与 autocompact 的区别非常大。
8.1 Microcompact
- 目标:轻量瘦身
- 主要手段:清旧工具结果
- 尽量不改整体对话结构
- 优先级比
autocompact更早
8.2 Autocompact
- 目标:真正解决上下文压力
- 主要手段:摘要化压缩
- 会把更大范围的历史转成 summary/attachment/hook 结果
- 成本更高,破坏性也更强
所以可以把两者理解成:
microcompact:先做“小修剪”autocompact:不够了再做“整段压缩”
9. 当前恢复版里最该如何理解它们
如果你沿着 query.ts 读:
snipCompact:暂时当成一个空占位位点microcompact:当成“真正已恢复出来的轻量工具结果压缩机制”
一句话总结:
当前恢复版里,snipCompact 更像架构占位,microcompact 才是实际生效的轻量上下文压缩层。