Appearance
本页介绍 OpenClaw 的上下文压缩(Compaction)机制:当对话历史接近模型 context 窗口上限时,自动将旧消息摘要化以便继续对话。覆盖自动压缩触发条件、手动 /compact 命令、使用独立模型压缩的配置、与 Session Pruning 的区别,以及常见排查思路。
上下文压缩(Compaction)
每个模型都有上下文窗口——它能一次性处理的最大 token 数量。当对话接近上限时,OpenClaw 会自动将旧消息压缩(compact)成摘要,让对话得以继续。
工作原理
- 将较早的对话轮次摘要化为一条压缩条目
- 摘要保存到会话记录中
- 保留最近几轮消息的完整内容
当 OpenClaw 切分历史进行压缩时,会确保 assistant 工具调用和对应的 toolResult 保持配对。如果切分点落在工具调用块中间,OpenClaw 会移动边界以保持配对完整,同时保留当前未摘要的尾部内容。
完整对话历史始终保存在磁盘上。压缩只改变下一轮模型看到的内容,不删除任何记录。
自动压缩
自动压缩默认开启。触发条件:
- 会话接近 context 窗口上限
- 模型返回 context 溢出错误(此时 OpenClaw 自动压缩后重试)
常见溢出信号:request_too_large、context length exceeded、input exceeds the maximum number of tokens、input token count exceeds the maximum number of input tokens、input is too long for the model、ollama error: context length exceeded
压缩前,OpenClaw 会自动提醒 agent 将重要笔记保存到 memory 文件,防止上下文信息丢失。
手动压缩
在对话中输入 /compact 强制触发。可以添加指令引导摘要方向:
/compact 重点保留 API 设计相关决策使用不同模型压缩
默认使用 agent 的主模型做压缩。可以指定更强的模型获得更好的摘要:
json5
{
agents: {
defaults: {
compaction: {
model: "openrouter/anthropic/claude-sonnet-4-6",
},
},
},
}压缩开始通知
默认压缩静默运行。启用 notifyUser 后,每次压缩开始时会显示简短提示:
json5
{
agents: {
defaults: {
compaction: {
notifyUser: true,
},
},
},
}Compaction 与 Session Pruning 的区别
| Compaction | Session Pruning | |
|---|---|---|
| 作用 | 摘要化旧对话内容 | 裁剪旧工具输出 |
| 是否持久化 | 是(保存到会话记录) | 否(仅内存,单次请求级别) |
| 范围 | 整个对话历史 | 仅工具调用结果 |
Session Pruning 是更轻量的补充方案,裁剪工具输出而不摘要对话内容。
排查
压缩太频繁? 模型 context 窗口可能较小,或工具输出较大。建议启用 Session Pruning 减少工具结果占用。
压缩后上下文感觉丢失了? 使用 /compact 重点保留 <主题> 引导摘要方向,或启用 memory flush 让重要笔记在压缩中存活。
需要完全重置对话? /new 开启新会话,不触发压缩。
高级配置(保留 token 数、标识符保留、自定义 context 引擎、OpenAI 服务端压缩)请参考 Session Management Deep Dive。
相关
- Session:会话管理与生命周期
- Session Pruning:裁剪工具输出
- Hooks:压缩生命周期 hook(before_compaction、after_compaction)
常见问题
Q: 压缩后之前讨论的功能细节消失了,如何保留?
A: 压缩前先将关键决策记录到 memory 文件(直接告诉 agent"请把 XX 保存到 memory"),或用 /compact 重点保留 <主题> 引导摘要重点。
Q: 能禁用自动压缩吗?
A: 目前没有直接禁用选项,但可以通过设置较大的 context reserve token 数来推迟压缩触发。建议配合 Session Pruning 降低压缩频率。
Q: 手动 /compact 和自动压缩的摘要质量有区别吗?
A: 手动 /compact <指令> 可以指定保留重点,通常质量更高。自动压缩没有引导,依赖模型自行判断摘要重点。