🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
CC Switch 把 Claude Code 的多供应商切换收成一个下拉框。这次把默认供应商从 Anthropic 换成 GLM 5.3 Flash,通道走 TaoToken。切换这个动作本身大概三十秒,真正花时间的是切完之后确认它有没有生效——Claude Code 读的是 ~/.claude/settings.json 里的 env,CC Switch 写的是它自己那份供应商配置,两者中间只要有一处对不上,会话里看到的模型名就会悄悄退回原来的。所以这篇会分两步收口:先用 /model 看默认模型到底是谁,再打一次流式请求确认整条链路真的通了。
这篇的目标很窄,不评测 Claude Code,也不评测 CC Switch。真正要观察的对象是切换之后的那条会话:默认供应商变成了谁、/model 回显什么、流式输出能不能一个字一个字地吐出来。统一 API 通道在这个流程里只承担两个职责——发 Key、给 Base URL https://taotoken.net/api。这个分工先摆清楚,后面看对照表的时候就不容易把「模型能力」和「通道配置」混成一件事。整篇的产物是两样可复制的东西:一份 CC Switch 自定义供应商的 JSON 片段,一段切换生效后的 SSE 输出示例。
我自己的操作顺序是:装好 CC Switch 并确认它能读到 Claude Code 的配置目录,去落地页创建 Key 并抄下模型广场里 GLM 5.3 Flash 对应的 ID,把三件套填进自定义供应商,把默认供应商切过去,最后跑 /model 和一次 curl -N 流式请求做交叉验证。中间踩过的坑只有一类:配置写对了但 Claude Code 没重启,env 还是旧的。下面按这个顺序展开。
1. CC Switch 管的是哪一层配置
先把各层的关系理清楚,否则后面出问题根本不知道该看哪个文件。Claude Code 启动时会读取一组 ANTHROPIC_* 环境变量,包括 ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODEL,这些值也可以写在用户级 ~/.claude/settings.json 的 env 字段里;如果项目目录下还有一份 .claude/settings.json,它的优先级更高,会盖住用户级那份。除了这两处,shell 里 export 出来的同名变量同样会参与竞争,而且往往优先级最高。也就是说,「我的模型怎么变了」这个问题,至少有四个地方可能是答案。
CC Switch 的定位是帮你在多个供应商之间来回切。它在本地存一份供应商列表,每条记录里放着 Base URL、Key、模型 ID,你选中哪条,它就把对应的一组值写进 Claude Code 读取的那份配置。手改的好处是透明,坏处是切三次之后你自己都不记得哪个 Key 对应哪个地址;CC Switch 的好处是把这份记忆交给工具,切换变成一个动作。不同版本的 CC Switch 在字段命名上会有差异,有的叫 baseUrl,有的直接展开成 settingsConfig.env,所以下面给出的 JSON 片段你要对照本地版本的表单字段看,不是每一版都能原样粘贴。
再说清楚这一篇的边界。CC Switch 是「插件接入」这条线里的调度器,它本身不产生任何推理能力,也不改变请求内容,它做的唯一一件事是把配置写对位置。GLM 5.3 Flash 是这次要切过去的目标模型,模型 ID 以模型广场的展示为准,别凭记忆写。至于通道,它提供的是一个兼容 Anthropic 消息格式的入口,Claude Code 不需要装任何额外插件,只要 Base URL 指过去就能工作。理解到这一层,后面所有排障都能归结成一句话:某个值没落到 Claude Code 真正读的那个位置。
还有一个容易忽略的点:Claude Code 的会话是长驻进程。你在 CC Switch 里点了切换,写文件是立即生效的,但已经开着的那个会话不会重新读配置。很多人第一次做这件事,切完回到原来的终端里敲 /model,看到还是旧模型,就以为配置写错了,其实是进程还没换过环境。这条我在第 3 章会单独给一个检查点。
1.1 这次要产出的两样东西
第一样是 CC Switch 里那条自定义供应商记录,它需要三个值:Key、Base URL、模型 ID。第二样是切换生效之后的一段流式输出,用来证明请求真的走通了,而不是被本地某个缓存或旧配置兜住了。这两样都可以复制粘贴,区别是前者在你机器上要改 Key,后者只是用来对照字段位置。
2. 新增自定义供应商:Key、Base URL、模型 ID 三件套
拿 Key 这一步没有任何技巧,去 TaoToken 注册之后进控制台创建,复制出来的那一次就是唯一一次完整显示,丢了只能重建。这一步不要图省事把 Key 写进 shell 的 ~/.zshrc 再 export,那样切供应商的时候你会分不清到底是 CC Switch 写的值生效了,还是 shell 里那个旧值还在起作用。Key 统一交给 CC Switch 管理,是这套流程最省心的部分。
模型 ID 要从模型广场抄。这一步的常见错误是照着别处的写法自己拼一个,比如把名字里的空格换成连字符、把版本号写成两位小数,结果请求发出去返回模型不存在。广场里展示的那个字符串是什么就填什么,别做任何「格式化」。本篇所有的配置里,模型 ID 都用 YOUR_MODEL_ID 占位,你把它替换成广场里 GLM 5.3 Flash 对应那一条即可。同样地,Key 一律用 YOUR_API_KEY 占位。
Base URL 是固定的 https://taotoken.net/api,注意末尾不带 /v1。这个细节单独拿出来说是因为它是最常见的 404 来源:客户端自己会拼 /v1/messages,你要是把 Base URL 写成 https://taotoken.net/api/v1,最终请求就变成 /api/v1/v1/messages。写配置的时候脑子里过一遍最终 URL 长什么样,能省掉一轮排查。
2.1 填进 CC Switch 的 JSON 片段
如果本地版本的自定义供应商表单是扁平的四个字段,对应的 JSON 大致是这样:
{
"name": "taotoken-glm-flash",
"baseUrl": "https://taotoken.net/api",
"apiKey": "YOUR_API_KEY",
"model": "YOUR_MODEL_ID"
}
如果本地版本用的是展开成环境变量的结构,那它落到配置里的形态更接近下面这段,字段名以你本地版本为准:
{
"name": "taotoken-glm-flash",
"settingsConfig": {
"env": {
"ANTHROPIC_BASE_URL": "https://taotoken.net/api",
"ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY",
"ANTHROPIC_MODEL": "YOUR_MODEL_ID",
"ANTHROPIC_SMALL_FAST_MODEL": "YOUR_MODEL_ID"
}
}
}
ANTHROPIC_SMALL_FAST_MODEL 是后台小任务用的模型,Claude Code 在生成标题、压缩上下文这类场合会调它。如果你不填,它可能回落到默认值,然后请求打到通道上被拒。最稳的做法是把它和主模型填成同一个 ID,先跑通再考虑拆开。这两段 JSON 里没有任何需要你「猜」的值,四行占位符替换完就能用。
2.2 对照一下 Claude Code 那侧的最终形态
CC Switch 切换成功之后,~/.claude/settings.json 里应该能看到这样一段。把它当成校验基准,CC Switch 说切好了但这里没变,那就是没写进去:
{
"env": {
"ANTHROPIC_BASE_URL": "https://taotoken.net/api",
"ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY",
"ANTHROPIC_MODEL": "YOUR_MODEL_ID",
"ANTHROPIC_SMALL_FAST_MODEL": "YOUR_MODEL_ID"
}
}
顺手提醒一句:如果你同时在用 Codex,它有自己的一份 ~/.codex/config.toml,字段是 model_provider、base_url 那一套,不要把 ANTHROPIC_* 那几行抄过去,两边完全不同。这篇只处理 Claude Code 这一侧。
3. 切换默认供应商并让它真正生效
配置填好后,在 CC Switch 的供应商列表里选中新建的那条,执行切换/应用。多数版本的切换动作就是一次写文件,没有额外的服务要启动。真正需要你手动做的是让 Claude Code 重新读一次配置:退出当前会话,开一个新终端再启动。已经开着的那个进程不会因为文件变了就刷新环境,这一点和大多数 CLI 工具一样。
切换之后第一个检查点是环境变量有没有被 shell 抢先。在启动 Claude Code 的同一个终端里执行:
echo "$ANTHROPIC_BASE_URL"
echo "$ANTHROPIC_MODEL"
如果这两行打印出了值,而且和你在 CC Switch 里填的不一样,那问题就找到了:shell 里的旧 export 优先级更高,文件写得再对也没用。处理方式是清理掉 ~/.zshrc 或 ~/.bashrc 里那几行 export,重新开终端。这一步不做,后面所有验证都会指向错误的方向,你会以为是通道的问题,实际上是本地环境变量在打架。
第二个检查点是项目级配置。如果你在某个仓库目录下见过 .claude/settings.json,那份文件的优先级高于用户级。切完供应商之后在项目目录里启动 Claude Code,发现模型不对,先看看这个文件里有没有写死 ANTHROPIC_MODEL。这个坑的迷惑性在于它只在特定目录里出现,换个目录启动就正常了,很容易被判断成「偶发问题」。
第三个检查点是 CC Switch 里选中的到底是哪一条。列表长了之后误点很常见,尤其是给供应商起名比较随意的时候。建议把名字写成能一眼区分的格式,比如带上模型和用途,切换完顺手看一眼当前激活项。这三个检查点都过了,就可以进入验证环节。整个过程不需要改任何业务代码,也不需要动通道侧的设置。
4. 验证一:/model 的回显
启动 Claude Code,在会话里输入 /model。你要看的是它当前选中的模型标识,以及可切换的列表里有没有你填进去的那个 ID。如果回显里的模型就是广场里 GLM 5.3 Flash 对应的字符串,说明 ANTHROPIC_MODEL 这一路已经到位。如果回显还是 Anthropic 官方的模型名,那就回到第 3 章那三个检查点,按顺序排除。
有的版本 /model 展示的是别名而不是完整 ID,这种情况不能凭肉眼判断,要看别名和广场 ID 的对应关系。稳妥一点的做法是同时看请求本身:随便发一句话,看返回内容里的模型字段是不是你配的那个。/model 是给人看的快速确认,真正的证据还是响应体里的 model 字段。
还有一种情况是 /model 列表里出现了你配的模型,但当前选中项还是旧的。这时候手动切一次,或者退出重进。这种情况通常发生在你改了 CC Switch 配置但没有重启会话,列表是重新拉取的,当前选中项却还是进程启动时的那份。
这一节的结论很简单:/model 通过不代表链路通过,它只证明模型名这一项写对了。Base URL 和 Key 对不对,得靠第 5 章那次真实的流式请求来证明。把这两步分开看,排查的时候就不会一遍遍重复确认同一个值。
4.1 一个可复制的检查顺序
| 顺序 | 检查位置 | 期望看到 | 不符合说明什么 |
|---|---|---|---|
| 1 | CC Switch 当前激活项 | 指向新建的那条 | 选错了供应商 |
| 2 | 终端 echo $ANTHROPIC_BASE_URL | 无输出或与配置一致 | shell 里有旧 export |
| 3 | ~/.claude/settings.json | env 四项齐全 | CC Switch 没写进去 |
| 4 | 项目目录 .claude/settings.json | 不存在或没有 ANTHROPIC_MODEL | 项目级覆盖了用户级 |
| 5 | 会话内 /model | 广场里抄下来的那个 ID | 模型字段没生效 |
这张表按「本地配置 → 工具 → 会话」的顺序排,前面四项都过了再去看通道,排查效率最高。
5. 验证二:一次真实的流式请求
/model 只证明模型名写对了,Key 和 Base URL 要另外验。最直接的办法是绕开 CC Switch 这层,用 curl 打一次流式请求,把三件套单独测一遍。这一步的好处是变量少:如果 curl 通了而 Claude Code 不通,问题一定在 Claude Code 那侧的配置;如果 curl 也不通,那就是 Key、Base URL 或模型 ID 其中之一有问题。
curl -N https://taotoken.net/api/v1/messages \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "YOUR_MODEL_ID",
"max_tokens": 128,
"stream": true,
"messages": [
{"role": "user", "content": "用三句话说明你正在以什么形式输出这段文字。"}
]
}'
-N 关掉 curl 自己的缓冲,这样事件是边到边打印的,能肉眼看出流式行为。返回的是一串 SSE 事件,结构大致如下(下面这段里的事件名和字段名是稳定结构,token 数字是某次运行的回显,只用来指示字段位置,不构成任何基准):
event: message_start
data: {"type":"message_start","message":{"id":"msg_xxx","type":"message","role":"assistant","model":"YOUR_MODEL_ID","content":[],"stop_reason":null,"usage":{"input_tokens":318,"output_tokens":1}}}
event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"我"}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"正在"}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"逐字"}}
event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"},"usage":{"output_tokens":96}}
event: message_stop
data: {"type":"message_stop"}
看三个地方。第一,message_start 里的 model 字段应该回显你填进去的 ID,这是确认请求确实打到目标模型的直接证据。第二,content_block_delta 是不是分多次到达,每次带一小段文本,这是流式是否真的按增量返回的证据;如果所有文本都在一个事件里出现,说明中间某层做了缓冲。第三,message_delta 里带 usage,输入输出 token 数在这个位置,后续对账就靠它,不要靠猜。
curl 通过之后回到 Claude Code,随便发一条需要多段输出的问题,观察文字是不是逐渐出现的。这一步不需要额外命令,肉眼就能判断。如果 Claude Code 里表现为长时间空白然后一次性全出来,而 curl 是逐字的,那基本可以确定是本地缓冲区或者终端相关的问题,不是通道侧的。把 curl 的输出和 Claude Code 的表现并排看,能很快把责任范围缩小。
5.1 两段输出各证明什么
| 验证方式 | 覆盖的配置 | 能证明 | 不能证明 |
|---|---|---|---|
会话内 /model | ANTHROPIC_MODEL | 模型名写对了 | Key 和地址是否有效 |
curl -N 直连 | Key + Base URL + 模型 ID | 三件套本身可用 | CC Switch 是否写对了位置 |
| 会话内真实提问 | 完整链路 | 端到端通 | 具体是哪一层在起作用 |
三行合起来看,任何一次失败都能定位到唯一一层,不用来回试。
6. 本篇会遇到的四类错误
401 的典型表现是请求被拒,提示认证相关。原因基本只有三种:Key 是占位符没替换、Key 在传输中被截断(复制时漏了尾巴)、或者客户端用了 x-api-key 而配置里只给了 ANTHROPIC_AUTH_TOKEN。Anthropic 风格的客户端一般走 Authorization: Bearer,curl 示例里也是这么写的;Claude Code 读 ANTHROPIC_AUTH_TOKEN 后会自己拼上。碰到 401 先把 curl 那条命令跑一遍,能过就说明 Key 没问题,问题在 Claude Code 那侧的字段名。
404 几乎都是 Base URL 多写了 /v1。客户端自己会拼路径,你把 /v1 写进 Base URL,最终路径就多了一层。检查办法是把 Base URL 和请求路径在心里拼一次,拼出来和文档里的示例不一致就是这里错了。这个错误还有个变体:末尾多了一个斜杠,某些客户端拼出来会变成双斜杠,个别网关会直接返回 404。
模型不存在的报错通常出现在 400 里,原因是模型 ID 写错。最高发的写法是照着模型名自己造 ID,比如把展示名里的大小写、连字符改了。正确做法是从广场复制,不做任何修改。另一个来源是 ANTHROPIC_SMALL_FAST_MODEL 没填,后台小任务用了一个通道上不存在的默认模型,于是你在正常对话时一切正常,一做上下文压缩就报错。
配置写了但没生效这一类,症状是前面三种错误都不出现,只是模型还是旧的。回到第 3 章的三项检查:shell 里的 export、项目级 settings、会话有没有重启。这三项里最容易被忽略的是第一项,因为它不在版本控制里,也不在 CC Switch 的界面上,纯靠记忆。把 ~/.zshrc 里那几行删干净,问题通常就消失了。排查时按顺序走一遍,比反复重装工具省时间。
6.1 四类错误的定位表
| 报错 | 优先检查 | 一句话确认 |
|---|---|---|
| 401 | Key 是否替换、Header 形式 | 直接跑 curl 那条命令 |
| 404 | Base URL 是否带 /v1 | 手拼一次最终请求路径 |
| 模型不存在 | 模型 ID 是否从广场复制 | 和广场字符串逐字比对 |
| 切换没生效 | shell export、项目级配置、会话重启 | 新开终端看 /model |
7. 用同一条 Prompt 复现对照
这篇没有本地压测,也没有摘录任何公榜快照,所以本文不含排行分数。下面给的是可复现的步骤,跑出来的数字只属于你自己的环境。观察项固定三个,便于不同时间点对比。
第一步,固定 Prompt。用同一句话,比如「用三句话说明你正在以什么形式输出这段文字」,避免每次问的内容不一样。第二步,固定变量。同一把 Key、同一个 Base URL、同一个模型 ID,只改一个维度的时候才改一个维度,比如只换模型 ID 来对比不同模型的输出风格。第三步,记录三项:流式是否逐字到达、从发出请求到第一个 content_block_delta 出现的大致间隔、message_delta 里的 usage 数值。三项都从响应本身读,不靠估。
for i in 1 2 3; do
curl -N -s https://taotoken.net/api/v1/messages \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"YOUR_MODEL_ID","max_tokens":128,"stream":true,"messages":[{"role":"user","content":"用三句话说明你正在以什么形式输出这段文字。"}]}' \
| grep -c "content_block_delta"
done
这个小循环只数增量事件个数,用来确认三次运行是不是都走了流式路径。数字会随输出内容波动,它的意义是「有没有走流式」,不是性能指标。如果你的环境里没有 grep,把输出重定向到文件再数也行。
跑完之后,把三次的 usage 记下来,和你在控制台看到的用量对一下。这一步能顺带验证请求确实被计入了对应的 Key 名下,而不是发到了别处。同一 Prompt、同一环境、当天跑完,这条对照才有意义;隔几天再跑,输出长度和 token 数都会变,没必要强行对齐。
如果后面想看模型的第三方排名,记住榜单上的对象是模型,不是通道。任何一张榜都要写清楚榜名、查阅日期、名次或分数、页面来源,四样缺一不可;没有快照就别写数字,只说结论来源。把榜单数字直接当成自己环境的结论,是这类对照里最常见的误读。
7.1 复现记录模板
| 项 | 本次值 | 备注 |
|---|---|---|
| Key | 同一把,未更换 | 控制台可见 |
| Base URL | https://taotoken.net/api | 末尾无 /v1 |
| 模型 ID | 与广场一致 | 逐字复制 |
| 流式是否逐字 | 是 / 否 | 看 delta 次数 |
| 首次增量间隔 | 目测秒级 | 不构成性能结论 |
usage 输出 token | 从响应读取 | 用于对账 |
8. 复现之后顺手做的三件事
切换跑通之后,最值得做的一步是回 模型对话 里核对一遍模型 ID 和广场展示是否一致,尤其是你从别处抄过 ID 的情况下,这一步能提前发现拼写差异。确认一致之后再回到 Claude Code 里跑一轮日常任务,主观感受和 token 用量放在一起看,比单看某一次的响应更有参考价值。
如果这个通道会长期用于开发,可以考虑 Coding Plan,把额度管理和日常开发绑在一起,省掉每次临时开 Key 的动作。Key 本身在 控制台 创建,建议按用途分 Key,比如一台机器一把,出问题的时候能快速定位到来源。切换到别的模型 ID 时,把本文第 2 章那份 JSON 复制一份改名字即可,其余字段不用动。
Claude Code 侧的字段含义、切换后的验证顺序,在 接入文档 里有更完整的说明,遇到本文没覆盖的字段可以直接对照。下一次你要换的是另一个模型,流程完全一样:拿 Key、填 Base URL、抄广场里的模型 ID、切默认供应商、用 /model 和一次流式请求收口。这套顺序跑过一遍之后,剩下的就是选哪个模型的问题了。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度




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



