1. 先看清 OpenClaw 的钱到底烧在哪
OpenClaw 是一个能 7×24 小时自主跑任务的 Agent 框架,能读邮件、写代码、盯监控、调工具,适合把它当"数字员工"用的个人开发者和中小团队。但它的计费逻辑和普通聊天 AI 完全不是一回事:普通对话一次问答只触发一次 API 调用,而 OpenClaw 一个任务可能触发 5 到 10 次推理,每次还要把记忆、Skills、历史上下文一起塞进请求。这就是为什么有人睡一觉醒来看到 $1100 账单,而同样跑 OpenClaw 的人月成本能压在 $20 以内。
我把自己从月花 $1000+ 压到 $20 量级的过程拆成三块:Fallback 链路分流、本地部署兜底、请求裁剪。核心结论先放这:成本失控不是模型贵,而是把贵模型用在了不该用的地方,同时让上下文无限膨胀。下面每一步都给出可直接复制的config.toml和settings.json骨架,以及一轮压测验证动作,照着改就能看到账单变化。
在动手之前,先建立一个成本公式,后面所有优化都围绕它:
月成本 ≈ 单次请求平均 Token × 日请求次数 × 30 × 单价三个乘数里,单价靠 Fallback 和本地部署压,请求次数靠定时任务裁剪压,单次 Token 靠上下文裁剪压。三管齐下,才能从三位数掉到两位数。
2. 前置准备:TaoToken 接入与 Key 管理
优化之前得先有一个稳定的 API 入口,否则 Fallback 链路没法落地。我用的是 TaoToken 作为统一网关,它把多家模型收敛到一个兼容接口下,切换模型只改配置不改代码,这对做 Fallback 分流特别关键。
注册和拿 Key 的入口在这里:
- 官网:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
- API 基址:https://taotoken.net/api(这个地址不加 UTM 参数)
- 控制台:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
- API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite
拿到 Key 之后,建议按用途拆成两把:一把给主力模型用,一把给便宜模型和本地兜底用。这样在控制台看用量时能直接区分哪条链路在烧钱,排查成本来源时省很多事。
注意:Key 不要写死在代码里,统一走环境变量注入,后面
config.toml里会用${TAOTOKEN_API_KEY}这种占位方式引用。
3. 可复制配置:Fallback 链路 + 预算上限
这一节是省钱的核心。OpenClaw 的模型配置支持 primary 加 fallbacks 数组,很多人只知道它在主模型不可用时降级,其实更值钱的用法是主动按任务难度分流:复杂任务走贵模型,简单任务直接落到便宜模型,从源头减少贵模型调用次数。
3.1 config.toml 骨架
# ~/.openclaw/config.toml [gateway] base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" timeout = 60 [agents.defaults.model] # 主力模型:只处理写代码、复杂推理这类硬任务 primary = "anthropic/claude-sonnet-4-6" # 降级链:中等任务 -> 简单任务,逐级变便宜 fallbacks = [ "anthropic/claude-haiku-4-5", "deepseek/deepseek-chat" ] [agents.defaults.budget] # 日预算硬上限,防止循环推理一夜烧穿 max_tokens_per_day = 500000 max_cost_per_day = 5.00 # 超限后的动作:block 直接拦截,warn 只告警 on_exceed = "block" [agents.defaults.context] # 上下文过期时间,避免无限膨胀 ttl_hours = 12 # 单次请求上下文上限,超出自动截断 max_context_tokens = 320003.2 settings.json 骨架
{ "env": { "TAOTOKEN_API_KEY": "sk-your-key-here", "OLLAMA_API_KEY": "ollama-local" }, "agents": { "defaults": { "model": { "primary": "anthropic/claude-sonnet-4-6", "fallbacks": [ "anthropic/claude-haiku-4-5", "deepseek/deepseek-chat" ] }, "budget": { "maxTokensPerDay": 500000, "maxCostPerDay": 5.00, "onExceed": "block" }, "context": { "ttlHours": 12, "maxContextTokens": 32000 } } } }3.3 本地部署兜底:Ollama 分流
心跳任务、问候、查天气这类请求根本不该走付费 API。用 Ollama 跑本地模型,让 OpenClaw 自动发现,成本直接归零,只花电费。
# 1. 安装 Ollama 后拉取一个适合工具调用的模型 ollama pull qwen3-coder:32b # 2. 确认本地服务在跑 ollama list curl http://localhost:11434/api/tags然后在settings.json里把本地模型挂到 Fallback 链最末端:
{ "agents": { "defaults": { "model": { "primary": "anthropic/claude-sonnet-4-6", "fallbacks": [ "anthropic/claude-haiku-4-5", "deepseek/deepseek-chat", "ollama/qwen3-coder:32b" ] } } } }注意:接 Ollama 时不要用
/v1那个 OpenAI 兼容地址,工具调用会异常。让 OpenClaw 走原生 Ollama API,它会自动发现本地模型,不用额外配 endpoint。
3.4 定时任务裁剪
24/7 定时任务是隐形杀手。把频率降下来,再加一个"有新任务才触发"的判断:
# ~/.openclaw/tasks.toml [[tasks]] name = "check-email" schedule = "0 8,12,20 * * *" # 一天三次,别用每小时 enabled = true # 只有存在未读邮件时才真正调用模型 condition = "unread_count > 0" [[tasks]] name = "heartbeat" schedule = "*/30 * * * *" model = "ollama/qwen3-coder:32b" # 心跳强制走本地,零成本4. 验证请求:确认分流真的生效
配置改完不能靠感觉,得用一轮压测确认钱花在了对的地方。下面这套动作我实测下来能直接看出 Fallback 有没有按预期工作。
4.1 发一条简单请求,看落到哪个模型
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer ${TAOTOKEN_API_KEY}" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek/deepseek-chat", "messages": [{"role": "user", "content": "现在几点"}], "max_tokens": 64 }' | jq '.model, .usage'返回里usage.prompt_tokens和usage.completion_tokens就是这次的真实消耗。简单问候类请求的 prompt_tokens 应该控制在几百以内,如果动辄上万,说明上下文没裁干净。
4.2 核对 Token 用量清单
压测时按这张表逐项对,哪一项超标就回去改对应配置:
| 检查项 | 健康值 | 超标说明 | 对应配置 |
|---|---|---|---|
| 单次 prompt_tokens | < 8000 | 上下文或 Skills 注入过多 | max_context_tokens |
| 日请求次数 | < 500 | 定时任务太频繁 | tasks.toml schedule |
| 贵模型调用占比 | < 20% | Fallback 分流没生效 | fallbacks 顺序 |
| 日成本 | < $0.7 | 综合超标 | max_cost_per_day |
4.3 跑一轮 24 小时压测
把max_cost_per_day临时设成 $1,让 Agent 正常跑一天。第二天看控制台用量:如果被block拦下来了,说明还有无效请求在烧钱,回去查是哪个任务触发的;如果一天下来只花了 $0.3 到 $0.6,说明分流链路已经健康,把上限调回 $5 即可。
5. 本篇常见错排查
改配置的过程中我踩过几个坑,列出来帮你省时间。
Fallback 顺序写反:把便宜模型放 primary、贵模型放 fallbacks,结果复杂任务全落到便宜模型上,输出质量崩了又反复重试,反而更贵。记住 primary 一定是能力最强的那个。
上下文 TTL 设太长:ttl_hours 设成 72 甚至不设,记忆文件越滚越大,每次请求都拖着几万 Token 的"行李"。12 小时对大多数场景够用。
Ollama 用了 /v1 地址:工具调用直接报错,Agent 反复重试,本地没省钱反而把请求打到了付费链路上。检查 gateway 配置里本地模型走的是原生 API。
预算上限只告警不拦截:on_exceed 设成 warn,循环推理时照样烧钱,只是给你发个通知。生产环境一律用 block。
Skills 描述写太长:每个 Skill 的说明都会注入 system prompt,写几百字描述等于每次请求多烧几百 Token。描述精简到一句话,能省 30% 左右的输入 Token。
定时任务没有 condition:没有新任务也照常触发,一天空跑几十次。加上condition判断,没活干就休眠。
6. 把月账单压到 $20 的完整链路
把上面所有配置串起来,最终的成本结构是这样的:复杂任务走 Claude Sonnet,中等任务走 Haiku,简单任务走 DeepSeek,心跳和问候走本地 Ollama,日预算 $5 兜底,上下文 12 小时过期。实测下来月成本稳定在 $15 到 $20 之间,比优化前降了 95% 以上。
如果你还想进一步压,可以试试把主力模型也换成按量更划算的组合,或者把更多任务迁到本地。模型对话和 Coding Plan 的入口在这里,按需取用:
- 模型对话:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite
- Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
最后留一个我一直在用的习惯:每周花五分钟看一次控制台的用量曲线,哪条链路突然抬头就回去查对应配置。成本控制不是一次性的活,是持续盯着乘数里那个偷偷变大的因子。