Claude Code 接国内模型这件事,本身并不难——改下 ~/.claude/settings.json 里的 ANTHROPIC_BASE_URL 和 ANTHROPIC_AUTH_TOKEN,指向 DeepSeek、GLM、Kimi 任意一家的 Anthropic 兼容端点就行。
但实际用起来,问题就来了:
Claude Code 是个非常优秀的 Agent 框架,文件编辑、命令执行、上下文管理、子任务编排、todo 跟踪、hook 和 skill 体系都打磨得很好——但它的模型配置是"单挂"模式,没法把多个模型同时挂上、按场景智能分发。
claude-code-router(下文简称 CCR)解决的就是这件事:
一句话:Claude Code 是引擎,CCR 是变速箱。
安装过程有点折腾,差点把我劝退。CCR 的安装倒是简单,一行命令:
|
1 |
npm install -g @musistudio/claude-code-router |
装完验证版本:
|
1 2 |
ccr -v # claude-code-router version: 2.0.0 |
一切都好。然后我配了一下 C:/Users/**/.claude-code-router/config.json,这个目录和配置文件需要手动创建
完事后我信心满满地运行:
|
1 |
ccr code |
然后……没有任何响应。或者报错。
这是我的 config.json 最初的 Router 部分:
|
1 2 3 4 5 6 |
"Router": { "default": "arkcodingplan,glm-5.1", ← ? arkcodingplan 根本不存在 "background": "arkcodingplan,glm-5.1", "think": "arkcodingplan,glm-5.1", "longContext": "arkcodingplan,glm-5.1", } |
而我的 Providers 里定义的是:
|
1 2 3 4 |
"Providers": [ { "name": "deepseek", ... }, { "name": "volcengine", ... } ] |
问题很明显:我引用了 arkcodingplan,glm-5.1 这个组合,但 Provider 名称是 volcengine,不是 arkcodingplan。
CCR 启动日志里安静地打印了 volcengine provider registered,但 Router 根本不知道 Volcengine 是谁——它只知道自己收到指令去找一个叫 arkcodingplan 的人,翻遍通讯录都找不到。
正确写法:"provider名,模型名",provider 名必须和上面 Providers 数组里 name 字段完全一致。
|
1 2 3 |
"Router": { "default": "volcengine,glm-5.1" } |
火山引擎方舟(volcengine ARK)有 Coding Plan 包月套餐,它的完整 API 地址是:
|
1 |
https://ark.cn-beijing.volces.com/api/coding/v1/chat/completions |
我最初只写到了 /api/coding:
|
1 |
"api_base_url": "https://ark.cn-beijing.volces.com/api/coding" ← ? 缺路径 |
这个错误很隐蔽——CCR 启动时不报错,只有实际请求来了才会抛出 404 或路由错误。直到我用 curl 测试才抓到异常。
配置文件里有一行:
|
1 |
"PROXY_URL": "http://127.0.0.1:7890" |
这本来是给海外模型(如 OpenRouter、Gemini)准备的。但问题是:
结果是每次请求都报 fetch failed,没有任何有用信息。
|
1 2 3 |
# 验证代理状态 curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:7890 # 输出 000 → 连不上 |
解决方案:国内服务直接清空代理。
|
1 |
"PROXY_URL": "" ← ? |
需要再次用代理时再填回来,并确保代理软件正在运行。
这是最隐蔽的坑,也是最大的问题。
其实 CCR 装完、config.json 修完、代理清掉以后,ccr restart 服务已经能正常启动了。但诡异的是我运行 ccr code 之后,Claude Code 界面里的 /model 命令只能看到 glm-5.1,无法切换模型。
查了一圈发现,~/.claude/settings.json 里有这样一段环境变量覆盖:
|
1 2 3 4 5 6 7 8 |
{ "env": { "ANTHROPIC_AUTH_TOKEN": "ark-xxx", "ANTHROPIC_BASE_URL": "https://ark.cn-beijing.volces.com/api/coding", "ANTHROPIC_MODEL": "glm-5.1" }, "model": "glm-5.1" } |
这意味着:
CCR 的原理是在本地启动一个代理服务器,运行 ccr code 时会自动设置环境变量让 Claude Code 连到本地代理。但如果 settings.json 里的 env 配置优先级更高,就会覆盖 CCR 注入的值。
解决方案:删除 settings.json 里与 ANTHROPIC 相关的 env 变量和 model 字段,让 CCR 接管路由控制权。
CCR 跑通之后,我习惯性地用 Warp 终端打开 ccr code,准备像以前一样用右键"Attach as context"把代码文件或截图塞进对话框——结果发现功能倒是有,但是点全部无效,点了没一点反应。
原因:Warp 的上下文注入功能(Attach code / Images as context)是基于进程指纹识别实现的。Warp 检测到当前运行的是 claude 命令时,才会激活 Agent 增强型输入框和上下文绑定面板。而你执行的是 ccr code,Warp 只看到一个叫 ccr 的普通 Shell 命令,不会把它当成官方 AI Agent,于是拒绝激活上下文注入通道。
核心思路是把 ccr code 伪装成 claude 命令,让 Warp 正确识别。
Windows(PowerShell):
|
1 2 3 4 5 6 7 8 |
# 打开 PowerShell 配置文件 notepad $PROFILE
# 在记事本最后一中添加: function claude { ccr code @args }
# 保存后刷新配置 & $PROFILE |
macOS / Linux(Zsh/Bash):
|
1 2 3 4 5 6 7 8 |
# 编辑 shell 配置 nano ~/.zshrc
# 添加: alias claude="ccr code"
# 保存后刷新 source ~/.zshrc |
这些操作完了后,要把当前Warp终端关闭,在当前目录下重新打开,之后在 Warp 中直接输入 claude 启动,Warp 就能识别到 claude 关键字,解锁上下文注入功能。
如果 Alias 方案没生效,可以在 ccr code 会话中按 Ctrl + G,强制拉起 Warp 的 Rich Input Editor(多行富文本输入框),在里面点击附件图标添加代码或图片。
如果 UI 级绑定彻底被 CCR 阻断,可以放弃鼠标流,改用键盘流:在输入框中键入 @,Warp 会基于当前 Git 仓库弹出文件/目录的快速搜索列表,选择后以文本路径方式注入上下文——这种方式 CCR 完全能理解。
解法B/C没试过,我用解法A就解决了我的问题,Warp的丝滑体验又回来了!
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
{ "LOG": true, "LOG_LEVEL": "debug", "HOST": "127.0.0.1", "PORT": 3456, "APIKEY": "", "PROXY_URL": "", "Providers": [ { "name": "deepseek", "api_base_url": "https://api.deepseek.com/chat/completions", "api_key": "sk-你的DeepSeekKey", "models": [ "deepseek-chat", "deepseek-reasoner" ], "transformer": { "use": ["deepseek"] } }, { "name": "volcengine", "api_base_url": "https://ark.cn-beijing.volces.com/api/coding/v1/chat/completions", "api_key": "ark-你的火山Key", "models": [ "glm-5.1", "kimi-k2.6", "minimax-m3" ] } ], "Router": { "default": "volcengine,glm-5.1", "background": "volcengine,glm-5.1", "think": "volcengine,glm-5.1", "longContext": "volcengine,kimi-k2.6", "longContextThreshold": 60000, "webSearch": "", "image": "volcengine,kimi-k2.6" } } |
|
1 2 3 4 5 6 |
{ "theme": "dark", "enabledPlugins": { "understand-anything@understand-anything": true } } |
关键原则就是,settings.json 是 Claude Code 自身的配置,不要在里面写什么 ANTHROPIC_* 环境变量。让 CCR 来管路由,让 settings.json 保持干净。
一切就绪后,实际效果是这样的:
| 时机 | 你看到的(Claude Code 界面) | 背后真实发生的 |
|---|---|---|
| 普通对话 | "Opus 4.8" | 实际调用 GLM-5.1 |
| 上下文 > 60k | "Opus 4.8" | 自动切到 Kimi-2.6 |
| 你问"你是谁" | "Opus 4.8" | 模型回答"我是 GLM" |
Claude Code 以为自己用的是 Opus 4.8,但每一行代码、每一句回答都来自你配置的第三方模型。
这感觉就像给一辆特斯拉换上了比亚迪的电池——仪表盘依然显示"满电",但真正的动力来源早已不是原厂货。
切换模型也有三种方式(按推荐度排序):
爬完这几 个坑,有必要理解一下从 CCR调用大模型 的分层架构或者说工作流:
终端(Warp)→ Claude Code → settings.json 的 env → CCR 本地代理 → Provider API
每一层都可能配置冲突或覆盖,排错的关键是逐层隔离验证:
如果你也在折腾 AI 工具的配置,欢迎转发给需要的人。踩过的坑踩平了,后人就少摔一跤。