故障处理

Codex 改完 config.toml 就打不开?解析错误与启动验证

Codex 提示 Error loading config.toml、invalid escape 或 unclosed table,改配置后卡加载、重装仍无效?先保全实际文件,再本地定位行列、最小修复,并分别验证语法、字段、加载和目标功能。

刚加了一段 MCP 或项目配置,Codex 就提示 Error loading config.toml、invalid escape 或 unclosed table, expected ']';桌面端可能同时卡在加载或反复显示 setup。先保留报错里的文件路径、行列和错误类别,检查配置能否被解析。重装应用并不一定替换留在用户目录的配置文件。

只有“卡加载”、没有配置错误时,不应先认定是本问题。本文解决已经指向配置读取、解析或字段校验的启动阻塞;配置能加载但设置不生效,请看配置路径、覆盖与会话验证。

先分清错误类型

错误或现象 判断起点 下一步
invalid escape、unclosed table、重复键或表 TOML 语法,常附行列 第 2、3 步在本机副本定位
invalid type、无效枚举或取值 语法可能合法,Codex 字段要求不符 第 4 步核当前官方字段与类型
unknown / unused / ignored key 警告 当前版本可能不识别或不使用该键 核键名、层级和支持范围,不一律当语法错误
Permission denied、读不到文件 文件路径、身份、权限 先处理已确认的读取问题,不改 TOML 试错
能启动,但目标设置没变化 加载来源、优先级或行为 转配置不生效指南
文件为空、大量 NUL 或内容明显损坏 需要保全与恢复,可能无法推断原值 第 3 步的损坏边界

1. 找报错中的实际文件,先保全再编辑

适用条件: 已获得错误原文,或明确在改配置后出现阻塞。

以错误指向的完整路径为准,不先假设一定是 ~/.codex/config.toml。官方配置说明列出了用户、受信项目、profile、系统与托管等配置层;CODEX_HOME、远程主机和启动方式也可能让实际文件不同。

CLI 用户可在原启动终端记录 codex --version,用 codex --help 核入口;版本或帮助能显示不等于配置加载通过。桌面和 IDE 记录各自版本;独立 CLI 的版本与文件不一定代表它们。

  1. 保存正在编辑的文件和未提交工作;正常结束会写配置的相关会话或编辑动作,避免修复时被另一个进程写回。
  2. 将报错文件的原始副本保存在只有自己可访问的本地目录,记下时间与来源。它可能包含 MCP 凭据或私有路径,不放进 Git、共享盘或在线 TOML 校验器。
  3. 在副本上定位并准备修复。不要删除整个 .codex、覆盖成网上模板,或把用户文件整份复制到所有环境。

预期结果: 有可回退的原文件,知道本次修的是哪一层。报错路径与自己编辑的文件不符时先纠正来源;读权限仍失败时先停在该问题,不用管理员身份重开所有程序。

2. 在本机定位语法,避免输出凭据

适用条件: 报错指向 TOML 语法,且已有原始副本。

先在本地编辑器跳到报告的行列,连同前后几行查看引号、方括号与字符串。解析器报的位置常是发现无法继续的位置,真正漏掉的引号可能在前面。 一次修一个明确问题后重新解析,不把多行表、数组或字符串随意删一半做测试。

已有 Python 3.11 或更新版本时,可把下面脚本另存为 check_toml.py,用它只读检查副本。标准库 tomllib负责解析而不写回;此脚本只输出状态和可提取的行列,不打印配置正文、解析结果或异常全文。没有 Python 时,可用已有可信编辑器的本地 TOML 检查,不必为了排障上传文件或安装不明修复工具。

from pathlib import Path
import re
import sys
import tomllib

try:
    text = Path(sys.argv[1]).read_bytes().decode("utf-8")
    tomllib.loads(text)
except tomllib.TOMLDecodeError as error:
    match = re.search(r"\(at line (\d+), column (\d+)\)", str(error))
    if match:
        print(f"TOML 语法未通过:行 {match[1]},列 {match[2]}")
    else:
        print("TOML 语法未通过;可能在文件末尾。请在本机核对原错误位置。")
    sys.exit(1)
except UnicodeDecodeError:
    print("UTF-8 解码未通过;先保留原始字节,核对文件编码。")
    sys.exit(2)
except OSError:
    print("文件读取未通过;请核对路径与读取权限。")
    sys.exit(3)
print("TOML 语法通过;未验证 Codex 字段、策略、加载或功能。")

将路径替换为实际副本。下面是 macOS/Linux 调用示例;Windows 使用本机已安装的 Python 3.11+ 启动命令并传入同一个脚本与文件参数。

python3 check_toml.py "/实际的私有备份目录/config-working-copy.toml"

预期结果: 退出码 0 只表示此解析器接受 TOML;1 为语法未通过,2 为 UTF-8 解码未通过,3 为读取失败。末尾错误不一定有行列。tomllib 的 TOML 1.0 检查与当前 Codex 实现不是同一校验器;如果两者意见不同,保留版本差异,以实际 Codex 加载结果继续核对,别为通过一个工具批量重写配置。

3. 按具体错误做最小修复

Windows 路径中的反斜杠

适用条件: 路径写在双引号字符串中,报非法转义,或解析出来的路径与预期不同。

TOML 字符串规则中,双引号字符串会解释反斜杠。\u、\n、\t 等有各自含义,其他非法序列可能直接报错;因此并不是所有“单反斜杠”都会报同一种错,有些会变成不想要的控制字符。

以下是同一个虚构路径的两种有效字符串写法,二选一。只是 TOML 语法示例,path 不是让你新增到 Codex 配置里的通用设置。

path = 'C:\Users\User\tools\mcp.exe'
path = "C:\\Users\\User\\tools\\mcp.exe"

单引号字面量字符串不处理转义,但不能在这种单行字符串里直接包含单引号。实际路径包含特殊字符时应按规范正确编码;不要全文件替换反斜杠,也不要把其他字符串里的有效转义一起改坏。正斜杠能否被目标程序接受,还需按那个程序验证,不能只凭 TOML 通过。

验证: 副本语法通过,解析后字符串仍表示原来预期的路径;是否存在、能执行、MCP 能连接属于后续功能验证,不由语法检查代替。

缺少引号、方括号,或重复定义

适用条件: 报 unclosed table、重复键、重复表等。

对照错误附近的完整键和值,补回已确认缺失的定界符;同一个键重复时,先核对各段原本意图,不能随意保留最后一个。来自两份示例的同名表需要正确合并成员,不能简单再贴一次表头。

项目表里的路径也要确认真实目标。给乱码路径补上引号,只能让语法继续,并不能证明该路径正确,更不能证明给陌生目录设置 trusted 合理。不要为了开机删掉全部项目记录或放宽信任。

验证: 重新检查整个副本,不只检查改过的一行;原有其他配置仍在,差异只包含已经确认的修复。

空文件、NUL 与编码损坏

适用条件: 不只是漏一个符号,文件内容本身缺失或异常。

先保留字节副本,寻找编辑器本地历史或已有可信备份,核对其中原本需要的配置。空文件可以是合法 TOML,仍可能丢失所有自定义设置;把 NUL 删光或另存 UTF-8 也不能重建未知原值。

没有可信基线、配置混有多人改动,或不清楚哪些值必须保留时,停止自动覆盖,交维护者按当前官方字段逐项重建。恢复旧版本前要核对它是否会撤回新的权限约束、凭据引用或组织要求。不能承诺无备份也能完整恢复。

4. 语法通过后,再查字段、层级与策略

适用条件: 本地解析通过,Codex 仍报告 invalid type、无效取值或不识别设置。

按当前配置参考核对实际字段名、类型、取值和客户端支持。例如 model = 7 是合法 TOML,但模型字段不接受这个类型。未知键有的会警告、忽略或在特定结构中被拒;以本次完整诊断为准,不统一归为 TOML 语法错误。

表头后的键属于该表,除非进入下一个表或使用适当结构;“根设置写在表头后”可以语法合法,却落错层级。需要修复层级、profile 或被覆盖的问题时,接配置不生效指南。

组织策略拒绝某项设置时,保留诊断并交管理员确认。不要通过替换整份配置、删除托管要求或关闭沙箱消除错误。若本次字段是 MCP 启动路径,配置能加载后仍报连接失败,则转MCP 启动、认证与调用验证;如果明确为 Windows 沙箱初始化错误,再查MXC 与旧实现。

5. 把已审查修复应用回正确文件,逐层验收

适用条件: 副本的修复已明确,原文件已有备份,相关写入动作已经停止。

将审查过的最小修改应用到错误指向的真实文件,保留原访问权限,核对它没有被另一进程改写。正常退出并重新打开对应客户端,不重置账户、清认证或删除会话。

依次记录四项结果:

  1. 语法: 原解析错误是否消失;若移到另一行,继续处理下一处明确问题。
  2. Codex 接受: 是否还有类型、无效取值或策略错误;警告也要按需核对。
  3. 实际加载: 能进入会话后,按当前 CLI 的 /debug-config 查看来源、/status 查支持的状态;其他客户端使用各自入口。独立 CLI 成功不证明桌面端加载同一文件。
  4. 目标功能: 在最小、无敏感内容的已授权场景中验证原本改的功能,例如 MCP 列表和一次适用的只读调用。真实模型请求可能使用额度;能打开窗口不代表该功能已恢复。

完成标准: 实际客户端能加载目标配置、原阻塞消失、原有设置保留、目标功能有相应证据。只确认前两项时,就写“启动阻塞已解除,功能待验证”,不要宣告全部恢复。仍卡加载但已无配置错误时,保留新症状与版本,按客户端日志继续定位,不再反复编辑同一行。

证据范围与求助材料

issue #38500的 2026 年 8 月 Windows 桌面报告及另一位 CLI 0.148.0 用户回复,提供了畸形项目表、启动失败与修复后变化的个案;作者未定位确切写坏动作。不能因此认定当前所有卡加载都由 Codex 写坏配置,也不能把帖子状态当作当前修复承诺。

2026 年 10 月 23 日,在 macOS、Python 3.13.7、CLI 0.163.0-alpha.11.2 的独立临时目录验证了 14 组合成配置:合法/空文件、非法与两种有效 Windows 路径、重复键/表、未闭合项目键、错误类型/枚举、未知顶层键、合法但落错表的键、NUL 和无效 UTF-8。逐项比较本地语法检查与真实 CLI 离线配置加载,原始文件哈希不变;另用合成凭据验证检查脚本不打印配置内容。

没有调用真实模型、修改用户配置或实测 Windows、桌面启动循环与 IDE。求助只提供脱敏错误类别和行列、客户端版本、实际配置层及不含凭据的最小片段;不上传整份 config.toml、auth.json、环境变量或私有日志。

社区讨论

补充你的经验或问题

评论由 GitHub Discussions 承载;参与讨论需要登录 GitHub。