1. 为什么 API Key 授权后 Codex 插件是灰的
你大概率遇到过这个画面:Codex 桌面端用 API Key 登录成功,对话能跑,模型也能回,但左侧的插件入口是灰的,点不动,设置里的移动端远程控制也找不到。这不是你 Key 填错了,也不是网络问题,而是 Codex 桌面端把「授权模式」和「功能开关」绑在了一起。
Codex 桌面端有两套授权路径。一套是 ChatGPT 账号登录,走的是官方 OAuth,登录态里带着账号身份,插件、移动端这些依赖账号体系的功能才会被点亮。另一套是 API Key 授权,它只解决「请求怎么发出去」的问题,不提供账号身份,所以插件面板默认锁死。换句话说,API Key 管的是模型调用通道,插件管的是账号能力,两者不是一回事。
那有没有办法既用 API Key 的额度,又保留插件入口?有。核心思路是:让 Codex 保持 ChatGPT 登录态来解锁插件,同时把真正的模型请求指向你自己的 API 通道。这样插件是亮的,请求走的是你的 Key。下面我把这条链路拆成可复制的配置,配合 TaoToken 的统一 Key 通道来落地。
TaoToken 在这里的角色是统一 API 通道:你拿一个 Key,就能在 Codex、Claude Code、Cursor 这类工具里复用同一套接入地址,不用每个工具单独配一套。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api ,注意这个地址后面不加 UTM 参数。
2. 先分清 auth.json 和 config.toml 各管什么
排查这类问题,第一步不是改配置,而是搞清楚两个文件的分工。很多人插件不亮,就是因为把该保留的登录态覆盖掉了。
~/.codex/auth.json管的是「你是谁」。它记录授权模式(auth_mode)和登录令牌(tokens)。如果你想让插件可用,这个文件里的 auth_mode 必须是chatgpt,tokens 保持 ChatGPT 登录后的状态,不要动。OPENAI_API_KEY 字段设为 null,因为真正的 Key 我们放到另一个文件里。
~/.codex/config.toml管的是「请求发到哪」。模型名、provider、base_url、鉴权方式都在这里。插件能不能亮,跟这个文件无关;但请求能不能通,全靠它。
我踩过的坑是:一开始把 API Key 直接写进 auth.json 的 OPENAI_API_KEY,结果 auth_mode 被改成 apikey,插件立刻变灰。后来才明白,正确做法是 auth.json 保持 chatgpt 登录态,config.toml 里用 experimental_bearer_token 单独挂 Key。
注意:auth.json 里的 tokens 是登录凭证,不要手动编辑或删除,改坏了要重新登录。你只需要确认 auth_mode 和 OPENAI_API_KEY 两个字段。
2.1 auth.json 的正确形态
打开~/.codex/auth.json,确认结构如下。tokens 部分保持你登录后的原样,不要复制我的示例值:
{ "auth_mode": "chatgpt", "OPENAI_API_KEY": null, "tokens": { "access_token": "保持登录后的原值", "refresh_token": "保持登录后的原值", "id_token": "保持登录后的原值" } }关键点只有两个:auth_mode 是chatgpt,OPENAI_API_KEY 是null。只要这两个对,插件入口就有机会亮起来。
2.2 config.toml 的 provider 骨架
config.toml 里我们要做的是:定义一个自定义 provider,把 base_url 指向 TaoToken 的 API 地址,用 experimental_bearer_token 挂上你的 Key。下面是一个可复制的骨架:
model_provider = "custom" model = "gpt-5.5" model_reasoning_effort = "high" [model_providers.custom] name = "custom" wire_api = "responses" requires_openai_auth = true experimental_bearer_token = "sk-你的TaoToken密钥" base_url = "https://taotoken.net/api"这里几个参数值得单独说。wire_api = "responses"表示走 Responses 风格的接口,Codex 桌面端对这条路径支持比较完整。requires_openai_auth = true让 Codex 认为这条通道需要鉴权,配合 bearer token 使用。experimental_bearer_token就是你的 TaoToken Key,官方更推荐用环境变量注入,但本地调试直接写也行,记得别把带 Key 的文件传到公开仓库。
base_url填https://taotoken.net/api,不要在后面拼/v1之外的路径,也不要加任何查询参数。如果你在别的工具里见过带/v1的写法,Codex 这里按上面这个基址填即可,具体路径由 wire_api 决定。
3. 可复制的完整配置与 Key 获取
配置骨架有了,接下来把 Key 拿到手,再把两个文件落盘。
3.1 获取 TaoToken Key
进入控制台创建 API Key,地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。创建后复制那串sk-开头的密钥,它只在创建时完整显示一次,丢了就重新建一个。如果你还没决定用哪个模型,可以先到模型对话页面试一下,地址是 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,确认通道通了再回来配 Codex。
Key 的管理入口在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。这两个页面建议都开着,配的时候对照参数。
3.2 落盘顺序
先改 auth.json,再改 config.toml,最后重启 Codex。顺序反了容易让 Codex 在启动时读到半截配置。
第一步,退出 Codex 桌面端,确保进程完全结束。Windows 在任务管理器里确认,macOS 用活动监视器确认。
第二步,编辑 auth.json,确认 auth_mode 为 chatgpt、OPENAI_API_KEY 为 null。
第三步,编辑 config.toml,写入上面的 provider 骨架,把 experimental_bearer_token 换成你的真实 Key。
第四步,重新启动 Codex。启动后先看插件入口是否变亮,再看对话是否能正常返回。
3.3 用环境变量替代明文 Key
如果你不想把 Key 写在 config.toml 里,可以改用环境变量。Codex 支持从环境读取 bearer token,配置里把 experimental_bearer_token 换成 env_key 引用:
[model_providers.custom] name = "custom" wire_api = "responses" requires_openai_auth = true env_key = "TAOTOKEN_API_KEY" base_url = "https://taotoken.net/api"然后在启动 Codex 前设置环境变量。macOS 或 Linux:
export TAOTOKEN_API_KEY="sk-你的TaoToken密钥"Windows PowerShell:
$env:TAOTOKEN_API_KEY="sk-你的TaoToken密钥"这样配置文件里就没有明文密钥,适合把 config.toml 同步到多台机器。
4. 验证请求是否真的走通了
配置改完不代表通了,得用可观测的方式验证。分三层:先验证 Key 本身,再验证 Codex 请求,最后验证插件状态。
4.1 用 curl 验证 Key 和通道
在终端里直接打一条请求,确认 TaoToken 通道和 Key 都正常:
curl https://taotoken.net/api/v1/responses \ -H "Authorization: Bearer sk-你的TaoToken密钥" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-5.5", "input": "回复一个字:通" }'如果返回里有正常的输出内容,说明 Key 有效、通道可达、模型名正确。如果返回 401,是 Key 问题;返回 404,多半是路径或模型名不对;返回超时,检查网络到taotoken.net是否可达。
4.2 在 Codex 里发一条最小请求
重启 Codex 后,新建一个对话,输入一句最简单的话,比如「回复 ok」。观察两件事:一是回复是否正常出现,二是插件入口是否可点。
如果回复正常但插件还是灰的,问题在 auth.json,回去确认 auth_mode 是不是被改成了 apikey。如果插件亮了但回复报错,问题在 config.toml,重点看 base_url 和 bearer token。
4.3 插件加载的确认动作
插件入口变亮后,点进去看列表是否正常渲染。有时候入口亮了但列表空白,这通常是插件数据还没拉取完,等几秒或重启一次。如果列表一直空白,检查 Codex 版本,旧版本对插件面板的支持不完整,升级到较新版本再试。
下面这张表可以帮你快速定位现象和原因:
| 现象 | 可能原因 | 检查点 |
|---|---|---|
| 插件灰、对话正常 | auth_mode 被改成 apikey | auth.json 的 auth_mode |
| 插件亮、对话报 401 | Key 无效或过期 | experimental_bearer_token |
| 插件亮、对话 404 | base_url 或模型名错 | config.toml 的 base_url、model |
| 插件亮、列表空白 | 版本旧或数据未加载 | Codex 版本、重启 |
| 全部正常但移动端不显示 | 账号能力限制 | 登录态 tokens 是否完整 |
5. 本篇常见错排查
这一节把高频错误集中过一遍,都是我在配置过程中真实撞到的。
5.1 auth_mode 写成了 apikey
这是插件不亮的第一大原因。很多人为了用 API Key,直接把 auth_mode 改成 apikey,结果插件入口立刻锁死。正确做法是 auth_mode 保持 chatgpt,Key 走 config.toml 的 bearer token。记住:auth.json 管身份,config.toml 管通道。
5.2 base_url 多写了 /v1
Codex 的 provider 配置里,base_url 填到https://taotoken.net/api即可,不要自己拼/v1。wire_api 会决定实际请求路径。多写一段路径会导致 404,而且报错信息不会直接告诉你路径错了,容易误判成 Key 问题。
5.3 Key 里有空格或换行
从控制台复制 Key 时,末尾容易带一个换行或空格。写进 config.toml 后,鉴权头会变成非法格式,返回 401。排查方法是用cat -A看文件,确认 Key 那一行结尾没有多余字符。用环境变量注入时同理,export的值不要带引号外的空格。
5.4 改了配置没重启
Codex 桌面端在启动时读取配置,运行中改文件不生效。每次改完 auth.json 或 config.toml,都要完全退出再启动。只关窗口不算退出,进程还在后台跑。
5.5 模型名和通道不匹配
config.toml 里的 model 要和 TaoToken 通道支持的模型一致。如果你填了一个通道不支持的模型名,请求会返回模型不存在。先在模型对话页面确认可用模型,再回填到 config.toml。
5.6 长期编码场景的通道选择
如果你不只是偶尔用 Codex,而是长期拿它做编码、跑 Agent 任务,单次请求的 Key 管理会比较碎。这种情况可以看下 Coding Plan,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,它面向的是持续编码场景的额度与通道管理,比每次单独配 Key 省事。如果你用的是 Claude Code 这类工具,接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面有对应的配置说明。
6. 把配置链路固定下来
整套排查下来,核心就一句话:让 Codex 保持 ChatGPT 登录态解锁插件,用 config.toml 的 bearer token 把请求指向 TaoToken 通道。auth.json 不要动 tokens,auth_mode 保持 chatgpt,OPENAI_API_KEY 设 null;config.toml 里 provider 的 base_url 填https://taotoken.net/api,Key 用 experimental_bearer_token 或 env_key 挂上。
配完之后,建议把这两个文件的关键字段记在一个自己的笔记里,下次换机器直接照抄,只换 Key。插件不亮先查 auth.json,请求不通先查 config.toml,按这个顺序排查,基本不会绕远路。需要新建或轮换 Key 的时候,直接去 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 操作就行。