1. 从一堆报错日志说起:CC Switch 到底在做什么
如果你正在用 Claude Code、Codex、OpenCode 这类命令行 AI 编程工具,又恰好想把手头的 DeepSeek、智谱 GLM、百炼、Ollama 这些模型接进来,那你大概率绕不开CC Switch这个名字。它的定位其实很朴素:一个本地代理层,把不同厂商的模型 API 统一成 Claude Code / Codex 能识别的格式。你配置好 provider、model、base_url、api_key,它就在本地起一个服务,工具发请求给它,它翻译一下再转发给上游,最后把结果按原格式吐回来。
听起来简单,但真正跑起来,问题就来了。我见过太多人卡在cc switch local proxy failed while handling codex endpoint /responses这种报错上,后面还跟着一长串upstream_status: http 400、401、403、404、502、503,甚至stream disconnected before completion。这些错误信息看着吓人,其实大部分都能归到几类根因上:认证没配对、模型名写错、请求格式不兼容、网络链路断了、上游限流或余额不足。
这篇内容就是把这些高频问题拆开揉碎讲清楚。不管你是刚下载 CC Switch 准备配置 Codex,还是在 WSL 的 Ubuntu 里折腾 Ollama 接入,或者想把智谱 GLM-4.7 挂到 Claude Code 上用,下面这些排查思路和实操细节都能直接拿去对照。我会按"错误码 → 根因 → 排查动作 → 修复方案"的顺序展开,尽量让你看完就能自己定位问题,而不是对着日志干瞪眼。
先说一个核心认知:CC Switch 本身不产生模型能力,它只是个翻译和转发层。所以当它报错时,问题往往不在它自己,而在它和上游之间的那段链路上。理解这一点,后面的排查方向就清晰了——你要查的是"请求有没有正确到达上游"和"上游的响应有没有被正确解析回来"。
2. 认证类错误:401、403 与 token 配置的坑
2.1 401 Unauthorized:key 没传对,或者传错了地方
unexpected status 401 unauthorized: cc switch local proxy failed while handling这个报错,翻译成人话就是:上游说你不认识,拒绝服务。九成以上的情况是 API Key 的问题,但具体是哪一种,得细分。
第一种,key 根本没填。CC Switch 的配置文件里,每个 provider 都需要独立的api_key字段。有些人只填了base_url和model,以为工具会自动读取环境变量,结果代理转发时带了个空 key 过去,上游直接 401。这种情况最隐蔽,因为 CC Switch 启动时不会报错,只有真正发请求才暴露。
第二种,key 填了但格式不对。比如智谱的 key 通常是一串特定前缀的字符串,百炼的 key 又是另一种格式。如果你从某个教程里复制了 key,前后带了空格或者换行,转发时就会变成非法凭证。我建议每次配置完,用cat或者编辑器确认一下 key 字段前后没有多余空白。
第三种,key 和 base_url 不匹配。这是最容易被忽略的。比如你拿的是 DeepSeek 的 key,却把 base_url 指向了智谱的接口,上游一看这个 key 不属于自己,照样 401。每个 provider 的 key 必须和它的 base_url 成对出现,不能混搭。
排查动作很简单:先确认 key 非空、无空格、与 base_url 同源。然后可以手动用 curl 测一下这个 key 能不能直接调通上游接口,如果 curl 都 401,那问题在 key 本身,跟 CC Switch 无关。
2.2 403 Forbidden:权限够不着,或者区域/模型受限
403 和 401 的区别在于:401 是"你是谁我不知道",403 是"我知道你是谁,但你没权限"。在 CC Switch 场景下,403 常见于几种情况。
一是模型权限问题。有些平台的 API Key 是分权限的,比如只开通了某个模型的调用权限,你却去调另一个模型,就会 403。智谱 GLM 系列、百炼的各个模型,都可能存在这种细粒度权限控制。解决办法是去对应平台的控制台确认这个 key 到底能调哪些模型。
二是账户状态问题。欠费、未实名、被风控,都可能返回 403。这种情况 curl 直连也会 403,需要去平台侧处理。
三是请求头缺失。部分上游要求特定的 header,比如Content-Type: application/json或者某些自定义头。CC Switch 默认会带标准头,但如果你在配置里覆盖了 header 设置,可能把必要的头弄丢了。检查配置里有没有手动改过headers字段。
2.3 402 Payment Required:余额和配额的红灯
unexpected status 402 payment required这个错误很直白:上游要钱,你账户没钱或者配额用完了。DeepSeek、智谱、百炼这些平台,免费额度用完后如果没充值,就会返回 402。
这里有个容易踩的坑:有些平台的免费额度是按模型分的,你 A 模型还有额度,B 模型已经用完了,调 B 就 402。所以看到 402 别急着充钱,先去控制台看清楚是哪个模型、哪个配额用尽了。
还有一种情况是并发或速率配额。有些平台对免费用户限制 QPS,超了会返回 429 或者 402。如果你在批量跑任务,突然开始报 402,先降速试试。
3. 请求格式类错误:400 与 reasoning_content 的传递陷阱
3.1 400 错误的通用排查思路
upstream_status: http 400是 CC Switch 用户遇到最多的一类错误,因为它的触发原因特别杂。400 的本质是"上游看不懂你的请求",可能是字段缺失、字段类型错误、模型名不存在、参数越界等等。
排查 400 的第一步,是看完整的错误信息。CC Switch 的日志通常会带上上游返回的原始 message,比如model not found、invalid parameter、missing required field。这些 message 才是真正的线索,别只盯着 400 这个数字。
第二步,确认模型名。这是 400 的高发区。比如你想用 DeepSeek 的某个模型,但模型名写成了deepseek-v4-flash这种上游根本不存在的名字,就会 400。模型名必须和上游文档里列出的完全一致,大小写、连字符都不能错。
第三步,检查请求参数。有些模型不支持某些参数,比如temperature范围不对、max_tokens超限、stream设置和上游不兼容,都会 400。
3.2 reasoning_content 必须回传:思维链模型的特殊要求
热词里有一条特别典型:the reasoning_content in the thinking mode must be passed back to the api。这个错误专门出现在带思维链(thinking mode)的模型上,比如 DeepSeek 的推理模型、智谱的部分 GLM 模型。
原理是这样的:这类模型在思考阶段会生成一段reasoning_content(推理过程),然后才输出正式回答。在多轮对话里,上游要求你把上一轮的reasoning_content原样带回来,否则它会认为上下文不完整,直接 400。
问题在于,Claude Code、Codex 这些工具的标准消息格式里,根本没有reasoning_content这个字段。它们只认role和content。所以当 CC Switch 把工具发来的请求转发给思维链模型时,如果模型处于 thinking 模式,就会因为缺少reasoning_content而报错。
解决思路有两条。一是在 CC Switch 配置里关闭 thinking 模式,如果该 provider 支持这个开关。二是换用非推理版本的模型,比如用标准对话模型而不是推理模型。如果你确实需要推理能力,就得确认 CC Switch 的版本是否支持reasoning_content的透传,这通常需要较新的版本或者特定的配置项。
提示:遇到这个错误时,先确认你用的模型是不是推理模型。如果是,优先考虑换模型或关 thinking,而不是去改工具的消息格式,因为工具侧通常改不动。
3.3 模型名与 provider 的匹配问题
再强调一次模型名的问题,因为它太常见了。CC Switch 的配置里,model字段是直接透传给上游的,它不会帮你做任何映射或纠正。所以:
- 用 DeepSeek,模型名要按 DeepSeek 文档写。
- 用智谱 GLM,模型名要按智谱文档写,比如
glm-4.7这种。 - 用百炼,模型名要按百炼的命名规则。
- 用 Ollama 本地模型,模型名要和你
ollama list里显示的完全一致。
我见过有人把glm-4.7写成GLM-4.7或者glm4.7,结果 400。这种错误没有任何技术含量,但就是高频。建议配置完后,先用一个最简单的请求测通,再上复杂任务。
4. 链路与网络类错误:404、502、503 与 stream 中断
4.1 404 Not Found:路径错了,或者服务没起
unexpected status 404 not found: cc switch local proxy failed while handling这个错误,通常指向路径问题。CC Switch 在本地起代理后,工具需要把请求发到正确的本地地址和路径上。如果工具配置的 endpoint 和 CC Switch 实际监听的路径不一致,就会 404。
比如 Codex 的 endpoint 是/responses,Claude Code 可能是/v1/messages,OpenCode 又有自己的路径。CC Switch 需要正确识别并转发这些路径。如果配置里 base_url 写错了,或者端口不对,请求根本到不了 CC Switch,或者到了但路径匹配不上。
排查动作:确认 CC Switch 监听的端口(默认可能是某个固定端口),确认工具侧配置的 base_url 指向http://localhost:端口,确认路径没有被多加或少加/v1之类的前缀。
还有一种 404 是上游返回的。比如你 base_url 指向的上游接口路径变了,或者模型对应的 endpoint 不存在,上游会返回 404。这种情况要看日志里 404 是本地产生的还是上游透传的。
4.2 502 与 503:上游挂了,或者你被限流了
502 Bad Gateway和503 Service Unavailable这两个,基本可以判定为上游侧的问题,不是 CC Switch 的锅。
502 通常意味着 CC Switch 成功连到了上游,但上游返回了无效响应,或者上游自己的网关出了问题。这种情况先等几分钟重试,如果持续 502,去上游平台的状态页看看是不是在维护。
503 更多是限流或过载。上游服务暂时不可用,可能是你请求太频繁触发了限流,也可能是上游整体负载过高。解决办法是降低请求频率、错峰使用,或者升级账户等级。
这里有个经验:502 和 503 不要急着改配置,先确认是不是上游的临时问题。我见过有人一看到 503 就疯狂改配置,结果把本来能用的配置改坏了,等上游恢复后反而跑不起来。
4.3 stream disconnected before completion:流式响应的中断
stream disconnected before completion: stream closed before response这个错误,出现在流式输出场景下。CC Switch 把上游的流式响应转发给工具时,连接中途断了。
原因可能有几种。一是上游超时,模型生成时间太长,上游主动断开了连接。二是网络抖动,本地到上游的链路不稳定。三是CC Switch 的缓冲或超时设置不合理,比如超时时间设得太短。
排查时,先试试关闭流式输出(如果工具支持),看是否还断。如果不断了,说明问题在流式转发环节。然后检查 CC Switch 配置里有没有超时相关的参数,适当调大。如果是网络问题,考虑换个网络环境或者用更稳定的链路。
对于 Ollama 本地模型,stream 中断还可能是本地资源不足,比如内存或显存不够,模型生成到一半被系统 kill 了。这种情况看系统日志能发现 OOM 记录。
5. 不同工具与平台的接入实操
5.1 Claude Code 接入 DeepSeek 与智谱 GLM
Claude Code 的配置相对标准,核心是把它的 API endpoint 指向 CC Switch 的本地地址。配置步骤大致是:
- 在 CC Switch 里新建一个 provider,填入 DeepSeek 或智谱的 base_url 和 api_key。
- 设置 model 字段为对应模型名,比如 DeepSeek 的对话模型或
glm-4.7。 - 启动 CC Switch 代理,记下监听端口。
- 在 Claude Code 的配置里,把 base_url 改成
http://localhost:端口,并确保路径匹配。 - 发一个简单请求测试连通性。
这里的关键是路径匹配。Claude Code 默认会往/v1/messages发请求,CC Switch 需要能识别这个路径并转发。如果 CC Switch 版本较老,可能不支持这个路径,需要升级。
智谱 GLM-4.7 接入时,注意它的模型名和参数要求。GLM 系列对temperature等参数有特定范围,超出会 400。另外智谱的 key 权限要确认包含你要用的模型。
5.2 Codex 接入与 /responses endpoint
Codex 用的是/responses这个 endpoint,这也是热词里codex endpoint /responses的来源。配置 Codex 时,要确保 CC Switch 能正确处理这个路径。
Codex 的请求格式和 Claude Code 略有不同,CC Switch 需要做相应的格式转换。如果转换逻辑有 bug,或者版本不匹配,就会出现local proxy failed while handling codex endpoint /responses这类错误。
实操建议:先用 CC Switch 官方文档里推荐的 Codex 配置模板,不要自己瞎改。如果模板跑不通,再逐步排查是认证、模型名还是格式问题。
5.3 OpenCode 连接 Ollama 与 CC Switch
OpenCode 连接 Ollama 的场景,通常是本地模型 + 本地代理,全链路都在本机,理论上最稳定。但热词里出现了cc switch连接opencode 连接ollama,说明还是有人卡住。
常见问题有两个。一是Ollama 服务没起或者端口不对。Ollama 默认监听11434,如果 CC Switch 配置的 base_url 不是这个,就连不上。二是模型名不匹配,Ollama 里的模型名必须和 CC Switch 配置里写的一致。
配置顺序建议:先确认ollama list能看到模型,再确认curl http://localhost:11434能通,然后在 CC Switch 里配置 Ollama provider,最后在 OpenCode 里指向 CC Switch。逐层验证,别跳步。
5.4 WSL 中 Ubuntu 使用 CC Switch 的特殊注意点
在 WSL 的 Ubuntu 里跑 CC Switch,最大的坑是网络地址。WSL 的网络和 Windows 主机是隔离的,localhost在 WSL 里指向的是 WSL 自己,不是 Windows。
如果你在 Windows 上跑了某个服务,WSL 里要用 Windows 主机的 IP 才能访问。反过来,如果 CC Switch 跑在 WSL 里,Windows 上的工具要访问它,也得用 WSL 的 IP。
解决办法:确认 CC Switch 监听的是0.0.0.0而不是127.0.0.1,这样外部才能访问。然后在工具侧配置正确的 IP 地址。WSL2 的 IP 每次重启可能变,可以用hostname -I查看当前 IP。
另外 WSL 里的环境变量、路径和 Windows 不同,配置文件的位置要注意。建议把 CC Switch 的配置放在 WSL 的文件系统里,避免跨系统路径问题。
6. 配置百炼 token plan 与免费使用思路
6.1 百炼 token plan 的配置要点
百炼的接入,热词里提到了cc switch 怎么配置百炼 token plan。百炼的 API 有自己的认证体系和模型命名规则。
配置时,base_url 要指向百炼的接口地址,api_key 用百炼控制台生成的 key。model 字段按百炼的模型名填。token plan 相关的配额和计费,是在百炼平台侧管理的,CC Switch 只是转发,不参与计费逻辑。
如果配置后报 401 或 403,先确认 key 是否开通了对应模型的权限,以及账户是否有可用额度。
6.2 关于免费使用的现实预期
热词里有cc switch如何免费使用ai,这个问题得客观说。CC Switch 本身是免费的工具,但它接入的上游模型是否免费,取决于上游平台的政策。
DeepSeek、智谱、百炼这些平台,通常会提供一定量的免费额度,用完后需要付费。Ollama 跑本地模型是完全免费的,但需要你有足够的硬件资源。所以"免费使用"的可行路径是:用本地 Ollama 模型,或者用各平台的免费额度。
不要指望有什么绕过计费的方法,那既不现实也不合规。合理利用免费额度,或者本地部署,才是可持续的方案。
7. 一套可复用的排查流程
把上面的内容浓缩成一套流程,遇到 CC Switch 报错时可以按这个顺序走:
| 步骤 | 检查项 | 对应错误 |
|---|---|---|
| 1 | API Key 是否非空、无空格、与 base_url 同源 | 401、403 |
| 2 | 账户余额与模型权限 | 402、403 |
| 3 | 模型名是否与上游文档完全一致 | 400、404 |
| 4 | 是否用了推理模型且未处理 reasoning_content | 400 |
| 5 | 本地端口与路径配置是否匹配 | 404 |
| 6 | 上游服务状态与限流情况 | 502、503 |
| 7 | 流式输出与超时设置 | stream disconnected |
| 8 | WSL/网络地址是否正确 | 连接失败 |
先用 curl 直连上游验证 key 和模型名,这一步能排除掉一半问题。然后再看 CC Switch 的日志,区分错误是本地产生还是上游透传。最后针对具体错误码做修复。
我个人在实际操作中的体会是:大部分 CC Switch 的问题都不是 CC Switch 本身的问题,而是配置和上游的问题。把 key、base_url、model 这三样东西对齐,能解决八成以上的报错。剩下的两成,要么是版本兼容性,要么是上游的临时故障,等一等或者升级一下往往就好了。
最后分享一个小技巧:每次改完配置,别急着上复杂任务,先用一句"你好"测通。这一句话能跑通,说明认证、模型名、路径、格式都没问题,再去跑真实任务就稳得多。如果"你好"都跑不通,那就老老实实按上面的流程排查,别在复杂任务上浪费时间。