1. Codex 计划模式 401 报错到底卡在哪一步
Codex 计划模式(Plan Mode)是 Codex 在本地跑任务时的一种工作模式:开启后它不会立刻改文件、执行命令,而是先输出一份完整任务方案,等你确认后再动手。这个模式本身不复杂,真正让人头疼的是它跑不起来——终端里蹦出401 Unauthorized,或者更绕的local proxy failed,然后计划卡片一直转圈,最后什么都没输出。
我先把结论放前面:这两个报错大概率不是 Codex 计划模式的逻辑坏了,而是auth.json里的 endpoint 和鉴权字段没对上。Codex 在计划模式下会先做一次模型探测请求,确认通道可用才生成计划;这一步走的是auth.json里配置的地址和 Key,只要其中一项错位,计划模式就会在“还没开始规划”的阶段直接失败。
适合读这篇的人:用 Codex CLI 或 Codex 桌面端、通过auth.json配置模型通道、最近遇到 401 或 local proxy failed 的开发者。下面我会按“先定位、再改配置、再验证”的顺序走一遍,每一步都给可复制的命令和字段,你照着改就能确认到底是配置问题还是鉴权失效。
先说清楚 401 和 local proxy failed 的区别,这决定了你往哪个方向查:
401 Unauthorized是服务端明确告诉你“凭证不认”。常见原因有三个:Key 写错或过期、auth.json里 endpoint 指向了一个不认这个 Key 的地址、请求头里的鉴权字段名不对(比如该用Authorization: Bearer却写成了别的)。
local proxy failed是 Codex 本地代理层没起来或转发失败。它可能是端口被占、代理进程没启动、也可能是上游返回 401 后本地代理把错误包装成了这句。所以看到 local proxy failed 时,别只盯着本地,先看它上游是不是 401。
计划模式之所以特别容易暴露这两个问题,是因为它对通道的“首次探测”比普通对话更严格:普通对话可能失败一次你重试就好,计划模式在生成方案前会先确认模型可用,探测失败就直接中断,连计划卡片都不给你。所以排查思路是——先把通道打通,再谈计划模式。
2. TaoToken 前置:把 Base URL 和 Key 准备好
在改auth.json之前,你得先有一个可用的通道地址和 Key。这里我用 TaoToken 作为示例通道,因为它对 Codex 这类本地工具的接入比较直接,Base URL 和 Key 的对应关系清晰,排查起来不容易绕。
你需要准备三样东西,我把它叫“三件套”:
Base URL:https://taotoken.net/api(注意 API 地址不带任何查询参数,直接就是这个)
API Key:在控制台的 API Keys 页面创建,形如sk-开头的一串字符
Model ID:你要调用的模型标识,比如claude-sonnet-4-5这类,具体以你账号下可用的模型为准
创建 Key 的入口在这里:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
如果你还没决定用哪个模型,可以先在模型对话页试一下,确认 Key 和模型能通再写进auth.json:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
这里有个容易踩的坑:很多人把 Base URL 写成带/v1或带一堆参数的完整地址,结果 Codex 在拼接请求路径时重复了,最后打到不存在的端点上,返回 401 或 404。TaoToken 的 API 根地址就是https://taotoken.net/api,Codex 会自己补后续路径,你不要手动加。
另外,Key 的权限和额度也要确认。如果 Key 被禁用、额度耗尽,服务端同样会返回 401 或 403。排查时先登录控制台看一眼 Key 的状态,比在本地瞎改配置快得多。
准备好这三件套后,先别急着写auth.json,用一条 curl 命令验证通道本身是通的。这一步能把“通道问题”和“Codex 配置问题”彻底分开:
curl -sS https://taotoken.net/api/v1/messages \ -H "Authorization: Bearer sk-你的Key" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "max_tokens": 64, "messages": [{"role": "user", "content": "ping"}] }'如果这条命令返回了正常的 JSON(哪怕内容只是模型回了个 pong),说明 Base URL、Key、Model ID 三件套是对的,问题在 Codex 的auth.json配置上。如果这条命令本身就 401,那先解决 Key 或地址问题,别往下走。
3. 可复制配置:auth.json 里 endpoint 与鉴权字段怎么改
Codex 的auth.json一般放在用户配置目录下,不同系统路径不一样:
macOS / Linux:~/.codex/auth.json
Windows:%USERPROFILE%\.codex\auth.json
改之前先备份一份,出问题能回滚:
cp ~/.codex/auth.json ~/.codex/auth.json.bak下面是一份可复制的auth.json结构,重点是base_url和api_key两个字段,以及模型标识:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的Key", "model": "claude-sonnet-4-5", "provider": "openai-compatible" }几个字段的说明,我按排查时最常出错的顺序讲:
base_url必须是https://taotoken.net/api,不要带/v1,不要带查询参数,不要带结尾斜杠。带斜杠有时会导致拼接出//v1,部分网关会因此返回 401 或 404。
api_key直接填sk-开头的完整 Key,不要加Bearer前缀。Codex 在发请求时会自己加Authorization: Bearer,你手动加了就变成Bearer Bearer sk-xxx,服务端当然不认,直接 401。
model填你在 TaoToken 控制台确认可用的模型 ID。填错模型名,有的网关返回 404,有的返回 401,容易和鉴权问题混淆。
provider字段如果你用的是兼容 OpenAI 协议的通道,填openai-compatible;如果你的 Codex 版本用的是别的字段名(比如api_base或endpoint),以你本地 Codex 文档为准,但值都是同一个https://taotoken.net/api。
如果你用的是 TOML 形式的配置(部分 Codex 版本或周边工具用config.toml),对应写法是:
[model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" api_key = "sk-你的Key" model = "claude-sonnet-4-5"改完保存,然后重启 Codex。注意:Codex 一般在启动时读取auth.json,你改完不重启,它还用旧配置,会误以为没生效。
如果你同时用 Cline、CC Switch 这类工具,它们的配置里也要保持三件套一致:Base URL 用https://taotoken.net/api,Key 用同一个,Model ID 用同一个。三处不一致是 401 的高发原因——你在 A 工具里改了 Key,B 工具还用旧的,报错就来了。
4. 验证请求:确认通道生效再开计划模式
配置改完,先别直接开计划模式跑大任务。用一条 curl 验证请求确认通道生效,这一步能省掉大量来回。
curl -sS -o /tmp/codex_check.json -w "%{http_code}\n" \ https://taotoken.net/api/v1/messages \ -H "Authorization: Bearer sk-你的Key" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "max_tokens": 32, "messages": [{"role": "user", "content": "reply with ok"}] }'看输出:如果第一行是200,说明通道通了。再看/tmp/codex_check.json里的内容,应该有正常的模型返回结构。如果返回401,说明 Key 或地址还有问题;返回404,多半是模型名或路径不对。
通道确认后,回到 Codex 里开计划模式。开启方式两种:对话输入框旁的开关,或者输入/plan切换。开完先给一个简单需求,比如“帮我梳理一下这个目录的结构,先给方案别动手”,看它能不能正常输出计划卡片。
如果计划卡片正常出现,说明 401 和 local proxy failed 都解决了。如果还报 local proxy failed,检查本地代理端口是否被占:
lsof -i :你的代理端口把占用进程处理掉,或者换一个端口。local proxy failed 有时是上一次 Codex 进程没退干净,端口还占着,新进程起不来。彻底退出 Codex 再重开,往往就好了。
实测下来,大部分 401 都是api_key多写了Bearer前缀,或者base_url带了/v1。这两个点先查,能解决八成问题。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
这一节我把几个高频报错和对应原因列成对照,你按现象查。
401 Unauthorized:Key 错、Key 过期、Key 被禁用、base_url指向了不认这个 Key 的地址、api_key多写了Bearer前缀。逐个核对,先用第 4 节的 curl 确认通道,再查auth.json。
local proxy failed:本地代理没起来、端口被占、上游返回 401 被包装成这句。先看上游是不是 401,再查端口占用,最后彻底重启 Codex。
reading choices相关报错:通常是响应结构不符合 Codex 预期,常见于base_url或model填错,导致返回的不是标准结构。核对三件套,确认模型 ID 在 TaoToken 控制台可用。
OAuth相关报错:如果你之前用 OAuth 方式登录过 Codex,auth.json里可能残留 OAuth 字段,和 API Key 字段冲突。把 OAuth 相关字段清掉,只保留base_url、api_key、model三项,重启 Codex。
还有一个隐蔽的坑:环境变量覆盖。有些 Codex 版本会优先读环境变量里的OPENAI_API_KEY或OPENAI_BASE_URL,你改了auth.json但环境变量还指向旧地址,结果还是 401。检查一下:
env | grep -i -E "openai|codex|api_key|base_url"有冲突的就 unset 掉,或者改成和auth.json一致。
排查顺序建议固定成:先 curl 验通道 → 再查auth.json三件套 → 再查环境变量 → 最后查本地代理端口。按这个顺序走,基本不会绕圈。
6. 长期跑 Codex 计划模式的接入建议
如果你只是偶尔用 Codex 计划模式,上面改完就够了。但如果你打算长期用它跑重构、迁移这类大任务,有几个接入上的建议。
第一,把三件套固定下来,写进一个你随手能查的地方。Base URL 就是https://taotoken.net/api,Key 用控制台创建的,Model ID 用你验证过可用的。三处(Codex、Cline、CC Switch 等)保持一致,别一处一个样。
第二,计划模式适合复杂任务,简单任务别开。单文件修改、小段调试直接执行模式更快。计划模式的价值在于先对齐思路再动手,任务越大越值。
第三,Key 的额度要留意。计划模式在生成方案前会做探测请求,长任务里请求次数不少,额度耗尽会突然 401。定期在控制台看一眼用量。
如果你要把 Codex 接进更长期的编码工作流,或者跑 Agent 类任务,可以了解一下 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
接入文档在这里,字段和路径以文档为准:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
最后说个我踩过的坑:改完auth.json一定要重启 Codex,而且要把旧进程彻底退干净。我有一次改了配置没重启,折腾了半小时以为是 Key 的问题,结果重启一下就好了。计划模式对配置的读取是启动时一次性的,改完不重启,等于没改。