1. VSCode 里 Codex 登录卡 thinking 与 Token exchange failed 到底卡在哪
先说清楚 Codex 是什么、能做什么、适合谁。Codex 是 OpenAI 推出的命令行编码代理工具,装好之后可以在终端里直接让它读代码、改文件、跑命令,VSCode 里的 Codex 插件则是把这套能力搬进编辑器侧边栏。适合的人群很明确:日常在 VSCode 里写代码、希望用自然语言驱动重构和补全、又不想频繁切浏览器的开发者。问题在于,它的登录链路比普通插件复杂一层——插件本身不存账号密码,而是依赖本地~/.codex/auth.json里的凭证,再向一个 token endpoint 换取访问令牌。只要这个 endpoint 不通、返回状态码异常,或者 auth.json 里的字段对不上,你就会看到两种典型症状:登录界面一直转圈显示 thinking,或者直接弹Token exchange failed: token endpoint returned status。
这两个报错看着像同一件事,其实根因分三层。第一层是网络层,token endpoint 请求发不出去或者被中途掐断,插件拿不到任何响应,于是只能一直 thinking,超时也不报错。第二层是协议层,endpoint 通了但返回 401、403、404 之类的状态码,插件解析响应失败,抛出 Token exchange failed 并带上具体 status。第三层是配置层,auth.json里base_url、api_key、model三个字段有一个缺失或写错,插件在发起请求前就构造不出合法请求体,表现同样是卡住或报错。很多人一上来就重装插件、重装 Node,其实方向错了——先把这三层分开定位,比盲目重装省时间得多。
我试过最典型的场景:本机 Node 版本是 18,npm i -g @openai/codex装完能跑,但codex login跳转后浏览器回调一直不回来,VSCode 插件侧边栏就停在 thinking。后来把 Node 升到 24、把 endpoint 换到统一通道,问题才彻底消失。所以这篇的排查路径是:先确认 Node 与 Codex CLI 版本,再检查auth.json结构,最后把 Base URL 指向 TaoToken 的统一 Key/API 通道做验证。每一步都给可复制的命令和配置片段,你照着做就能定位到自己卡在哪一层。
需要提前说明一点:Codex 的登录有两种模式,一种是走官方 OAuth 跳转,一种是走 API Key 直连。前者依赖浏览器回调和 token endpoint 的完整链路,后者只依赖一个可用的 Base URL 和 Key。卡在 thinking 和 Token exchange failed 的,绝大多数是 OAuth 链路在本地环境里跑不通。把 endpoint 切到统一通道,本质上是把不可控的跳转链路换成可控的直连链路,这也是后面配置部分的核心思路。
2. 接入前把 TaoToken 的 Key 与 endpoint 准备好
在动 VSCode 和 auth.json 之前,先把外部依赖准备好,否则后面改配置也是白改。TaoToken 在这里扮演的角色是统一 Key/API 通道:你拿到一个 Key,配一个 Base URL,Codex 的请求就走这条通道出去,不再依赖官方 OAuth 的浏览器回调。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 根地址是 https://taotoken.net/api ,注意 API 地址后面不加任何查询参数,配置里填的就是这个干净地址。
第一步,确认本机 Node 环境。Codex CLI 对 Node 版本有要求,低于 20 容易出现各种奇怪的网络行为。用 nvm 管理最省事:
# 安装 nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash # 让当前 shell 生效,不想重启终端就用这句 . "$HOME/.nvm/nvm.sh" # 安装并切换到 Node 24 nvm install 24 nvm use 24 # 验证 node -v npm -vnode -v应该输出 v24 开头的版本,npm -v输出 11 左右。如果node -v还是老版本,说明 nvm 没生效,检查~/.bashrc或~/.zshrc里有没有 nvm 的初始化段。
第二步,安装 Codex CLI:
npm i -g @openai/codex codex --version能打印出版本号就说明 CLI 装好了。这一步和 VSCode 插件是两套东西,但插件底层会调用 CLI 的能力,所以 CLI 装不对,插件也好不了。
第三步,拿 Key。登录 TaoToken 控制台,在 API Keys 页面创建一个新 Key,复制出来先存到安全的地方。创建时注意权限范围,选最小可用即可,不要一上来给全权限。Key 的形态是一串字符,后面要填进auth.json的api_key字段。
第四步,确认你要用的 Model ID。Codex 配置里需要显式指定模型,常见的是gpt-5-codex这类编码专用模型,具体以你账号下可用的模型列表为准。Model ID 写错的表现是请求返回 404 或 model not found,不会表现为 thinking,但会混在 Token exchange failed 里让人误判,所以提前确认好。
这四步做完,你手里应该有三样东西:可用的 Node 24 环境、装好的 codex CLI、一个 Key 加一个 Model ID。下面进入配置环节,把这三样东西写进 Codex 认的配置文件里。
3. 可复制的 auth.json 与 Base URL 配置片段
Codex 读取配置的位置是用户目录下的~/.codex/auth.json,Windows 上是C:\Users\你的用户名\.codex\auth.json。这个文件如果不存在,codex login会尝试创建;如果存在但字段不对,就会出现各种登录异常。最稳妥的做法是手动写一份结构完整的配置,把 Base URL、Key、Model ID 三件套一次配齐。
先看目录结构,确认路径:
# macOS / Linux ls -la ~/.codex/ # Windows PowerShell dir $env:USERPROFILE\.codex\如果没有.codex目录,手动建一个:
mkdir -p ~/.codex然后写入auth.json。下面这份是可直接复制的模板,把尖括号部分替换成你自己的值:
{ "OPENAI_API_KEY": "sk-你的TaoTokenKey", "OPENAI_BASE_URL": "https://taotoken.net/api", "model": "gpt-5-codex", "provider": "openai" }三个字段的含义要分清:OPENAI_API_KEY是鉴权凭证,填 TaoToken 控制台创建的 Key;OPENAI_BASE_URL是请求根地址,填https://taotoken.net/api,结尾不要带斜杠,也不要带任何查询参数;model是 Model ID,必须和你账号下可用的模型完全一致。provider字段保持openai即可,它决定请求体的协议格式,不是让你填服务商名字。
如果你更习惯用环境变量而不是写文件,Codex 也认这两个变量:
export OPENAI_API_KEY="sk-你的TaoTokenKey" export OPENAI_BASE_URL="https://taotoken.net/api"但环境变量的优先级和插件读取时机有关,VSCode 从桌面图标启动时可能读不到 shell 里 export 的变量,所以推荐还是写进auth.json,这样 CLI 和插件读的是同一份配置,不会出现「终端能跑、插件不行」的割裂。
写完之后检查文件权限,避免被其他进程读到:
chmod 600 ~/.codex/auth.json再确认 JSON 语法没写错,一个多余的逗号就会让整个文件解析失败,表现就是插件读不到配置、继续 thinking:
cat ~/.codex/auth.json | python3 -m json.tool能正常格式化输出就说明语法没问题。这一步很多人跳过,结果排查半天发现是 JSON 里多了个逗号。
配置写好后,VSCode 里的 Codex 插件需要重启才能重新读取。完全退出 VSCode(不是关窗口,是退出进程),再重新打开,插件初始化时会重新加载auth.json。如果你用的是 Cline 或 CC Switch 这类管理多个 provider 的工具,注意它们可能有自己的配置文件,会覆盖auth.json的值,这种情况要在这类工具的设置里把 Base URL 和 Key 同步改掉,三件套缺一不可。
4. 逐项验证请求是否真的走通了
配置写完不等于通了,必须逐项验证。验证顺序建议从 CLI 到插件,因为 CLI 的报错信息更完整,能快速定位是网络问题还是配置问题。
第一项,验证 CLI 能读到配置:
codex config get如果这条命令能打印出当前的 base_url 和 model,说明auth.json被正确加载。打印为空或者报错,回到上一节检查文件路径和 JSON 语法。
第二项,直接用 curl 打一次 endpoint,绕开 Codex 验证通道本身通不通:
curl -sS -o /dev/null -w "%{http_code}\n" \ -H "Authorization: Bearer sk-你的TaoTokenKey" \ https://taotoken.net/api/models返回 200 说明 Key 和 Base URL 都有效;返回 401 是 Key 错了或没带 Bearer 前缀;返回 404 多半是路径拼错,注意 API 根地址后面接的是/models这类标准路径,不要自己加/v1之类的段。这一步是分水岭:curl 通而 Codex 不通,问题在 Codex 配置;curl 也不通,问题在 Key 或网络。
第三项,跑一次最小请求验证模型可用:
codex exec "print hello"这条命令会让 Codex 发起一次真实请求。成功的话终端会输出模型返回的内容,同时~/.codex/下会生成日志。失败的话看报错类型:401回第二项查 Key;model not found回上一节查 Model ID;连接超时则是网络层问题,检查本机是否能正常访问https://taotoken.net/api。
第四项,回到 VSCode 验证插件。重启 VSCode 后打开 Codex 侧边栏,此时不应该再出现 thinking 转圈。如果还转圈,打开 VSCode 的输出面板,切到 Codex 相关的输出通道,看它实际请求的 URL 是什么——有些版本的插件会忽略auth.json里的OPENAI_BASE_URL,改用内置默认地址,这种情况需要在插件设置里单独指定 Base URL。
第五项,做一次完整的编码任务验证。在侧边栏输入一个简单指令,比如让它解释当前打开文件的功能,观察是否正常返回。返回正常说明整条链路打通;返回reading choices相关报错,说明响应体解析失败,通常是 endpoint 返回了非预期格式,回第二项确认 curl 返回的是标准 JSON 而不是 HTML 错误页。
五项验证做完,你应该能明确知道自己是卡在 Key、Base URL、Model ID、网络还是插件读取时机上。这个定位过程比反复重装有效得多。
5. 常见报错逐条对照排查
这一节把真实会遇到的报错和对应动作列清楚,遇到问题时直接对号入座。
Token exchange failed: token endpoint returned status 401。这是最常见的一条,含义是 endpoint 收到了请求但拒绝鉴权。动作:检查auth.json里OPENAI_API_KEY是否完整复制、有没有多余空格;用第 4 节的 curl 命令单独验证 Key;确认 Key 没有过期或被删除。注意 401 不会因为换 Model ID 而消失,别在模型上浪费时间。
Token exchange failed: token endpoint returned status 404。路径拼错或 endpoint 不存在。动作:确认OPENAI_BASE_URL填的是https://taotoken.net/api,结尾没有斜杠、没有/v1、没有查询参数。有些教程让你填带/v1的地址,在这个通道下会 404,去掉即可。
local proxy failed或连接被重置。这类报错说明请求根本没到达 endpoint,卡在本机网络层。动作:先用 curl 验证https://taotoken.net/api/models是否可达;检查本机是否有其他工具改写了系统网络设置;确认没有把 Base URL 写成localhost或内网地址。这类问题不要动auth.json,改了也没用。
reading choices或响应解析失败。请求通了,但返回体不是 Codex 期望的 JSON 结构。动作:用 curl 加-i看完整响应头和响应体,确认返回的是 JSON 而不是 HTML 错误页或登录页;确认 Base URL 没有指向一个需要浏览器交互的地址。这种情况常见于 endpoint 填成了网页地址而非 API 地址。
登录界面一直 thinking、无任何报错。这是最磨人的一种,因为没有任何状态码可看。动作分三步:第一步看 VSCode 输出面板里 Codex 通道的实际请求 URL;第二步确认插件版本是否过旧,旧版可能不读auth.json的OPENAI_BASE_URL;第三步完全退出 VSCode 再启动,排除配置缓存。如果三步都做了还转圈,把auth.json临时改名备份,让插件重新走一次初始化,往往能触发它重新读取配置。
OAuth相关报错,比如回调地址不匹配、授权码换取失败。这说明你走的是 OAuth 链路而不是 API Key 直连。动作:确认auth.json里同时有OPENAI_API_KEY和OPENAI_BASE_URL,有这两个字段时 Codex 会优先走直连而不是 OAuth;如果插件仍然弹 OAuth 页面,检查插件设置里有没有强制 OAuth 的开关,关掉它。
model not found或invalid model。Model ID 写错。动作:回控制台确认可用模型列表,把model字段改成完全一致的字符串,注意大小写和连字符。
排查时有个通用原则:先 curl 后 Codex,先 CLI 后插件,先 Key 后 Model。按这个顺序走,绝大多数报错能在十分钟内定位到具体字段。
6. 后续接入与长期使用的入口
配置跑通之后,日常使用还有几个入口值得记住,避免每次都要翻这篇找地址。
需要重新生成或管理 Key 时,直接进 API Keys 页面:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。Key 泄露或轮换时在这里删旧建新,然后同步更新auth.json的OPENAI_API_KEY字段,改完重启 VSCode。
需要查接口细节、确认请求格式和可用路径时,看接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。文档里有各语言的请求示例,curl 验证那一步的路径以文档为准。
想先在网页里试模型效果、确认某个 Model ID 是否可用,用模型对话:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。在对话界面选模型发一条消息,能正常回复就说明这个 Model ID 在你的账号下可用,再填进auth.json就不会踩 model not found 的坑。
如果你打算长期用 Codex 做编码和 Agent 任务,而不是偶尔试一下,看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。长期高频调用和临时试用的配额策略不一样,提前选对方案比事后换 Key 省事。
最后留一个实操习惯:每次改完auth.json,先跑cat ~/.codex/auth.json | python3 -m json.tool确认语法,再跑第 4 节的 curl 确认通道,最后才重启 VSCode。这个顺序能让你在三十秒内知道改动是否生效,而不是重启完发现还在 thinking 又从头猜。