1. Hermes Agent v0.14.0 之后,Codex auth.json 为什么必须迁移
Hermes Agent 在 2026-W21 这一周最大的事件是 v0.14.0「The Foundation Release」正式发布,808 commits、633 个合并 PR、215 位贡献者,一次性关闭了 545 个 issue。这个版本里有一个对本地编码工作流影响极大的改动:hermes proxy上线,它能把 Claude Pro、ChatGPT Pro、SuperGrok 这类 OAuth 提供商统一暴露成标准 OpenAI 兼容接口。换句话说,Codex CLI、Aider、Cline、Continue 这些工具原本各自维护一套鉴权逻辑,现在可以统一走一个本地入口。
问题也随之而来。Codex CLI 的鉴权配置写在~/.codex/auth.json里,默认指向官方端点。当你想让它走 Hermes Agent 的本地代理、或者走一个统一的 OpenAI 兼容网关时,直接改auth.json里的字段很容易踩坑:字段名写错、Base URL 多一个/v1、Key 格式不对,都会让 Codex 在启动阶段就报鉴权失败。本周 issue 区里area/auth标签下仍有 P1 级别的未解决问题(比如 Claude Max OAuth token 每次请求返回 HTTP 400),说明鉴权链路本身就是当前最脆弱的一环。
这篇实操记录面向三类人:一是已经在用 Hermes Agent、想把 Codex CLI 接到统一网关的开发者;二是刚升级到 v0.14.0、发现原来的auth.json不再生效的人;三是想用一份可复制的配置模板,把 Base URL、Key、Model ID 三件套一次配对的人。核心检索词就是 Codex auth.json 配置迁移,我会把字段模板、逐条验证动作、以及本周真实出现的报错对照都写清楚。
需要先说明一个边界:Hermes Agent 的hermes proxy是本地代理,它解决的是「把 OAuth 提供商转成 OpenAI 接口」;而如果你希望多个工具、多台机器共享同一个入口,并且不想自己维护 OAuth 刷新逻辑,那么用一个统一的 OpenAI 兼容网关会更省事。TaoToken 就是这类网关,官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。下面所有配置都以「Codex CLI 指向统一网关」为主线,Hermes Agent 本地代理作为对照方案。
先看本周版本迭代里和配置迁移直接相关的几个点。v0.14.0 把 Slack、Matrix、语音、图像生成这些重型后端改成了懒安装,pip install hermes-agent正式进 PyPI,冷启动提速约 19 秒,hermes tools从 14 秒降到 1.5 秒以内。这些改动让本地起一个 Hermes Agent 实例的门槛低了很多,也让「本地代理 + Codex CLI」这套组合更实用。同时 browser CDP 提速 180x、跨会话 1h Claude prompt 缓存、/handoff实时会话迁移,都是围绕「长时间编码会话」做的优化。你如果打算把 Codex 当成日常主力,这些改动值得在升级后逐项确认。
还有一个容易被忽略的细节:v0.14.0 引入了原生 Windows 测试版,Windows 首次作为一等公民平台支持。但本周 carry-over 事项里,「Windows 系统代理导致 502」这个 P2 issue 状态是「可能改善」,并没有明确关闭。也就是说,Windows 用户如果在auth.json里配了本地代理地址,仍可能遇到 502。这一点在后面的排障章节会展开。
2. 迁移前的前置准备:TaoToken Key、模型 ID 与 Hermes Agent 版本核对
动手改auth.json之前,先把三样东西准备好,否则改到一半发现 Key 不对、模型 ID 不存在,会浪费很多时间。
第一样是 API Key。到 TaoToken 控制台创建一个 Key,入口是 https://taotoken.net/console 。创建时建议按用途命名,比如codex-cli-local,方便后面在多个工具之间区分。Key 只在创建时完整显示一次,复制后先存到密码管理器里。注意不要把它写进会提交到 Git 的文件,auth.json本身应该在你的全局忽略列表里。
第二样是 Model ID。Codex CLI 的配置里需要明确指定模型,常见的是gpt-5-codex这类编码专用模型,也有gpt-5、o3等通用模型。具体可用列表以控制台或模型对话页展示为准,你可以先在 https://taotoken.net/models 用模型对话功能发一条测试消息,确认这个模型 ID 在当前 Key 下可用。这一步很关键:很多人auth.json写对了,但 Model ID 拼错,结果 Codex 启动时报model not found,却误以为是鉴权问题。
第三样是 Hermes Agent 的版本。执行:
hermes --version pip show hermes-agent | grep -i version确认输出是 v0.14.0 或更高。如果你还在 v0.13.x,hermes proxy相关命令可能不存在,配置迁移的路径也不一样。升级命令:
pip install -U hermes-agent升级后跑一次hermes doctor,v0.14.0 把 doctor 检查改成了并行执行,速度比以前快很多。doctor 会检查 provider 配置、依赖完整性、平台适配器状态。如果 doctor 报某个 provider 不可达,先解决它,再动auth.json。
这里插一句关于「统一网关 vs 本地代理」的选择。Hermes Agent 的hermes proxy适合你已经有 Claude Pro / ChatGPT Pro / SuperGrok 订阅、想复用订阅额度的情况;它的鉴权走 OAuth,需要浏览器登录一次。而统一网关适合你希望用 API Key 方式、多工具共享、不依赖某个订阅账号的情况。两者不冲突,你可以同时配。本文主线走 API Key 方式,因为auth.json的字段结构对这种方式最直接。
准备好三样东西后,先备份现有的auth.json:
cp ~/.codex/auth.json ~/.codex/auth.json.bak.$(date +%Y%m%d)Windows 下路径是%USERPROFILE%\.codex\auth.json,用 PowerShell:
Copy-Item $env:USERPROFILE\.codex\auth.json $env:USERPROFILE\.codex\auth.json.bak备份这一步别省。本周 issue #29548 就是关于「命名 provider 的用户身份信息在某些路径下被丢失」,配置类问题一旦改错,回滚成本很高。
最后确认一下 Codex CLI 本身的版本。codex --version,如果太旧,auth.json的字段解析逻辑可能和新版不一致。建议升到当前稳定版再迁移。
3. 可复制的 auth.json 字段模板与 settings 配置片段
这一节是全文的核心,给出可以直接复制的配置。先看~/.codex/auth.json的完整模板:
{ "OPENAI_API_KEY": "sk-你的TaoTokenKey", "OPENAI_BASE_URL": "https://taotoken.net/api", "OPENAI_MODEL": "gpt-5-codex", "tokens": { "access_token": "sk-你的TaoTokenKey", "refresh_token": "", "id_token": "" }, "last_refresh": "2026-05-21T00:00:00Z" }逐字段说明。OPENAI_API_KEY和tokens.access_token都填同一个 Key,前者是 Codex 读取的主字段,后者是兼容旧版解析路径的冗余字段。OPENAI_BASE_URL填https://taotoken.net/api,注意这里不要在末尾加/v1。本周 carry-over 事项里有一条「Anthropic base_url 重复 /v1」(#24877/#24873/#24876),就是路径拼接时多了一层/v1导致 404。Codex CLI 内部会自己拼/v1/chat/completions或/v1/responses,你在 Base URL 里再加/v1就变成/v1/v1/...。
OPENAI_MODEL填你在第 2 节确认过的 Model ID。tokens.refresh_token和id_token留空字符串,API Key 方式不需要 OAuth 刷新。last_refresh填当前时间即可,格式是 ISO 8601。
如果你用的是 Hermes Agent 本地代理而不是统一网关,OPENAI_BASE_URL改成http://127.0.0.1:8787/v1(端口以hermes proxy实际输出为准),Key 填hermes-proxy这类占位值,因为本地代理不校验 Key。但要注意,本地代理模式下 Codex 的请求会先到 Hermes,再由 Hermes 转发到 OAuth 提供商,链路更长,出问题时排查点更多。
除了auth.json,Codex CLI 还会读~/.codex/config.toml。建议把模型和 provider 也写进去,避免只改一处导致不一致:
model = "gpt-5-codex" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "OPENAI_API_KEY" wire_api = "chat"wire_api填chat表示走 Chat Completions 接口;如果你的模型只支持 Responses 接口,改成responses。env_key指向环境变量名,Codex 会从环境变量里读 Key,这样你可以把 Key 放在 shell 配置里而不是明文写进auth.json:
export OPENAI_API_KEY="sk-你的TaoTokenKey"Windows PowerShell:
$env:OPENAI_API_KEY = "sk-你的TaoTokenKey"如果你同时用 Cline 或 Continue,它们的配置结构不同,但三件套是一样的。Cline 的 MCP 配置里:
{ "mcpServers": { "taotoken": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-openai"], "env": { "OPENAI_API_KEY": "sk-你的TaoTokenKey", "OPENAI_BASE_URL": "https://taotoken.net/api", "OPENAI_MODEL": "gpt-5-codex" } } } }Cline 的 MCP 配置里 Base URL、Key、Model ID 三件套必须齐全,缺一个就会在连接阶段失败。Continue 的config.json类似,在models数组里加一项,provider填openai,apiBase填https://taotoken.net/api,apiKey填 Key,model填 Model ID。
配置写完后,检查 JSON 语法。一个逗号错位就会让 Codex 直接报解析失败:
python -m json.tool ~/.codex/auth.json输出格式化后的 JSON 就说明语法正确。TOML 用:
python -c "import tomllib; tomllib.load(open('$HOME/.codex/config.toml','rb'))"4. 验证请求:从 curl 到 Codex 实际调用的逐条确认
配置写完不等于能用,必须逐层验证。我习惯从最底层往上测,这样出错时能快速定位是哪一层的问题。
第一层,直接用 curl 测网关连通性和 Key 有效性:
curl -sS https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoTokenKey" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-5-codex", "messages": [{"role": "user", "content": "reply with ok"}], "max_tokens": 16 }'预期返回一个 JSON,choices[0].message.content里是ok或类似内容。如果返回 401,说明 Key 不对或没带上;如果返回 404,多半是路径问题,检查是不是多写了/v1;如果返回model not found,说明 Model ID 不对。
第二层,测 Codex CLI 能否读到配置:
codex --version codex config get model codex config get model_provider如果config get输出和你写的不一致,说明 Codex 读的是另一个配置文件,或者环境变量覆盖了文件配置。Codex 的配置优先级是:命令行参数 > 环境变量 >config.toml>auth.json。所以如果你 shell 里export OPENAI_BASE_URL了旧值,会覆盖文件里的新值。用env | grep OPENAI检查一下。
第三层,跑一次真实调用:
codex exec "print hello world in python"观察输出。成功的话 Codex 会返回一段 Python 代码。失败的话,把报错原文记下来,对照第 5 节。
第四层,如果你同时配了 Hermes Agent 本地代理,验证代理是否在监听:
curl -sS http://127.0.0.1:8787/v1/models \ -H "Authorization: Bearer hermes-proxy"返回模型列表说明代理正常。如果连接被拒绝,说明hermes proxy没启动,或者端口不对。启动命令:
hermes proxy --port 8787第五层,验证长时间会话。v0.14.0 的跨会话 1h Claude prompt 缓存和/handoff实时会话迁移是这一周的重点特性。你可以开一个 Codex 会话,让它读几个文件,然后用/handoff切换模型,观察上下文是否保留。这一步不是必须,但如果你打算把 Codex 当主力,值得测一次。
验证过程中,把每一步的输入输出都记下来。本周 issue #29540 新增了 provider 连接验证框架,思路就是「正式使用前先验证所有 provider 是否可达」。你可以手动做同样的事:对每个要用的 Model ID 都跑一次 curl,确认可用后再写进配置。
如果验证全部通过,你会看到 Codex 正常返回代码,curl 返回 200,hermes doctor全绿。这时候再回到日常编码,心里就有底了。
5. 本篇常见报错排查:401、local proxy failed、reading choices、OAuth
这一节对照本周真实出现的报错,逐条给排查路径。这些报错我在迁移过程中基本都遇到过,按顺序排查能省不少时间。
401 Unauthorized。最常见。先确认 Key 有没有多余空格,复制时很容易带上换行。然后确认Authorization头格式是Bearer sk-xxx,中间一个空格。如果 Key 是从环境变量读的,用echo $OPENAI_API_KEY | head -c 10看前几位对不对。还有一种情况是 Key 被禁用或额度耗尽,到控制台确认状态。
local proxy failed。这个报错出现在 Hermes Agent 本地代理模式下。原因通常是hermes proxy没启动,或者端口被占用。检查:
lsof -i :8787 hermes proxy --port 8787 --verbose--verbose会打印转发日志,能看到请求到底发到了哪里。如果日志显示转发到 OAuth 提供商后返回 400,那可能是本周 issue #15080 那个 Claude Max OAuth token 返回 HTTP 400 的问题,属于上游未解决 bug,只能等修复或改用 API Key 方式。
reading choices 报错。完整报错通常是error reading choices: unexpected end of JSON input或cannot read property 'choices' of undefined。这说明网关返回的不是标准 OpenAI 格式,或者返回了空 body。先用 curl 复现,看原始返回。如果 curl 正常但 Codex 报错,多半是 Codex 期望的wire_api和实际接口不匹配。比如你配了wire_api = "responses"但网关只支持 Chat Completions,就会解析失败。改成chat再试。
OAuth 相关报错。如果你走的是 Hermes 本地代理 + OAuth 提供商,报错可能是OAuth token expired或refresh failed。这时候需要重新登录:
hermes auth login --provider anthropic浏览器会打开授权页。注意,OAuth 方式依赖浏览器回调,如果你在无头服务器上跑,需要手动复制回调 URL。这也是为什么很多人最终选择 API Key 方式:没有刷新逻辑,没有回调,配置一次就稳定。
502 Bad Gateway。本周 carry-over 里「Windows 系统代理导致 502」状态是「可能改善」。如果你在 Windows 上遇到 502,先检查系统代理设置。Codex 和 Hermes 都会读系统代理,如果系统代理指向一个不可用的地址,请求就会 502。临时关闭系统代理再试:
netsh winhttp show proxy如果显示有代理,用netsh winhttp reset proxy重置。注意这只影响 WinHTTP,不影响浏览器代理。
model not found。Model ID 拼写错误,或者该模型在你的 Key 下不可用。到模型对话页确认可用列表。注意大小写,gpt-5-codex和GPT-5-Codex可能被区别对待。
配置不生效。Codex 读了旧配置。检查配置优先级,用codex config list看实际生效值。环境变量覆盖是最常见的原因。
排查时记住一个原则:从底层往上测。curl 通了再测 Codex,Codex 通了再测具体功能。不要一上来就改一堆配置,那样出错时不知道是哪一处引起的。
6. 把配置固化下来:长期编码与 Agent 场景的下一步
配置验证通过后,下一步是把它固化,避免每次换机器、换 shell 都要重来。
第一,把 Key 放进环境变量管理工具,而不是明文写在auth.json。macOS/Linux 用~/.zshrc或~/.bashrc,Windows 用系统环境变量。这样auth.json里可以只留 Base URL 和 Model ID,Key 从环境读。
第二,把config.toml和auth.json纳入 dotfiles 管理,但排除 Key。可以用git-secrets或gitleaks做提交前扫描,防止 Key 泄露。
第三,如果你有多个项目需要不同模型,用 Codex 的 profile 功能。在config.toml里定义多个 provider,用--profile切换:
[profiles.fast] model = "gpt-5-codex" model_provider = "taotoken" [profiles.deep] model = "o3" model_provider = "taotoken"调用时codex --profile deep exec "..."。
第四,如果你在做 Agent 类项目,需要长时间、多轮次调用,建议了解一下 Coding Plan。它面向的就是这种持续编码和 Agent 场景,入口是 https://taotoken.net/coding-plan 。和按量计费相比,长期高频调用下成本更可控。
第五,把验证脚本保存下来。我习惯写一个check-codex.sh,每次换环境跑一遍:
#!/usr/bin/env bash set -e echo "== curl test ==" curl -sS https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"gpt-5-codex","messages":[{"role":"user","content":"ok"}],"max_tokens":8}' \ | head -c 200 echo echo "== codex config ==" codex config get model codex config get model_provider echo "== codex exec ==" codex exec "print 1+1"这个脚本覆盖了三层验证,换机器时跑一次就知道配置对不对。
最后说一个本周版本迭代里值得关注的信号:v0.14.0 把「能在任何地方安装和运行」作为核心目标,懒安装、PyPI 发布、冷启动提速都是围绕这个目标。这意味着未来配置迁移会越来越简单,但鉴权链路(issue #15080 那个 P1)仍是短板。在它修复之前,API Key 方式比 OAuth 方式更稳。把auth.json配好、验证脚本存好,剩下的就是日常编码了。