1. 对话太长就崩?先搞懂 OpenClaw 的 Compaction 到底在压什么
如果你正在用 OpenClaw 搭 Agent,大概率遇到过这个报错:Context length exceeded。明明上一轮还能正常跑,多聊几句、多调几次工具,整个会话就直接卡死。这不是模型变笨了,而是上下文窗口被塞满了。
OpenClaw 的 Compaction(压缩)机制,就是专门解决这个问题的核心架构模块。它做的事情可以类比成「整理房间」:把冗长的对话历史、工具调用结果、中间推理过程,压缩成一份精简但保留关键信息的摘要,让 Agent 在有限的 Context Window 里继续工作。
这一篇聚焦三件事:Compaction 在什么条件下触发、执行流程长什么样、以及怎么用 TaoToken 统一 Key 把模型通道配好,让压缩动作真正跑起来。适合已经跑过 OpenClaw 基础会话、想深入核心架构的开发者。前置知识是 Session 管理和 Memory 系统,如果你还没看,建议先补一下,因为 Compaction 和它们是三位一体的关系。
我试过在一个长会话里连续调用十几次工具,Context 从 3 万 tokens 一路涨到 17 万,响应明显变慢,费用也在涨。配好 Compaction 之后,同样的会话被压到 4 万 tokens 左右,响应速度和成本都回来了。下面把配置和验证过程完整拆开。
2. 前置准备:用 TaoToken 统一 Key 打通模型通道
Compaction 本身是 OpenClaw 的内部机制,但它执行「摘要生成」这一步时,需要调用一个真实的模型。也就是说,你得先有一个可用的模型 API 通道,Compaction 才能工作。
TaoToken 在这里的角色是统一 Key 和 API 通道。你不需要为每个模型单独维护一套 Key,而是通过一个统一入口来管理。官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 端点是 https://taotoken.net/api 。
具体操作路径:
先去控制台创建一个 API Key,地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 。创建好之后,Key 的管理页面在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite ,你可以在这里查看、复制、轮换 Key。
如果你对模型对话本身还不熟,可以先在模型对话页面试一下通道是否通: https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有完整的参数说明。
这一步的核心目的:拿到一个可用的 Key 和 API 端点,后面写进 OpenClaw 的配置文件里,Compaction 触发时才能调用模型生成摘要。
3. 可复制配置:settings.json 与 config.toml 双文件骨架
OpenClaw 的配置分两层:settings.json管 Agent 行为,config.toml管模型通道。两个文件都要改,缺一个 Compaction 都跑不起来。
3.1 settings.json:Compaction 参数配置
{ "agents": { "defaults": { "compaction": { "mode": "safeguard", "threshold": "80%", "reserveTokens": "10000", "strategy": { "type": "hybrid", "preserveIntent": true, "preserveKeyInfo": true } } } } }逐项说明:
mode有三个值。auto是完全自动压缩,适合需要频繁压缩的高频会话;safeguard是只在接近溢出时才压,比较保守,推荐大多数场景用;manual是纯手动触发,适合你想精确控制压缩时机的调试场景。
threshold是触发阈值,80%表示 Context 使用量超过 80% 时开始压缩。这个值不要设太高,否则压缩还没完成就已经溢出了;也不要设太低,否则压缩太频繁,反而拖慢响应。
reserveTokens是压缩后保留的空间,10000表示留 10K tokens 的余量给后续对话。这个值根据你的会话长度调整,短会话可以设小一点。
strategy.type是压缩策略,hybrid是混合模式,会同时用摘要和剪枝;summarize只生成摘要;prune只删除不重要内容。preserveIntent和preserveKeyInfo控制是否保留用户意图和关键信息,建议都开。
3.2 config.toml:TaoToken 通道配置
[model] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "你的TaoToken Key" model_name = "你的模型名" [model.compaction] enabled = true summary_model = "你的模型名" max_summary_tokens = 2000这里的关键是base_url指向 TaoToken 的 API 端点,api_key填你在控制台创建的那个 Key。summary_model是 Compaction 生成摘要时用的模型,可以和主模型一致,也可以单独指定一个更便宜的模型来降成本。
max_summary_tokens控制摘要的最大长度,2000表示摘要不超过 2000 tokens。这个值太小会丢信息,太大会失去压缩意义,2000 到 4000 之间比较合适。
注意:两个文件里的模型名要对应上,否则 Compaction 调用时会报模型不存在的错误。
4. 验证请求:确认 Compaction 真的生效了
配置写完不代表生效,得实际跑一次验证。分三步走。
4.1 手动触发一次压缩
openclaw sessions compact <sessionId>把<sessionId>换成你当前会话的 ID。执行后如果返回压缩成功,说明配置被正确加载了。如果报错,先检查config.toml里的base_url和api_key是否写对。
4.2 查看压缩日志
openclaw logs | grep compaction这条命令会过滤出所有和 Compaction 相关的日志。正常输出里应该能看到类似这样的记录:
[compaction] session=abc123 before=180000 after=40000 strategy=hybrid [compaction] summary generated tokens=1850 model=xxxbefore和after分别是压缩前后的 token 数,strategy是实际使用的策略,summary generated表示摘要生成成功。如果只看到before没有after,说明压缩执行到一半失败了,大概率是模型通道的问题。
4.3 用模型对话验证通道
如果你不确定 TaoToken 通道本身是否正常,可以先去模型对话页面发一条测试消息: https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。能正常返回,说明 Key 和端点没问题,问题就出在 OpenClaw 的配置上。
4.4 观察压缩后的会话质量
压缩生效后,继续和 Agent 对话,观察它是否还记得之前的关键信息。比如你之前说过「我要蓝色的休闲风格衣服」,压缩后问它「我刚才说要什么来着」,如果它能答出来,说明preserveIntent和preserveKeyInfo起作用了。
5. 本篇常见错排查:Compaction 不生效的六种情况
5.1 报错Context length exceeded但没触发压缩
原因通常是threshold设得太高,比如设成了95%,压缩还没跑完就已经溢出了。把阈值调到80%或更低,给压缩留出执行时间。
5.2 压缩日志里只有 before 没有 after
说明摘要生成失败了。检查config.toml里的summary_model是否是一个真实可用的模型名,以及api_key是否有效。可以去 API Keys 页面确认 Key 状态: https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。
5.3 Agent 压缩后「失忆」
这是压缩过度导致的。检查reserveTokens是不是设得太小,或者max_summary_tokens太小导致摘要丢信息。把preserveIntent和preserveKeyInfo都设为true,并适当调大max_summary_tokens。
5.4 压缩太频繁,响应变慢
threshold设得太低,或者mode设成了auto。改成safeguard模式,把阈值调到80%左右。
5.5 配置文件改了但没生效
OpenClaw 不会热加载配置,改完settings.json和config.toml后需要重启会话或重新加载。另外确认你改的是正确的配置文件路径,有些环境会有多个配置目录。
5.6 手动压缩命令报 session 不存在
sessionId写错了,或者会话已经结束。用openclaw sessions list查看当前活跃的会话 ID。
提示:排障时优先看日志,
openclaw logs | grep compaction能覆盖大部分问题。如果日志里连 compaction 关键字都没有,说明配置根本没被加载。
6. 把 Compaction 接进你的日常开发流
Compaction 不是配完就完事的,它需要和 Session、Memory 配合使用。Session 管本次对话的存储,Memory 管长期记忆,Compaction 管上下文整理。三者配合好,Agent 才能在长会话里保持稳定。
如果你打算长期跑编码类 Agent,建议把 Compaction 和 Coding Plan 结合起来用: https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。Coding Plan 适合需要持续调用模型的场景,Compaction 帮你控制上下文成本,两者叠加能把长会话的费用压下来。
接入相关的完整参数和示例,可以对照接入文档再核一遍: https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。文档里有不同语言的调用示例,方便你直接复制到自己的项目里。
最后给一个实用建议:每次调整 Compaction 参数后,用openclaw logs | grep compaction对比一下压缩前后的 token 数。我自己的经验是,threshold从80%调到75%,压缩频率会明显上升,但单次压缩的摘要质量更稳定,因为留给摘要生成的空间更充裕。这个平衡点需要根据你的会话长度和模型能力自己试出来。