1. 为什么 OpenClaw 长会话会变成“养龙虾”
如果你用 OpenClaw 跑过整夜任务,大概率见过这种场面:早上打开会话记录,发现一个持续对话消耗了几十万甚至上百万 token,账单像龙虾苗一样哗哗往外跑。问题往往不在模型本身,而在于长会话把历史消息、工具返回、中间推理全部塞进上下文,每一轮都在重复计费。
OpenClaw 的上下文管理有几个关键点:compaction决定历史怎么压缩,maxMessages决定保留多少条最近消息,SOUL.md决定模型回答风格,session.maxHistoryMessages决定会话层保留上限。这几个参数如果全用默认值,长任务就会不断累积无效上下文。下面这 3 个配置,是我实测下来最能压住 token 消耗的组合,配合 TaoToken 统一 Key 和 API 通道,改完就能直接验证效果。
TaoToken 在这里的角色是统一入口:你不需要为每个模型单独维护一套 Key,也不用在多个 base_url 之间来回切换。OpenClaw 的openclaw.json里把 provider 指向 TaoToken 的 API 地址,后面所有 agent 共用同一个通道,排查 token 消耗时也更容易定位是哪个 agent 在烧。
2. TaoToken 前置:统一 Key 与 API 通道
在改 OpenClaw 配置之前,先把模型通道固定下来。TaoToken 的 API 地址是https://taotoken.net/api,控制台里可以创建 API Keys,文档里有各语言接入示例。OpenClaw 支持自定义 provider,所以你可以把模型统一指向 TaoToken,而不是每个 agent 写一个不同的第三方地址。
操作顺序建议这样:先到控制台创建 Key,再打开接入文档确认 OpenClaw 对应的 provider 写法,最后回到openclaw.json改model.primary。这样做的原因是,后面 compaction 和 session 的省 token 效果,需要在一个稳定的通道上对比,否则你分不清是压缩生效了,还是换了模型导致消耗变化。
提示:TaoToken 的模型对话页面可以用来单独验证某个模型是否正常返回,避免把通道问题和 OpenClaw 配置问题混在一起排查。
创建 Key 的入口在控制台的 API Keys 页面,接入文档里有 OpenClaw 的配置片段。把 Key 填进 OpenClaw 的 provider 配置后,先跑一条最短的测试消息,确认返回正常,再进入下一步的压缩配置。
3. 可复制配置:compaction、adaptive 与 SOUL.md
3.1 compaction 的 adaptive 模式怎么填
OpenClaw 的压缩配置放在agents下面。你可以选择全局启用,也可以只给某个 agent 单独开。全局启用写在agents.defaults里,单个 agent 启用写在agents.list对应对象里。下面这份是全局骨架,mode用adaptive,maxMessages先给 20:
{ "agents": { "defaults": { "model": { "primary": "taotoken/deepseek-chat" }, "workspace": "/root/.openclaw/workspace", "compaction": { "mode": "adaptive", "maxMessages": 20, "summaryPrompt": "请用一句话简洁总结以上对话的核心内容" } }, "list": [] } }mode有三个值:safeguard是默认值,只有上下文接近模型上限才触发压缩;adaptive会主动按maxMessages压缩历史,省 token 更激进;none是关闭压缩。长会话场景建议用adaptive,因为默认的safeguard往往等到上下文快满了才动手,中间那些轮次已经白烧了。
maxMessages是保留最近消息的条数,超出部分会被压缩或丢弃。summaryPrompt可以自定义,但要注意:如果提示词本身太长,反而会增加 token。上面这句一句话总结已经够用。thresholdTokens只在safeguard模式下有效,adaptive下不用管。
3.2 SOUL.md 里加回答准则
SOUL.md控制 agent 的回答风格。默认风格往往偏解释型,长会话里每一轮都多写几百字,累积起来就是一笔开销。在SOUL.md里加一段回答准则,明确要求简洁:
## 回答准则 - 极简原则:在满足用户需求的前提下,回答尽可能简短,避免修饰和重复。 - 禁止废话:不要解释原理,除非用户明确要求;不要罗列多种方案,除非用户需要对比。 - 字数限制:普通问题回复不超过 100 字,复杂问题不超过 300 字。这段准则的作用是让模型在生成阶段就少输出,而不是等生成完再压缩。生成阶段的 token 是实打实计费的,所以SOUL.md的收益比很多人想的大。实测下来,同一个任务加上这段准则后,单轮回复长度能降一半左右。
3.3 session 层限制历史长度
除了 agent 层的 compaction,session 层还有一个maxHistoryMessages,控制每个会话最多保留多少条消息:
{ "session": { "maxHistoryMessages": 20 } }这个参数和compaction.maxMessages的区别是:session层更靠前,超出部分直接丢弃或压缩,适合简单、独立的问答场景;compaction层更智能,会走总结流程。两个可以同时开,但要注意别把maxHistoryMessages设得比compaction.maxMessages还小,否则压缩还没触发,历史已经被 session 层砍掉了。
注意:压缩和截断都会丢失历史细节,多轮连贯任务里
maxMessages不要设得太低,20 到 30 是比较稳的区间。
4. 验证请求与成功结果
改完配置后,不要直接跑长任务,先用一条短请求验证通道和压缩是否生效。在 OpenClaw 里发一条测试消息,观察返回是否正常。然后跑一个多轮对话,比如连续问 5 个相关问题,看会话记录里的 token 消耗曲线。
验证 compaction 是否生效,可以看 OpenClaw 的日志里有没有压缩触发记录。adaptive模式下,超过maxMessages后应该能看到总结行为。如果日志里一直没有压缩记录,检查mode是不是写成了safeguard,或者maxMessages设得太大。
验证 TaoToken 通道是否正常,可以用模型对话页面单独发一条请求,确认返回内容和 OpenClaw 里一致。如果 OpenClaw 报 provider 错误,先检查model.primary的写法是否和接入文档一致,再检查 Key 是否填对。
成功的结果是:多轮对话后,token 消耗增长明显放缓,单轮回复长度下降,会话记录里能看到压缩总结。如果消耗没降,先看SOUL.md是否被正确加载,再看compaction是否真的触发。
5. 本篇常见错排查
报错一:compaction 配置不生效。最常见的原因是mode写成了safeguard,这个模式只在接近模型上限时才触发,短会话里看不到效果。改成adaptive后重新跑多轮对话。
报错二:SOUL.md 改了但回答还是啰嗦。检查SOUL.md的路径是否和 agent 的workspace对应。每个 agent 有自己的 workspace,全局SOUL.md和单个 agent 的SOUL.md可能不是同一个文件。
报错三:session 和 compaction 冲突。如果maxHistoryMessages小于compaction.maxMessages,历史会先被 session 层砍掉,压缩逻辑拿不到足够上下文。把maxHistoryMessages设得比compaction.maxMessages大一些。
报错四:TaoToken 通道返回 401。检查 API Key 是否填在正确的位置,以及model.primary的 provider 前缀是否和接入文档一致。Key 创建后要复制完整,不要漏字符。
报错五:压缩后对话不连贯。这是压缩的固有代价。如果任务需要强连贯性,把maxMessages调大,或者对关键 agent 单独关闭压缩,只对长任务 agent 开启。
6. 把省 token 配置固定成默认骨架
这套配置的核心思路是三层配合:SOUL.md管生成阶段的输出长度,compaction管历史阶段的上下文体积,session管会话层的硬上限。三层都开,长会话的 token 消耗能压到默认配置的几分之一。
如果你还在调 OpenClaw 的接入通道,建议先把 TaoToken 的 API Keys 和接入文档过一遍,把 provider 固定下来,再回头调压缩参数。通道稳定了,省 token 的效果才可对比、可复现。长期跑编码和 Agent 任务的话,Coding Plan 那边也有对应的配置说明,可以一起看。