给六个 coding agent 统一换底座的踩坑记录:四条写入语义里两条得自己兜底
最近在做一件杂活:把手上六个 coding agent 的模型底座统一换掉。六个是 Claude Code、Qwen Code、OpenCode、OpenClaw、Hermes、Codex,配置文件分别是 JSON、JSON、JSON、YAML、TOML,键名互不相认。以前我一家一家改,改完还要回头确认没碰坏别的键。
这次改用阿里云百炼 CLI 里的 bl config agent,一条命令配一个 agent,不鉴权、不联网、只写本地文件。2026-10-10 我在隔离的临时 HOME 里把六臂挨个跑了一遍,key 用占位符,没碰自己那些真实配置。这篇按踩到的顺序记,不写成教程。
结论先放这儿:五臂写成功,格式各异但讲道理;一臂(openclaw)当场死掉。写入语义有四条,其中两条得我自己兜底。
坑一:损坏的配置文件会被静默整份覆盖,而且不留副本
最贵的一条写在最前面。
我先测的是友好的一面。往 claude-code 的 ~/.claude/settings.json 里塞一个自有键 myOwnKey,重跑命令,键还在,说明它是合并写入,只动自己负责的那几个键。同参数连跑两次,claude-code 与 codex 的落盘文件 diff 均为空,幂等也站得住。
然后我把 settings.json 改成一行非法 JSON 再跑。命令照常报成功,照常写文件,没有任何"你原来的文件解析不了、我整份替换了"的提示。跑完我在整个 HOME 下搜了一遍,没有 .bak、.orig、backup 任何形式的副本。
合并语义保护的是"合法但陌生"的键,保护不了"已经坏了"的文件,而坏了恰恰是最需要副本的时候。命令不备份,那备份就归我。现在的习惯是跑之前先 cp 一份:
cp ~/.claude/settings.json ~/.claude/settings.json.bak 2>/dev/null || true
坑二:claude-code 那臂会改写我传进去的地址
我传的是 OpenAI 兼容形态 https://dashscope.aliyuncs.com/compatible-mode/v1,落盘写成 https://dashscope.aliyuncs.com/apps/anthropic(2026-10-10 的落盘形态),同时给一条 Warning:Claude Code needs /apps/anthropic, not OpenAI compatible-mode。
改写本身是对的。Claude Code 走 Anthropic 原生协议,把兼容端点直接写进去会在调用期出问题,而且它告警了,比静默改写好得多。坑在于它打破了"传什么就写什么"的直觉,我第一次打开落盘文件还以为自己哪里配错。
同一臂还往 ~/.claude.json 写了 hasCompletedOnboarding: true。这已经越过"写 provider 配置"的边界,碰到了目标工具自己的状态。对我这台用了很久的机器没什么影响,但第一次跑的人该提前知道。
坑三:五个模型槽填的是同一个模型
settings.json 的 env 块写七个键:ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODEL,再加 DEFAULT_HAIKU、DEFAULT_SONNET、DEFAULT_OPUS、DEFAULT_SUBAGENT 四个默认槽。四个默认槽加主模型,填的都是 --model 给的那一个值。
我原本指望配完就有"小事走轻模型、大事走重模型"的分层,实际得自己进文件改。这是设计选择,不是缺陷,但不写清楚人就会误会。
顺手把另外几家的落点记下来,省得以后再翻。qwen-code 写 ~/.qwen/settings.json,一次改 modelProviders.openai、security.auth、model 三处。opencode 写 ~/.config/opencode/opencode.json,provider 指向 npm 包 @ai-sdk/openai-compatible,带 setCacheKey: true,models 里只登记所配的那一个。hermes 写 ~/.hermes/config.yaml,四行:model.default、provider: custom、base_url、api_key。codex 写 ~/.codex/config.toml(provider 名 bailian-cli、wire_api = "responses"、requires_openai_auth = true)加 ~/.codex/auth.json,key 单独放后者。
坑四:写进去的 key 可能压根不生效
qwen-code 那臂的成功提示后面跟了一条 Warning:
Warning: Shell/environment DASHSCOPE_API_KEY is set and overrides settings.json.
Unset it (e.g. `unset DASHSCOPE_API_KEY`) so the key written here takes effect.
我的 shell 里正好 export 着这个变量,所以它是当场跳出来的。意思是环境变量的优先级高于刚写进文件的那把 key,这次配置等于白做。
真正要记的是另一半:其余几家不给这条提示。同样的覆盖关系照样存在,只是没人告诉你。配之前先 echo $DASHSCOPE_API_KEY 看一眼,有就 unset。
坑五:openclaw 那一臂当场死掉
2026-10-10 的 bl 2.1.0 上,--agent openclaw 跑不出任何结果:退出码 137,标准输出与标准错误各 0 字节,不产生文件。
我换着花样复现了七次:加 --dry-run、加 --context-window 256000、全参数真写、只给 --base-url、只给 --agent openclaw、全新空 HOME、追加 --quiet --output text。七次结果一致,同一环境下其余五臂正常返回。
定位能做到的程度是这样:缺必填参数本该走退出码 2 的分支,实际连那个分支都到不了,说明进程在参数校验之前就被终止了。
我不猜原因。可观测面只有退出码和两个空流,没有日志、没有文件、没有 core 可看。能写下来的结论只有一句:六分之一的适配面当前不可用,等修复;要配 OpenClaw,今天走 OpenClaw 自己的配置文档。
坑六:dry-run 不是预览
我原以为 --dry-run 能告诉我"将要写哪个文件、写成什么样"。实际 --dry-run --output json 只回显五个字段:agent、label、base_url、api_key、model,其中 api_key 打码成 sk-P...0000 这种首尾各留四位的形态,打码这个默认我喜欢。
codex 加不加 --wire-api chat,dry-run 的输出逐字相同,而这个选择真写时会落到 toml 的 wire_api = "chat"(--wire-api 是 codex 专属参数,2026-10-10)。所以它是参数回显加脱敏检查,做不到内容级预览。
想要内容级预览,用一次性 HOME 真写一遍再读文件:
mkdir -p /tmp/cfg-probe && HOME=/tmp/cfg-probe bl config agent --agent codex --base-url https://dashscope.aliyuncs.com/compatible-mode/v1 --api-key sk-你的key --model qwen3.7-plus
看完把目录删掉,对真实配置零影响。我这篇里的落盘对照都是这么跑出来的。
遥测那边我也翻了一眼,隔离 HOME 里的 .bailian/telemetry.jsonl:每行记命令名、时间戳、耗时、成功位、退出码、CLI 与 Node 版本、操作系统、鉴权方式,params 里只有 model 一个字段,key、base_url、agent 名都不在其中。字段集我照实记,不外推成隐私承诺。
两处它不校验的地方
模型在架不校验。 2026-10-10 正好是六条模型下线公告的共同生效日。我拿一个在退役名单里的 ID qwen3-max 去配 hermes,命令返回成功、退出码 0,yaml 里 default: qwen3-max 原样落盘。命令不鉴权、不联网,本来也不该做在架核验;但配置成功与模型可用是两件事,配置阶段没有任何守卫。我的补法是配完跑一句各家的验证命令,或者先 bl model list --page-size 50 拉全量列表 grep 一眼目标 ID 在不在。
--region 不校验 key 身份。 帮助文本标注它是 Token Plan only,我只给 --region cn-beijing 配一个普通形态的 key,命令照样成功,落盘 base_url 是 https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1(2026-10-10 形态)。普通 key 对上 Token Plan 端点,后续调用返回什么我不替它推断,能确认的是配置阶段不拦人。
做得好的一处也记下来。--key 收控制台复制出来的混淆串,我给一个假串,退出码 2 报 Invalid obfuscated API key,错误信息里把期望格式写清楚了。两个地址参数都不给时同样退出码 2,原文 one of --base-url or --region is required;--agent 写错会把六个枚举值列出来。错误信息带下一步,这在 CLI 里不算常见。
我最后留下的流程
三步。跑之前 cp 一份目标文件,因为命令不留副本。配完必跑各家成功提示里那句验证命令,hermes 是 hermes chat -q "hello",opencode 是启动后输 /models,claude-code、qwen-code、codex 分别是 Run claude、Run qwen、Run codex。2026-10-10 我没有代跑这些验证,那需要各 agent 本体和真实 key,所以这篇不主张"配完就能对话"。openclaw 那一臂先搁着,七种复现组合我留着,等它能跑通了我重跑一遍再来补记。
装与配置各一条命令(CLI 安装页、API Key 管理页):
npm install -g bailian-cli
bl config agent --agent claude-code --base-url https://dashscope.aliyuncs.com/compatible-mode/v1 --api-key sk-你的key --model qwen3.7-plus
整条链路到今天为止没花我一个 token,两个动作都不需要鉴权。
参考资料
- 控制台入口:模型服务平台首页
- 各家验证命令均取自命令自身的成功提示原文,未做改写

浙公网安备 33010602011771号