1. 为什么 VS Code 里的 Codex 总是连不上新 API
如果你正在用 VS Code 的 Codex 扩展写代码,同时又在多个模型服务之间来回切换,大概率遇到过这种诡异现象:终端里codex exec跑得好好的,一回到 VS Code 右侧面板就变成 Reconnecting 或者 Connection failed。你改了config.toml,改了auth.json,甚至把OPENAI_API_KEY都换成了新的,VS Code 那边还是老样子。
我试过最离谱的一次,终端已经能正常返回codex OK,VS Code 却还在用三天前的旧 Key 发请求,日志里全是 401。后来才定位到根因:VS Code 的 Codex 后台 app-server 进程,继承的是 VS Code 主进程启动那一刻的环境变量。你在终端里unset或者export新 Key,对已经跑起来的 VS Code 完全无效。哪怕你执行Developer: Reload Window,只要 VS Code 主进程没退出,新的 Codex 子进程照样继承旧环境。
这就是本篇要解决的问题:在 VS Code 里把 Codex API 稳定地配置到 TaoToken,并且掌握一套可复用的更换流程。适合谁?适合需要统一管理多模型 Key、经常在 Claude、GPT、Codex 之间切换的开发者。核心检索词就三个:VS Code、Codex API、配置与更换。读完你能拿到三样东西:一份可复制的auth.json和config.toml片段、一次完整的更换与连通性验证动作、以及一套排障对照表。
先说清楚 Codex API 在 VS Code 里的三层结构,不然后面改配置会迷路。第一层是 Shell 环境变量,决定终端启动的进程继承什么;第二层是~/.codex/auth.json,Codex 自己的认证文件;第三层是~/.codex/config.toml,决定请求发到哪个 Base URL、用哪个模型。VS Code 的 Codex 扩展会读后两层,但它的进程环境来自第一层。三层里任何一层是旧的,都会导致「终端正常、VS Code 异常」。
还有一个容易忽略的点:终端 Codex 和 VS Code Codex 不是同一个二进制。终端用的是你 npm 全局安装的codex,VS Code 用的是扩展目录里自带的codex。两者共享~/.codex/下的配置文件,但进程环境和启动方式完全不同。所以排查时必须分开验证,不能拿终端的成功去推断 VS Code 也成功。
2. TaoToken 前置准备:Base URL、Key 与模型 ID
在动 VS Code 之前,先把 TaoToken 这边的三件套准备好。所谓三件套,就是 Base URL、API Key、Model ID,缺一个都跑不起来。TaoToken 的 API 入口是https://taotoken.net/api,这个地址在 Codex 的config.toml里要写成base_url。注意 Codex 用的是 Responses API 协议,所以wire_api要写responses,这一点和很多只支持 chat completions 的服务不一样,写错了会直接报协议错误。
API Key 在控制台的 API Keys 页面生成,地址是https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite。生成后先复制到剪贴板,后面要填进auth.json和环境变量。这里提醒一句:Key 只在生成时完整显示一次,页面刷新后就只剩掩码了,所以生成后立刻保存到密码管理器。
Model ID 这块,Codex 场景下常用的有gpt-5.5、gpt-5.6-sol这类。你可以在模型对话页面先确认一下当前可用的模型名,地址是https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite。不同模型在 Codex 里的model_reasoning_effort支持程度不一样,xhigh不是所有模型都吃,遇到报错先降到high或medium试。
如果你还没决定用哪种接入方式,可以先看接入文档,地址是https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite。文档里对 Responses API 和 chat completions 的区别讲得比较清楚,Codex 必须走 Responses,别选错。
三件套准备好之后,先别急着改 VS Code。正确的顺序是:先改 Shell 环境变量,再改auth.json,再改config.toml,然后在终端验证通过,最后才启动 VS Code。这个顺序不能乱,因为 VS Code 会继承启动时的环境,你必须在启动它之前就把环境弄干净。
关于 Key 的安全习惯,这里单独强调:以后截图、贴日志、发群聊,API Key 永远只显示前 6 位和后 5 位,中间用星号。比如sk-c66cf*****75513。完整 Key 一旦出现在聊天记录里,建议直接去控制台撤销重新生成,不要心存侥幸。
3. 可复制配置:auth.json 与 config.toml 完整片段
这一节是全文最核心的部分,直接给可复制的配置。先看~/.codex/auth.json,这个文件保存 Codex 自己的认证信息,格式很简单:
{ "OPENAI_API_KEY": "sk-你的TaoToken密钥" }注意这里只有一项,不要自作聪明加base_url或者model,那些属于config.toml。auth.json的权限建议设成600,命令是chmod 600 ~/.codex/auth.json,避免同机器其他用户读到 Key。
接下来是~/.codex/config.toml,这是决定请求发往哪里的关键文件。一份可用的完整片段如下:
model_provider = "TaoToken" model = "gpt-5.5" review_model = "gpt-5.5" model_reasoning_effort = "high" disable_response_storage = true network_access = "enabled" [model_providers.TaoToken] name = "TaoToken" base_url = "https://taotoken.net/api" wire_api = "responses" requires_openai_auth = true [features] goals = true逐项解释一下。model_provider和下面[model_providers.TaoToken]的段名必须一致,这里都叫TaoToken,你改成别的名字也行,但两处要同步。base_url写https://taotoken.net/api,注意不要多加斜杠,也不要写成/v1,Codex 会自己拼路径。wire_api = "responses"是 Codex 的硬要求,写成chat会报协议不匹配。requires_openai_auth = true表示走auth.json里的 Key 认证。
model_reasoning_effort我建议先用high,稳定之后再试xhigh。disable_response_storage = true在多数第三方接入场景下建议开启,避免服务端存储相关的兼容问题。network_access = "enabled"允许 Codex 访问网络工具。
Shell 环境变量这块,编辑~/.bashrc,加上:
export OPENAI_API_KEY="sk-你的TaoToken密钥" export OPENAI_BASE_URL="https://taotoken.net/api"然后source ~/.bashrc。这里有个坑:unset后面必须跟变量名,写unset sk-xxxx是错的,正确写法是unset OPENAI_API_KEY。很多人第一次排障就栽在这个细节上。
如果你用的是 zsh,对应文件是~/.zshrc,逻辑一样。改完用env | grep -E 'OPENAI_API_KEY|OPENAI_BASE_URL'确认当前终端已经加载新值。确认无误再往下走。
4. 验证请求:从终端 codex exec 到 VS Code 右侧面板
配置改完,先别开 VS Code。第一步在终端验证,命令是:
codex exec --skip-git-repo-check "只回复 OK"成功的话你会看到类似输出:
model: gpt-5.5 provider: TaoToken ... codex OK这一步证明 API Key、Base URL、Codex 配置、模型调用四件事全部正常。如果这里就失败,别往下走,先解决终端问题。想换模型测试,加--model参数:
codex exec --skip-git-repo-check --model gpt-5.6-sol "只回复 OK"终端通过之后,检查一下 Codex 的登录状态和路径:
codex login status which codex codex --versioncodex login status应该显示你新 Key 的掩码,比如Logged in using an API key - sk-c66cf***75513。如果显示的还是旧掩码,说明auth.json没改对,回去检查。
现在到了最关键的一步:彻底退出 VS Code。不是关窗口,是确保进程全部结束。用:
ps aux | grep -E 'code|codex' | grep -v grep最好无输出。如果有残留,手动 kill 掉。然后在已经加载新环境的终端里,进入项目目录启动:
cd 你的项目目录 code .VS Code 启动后,先别急着在右侧面板输入。先找到 Codex app-server 的 PID:
ps aux | grep -i codex | grep -v grep拿到 PID 后,检查它实际继承的环境变量:
tr '\0' '\n' < /proc/PID/environ | grep -E 'OPENAI_API_KEY|OPENAI_BASE_URL'如果这里显示的是新 Key,说明环境继承正确。如果还是旧 Key,说明你启动 VS Code 的那个终端本身环境没更新,回去重新source ~/.bashrc。
确认环境正确后,在 VS Code 右侧 Codex 面板输入「只回复 OK」,能返回 OK 就完成了。整个链路:终端环境 → auth.json → config.toml → VS Code 进程继承 → 面板请求,全部打通。
5. 常见报错排查:401、local proxy failed 与 reading choices
排障这块我按真实报错来对照,你遇到哪个直接查哪个。
401 Unauthorized。最常见的原因是auth.json里的 Key 和config.toml里的 provider 不匹配,或者 Key 本身失效。先跑codex login status看掩码对不对,再确认auth.json里没有多余字段。还有一种情况是 Key 复制时带了空格或换行,用cat -A ~/.codex/auth.json检查有没有隐藏字符。
local proxy failed / connection failed。这个多半是base_url写错,或者网络层到不了。先确认base_url = "https://taotoken.net/api"没有多余斜杠,再用curl -I https://taotoken.net/api看能不能通。如果 curl 通但 Codex 不通,检查wire_api是不是写成了chat,Codex 必须用responses。
reading choices / unexpected response format。这个报错说明服务端返回的格式和 Codex 期望的不一致,通常是wire_api配错,或者模型 ID 写了一个不支持 Responses 协议的模型。换回gpt-5.5试,确认协议通了再换其他模型。
OAuth / requires_openai_auth 相关报错。如果你看到提示要 OAuth 登录,说明requires_openai_auth没设成true,或者auth.json格式不对。Codex 在 API Key 模式下不需要走 OAuth,配置对了就不会弹登录。
VS Code 面板一直 Reconnecting。回到第 4 节的进程环境检查,用/proc/PID/environ看 app-server 继承的 Key。九成情况是 VS Code 主进程在旧环境里启动的,彻底退出重开即可。记住:Developer: Reload Window不够,必须退出主进程。
Codex CLI 和 VS Code Codex 版本不一致导致的怪问题。终端codex --version和 VS Code 扩展自带的 codex 版本可能不同。用type -a codex看终端调的是哪个,VS Code 的二进制在~/.vscode/extensions/openai.chatgpt-xxxx/bin/下面。两者共享配置但独立运行,排查时分开测。
一个实用技巧:以后检查 Key 时不要打印完整值,用掩码命令:
tr '\0' '\n' < /proc/$(pgrep -n codex)/environ \ | grep '^OPENAI_API_KEY=' \ | sed 's/^\(OPENAI_API_KEY=.\{10\}\).*\(.\{5\}\)$/\1*****\2/'这样日志里只有掩码,安全又够用。
6. 长期使用建议与接入入口
配置跑通之后,日常使用还有几个习惯值得养成。第一,每次换 Key 或换 Base URL,严格按「改环境 → 改 auth.json → 改 config.toml → source → 终端验证 → 退出 VS Code → 重新 code .」这个顺序,不要跳步。第二,把这份流程存成一个 shell 脚本或者笔记,下次换 API 直接照着走,比临时排查快十倍。第三,Key 定期轮换,尤其是曾经在聊天记录里完整出现过的,去控制台撤销重生成。
如果你需要长期在 VS Code 里跑编码任务和 Agent 工作流,可以考虑 Coding Plan,地址是https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite,适合高频调用场景。只是想先验证模型效果,用模型对话页面就够了,地址是https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite。Key 管理统一在 API Keys 页面,地址是https://taotoken.net/console/api-keys?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。
最后留一个我踩过的坑:有次换 Key 后终端一切正常,VS Code 死活连不上,折腾半小时才发现是.bashrc里还留着一行旧的export OPENAI_API_KEY,source之后新值被旧值覆盖了。用grep -nE 'OPENAI_API_KEY|OPENAI_BASE_URL' ~/.bashrc检查,把旧的删干净再 source。这个细节不注意,前面所有步骤都白做。