1. codex 安装目录到底在哪:一次把路径来源理清
很多人第一次遇到codex命令能跑、但配置文件不知道读的哪一份,或者反过来,改了auth.json却完全不生效。这个问题的根源在于:Codex 的「安装目录」和「配置目录」是两套东西,而 Windows 上 npm 全局安装、SDK 内嵌安装、绿色版解压安装三种方式会同时存在,where codex一敲出来好几行,谁生效全靠 PATH 顺序。
先把概念拆开。安装目录指的是可执行文件codex.exe/codex.cmd所在的位置,决定你敲codex时实际跑的是哪个二进制。配置目录指的是auth.json、config.toml这类文件所在的位置,决定它连哪个 endpoint、用哪个 Key、调哪个模型。两者可以完全不在一个盘符下,这就是「安装目录找不到」这个说法背后真正的坑。
适合谁看:已经在 Windows 上装过 Codex CLI 或 Codex SDK,但不确定当前生效的是哪一份配置;准备把 Base URL 切到统一网关(比如 TaoToken)做集中管理;或者被401、local proxy failed、reading choices这类报错卡住,想先确认配置来源再动手改的人。
我试过的典型现场是这样的:where codex返回E:\Green\codex\codex.cmd和E:\Green\claude-code\n\codex.cmd两条,但auth.json却在C:\Users\Administrator\.codex\下,而 npm 的全局 prefix 又指向E:\Green\claude-code\n。三处路径互相独立,改错一处等于没改。所以排查顺序必须是:先定位二进制 → 再定位配置目录 → 最后核对 endpoint 与 Key 是否一致。
下面给出一套可复制的定位流程,全部在 PowerShell 或 CMD 里执行,不需要额外工具。核心思路是用系统自带的where、npm config、Get-ChildItem三条命令交叉验证,把「实际生效路径」逼出来。
第一步,确认命令解析顺序:
where.exe codex输出从上到下就是 PATH 的优先级,第一行才是真正生效的那个。如果第一行是E:\Green\codex\codex.cmd,那后面几行都是干扰项,改配置时优先看它旁边的目录。
第二步,确认 npm 全局安装位置,因为用npm i -g @openai/codex装的版本,二进制会落在 prefix 下:
npm config get prefix npm root -gprefix是全局 bin 的父目录,root -g是全局node_modules的位置。两者通常差一层,比如prefix是E:\Green\claude-code\n,那root -g就是E:\Green\claude-code\n\node_modules。Codex 的 npm 包解压后会出现在node_modules\@openai\codex\下,里面还带一个平台子包,形如@openai\codex-win32-x64,真正的codex.exe就在那个子包里。
第三步,把配置目录找出来。Codex 默认读用户主目录下的.codex:
Get-ChildItem -Path $env:USERPROFILE\.codex -Force如果这个目录不存在,说明你用的是绿色版或 SDK 内嵌版,配置可能跟着安装目录走。这时候用递归搜索把auth.json和config.toml全盘捞一遍(限定几个常见根目录,避免全盘扫描太慢):
Get-ChildItem -Path C:\,E:\ -Recurse -Filter auth.json -ErrorAction SilentlyContinue | Where-Object { $_.FullName -match 'codex|openai' } | Select-Object FullName, LastWriteTimeLastWriteTime很关键,最近被改过的那个才是当前生效的。多个auth.json并存时,靠时间戳判断比靠猜靠谱得多。
把上面三步的结果整理成一张对照表,你就能一眼看出配置来源:
| 检查项 | 命令 | 典型输出 | 含义 |
|---|---|---|---|
| 生效二进制 | where.exe codex | E:\Green\codex\codex.cmd | PATH 第一优先级 |
| npm 全局 bin | npm config get prefix | E:\Green\claude-code\n | npm 装的命令落点 |
| npm 全局模块 | npm root -g | E:\Green\claude-code\n\node_modules | 包解压位置 |
| 用户配置目录 | $env:USERPROFILE\.codex | C:\Users\Administrator\.codex | 默认 auth.json 位置 |
| 实际配置文件 | 递归搜auth.json | 按 LastWriteTime 排序 | 真正生效的那份 |
这张表填完,「安装目录找不到」基本就变成「我知道它在哪、也知道哪份生效」了。接下来才是把 endpoint 统一到 TaoToken 的动作,因为只有先确认了配置来源,改 Base URL 才不会改到一份死文件上。
2. 用 TaoToken 统一 Key:前置准备与目录约定
在动手改配置之前,先把 TaoToken 这边的准备工作做完,否则你会在「Key 从哪来」和「endpoint 填什么」上反复卡壳。TaoToken 的定位是一个统一的模型接入网关,把不同厂商的 Key 收敛成一套 Base URL + 一个 Key,Codex、Claude Code、Cline 这些工具都指向同一个入口,配置管理成本会低很多。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 根地址是 https://taotoken.net/api ,注意 API 地址不带任何查询参数,配置里就填这个干净的根。
前置准备分三件事:拿 Key、确认模型 ID、约定配置目录。
拿 Key 的路径是登录后进控制台,在 API Keys 页面新建一个。建议按用途分开建,比如codex-local、cline-mcp各一个,方便后面出问题时单独吊销。新建完立刻复制,页面刷新后通常不再完整显示。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API Keys 页面是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
模型 ID 这块要特别注意:Codex 走的是 OpenAI 兼容协议,所以 Model ID 填的是模型名,不是随便一个字符串。你可以在模型对话页面先验证一下某个模型能不能通,再写进配置。模型对话入口是 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。如果打算长期跑编码和 Agent 任务,Coding Plan 页面有对应的套餐说明,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
配置目录的约定,直接沿用上一节定位出来的结果。假设你的生效配置目录是C:\Users\Administrator\.codex,那后面所有文件都放这里,不要一会儿改绿色版目录、一会儿改 npm 目录,那样只会让「哪份生效」重新变乱。如果定位出来生效的是绿色版目录(比如E:\Green\codex),那就统一用那个,原则只有一个:跟着where.exe codex第一行走。
这里有个容易忽略的点:Codex 的配置读取优先级通常是「环境变量 > 项目级配置 > 用户级配置」。也就是说,如果你之前设过OPENAI_BASE_URL或OPENAI_API_KEY这类环境变量,它会盖过auth.json里的值。所以改文件之前,先查一遍环境变量:
Get-ChildItem Env: | Where-Object { $_.Name -match 'OPENAI|CODEX|ANTHROPIC' }如果输出里有OPENAI_BASE_URL指向别处,那你不清掉它,改auth.json是白改。清理方式:
Remove-Item Env:OPENAI_BASE_URL -ErrorAction SilentlyContinue Remove-Item Env:OPENAI_API_KEY -ErrorAction SilentlyContinue注意Remove-Item Env:只对当前会话生效,要永久清除得去「系统属性 → 环境变量」里删,或者用[Environment]::SetEnvironmentVariable('OPENAI_BASE_URL', $null, 'User')。这一步做完,配置来源才算真正收敛到文件上。
另外提醒一句:不要把生产库的直连串到 MCP 或 Codex 里跑,统一走网关的意义就是隔离和可审计。Key 也不要写进会提交到 Git 的文件,auth.json记得加进.gitignore。
前置准备做完,你手上应该有三样东西:一个 TaoToken Key、一个确认可用的 Model ID、一个明确的生效配置目录。接下来就是把这些写进配置文件。
3. 可复制配置:auth.json 与 config.toml 完整片段
这一节给的是可以直接抄的配置片段,路径与上一节定位出来的生效目录保持一致。Codex 在不同版本里配置文件名略有差异,常见的是auth.json存凭证、config.toml存模型与 provider 设置。两个都给出,按你实际存在的文件改。
先看auth.json。假设生效目录是C:\Users\Administrator\.codex,文件路径就是C:\Users\Administrator\.codex\auth.json。内容如下:
{ "OPENAI_API_KEY": "sk-你的TaoTokenKey", "OPENAI_BASE_URL": "https://taotoken.net/api", "OPENAI_API_BASE": "https://taotoken.net/api" }三个字段说明一下:OPENAI_API_KEY填 TaoToken 控制台新建的那个 Key;OPENAI_BASE_URL和OPENAI_API_BASE是不同版本读的键名,两个都写上最稳,值都是https://taotoken.net/api,注意结尾不要带斜杠,也不要带/v1,网关会自己处理路径拼接。如果你之前那份auth.json里还有tokens、last_refresh之类的字段,保留它们,只改上面三个键即可,不要整个文件覆盖掉。
再看config.toml。路径是C:\Users\Administrator\.codex\config.toml,内容:
model = "gpt-4o" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "OPENAI_API_KEY" wire_api = "chat" [history] persistence = "save-all"关键字段逐个解释。model填你在模型对话页面验证过能通的 Model ID,这里用gpt-4o举例,实际以你账号可用的为准。model_provider指向下面定义的 provider 名。[model_providers.taotoken]这一段是自定义 provider,base_url同样是https://taotoken.net/api,env_key告诉 Codex 从哪个环境变量或auth.json键里取 Key,wire_api = "chat"表示走 Chat Completions 协议,Codex 的 OpenAI 兼容模式用这个。
如果你用的是 Codex SDK 内嵌版(安装日志里出现过@openai/codex-sdk),配置可能落在 SDK 的依赖目录下,形如C:\Users\Administrator\.codemoss\dependencies\codex-sdk\。这种情况下不要直接改 SDK 目录里的文件,因为下次安装会被覆盖。正确做法是在项目根目录建一个.codex\config.toml,或者用环境变量注入:
$env:OPENAI_BASE_URL = "https://taotoken.net/api" $env:OPENAI_API_KEY = "sk-你的TaoTokenKey"环境变量方式对 SDK 调用最直接,但只对当前会话生效,适合临时验证。要长期生效就写进用户级环境变量。
还有一个场景是 Cline MCP 或 Claude Code 共用同一套 Key。这两类工具读的配置文件名不同,但三件套是一样的:Base URL、Key、Model ID。以 Cline 的 MCP 配置为例,通常在cline_mcp_settings.json里:
{ "mcpServers": { "taotoken": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-fetch"], "env": { "OPENAI_BASE_URL": "https://taotoken.net/api", "OPENAI_API_KEY": "sk-你的TaoTokenKey", "OPENAI_MODEL": "gpt-4o" } } } }Claude Code 的配置在~/.claude/settings.json或项目级.claude/settings.json,写法类似,把ANTHROPIC_BASE_URL指向网关对应入口即可。Claude Code 的接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面有 Anthropic 协议的 endpoint 说明,地址是 https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
配置写完,先别急着跑,用一条命令确认文件语法没问题:
Get-Content C:\Users\Administrator\.codex\auth.json | ConvertFrom-Json能正常解析说明 JSON 没写错。TOML 的话用 Codex 自己加载一次就能暴露语法错误,下一节验证时会看到。
4. 验证请求:从连通性到真实补全
配置改完必须验证,否则你只是「以为改好了」。验证分三层:网络连通性、鉴权、真实补全。三层都过,才算配置生效。
第一层,连通性。直接用Invoke-RestMethod打网关的模型列表或一个最小请求:
$headers = @{ "Authorization" = "Bearer sk-你的TaoTokenKey" "Content-Type" = "application/json" } Invoke-RestMethod -Uri "https://taotoken.net/api/models" -Headers $headers -Method Get如果返回一个模型列表 JSON,说明 Base URL 和 Key 都对,网络也通。如果报401,是 Key 问题;报连接超时,是网络或 Base URL 写错;报404,多半是 Base URL 多带了/v1或结尾斜杠。
第二层,鉴权与协议。发一个最小的 Chat Completions 请求:
$body = @{ model = "gpt-4o" messages = @(@{ role = "user"; content = "ping" }) max_tokens = 8 } | ConvertTo-Json -Depth 5 Invoke-RestMethod -Uri "https://taotoken.net/api/chat/completions" ` -Headers $headers -Method Post -Body $body返回里应该有choices数组,choices[0].message.content是模型回复。这一步过了,说明协议、模型 ID、鉴权全对。
第三层,让 Codex 自己跑一次。在终端里执行:
codex "用一句话说明当前目录有几个文件"观察输出。如果它正常返回结果,说明 Codex 读到了你改的配置。如果报错,看错误类型,下一节专门排。
验证通过后,建议把生效配置固化下来,避免下次又找不到。做法是在配置目录里放一个README或注释,记录当前生效的 Base URL 和 Key 来源。更规范的做法是用一个脚本统一注入环境变量,比如建一个set-codex-env.ps1:
$env:OPENAI_BASE_URL = "https://taotoken.net/api" $env:OPENAI_API_KEY = "sk-你的TaoTokenKey" Write-Host "Codex env ready: $env:OPENAI_BASE_URL"每次开新终端先跑这个脚本,配置来源就永远清晰。这也是「统一 Key」的真正价值:不管你有多少工具,Key 和 Base URL 只有一套,改一处全生效。
验证时如果发现 Codex 仍然连旧地址,回到第一节的对照表,重点查环境变量有没有残留、where.exe codex第一行是不是你改的那个目录。这两个点覆盖了九成的「改了不生效」。
5. 常见报错排查:401、local proxy failed、reading choices
这一节按真实报错逐条排。每个报错先给现象,再给原因,最后给动作。
401 Unauthorized。现象是请求返回401,或 Codex 提示鉴权失败。原因通常是三类:Key 写错或过期、Key 没被读到、环境变量盖过了文件。排查顺序:先确认auth.json里的 Key 和 TaoToken 控制台里的一致,注意前后不要有空格;再确认env_key指向的键名和auth.json里的键名一致;最后查环境变量有没有残留旧 Key:
Get-ChildItem Env: | Where-Object { $_.Name -match 'OPENAI_API_KEY' }有输出就清掉。如果 Key 刚在控制台重建过,旧 Key 会立即失效,记得同步更新所有引用它的配置文件。
local proxy failed。现象是 Codex 启动时报本地代理失败,或连接被拒。这个报错通常和 Base URL 格式有关。检查https://taotoken.net/api有没有被写成https://taotoken.net/api/v1或结尾带斜杠。网关的根地址就是https://taotoken.net/api,路径拼接由网关处理,你多写一层反而会 404 或代理失败。另外检查系统代理设置有没有指向一个已经关掉的本地端口,PowerShell 里可以看:
netsh winhttp show proxy如果显示了一个不存在的本地代理,用netsh winhttp reset proxy重置。
reading choices 报错。现象是返回体解析失败,提示读不到choices字段。原因是响应不是标准的 Chat Completions 结构,常见于 Base URL 指到了非兼容端点,或者wire_api设错。确认config.toml里wire_api = "chat",Base URL 是https://taotoken.net/api。如果用的是 Responses API 类端点,wire_api要相应调整,但 Codex 的 OpenAI 兼容模式用chat即可。
OAuth 相关报错。现象是提示 OAuth 登录失败或 token 刷新失败。Codex 某些版本会尝试 OAuth 流程,如果你用的是 API Key 模式,需要确保没有残留的 OAuth token 文件。检查配置目录下有没有tokens.json或类似文件,有的话备份后删除,让它回退到 API Key 鉴权。同时确认auth.json里没有oauth相关字段干扰。
改了配置不生效。这个不算报错但最常见。排查三步:where.exe codex第一行是不是你改的目录;环境变量有没有残留;auth.json的LastWriteTime是不是最新。三者交叉验证,基本能定位。
把常见报错和对应动作整理成表,方便对照:
| 报错 | 最可能原因 | 动作 |
|---|---|---|
| 401 | Key 错/过期/被环境变量覆盖 | 核对 Key,清环境变量 |
| local proxy failed | Base URL 多带路径或系统代理残留 | 改回https://taotoken.net/api,重置代理 |
| reading choices | 端点非兼容或 wire_api 错 | 确认wire_api = "chat" |
| OAuth 失败 | 残留 OAuth token | 删除 tokens 文件,回退 API Key |
| 改了不生效 | 改错目录或环境变量优先 | 按对照表三步验证 |
排查时有个通用技巧:把 Codex 的日志级别调高,或者在请求前后打印实际用的 Base URL。很多工具支持--verbose或环境变量DEBUG=1,打开后能看到它到底连了哪个地址,比猜快得多。
如果排查完还是不通,去接入文档对照一遍参数,文档地址是 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。文档里有各协议的 endpoint 和字段说明,比在报错里反复试要高效。
6. 把配置固化下来:统一 Key 的长期用法
排查一次不算完,真正省事的是把「统一 Key」变成日常习惯。核心就一句话:所有工具的 Base URL 和 Key 都指向同一套,改一处全生效,出问题只查一个地方。
具体做法是维护一个环境变量注入脚本,放在固定路径,比如C:\Users\Administrator\.codex\set-env.ps1,内容就是前面那段设置OPENAI_BASE_URL和OPENAI_API_KEY的代码。每次开新终端先执行它,或者把它加进 PowerShell 的 profile:
notepad $PROFILE在打开的 profile 文件里加一行. C:\Users\Administrator\.codex\set-env.ps1,保存后每次开终端自动加载。这样 Codex、Cline、Claude Code 读到的都是同一套值,不会再出现「这个工具连 A、那个工具连 B」的混乱。
Key 的轮换也简单了。在 TaoToken 控制台重建 Key 后,只需要改set-env.ps1一处,所有工具下次启动自动生效。不用挨个翻配置文件,也不会漏掉某个藏在 SDK 目录里的旧 Key。
模型 ID 的调整同理。想换模型,改config.toml里的model字段,或者在环境变量里加OPENAI_MODEL,一处生效。如果某个模型临时不可用,切到另一个验证过的 Model ID 即可,不用动 Base URL 和 Key。
最后留一个自查清单,配置出问题时按顺序过一遍:where.exe codex第一行是不是目标目录;auth.json的LastWriteTime是不是最新;环境变量有没有残留;Base URL 是不是干净的https://taotoken.net/api;wire_api是不是chat。五条过完,绝大多数「安装目录找不到、配置不生效」的问题都能定位到具体那一处。把这套流程跑顺之后,你会发现 Codex 的目录问题本质上不是找不到,而是没按优先级去查。