1. codex 配置踩坑现场:config.toml 与 auth.json 到底谁说了算
如果你本地已经装好 codex,大概率经历过这种场面:终端里敲下命令,界面卡在reconnecting转圈,五秒、十秒、半分钟过去才吐出第一句话;或者干脆甩你一个401 Unauthorized、websocket connection failed,让你怀疑是不是 Key 复制错了。这类问题九成不是 codex 本身坏了,而是.codex/config.toml和.codex/auth.json这两个文件在打架。
先把这两个文件的分工说清楚,后面排查才有方向。config.toml管的是「怎么连」——用哪个 provider、走 WebSocket 还是 https、base_url 指向哪里、模型名怎么映射;auth.json管的是「拿什么连」——API Key、账号凭证、token 类型。一个管路由,一个管身份,任何一边写错都会让请求发不出去或者发出去被拒。
这篇面向的是已经装好 codex、正在被配置报错折磨的开发者。我会给出可直接复制的config.toml骨架、auth.json字段示例,逐条验证连接是否走通的命令,以及把 WebSocket 强制降级到 https 的具体改法。同时说明怎么用 TaoToken 统一 Key 和 API 通道接入,省得你在多个中转配置之间反复横跳。适合谁:本地跑 codex、想稳定连上模型、不想每次登录都重连五次的人。
2. 前置准备:TaoToken 通道与 codex 环境确认
在动配置文件之前,先把「通道」这件事定下来。codex 支持自定义 provider,你可以把它指向任意兼容 OpenAI 接口的服务。TaoToken 在这里扮演的角色就是统一入口:一个 Key、一个 base_url,模型对话、编码计划、控制台管理都在同一套体系里,不用为每个模型单独配一套凭证。
官网入口在这里,注册和看文档都从这进:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codex_config
API 基地址固定为:https://taotoken.net/api
拿到 Key 之后,去控制台的 API Keys 页面创建或复制:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codex_config
环境侧确认三件事:codex 版本(codex --version)、配置文件目录(Linux/macOS 是~/.codex/,Windows 是%USERPROFILE%\.codex\)、以及当前是否残留旧的登录态。很多人报错就是因为旧auth.json没清干净,新配置写进去也不生效。
注意:改配置前先备份整个
.codex目录。后面无论怎么折腾,都能一键回滚,这是最省心的保险。
3. 可复制配置:config.toml 骨架与 auth.json 字段
先给config.toml的完整骨架。核心思路是把 provider 显式声明出来,并且关掉 WebSocket,强制走 https,这样能绕开国内网络下 WebSocket 反复重连的问题。
# ~/.codex/config.toml model = "gpt-5-codex" model_provider = "taotoken_https" [model_providers.taotoken_https] name = "TaoToken" base_url = "https://taotoken.net/api" wire_api = "responses" requires_openai_auth = true supports_websockets = false逐行解释一下关键项。model_provider指向下面定义的 provider 名,必须完全一致,大小写都算。base_url结尾不要带/v1,codex 会自己拼路径,多写一段就是 404。wire_api = "responses"对应新版接口协议,如果你用的是 chat 风格接口,改成"chat"。supports_websockets = false是这篇的重点,它让 codex 直接走 https,不再先试 WebSocket 再回退,省掉那五次重连。
接着是auth.json,字段不多但容易写错:
{ "OPENAI_API_KEY": "sk-你的TaoToken密钥", "auth_mode": "apikey", "last_refresh": "2025-01-01T00:00:00Z" }OPENAI_API_KEY填 TaoToken 控制台拿到的 Key。auth_mode用apikey表示走密钥认证,不要写成chatgpt,否则 codex 会尝试账号登录流程,和你的 Key 冲突。last_refresh是时间戳,手动写一个即可,codex 会自己更新。
两个文件放好后,权限也要对。Linux/macOS 下auth.json建议chmod 600,避免被其他进程读到。Windows 下确认文件不是只读状态,否则 codex 写不回刷新时间。
4. 验证请求:逐条命令确认连接走通
配置写完不代表生效,得一步步验证。下面这套命令按顺序跑,哪一步断了就定位到哪。
第一步,确认 codex 读到了你的配置:
codex config get model_provider codex config get model_providers.taotoken_https.base_url正常应该回显taotoken_https和https://taotoken.net/api。如果回显为空,说明配置文件路径不对,或者 TOML 语法有错(比如少了引号、表头拼错)。
第二步,直接测 API 通道是否通,绕开 codex:
curl -sS https://taotoken.net/api/models \ -H "Authorization: Bearer sk-你的TaoToken密钥" \ -H "Content-Type: application/json" | head -c 500返回模型列表 JSON 就说明 Key 和 base_url 都没问题。如果返回 401,是 Key 错了;返回 404,是 base_url 多写了路径;连接超时,是网络层问题,和 codex 无关。
第三步,发起一次真实对话请求,确认 responses 协议能通:
curl -sS https://taotoken.net/api/responses \ -H "Authorization: Bearer sk-你的TaoToken密钥" \ -H "Content-Type: application/json" \ -d '{"model":"gpt-5-codex","input":"ping"}'能拿到结构化响应,说明整条链路打通。这时候再回 codex 里跑一次,观察是否还有reconnecting。按我实测,关掉 WebSocket 后首字响应明显变快,不再有那五次空转。
第四步,验证 codex 端到端:
codex exec "用一句话说明什么是递归"如果直接出结果,配置就算彻底跑通了。想验证模型对话效果,也可以到模型对话页面手动试:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codex_config
5. 本篇常见报错排查:reconnecting、401 与 WebSocket 失败
把高频报错列成表,对照着查最快。
| 报错现象 | 大概率原因 | 处理动作 |
|---|---|---|
| 启动后 reconnecting 五次 | WebSocket 被网络阻断 | config.toml 加supports_websockets = false |
| 401 Unauthorized | auth.json 的 Key 错误或 auth_mode 写成 chatgpt | 核对 Key,改回apikey |
| 404 Not Found | base_url 多写了/v1或/responses | 只保留https://taotoken.net/api |
| 配置不生效 | 旧.codex目录残留登录态 | 备份后重命名旧目录,让 codex 重建 |
| TOML 解析失败 | 表头拼写或引号缺失 | 用codex config get逐项验证 |
关于登录态残留,这里有个实用技巧。如果你之前用官方账号登录过,.codex里会存一套凭证,和新的 Key 配置混在一起。最干净的做法是把整个.codex重命名为.codex_backup,重启 codex 让它自动生成新目录,再把上面写好的config.toml和auth.json放进去。这样不会出现新旧凭证互相覆盖的情况。
WebSocket 那条再强调一次:国内网络环境下,codex 默认先尝试 WebSocket,失败后才回退 https,这个回退过程就是那五次重连的来源。supports_websockets = false让它跳过尝试,直接走 https,是最省事的解法。如果你确实需要 WebSocket,那就得保证网络层能稳定握手,否则不如关掉。
还有一个隐蔽的坑:model字段和 provider 里的模型名不一致。codex 会把model直接传给接口,如果 TaoToken 那边没有这个模型名,就会报模型不存在。确认模型名以控制台或模型列表返回的为准。
6. 长期编码与 Agent 场景:用 Coding Plan 统一管理
如果你不只是偶尔跑一次 codex,而是把它当日常编码助手、甚至接进 Agent 工作流,那配置管理就得升级。频繁改config.toml、手动换 Key 的方式撑不住长期使用,容易出错也难维护。
TaoToken 的 Coding Plan 就是为这种场景准备的,把编码相关的额度、模型、通道统一在一处管理,codex 侧只需要指向固定的 base_url 和 Key,不用每次换模型就改配置:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codex_config
接入文档里有各客户端的配置示例,codex 的写法可以直接对照:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codex_config
ClaudeCode 相关的接入说明也在这个文档体系里,如果你同时用多个编码工具,可以共用同一套 Key 和通道,减少重复配置:https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codex_config
最后留一个我踩过的坑:改完配置别急着开新项目,先在空目录里跑一次codex exec验证。确认通了再进正式仓库,否则项目里的上下文会让报错信息更难读。配置这东西,一次写对,后面就是复制粘贴的事。