Codex CLI + DeepSeek 踩坑记:半天、4块钱、7个坑

99 阅读3分钟

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
                                                              自动启动(端口检测)

避坑清单

#
1Node v24 不兼容nvm use 20.19.0
2codex-proxy 404base_url 去掉 /v1
3503 断路器熔断换 mimo2codex
4Python httpx 不走代理换 Node.js 方案(mimo2codex 继承系统代理)
5代理路径结构不一致不同代理的 /responses 位置不同,看文档
6重启后代理消失SessionStart hook 自动拉起
7AI 不能自修改启动 hook手动编辑 settings.json

成本

  • DeepSeek API 流量:约 ¥4(测试、重试、调试)
  • 时间:半天
  • 最终可用:✅

美好需要创造 · 2026.06.14 · 昆明