🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
1. Claude Code 换供应商,麻烦的从来不是 Key
Claude Code 读 ~/.claude/settings.json 里的 env 块,换供应商本质上就是换 ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODEL 这三行。TaoToken 这类统一网关的价值在于,三行里的前两行从此固定,需要动的只剩模型 ID。第一次手改 JSON 还能记住,等到手里攒了三四个供应商——日常对话一个、长上下文重构一个、小模型补全一个——每次切换都要打开文件、定位键、改值、存盘、重启终端,少改一个键就是一次 401。
CC Switch 要解决的正是「改文件」这一步。它把每个供应商存成一个 profile,点一下就写回 Claude Code 的原生配置,不需要你记住 JSON 的层级。它同时管 Claude Code 和 Codex 两条线:Claude Code 侧的产物是 ~/.claude/settings.json 的 env,Codex 侧的产物是 ~/.codex/config.toml,两边的字段名完全不通用。这篇只走 Claude Code 这条线,Codex 那部分在排障章节单独提醒一句。CC Switch 自己还有一份配置,存放供应商列表和每个 profile 的字段值,位置随版本变动,界面里一般有「打开配置目录」之类的入口,以你本机显示为准。
理解这一点很重要:CC Switch 不改 Claude Code 的二进制,也不劫持请求,它做的就是「把一份写好的 env 覆盖进去」。所以切换是否成功,最终看的还是 settings.json 里的值,而不是 CC Switch 列表上高亮的那一行。把这个因果关系摆正,后面所有排查都会变得直接:读文件、对比值、定位差异,不需要猜工具内部做了什么。
多个 profile 共用一个 Key 的好处,在切换时最明显。传统做法是每个供应商一把 Key,切换等于同时换 URL 和 Key,任何一边填错都掉进 401;统一 Key 之后,切换只动模型 ID 和 Base URL,Key 那一行不用碰。这也让对照实验变得干净:默认模型和备用模型跑出来的差异,一定来自模型本身,而不是中途换了一把权限不同的 Key。
先把数字纪律说清楚:本文没有引用任何公榜快照,也不会给出 ELO、SWE-bench 百分比、Arena 名次这类需要来源才能写的数字,所以全文不含排行分数。第 4 章的对照表只记录同一把 Key、同一个 Prompt、同一天跑出来的定性差异,一次运行,不代表公榜,也不代表长期稳定性。要看模型能力和价格,去模型广场和对应的公榜页面查最新快照。
这篇要完成三件事:写出可直接复制的 profile JSON,验证切换命令确实写进了配置文件,再拿默认模型和备用模型各跑一次首轮返回做对照。全程只碰本地配置和一键切换,不需要在多个供应商后台之间来回倒腾。
2. CC Switch 里建「默认模型」和「备用模型」两个 profile
在 CC Switch 里新建供应商时选自定义类型,界面通常会给你 Base URL、API Key、模型三块输入框;新一些的版本会把这几项收进一个 JSON 编辑器,字段名是 settingsConfig.env。两种形态填的东西完全一样,本文按 JSON 形态写,界面是输入框的话,把同样的值抄进对应框即可。三件套的取值固定:Base URL 是 https://taotoken.net/api,API Key 从控制台创建,模型 ID 从模型广场原样复制。Base URL 后面不要接 /v1,也不要带任何查询参数,把带 ?utm_source= 的落地页链接整条粘进去,客户端会把它当成路径的一部分,然后回你一个 404。
默认模型的 profile 长这样,字段名以你本机版本的界面为准,值可以照抄:
{
"id": "taotoken-default",
"name": "TaoToken / 默认模型",
"category": "claude",
"settingsConfig": {
"env": {
"ANTHROPIC_BASE_URL": "https://taotoken.net/api",
"ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY",
"ANTHROPIC_MODEL": "MODEL_ID_FROM_SQUARE",
"ANTHROPIC_SMALL_FAST_MODEL": "SMALL_MODEL_ID_FROM_SQUARE",
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
}
}
}
id 是 CC Switch 内部的标识,用英文短横线,别和其他 profile 重复;name 是列表里显示的文字,写得清楚一点,切换时不用回忆;category 决定这个 profile 写回哪个工具的配置,选 claude 才会落到 settings.json。settingsConfig.env 就是 Claude Code 认的那几个键,CC Switch 覆盖或合并的具体行为看你用的版本,多数版本是按 key 覆盖已有的 env,不会把无关键删掉。
ANTHROPIC_AUTH_TOKEN 里只放 Key 本身,不要写 Bearer 前缀。Claude Code 发请求时自己会加认证头,重复加前缀在网关侧会开出 401。有些版本的 CC Switch 支持 ${VAR} 这种环境变量引用,有些版本原样写死,判断方法很直接:把 ${TAOTOKEN_API_KEY} 存进去切一次,然后用 jq 读 settings.json,看到的还是字面量就说明这个版本不做展开,改回明文即可。明文存 Key 的话顺手收紧权限,chmod 600 ~/.claude/settings.json,避免同机器上的其他账号读走。
MODEL_ID_FROM_SQUARE 和 SMALL_MODEL_ID_FROM_SQUARE 都要从模型广场原样复制,以模型广场为准。广场里显示的就是网关侧认的 ID,大小写和后缀日期都算在内,自己手拼一个近似值,最常见的报错就是模型不存在。默认模型填进 ANTHROPIC_MODEL,走主对话请求;小模型槽位 ANTHROPIC_SMALL_FAST_MODEL 承接 Claude Code 内部那些轻量调用,填同一个 ID 也能跑,指向一个更便宜的模型,长会话里能少花一点。哪个模型适合放哪个槽位,看广场上的标注,别按名字猜。
备用模型 profile 只需要复制上面那份 JSON,改三个地方:id 换成 taotoken-fallback,name 换成「TaoToken / 备用模型」,ANTHROPIC_MODEL 换成广场里的另一个 ID。ANTHROPIC_AUTH_TOKEN 保持同一把 Key,这就是「不用为每个 profile 维护独立密钥」的落地方式:Key 只在一处创建、多处复用,切换时不需要重新授权,也不需要记哪把 Key 对应哪个供应商。两个 profile 唯一的区别就是模型 ID 加显示名,其他字段一字不差,这样对照出来的差异才干净。
顺手把 Codex 的坑说一下。CC Switch 能管 Codex,但 ~/.codex/config.toml 里写的是 model_provider、base_url、env_key 这一套,ANTHROPIC_* 完全不适用。在 CC Switch 里建 Codex 供应商时,分类要选对,字段也别复制粘贴 Claude 那份;两者混用最常见的症状是 Codex 启动直接读不到 provider,报错信息里连模型名都不会出现。
3. 一键切换:CC Switch 写了什么、怎么确认它生效
CC Switch 桌面版的操作就是列表里点一下切换,真正发生的事是把选中 profile 的 settingsConfig.env 写进 ~/.claude/settings.json。如果你装的是带 CLI 的版本,流程可以脚本化:先列一遍有哪些 profile,再切到目标,最后读一眼当前生效的是哪个。子命令名在不同版本里会有出入,用 cc-switch --help 确认一遍再写进脚本,别照抄某个版本 README 上的写法。
cc-switch --help
cc-switch list
cc-switch use taotoken-default
切到默认 profile 之后,第一件事不是开新会话,而是把值读回来。CC Switch 不在手边、或者想验证「切换」这个动作本身有没有副作用,可以用 jq 直接写一遍同样的内容。下面这段把三个键一次性写进用户级配置,先写到临时文件再 mv,避免中途失败把 settings.json 写坏,这个习惯值得保留:
jq '.env.ANTHROPIC_BASE_URL = "https://taotoken.net/api"
| .env.ANTHROPIC_AUTH_TOKEN = "YOUR_API_KEY"
| .env.ANTHROPIC_MODEL = "MODEL_ID_FROM_SQUARE"' \
~/.claude/settings.json > /tmp/claude.settings.json \
&& mv /tmp/claude.settings.json ~/.claude/settings.json
如果 settings.json 里还没有 env 这一层,jq 的表达式会新建;已经有的话就是覆盖这三个键,其他键原样保留。这一步和 CC Switch 点按钮的结果应当一致,所以它可以当作交叉验证:点完按钮跑一次读回,值一样就说明 CC Switch 写对了,值不一样就说明你点错了 profile 或者分类选错了。
读回命令建议固定成一条,切完就执行:
jq '{base: .env.ANTHROPIC_BASE_URL,
model: .env.ANTHROPIC_MODEL,
key_tail: (.env.ANTHROPIC_AUTH_TOKEN | .[-6:])}' \
~/.claude/settings.json
期望看到 base 是 https://taotoken.net/api,model 是刚从广场复制的那个 ID,key_tail 是 Key 的最后六位。只打尾号是有意为之:终端里输出完整 Key 会进 shell 历史,也会进你可能正在录的屏。base 如果多了 /v1、多了一个斜杠,或者出现 ?utm_source=,先改回来再排查别的,这类错误会伪装成权限问题。
Claude Code 在进程启动时读配置,已经在跑的会话不会因为文件变了就换供应商。切完要退出当前会话,重新 claude 起一个;保险一点的做法是新开一个终端标签,避免旧进程还挂在旧环境上。CC Switch 桌面版有些版本会在切换后提示「重启 Claude Code 生效」,看到这个提示别忽略。判断当前会话用的是哪个模型,可以在会话里用 /model 看一眼,显示的名字和 settings.json 里的 ID 对不上,就说明这个进程读的还是旧配置。
配置有多层,这点在排查时最容易绕。用户级是 ~/.claude/settings.json,项目级是仓库里的 .claude/settings.json,本地覆盖是 .claude/settings.local.json。同名键的优先级是项目级高于用户级,CC Switch 写的是用户级那份,所以在一个自带项目级配置的仓库里切换,可能看起来「没生效」。做法是在那个仓库目录下再执行一次读回命令,把项目级文件也打开对比,确认到底是谁的 ANTHROPIC_MODEL 在起作用。团队仓库里出现项目级配置是正常的,不一定要删掉,手动对齐模型 ID 就够了。
4. Claude Code 里默认模型与备用模型的首轮返回对照
对照组跑在同一个环境里:同一台机器、同一把 Key、同一天上午、Claude Code 都用新开的会话,唯一变化的是 ANTHROPIC_MODEL。每次切换后退出 Claude Code 重开,保证新进程读到的是新配置。下面所有描述都是一次运行的定性记录,不是分数,也不是公榜名次,本文不含排行分数;换一天、换一个版本,结论可能变,所以更要紧的是这张表的复现方法,而不是表里的结论本身。
固定 Prompt 如下,直接粘进新会话:
用 TypeScript 写一个 groupByLevel(lines: string[]): Record<string, number[]>。
输入是 JSON Lines 文本,按每行的 level 字段分组,输出每个 level 对应的行号数组(从 1 开始)。
空行跳过,解析失败的行单独记到 "__invalid" 下。
给三个测试用例,包含空输入和坏 JSON。不要读我本地的任何文件。
选这个 Prompt 的原因很实际:它不需要读文件、不需要联网、一轮就能结束,判断点又足够密——函数签名有没有对上、行号从 0 还是 1 开始、空行和坏 JSON 有没有单独处理、测试用例里有没有边界。这些点在一轮回答里全都能看出来,不用多轮追问,适合比较两个模型的第一轮表现。要求「不要读本地文件」也有用意:排除工具调用带来的变量,让对照只反映模型本身的输出。
换模型有两种方式,用途不同。Claude Code 会话里用 /model 换的是当前会话的模型,不落盘,适合快速粗筛;改 settings.json 里的 ANTHROPIC_MODEL 改的是默认值,落盘,重启后生效。写进 CC Switch 的 profile 是后一种,所以切换 profile 等于换默认模型。想快速双向对照,一般是先把两个 profile 都配好,用 /model 在会话里粗筛一遍,再用 CC Switch 切换确认落盘后的行为一致,两边对得上再往下做别的。
| 判定项 | 默认模型 profile | 备用模型 profile |
|---|---|---|
| ANTHROPIC_BASE_URL | https://taotoken.net/api | https://taotoken.net/api |
| ANTHROPIC_AUTH_TOKEN | 同一把 Key | 同一把 Key |
| ANTHROPIC_MODEL | 广场中的默认 ID | 广场中的备用 ID |
| 首轮是否给出完整函数签名 | 是 | 是 |
| 行号起点处理 | 从 1 开始,与要求一致 | 从 1 开始,与要求一致 |
| 空行与坏 JSON | 显式判断,坏行归入 __invalid | 主流程完整,边界提醒偏少 |
| 测试用例数量 | 三个,含空输入 | 三个,常规路径占多数 |
| 首轮是否要求读本地文件 | 否 | 否 |
| 切回上一个 profile | 需要重启 Claude Code | 需要重启 Claude Code |
表里刻意没有耗时、Token 数这类数字。同一天同一台机器上测一次的延迟,受网络和排队影响很大,写进文章只会误导后来的人;真要记录,就在自己的环境里连跑几次取中位数,并且标明是本地观察值。模型 ID 也没有在表里写死,原因是广场上的 ID 会更新,任何写在博客里的具体串都可能过期,正确做法是打开广场复制当前那一行,以模型广场为准。
备用模型 profile 不是备份用的,它的实际用途是分流。像重命名变量、补一行日志、解释一段报错这类小请求,走备用模型通常够用,会话轮次会明显轻一些;涉及跨文件重构、长上下文推理的任务再切回默认模型。切换动作本身是秒级的,成本主要在重启 Claude Code 这一步,所以实践上不必每分钟切一次,按任务类型在会话开始前选一个就够了。用量和调用记录在控制台里看,对齐一下哪个 profile 花得多,比凭感觉调度靠谱。
5. CC Switch 切换之后出问题,先查这四处
401 有几种常见来源,按出现频率排:Key 里混进了 Bearer 前缀、复制时尾巴带了空格或换行、用的是别的项目的 Key、Key 在控制台被删掉或轮换过。用 jq '.env.ANTHROPIC_AUTH_TOKEN | length' 看长度,再和创建时页面上给你的长度对一眼,通常就能定位。踩过的坑里最常见的就是多了一个空格:肉眼看不出来,请求头里就是不一样,网关只会返回 401,不会告诉你哪里多了字符。顺手做的防护是切换后固定跑一次读回命令,确认值里没有空白字符。
404 几乎都是 Base URL 写错。正确值是 https://taotoken.net/api:末尾不带 /v1,不带斜杠,不带查询参数。三种典型错法——写成 https://taotoken.net/api/v1,客户端再拼一次就成了 /api/v1/v1/messages;写成 https://taotoken.net,少了 /api;把带 UTM 的落地页链接整条粘进来,?utm_source= 被当成路径。第三种最容易发生在「从浏览器复制官网地址」这个动作上,所以配置里用的地址和浏览器里打开的地址要分开对待,前者只认 https://taotoken.net/api。
模型相关的报错,先看 ID 是不是从广场复制的原值。ANTHROPIC_MODEL 和 ANTHROPIC_SMALL_FAST_MODEL 是两个槽位,改错槽位会出现「主对话模型没变、轻量调用报错」这种一半好一半坏的现象。备用模型 profile 里如果只换了显示名、忘了换 ANTHROPIC_MODEL,切换后体感就是「和上一个 profile 一样」,很容易误判成切换失效。每次新建 profile 后,拿读回命令把 base、model、key_tail 三个值打一遍,三十秒的事,比事后翻日志省事得多。
切换看起来没生效,按顺序排查四件事:当前仓库有没有 .claude/settings.json 或 .claude/settings.local.json 覆盖了用户级;Claude Code 是不是还在用旧进程;CC Switch 里 profile 的分类是不是选成了 Codex;有没有多份 CC Switch 配置,比如中途换过配置目录。前两条覆盖了绝大多数情况,后两条出现的少但排查起来最费时间。确认覆盖关系的方法很直接:在项目目录里执行一次读回命令,读到的值和用户级不一致,就是项目级在起作用,模型 ID 对齐即可,配置本身不用动。
如果读回的值都对,Claude Code 还是报错,可以绕过 Claude Code 直接打一次接口,把问题切开。下面这条命令用的是同一个 Base URL 和同一把 Key,路径由客户端补全,所以这里写成 /api/v1/messages。返回体里出现正常的 content 字段,说明 Key、URL、模型 ID 三件套都是好的,问题回到 Claude Code 或 CC Switch 这一侧;如果这里就报错,把返回里的 type 和 message 原样带去找支持:
curl -sS https://taotoken.net/api/v1/messages \
-H "x-api-key: YOUR_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "MODEL_ID_FROM_SQUARE",
"max_tokens": 64,
"messages": [{"role": "user", "content": "ping"}]
}'
最后重申一次 Codex 那条线。~/.codex/config.toml 不认识 ANTHROPIC_*,它要的是 provider 段里的 base_url、env_key 和顶层 model。在 CC Switch 里建 Codex 供应商时,分类选 Codex,字段按 Codex 的模板填;把 Claude 的 JSON 复制过去,症状是 Codex 启动报 provider 相关错误,在配置里搜 ANTHROPIC 能搜出一堆不该出现的键。两条线各配各的,互不复制,能省掉一大半排查时间。
6. 用同一把 Key 把两个 profile 的对照表复现一遍
把流程压缩成六步,照着走一遍就有一张属于自己的表。第一步,在控制台创建 Key,复制下来先存进密码管理器;第二步,打开模型广场,把默认模型和备用模型的 ID 各复制一份,注意大小写和后缀;第三步,在 CC Switch 里建两个自定义供应商 profile,ANTHROPIC_BASE_URL 都填 https://taotoken.net/api,ANTHROPIC_AUTH_TOKEN 填同一把 Key,两个 profile 只差 ANTHROPIC_MODEL;第四步,切换后跑读回命令,确认 base、model、key_tail 三项符合预期;第五步,用同一个 Prompt 在两个 profile 下各跑一次首轮,把判定项填进表格;第六步,回控制台看这两次调用有没有入账,入账了说明链路完整。
切换成功只是把管道接上了,真正有价值的是那张对照表:同一把 Key、同一个 Prompt、两个模型 ID,跑完自己环境里的记录才算数。模型 ID 和广场标注随时可能更新,动手前先去 模型对话 确认当前可用的 ID 以及默认、备用两个选择;Key 在 控制台 创建,创建完顺手收紧 settings.json 权限;长期在 Claude Code 里挂两个 profile,Coding Plan 页面对照着看用量更直观;三件套字段和 settings.json 的对应关系,Claude Code 接入文档 里有完整示例。注册和用量都在同一个地方,首页入口留在这里:TaoToken。
CC Switch 省下的时间不在切换那一秒,而在「配置只有一处、Key 只创建一次、模型 ID 只从广场复制」这三件事上。默认和备用两个 profile 建好之后,切换变成列表里点一下、重启 Claude Code、读回三个值确认,剩下的就是拿同一段 Prompt 反复跑。把这张对照表留在自己的仓库里,比收藏任何一篇别人的评测都管用;下一次模型 ID 更新时,你只需要改 profile 里那一行,重新跑一遍首轮对照,表格就是新的。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度




被折叠的 条评论
为什么被折叠?



