1. 为什么 Codex 装完就报 401 或 local proxy failed
很多人第一次在 Windows 或 macOS 上装 Codex,流程其实很顺:Node 环境有了,npm i -g @openai/codex一敲,命令行里codex也能跑起来。结果一执行任务,终端直接甩出401 Unauthorized,或者更让人摸不着头脑的local proxy failed。这两个报错看着像网络问题,实际上八成是鉴权通道没接对——Codex 默认走的是官方登录态,而你想让它走自己的 API 通道,中间那层auth.json没配对。
先把概念捋清楚。Codex 是 OpenAI 出的命令行编码代理工具,能读你的项目、改代码、跑命令,适合习惯在终端里干活的人。它本身不绑定某一种鉴权方式,而是通过一个配置文件决定「我该拿哪个 Key、请求发到哪个 endpoint」。这个文件就是auth.json。默认安装后,它期望你走账号登录流程;如果你手上是 API Key 形态的凭证,就得手动把auth.json改成指向对应服务地址,否则请求发出去对方不认,401 就来了。
local proxy failed则是另一层:Codex 某些版本会先起一个本地代理进程做转发,如果这个代理拿不到有效配置,或者端口被占、配置字段缺失,它连启动都失败,于是你看到的是代理层报错,而不是直接的 401。这两个错误经常成对出现,排查路径也基本重合——先确认 npm 全局装的是哪个版本、装在哪,再确认auth.json的字段和 endpoint 对不对,最后用一条 curl 验证通道是否真的通了。
我试过在一台干净的 Windows 上复现,装完直接跑,报的就是 401;把auth.json补全后,同样的命令立刻正常返回。所以这篇不聊虚的,就按「装 → 找配置 → 改字段 → 验证 → 排错」的顺序走一遍,每一步都给可复制的命令和字段模板。你跟着做,基本能定位到自己卡在哪一环。
适合谁看:刚用 npm 装完 Codex、第一次运行就撞上鉴权报错的人;想把 Codex 接到自己 API 通道、但不确定auth.json怎么写的人;以及需要一份可复现基线(版本号 + 全局路径)方便以后排查的人。下面所有操作在 Windows PowerShell 和 macOS 终端里都验证过,命令通用,路径差异我会单独标出来。
2. 装 Codex 前先把 npm 全局环境摸清楚
在动auth.json之前,得先知道自己这台机器上 npm 把包装到哪了、版本是多少。这不是多余步骤——后面改配置、找文件、复现问题,全靠这几个基线值。很多人报错排查半天,最后发现是全局路径下有两个版本的 Codex 在打架,或者 npm 前缀被改过,配置文件根本不在你以为的地方。
先看 npm 本身和全局包列表。打开终端(Windows 用 PowerShell,macOS 用默认 Terminal 或 iTerm 都行),执行:
node -v npm -v npm list -g --depth=0node -v和npm -v给出运行时版本,记下来。npm list -g --depth=0列出所有全局安装的包,输出大概长这样:
/usr/local/lib ├── @openai/codex@0.2.1 └── npm@10.5.0Windows 上路径会是C:\Users\你的用户名\AppData\Roaming\npm,macOS 上通常是/usr/local/lib/node_modules或/opt/homebrew/lib/node_modules(Apple Silicon 用 Homebrew 装 Node 的情况)。这个路径就是全局包根目录,auth.json相关的配置目录往往就在它附近,或者在你的用户主目录下的隐藏文件夹里。
如果之前装过别的同类工具想清理,可以用卸载命令,比如:
npm uninstall -g @openai/codex确认干净之后再装:
npm i -g @openai/codex装完再跑一次npm list -g --depth=0,确认版本号。这个版本号很重要,因为不同版本的 Codex 对auth.json字段的要求可能略有差异,报错信息也不完全一样。把「Node 版本 + npm 版本 + Codex 版本 + 全局路径」这四个值记在便签里,这就是你的复现基线。以后换机器或者帮别人排查,先对这四个值,能省掉一大半瞎猜。
还有一点:确认codex命令能被找到。执行which codex(macOS)或where.exe codex(Windows),如果提示找不到,说明 npm 全局 bin 目录没进 PATH。这时候要么把全局 bin 目录加进环境变量,要么用npx @openai/codex临时跑。PATH 没配好也会间接导致配置读取异常,因为工具可能从非预期位置找配置文件。
3. auth.json 字段模板与 endpoint 改法
这是整篇的核心。Codex 读取鉴权信息靠的就是auth.json,你要做的是把这个文件里的 endpoint 指向自己的 API 通道,并填入对应的 Key。先找到文件位置。常见位置有两处,按优先级找:
第一处是 Codex 自己的配置目录。macOS/Linux 下通常在~/.codex/auth.json,Windows 下在C:\Users\你的用户名\.codex\auth.json。如果这个目录不存在,首次运行 Codex 时它可能会自动创建,也可能需要你手动建。
第二处是 npm 全局目录附近的配置。有些版本会从全局包目录读,但主流还是用户主目录下的.codex。
找到或创建auth.json后,写入下面的模板。注意这是 JSON,字段名和层级要严格对齐:
{ "OPENAI_API_KEY": "你的_TaoToken_API_Key", "OPENAI_BASE_URL": "https://taotoken.net/api", "OPENAI_API_BASE": "https://taotoken.net/api", "model": "gpt-4o", "provider": "openai" }几个字段说明一下。OPENAI_API_KEY填你在 TaoToken 控制台生成的 Key,这个 Key 是鉴权凭证,别泄露。OPENAI_BASE_URL和OPENAI_API_BASE是 endpoint 地址,不同版本 Codex 读的字段名可能不一样,所以两个都写上,指向https://taotoken.net/api。model填你要用的模型 ID,按你实际订阅的填。provider保持openai兼容格式即可。
如果你用的是更接近官方结构的写法,也可以写成嵌套形式,部分版本认这种:
{ "auth": { "apiKey": "你的_TaoToken_API_Key", "baseURL": "https://taotoken.net/api" }, "model": "gpt-4o" }两种写法建议先试第一种扁平结构,兼容性更广。改完保存,注意别用记事本存成带 BOM 的 UTF-8,Windows 上用 VS Code 或 Notepad++ 存成纯 UTF-8 更稳。JSON 里不能有多余逗号,最后一项后面不要加逗号,否则解析直接失败,报错可能伪装成鉴权问题。
Key 从哪来?去 TaoToken 控制台创建,路径是 console 页面下的 API Keys 管理。生成后复制,粘贴进auth.json的OPENAI_API_KEY字段。如果你还没决定用哪种套餐,长期跑编码任务和 Agent 的话可以看下 Coding Plan,按量或包月按自己习惯选。
配置改完,先别急着跑复杂任务,下一步用一条 curl 确认通道通了。
4. 一条 curl 验证鉴权通道是否生效
改完auth.json不代表就通了,得独立验证一次。最干净的办法是绕开 Codex,直接用 curl 打 endpoint,看返回是不是正常。这样能把「配置问题」和「Codex 自身问题」分开。
在终端执行(把 Key 换成你自己的):
curl -s -o /dev/null -w "%{http_code}\n" \ https://taotoken.net/api/v1/models \ -H "Authorization: Bearer 你的_TaoToken_API_Key"这条命令只关心 HTTP 状态码。返回200说明 Key 有效、endpoint 可达、鉴权头格式正确。返回401说明 Key 不对或没带上;返回404说明路径不对;返回000或超时说明网络层没通。这一步过了,再回去跑 Codex,基本就不会再撞 401。
想看得更细一点,去掉-o /dev/null,直接看响应体:
curl -s https://taotoken.net/api/v1/models \ -H "Authorization: Bearer 你的_TaoToken_API_Key" | head -c 500正常会返回一段 JSON,列出可用模型。如果返回的是错误 JSON,里面通常有error.message字段,照着提示改。这一步验证通过后,回到 Codex 跑一个最小任务,比如让它读一个文件:
codex "读取当前目录的 README.md 并总结三句话"如果这次不再报 401 或 local proxy failed,而是正常输出结果,说明整条链路打通了。把这次成功的命令和输出记下来,作为「配置正确」的基线。以后一旦又报错,先跑第 4 步的 curl,能快速判断是通道问题还是工具问题。
顺带说一句,验证模型是否可用、想直接对话测试的话,可以用模型对话页面快速发一条消息,比在终端里反复试更直观。但排查配置阶段,curl 仍然是最可控的手段,因为它不依赖 Codex 的任何内部逻辑。
5. 常见报错对照:401、local proxy failed、reading choices、OAuth
把几个高频报错拆开讲,每个都给触发原因和对应动作。你对着自己的终端输出找。
401 Unauthorized。最常见。原因通常是三类:auth.json里 Key 为空或写错;endpoint 没指向https://taotoken.net/api;请求头没带上 Bearer。排查顺序:先跑第 4 步 curl,curl 通说明 Key 和 endpoint 没问题,那就是 Codex 没读到auth.json——检查文件路径对不对、JSON 有没有语法错误、是不是存成了带 BOM 的格式。curl 也不通,就是 Key 或地址本身的问题,回控制台重新生成 Key。
local proxy failed。这个报错说明 Codex 尝试起本地代理但失败了。常见原因是auth.json字段缺失导致代理初始化中断,或者本地端口被占用。先确认auth.json里OPENAI_BASE_URL和OPENAI_API_BASE都写了;再检查有没有别的进程占着 Codex 默认用的本地端口,换个终端或重启机器再试。如果还是不行,把 Codex 升级到最新版,老版本对代理配置的容错较差。
reading choices 相关报错(类似error reading choices或解析响应失败)。这通常不是鉴权问题,而是 endpoint 返回的结构和 Codex 预期的不一致。检查model字段填的模型 ID 是否真实存在,以及 endpoint 路径有没有多写或少写/v1。用 curl 看原始返回,确认返回的是标准 OpenAI 兼容格式。
OAuth 相关报错。如果你之前用账号登录过,本地可能残留了 OAuth 凭证,和auth.json里的 API Key 冲突。解决办法是清掉旧的登录态,让 Codex 只走auth.json。找到~/.codex/下除auth.json外的凭证缓存文件,备份后删除,再重启 Codex。
如果你用的是 Claude Code 那套生态,配置逻辑类似但文件不同。Claude Code 的接入同样需要 Base URL、Key、Model ID 三件套齐全,缺一个就会报鉴权或代理错误。CC Switch 这类切换工具、Cline 的 MCP 配置、Codex 的auth.json,本质都是把这三个值填对。以 Codex 为例,三件套对应关系是:Base URL 填https://taotoken.net/api,Key 填控制台生成的凭证,Model ID 填你订阅的模型。三个值任何一个错位,报错都会指向鉴权失败,所以排查时逐个核对。
排错时养成习惯:先 curl 验证通道,再看 Codex 报错,最后查配置文件语法。这个顺序能避免在工具层瞎折腾。接入文档里有各客户端的字段对照,遇到不确定的字段名可以去查。
6. 把配置固化下来,下次直接复用
走到这里,你的 Codex 应该已经能正常跑任务了。最后做一件事:把这次成功的配置固化,避免下次换机器或重装时重新踩坑。
第一,备份auth.json。把它复制一份到安全位置,注意里面含 Key,别传到公开仓库。可以建一个私有的配置仓库,或者用密码管理器存 Key,配置文件里只留占位符。
第二,记录基线四件套:Node 版本、npm 版本、Codex 版本、全局路径。写进项目 README 或自己的笔记里。下次报错先对这四个值,能快速判断是不是环境变了。
第三,把第 4 步的 curl 命令存成一个脚本,比如check-auth.sh,每次改完配置先跑一遍。这比直接跑 Codex 更快定位问题。
第四,如果你同时用多个客户端(Codex、Claude Code、Cline 等),统一用同一套 Base URL 和 Key,减少变量。切换工具时只改各自的配置文件路径,不动核心三件套。
长期跑编码任务和 Agent 的话,Coding Plan 比按量更省心,配置一次到处复用。需要新 Key 或管理多个 Key 时,去控制台操作。模型对话页面适合快速验证某个模型是否可用,不用每次都开终端。
这套流程我在 Windows 和 macOS 上都跑过,核心就一句话:endpoint 指向https://taotoken.net/api,Key 填对,auth.json语法正确,然后用 curl 验证。剩下的报错基本都是这三个环节的变体。把配置固化成模板,下次装完 Codex 直接替换 Key 就能用,不用再从头排查。