背景
最近 OpenAI Codex 发布了,效果惊艳但 API 费用不菲。我手头有 DeepSeek 的 API Key,想着通过 CC Switch 这个工具让 Codex 接入 DeepSeek,结果踩了一整天的坑。这篇文章记录完整的排查过程和最终解决方案。
环境信息
组件 | 版本 |
Codex Desktop | 0.136.0-alpha.2 |
CC Switch | 3.16.1 |
OS | Windows 11 Pro (26200) |
DeepSeek API | api.deepseek.com |
踩坑一:502 Bad Gateway
在 CC Switch 中配置好 DeepSeek 的 API Key 并切换后,Codex 直接报错:
unexpected status 502 Bad Gateway: Unknown error,url: http://127.0.0.1:15721/v1/responses
下面的是Codex的具体报错和我当时CC Switch的配置:
排查过程
CC Switch 的工作原理是启动一个本地代理(127.0.0.1:15721),接管 Codex 的配置文件 ~/.codex/config.toml,将请求路由到目标 API 提供商。
查看被接管的 config.toml:
model_provider = "custom" model = "deepseek-v4-pro" [model_providers] [model_providers.custom] name = "CC Switch DeepSeek Proxy" base_url = "http://127.0.0.1:15721/v1" wire_api = "responses" experimental_bearer_token = "cc-switch-local-proxy"关键字段 wire_api = "responses"。Codex 使用 OpenAI Responses API 格式(/v1/responses 端点),而 DeepSeek 只支持标准的 Chat Completions API(/v1/chat/completions 端点)。 从日志和抓包结果看,CC Switch 当时并未完成预期的 Responses → Chat Completions 协议转换,因此 DeepSeek 收到了不兼容的请求并返回 502。
请求链路:
Codex → CC Switch(15721) → DeepSeek API /v1/responses → 502 ❌
第一次尝试:改 wire_api
我尝试把 wire_api 从 "responses" 改为 "chat_completions",结果 Codex 直接报配置错误:
invalid configuration: unknown variant `chat_completions`,expected `responses` in `model_providers.custom.wire_api`结论:Codex 只认 wire_api = "responses",这个字段不能改。
第二次尝试:启用 CC Switch 本地路由
CC Switch 从 v3.16.0 开始内置了 Responses → Chat Completions 协议翻译功能,需要到 设置 → 路由 → 本地路由 中开启。但开启后依然 502,日志显示 CC Switch 的路由功能没有实际生效(数据库中没有产生路由相关的表和日志)。
踩坑二:模型名不匹配
既然 CC Switch 的路由不生效,我决定部署一个独立的协议桥接代理,绕过 CC Switch 直接处理协议翻译。使用 GitHub 上的开源项目 codex-deepseek,部署在 127.0.0.1:11435。
修改 config.toml 指向桥接代理:
base_url = "http://localhost:11435/v1" wire_api = "responses" experimental_bearer_token = "sk-你的DeepSeek密钥"用 Python 直接测试桥接代理,一切正常(200 OK,SSE 流式响应正确)。但 Codex 还是 502!
抓包分析——关键突破
我写了一个原始 TCP 抓包脚本,拦截 Codex 发出到桥接代理的请求,发现了惊人的事实——Codex 实际发送的请求体中:
{ "model": "gpt-5.4-mini", "instructions": "You are Codex...", ... }模型是 gpt-5.4-mini,不是 deepseek-v4-pro!
虽然 config.toml 里写的是 model = "deepseek-v4-pro",但 Codex 不认这个自定义模型名,直接用了自己的内部默认模型 gpt-5.4-mini。桥接代理把这个模型名原样发给 DeepSeek,DeepSeek 不认识,返回 502。
这才是真正的罪魁祸首。
下面我就把文件的关键片段在Trae里面展示
终极解决方案:两层修复
第一层:协议翻译
部署桥接代理 proxy.py,在 127.0.0.1:11435 上监听,将 Codex 的 Responses API 请求翻译为 DeepSeek 的 Chat Completions API 请求,并将响应翻译回去。
第二层:模型名映射
在桥接代理中添加模型名改写逻辑:
# 在 do_POST 中
body = json.loads(raw)
# 构建 chat 请求后
chat_body = built["chat_body"]
if chat_body.get("model", "") != _MODEL:
chat_body["model"] = _MODEL # 强制映射为 deepseek-v4-pro
这样无论 Codex 发送 gpt-5.4-mini 还是任何其他模型名,都会被映射为 deepseek-v4-pro。
最终请求链路
架设桥接代理(完整步骤)
1. 获取代码
从 GitHub 下载桥接代理(Python 标准库实现,无需 pip install):
git clone https://github.com/yangfei4913438/codex-deepseek # 或 git clone https://github.com/Nigel211/codex_deepseek_proxy2. 配置环境变量(.env)
api_key=sk-你的DeepSeek密钥 base_url=https://api.deepseek.com model=deepseek-v4-pro port=11435 timeout=30 is_deepseek=true3. 添加模型名映射
在 do_POST 方法中 build_chat_body(body) 执行后添加:
chat_body = built["chat_body"] if chat_body.get("model", "") != _MODEL: chat_body["model"] = _MODEL # 强制映射4. 启动
python proxy.py
5. 配置 Codex
修改 ~/.codex/config.toml,将 base_url 指向桥接代理:
model_provider = "custom" model = "deepseek-v4-pro" model_reasoning_effort = "medium" disable_response_storage = true [model_providers] [model_providers.custom] name = "DeepSeek Bridge Proxy" base_url = "http://localhost:11435/v1" wire_api = "responses" experimental_bearer_token = "sk-你的DeepSeek密钥"6. 重启 Codex
关闭所有 Codex 进程,重新启动即可。
注意事项
- 不要重启 CC Switch:CC Switch 每次启动都会覆盖 config.toml,把 base_url 改回 127.0.0.1:15721。如果需要在 CC Switch 中使用,可以在 CC Switch 中将 DeepSeek 提供商的端点 URL 改为 http://127.0.0.1:11435。
- 桥接代理需要常驻后台:可以把 python proxy.py 设为开机自启,或使用 nohup / Windows 任务计划程序保持运行。
- 模型选择器不会显示 DeepSeek:由于 Codex 不认自定义模型名,模型选择下拉框不会显示 deepseek-v4-pro。这是正常的,不影响实际使用——桥接代理会自动做模型名映射。
- CC Switch 版本要求:如果坚持只用 CC Switch,确保版本 ≥ 3.16.1 且开启了本地路由功能。但根据实测,即使开启也可能不生效。
总结
整个排查过程踩了三个坑:
坑 | 现象 | 根因 | 解方 |
协议不匹配 | 502 Bad Gateway | Codex 用 Responses API, | 部署协议翻译代理 |
wire_api 不可改 | Codex 配置报错 | Codex 只接受 responses 值 | 在代理层翻译, |
模型名不匹配 | 桥接代理 502 | Codex 发送 gpt-5.4-mini, | 代理层强制映射模型名 |
第三个坑是最隐蔽的——从日志、配置、文档上都看不出问题,必须抓包分析实际请求体才能发现。
如果你也遇到类似问题,建议先抓包看 Codex 实际发送了什么,这比盲目改配置高效得多。
当然,我也希望这篇文章能帮助到你,也希望大家在评论区里友好交流,共同进步!
相关资源
- Codex DeepSeek Bridge Proxy (yangfei4913438):https://github.com/yangfei4913438/codex-deepseek
- Codex DeepSeek Proxy (Nigel211):https://github.com/Nigel211/codex_deepseek_proxy
- CC Switch 本地路由教程:https://segmentfault.com/a/1190000047807394