Codex CLI + config.yaml 配置踩坑实录:provider 字段和 api_key 优先级,文档没说清的两个坑我填了三遍
上周三我想把 Codex CLI 接到项目里替代部分 Claude Code 的工作流,结果光一个 config.yaml 就来回改了三遍才跑通。问题出在两个地方:provider 的枚举值拼写(openai 和你以为的 openai-compatible 行为完全不一样),以及 api_key 到底读环境变量还是读配置文件——官方文档对这俩的优先级描述基本等于没写。这篇把我踩的坑和最终能用的最小配置模板都贴出来,省得你也折腾半天。
这篇适合谁
- 刚装好 Codex CLI,跑第一条命令就报
401 Incorrect API key provided的 - 想把 Codex CLI 接到非 OpenAI 官方端点(Azure、聚合网关等),不确定 provider 怎么填的
- 从 Claude Code 或 Cursor 切过来,习惯了改 base_url 就能用,结果发现 Codex 的配置逻辑不太一样
- 想在团队里统一 config.yaml 模板,避免每个人踩一遍同样的坑
整体流程
前置条件:Codex CLI 要求 Node.js ≥ 22,安装前先确认版本:
node --version # 需要 v22.0.0 或更高
如果版本不够,用 nvm 升级:nvm install 22 && nvm use 22。
- 安装 Codex CLI(一行 npm 命令)
- 理解配置文件结构(全局
~/.codex/config.yaml) - 正确填写 provider 字段(这是第一个坑)
- 搞清楚 api_key 的读取优先级(这是第二个坑)
- 贴一个最小可用模板,直接抄
- 验证能跑通
graph TD
A[npm install -g @openai/codex] --> B[创建 ~/.codex/config.yaml]
B --> C{provider 字段怎么填?}
C -->|直连 OpenAI| D[provider: openai]
C -->|第三方端点| E[provider: openai 但改 baseURL]
E --> F{api_key 从哪读?}
D --> F
F -->|环境变量| G[export OPENAI_API_KEY=sk-xxx]
F -->|config.yaml 里写死| H[providers.openai.apiKey]
G --> I[codex 'your task']
H --> I
先说结论
| 坑点 | 你以为的写法 | 实际正确写法 |
|---|---|---|
| provider 接第三方端点 | provider: openai-compatible |
不存在这个枚举值,用 openai + 自定义 baseURL |
| provider 接 Azure | provider: azure |
不存在独立的 azure 枚举值,用 openai + 自定义 baseURL 指向 Azure 端点 |
| api_key 优先级 | 配置文件优先 | 环境变量 > 配置文件,且环境变量名必须匹配 envKey 字段 |
| baseURL 末尾斜杠 | 加不加都行 | 不加 /v1 后缀,Codex 自己拼 |
第一步:安装
npm install -g @openai/codex
装完跑一下确认在 PATH 里:
codex --help
如果报 Cannot find module '@openai/codex',大概率是 npm 全局目录没加进 PATH。macOS 用 nvm 的人经常遇到这个。
第二步:provider 字段——第一个大坑
打开(或新建)~/.codex/config.yaml,你会看到一个 providers 段。我一开始想当然写了个 openai-compatible,因为 Cline 和 Cherry Studio 都有这个选项嘛。结果 Codex CLI 直接忽略了整个配置块,fallback 到默认行为,然后因为没读到我配的 baseURL 就去请求 api.openai.com,网络不通,报了个:
APIConnectionError: Connection error.
这个报错信息完全没提示是 provider 写错了,我排查了快一个小时才定位到。
正确做法:Codex CLI 的 provider 枚举值目前只认这几个——openai、anthropic、gemini、ollama 等官方名称,没有 openai-compatible 或 azure 这样的独立枚举值。想接第三方端点(包括 Azure OpenAI、各类聚合网关),provider 还是写 openai,然后在对应 provider 块里覆盖 baseURL 指向你的实际端点。
providers:
openai:
baseURL: https://your-gateway-or-azure-endpoint/v1
envKey: OPENAI_API_KEY
Azure OpenAI 补充说明:Azure 的端点格式通常是
https://<resource-name>.openai.azure.com/openai/deployments/<deployment-name>,且模型名需要填写你在 Azure 门户里创建的部署名,而不是 OpenAI 的原始 model ID(比如部署名可能是my-gpt4o而不是gpt-4o)。如果觉得这套映射麻烦,走支持 Azure 的聚合网关再转 OpenAI 兼容格式会省事一些。
baseURL 不要带末尾斜杠,也不要自己再拼 /chat/completions,Codex 内部会处理路径。
第三步:api_key 优先级——第二个大坑
这个坑更隐蔽。config.yaml 里有个 envKey 字段,它的意思是"去读哪个环境变量的值作为 API Key",而不是"在这里填 Key 的值"。
优先级实测结果(建议用 codex --version 确认你当前版本,不同版本行为可能有差异):
- 环境变量(
envKey指定的那个变量名)—— 最高优先级 - 配置文件里的
apiKey字段(如果你硬写了的话)—— 次优先级 - 都没有 → 报错
OPENAI_API_KEY is not set
我踩的坑是:我在 .zshrc 里 export 了一个过期的 Key,然后在 config.yaml 里又写了一个新 Key。结果 Codex 读的是环境变量里那个过期的,直接 401:
AuthenticationError: 401 Incorrect API key provided
我改了三遍 config.yaml 都没用,最后才反应过来是环境变量在"抢"优先级。
建议:二选一,别混用。要么只用环境变量(团队协作时每个人自己管自己的 Key),要么只写 config.yaml(个人机器图方便)。混用迟早出事。
最小可用 config.yaml 模板
直接抄这个,改两个值就能跑:
model: o4-mini
approvalMode: auto-edit
字段名说明:配置文件中推荐使用 camelCase 的
approvalMode,命令行参数对应--approval-mode。
上面是最基础的。如果要接第三方端点,把 baseURL 换成你实际可用的端点地址:
model: o4-mini
approvalMode: auto-edit
providers:
openai:
baseURL: https://your-gateway-endpoint/v1
envKey: OPENAI_API_KEY
然后终端里 export Key:
export OPENAI_API_KEY='your-key-here'
验证:
codex 'list all files in current directory'
看到它开始分析文件列表就说明通了。
不同场景怎么选
个人开发者,只用 OpenAI 官方模型:最简配置,不写 providers 块,直接 export 环境变量就行。默认 o4-mini 够用,输入 $1.10/M tokens 输出 $4.40/M tokens,一天写代码下来也就几毛钱。
想用 Claude 或 DeepSeek 等非 OpenAI 模型:需要通过支持 OpenAI 兼容格式的聚合 API 网关接入。OpenRouter 等平台均支持,改 baseURL 指向对应网关,model 字段填该平台的模型 ID(以平台文档为准)。provider 还是写 openai。
团队统一配置:把 config.yaml 模板提交到团队 wiki,envKey 统一用 OPENAI_API_KEY,每个人自己管自己的环境变量。这样 config.yaml 可以 git 共享,Key 不会泄露。
CI/CD 自动化:加 --approval-mode full-auto,非交互模式。--quiet 参数是否可用取决于你安装的版本,建议先跑 codex --help 确认支持的 flag 列表。Linux 环境建议套 Docker 做沙箱隔离。
codex --approval-mode full-auto \
'add type hints to all functions in utils.py'
踩坑记录 / 常见问题 FAQ
Q: Codex CLI 的 config.yaml 改了但不生效怎么办?
先确认路径对不对——必须是 ~/.codex/config.yaml,不是 ~/.codex/config.yml(后缀别写错)。然后检查 YAML 缩进,providers 下面的字段要缩进两格。我有一次就是 baseURL 没缩进,整个 providers 块被当成无效内容跳过了,也不报错。
Q: 报 401 但我确定 Key 是对的?
先跑 echo $OPENAI_API_KEY 看看终端实际读到的值是不是你以为的那个——.zshrc 里如果有旧 Key,它的优先级高于 config.yaml 里写的值。另外注意复制 Key 时前后别多空格,这个肉眼看不出来但会 401。
Q: provider 能不能写 azure?
不能直接写 azure 作为 provider 枚举值——Codex CLI 的 schema 里没有这个独立值。接 Azure OpenAI 的正确方式是:provider 写 openai,baseURL 填你的 Azure 端点,envKey 填存放 Azure API Key 的环境变量名。注意 Azure 的 model 字段要填部署名而不是 OpenAI 原始 model ID,这是 Azure 接入最容易踩的额外坑。
Q: full-auto 模式安全吗?会不会把文件搞坏?
macOS 下有 Apple Seatbelt 沙箱保护,Linux 下建议用 Docker。但即便有沙箱,我也不建议在生产目录直接 full-auto。日常开发用 auto-edit 就够了——文件修改自动执行,但跑命令还是会问你一声。
Q: Codex CLI 和 Claude Code 怎么选?
看你主力模型是什么。如果主力是 o4-mini 等 OpenAI 模型,Codex CLI 原生支持体验最好。如果主力是 Claude 系列,Claude Code 的上下文理解和多文件编辑目前还是强一截。两个工具可以配合着用,根据任务类型手动切换。
小结
整个配置就两个核心认知:provider 没有 openai-compatible 或 azure 这样的独立枚举值(想接第三方端点就用 openai + 自定义 baseURL),api_key 环境变量优先级高于配置文件。搞清楚这两点,五分钟就能跑通。
我现在的日常工作流是 Codex CLI 处理快速任务(加类型注解、写测试、重命名变量这种),复杂的多文件重构还是交给 Claude Code。两个工具配合着用,比单押一个效率高不少。
更多推荐



所有评论(0)