OpenAI Codex CLI 在新版切到了 Responses API。这是一个干净的、面向 Agent 设计的协议——但所有第三方供应商(DeepSeek、Kimi、硅基流动、Moonshot)暴露的仍然是 OpenAI Chat Completions 接口。
直接对接是不行的。 Codex 给 DeepSeek 发请求,会遇到 404 或者流式响应解析失败。协议不兼容是硬伤。
CC Switch 3.16 的解决方案是本地协议路由:在你机器上跑一个轻量代理(127.0.0.1:15721),Codex 始终连本机,路由在内部把 Responses API 改写成 Chat Completions 发给上游,再把响应转回来。
为什么是本地路由,不是云端代理
CC Switch 选择本地有明确理由:
- 延迟低——代理就在 loopback,毫秒级
- Key 不出本机——真实 API Key 永远在本地配置文件
- 零账号风险——路由不向上游账号系统发送任何身份信息,避开了"代理访问官方账号"被封的隐患
- 可调试——所有流量都过本机,curl/日志/抓包都在你控制之下
云端代理方案(如 OpenRouter)的问题是:你的请求数据先过第三方服务器,再过模型供应商。这意味着 prompt 内容、API key 模式、调用频率全部暴露给中间方。本地路由是唯一不损失隐私的方案。
协议转换的四个步骤
CC Switch 的本地路由做四件事:
- Codex 接管:CC Switch 把 Codex 的 live 配置改成
http://127.0.0.1:15721/v1,并强制wire_api = "responses" - 格式标识:Provider 配置里
meta.apiFormat = "openai_chat"告诉路由"这个上游是 Chat 协议" - 请求改写:路由把
/responses重写为/chat/completions,把 Responses 请求体转为 Chat 请求体 - 响应回转:上游返回 Chat 的 JSON 或 SSE,路由转回 Codex 能解析的 Responses 格式
这四步是单向不可见的——Codex 完全感知不到上游是 Chat 还是 Responses,只觉得"我请求,我收到响应"。
实操路径(DeepSeek 为例)
第一步:添加供应商
CC Switch 切到 Codex 标签,点加号,选 DeepSeek 预设。预设已经内置了:
- base URL:
https://api.deepseek.com(不带/v1,因为路径会在路由层补齐) - 默认模型:DeepSeek V4 Flash
- 模型菜单
- thinking/reasoning 参数
- 自动打开"需要本地路由映射"开关
只需填入 DeepSeek API Key,保存。
第二步:开本地路由
进入设置 → 路由 → 展开本地路由:
- 打开路由总开关(默认
127.0.0.1:15721) - 在"路由启用"中打开 Codex
接管后,CC Switch 自动把 Codex live config 指向本机路由。真实 DeepSeek Key 仍在 CC Switch 配置里,路由在转发时注入。
第三步:切供应商并重启 Codex
回到 Codex 供应商列表,点 DeepSeek 的"启用"。如果看到"需要路由"标记,说明这个供应商必须路由服务在运行时才能用。
切换后必须重启 Codex 进程。原因有两个:
- Codex 进程可能已经读过了旧的
~/.codex/config.toml - 模型目录
cc-switch-model-catalog.json生成后,Codex 需要新进程加载它
重启后用 /model 检查当前模型是不是 DeepSeek V4 Flash。
预设 vs 自定义
CC Switch 对 Chat 协议供应商有 8 家预设:
- DeepSeek
- Kimi
- MiniMax
- 硅基流动(SiliconFlow)
- Moonshot
- GLM
- Doubao
- StepFun
预设的好处是接口路径、模型菜单、thinking 参数都已经填好。优先用预设,不要手拼 base URL——很多人手拼时把 https://api.deepseek.com/chat/completions 整个填成 base URL,路由再拼 /chat/completions 就报 404。base URL 应该是服务根地址(如 https://api.deepseek.com),完整接口路径在路由层补。
只有预设里没有的供应商(如自建 vLLM、Together、Groq)才用自定义配置。自定义时记得把"API 格式"选为"OpenAI Chat Completions (需开启路由)"。
常见踩坑
Codex 报 404 找不到 /responses
- 检查
~/.codex/config.toml是不是指向http://127.0.0.1:15721/v1 - 如果指向真实供应商 URL(如 DeepSeek 官方),说明 Codex 没被接管——回 CC Switch 重做第二步
DeepSeek 上游报 404
- 确认用的是内置 DeepSeek 预设(不是自定义)
- 确认 Codex 路由已启用
- 自定义供应商才需要查 base URL 是否正确
/model 看不到 DeepSeek 模型
- 保存供应商后必须重启 Codex 进程——Codex 不热加载模型目录
开了路由但请求仍走错供应商
- 三处状态必须一致:Codex 标签当前供应商 = DeepSeek / 本地路由服务在跑 / "路由启用"中 Codex 开关打开
- 缺一个都不行
不能做的事
不要用 OpenAI 官方账号走本地路由。CC Switch 会阻止这种配置——用代理访问 OpenAI 官方 API 会被标记为"账号共享",可能触发封号。路由只用于第三方、聚合、协议转换场景。
协议分裂的判断
OpenAI Responses API 和 Chat Completions 不是会合并的两套协议——它们是两套产品:
- Chat Completions:稳定、向后兼容、所有供应商都支持
- Responses API:新的、内置 tool use、stateful、专为 Agent 设计
OpenAI 想用 Responses 替换 Chat,但所有第三方供应商不会跟着迁移。协议分裂是结构性的。未来 18 个月,所有 AI CLI 工具(Codex、Claude Code、Gemini CLI)都会需要类似的本地路由层。
CC Switch 3.16 这套模式会成为事实标准——配置指向本机、协议转换在透明中完成、Key 在用户控制下。这是 LLM 工具链走向成熟的标志。
适合谁 vs 不适合谁
适合
- 想用 Codex CLI 但官方 OpenAI 账号被封/没额度/用不起的人
- 需要在不同模型(DeepSeek/Kimi/Claude)之间快速切换做 benchmark
- 担心第三方代理泄露 prompt 内容的隐私敏感场景
- 多供应商 fallback——挂掉一个自动切下一个
不适合
- 只想用 ChatGPT 官方模型——直接用 Codex + OpenAI 账号更省事
- 不需要切换供应商——加一层本地代理是冗余
- 服务器/容器环境跑 Codex——
127.0.0.1在容器网络里有特殊含义,需要额外配置
Jason 没说的两件事
1. 流式响应的转换质量。Chat Completions 的 SSE 事件名(如 delta.content)和 Responses API 的事件名(如 output_text.delta)不完全一致。CC Switch 的转换在大部分场景下是对的,但tool use 的流式事件在复杂场景下会丢失中间状态(比如 tool call 的 partial json)。用 DeepSeek-V4 跑长 chain 的人需要小心。
2. Token 计数偏差。Responses API 的 usage 字段结构跟 Chat 不同。CC Switch 转换后会重算 token,但这种重算对reasoning token(如 o1/o3、DeepSeek-R1)不准确——这些模型的"thinking tokens"在 Responses API 里独立计费,在 Chat 协议里塞在 content 里。跨协议切换会让成本估算失真 10-20%。
结论
CC Switch 3.16 的本地路由设计,本质是把"协议不兼容"问题从用户视角移到工具内部。用户配置一次,多供应商透明切换,这是 LLM 工具链走向成熟的关键一步。
短期看,这意味着任何 Codex/Claude Code 用户都需要一个本地路由(或云端代理)来对接国内模型供应商。长期看,OpenAI 不会为了让第三方供应商舒服而放弃 Responses API——协议分裂是 2026 年的新常态,本地路由是新基建。