
1. 为什么 openclaw.json 里堆了一堆模型却还是不会自动切换openclaw 是本地 AI 工具链里很常见的一个命令行 Agent 框架它靠~/.openclaw/openclaw.json这份配置文件来决定「用哪个 provider、调哪个模型、默认走哪条链路」。很多人第一次配它都是冲着阿里云百炼 qwen3.5 系列的免费额度去的——qwen3.5-flash、qwen3.5-35b-a3b、qwen3.5-27b、qwen3.5-122b-a10b 这些模型各自有独立的免费 token 池一个用完了换下一个理论上能白嫖很久。问题就出在「换」这个动作上。openclaw 原生只认agents.defaults.model.primary这一个主模型models数组里你写 40 个模型它也不会自己挑。于是每次某个模型额度耗尽你都得手动改 json把primary从qwen-aliyun/qwen3.5-flash改成qwen-aliyun/qwen3.5-35b-a3b顺手还要改 provider 里的id。如果你像我一样在 WSL 里跑 openclaw改配置还得先cp到 Windows 桌面、用 notepad 改完再cp回来一套流程下来人都麻了。这篇就聚焦一件事怎么让 openclaw 在调用失败额度耗尽、模型不可用时自动切到阿里云百炼 qwen3.5 系列的下一个可用模型。我会给出可复制的openclaw.json骨架、一个能真正探测额度的检测脚本、以及一次「故意让主模型失败、观察自动切换」的验证动作。适合已经在本地跑 openclaw、手里有百炼 API Key、但被手动改配置折磨过的同学。2. 前置准备TaoToken 统一 Key 与 openclaw 环境在动手改配置之前先把「Key 从哪来」这件事理顺。openclaw 支持 OpenAI 兼容协议所以任何提供/v1/chat/completions的服务都能接。我自己的做法是用 TaoToken 做统一入口一个 Key 覆盖多家模型省得在 openclaw.json 里塞一堆不同厂商的 base_url 和密钥。TaoToken 的定位是 AI 模型 API 聚合网关官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 。它兼容 OpenAI 的请求格式所以 openclaw 里只要把baseUrl指过去、apiKey填上就行。你需要在控制台里生成一个 Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 生成后复制保存后面配置里要用。环境侧确认三件事第一openclaw 已经装好openclaw --version能输出版本号。第二配置文件路径确认默认是~/.openclaw/openclaw.json用ls -la ~/.openclaw/看一眼。第三WSL 用户注意别再用「复制到桌面改完再复制回来」那套直接在 WSL 里用nano ~/.openclaw/openclaw.json或 VS Code 的 Remote-WSL 编辑省掉来回拷贝。注意改配置前先备份一份cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak改崩了能回滚。3. 可复制的 openclaw.json 骨架与自动切换配置openclaw.json 的结构分三块models.providers定义 provider 和它下面的模型列表models是全局模型注册表agents.defaults.model决定默认走哪个。自动切换的关键不在 openclaw 本身而在于「谁来触发切换」——openclaw 不会自己切所以我们用一个外部脚本探测额度、改写primary再由 openclaw 下次请求时读取新配置。先看 provider 和模型注册的骨架。下面这段可以直接抄把apiKey换成你自己的{ models: { providers: { qwen-aliyun: { baseUrl: https://taotoken.net/api, apiKey: sk-你的TaoToken密钥, api: openai-completions, models: [ { id: qwen3.5-flash, name: qwen3.5-flash }, { id: qwen3.5-35b-a3b, name: qwen3.5-35b-a3b }, { id: qwen3.5-27b, name: qwen3.5-27b }, { id: qwen3.5-122b-a10b, name: qwen3.5-122b-a10b }, { id: qwen-turbo, name: qwen-turbo } ] } } }, agents: { defaults: { model: { primary: qwen-aliyun/qwen3.5-flash } } } }这里有个容易踩的坑models.providers.qwen-aliyun.models里的id必须和百炼侧真实的模型名一致写错了请求会直接返回Model not exist。qwen3.5 系列里qwen3.5-flash、qwen3.5-35b-a3b、qwen3.5-27b、qwen3.5-122b-a10b都是常见可用的qwen-turbo属于老一代但额度独立也可以放进候选池。接下来是自动切换的核心——一个探测脚本。它的逻辑是对候选模型列表逐个发一次最小请求根据返回判断是「额度耗尽」还是「可用」然后把第一个可用的写回primary。下面这个rotate-model.sh放在~/.openclaw/workspace/scripts/下#!/usr/bin/env bash # rotate-model.sh - 探测 qwen3.5 系列额度并切换 openclaw 主模型 set -euo pipefail CONFIG$HOME/.openclaw/openclaw.json API_BASEhttps://taotoken.net/api API_KEYsk-你的TaoToken密钥 # 候选模型按优先级排列 CANDIDATES( qwen3.5-flash qwen3.5-35b-a3b qwen3.5-27b qwen3.5-122b-a10b qwen-turbo ) probe() { local model$1 local code code$(curl -s -o /tmp/probe.json -w %{http_code} \ -X POST $API_BASE/v1/chat/completions \ -H Authorization: Bearer $API_KEY \ -H Content-Type: application/json \ -d {\model\:\$model\,\messages\:[{\role\:\user\,\content\:\hi\}],\max_tokens\:1}) if [ $code 200 ]; then echo OK else # 提取错误信息额度耗尽通常是 429 或含 quota/exhausted 字样 grep -oE (code|message)[^,}]* /tmp/probe.json | head -2 | tr \n echo FAIL($code) fi } for m in ${CANDIDATES[]}; do result$(probe $m) echo [$m] $result if [ $result OK ]; then # 用 jq 改写 primary没有 jq 就用 sed 兜底 if command -v jq /dev/null 21; then tmp$(mktemp) jq --arg m qwen-aliyun/$m \ .agents.defaults.model.primary $m $CONFIG $tmp mv $tmp $CONFIG else sed -i s|\primary\: *\qwen-aliyun/[^\]*\|\primary\: \qwen-aliyun/$m\| $CONFIG fi echo 已切换到: qwen-aliyun/$m exit 0 fi done echo 所有候选模型均不可用请检查 Key 或等待额度重置 exit 1脚本里probe函数用max_tokens:1发最小请求成本几乎为零。判断可用的标准是 HTTP 200额度耗尽一般返回 429 或错误体里带quota、exhausted字样脚本会把它标成 FAIL 继续试下一个。jq改写比sed稳建议装上sudo apt install jq。再配一个 cron 定时跑每 30 分钟探测一次crontab -e # 加入下面这行 */30 * * * * /home/你的用户名/.openclaw/workspace/scripts/rotate-model.sh /tmp/rotate.log 21这样即使你不盯着额度耗尽后半小时内也会自动切到下一个可用模型。4. 验证一次失败触发切换的完整动作光配好不算数得亲眼看到「失败 → 切换」这条链路跑通。下面这套验证动作我实测过你可以照着复现。第一步把主模型故意设成一个额度已经耗尽的模型。假设qwen3.5-flash已经用光手动把primary改成它sed -i s|primary: *qwen-aliyun/[^]*|primary: qwen-aliyun/qwen3.5-flash| ~/.openclaw/openclaw.json grep primary ~/.openclaw/openclaw.json第二步直接调一次 openclaw观察报错。你会看到类似The free tier of the model has been exhausted或429的返回。这一步是确认「失败确实会发生」。第三步跑切换脚本chmod x ~/.openclaw/workspace/scripts/rotate-model.sh ~/.openclaw/workspace/scripts/rotate-model.sh正常输出长这样[qwen3.5-flash] FAIL(429) code:Throttling message:The free tier of the model has been exhausted [qwen3.5-35b-a3b] OK 已切换到: qwen-aliyun/qwen3.5-35b-a3b第四步确认配置真的被改了grep primary ~/.openclaw/openclaw.json # 应输出: primary: qwen-aliyun/qwen3.5-35b-a3b第五步再调一次 openclaw这次应该正常返回。到这一步「失败触发切换」的链路就验证完了。提示如果你想让切换更激进可以把 cron 间隔缩到 10 分钟但探测请求本身也消耗极少量 token别设太密。5. 本篇常见错误排查报错一Model not exist。这是模型名写错了。百炼侧的模型名和 openclaw.json 里的id必须完全一致qwen3.5-flash不能写成qwen3.5-flash-2026-02-23除非百炼确实有这个带日期的版本。排查方法用 curl 直接打一次看返回里有没有Model not exist。报错二url error, please check url。多半是baseUrl写错或少了/v1。TaoToken 的端点是https://taotoken.net/apiopenclaw 会自动补/v1/chat/completions所以 baseUrl 不要自己再加/v1。如果你用的是百炼原生地址注意它和 OpenAI 兼容路径的差异。报错三脚本说「所有候选模型均不可用」。先确认 Key 没过期、账户没欠费。百炼有个坑如果你没开「免费额度用完即停」额度耗尽后会继续扣费甚至欠费欠费状态下所有模型都返回失败。去控制台把「仅使用免费额度」打开避免意外扣费。报错四切换后 openclaw 还是用旧模型。openclaw 可能在启动时缓存了配置。改完 json 后重启 openclaw 进程或者确认你的 openclaw 版本是否支持热加载。实测下来重启是最稳的。报错五jq: command not found。脚本会走sed兜底但sed对 json 格式敏感如果primary那行有换行或缩进变化可能匹配不到。装个 jq 一劳永逸。报错六cron 没生效。检查crontab -l有没有那行再看/tmp/rotate.log有没有输出。cron 环境变量和交互式 shell 不同脚本里尽量用绝对路径$HOME在 cron 里可能不是你预期的值。6. 把自动切换接进你的日常编码流到这一步openclaw.json 的骨架、探测脚本、cron 调度、验证动作都齐了。日常用起来就是主模型额度耗尽 → 半小时内 cron 探测到 → 自动改写primary→ 下次请求走新模型。你唯一要做的是偶尔看一眼/tmp/rotate.log确认切换正常。如果你还想把这条链路用得更顺有两个方向可以延伸。一是把候选池扩到更多模型比如把qwen3-coder-plus、qwen-max也加进CANDIDATES额度池更厚。二是如果你同时跑多个 Agent 或长期编码任务可以考虑用 TaoToken 的 Coding Plan 做统一额度管理省得每个模型单独盯https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。想快速验证某个模型当前是否可用也可以直接在模型对话页试一句https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面列了 OpenAI 兼容协议的完整参数改baseUrl或换 provider 时对着看就行。最后提醒一句百炼的「免费额度用完即停」一定要开我当初忘了开欠了 0.06 元短信立刻就到虽然金额小但账户会被限制别踩这个坑。