在 mac 上把 Claude Code 和 Claude Code Router 装齐并不难,难的是第 3 步ccr ui弹出来之后那几个输入框:Providers 里的 baseURL 和 apiKey 到底该填谁。以前的常规做法是跑一趟 DeepSeek 官方控制台复制一把 Key 填进去,想再挂第二个模型就再去开第二个账号、复制第二把 Key。这篇换一条路——先去 TaoToken(https://taotoken.net/?utm_source=taotoken_aicg_blog_end)创建一把 Key,然后在 providers 里把 DeepSeek 那一项的 baseURL 和 apiKey 指向 TaoToken 的接口地址,ccr start、ccr model、ccr code这些验证动作原样不动。
改完的效果是:你在 mac 终端里敲的还是ccr code,Claude Code 读写的还是本地项目文件,但请求到了 CCR 之后会被转发到 TaoToken 的 DeepSeek 通道,而不是直连各家官方接口。config.json 里只留一把YOUR_API_KEY,以后想再加一个模型,改的是 Router 段里的模型名,而不是再去某个控制台开新 Key。下面按原路径走一遍,每一步我都标清楚哪一格的地址该换成接口地址、哪一格的地址该用落地页。
1. mac 上装完 Claude Code 和 CCR,卡点其实在 Providers
1.1 两个 npm 包各自负责什么
先把两个包装上,这一步和原文完全一致:
npm install -g @anthropic-ai/claude-code npm install -g @musistudio/claude-code-router装完之后要分清楚它们的分工。Claude Code 是外壳:它读文件、写文件、执行命令、管上下文。Claude Code Router(下面简称 CCR)是插在中间的一层路由器:Claude Code 按 Anthropic 的格式把请求发给本机的 CCR 端口,CCR 把请求体改写成目标供应商能吃的格式,再按 Router 段的规则决定发给谁。
所以“这次用哪个模型”这件事,既不在 Claude Code 的配置文件里定,也不靠命令行参数临时指定,而是在~/.claude-code-router/config.json里的Providers和Router两段里定。理解了这一点,后面所有的改动都只发生在同一个文件里。
1.2 config.json 里每多一个供应商,就多一把 Key
~/.claude-code-router/config.json的结构很直白:Providers是一个数组,每一项代表一个供应商,里面有名字、接口地址、密钥、模型列表;Router决定 default、background、think、longContext 这些场景分别路由到哪个供应商的哪个模型。
问题就出在这个结构上。如果按“一个供应商一项”的写法,DeepSeek 一项要一把官方 Key,换一家再开一项又要一把 Key,三个供应商就是三把 Key、三个控制台、三份额度账单。想切模型之前,得先回忆“这个模型的 Key 我存哪了”。
这一篇的改法是把 Providers 收敛成一项:名字还叫 DeepSeek 相关的名字,但地址和密钥换成一个统一入口。这样切模型的动作就退化成改 Router 里的模型名,凭据永远只有一把。
2. 打开 ccr ui 之前,先把 Key 和模型 ID 从 TaoToken 拿齐
2.1 创建 API Key:注册一次,后面只维护这一把
动手改配置之前先把材料备齐,顺序别颠倒。打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 注册并登录,进控制台创建一把 API Key,复制出来先放在手边。后文所有出现YOUR_API_KEY的地方,都替换成你复制到的这一串。
注意 Key 只在创建时完整显示,页面关掉之后一般就看不全了,所以复制完先别急着切标签页,直接粘进 config.json 或者粘进终端变量里。真丢了也不用慌,回同一个控制台重新生成一把,然后把配置里的字符串换掉就行。
2.2 在模型广场确认 DeepSeek 对应的模型 ID
这是最容易翻车的一步。CCR 的模型名是字符串匹配,写错一个字母就是 400 或者模型不存在。所以别凭记忆写“大概是 deepseek-chat 吧”,去 TaoToken 的模型广场上看一眼当前列出来的 ID,广场上写的是什么,config.json 里就填什么。
如果广场上同时有对话型和推理型两个条目,那就分别对应think场景和default场景,后面 Router 段正好用得上。模型 ID 一律以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 模型广场当时的列表为准,不要照抄别人的截图。
2.3 为什么这次只往 config.json 里放一把 Key
有人会问:既然要切 DeepSeek,为什么不直接在 providers 里填 DeepSeek 官方的地址和 Key,反正也是用 DeepSeek。区别在于扩展成本。填官方 Key 的话,将来要试第二个模型,就得在 Providers 里加第二项、维护第二把 Key、记住第二套额度规则;填统一入口的话,Providers 里还是那一项,变的只是models数组和 Router 里的名字。
对于每天要跑几十轮对话的编码场景,后者的好处很实际:Key 不用轮换、不用在多处同步、不用在换电脑时重新找一遍。
3. 改 ~/.claude-code-router/config.json:DeepSeek 的 baseURL 和 apiKey 换成 TaoToken
3.1 ccr ui 里那几格分别填什么
启动配置界面:
ccr ui浏览器会打开本机的配置页(默认端口 3456)。原文在这一步是新建一个供应商项、填 DeepSeek 官方地址和官方 Key,我们只把其中两格换掉:
- 供应商名称:保持可读即可,比如
taotoken; - API 地址(baseURL):填接口地址
https://taotoken.net/api,CCR 这个字段要求精确到对话端点,所以实际写进去的是https://taotoken.net/api/v1/chat/completions,根地址仍然是https://taotoken.net/api; - API Key:填
YOUR_API_KEY,也就是 2.1 里创建的那把; - 模型列表:填广场上确认过的 ID,多个用逗号隔开。
有一件事必须分开记:落地页https://taotoken.net/?utm_source=taotoken_aicg_blog_end是给人点的,用来注册、建 Key、看模型广场、看用量;填进工具的接口地址是https://taotoken.net/api,末尾不带 UTM 参数,也不要把参数带进配置文件。
3.2 直接编辑 config.json 的完整示例
UI 保存之后,文件里的内容长这样;也可以不走 UI,直接用编辑器打开~/.claude-code-router/config.json手写:
{ "LOG": true, "APIKEY": "", "Providers": [ { "name": "taotoken", "api_base_url": "https://taotoken.net/api/v1/chat/completions", "api_key": "YOUR_API_KEY", "models": ["deepseek-chat", "deepseek-reasoner"], "transformer": { "use": ["deepseek"] } } ], "Router": { "default": "taotoken,deepseek-chat", "background": "taotoken,deepseek-chat", "think": "taotoken,deepseek-reasoner", "longContext": "taotoken,deepseek-chat" } }三层配置理解起来不复杂:name是这一项的代号,Router 里的taotoken,模型名就是“代号 + 模型”的组合写法;api_key是唯一那把 Key;models是把这一项允许用的模型列出来,Router 里只能引用这里出现过的名字,写了列表外的名字会直接被拒。
3.3 Router 段决定 default / think / longContext 分别走谁
很多人配完 Providers 就以为完事了,结果发现跑起来还是老模型,原因是 Router 段没改。这四个键控制的是不同场景的路由目标:
| 字段 | 什么时候用 | 建议指向 |
|---|---|---|
default | 日常对话、改代码 | 广场上的通用对话模型 |
background | 后台小任务、起标题 | 同 default,省事 |
think | 需要推理的步骤 | 广场上的推理型条目 |
longContext | 上下文很长时 | 同 default,或长上下文条目 |
改完这四项,切换才真正生效。想临时换个模型试试,不必改文件,ccr model里选一下就会覆盖 default。
4. ccr start、ccr model、ccr code:确认走的是 TaoToken 的 DeepSeek
4.1 启动服务并看状态
配置文件保存后,重启路由服务让改动生效:
ccr restart ccr statusstatus会告诉你服务有没有起来、监听在哪个端口。如果之前是用ccr start起的,也可以先ccr stop再ccr start。这一步不涉及任何网络配置,纯粹是本机进程的事;起不来通常是端口被占或者 Node 版本太旧,第 5 节会展开。
4.2 ccr model 里选中带 taotoken 前缀的那一项
ccr model终端会列出可选项,格式就是供应商代号,模型名。这时候你应该能看到类似taotoken,deepseek-chat和taotoken,deepseek-reasoner的条目。选中其中一条,回车确认。如果这里只看到别的供应商、看不到 taotoken 开头的项,说明 Providers 的保存没生效,回去确认api_base_url和models是不是写在了同一个对象里。
4.3 发一句测试对话,再去控制台看这次调用有没有记上
ccr code这会拉起 Claude Code,并把它的上游指向本机的 CCR 端口。随便提一个问题,比如让它解释当前目录下某个脚本在做什么。回复正常返回,只能说明链路通了;要确认“确实走的是 DeepSeek 通道、确实记在了这把 Key 上”,还得回控制台看一眼调用记录,这一步放在第 7 节说。
5. 401、404、模型名不对:config.json 改完最常见的几个报错
5.1 401:Key 没生效,或者粘错了一位
401 基本只有一个原因:CCR 发出去的凭据不被接受。逐项排查——api_key是不是还是模板里的YOUR_API_KEY没替换;复制时有没有把首尾的空格或者换行带进去;Key 是不是在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 上创建的那一把,而不是很久以前另一家平台留下的。
还有一种隐蔽情况:UI 里改过了,但没保存就关了页面,文件里还是旧值。改完直接打开~/.claude-code-router/config.json看一眼实际内容,比盯着界面可靠。
5.2 404:地址拼重复,或者把落地页粘进了配置
404 通常出在地址上。CCR 的api_base_url要写到对话端点这一级,正确的根是https://taotoken.net/api,拼出来是https://taotoken.net/api/v1/chat/completions。如果你在别处抄了一段又多加一层v1,就会得到不存在的路径;如果直接把给人点的https://taotoken.net/?utm_source=taotoken_aicg_blog_end粘进api_base_url,那更会 404,因为它本质上是一个网页地址而不是接口地址。
记住这条分界:浏览器地址栏里用带参数的落地页,配置文件里只用https://taotoken.net/api开头的接口地址。
5.3 端口被占、环境变量没继承
如果ccr status显示服务没起来,先看 3456 是不是被别的进程占了,换一个端口后记得同步调整使用方式。另一种情况是服务起来了、ccr model也正常,但在某个已经打开的终端里跑 Claude Code 还是走老路——那是因为 Claude Code 是在服务启动之前拉起来的,环境变量没继承到,关掉终端重新ccr code就好。
6. 不想装 CCR 也能用:~/.claude/settings.json 里直接指向 TaoToken
6.1 env 三个变量的写法
如果你只是想让 Claude Code 走统一通道,不需要 Router 那一层按场景分流的逻辑,可以不装 CCR,直接改 Claude Code 自己的设置文件~/.claude/settings.json:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "YOUR_MODEL_ID" } }这里的ANTHROPIC_BASE_URL只写到https://taotoken.net/api,末尾不要加/v1,也不要接任何查询参数;ANTHROPIC_MODEL填广场上确认过的模型 ID。它和 CCR 那套的区别是:没有 default / think 之分,一次只走一个模型,换来的是配置更少、出问题时排查路径更短。
6.2 或者用 CLI 一条命令起
命令行党可以用官方 CLI,把 Key、接口地址、模型 ID 一次传进去:
npm install -g @taotoken/taotoken taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m YOUR_MODEL_ID-u后面同样是接口根地址,不带路径、不带参数。这条命令适合临时开一个会话、或者给同事演示时用,长期使用还是建议落到配置文件里,省得每次翻历史记录找参数。
7. 跑通之后去控制台对一下这次 DeepSeek 调用
配置保存、ccr code也回话了,最后一件事是把账对上。先在 TaoToken 模型对话 里用同一把 Key 发一条测试消息,确认模型 ID 和接口地址没填错;如果打算长期拿它写代码,去 Coding Plan 看套餐是否够用;Key 随时可以在 控制台 API Keys 重新创建;Claude Code 的环境变量对照写在这份 接入文档 里。
有一点值得提前记住:这套配置解决的是“模型从哪来”,不解决“谁去执行”。CCR 和 Claude Code 都不会替你连生产环境跑命令,改成 Router 配置之后这一点没变,该在本地终端执行的语句还是你手动执行、把输出贴回对话。
以后再想在这台 mac 上换模型,动作已经很小了——打开~/.claude-code-router/config.json,把models数组和 Router 里的模型名换掉,ccr restart,再ccr model选一次。凭据始终是那把YOUR_API_KEY,不用回任何一个额外的控制台重新找 Key。