
OpenClaw 省 Token 实操手册:八个维度,节省 60–90%
技术博主 Federico Viticci 一个月烧掉 180 万 Token,账单 $3,600。GitHub Issue #23254 算得更细:一个默认配置的 Heartbeat,30 分钟一次,每天 38 次 API 调用,每次 8,000–15,000 Token,光 Heartbeat 一项每天就要 $10–20。
一位工程师追踪 API 日志后发现:90% 的 Token 花销与实际让 Agent 做的工作没有关系。三个配置改动,每周账单从 $50 压到不到 $10。
这篇文章基于官方文档、GitHub Issue #21999 / #22133 / #23254 / #30983 / #9742 / #30894 以及多位工程师的实测整理。每个技巧都标注来源。
目录
先搞清楚:钱烧在哪里
维度一:模型分级
维度二:配置文件瘦身
维度三:Skills 精简
维度四:会话管理
维度五:Heartbeat 和 Cron(含 Bug 警告)
维度六:多 Agent 体系的分级配置
维度七:Prompt Cache 最大化
维度八:工具调用与并发控制
消费保险 + 优先级速查表
先搞清楚:每次 API 调用你在为什么付钱
Token 消耗 ≠ 你说的话 + AI 回的话。GitHub Issue #21999(一份 150k+ Token 系统提示的完整拆解)给出了这张成本图:
| 配置文件注入(SOUL / AGENTS / USER / TOOLS + Skills 描述列表) | 最高优先级 | |
Issue #9157 的总结一针见血:“浪费了 93.5% 的 Token 预算”——大部分钱花在上下文注入和历史积累上,不在实际工作上。
先用这几条命令看清楚自己的情况,再针对性优化:
/status # 当前会话 Token 消耗和费用估算
/usage full # 每次回复后显示消耗明细
/context detail # 查各注入文件各占多少 Token
# 查看 session 文件大小,超过 500KB 需要警惕
du -h ~/.openclaw/agents/*/sessions/*.jsonl | sort -h维度一:模型分级 — 杠杆最高,立竿见影
Haiku 约是 Sonnet 的 1/5 价格,约是 Opus 的 1/25。用 Opus 回答”今天日历上有什么”,是在用外科手术刀切菜。
| Claude Haiku | ||
| Gemini 2.5 Flash | ||
| DeepSeek V4 |
{
"agents": {
"defaults": {
"model": {
"primary": "anthropic/claude-sonnet-4-6", // 日常默认主力
"fallbacks": ["anthropic/claude-haiku-3.5"]
},
"subagents": {
"model": "anthropic/claude-haiku-3.5" // 子 Agent 自动用便宜模型
}
}
}
}会话中途随时切换,不需要重启:
/model anthropic/claude-haiku-3.5 # 切到便宜模型
/model anthropic/claude-opus-4-6 # 切到旗舰两个特殊陷阱:
Gemini 2.5 Pro 是已知的 Token 黑洞,几十次调用烧掉 190 万 Token,务必用 Flash 替代。
Thinking / Reasoning 模式消耗暴增 10–50 倍,在 config 里明确关闭:"thinking": {"type": "disabled"}
维度二:配置文件瘦身 — 每次调用都在省
SOUL.md、AGENTS.md、USER.md、TOOLS.md 在每次 API 调用时全量注入,包括每次 Heartbeat 和 Cron。MEMORY.md 只在主会话加载,memory/ 子目录的日期文件通过 memory 工具显式调用才加载——这两类比较省,优先往那里写。
一个容易踩的坑:TOKEN-RULES.md 本身也在消耗 Token。如果你为每个 Agent 创建了独立的 TOKEN-RULES.md 放在 workspace 根目录下,它会和 SOUL.md 一起每次注入。建议把规则内容直接合并进 AGENTS.md——少一个文件,少一次文件元数据注入。或者用 $include 引用一份全局共享规则,七个 Agent 的共同规则只维护一份(官方文档支持 $include),各 Agent 的本地文件只保留差异部分。
频繁改配置文件会让 Prompt Cache 反复失效。每次改动后第一次调用要重新按全价写入缓存。把频繁变动的内容放进 memory/YYYY-MM-DD.md,核心配置文件保持少改。
# 让 OpenClaw 自己分析并执行优化
分析我当前的配置文件,找出哪些内容可以提取成按需加载的 Skill,
估算优化后能节省多少 Token,然后帮我执行维度三:Skills 精简 — 隐性成本,很多人不知道
官方 Skills 文档给出了精确公式:每个 Skill 每次调用的固定注入 = 97 字符 + 名称和描述的长度(字符数除以 4 约等于 Token 数)。一个描述 200 字符的 Skill,每次注入约 75 Token。好消息是 Skill 的完整指令内容只有 Agent 决定使用它时才加载(Tier 2),每次都注入的只是描述摘要(Tier 1)。
10 个 Skill 的描述注入约 400–500 Token,每天 100 次 Opus 调用 = 每月额外 $180。三个优化方法:
方法一:只保留真正常用的 Skills,移除不常用的。不是每个能用上的 Skill 都要挂在 Agent 上,按需手动调用一样生效。
方法二:用 disable-model-invocation 让 Skill 彻底不注入系统提示。官方支持这个字段,设为 true 后 Skill 从系统提示里消失,只能通过用户手动调用:
---
name: my-heavy-skill
description: 这个 skill 很少用,不要自动注入
disable-model-invocation: true
---方法三:精简 Skill 的描述字段。描述只写触发条件,完整说明放在 SKILL.md body 里——body 是 Tier 2,按需加载,不影响基础成本。
维度四:会话管理 — 堵住历史积累的黑洞
35 条消息的会话,session 文件已达 2.9MB(GitHub Issue #21999 实测)。历史积累最终可占 58% 的上下文窗口,每次调用都在拖着这个包袱。
/compact 前先切便宜模型
/compact 本身是一次完整 API 调用,用当前会话的模型做总结。用 Opus 的话 compact 本身就很贵。正确做法:
/model anthropic/claude-haiku-3.5 # 先切便宜模型
/compact # 用便宜模型做总结
/model anthropic/claude-sonnet-4-6 # 再切回主力softThresholdTokens + 每日重置:双保险
softThresholdTokens 是被动防御(达到阈值时写 memory 再刷新),每日重置是主动清零,两个一起用才稳:
{
"session": {
"softThresholdTokens": 40000,
"flushPrompt": "记录关键决策、状态变更和教训,跳过日常例行对话。若没有值得记录的内容,回复 NO_FLUSH。",
"reset": {
"mode": "daily",
"atHour": 4, // 凌晨 4 点自动重置,不影响白天使用
"idleMinutes": 120 // 或者闲置 2 小时后重置
}
}
}大输出任务用子 Agent 隔离
子 Agent 的中间输出不会进入主会话历史,只有最终结论返回。同时子 Agent 自动使用 promptMode: "minimal",不注入 Skills 和 Docs 区块,本身就比主会话省:
/subagents spawn main "扫描 ~/projects,列出超过 100MB 的文件"
/subagents spawn main "总结过去 24 小时 Discord 消息,给我关键要点"直接清理膨胀的 session 文件
du -h ~/.openclaw/agents/*/sessions/*.jsonl | sort -h
rm ~/.openclaw/agents/main/sessions/main.jsonl # 清理主会话(不影响配置文件里的长期记忆)维度五:Heartbeat 和 Cron — 含一个正在坑人的 Bug
Bug 警告(Issue #9742 / #13009 / #14279 / #21144 / #30894,跨越整个 2026 年 2–3 月):
heartbeat.model覆盖在当前版本不可靠——Heartbeat 实际运行时会忽略这个字段,使用agents.defaults.model的主模型。你以为在用 Haiku,实际没有。Issue #30894 的结论:绕过方案是把 Heartbeat 逻辑移到 Cron + isolated session,Cron 的 model override 是正常的。
除了 Bug,原生 Heartbeat 还有两个问题:实际触发频率比设置值高(设了 30 分钟,观测到 10–20 秒触发一次),每次携带全部会话上下文(170k–210k Token/次是真实观测值)。
推荐方案:关掉原生 Heartbeat,改用隔离 Cron
// 第一步:关掉原生 Heartbeat
{
"agents": {
"defaults": {
"heartbeat": { "every": "0m" }
}
}
}
// 第二步:改用隔离会话 + 便宜模型的 Cron 替代
openclaw cron add --every 55m --session isolated
--model google/gemini-2.5-flash-preview
"读取 HEARTBEAT.md;若一切正常回复 HEARTBEAT_OK,发现异常才通知我"Cron 的 sessionRetention — 磁盘清理的小事也别忘
每次 isolated 会话结束后文件默认保留,多个 Agent 跑时间长了会积累大量废弃文件拖慢 Gateway。加上这两行:
{
"cron": {
"sessionRetention": "24h", // 自动清理 24 小时前的 Cron session 文件
"runLog": { "maxBytes": "2mb", "keepLines": 2000 } // 限制日志大小
}
}多任务合并成一次 Cron 调用。5 个独立检查任务变 1 次批量调用,节省 75% 的上下文注入成本——工作量没变,API 调用次数变少了。
维度六:多 Agent 体系的分级配置 — 一刀切是浪费
如果你有多个 Agent,agents.defaults 的全局配置是底线,不是终点。不同 Agent 的工作性质差很大:sysmon 只需要看 10 条日志,agent-creator 在写代码时需要更大窗口,wechat-writer 需要保留更多写作上下文。全局 contextTokens: 50000 对监控类 Agent 是浪费,对开发类 Agent 又不够用。
官方文档确认 model、contextTokens、compaction 都可以在 agents.list[] 级别单独覆盖。按 Agent 类型分三档:
{
"agents": {
"defaults": {
"model": { "primary": "anthropic/claude-sonnet-4-6" },
"contextTokens": 50000
},
"list": [
// 监控类:最便宜,窗口最小,激进压缩
{
"id": "sysmon",
"model": { "primary": "anthropic/claude-haiku-3.5" },
"contextTokens": 20000,
"compaction": { "mode": "aggressive" }
},
{
"id": "intel",
"model": { "primary": "anthropic/claude-haiku-3.5" },
"contextTokens": 30000,
"compaction": { "mode": "aggressive" }
},
// 内容类:Sonnet,保守压缩(不能随意丢失写作上下文)
{
"id": "wechat-writer",
"model": { "primary": "anthropic/claude-sonnet-4-6" },
"contextTokens": 40000,
"compaction": { "mode": "safeguard" }
},
// 开发类:需要更大窗口(代码上下文)
{
"id": "agent-creator",
"model": { "primary": "anthropic/claude-sonnet-4-6" },
"contextTokens": 100000,
"compaction": { "mode": "safeguard" }
}
]
}
}compaction.mode 说明:aggressive 更激进地丢弃历史细节,适合监控类这种”结论重要、过程不重要”的 Agent;safeguard 更保守,适合写作和开发这种”上下文连贯性很重要”的 Agent。
维度七:Prompt Cache 最大化 — 把固定成本变折扣
配置文件内容被缓存后,后续调用只收约 10% 费用读取缓存。关键是保持配置文件前缀稳定——”每条消息里的元数据注入会破坏稳定性”(Issue #21999)。
{
"agents": {
"defaults": {
"models": {
"anthropic/claude-sonnet-4-6": {
"params": { "cacheControlTtl": "1h" } // 启用 1 小时长窗口缓存
}
},
"contextPruning": {
"mode": "cache-ttl", // TTL 到期时先剪枝再重缓存
"ttl": "1h"
}
}
}
}如果保留了原生 Heartbeat(等 Bug 修复后),把间隔设为略小于 TTL 的值,可以保持缓存热度避免冷启动费用——55m Heartbeat 刷新 1h 缓存,缓存不会到期失效。
维度八:工具调用与并发控制
{
"agents": {
"defaults": {
"contextTokens": 50000, // 全局底线,各 Agent 可单独覆盖
"imageMaxDimensionPx": 800, // 截图密集场景降低视觉 Token
"maxConcurrent": 1, // 日常用 1,并发请求 = 并发倍的注入成本
"subagents": { "maxConcurrent": 3 }
}
}
}把这几条写进 AGENTS.md(或合并进来的 TOKEN-RULES 内容):
## 工具调用成本控制
- 读取文件前优先使用精确检索,不读整个文件
- 多个独立查询任务合并成一次批量工具调用
- 目录扫描、日志汇总等大输出任务用 /subagents spawn 隔离额外一项:消费保险,杜绝意外失控
"subagents": {"maxConcurrent": 3} | |
优先级速查表
写在最后
你已经做了全局配置优化和每个 Agent 的 TOKEN-RULES,这是对的基础。还没做的三件事按优先级排:
第一,把所有 Heartbeat 换成 Cron——heartbeat.model 的 Bug 意味着你以为在省钱但实际没有,这是现在最紧急的一件事。
第二,给每个 Agent 配独立的 model 和 contextTokens——sysmon 用 Haiku + 20k,agent-creator 用 Sonnet + 100k,不要全部用全局的 50k。
第三,加 session.reset.mode: “daily”,和已有的 softThresholdTokens 形成双保险,每天凌晨自动清零历史。
其他的优化都是在这三个基础上的递进,按需叠加即可。