跑了一周 OpenClaw,账单吓了一跳。逐项排查后发现,默认配置下有大量 token 浪费在心跳、上下文回放和重复探索上。本文分享 6 项实测有效的配置优化,附具体参数。
钱花在哪了?先看 Token 消耗结构
OpenClaw 每次 API 调用的 token 消耗可以拆成四块:
总消耗 = 系统提示(bootstrap) + 历史消息(context replay) + 工具结果(tool outputs) + 模型输出(completion)用/context detail看一下实际数字(某次普通对话):
| 组成部分 | Token 数 | 占比 |
|---|---|---|
| Bootstrap(CLAUDE.md + skills + memory) | 35,000 | 28% |
| Context replay(历史消息回放) | 65,000 | 52% |
| 工具结果(web_fetch, read 等) | 18,000 | 15% |
| 模型输出 | 6,000 | 5% |
| 合计 | 124,000 | 100% |
52% 花在历史回放上——这是最大的浪费源。每一轮对话,OpenClaw 都要把之前所有对话记录重新发给模型。对话越长,这个数字越大。
优化一:设 contextTokens 上限
问题:不设上限 = 用满模型的完整上下文窗口。Claude Sonnet 的 200K 窗口意味着单次请求最多花 200K input tokens。
配置:
{"agents":{"defaults":{"contextTokens":100000}}}100K 覆盖 85-90% 的使用场景。超出后自动触发 compaction(上下文压缩),把旧消息总结成摘要。
效果:单次请求 input token 上限从 200K 降到 100K,长对话场景省 30-50%。
优化二:上下文裁剪 TTL 从 7 天改 6 小时
问题:默认cache-ttl: 7d意味着 7 天前的工具调用结果还在上下文里。一个web_fetch结果可能有 5000-10000 tokens,7 天下来累积惊人。
配置:
{"agents":{"defaults":{"contextPruning":{"mode":"cache-ttl","ttl":"6h","keepLastAssistants":3}}}}keepLastAssistants: 3保留最近 3 轮助手回复的完整内容,更早的工具结果在 6 小时后自动裁剪。
效果:长期运行的 session 中,context replay 部分减少 40-60%。
优化三:心跳用便宜模型 + 轻量上下文
OpenClaw 的心跳机制每隔几小时唤醒 agent 检查状态。默认用主模型(可能是 Claude Sonnet,$3/M input),而且注入完整的 bootstrap 文件。
问题:一次心跳 = 37,500 tokens(完整 bootstrap)× $3/M = $0.11。一天 6 次 = $0.66。一个月 = $20,就为了 “我还活着”。
配置:
{"agents":{"defaults":{"heartbeat":{"every":"4h","model":"google/gemini-2.5-flash-lite","lightContext":true}}}}model: 用最便宜的模型(Gemini Flash Lite 约 $0.10/M tokens)lightContext: true: 只注入 HEARTBEAT.md,跳过 AGENTS.md、SOUL.md 等大文件
效果:心跳 token 从 37,500 降到 ~3,000,模型单价从 $3 降到 $0.10。单次心跳成本从 $0.11 降到 $0.0003。
优化四:Compaction 用便宜模型
上下文压缩(compaction)是把长对话历史总结成摘要。这个任务不需要旗舰模型。
配置:
{"agents":{"defaults":{"compaction":{"mode":"safeguard","model":"minimax/MiniMax-M2.5"}}}}效果:每次 compaction 省下旗舰模型和便宜模型的差价。如果主模型是 Claude Sonnet($3/M),换成 MiniMax M2.5 后这部分成本降 80%+。
优化五:缩减 Bootstrap 文件大小
Bootstrap 文件(CLAUDE.md、skills、memory)在每一次API 调用中都会重新发送。1000 字符 ≈ 250 tokens,乘以每轮对话的调用次数,累积起来很可观。
配置:
{"agents":{"defaults":{"bootstrapMaxChars":10000,"bootstrapTotalMaxChars":75000}}}默认是 20000/150000,减半后覆盖率依然够用。
同时检查你的 skills 目录:
# 看哪些 skill 被加载了ls~/.openclaw/skills/# 禁用不常用的# openclaw.json → skills.entries.unused-skill.enabled = false每个 skill 至少增加 24 tokens 系统提示。10 个不用的 skill = 每次调用多花 240 tokens。
效果:每次 API 调用的 bootstrap 部分减少 30-50%。
优化六:降低图片分辨率
如果你的 agent 处理截图或图片,默认 1200px 分辨率会产生大量 vision tokens。
{"agents":{"defaults":{"imageMaxDimensionPx":800}}}效果:vision token 消耗按像素面积计算,800px vs 1200px 减少约 55%。
隐藏大招:用好记忆
以上都是"减少浪费"。还有一个"避免重复"的大招:让 agent 主动存记忆。
没有记忆:每次新 session → 重新读文件、搜代码、查网页 → 5000-20000 tokens 有记忆:直接调出上次的结论 → 500 tokensOpenClaw 的记忆是 workspace 下的 Markdown 文件:
~/.openclaw/memory/ ├── 2026-04-08.md # 每日日志(自动加载今天+昨天) └── MEMORY.md # 长期记忆(手动维护)配合 compaction memoryFlush(session 接近压缩时自动提醒 agent 存记忆):
{"compaction":{"memoryFlush":{"enabled":true,"softThresholdTokens":4000,"prompt":"Write any lasting notes; reply with NO_REPLY if nothing to store.","systemPrompt":"Session nearing compaction. Store durable memories now."}}}记忆的 ROI:花 500 tokens 存一条记忆 → 省掉未来 10 次 session 的重复探索(每次 5000+ tokens)。
完整配置一览
把上面 6 项合在一起,放到openclaw.json的agents.defaults里:
{"agents":{"defaults":{"contextTokens":100000,"bootstrapMaxChars":10000,"bootstrapTotalMaxChars":75000,"imageMaxDimensionPx":800,"contextPruning":{"mode":"cache-ttl","ttl":"6h","keepLastAssistants":3},"compaction":{"mode":"safeguard","model":"your-cheap-model-here","memoryFlush":{"enabled":true,"softThresholdTokens":4000}},"heartbeat":{"every":"4h","model":"your-cheapest-model-here","lightContext":true}}}}实测效果
| 指标 | 优化前 | 优化后 | 变化 |
|---|---|---|---|
| 单次请求平均 input tokens | ~124K | ~72K | -42% |
| 心跳单次成本 | $0.11 | $0.0003 | -99.7% |
| Compaction 单次成本 | $0.45 | $0.05 | -89% |
| 日均总 token 消耗 | ~2.8M | ~1.6M | -43% |
省下来的钱可以用来接入更多模型、跑更多 agent,或者单纯地降低账单。
模型选择也是成本杠杆
上面都是配置层面的优化。如果你同时需要接入多个模型(比如便宜模型跑心跳、中档模型跑日常、旗舰模型跑复杂任务),手动管理多个 API Key 和计费很麻烦。
笔者用的方案是统一 API 网关——一个 key 调所有模型,按需切换,计费统一。具体来说用的是 TheRouter,支持 30+ 模型的统一路由,国内直连。
TheRouter (therouter.ai) — 多模型统一 API 网关,一个 Key 调用 30+ 模型