Codex 报 session expired?TaoToken 的 Base URL 该填什么
你敲下codex 分析代码终端却回了一行Error: Session expired Your session has expired. Please log in again.或者换codex --print task --max-turns 5后拿到401 Unauthorized Invalid authentication token.——这就是 Codex CLI 的会话过期。要让它不再卡在登录态可以先打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建 TaoToken Key然后把 Codex 的 Base URL 填成https://taotoken.net/apiKey 填 TaoToken 的 Key。这篇就围绕这个报错把原因、配置、验证和排障一次讲清。你不需要先重装 Codex也不用反复codex /login先把认证源和配置文件对齐通常就能把session expired压下去。1. Codex CLI 报 session expired 时终端会怎么提示1.1 四种典型输出Session expired、401、token_expired、OAuth token invalid原文把 Codex CLI 的会话问题归成几类实际终端输出也不止一种。最直白的是执行codex 分析代码后出现Error: Session expired带--print时常见401 Unauthorized Invalid authentication token令牌过期会写token_expired如果走 OAuth则可能提示OAuth token invalid Please re-authenticate with /login。这些文案看着不同本质都是 Codex 当前拿到的认证材料不被接受或者认证材料已经失效。你要先确认自己撞的是哪一类再决定是刷新、重登还是把认证源切到统一 API 通道。不要一看到401就认定模型挂了也不要一看到OAuth token invalid就反复点登录。Codex 的认证层和模型请求层是两件事认证没过后面模型再正常也调不到。1.2 哪些场景最容易把 Codex 会话拖过期OAuth 过期、API Key 被撤销、长时间没打开、账户密码变更、刷新过程被网络打断、多台设备同时登录都会让 Codex 的会话状态变成不可用。原文把 OAuth 过期和 Key 撤销放在最前面这个判断很符合日常体验交互式登录方便但它天生有生命周期API Key 不自动过期但一旦被删除或限制Codex 也会立刻拿不到可用身份。多设备冲突更隐蔽。你在 A 机器/login后B 机器可能认为旧 token 已失效于是两台机器轮流报错。还有一种常见情况是本地同时存在旧OPENAI_API_KEY和新配置Codex 实际读到的 provider 和你以为的不一样。排障时先看环境变量和~/.codex/config.toml比反复重登省时间。1.3 只重新登录为什么过一会儿又报codex /login或codex login能解决一部分 OAuth 过期但它不改变认证来源只是把旧令牌换成新令牌。如果你的使用环境经常换机器、跑 CI、或者需要长时间无人值守OAuth 的刷新链路仍然可能断。此时更稳的思路是让 Codex 走一个长期可用的 API Key并把请求发到统一的兼容通道。TaoToken 在这里的作用就是提供统一 API 接入你拿到一把 Key把 Codex 的 provider 指向https://taotoken.net/api后续就不用在每个终端里反复处理 OAuth 登录态。它不是让你绕过什么限制而是把认证材料换成一个可控的 Key让 Codex 的命令行行为更稳定。2. 从 platform.openai.com 到统一通道认证源换到哪2.1 原方案的两条路codex /login 和 OPENAI_API_KEY原文给的方案一和方案二很典型一条是交互式 OAuth一条是官方 API Key。codex /login适合本机临时使用export OPENAI_API_KEYsk-xxx适合脚本和 CI。但两者都绑定在原来的认证体系上要么等 OAuth 刷新要么去 platform.openai.com 创建和管理 Key。你现在遇到 session expired如果不想继续在登录态里打转可以把创建 Key 的动作改到统一控制台打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册并创建YOUR_API_KEY然后让 Codex 使用这把 Key。原来的codex /login可以保留为备用但主路径建议放到~/.codex/config.toml里明确指定 provider 和 Base URL。2.2 打开控制台创建 YOUR_API_KEY而不是去 platform.openai.com进入 TaoToken 后按控制台提示创建 API Key。Key 只显示一次或有限次数复制后先放到密码管理器或本机环境变量里不要直接写进要提交到 Git 的文件。Codex 侧需要两个值Base URL 填https://taotoken.net/apiAPI Key 填YOUR_API_KEY。模型 ID 不要凭记忆写去模型广场查看当前可用的模型标识再把对应字符串填到model字段。这样配置出来的 Codex 不会再去读取已经过期的 OAuth 会话而是每次用 Key 走兼容通道。模型广场和 Key 管理都在同一个控制台入口创建完不要关掉页面后面验证时还要回来核对。2.3 Base URL 是 https://taotoken.net/api末尾不要加 /v1很多人排障时会把 Base URL 写成https://taotoken.net/api/v1这是最常见的错法之一。TaoToken 给 Codex 填的 Base URL 是https://taotoken.net/api末尾不带/v1。如果 Codex 内部按 provider 配置拼接路径它会自己拼出具体接口你手动补/v1反而可能得到 404。官网落地页是https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end它用于注册、创建 Key、看模型广场和用量不要把它填进base_url。这两个地址分工明确一个给人点一个给工具连。把官网地址填进配置Codex 只会拿到 HTML接口调用自然失败。3. 改 ~/.codex/config.toml让 codex 命令走统一通道3.1 先备份并处理旧的 ~/.codex/credentials.json在动配置前先看~/.codex下有什么。旧 OAuth 凭证通常躺在~/.codex/credentials.json有些版本还会有auth.json或session*缓存。如果这些文件损坏或仍指向旧认证Codex 可能优先读它们导致你明明改了config.toml还是报 Session expired。可以先把目录备份再清理旧凭证cp -r ~/.codex ~/.codex.bak.$(date %s) ls -la ~/.codex/credentials.json rm -f ~/.codex/credentials.json rm -f ~/.codex/auth.json rm -f ~/.codex/session*清理不是必做但当你从 OAuth 切到 API Key 时它能把旧会话的干扰降到最低。Windows 下对应目录通常是%USERPROFILE%\.codex文件操作换成资源管理器或 PowerShell 即可。3.2 Codex 的 config.toml 怎么写model_provider、base_url、env_keyCodex CLI 读取~/.codex/config.toml。下面这份配置把 provider 指到兼容通道Key 从环境变量TAOTOKEN_API_KEY读取Base URL 不带/v1# ~/.codex/config.toml model YOUR_MODEL_ID model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat这里model必须换成模型广场里的真实模型 ID不能写gpt-5或随手加日期后缀。model_provider的值要和[model_providers.taotoken]的表名一致大小写不要乱改。env_key写的是环境变量名不是 Key 本身不要把YOUR_API_KEY直接写进这一行除非你非常确定这份文件不会进版本控制。3.3 环境变量持久化bash、zsh、PowerShell 分别怎么写临时验证可以只在当前终端导出export TAOTOKEN_API_KEYYOUR_API_KEY codex --print hello --max-turns 1确认可用后再持久化。bash 用户写~/.bashrczsh 用户写~/.zshrcecho export TAOTOKEN_API_KEYYOUR_API_KEY ~/.bashrc source ~/.bashrczshecho export TAOTOKEN_API_KEYYOUR_API_KEY ~/.zshrc source ~/.zshrcPowerShell 当前会话$env:TAOTOKEN_API_KEYYOUR_API_KEY写入用户环境变量[Environment]::SetEnvironmentVariable(TAOTOKEN_API_KEY,YOUR_API_KEY,User)不要在这段里套ANTHROPIC_*变量。Codex 走的是model_providers和env_key和 Claude Code 的环境变量不是一套东西。把两种工具的变量混在一起是后面出现“配置看起来对但 Codex 不认”的常见原因。3.4 多个 Codex profile 或旧环境变量会不会覆盖如果你机器上同时装过多个 Codex 版本或者.codex/config.toml里还有别的 profile先确认当前命令实际读取哪一份配置。可以检查echo $TAOTOKEN_API_KEY env | grep -E OPENAI|TAOTOKEN|CODEX如果OPENAI_API_KEY仍指向旧 Key而 Codex 又恰好回退到默认 provider就可能继续走旧认证。此时要么删除旧环境变量要么在config.toml里明确指定model_provider taotoken。另外base_url后面不要手写/v1env_key不要写成api_keymodel_provider不要和 provider 表名不匹配。三处对齐后Codex 才会稳定走统一通道。4. 验证 codex 不再报 Session expired4.1 最小验证命令配置保存后新开一个终端确保环境变量已经加载再运行codex --print hello --max-turns 1如果终端返回模型输出而不是Error: Session expired说明 Codex 已经拿到了新的认证源。再跑一个更接近日常的命令codex 解释当前目录下的 README不要改文件这里故意让它只解释、不改文件方便你确认请求能正常送达。若仍报401 Unauthorized先不要怀疑模型优先检查TAOTOKEN_API_KEY是否为空、是否复制了多余空格、base_url是否写成了带/v1的版本。4.2 用 curl 验证 Key 与模型 IDCodex 报错有时不够具体可以先用 curl 直接测通道。注意 URL 是https://taotoken.net/api/chat/completions没有/v1curl -s https://taotoken.net/api/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d {model:YOUR_MODEL_ID,messages:[{role:user,content:hi}],max_tokens:10}返回内容里如果有正常 JSON 结构说明 Key、Base URL 和模型 ID 这条链路基本通了。若返回 401看 Key若返回 404看 URL 是否多了/v1或少了/api若返回模型不存在去模型广场核对YOUR_MODEL_ID。不要把 curl 里的地址换成官网落地页那会返回网页而不是接口响应。4.3 排障对照still session expired、401、404、model not found仍然session expired旧~/.codex/credentials.json可能还在或者config.toml没被当前命令读取删旧凭证确认 provider 名称。401 UnauthorizedTAOTOKEN_API_KEY没导出、Key 复制不完整、Key 已在控制台撤销。404 Not Foundbase_url写成了https://taotoken.net/api/v1或者手动拼了错误路径。model not foundmodel字段不是模型广场里的当前 ID。报错变成权限或账户状态去控制台看 Key 状态和账户情况不要反复重装 Codex。多设备一台好一台坏分别检查两台机器的环境变量和~/.codex/config.toml不要共用同一个交互式登录态。4.4 在模型广场核对模型 ID 和用量模型 ID 不要从旧笔记里抄。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 进入模型广场看当前列表里的标识再填回model。同一页面也能进控制台看 Key 和用量。配完 Codex 后第一次成功调用最好回控制台确认这次请求有没有记上如果没记上说明你实际调用的可能仍是旧 provider或者环境变量优先级不对。这个回头检查比反复/login更有用因为你能看到请求到底走了哪条通道。用量记录、Key 状态、模型列表都在控制台里排障时不要只盯终端报错。5. 原文六种方案在统一通道场景下怎么取舍5.1 重新登录、刷新令牌、清凭证分别适合什么原文的方案一到方案四核心都在处理 OAuth 生命周期和本地凭证。codex /login适合临时救急/refresh适合轻微过期清credentials.json适合文件损坏。它们不是没用而是不解决“认证源固定”的问题。如果你只是偶尔在本机用 Codex登录一下完全够如果你经常遇到 session expired或者需要在多台设备、CI 里跑同一套命令让 Codex 走统一 API Key 通道会更可控。5.2 API Key 与 OAuth 在 CI/CD、多设备下的差异OAuth 适合人机交互浏览器点一下就能续API Key 适合脚本、容器和无人值守但不自动过期不等于永远安全泄露后要立刻撤销。原文也提到 CI/CD 更适合 API Key。放到统一通道场景里建议每台设备或每个 CI 环境单独创建 Key而不是把同一把 Key 复制到所有地方。这样某台机器出问题只需撤销对应 Key不会影响其他工作流。多设备冲突也会少很多因为不再共享一个 OAuth 会话。你还可以在控制台按 Key 看用量定位是哪台机器调用异常。5.3 不要把 OAuth 登录态和 API Key 混在同一份配置里有的读者会一边保留codex /login一边又把config.toml改到统一通道结果两边互相干扰。要么让 Codex 明确走model_provider taotoken要么继续用官方 OAuth不要指望它自动判断“哪个还能用”。如果你必须保留旧配置至少用不同 profile 或注释区分并在切换后清理旧环境变量。最怕的是终端里OPENAI_API_KEY还在而config.toml又指向统一通道最后报错信息看起来像 Key 失效实际是 provider 选错了。5.4 方案对比表做法适合场景需要动哪里注意点codex /loginOAuth 临时过期终端交互多设备可能互踢codex /refresh令牌可刷新终端交互刷新失败仍要重登清credentials.json凭证损坏~/.codex清完要有新认证源OPENAI_API_KEY官方 Key 长期环境变量Key 在 platform.openai.com 管理统一通道 Key config.toml多设备、脚本化~/.codex/config.tomlBase URL 填https://taotoken.net/api清除 cache 重登严重会话错乱~/.codex会丢掉旧会话需重新配置6. FAQCodex 会话过期与 Base URL 填写的追问6.1 OAuth 令牌多久过期API Key 会过期吗原文给的经验是 OAuth 令牌通常 1 到 2 小时过期API Key 不会自动过期但可以被手动撤销。这个区别很关键如果你频繁遇到 session expired而你用的是 OAuth那很可能是正常生命周期如果你用的是 API Key 还报认证失败就要检查 Key 是否被撤销、复制是否完整、环境变量是否生效。在控制台里创建的 Key 也建议按这个思路管理创建后妥善保存发现异常先看控制台状态再决定是否新建。不要把 Key 写进公开仓库也不要在聊天记录里明文传输。6.2 credentials.json 还要不要chmod 600 有用吗~/.codex/credentials.json是旧 OAuth 凭证常见的落点。切到 API Key 后它不是必须保留的文件如果它损坏或指向旧会话反而会干扰排障。权限方面chmod 600能避免同机器其他用户读到敏感文件这是好习惯但不能解决令牌本身过期的问题。真正让 Codex 不再报 session expired 的是让它有可用的认证源并且 provider 指向正确的 Base URL。权限修复只是锦上添花。你也可以顺手把~/.codex/config.toml权限收一下避免里面出现不该出现的明文 Key。6.3 Base URL 末尾要不要 /v1模型 ID 怎么选Base URL 填https://taotoken.net/api末尾不要加/v1。这是本篇最容易填错的一处。模型 ID 不要写猜测值去 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 的模型广场看当前可用标识再填到config.toml的model字段。不同时间模型列表可能变化以页面当时展示为准不要从旧教程里抄一个带日期后缀的字符串当正式配置。6.4 多设备登录冲突怎么避免多设备冲突通常来自共享同一个 OAuth 登录态。解决思路不是反复在两台机器上轮流/login而是让每台机器使用独立的 API Key 走统一通道。在控制台分别创建、分别命名、分别配置到各自的TAOTOKEN_API_KEY。这样一台设备重新配置不会把另一台踢下线也方便你按 Key 看用量。若某台设备不再使用撤销对应 Key 即可。7. 跑通后去控制台核对这次 Codex 调用7.1 先用模型对话发一条测试消息Codex 命令能返回结果后建议再做一次交叉验证用同一把 Key 打开 TaoToken 模型对话发一条短消息选择与config.toml相同的模型 ID。如果网页对话正常、Codex 也正常说明 Key 和模型没问题如果网页正常而 Codex 仍报错重点查~/.codex/config.toml的 provider 和 Base URL。这个对比能快速区分“Key 问题”和“Codex 配置问题”。7.2 长期终端使用看 Coding Plan 和 API Keys如果你打算把 Codex 长期放在终端里写代码、跑重构解释、生成测试可以打开 Coding Plan 看当前套餐是否匹配你的使用节奏。Key 的新建、撤销和查看在 控制台 API Keys。若你还同时使用 Claude Code环境变量和接入方式对照 Claude Code 接入文档但不要把它的ANTHROPIC_*变量套到 Codex 的config.toml上。7.3 Codex 只负责生成和解释执行动作仍在你本地最后提醒一句Codex 这类 AI 编程工具可以生成代码、解释 SQL、对照配置差异但它不应该被写成能直接连你的生产库或生产机器执行诊断。比如数据库诊断 SQL、编译运行、服务重启这些动作由你在本地或对应客户端里执行再把输出贴回对话让它分析。把权限边界收好Codex 的会话过期问题解决了也不会顺手引入新的操作风险。