1. Windows 11 上 Codex CLI 与桌面端账号打架的真实场景
如果你在 Windows 11 上同时用 Codex 桌面端和命令行工具,大概率遇到过这种糟心事:桌面端登录着自己的账号,结果在 PowerShell 里跑一下codex,它要么提示你重新登录,要么直接把桌面端的登录态给顶掉了。更麻烦的是,有些团队希望桌面端继续用账号体系,而终端里想走独立的 API Key 计费,两套东西共用一个C:\Users\<用户名>\.codex目录,配置互相覆盖,出了问题根本不知道是谁改的。
这个问题的本质是 Codex CLI 默认会读取用户主目录下的.codex文件夹,而桌面端也用同一个位置存认证信息和配置。两者共享同一份auth.json和config.toml,只要有一方触发登录流程或者写入配置,另一方就会受影响。Windows 11 下这个问题尤其明显,因为 PowerShell 的环境变量作用域、npm 全局路径、执行策略这几件事凑在一起,新手很容易卡在第一步。
我这篇要解决的就是这个:在 Windows 11 上从零装好 Node.js 和 Codex CLI,然后通过CODEX_HOME环境变量给终端单独开一套配置目录,让它用独立的 API Key 走 TaoToken 的接口,桌面端继续用原来的账号,两边互不干扰。整套流程的核心就一句话——用不同的 CODEX_HOME 目录隔离两套环境。下面每一步都给可复制的命令和配置片段,照着做能一次跑通。
适合谁看:在 Windows 11 上用 Codex 桌面端做日常开发、又想在内核终端里用 API 模式跑批量任务或脚本的人;以及被"终端一登录桌面端就掉线"折腾过的同学。你需要的基础只有一点:会用 PowerShell 复制粘贴命令。
2. 前置准备:Node.js LTS 与 Codex CLI 安装避坑
先说环境。Codex CLI 是 npm 包,所以第一步是把 Node.js 装好。Windows 11 自带 winget,直接一条命令搞定:
winget install --id OpenJS.NodeJS.LTS中途提示接受协议就输入y。装完之后一定要关掉当前 PowerShell 重新开一个,否则 PATH 不会刷新,你会以为装失败了。新窗口里验证:
node -v npm.cmd -v这里有个 Windows 11 特有的坑:如果你直接敲npm -v,很可能报这个错:
无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。这不是 npm 没装好,而是 PowerShell 的执行策略拦截了npm.ps1脚本。不要去改系统执行策略(Set-ExecutionPolicy),最省事的做法是统一用npm.cmd代替npm。后面所有命令我都写成npm.cmd,你照抄就不会踩这个坑。
接着装 Codex CLI:
npm.cmd install -g @openai/codex装完验证一下装到哪了、版本是多少:
where.exe codex codex.cmd --version正常会输出类似:
C:\Users\<用户名>\AppData\Roaming\npm\codex C:\Users\<用户名>\AppData\Roaming\npm\codex.cmd codex-cli x.x.x如果where.exe codex没有任何输出,说明 npm 全局路径没进 PATH。先查路径:
npm.cmd config get prefix常见结果是C:\Users\<用户名>\AppData\Roaming\npm。临时加进当前窗口的 PATH 就能用:
$env:Path += ";C:\Users\<用户名>\AppData\Roaming\npm" where.exe codex想永久生效就去"系统属性 → 环境变量"里把这条路径加到用户变量 Path,但临时加已经够跑通本文流程了。
更新 CLI 的时候记住一条铁律:更新前先关掉正在运行的终端 Codex,且绝对不要运行codex.cmd logout。更新命令是:
codex.cmd --version npm.cmd view @openai/codex version npm.cmd install -g @openai/codex@latest codex.cmd --versionlogout会清掉认证信息,如果你桌面端和终端共用过目录,这一下可能把桌面端也带崩。这也是为什么我们要做目录隔离——隔离之后,终端这边的操作就碰不到桌面端了。
3. 可复制配置:用 CODEX_HOME 隔离终端 API 环境
这一步是全文的核心。默认情况下 Codex CLI 读的是C:\Users\<用户名>\.codex,桌面端也用这个。我们要给终端单独指定一个目录,比如.codex-api-openai,通过CODEX_HOME环境变量告诉 CLI "这次别读默认目录,读我指定的这个"。
先创建目录并打开配置文件:
$env:CODEX_HOME="$HOME\.codex-api-openai" New-Item -ItemType Directory -Force $env:CODEX_HOME | Out-Null notepad "$env:CODEX_HOME\config.toml"$env:CODEX_HOME是当前 PowerShell 窗口的临时变量,只影响这个窗口,关掉就失效——这正是我们要的隔离效果。在打开的记事本里粘贴下面这份配置:
model_provider = "OpenAI" model = "<供应商提供的模型名>" review_model = "<供应商提供的模型名>" model_reasoning_effort = "xhigh" disable_response_storage = true network_access = "enabled" windows_wsl_setup_acknowledged = true [model_providers.OpenAI] name = "OpenAI" base_url = "https://taotoken.net/api/v1" wire_api = "responses" env_key = "OPENAI_API_KEY" [features] goals = true需要你替换的只有两处:<供应商提供的模型名>换成 TaoToken 文档里给的模型 ID,base_url按你实际用的接口地址填。TaoToken 的 API 入口是https://taotoken.net/api,配置里通常补上/v1后缀,具体以文档为准。
这里有两个关键点必须讲清楚。第一,不要把真实 API Key 写进 config.toml。配置里只写env_key = "OPENAI_API_KEY",意思是"去环境变量里找这个名字的 Key",真正的 Key 在启动时临时注入。第二,不要写requires_openai_auth = true。这一项表示走账号认证而不是 API Key,一旦写上,CLI 就会忽略你的环境变量去走登录流程,正好和我们的目标相反。判断标准很简单:配置里出现env_key且没有requires_openai_auth,才是纯 API Key 模式。
wire_api = "responses"这一项也要留意,它要求后端兼容 responses 接口形式。如果你的服务只兼容普通 chat completions,这一项可能要调整,否则会报接口不支持的错。这个放到第 5 节排错里细说。
配置存好之后,日常启动终端 API 模式就三行:
$env:CODEX_HOME="$HOME\.codex-api-openai" $env:OPENAI_API_KEY="<你的API_KEY>" codex.cmdKey 只存在于当前窗口的临时变量里,关掉 PowerShell 就没了,不会落盘,也不会被桌面端读到。想确认当前窗口是不是 API 模式,跑这两条:
Get-ChildItem Env:CODEX_HOME Get-ChildItem Env:OPENAI_API_KEY看到CODEX_HOME指向.codex-api-openai、OPENAI_API_KEY有值,就说明隔离生效了。想退出 API 模式,直接关窗口,或者手动清:
Remove-Item Env:CODEX_HOME -ErrorAction SilentlyContinue Remove-Item Env:OPENAI_API_KEY -ErrorAction SilentlyContinue4. 验证请求:确认 CLI 走的是独立 API 而非桌面端账号
配置写完不能只看文件,得实际发一次请求确认它真的走了 API Key。启动之后,在 Codex CLI 里随便问一句让它回个话,比如让它解释一段代码或者生成一个简单函数。如果它正常返回内容,说明请求已经打到base_url指向的接口上了。
更严谨的验证方式是看它有没有弹登录。如果 CLI 启动后要求你账号登录,那基本可以断定配置没走 API Key,回去检查三件事:
Get-ChildItem Env:CODEX_HOME Get-ChildItem Env:OPENAI_API_KEY notepad "$env:CODEX_HOME\config.toml"确认config.toml里有env_key = "OPENAI_API_KEY",并且没有requires_openai_auth = true。这两条同时满足,CLI 才会从环境变量读 Key。
再验证一下桌面端没被影响。保持桌面端登录状态不动,在另一个 PowerShell 窗口跑一遍 API 模式,然后回到桌面端看它是否还在登录态。因为两套环境用的是不同目录(桌面端.codex,终端.codex-api-openai),理论上互不干扰。我实测下来,只要不在终端里跑logout,桌面端登录态是稳的。
还有一个容易忽略的点:如果你同时开着桌面端和终端 Codex,不要让它们同时改同一个项目文件夹。两个进程并发写文件容易冲突,稳妥做法是同一时间只让一个 Codex 动项目文件,另一个只用来查看或讨论。这不是配置问题,是使用习惯问题,但踩过一次就知道疼。
验证通过后,你的日常结构应该是这样:
Codex 桌面端 └── 使用默认 .codex 目录 └── 保持账号登录,不退出、不 logout PowerShell 终端 Codex CLI └── 使用 .codex-api-openai 目录 └── 通过 OPENAI_API_KEY 环境变量调用 API两套环境物理隔离,配置和认证各管各的,这才是"双轨使用"该有的样子。
5. 常见报错排查:401、local proxy failed 与接口不兼容
这一节把实际会撞到的报错列出来,对照着查。
报错一:401 Unauthorized。最常见的原因是 Key 没注入或者名字对不上。先确认当前窗口的环境变量:
Get-ChildItem Env:OPENAI_API_KEY如果没输出,说明你没设或者设完关了窗口。重新设一遍再启动。如果 Key 有值还报 401,检查config.toml里的env_key是不是OPENAI_API_KEY,名字必须和环境变量名完全一致,大小写敏感。另外确认 Key 本身没过期、额度没用完。
报错二:local proxy failed 或连接被拒。这类通常是base_url写错,或者网络层到不了目标地址。先核对base_url是否和文档一致,注意结尾的/v1有没有漏或多。有些服务要求带/v1,有些不带,以文档为准。如果地址没问题,检查本机网络是否能正常访问该域名,公司网络有出口限制的话也会表现为连接失败。
报错三:reading choices 相关解析错误。这个多半是wire_api和后端接口形式不匹配。配置里写的是wire_api = "responses",但后端只支持 chat completions 时,返回结构对不上,CLI 解析choices字段就会失败。解决办法是确认你的服务支持哪种接口形式,按文档调整wire_api的值。
报错四:OAuth 或要求登录。出现登录提示说明配置被判定为账号模式。回去检查config.toml里有没有误写requires_openai_auth = true,有就删掉。同时确认CODEX_HOME确实指向了.codex-api-openai而不是默认目录——如果变量没生效,CLI 读的是桌面端那份配置,自然走账号认证。
报错五:npm 执行策略错误。前面提过,npm -v报npm.ps1 禁止运行脚本,统一改用npm.cmd即可,不用动系统策略。
报错六:where.exe codex 找不到。用npm.cmd config get prefix查全局路径,临时加 PATH:
$env:Path += ";C:\Users\<用户名>\AppData\Roaming\npm" where.exe codex排查顺序建议固定下来:先看环境变量有没有生效,再看 config.toml 内容对不对,最后看 base_url 和接口形式。这三层从内到外,能覆盖九成以上的问题。
6. 长期使用建议与接入入口
跑通之后,把几个习惯固定下来能省很多事。第一,永远不要在 API 模式里跑codex.cmd logout,也不要在桌面端随手点退出登录,隔离环境最怕的就是手动去清认证。第二,把启动 API 模式的三行命令存成一个.ps1脚本或者记事本片段,每次复制粘贴,避免手敲漏掉CODEX_HOME那一行——漏了它,CLI 就跑去读桌面端配置了。第三,Key 只放临时环境变量,不写进任何配置文件,不截图,不外发。
如果你还没拿到可用的 API Key,或者想确认模型 ID 和接口地址怎么填,可以走这几个入口:
- 需要创建和管理 Key:访问 TaoToken API Keys
- 想先在线验证模型能不能通:用 模型对话 试一句
- 长期在终端里跑编码和 Agent 任务:看 Coding Plan
- 配置参数和接口细节对照:接入文档
- 控制台总入口:Console
最后给一个我自己的收尾习惯:每次更新 Codex CLI 之前,先关掉所有终端 Codex 进程,更新完在 API 模式窗口里跑一次codex.cmd --version确认版本,再发一句测试请求确认 Key 还有效。这三步做完,桌面端和终端两边都能安心用,不会出现"更新完发现登录态没了"的意外。