ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

新版ChatGPT (Codex) 桌面版启动失败排查与修复记录:从 CODEX_CLI_PATH 到 MSIX 的 TaoToken 配置实践

新版ChatGPT (Codex) 桌面版启动失败排查与修复记录:从 CODEX_CLI_PATH 到 MSIX 的 TaoToken 配置实践 1. 启动失败现场ChatGPT 桌面版为什么找不到 codex.exe你双击 ChatGPT 桌面版图标窗口没出来先弹一个错误框大意是ChatGPT failed to start. Unable to locate the Codex CLI binary. Set CODEX_CLI_PATH or ensure the Electron resources include bin/codex.。这句话信息量其实很大应用已经知道自己要拉起一个叫 Codex CLI 的可执行文件但它在所有候选路径里都没找到于是干脆不启动。这个场景在 Windows 上并不罕见尤其是通过微软商店安装的 MSIX 包。MSIX 会把应用装进%ProgramFiles%\WindowsApps\这种受保护目录应用运行时通常需要把包内的二进制“重定位”到用户可写目录比如%LOCALAPPDATA%\OpenAI\Codex\bin\。一旦这个复制动作失败候选路径全空就出现上面那句报错。我遇到的那台机器上根因不是杀毒软件拦截也不是权限不足而是包内文件被打上了 EFS 加密属性。用 PowerShell 看一眼就明白$pkg Get-AppxPackage -Name OpenAI.Codex | Sort-Object { [version]$_.Version } -Descending | Select-Object -First 1 $res Join-Path $pkg.InstallLocation app\resources Get-Item (Join-Path $res codex.exe) | Select-Object FullName, Attributes Get-Item $res | Select-Object FullName, Attributes输出里Attributes会带Encrypted目录本身也是Directory, Archive, Encrypted。而本机 EFS 功能不可用测试[IO.FileInfo]::Encrypt()会抛“不支持该请求”。Windows 的CopyFileEx在复制带 Encrypted 属性的文件时会尝试在目标位置重建加密本机做不到就返回0x80071770 ERROR_ENCRYPTION_FAILED。应用的重定位步骤失败启动自然失败。所以修复思路很直接绕开会触发 EFS 重建的复制方式用流式复制生成一个不带加密属性的普通副本放到应用期望的目录再用CODEX_CLI_PATH环境变量直接告诉应用“CLI 在这里”。代码里CODEX_CLI_PATH是解析器的首选来源优先级高于兜底的重定位逻辑等于把出问题的环节整个跳过。2. 前置准备TaoToken 统一 Key 与 API 通道在动手修启动问题之前先把模型通道准备好。Codex 这类编码 Agent 启动后要连模型服务如果你用 TaoToken 做统一入口Key 和 API 地址一次配好后面config.toml和settings.json都能复用。TaoToken 的定位是给开发者提供统一的模型 API 通道兼容常见的 OpenAI 风格调用方式适合把 Codex、Claude Code 这类工具接到同一个 Key 上管理。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。你需要先拿到一个 API Key。登录后进入控制台在 API Keys 页面创建一个新 Key复制保存。这个 Key 后面会写进 Codex 的配置里也会用于验证请求是否通。控制台: https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite API Keys: https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 接入文档: https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite注意Key 只显示一次创建后立刻保存到本地密码管理器或临时环境变量里不要直接提交到 Git 仓库。如果你只是想先确认模型通道是否可用可以打开模型对话页面发一条测试消息模型对话: https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite这一步能通说明 Key 和网络都没问题后面 Codex 启动后连不上模型时就可以把排查范围缩小到本地配置和 CLI 路径上。3. 可复制配置流式复制脚本 CODEX_CLI_PATH config.toml修复分三块把二进制复制到用户目录、设置环境变量、写 Codex 配置文件。三块都做完再启动应用。3.1 流式复制脚本 refresh-chatgpt-codex-bin.ps1新建一个 PowerShell 脚本比如放在D:\deeplearning\ds_harness\ds_test\refresh-chatgpt-codex-bin.ps1。核心是用[IO.File]::OpenRead加CopyTo这种流式复制不会继承源文件的 Encrypted 属性。# refresh-chatgpt-codex-bin.ps1 $ErrorActionPreference Stop $pkg Get-AppxPackage -Name OpenAI.Codex | Sort-Object { [version]$_.Version } -Descending | Select-Object -First 1 if (-not $pkg) { throw 未找到 OpenAI.Codex 包 } $res Join-Path $pkg.InstallLocation app\resources $bin Join-Path $env:LOCALAPPDATA OpenAI\Codex\bin New-Item -ItemType Directory -Force -Path $bin | Out-Null $names ( codex.exe, codex-code-mode-host.exe, codex-windows-sandbox-setup.exe, codex-command-runner.exe ) foreach ($n in $names) { $s Join-Path $res $n $d Join-Path $bin $n if (-not (Test-Path $s)) { Write-Warning 跳过包内不存在: $n continue } $fsSrc [IO.File]::OpenRead($s) $fsDst [IO.File]::Open($d, [IO.FileMode]::Create, [IO.FileAccess]::Write, [IO.FileShare]::None) $fsSrc.CopyTo($fsDst) $fsDst.SetLength($fsSrc.Length) $fsSrc.Close() $fsDst.Close() Write-Host (OK: {0} ({1:N0} bytes) -f $d, (Get-Item $d).Length) } [Environment]::SetEnvironmentVariable(CODEX_CLI_PATH, (Join-Path $bin codex.exe), User) Write-Host CODEX_CLI_PATH $(Join-Path $bin codex.exe) 用户级已设置/刷新 Write-Host 完成。请完全退出并重新打开 ChatGPT。执行方式powershell -ExecutionPolicy Bypass -File refresh-chatgpt-codex-bin.ps1跑完后检查目标目录属性应该都是Archive不再有EncryptedGet-ChildItem $env:LOCALAPPDATA\OpenAI\Codex\bin | Select-Object Name, Length, Attributes3.2 设置用户级 CODEX_CLI_PATH脚本最后一行已经用[Environment]::SetEnvironmentVariable(..., User)设置了用户级变量。它会通过WM_SETTINGCHANGE广播到新进程包括从开始菜单或快捷方式启动的应用。手动确认一下[Environment]::GetEnvironmentVariable(CODEX_CLI_PATH, User)应该返回类似C:\Users\你的用户名\AppData\Local\OpenAI\Codex\bin\codex.exe。如果返回空说明脚本没跑成功或者你查的是当前会话而不是 User 级别。3.3 config.toml 骨架Codex 的配置文件一般放在用户目录下的.codex文件夹里。下面这份骨架把模型通道指向 TaoTokenKey 用环境变量占位避免明文写死。# %USERPROFILE%\.codex\config.toml model gpt-5-codex model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api responses [profiles.default] model gpt-5-codex model_provider taotoken approval_policy on-request然后在 PowerShell 里设置用户级 Key[Environment]::SetEnvironmentVariable(TAOTOKEN_API_KEY, 你的Key, User)3.4 settings.json 骨架如果你用的是带 settings.json 的集成方式可以这样写{ codex.cliPath: C:\\Users\\你的用户名\\AppData\\Local\\OpenAI\\Codex\\bin\\codex.exe, codex.model: gpt-5-codex, codex.provider: { name: TaoToken, baseUrl: https://taotoken.net/api, apiKeyEnv: TAOTOKEN_API_KEY }, codex.approvalPolicy: on-request }把你的用户名换成实际值。codex.cliPath和CODEX_CLI_PATH指向同一个文件双保险。4. 验证请求确认启动恢复与模型通道可用配置写完先完全退出 ChatGPT包括托盘图标和后台进程。用任务管理器确认没有残留的ChatGPT.exe和codex.exe再重新打开。4.1 检查进程与启动参数启动后开一个 PowerShell看 codex 进程是不是从我们指定的路径起来的Get-Process codex -ErrorAction SilentlyContinue | Select-Object Id, Path, StartTime理想输出里Path应该是C:\Users\你的用户名\AppData\Local\OpenAI\Codex\bin\codex.exe。再看命令行参数Get-CimInstance Win32_Process -Filter Namecodex.exe | Select-Object ProcessId, CommandLine应该能看到带app-server之类的参数。如果进程根本没起来回到第 5 节排查。4.2 直接调用 CLI 验证在 PowerShell 里直接跑一次 CLI确认二进制本身能执行 $env:LOCALAPPDATA\OpenAI\Codex\bin\codex.exe --version能打印版本号说明文件完整、可执行。再验证模型通道$env:TAOTOKEN_API_KEY [Environment]::GetEnvironmentVariable(TAOTOKEN_API_KEY, User) curl.exe https://taotoken.net/api/v1/models -H Authorization: Bearer $env:TAOTOKEN_API_KEY返回模型列表就说明 Key 和 API 基址都对。如果这里报 401检查 Key 是否复制完整报连接错误检查网络和基址拼写。4.3 看日志确认没有旧报错ChatGPT 的日志一般在%LOCALAPPDATA%\OpenAI\Codex\附近。启动后搜一下关键字Get-ChildItem $env:LOCALAPPDATA\OpenAI\Codex -Recurse -Include *.log | Select-String -Pattern Unable to locate|transport_connect_failed|relocation_failed如果只剩relocation_failed的旧警告没有Unable to locate和transport_connect_failed说明启动链路已经恢复。旧警告是非致命的可以忽略。5. 本篇常见错排查5.1 脚本报“未找到 OpenAI.Codex 包”说明Get-AppxPackage -Name OpenAI.Codex没匹配到。先列出所有相关包Get-AppxPackage | Where-Object { $_.Name -like *Codex* -or $_.Name -like *ChatGPT* } | Select-Object Name, Version, InstallLocation如果包名不是OpenAI.Codex把脚本里的-Name换成实际值。如果列表为空说明应用不是通过 MSIX 安装的那CODEX_CLI_PATH仍然可以手动指向你实际的 codex.exe 路径。5.2 复制后属性仍是 Encrypted检查目标目录是不是在支持 EFS 的卷上或者复制方式是不是被别的工具接管了。用[IO.File]::OpenRead加CopyTo是流式的正常不会继承属性。确认脚本里没有用Copy-Item那个会走CopyFileEx可能触发 EFS 重建。5.3 环境变量设置了但应用读不到用户级变量只对新进程生效。设置完必须完全退出应用再启动不能只关窗口。验证方法[Environment]::GetEnvironmentVariable(CODEX_CLI_PATH, User)如果这里为空说明设置没成功。如果这里正常但应用还报错检查是不是有系统级变量覆盖了用户级或者应用启动时用了旧的环境快照。5.4 启动后连不上模型先确认TAOTOKEN_API_KEY在用户级存在再确认config.toml里base_url是https://taotoken.net/api没有多余斜杠。如果用的是settings.json注意 JSON 里反斜杠要转义。还不行就打开模型对话页面单独测 Key把本地配置问题和 Key 问题分开。5.5 每次更新后又要重跑ChatGPT 更新后MSIX 包内容会变旧的复制副本可能过时。建议每次更新后跑一次refresh-chatgpt-codex-bin.ps1。环境变量是持久的只有包内二进制版本显著变化时才需要重跑但跑一次成本很低图个安心。6. 后续接入与长期编码配置启动修好只是第一步。如果你打算长期用 Codex 做编码或跑 Agent建议把 Key 和通道固定下来别每次手动设。TaoToken 的 Coding Plan 适合这种长期场景把模型调用统一到一个 Key 上Codex、Claude Code 之类的工具都能接Coding Plan: https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite Claude Code 接入: https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude-codeutm_campaignrewrite接入文档里有不同工具的配置示例遇到config.toml字段不确定的时候直接对照接入文档: https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite API Keys: https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite最后留一个实用习惯把refresh-chatgpt-codex-bin.ps1和你的config.toml放在同一个工作目录更新 ChatGPT 后先跑脚本再启动应用再跑一次codex.exe --version和模型列表请求。三步都过基本就不会再看到那个“Unable to locate the Codex CLI binary”的弹窗了。
返回列表