1. Codex 请求失败的真实场景:auth.json 里到底该填什么
GPT-6 开放 API 之后,很多人的第一反应是打开本地 Codex 配置文件,把模型名改成新版本,然后直接跑。结果终端里蹦出来的不是模型回复,而是一串鉴权错误。问题往往不在模型本身,而在auth.json这个文件——它决定了 Codex 把请求发到哪个 endpoint、用哪个密钥、声明哪个模型 ID。
Codex 的鉴权配置和普通聊天客户端不太一样。它默认会读取本地~/.codex/auth.json,里面同时承载了 API Key、Base URL 覆盖项以及部分账户模式字段。如果你只改了 Key 没改 Base URL,请求还是会打到默认通道;如果只改了 Base URL 没同步 Key 的格式,服务端会直接返回 401。这两个字段必须成对出现,缺一不可。
我试过在本地把 Codex 切到统一通道,踩过的坑基本集中在三处:一是auth.json里字段名写错,比如把base_url写成baseUrl;二是 Key 前面多了空格或换行;三是模型 ID 用了订阅版名称而不是 API 侧的真实 ID。这三个问题都会让请求在到达模型之前就被拦下。
这篇内容面向的是已经在本地装好 Codex、手里有可用密钥、想把请求指向 TaoToken 统一通道的开发者。你不需要重新安装任何东西,只需要改一个 JSON 文件、跑一条 curl、看一次返回结构。下面按“先理解文件结构,再复制配置,最后验证请求”的顺序走一遍。
需要先明确一点:Codex 读取auth.json的优先级高于环境变量。也就是说,即使你在 shell 里 export 了OPENAI_API_KEY,只要auth.json存在且字段完整,Codex 会优先用文件里的配置。所以改文件是最直接、最不容易出错的方式。
2. TaoToken 前置准备:Base URL、Key 与模型 ID 三件套
在动auth.json之前,先把三样东西准备好:Base URL、API Key、Model ID。这三件套是 Codex 接入任何统一通道的最小集合,缺一个都会导致请求失败。
Base URL 指向 TaoToken 的 API 入口,地址是https://taotoken.net/api。注意这里不要加 UTM 参数,API 调用只需要干净的域名路径。很多人在浏览器里复制了带跟踪参数的链接填进去,结果请求路径变成/api?utm_source=...,服务端解析失败。
API Key 需要到控制台里生成。打开https://taotoken.net/console,在 API Keys 页面创建一个新 Key。创建时建议给它起一个能识别的名字,比如codex-local,方便后续排查是哪个客户端在用。Key 只在创建时完整显示一次,复制后先存到安全的地方。
Model ID 是 GPT-6 在 API 侧的真实标识。Codex 配置里填的模型名必须和服务端注册的一致,不能直接写“GPT-6”这种展示名。具体 ID 可以在模型对话页面或接入文档里查到,填错会返回model not found而不是鉴权错误,这两类报错的排查方向完全不同。
如果你还没生成 Key,可以先访问https://taotoken.net/api-keys这个 deep link 直达密钥管理页。生成之后,把 Base URL、Key、Model ID 三个值先写在一个临时文本里,下一步直接往auth.json里填。
注意:Key 属于敏感凭据,不要提交到 Git 仓库,也不要在截图里暴露完整字符串。本地文件权限建议设为
600。
三件套准备好之后,先别急着改 Codex。用一条 curl 直接打 API,确认 Key 和 Base URL 本身是通的。这一步能把“配置问题”和“凭据问题”分开,后面排查会省很多时间。
3. 可复制配置:auth.json 字段示例与 Base URL 替换位置
Codex 的auth.json结构不复杂,但字段名必须精确。下面是一份可以直接参考的配置片段,路径对应~/.codex/auth.json。你需要把sk-开头的占位符替换成自己生成的 Key,模型 ID 替换成实际可用的值。
{ "OPENAI_API_KEY": "sk-你的TaoToken密钥", "OPENAI_BASE_URL": "https://taotoken.net/api", "model": "gpt-6", "provider": "openai" }这里有几个细节值得展开。OPENAI_API_KEY是 Codex 读取密钥的标准字段名,不要写成api_key或key。OPENAI_BASE_URL是覆盖默认 endpoint 的字段,值必须是完整的https://taotoken.net/api,结尾不要带斜杠。model字段填 API 侧的真实模型 ID,provider保持openai即可,因为 Codex 走的是兼容协议。
如果你用的是 TOML 格式的配置文件(部分 Codex 版本支持config.toml),对应写法如下:
[model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" [profiles.default] model_provider = "taotoken" model = "gpt-6"TOML 版本里env_key指向的是环境变量名,你需要额外在 shell 里 export 对应的 Key。两种格式选一种即可,不要同时存在,否则 Codex 可能读取到冲突配置。
改完文件后,检查一下 JSON 是否合法。可以用python -m json.tool ~/.codex/auth.json快速校验,如果输出格式化后的 JSON 就说明语法没问题;如果报错,多半是多了逗号或少了引号。
Base URL 的替换位置只有一处,就是OPENAI_BASE_URL这个字段。不要试图在代码里硬编码 endpoint,也不要在环境变量和文件里同时设置不同的值。Codex 的加载顺序是文件优先,环境变量兜底,两者不一致时以文件为准,容易造成“我明明改了环境变量却不生效”的错觉。
4. 验证请求:一条 curl 确认请求是否走通
配置改完之后,不要直接跑 Codex 的完整任务,先用一条 curl 验证请求链路。这一步能确认 Base URL、Key、Model ID 三者是否匹配,返回结构是否符合预期。
curl -sS https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoToken密钥" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-6", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 16 }'如果配置正确,你会收到一个包含choices数组的 JSON 响应,里面能看到模型返回的内容。这说明 Base URL 可达、Key 有效、模型 ID 被服务端识别。三个条件同时满足,Codex 侧大概率也能跑通。
如果返回 401,说明 Key 无效或格式不对。检查 Key 是否完整复制、有没有多余空格、是否已经过期。如果返回model not found,说明模型 ID 写错了,回到模型列表确认真实 ID。如果返回连接超时或 DNS 错误,说明 Base URL 写错了,检查是否漏了/api路径。
curl 通过之后,再跑一次 Codex 的实际请求。可以在项目目录里执行一个最小任务,观察终端输出。如果 Codex 仍然报鉴权错误,但 curl 是通的,那问题就在auth.json的字段名或文件位置上,而不是凭据本身。
验证成功后,建议把这条 curl 存成一个脚本,比如check_codex_auth.sh。以后每次改配置或换 Key,先跑脚本再跑 Codex,能快速定位问题出在哪一层。
5. 常见报错排查:401、local proxy failed 与 reading choices
实际接入过程中,报错信息往往比想象中更具体。下面按真实遇到的错误逐条对照,给出排查方向。
401 Unauthorized:最常见。原因通常是 Key 无效、Key 前后有空格、或者auth.json里字段名写成了api_key。排查方法是先用 curl 单独测 Key,确认 Key 本身可用;再检查文件字段名是否和示例一致。如果 Key 是从网页复制的,注意不要带上换行符。
local proxy failed:这个报错说明 Codex 尝试走本地代理但连接失败。检查是否有残留的代理环境变量,比如HTTP_PROXY或HTTPS_PROXY。如果有,先 unset 掉再重试。另外确认auth.json里的 Base URL 是直连地址,没有指向本地端口。
reading choices 相关错误:通常表现为解析响应时找不到choices字段。这说明请求虽然发出去了,但返回结构不是预期的 chat completions 格式。检查 Base URL 是否漏了/v1路径,或者模型 ID 是否被服务端路由到了错误的接口。用 curl 看原始返回体,能最快定位。
OAuth 相关报错:如果 Codex 提示 OAuth 流程失败,说明它还在尝试走账户授权模式,而不是 API Key 模式。检查auth.json里是否残留了oauth相关字段,把它们删掉,只保留 API Key 和 Base URL。部分 Codex 版本会优先读 OAuth 配置,残留字段会覆盖 API Key 设置。
模型返回空内容:请求通了但choices[0].message.content为空。检查max_tokens是否设得太小,或者 prompt 是否触发了内容过滤。先用ping这种简单输入测试,排除 prompt 本身的问题。
排查的核心思路是分层:先确认网络可达,再确认鉴权通过,最后确认模型路由正确。每一层用 curl 单独验证,不要一次性改多个配置,否则无法判断是哪个改动生效了。
6. 长期使用建议:把配置固化成可复用流程
配置跑通之后,建议把整个流程固化下来,避免每次换环境都重新踩坑。第一步是把auth.json的模板存一份,Key 用占位符,需要时替换。第二步是把 curl 验证脚本一起存,改完配置先跑脚本。第三步是记录当前使用的模型 ID 和 Base URL,写在项目 README 或本地笔记里。
如果你需要长期在 Codex 里跑编码任务或 Agent 流程,可以关注 Coding Plan 相关的接入方式,地址是https://taotoken.net/coding-plan。它适合需要稳定调用、批量任务的场景,配置逻辑和单次 API 调用一致,只是额度和管理方式不同。
对于只是想验证模型效果的场景,可以直接用模型对话页面测试,地址是https://taotoken.net/chat。先在网页端确认模型可用,再回到本地配 Codex,能减少本地环境带来的干扰。
接入文档里有完整的字段说明和示例,遇到不确定的字段名时优先查文档,地址是https://taotoken.net/doc。文档里的配置片段和本文示例保持一致,可以直接对照。
最后提醒一点:auth.json改完之后,Codex 可能需要重启才能重新加载配置。如果改完文件后行为没变化,先退出 Codex 进程再重新启动,不要依赖热加载。这个细节看起来小,但实际排查时经常被忽略。