Codex 和 ChatGPT 桌面端最近这波启动报错,几乎都集中在重置之后。你会看到 ChatGPT 桌面版打开就提示 failed to start,后面跟着一句 unable to locate the Codex CLI binary;也有的是对话中直接断掉,提示 config.toml 加载失败;还有人模型名称被写成 gpt-5.6-sol,结果被明确拒绝:这个模型在使用 Codex 搭配 ChatGPT 账号时不支持。这些报错看着吓人,但大部分不是工具坏了,而是环境、配置和版本没有对齐。
我更建议把“重置”理解成一个判断动作,而不是一个固定时刻。与其等某个时间点重新登录、重新安装,不如先弄清楚现在的报错指向哪一层。这篇文章按我实际排查的顺序写:先判断重置哪一层,再处理 Codex CLI 路径问题,然后修 config.toml 和模型不兼容,最后给一份可以照着做的重置流程和排查清单。适合两类人看:一类是桌面端已经打不开、急着恢复的人;另一类是准备把 Codex CLI 接进日常开发,想提前避开这些坑的人。
1. 先搞清楚“重置”要重置哪一层,别一上来就卸载重装
1.1 配置层、登录态、安装层要分开处理
重置不能一概而论。我见过太多人看到报错就卸载重装,结果装完旧配置还在,问题换个样式继续出现。实际需要重置的至少分三层:
- 配置层:config.toml 被改坏,或者里面写了当前版本不认识的键、不支持的模型。表现是启动时报 config.toml 加载失败。
- 登录态:ChatGPT 账号的 token 过期、权限变化,或者会话被服务端标记异常。表现是对话串无法继续,重试也没用。
- 安装层:CLI 二进制缺失、桌面端和 CLI 版本不匹配、Electron 资源目录里没有 bin/codex。表现是 unable to locate the codex cli binary。
这三层的问题表现很像,处理方式却完全不同。配置层只需要改回合法配置;登录态更多是重新登录或新建会话;安装层才需要修复安装、重建路径。如果一开始就把方向搞错,后面每一步都会白费。
还有一种情况最容易误判:桌面端升级后,内置 CLI 版本也跟着变了,但 config.toml 里还留着旧版本的配置写法。这时候报错可能同时提到 CLI binary 和 config.toml。别慌,先判断到底哪一层先出问题,通常安装层优先级更高。
1.2 从报错关键字反推重置方向
我的排查习惯是先看报错的第一句,不看它建议的执行动作。因为工具给的提示经常指向一个宽泛方向,真正的问题藏在关键字里:
- 报错里有 config.toml:优先重置配置层。
- 报错里有 codex cli binary:优先重置安装层和路径。
- 报错里有 not supported:优先检查模型配置是否超过了当前账号允许的范围。
- 报错里有 can't resume / 无法继续:优先处理会话和登录状态。
这里的关键不是找到某个“正确的重置时间”,而是判断当前卡在哪一层。层判断对了,重置动作通常很小,可能只是改一行配置,或者重新登录一次。层判断错了,卸载重装三遍也解决不了。
我一般会把这个判断过程写在便签上:复制报错原文,圈出关键字,再决定动哪一层。不圈关键字就去搜报错,很容易被各种不相关的方案带偏。
2. ChatGPT 桌面端找不到 Codex CLI:先解决路径,再谈模型
2.1 报错信息拆解
桌面端的报错长这样:
ChatGPT failed to start. Unable to locate the Codex CLI binary. Set codex_cli_path or ensure the electron resources include bin/codex.拆开看只有两个信息:一个是找不到 codex 这个可执行文件;另一个是给两条解决方向。第一条方向是设置 codex_cli_path,第二条方向是保证 Electron 的资源目录里有 bin/codex。这个报错和你的账号、模型、API Key 都没有关系,纯粹是“叫不到人”。
为什么会出现这个问题?因为 ChatGPT 桌面端本身是 Electron 应用,启动 Codex 能力时需要调外部或内置的 CLI 二进制。如果升级后内置二进制没有正确释放,或者你把 CLI 装到了桌面端不知道的位置,就会触发这个错误。很多人以为是登录过期,其实方向错了。
另外要注意,这个报错里的路径写法在不同平台有差异。macOS 上通常涉及 .app 包内的资源目录,Windows 上则是安装目录下的 bin 文件夹。不要拿着 macOS 的路径去 Windows 上找,会浪费时间。
2.2 先验证 CLI 到底在不在
不要急着改配置,先开一个终端确认 CLI 是否存在:
codex --version which codex # macOS / Linux where codex # Windows如果正常输出版本号,说明 CLI 在,问题是桌面端没找到。如果提示 command not found,说明 CLI 根本没装上,或者装了但没进 PATH。这一步能把问题范围缩小一半。
如果之前是用包管理器安装的,还可以看包管理器的安装记录,确认版本号是否和桌面端要求的版本匹配。版本差太多时,即使路径找得到,后续也可能出现请求格式对不上的问题。
实测时我更建议连codex --help也跑一下,确认 CLI 能正常响应命令,而不只是输出版本号。有些时候二进制文件还在,但依赖库缺失,一执行就闪退,这种问题光看--version可能看不出来。
2.3 设置 codex_cli_path 和修复资源目录
CLI 存在但桌面端找不到,优先在 Codex 的配置文件里写死路径。以常见的 config.toml 为例,加一行:
codex_cli_path = "/absolute/path/to/codex"路径要写绝对路径,不要写~。Windows 上路径写法不同,需要注意转义或使用原始字符串写法。如果同一台机器装过多个版本的 Codex,建议写死你确定要和桌面端配套的那一个。
如果不想改配置文件,也可以从资源目录入手。直接在安装目录下搜索 codex 这个文件,看它在不在预期位置。注意有些平台把二进制放在 bin 子目录,有些平台直接放在根目录,以实际目录结构为准。
注意:复制二进制到资源目录只是临时修复。桌面端升级后可能又把它覆盖掉,版本不一致的二进制也可能触发新的报错。最稳的方式还是重新安装完整桌面端,让安装器自己释放配套 CLI。
3. config.toml 加载失败与模型不支持:问题出在配置,不是账号
3.1 先备份,再改成最小配置
config.toml 加载失败是另一个高频问题。它的明显特征是:ChatGPT 桌面端能打开,但一旦要继续某个对话,就提示无法加载 config.toml,要求修复。这个提示也会出现在 CLI 启动阶段,直接拒绝进入交互模式。
常见原因有三个:TOML 语法写错、键名不被当前版本识别、model 字段填了不存在的模型。处理顺序很简单:先备份,再换成最小配置,最后逐步加回自己需要的项。
cp ~/.codex/config.toml ~/.codex/config.toml.bak之后把 config.toml 改成类似下面的最小结构:
# 模型 ID 和提供方;your-model-id 要替换成当前账号可用的模型 model = "your-model-id" model_provider = "openai"这份配置里只有两个核心字段,先去掉 temperature、approval_policy、自定义 provider 等扩展项,保证能启动。能启动之后再一项项加回来,加一项验证一次,这样能定位到底哪个配置坏了。
很多人觉得配置文件越完整越好,其实不是。对 Codex 这种工具来说,最小配置意味着更少的变量。出问题的时候,最小配置能让你快速判断是配置问题还是工具本身的问题。
3.2 模型不支持的真实原因
报错 the 'gpt-5.6-sol' model is not supported when using codex with a chatgpt account,字面意思是:用 ChatGPT 账号跑 Codex 时,这个模型不被支持。它不是网络问题,也不是登录问题,而是模型可用范围和账号类型绑定。
也就是说,同样是 Codex,使用 ChatGPT 账号和直接使用 API 时的可用模型范围不一样。桌面端或 CLI 默认会带一组可用的模型,如果你在 config.toml 里手动写了一个当前账号没有权限的模型,服务端就会拒掉。
更隐蔽的情况是,你无意中保留了一份很久以前的配置,里面写的模型版本已经下线或改名。这种时候报错信息可能很具体,也可能只说 not supported,容易让人误以为是账号被封。
修复办法很简单:把 model 字段改回当前客户端支持的默认模型,或者干脆删掉 model 这一行,让它用内置默认值。不要为了“更智能”去硬填一个看起来存在但是没权限的模型。
3.3 想接第三方兼容模型时的配置思路
除了官方模型,Codex CLI 本身支持配置自定义 model_provider。比如国内常见的 DeepSeek 这类提供 OpenAI 兼容接口的服务,也可以通过 base_url 和模型 ID 接进来。这个思路本身没问题,但要注意三点:
第一,base_url 必须指向该服务实际的 API 地址,路径不能多也不能少。第二,env_key 指定的环境变量要存在,通常需要先设置对应的 API Key。第三,自定义 provider 的配置格式要符合当前 Codex 版本的要求,不同版本对 provider 字段的定义有差异。
[model_providers.deepseek] name = "DeepSeek" base_url = "https://api.deepseek.com/v1" env_key = "DEEPSEEK_API_KEY"配置完成后,把 model_provider 改成 deepseek,model 改成对应服务的模型名。首次使用前,先用一条最简单的请求验证连通性,不要直接拿长任务试。
4. 按顺序重置 Codex 与 ChatGPT:从单任务验证到日常使用
4.1 重置前的备份和版本确认
磨刀不误砍柴工。重置前先做两件事:备份配置,记录版本。
备份的不仅是 config.toml,如果 ~/.codex 目录下有 histories、sessions、logs 这类子目录,也要先看一眼里面有什么。至少把 config.toml 复制一份出来,因为后面每一次改配置都可能需要回到原始状态。
版本确认也很重要。在命令行执行 codex --version 记录 CLI 版本,同时在桌面端的设置或帮助页面里看应用版本。两者差距太大时,不要做复杂重置,先升级到配套版本再来判断。
这个步骤容易被跳过,但它是后面所有操作的锚点。没有版本信息,遇到“CLI 和桌面端行为不一致”的问题时,你很难判断到底是谁的问题。
4.2 分层执行:配置、登录、安装
按前面判断出的层级执行:
- 配置层:把 config.toml 换成最小配置,删掉可疑 key,启动验证。
- 登录态:在桌面端退出登录,重新登录;命令行则检查 API Key 是否仍有效。如果是在线账号模式,注意账号本身是否还能正常访问服务。
- 安装层:重新安装 Codex CLI,再重新安装桌面端。顺序上先 CLI 后桌面端,确保桌面端安装时能找到或释放正确版本。
执行顺序不要倒过来。我见过有人先重装桌面端,再回头改配置,结果桌面端自带的 CLI 版本又和 config.toml 里的扩展键冲突,白折腾一轮。
如果安装层问题来自 Electron 资源目录缺少 bin/codex,重装之后第一件事就是去检查这个文件是否真的存在。不要只看安装成功的提示,要看实际文件。
4.3 清理缓存与旧会话
有些报错是旧的会话状态残留导致的,典型表现是“对话串无法继续”。配置改好了,模型也正常了,但一进旧对话还是报错。这时候新建一个对话往往就能跑通。
如果新建对话没问题,就不要去手工删历史目录。真需要清理时,先备份整个 ~/.codex 目录,再针对 sessions 或 logs 子目录处理。不要随便删全盘,尤其是里面可能有你还没导出的会话记录。
我的建议是:清理之前先确认自己是否真的需要保留历史。如果只是测试环境,直接清掉问题不大;如果是正式使用,宁可多备份,也不要盲目清除。
4.4 重置后的最小验证清单
重置完成后,不要马上跑复杂任务。按这个顺序验证:
- codex --version 能正常输出版本号。
- 桌面端能打开,且不再提示 unable to locate codex cli binary。
- 新建一个对话,发送一条最简单的请求,能收到回复。
- 重启一次桌面端,确认问题没有反复。
- 如果之前改过模型,确认当前使用的模型确实是账号允许的。
能过这五步,重置基本完成。之后再考虑批量任务和接口化,不要一上来就并发测试。先跑通单条任务,再逐步增加复杂度,这是排查任何工具都适用的原则。
5. 别急着调参数:先看清默认配置够用和必须改参数的区别
5.1 默认配置够用的典型场景
很多人一拿到 Codex 就想把参数调满:最高模型、最大输出、无限上下文。实际上很多场景默认配置就够。
比如本地学习、偶尔提问、单个文件的代码解释、小规模重构,这类任务不需要动 config.toml 里的模型、温度、approval_policy。默认值在这些场景里更稳,也更容易排查。
如果你刚经历过一轮报错,先证明默认配置能跑通,再谈优化。跳过这一步直接调参,出了问题你分不清是参数的问题还是环境残留的问题。
5.2 必须改参数的场景和判断标准
需要手动改参数的情况,一般是这几个:
- 接入第三方模型服务:必须配置 model_provider、base_url、env_key。
- 桌面端找不到 CLI:必须配置 codex_cli_path 或修复资源目录。
- 使用 API 而不是在线账号:需要确认鉴权方式和环境变量。
- 默认模型不被账号支持:需要把 model 改回可用范围。
判断标准不只是“能不能跑”,还要看:连续对话是否稳定、模型切换是否真的生效、长任务是否因为超时或输出长度被截断、资源占用是否在可接受范围。每一个“支持某功能”的说法,都要用一个最小样本来验证,不能只看配置文档。
5.3 不要只用“能跑”作为成功标准
我建议把验证标准拆成两层。第一层是启动成功、能发消息;第二层是连续完成 5 到 10 次任务、输出格式一致、失败时有清晰的日志。如果只是“能跑”,那只说明环境通了,不代表配置适合长期使用。
尤其要留意的是,某些参数在官方模型上正常,但切到自定义 provider 后可能被忽略或报错。遇到这种问题,先回到默认 provider 验证,再检查自定义配置。
另外,批量任务和单条任务是两回事。单条任务跑通只代表基础能力可用。要批量跑,就必须考虑输入列表、输出命名、失败重试和日志记录。这些不是靠一个参数能解决的,要在使用流程层面设计好。
6. 常见报错排查清单:按现象、配置、环境、参数、版本的顺序走
6.1 通用排查顺序
我自己总结的顺序是:先看现象,再看配置文件,然后看环境和参数,最后看版本兼容。
- 现象:是启动失败、对话中断、还是输出异常。把完整报错原文截图或复制下来。
- 配置:config.toml 是否合法,模型和 provider 是否匹配。
- 环境:CLI 是否在 PATH、路径是否可执行、权限是否正常、磁盘空间是否足够。
- 参数:是否开了并发、是否设置了不支持的键、模型是否被账号允许。
- 版本:CLI 和桌面端是否配套,第三方 provider 的配置格式是否符合当前版本。
这个顺序最大的好处是:每一步都能快速排除一半问题。不要从改参数开始,因为参数问题往往只是表象,真正的根因可能在配置语法或环境路径上。
6.2 报错关键字对照表
| 报错关键字 | 优先排查方向 | 第一个动作 |
|---|---|---|
| unable to locate the codex cli binary | CLI 安装与路径 | 执行 codex --version 确认存在性 |
| codex_cli_path | CLI 路径配置 | 在 config.toml 写绝对路径 |
| config.toml | 配置语法与键名 | 备份后替换为最小配置 |
| model is not supported | 模型与账号权限 | 删除 model 行或改成默认模型 |
| thread can't resume | 会话状态与登录态 | 新建对话测试,必要时重新登录 |
| spawn EINVAL | 启动参数或平台差异 | 检查 CLI 版本、路径权限和平台 |
表格里每一行都对应实际出现过的报错。排查时先定位到一行,再展开细节。不要同时改多个配置项,否则很难知道到底是哪一项让问题消失的。
6.3 最后留一条经验
翻过这些报错之后,我最大的感受是:重置不是万能药,配置也不是越复杂越好。很多问题看起来像功能不支持,实际是输入配置没有清理干净。把最小配置跑稳,再逐步加功能,比一次性堆满所有选项要可靠得多。
如果这篇文章只留一个建议,那就是:报错之后先复制原文,圈出关键字,判断层,再动手。按这个顺序走,绝大多数 Codex 和 ChatGPT 的启动问题都能在十分钟内定位到具体原因。