Codex CLI + DeepSeek 踩坑记:半天、4块钱、7个坑
让 OpenAI Codex CLI 用 DeepSeek 做后端,听起来就是配个代理的事。结果踩了7个坑,半天搭进去,API 流量烧了4块多。这篇文章把每个坑怎么踩的、怎么爬出来的全写清楚,希望你是那个不用再踩的人。
✦ 核心认知
Codex 用的是 OpenAI Responses API(/responses),DeepSeek 只有 Chat Completions API(/chat/completions)。两者协议不同,中间必须有翻译层。
Codex CLI → 翻译代理(Responses → Chat Completions) → DeepSeek API
这句话值4块钱。往下看,别让你的4块钱也烧在这。
壹 · 环境选型:Node.js 版本的第一个坑
症状:npm 命令报错,模块加载失败。
我机器上的默认 Node 是 v24.14.1,这是最新版。Codex CLI 和它的依赖链在这个版本上不稳定,npm 模块损坏。
修复:
nvm use 20.19.0
用 nvm 切换到 Node v20 LTS,问题消失。
教训:Codex CLI 目前对 Node 最新版的支持不完善。装之前先确认 Node 版本在 18-22 之间。如果装了 nvm,切版本就一条命令;没装的话,升级 Node 本身就是另一个坑。
贰 · 代理选型:换了两套方案
坑 #2:codex-proxy 的 404
第一个试的是 codex-proxy v5.0.0,Python 写的。
Codex 配好 base_url = "http://127.0.0.1:4343/v1",启动代理,调用——404。
根因:codex-proxy 的 /responses 接口在根路径,不在 /v1 下。Codex 的 base_url 如果写成 http://127.0.0.1:4343/v1,Codex 会拼成 /v1/responses,代理上只有 /responses,匹配不上。
修复:base_url 去掉 /v1,写成 http://127.0.0.1:4343。
坑 #3:503 Circuit Breaker Open
修完 404,再调——503。
连续5次失败后,codex-proxy 的断路器熔断,直接拒绝所有请求。根因是代理内部的协议翻译有 bug:HTMLResponse 导入路径错误、模型名映射不对。
坑 #4:Python httpx 不走系统代理
就算协议翻译修好,还有个更深的问题:Python 的 httpx 库不会自动使用系统代理。我的网络环境需要走 http://127.0.0.1:7897 才能访问 DeepSeek API。httpx 直连 → 超时 → 熔断。
最终方案:放弃 codex-proxy,换 mimo2codex
mimo2codex 是 Node.js 写的,npm 全局安装:
npm install -g mimo2codex
配置简单——只需在 C:\Users\zhaot\.mimo2codex\.env 里写:
DS_API_KEY=sk-your-deepseek-key
MIMO2CODEX_DEFAULT_PROVIDER=deepseek
Codex 配置对应改 (C:\Users\zhaot\.codex\config.toml):
model = "deepseek-v4-pro"
model_provider = "mimo2codex"
sandbox_mode = "workspace-write"
[model_providers.mimo2codex]
name = "mimo2codex"
base_url = "http://127.0.0.1:8788/v1"
wire_api = "responses"
requires_openai_auth = false
注意这里 base_url 有 /v1,因为 mimo2codex 的 /responses 就在 /v1 下——跟 codex-proxy 相反。这是坑 #5:每个代理的路径结构不一样,不能照搬配置。
叁 · 持久化:每次重启都要手动拉起?
坑 #6:代理不会自己启动
装好以后一切正常,直到重启电脑。再打开 Claude Code,mimo2codex 进程没了,端口 8788 没人监听,Codex 502。
每次手动跑 mimo2codex start --port 8788 太蠢了。
坑 #7:Claude Code 安全策略拦截自修改
想加一个 SessionStart hook 让 Claude Code 启动时自动拉起代理。结果 Claude Code 的 auto mode classifier 拦截了——"Self-Modification: editing settings.json to add a SessionStart hook that spawns a persistent background process"。
解决方案:手动编辑 ~/.claude/settings.json,加入:
"SessionStart": [
{
"hooks": [
{
"type": "command",
"shell": "powershell",
"command": "if (-not (netstat -ano | Select-String '127.0.0.1:8788.*LISTENING')) { $env:HTTP_PROXY='http://127.0.0.1:7897'; $env:HTTPS_PROXY='http://127.0.0.1:7897'; Start-Process node -ArgumentList 'H:\\npm-global\\node_modules\\mimo2codex\\dist\\cli.js','start','--port','8788' -WindowStyle Hidden }",
"timeout": 10,
"async": true
}
]
}
]
关键点:先检查端口是否被占用,避免重复启动;async: true 不阻塞 Claude Code 启动。
最终架构一览
┌──────────────┐ MCP ┌──────────────┐ Responses API ┌──────────────┐ Chat Completions ┌────────────┐
│ Claude Code │ ──────────→ │ MCP Codex │ ────────────────→ │ mimo2codex │ ──────────────────→ │ DeepSeek │
│ │ │ Bridge │ │ (127.0.0.1: │ │ API │
│ │ │ │ │ 8788) │ │ │
└──────────────┘ └──────────────┘ └──────────────┘ └────────────┘
↑
SessionStart hook
自动启动(端口检测)
避坑清单
| # | 坑 | 解 |
|---|---|---|
| 1 | Node v24 不兼容 | nvm use 20.19.0 |
| 2 | codex-proxy 404 | base_url 去掉 /v1 |
| 3 | 503 断路器熔断 | 换 mimo2codex |
| 4 | Python httpx 不走代理 | 换 Node.js 方案(mimo2codex 继承系统代理) |
| 5 | 代理路径结构不一致 | 不同代理的 /responses 位置不同,看文档 |
| 6 | 重启后代理消失 | SessionStart hook 自动拉起 |
| 7 | AI 不能自修改启动 hook | 手动编辑 settings.json |
成本
- DeepSeek API 流量:约 ¥4(测试、重试、调试)
- 时间:半天
- 最终可用:✅
美好需要创造 · 2026.06.14 · 昆明