04.1 压缩管线

关注源码

  • src/services/compact/autoCompact.ts
  • src/services/compact/compact.ts
  • src/services/compact/postCompactCleanup.ts
  • src/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。