04.1 压缩管线
关注源码
src/services/compact/autoCompact.tssrc/services/compact/compact.tssrc/services/compact/postCompactCleanup.tssrc/services/compact/microCompact.ts
压缩解决的不是单一问题
这层同时要处理:
- 上下文窗口快满了怎么办
- API 已经报 prompt too long 怎么恢复
- 摘要后哪些信息要重新注入
- 如何尽量不打断 prompt cache
因此 compact 不是一个 summarize helper,而是 query loop 的恢复子系统。
触发机制
autoCompact.ts 负责阈值计算
它会根据:
- 当前模型 context window
- 输出 token 预留
- 自动压缩 buffer
- 用户 settings / env override
计算:
- warning threshold
- error threshold
- auto-compact threshold
- blocking limit
query.ts 在回合里消费这些阈值
一旦超过阈值,主循环可能:
- 主动触发 compact
- 进入 reactive compact 恢复
- 使用
max_output_tokens恢复逻辑
compact.ts 真正做了什么
1. 先清洗消息
在摘要前会移除或替换:
- 图片
- 文档
- 后续会重新注入的 attachment
这样总结模型的 token 更集中在真正需要保留的语义上。
2. 组织 compact prompt
compact.ts 会基于消息分组、文件状态、memory 状态等构造专门摘要 prompt,而不是直接把原消息扔给模型。
3. 生成 compact boundary
压缩结果会回到 transcript,形成明确的 compact 边界,这样后续逻辑知道“历史已被摘要化”。
4. 做 post-compact reinjection
压缩后会重新注入对后续轮次仍然重要的信息,例如:
- 部分文件附件
- 技能内容
- MCP instructions delta
- agent listing delta
microCompact 与完整 compact 的区别
完整 compact 是显式摘要历史。
microCompact 更像是对工具结果和缓存编辑做细粒度处理,目标是:
- 降低上下文膨胀
- 维持 prompt cache 可控
- 避免大 tool result 持续污染主上下文
设计上的关键点
1. 压缩系统与 query loop 强耦合
因为它不仅总结消息,还要恢复回合、维护边界、清理状态、重建上下文。
2. reinjection 是压缩质量的关键
真正影响后续效果的,不只是摘要文本,还包括压缩后重新送回模型的“关键工作集”。
3. 压缩和 prompt cache 是相互牵制的
压缩不可避免会打断缓存,但系统会尽量把打断控制在必要范围,并做 cache break telemetry。