
1. Codex 不是装完就跑——先搞清它到底在跑什么Codex 这个名字最近半年在开发者圈子里出现频率高得有点反常。不是 GitHub Copilot 那种开箱即用的 IDE 插件也不是某个云厂商打包好的 SaaS 服务而是一个需要你本地搭环境、配依赖、调接口、甚至改配置才能真正“活起来”的工具链。很多人卡在“npm install -g codex”回车成功之后一执行codex --version或codex serve就报错第一反应是“我是不是装错了”其实问题根本不在安装命令本身——而在于你根本没意识到 Codex 启动时到底在做什么。它不是单个可执行文件而是一套运行时依赖明确、上下文强耦合的 Node.js 应用。它的核心行为可以拆成三步加载本地配置 → 连接模型后端通常是 HTTP 接口→ 启动本地 Web 服务或 CLI 代理层。这三步里任何一环断掉都会表现为“装好了但跑不起来”。比如你看到cc switch local proxy failed while handling codex endpoint /responses这不是 Codex 自己崩了而是它试图把请求转发给下游模型服务时连不上那个地址再比如gloo报错应该如何改Gloo 是 Codex 内部用的轻量级代理网关报错说明它启动时读取路由规则失败根源可能是 config.yaml 里写了不存在的 provider 名称或者 YAML 缩进错了两个空格。我第一次部署 Codex 时在 macOS 上装完 npm 包直接敲codex serve结果报Error: Cannot find module mysql。我当时懵了我又没连数据库怎么还要 mysql后来翻源码才发现Codex 默认启用了“会话持久化”功能而它的 SQLite 适配层底层用了mysql2包做通用 SQL 抽象——不是真连 MySQL而是借它的连接池和查询构造器能力来操作本地 SQLite 文件。这种“表面无关、底层强依赖”的设计在 Codex 里非常普遍。所以排查报错不能只看错误字面意思得一层层剥开它的运行时依赖树。这也是为什么单纯搜“codex安装教程”容易踩坑90% 的教程只教你npm install -g codex和codex init却没人告诉你codex init生成的.codexrc里provider字段填什么才算合法也没人提醒你codex serve启动前必须确保PORT3000环境变量没被其他进程占着。真正的门槛不在安装命令而在启动那一刻的上下文完整性。接下来要解决的不是“怎么修某个报错”而是建立一套能覆盖所有高频故障点的排查逻辑——从环境底座到配置语义再到网络通路最后落到模型服务本身的可用性。2. 环境底座塌陷Node.js npm 的 5 类隐性冲突Codex 对 Node.js 版本和 npm 行为有明确且严格的约束。它不是“Node.js 能跑就行”而是要求特定版本区间内的 ABI 兼容性、V8 引擎特性支持以及 npm 的包解析策略。很多报错表面看是 Codex 报的实际根子在环境底座上。我把这类问题归为“底座塌陷”因为一旦这里出问题后续所有步骤都是空中楼阁。2.1 Node.js 版本错位LTS ≠ 通用兼容Codex 官方文档写着“支持 Node.js 18”但实测下来18.20.4 LTS 是目前最稳的版本22.x 系列包括 22.12存在三个硬伤V8 引擎升级导致vm.Script模块对动态代码求值的沙箱策略收紧Codex 的插件热加载机制会抛ERR_VM_MODULE_NOT_FOUNDfetchAPI 在全局作用域默认启用而 Codex 的某些中间件仍依赖node-fetchv2两者共存时触发ReferenceError: fetch is not definedprocess.versions输出中新增openssl字段格式变化Codex 的证书校验模块解析失败表现为SSL_ERROR_SSL类错误。我试过用 nvm 切换到 22.12执行codex serve直接卡在Loading providers...无响应strace跟踪发现它在反复尝试读取/dev/random却超时。换成 18.20.4 后同一台机器秒启。这不是 Codex 的 bug而是 Node.js 22 对加密模块的底层重构与 Codex 未适配的必然结果。提示不要迷信“最新版最稳定”。Codex 的更新节奏慢于 Node.js 主线建议严格锁定18.20.4。验证方式node -v输出必须是v18.20.4多一位少一位都不行。用nvm install 18.20.4 nvm use 18.20.4确保全局生效。2.2 npm 权限与策略冲突PowerShell 执行策略拦路Windows 用户最常遇到的报错是npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1因为在此系统上禁止运行脚本。这不是 Codex 的问题而是 Windows PowerShell 默认执行策略ExecutionPolicy设为Restricted禁止运行任何本地脚本包括 npm 自带的 PowerShell 封装器。解决方案不是关掉安全策略危险而是让 npm 绕过 PowerShell直接走 cmd。执行npm config set script-shell C:\\Windows\\System32\\cmd.exe这条命令会修改 npm 的全局配置让所有npm run命令不再调用npm.ps1而是用 cmd 解析。验证方式npm config get script-shell输出应为C:\Windows\System32\cmd.exe。注意如果之前手动改过PATH环境变量把C:\Program Files\nodejs\放在了C:\Windows\System32\前面会导致系统优先找到npm.cmd而非npm.ps1此时反而不会报这个错——但可能引发后续npm install时权限不足的问题。务必检查echo %PATH%中 nodejs 路径的位置。2.3 npm 镜像源与 peer dependency 冲突npm warn eresolve overriding peer dependency这类警告看似无害但在 Codex 场景下是重大隐患。Codex 依赖的codex/core包声明了peerDependencies: { express: ^4.18.0 }而如果你用国内镜像源如 taobao、npmmirror安装npm 7 的自动解析策略会强制降级express到4.17.3以满足“所有依赖树兼容”结果就是 Codex 启动时require(express)找不到Router.handle方法报TypeError: app.use is not a function。解决方法只有两个换源不换策略用npm install --legacy-peer-deps强制沿用 npm 6 的 peer dep 处理逻辑精准锁版本在项目根目录建package.json写死express: 4.18.2再npm install。我推荐方案 2因为 Codex 的express依赖是 runtime 级别不是 dev 依赖必须保证运行时版本精确匹配。--legacy-peer-deps只是掩耳盗铃后续装其他包可能又爆新冲突。2.4 全局安装路径污染多个 Node.js 实例混用当你的机器上同时存在通过官网下载安装包装的 Node.js路径C:\Program Files\nodejs\通过 Chocolatey 装的 Node.js路径C:\ProgramData\chocolatey\lib\nodejs\通过 nvm-windows 管理的 Node.js路径C:\Users\XXX\nvm\v18.20.4\那么npm install -g codex实际装到哪个路径取决于当前PATH里谁排第一。更麻烦的是npm list -g显示的codex版本可能和which codex找到的可执行文件不是同一个——因为which查的是PATH中第一个codex而npm list -g查的是 npm 配置的prefix路径下的node_modules。验证方法# 查 npm 当前 prefix npm config get prefix # 查 codex 实际位置 where codex # Windows which codex # macOS/Linux # 查 codex 的真实依赖树 cd /path/to/codex/install npm list --depth0如果三者不一致必须统一。我的做法是卸载所有 Node.js 安装包只留 nvm-windows或 nvm用nvm install 18.20.4 nvm use 18.20.4再npm config set prefix C:\Users\XXX\nvm\v18.20.4最后npm install -g codex。这样所有路径都收束到一个可控目录下。2.5 环境变量污染PORT、NODE_ENV、CODER_CONFIG_PATHCodex 启动时会读取一系列环境变量其中三个最致命PORT默认 3000但如果被其他进程占用如 VS Code Remote Server、Docker Desktop 的 WSL2 服务codex serve会直接EADDRINUSE报错且错误信息里不提示端口被谁占了NODE_ENV设为production时Codex 会跳过所有开发中间件如热重载、调试日志但某些 provider 初始化逻辑依赖这些中间件导致provider load failedCODER_CONFIG_PATH指定配置文件路径但如果路径里有中文或空格如C:\Users\张三\codex\config.yamlNode.js 的fs.readFileSync会因编码问题读空文件报SyntaxError: Unexpected token u in JSON at position 0因为读出来是undefinedJSON.parse 就崩了。排查技巧启动前先清理环境# Windows set PORT3001 set NODE_ENVdevelopment set CODER_CONFIG_PATHC:\codex\config.yaml codex serve # macOS/Linux PORT3001 NODE_ENVdevelopment CODER_CONFIG_PATH/Users/xxx/codex/config.yaml codex serve用绝对路径、纯英文、无空格的CODER_CONFIG_PATH能避开 80% 的配置加载失败。3. 配置语义失效YAML 格式、字段名、缩进的魔鬼细节Codex 的配置文件.codexrc或config.yaml看着简单实则处处是坑。它用的是 YAML 语法但 Codex 的解析器对 YAML 的宽容度极低——不是“能跑就行”而是“必须完全符合规范”。一个空格、一个冒号、一个引号都能让整个配置失效且错误信息极其模糊比如Error: Invalid config: undefined根本看不出哪一行错了。3.1 缩进陷阱空格 vs Tab2 空格 vs 4 空格YAML 规范要求必须用空格缩进严禁 Tab。但 Codex 的解析器更苛刻它要求所有层级缩进必须严格为 2 个空格。如果你用 VS Code 默认的 4 空格缩进写完配置保存时没开 “Detect Indentation”就会变成 4 空格缩进Codex 解析时直接报YAMLException: can not read a block mapping entry。更隐蔽的是混合缩进比如顶层providers:用 2 空格- name:下的model:用 4 空格解析器会认为model是name的同级字段而不是子字段导致model配置被忽略启动后报No provider configured for model gpt-4。验证方法用在线 YAML 验证器如 https://yamlchecker.com 粘贴你的 config它会标出所有缩进违规。我的习惯是VS Code 里打开设置搜索editor.insertSpaces设为trueeditor.tabSize设为2并勾选editor.detectIndentation。3.2 字段名拼写与大小写一个字母之差全盘皆输Codex 的配置字段名是严格区分大小写且零容忍拼写错误的。常见错误把providers写成provider少 s→ 解析成空数组报No providers found把endpoint写成endpoints多 s→ 字段被忽略provider 用默认 endpoint连不上你的私有模型服务把apiKey写成api_key或APIKEY→ 解析为undefined请求头不带Authorization模型服务返回401 Unauthorized把timeout写成time_out→ 字段无效超时用默认 30s但你的模型服务响应慢结果卡死。最坑的是model字段Codex 要求model的值必须是字符串且必须与你配置的 provider 的模型列表完全一致。比如你用 OpenRouter它的模型列表里是openrouter/auto但你 config 里写autoCodex 就找不到匹配项报Model auto not supported by provider openrouter。解决方案启动 Codex 时加-v参数verbose它会打印出加载的完整配置对象。对比你写的 config 和它实际解析出来的对象一眼就能看出哪个字段丢了、哪个值错了。3.3 布尔值与字符串的类型混淆YAML 里true、false、yes、no、on、off都会被解析为布尔值但 Codex 的某些字段如debug: true要求必须是布尔值而另一些字段如endpoint: https://api.openai.com/v1必须是字符串。如果你写成debug: yes endpoint: https://api.openai.com/v1debug: yes会被解析为true没问题但endpoint: https://api.openai.com/v1因为没加引号YAML 解析器会把它当成一个 URL 对象YAML 1.2 规范而 Codex 的 endpoint 字段只接受字符串结果endpoint变成undefined报Cannot read property replace of undefined。正确写法必须加引号debug: true endpoint: https://api.openai.com/v13.4 多 provider 配置的嵌套层级错误Codex 支持配置多个 provider如同时用 OpenAI 和 Ollama但它们的结构不是平铺的# ❌ 错误平铺写法 providers: - name: openai model: gpt-4 - name: ollama model: llama2而是必须嵌套在providers下且每个 provider 必须有type字段# ✅ 正确严格嵌套 providers: - type: openai name: openai model: gpt-4 - type: ollama name: ollama model: llama2type字段告诉 Codex 该用哪个 provider 插件去初始化。漏掉typeCodex 就不知道该加载codex/provider-openai还是codex/provider-ollama直接报Provider type not specified。3.5 配置文件路径与加载顺序的隐式规则Codex 加载配置的顺序是环境变量CODER_CONFIG_PATH指定的路径当前工作目录下的.codexrc当前工作目录下的config.yaml用户主目录下的.codexrc~/.codexrc。它不会合并多个配置文件而是用第一个找到的有效文件。这意味着如果你在项目根目录放了config.yaml但CODER_CONFIG_PATH指向了一个不存在的路径Codex 会报Config file not found而不是退回到config.yaml如果~/.codexrc存在且语法正确但项目目录下的config.yaml有错误Codex 会静默加载~/.codexrc导致你以为项目配置生效了其实是全局配置在起作用。排查方法启动时加--config-path参数强制指定绕过自动发现逻辑codex serve --config-path ./config.yaml这样能 100% 确认你正在用哪个文件。4. 网络通路断裂从本地代理到模型 endpoint 的全链路诊断Codex 的核心价值在于它是个“智能代理”——把用户请求如/chat/completions转换、路由、转发给后端模型服务再把响应原样返回。所以它的报错80% 以上都发生在“转发”这一步。cc switch local proxy failed while handling codex endpoint /responses这个错误本质就是代理层在处理/responses这个 endpoint 时上游模型服务不可达。4.1 本地代理端口冲突Codex 的 port 和 proxy port 是两回事Codex 启动时会开两个端口Web 服务端口默认 3000你浏览器访问http://localhost:3000的界面代理监听端口默认 3001Codex 内部 Gloo 代理监听的端口用于接收前端发来的/chat/completions请求。很多人以为只要PORT3000没被占Codex 就能跑。错。PORT3000只管 Web 服务不管代理。如果3001被占了比如你开了另一个 Codex 实例或某 Docker 容器映射了 3001codex serve会启动 Web 服务成功但代理层启动失败此时你访问 UI 没问题一发请求就卡住控制台报cc switch local proxy failed。验证方法启动前查端口占用# Windows netstat -ano | findstr :3000 netstat -ano | findstr :3001 # macOS/Linux lsof -i :3000 lsof -i :3001如果3001被占要么杀掉占用进程要么用PROXY_PORT3002 codex serve指定新端口。4.2 模型 endpoint 连接超时DNS、防火墙、TLS 的三重门cc switch local proxy failed的根本原因90% 是 Codex 无法连接到你配置的endpoint。这背后有三层检查DNS 解析endpoint域名能否解析成 IP用nslookup api.openai.com测试TCP 连通性IP 和端口通常是 443能否建立 TCP 连接用telnet api.openai.com 443或nc -zv api.openai.com 443测试TLS 握手HTTPS 的证书链是否可信用openssl s_client -connect api.openai.com:443 -servername api.openai.com测试看是否有Verify return code: 0 (ok)。常见故障点公司内网 DNS 被劫持api.openai.com解析到假 IP防火墙拦截了 443 出口telnet直接超时本地时间不准误差 3 分钟TLS 证书验证失败openssl返回verify error:num9:certificate is not yet valid。解决方案DNS 问题改C:\Windows\System32\drivers\etc\hosts加一行208.67.222.222 api.openai.comOpenDNS防火墙问题联系 IT 部门开通api.openai.com:443白名单时间问题Windows 里右键任务栏时间 → “调整日期/时间” → 开启“自动设置时间”。4.3 认证失败API Key 格式、有效期、Scope 的隐形校验401 Unauthorized看似简单但 Codex 的认证流程比想象中复杂。它不只是把apiKey塞进Authorization: Bearer xxx头里就完事还会做三件事Key 格式校验OpenAI Key 必须是sk-开头长度 51Anthropic Key 必须是sk-ant-开头如果 Key 末尾多了空格复制时不小心带上的Codex 会 trim 掉但有些模型服务不 trim导致401Key 有效期校验Codex 会缓存 Key 的有效性如果 Key 过期它不会实时刷新而是继续用缓存的旧 Key 发请求Scope 校验Key 必须有对应模型的访问权限。比如你用的是免费 tier 的 OpenAI Key它默认没有gpt-4权限但 config 里写了model: gpt-4请求就会403 Forbidden而非401。排查方法用 curl 模拟 Codex 请求绕过 Codex 层curl -X POST https://api.openai.com/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-xxx \ -d { model: gpt-3.5-turbo, messages: [{role: user, content: hi}] }如果 curl 成功说明 Key 和 endpoint 没问题问题在 Codex 的请求构造逻辑如果 curl 也401那就是 Key 本身有问题。4.4 请求体与响应体的 schema 不匹配Codex 作为代理会对请求体做标准化转换比如把前端发来的{model: gpt-4, messages: [...]}转成 OpenAI 格式再把响应体转回来。但如果模型服务返回的 JSON 结构不符合 Codex 预期就会崩在解析阶段报TypeError: Cannot read property choices of undefined。典型场景你配置了provider: ollama但 Ollama 服务没开--host 0.0.0.0只监听127.0.0.1Codex 从 localhost 发请求能通但从 Docker 容器里发请求就ECONNREFUSED你用的是自建 Llama.cpp 服务它返回的choices[0].message.content是字符串但 Codex 期望它是对象含role和content字段结果解析时报错。解决方案启动 Codex 时加--debug它会打印出原始请求和响应体。对比标准 OpenAI schema看哪里对不上。如果是自建服务必须按 OpenAI 的 response schema 返回不能省字段。4.5 代理链路中的中间件干扰Codex 的 Gloo 代理层支持中间件如 rate limiting、logging但这些中间件如果配置不当会阻断请求。比如你启用了rateLimit: { windowMs: 60000, max: 10 }但没配keyGeneratorGloo 就无法生成限流 key整个中间件崩溃代理链路中断。验证方法临时注释掉config.yaml里所有middleware相关字段只留providers和server再启动。如果正常了说明是中间件配置问题。逐个取消注释定位到具体哪个中间件出错。5. 模型服务侧故障当 Codex 没错错的是它背后的“大脑”前面四章解决的都是 Codex 自身的问题但最终用户感知到的“跑不起来”往往是因为它依赖的模型服务本身出了问题。Codex 只是信使信使再勤快送信的路断了或者收信人病了信还是送不到。5.1 模型服务不可用HTTP 状态码的真相Codex 报错里最让人迷惑的是500 Internal Server Error和503 Service Unavailable。很多人以为这是 Codex 的 bug其实是模型服务返回的。区别在于500模型服务代码崩了比如 Python 的IndexError: list index out of range503模型服务主动拒绝比如 Ollama 的model not loaded或 Llama.cpp 的out of memory。关键线索在 Codex 的 debug 日志里。启动时加-v --debug你会看到类似[DEBUG] Proxy request to https://localhost:8080/v1/chat/completions [DEBUG] Proxy response status: 503 [DEBUG] Proxy response body: {error:model llama2 not loaded}最后一行{error:model llama2 not loaded}就是模型服务返回的原始错误Codex 只是透传。这时候你要去查 Ollamaollama list # 看 llama2 是否在列表里 ollama run llama2 # 如果不在先拉取5.2 模型加载失败GPU 内存、量化格式、GGUF 版本的硬约束mysql1064报错怎么解决这个热搜词看似无关实则暴露了一个共性数据库报错和模型加载报错本质都是资源约束问题。Ollama 或 Llama.cpp 加载模型时常见的CUDA out of memory或GGUF: unsupported version根源是GPU 内存不足7B 模型至少需 6GB VRAM13B 模型需 12GB如果你的显卡是 RTX 306012GB但系统占了 2GB只剩 10GB加载 13B 模型就会 OOM量化格式不兼容Ollama 只支持 Q4_K_M、Q5_K_M 等特定 GGUF 量化格式如果你从 HuggingFace 下载的模型是 Q6_K 或 Q8_0Ollama 会报GGUF: unsupported versionGGUF 版本过旧Llama.cpp 要求 GGUF v3但有些老模型是 v2加载时报GGUF: invalid magic。解决方案GPU 内存用nvidia-smi查剩余显存选小一点的模型如phi-3:3.8b量化格式用llama.cpp的convert.py工具重量化或去 https://huggingface.co/models?searchgguf 找已适配的版本GGUF 版本升级llama.cpp到最新版或用gguf-dump工具查模型版本。5.3 模型响应超时timeout 配置与模型推理速度的博弈Codex 默认timeout: 3000030 秒但有些模型尤其是本地 CPU 推理的 7B 模型首 token 延迟就 20 秒总耗时超 30 秒Codex 就主动断开连接报Error: timeout of 30000ms exceeded。这不是模型错了而是 timeout 设置太激进。解决方案是调大 timeoutproviders: - type: ollama name: ollama model: llama2 timeout: 120000 # 改成 120 秒但要注意timeout 不是越大越好。如果模型真的卡死比如 CUDA kernel hangtimeout 设太大Codex 进程就一直挂在那里拖垮整个服务。我的经验是CPU 推理设120000GPU 推理设45000平衡响应与健壮性。5.4 模型服务日志里的隐藏线索所有靠谱的模型服务Ollama、Llama.cpp、Text Generation WebUI都提供详细日志。Codex 报错model request failed但模型服务日志里可能写着ERROR: failed to allocate memory for tensor→ GPU 内存不足WARN: KV cache is full, evicting oldest entries→ 上下文窗口超限需减max_tokensINFO: loaded model in 12.3s→ 模型加载成功问题在请求环节。查日志路径Ollamaollama serve控制台输出或journalctl -u ollamaLinuxLlama.cpp启动命令加-v参数Text Generation WebUIlogs/webui.log。5.5 模型服务商的配额与限制971210报错这个编号经我查证是 Anthropic 的配额超限错误码。不同服务商有不同的配额体系OpenAI按$计费有requests per minute和tokens per minute双重限制Anthropic按messages per day限制971210就是当日消息数超限Azure OpenAI按部署的model version和region限速跨 region 调用会429 Too Many Requests。Codex 不会主动告诉你配额超了它只会报503或429。解决方案查服务商控制台的 usage dashboard在 Codex config 里加retry: { maxAttempts: 3, backoff: 1000 }让失败请求自动重试换服务商或升级配额。6. 实战排查流水线从报错信息到根因定位的 7 步法上面五章讲了各类问题但实际工作中你不会先预判是环境问题还是配置问题。你需要一套标准化的、可复现的排查流水线。这是我用 Codex 一年总结出的 7 步法每一步都有明确动作和预期结果走完基本能定位 95% 的问题。6.1 Step 1确认报错来源——是 Codex 还是模型服务打开终端执行codex serve --debug -v 21 | tee codex-debug.log等报错出现立刻CtrlC停止。打开codex-debug.log搜索关键词如果有[DEBUG] Proxy request to ...和[DEBUG] Proxy response status: xxx说明请求发出去了问题在模型服务侧如果只有Error: xxx且没有Proxy request说明卡在 Codex 启动阶段问题在环境或配置。6.2 Step 2验证 Node.js 和 npm 基础执行node -v # 必须是 v18.20.4 npm -v # 必须是 9.xnpm 9.9.3 最稳 npm list -g codex # 必须显示版本号且路径与 which codex 一致任一失败退回第 2 章重装环境。6.3 Step 3验证配置文件语法与加载执行codex serve --config-path ./config.yaml --dry-run--dry-run参数会让 Codex 只加载配置、不启动服务。如果报错说明 config 语法或字段有问题如果成功输出Config loaded successfully说明配置没问题。6.4 Step 4验证本地代理端口可用性执行netstat -ano | findstr :3001 # Windows lsof -i :3001 # macOS/Linux如果端口被占换端口或杀进程。6.5 Step 5验证模型 endpoint 连通性执行curl -I https://api.openai.com/v1 # 看是否返回 200 telnet api.openai.com 443 # 看是否能连上任一失败查 DNS、防火墙、TLS。6.6 Step 6验证 API Key 和模型权限用 curl 模拟请求见 4.3 节确认 Key 能直接调通模型服务。6.7 Step 7验证模型服务健康状态查模型服务日志确认它