Codex CLI 报错400是因HTTP请求结构错误,需清除环境变量、确保base_url以/v1结尾、auth.json中provider与配置匹配,并在config.toml中启用disable_system_messages=true以避免system角色导致的不兼容。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

Codex CLI 报错 400 表示请求本身被服务器拒绝,不是密钥无效也不是网络超时,而是你发出去的那条 HTTP 请求在语法、地址、头字段或参数结构上存在硬性错误,服务器连解析都失败了。
先清除环境变量干扰
打开终端,执行:
Windows PowerShell:$env:OPENAI_API_BASE=""; $env:OPENAI_API_KEY=""; $env:Claude_API_KEY=""; codex login --device-auth
macOS/Linux:unset OPENAI_API_BASE OPENAI_API_KEY CLAUDE_API_KEY; codex login --device-auth
很多用户根本没手动设过这些变量,但 VS Code、Docker Desktop 或某些 IDE 插件会悄悄注入它们。一旦 Codex CLI 读到 OPENAI_API_BASE,就会强制把请求发往那个地址——哪怕它根本不是 Anthropic 兼容接口,服务器直接返回 400。
【必须重启终端再执行】否则旧变量仍在内存里生效。
检查 base_url 配置是否带 /v1 后缀
编辑 ~/.codex/config.toml(Windows 是 C:\Users\用户名\.codex\config.toml),定位到 [provider] 区块:
方法一:对接 DeepSeek v4
确保 base_url = "https://api.deepseek.com/v1" ——结尾必须有 /v1,少一个斜杠就 400。
方法二:对接自建 ccswitch 或其他 Anthropic 兼容服务
确认 base_url 指向的是 /v1/chat/completions 的父路径,比如 http://localhost:8000/v1,而不是 http://localhost:8000 或 http://localhost:8000/v1/chat/completions。
注意:Codex 不接受裸域名或根路径;也不接受完整 endpoint 地址。只认 xxx/v1 这种格式。
统一LLM网关 - 一个API对接70+AI模型,使用单一API密钥即可调用GPT、Claude、Gemini、Qwen、Deepseek、Grok等主流模型。
验证 auth.json 中的 provider 字段
第一步:用文本编辑器打开 ~/.codex/auth.json
第二步:确认里面存在 "provider": "deepseek" 或 "provider": "anthropic" 字段
第三步:删除所有形如 "provider": "openai" 的配置项
如果 config.toml 里配的是 DeepSeek,但 auth.json 里 provider 还是 openai,Codex 会强行按 OpenAI 协议拼接请求体——比如塞进 model 字段、用 messages 数组套 system 角色,而 DeepSeek v4 不支持 system 角色,立刻 400。
这一步操作起来很简单,直接把 auth.json 文件内容清空,然后重新运行 codex login --device-auth 即可生成匹配当前 config.toml 的新凭证。
排查代理与 wire API 兼容性
如果你用了 ccswitch、llama.cpp proxy 或其他中间代理层,请立即检查其日志输出:
① 找到第一条收到的 Codex 请求原始 JSON
② 看 messages 数组里有没有
{"role": "system", "content": "..."}<br>③ 如果有,说明 Codex 发出了 Anthropic 协议不兼容的字段——DeepSeek v4 和多数国产模型仅接受 <code>user 和 assistant
此时不能改模型端,只能改 Codex 行为:在 config.toml 的 [provider] 下添加:disable_system_messages = true
这个开关会强制 Codex 在构造请求时跳过 system 角色,把所有上下文合并进首条 user 消息。不加这行,只要请求含 system 字段,100% 400。

















