长时间运行的 OpenClaw 会话,上下文窗口会被大量工具调用输出(exec 结果、文件读取、搜索结果)不断撑大。官方提供了两种互补的应对机制——Session Pruning(会话修剪) 和Compaction(压缩),本文基于官方文档理清两者的区别和配合方式。
Session Pruning 是什么
Session Pruning 在每次调用 LLM 之前,从上下文中修剪掉
"旧的工具调用结果"——用来减少 exec 结果、文件读取、
搜索结果等累积输出造成的上下文膨胀,且完全不触碰
你的对话消息本身
一个关键前提要理解——修剪只发生在内存中,不会修改磁盘上的会话记录。你的完整历史始终被保留,修剪只影响"这一次发给模型的内容"。
为什么这件事重要
长会话累积的工具输出会撑大上下文窗口,这既增加成本,也可能迫使 Compaction(压缩)比原本需要的时机更早触发。对于 Anthropic 提示缓存,Pruning 的价值尤其明显——缓存 TTL 过期后,下一次请求要重新缓存完整提示,而 Pruning 减小了这次"重新缓存写入"的体积,直接降低成本。
具体的修剪流程
1. 等待缓存 TTL 过期(默认 5 分钟)
2. 找到旧的工具调用结果(用户和助手的对话消息永远不动)
3. 软修剪(Soft-trim):对超大结果保留头尾,中间插入 "..."
4. 硬清除(Hard-clear):其余的直接替换为占位符
5. 重置 TTL,让后续请求能复用刚刷新的缓存
智能默认值
OpenClaw 针对 Anthropic Profile 自动启用 Pruning:
Profile 类型 Pruning是否启用 心跳周期
OAuth 或 setup-token 登录 是 1小时
API key 登录 是 30分钟
如果你自己显式设置了这些值,OpenClaw 不会覆盖你的配置。对于非 Anthropic Provider,Pruning 默认是关闭的。
如何手动启用或关闭
{
agents: {
defaults: {
contextPruning: { mode: "cache-ttl", ttl: "5m" },
},
},
}// 关闭 Pruning
{
agents: {
defaults: {
contextPruning: { mode: "off" },
},
},
}Pruning vs Compaction:一张表看懂区别
维度 Pruning(修剪) Compaction(压缩)
做什么 修剪工具调用结果 总结整段对话
是否持久化 否(仅限单次请求) 是(写入会话记录)
作用范围 仅工具调用结果 整个对话
两者是互补关系而非替代关系——Pruning 让工具输出在两次Compaction 周期之间保持精简,Compaction 则负责在上下文真正快满时做一次性的整体总结。可以理解为 Pruning 是"日常轻量瘦身",Compaction 是"定期大扫除"。
实战建议
1. 使用 Anthropic 模型且走 OAuth/setup-token 登录的场景,
Pruning 已经默认开启,通常不需要额外配置
2. 使用非 Anthropic Provider 但同样面临长会话上下文膨胀问题,
考虑手动开启 contextPruning: cache-ttl
3. 排查"为什么这次请求缓存写入这么大"这类成本异常时,
先确认 Pruning 是否生效、TTL 设置是否合理
4. 不要指望 Pruning 能替代 Compaction——
前者不持久化、只管工具输出,真正的历史总结
还是要靠 Compaction 完成
总结
Session Pruning 和 Compaction 分工明确——Pruning 管"工具输出别越攒越大",Compaction 管"整个对话该总结了",两者配合才能让长时间运行的 Agent 会话既保持上下文精简,又不丢失完整历史记录。理解这个分工,是调优 OpenClaw 长会话成本和性能的基础一课。
来源:Session Pruning — OpenClaw 官方文档