别再调 UAC 了:ChatGPT/Codex 卡死“完成 Windows 设置“,真凶是 config.toml 里缺的一个字段
别再调 UAC 了:ChatGPT/Codex 卡死"完成 Windows 设置",真凶是 config.toml 里缺的一个字段
现象伪装成 UAC / 权限 / 安装问题,实际根因在
.codex/config.toml引用的 model catalog。本文含完整证据链、两个独立错误源、正根修复与绕过修复。

🔥 最快解决方法:把这篇博客丢给本地任意 AI(如 DeepSeek、Kimi、通义等),让它直接按文中的「绕过修复」步骤帮你改好配置并清缓存,全程可回滚。
ChatGPT / Codex 桌面应用(OpenAI.Codex,MSIX 包)卡在"完成 Windows 设置",提示需要一次性管理员权限、但没有 UAC 弹窗、点击重试立即失败——别去折腾 UAC、Windows Sandbox 或重装。先看应用日志,会看到:
Invalid configuration; using defaults.
failed to parse model_catalog_json path `C:\Users\<user>\.codex\cc-switch-model-catalog.json`
as JSON: missing field `base_instructions` at line 70 column 5
根因:用 cc-switch(第三方模型切换工具)生成的 model catalog,用的是旧 schema,每个模型对象缺少新版桌面应用要求的 base_instructions 字段,导致整个 config.toml 解析失败,被应用错误地显示成"Windows 设置未完成 / config_load"。同机的 CLI 因为 schema 更宽容而不受影响——这是最大的误导信号。
正根修复:升级 cc-switch 重新生成 catalog(新版本会带 base_instructions 字段),并清掉应用缓存的旧 models_cache.json。
现象
Windows 11 上启动 ChatGPT 桌面客户端,界面停在"完成 Windows 设置":
- 提示"需要一次性管理员权限"
- 页面画出一个 UAC 确认框(发布者 OpenAI LLC),但系统实际从不弹出真正的 UAC
- 点击"重试"立即失败
- 重新安装、以管理员身份运行均无效
- 诡异的是:同机的 Codex CLI 完全正常,只有桌面应用报错
第一波排查:全是误导
这类错误第一眼太像系统权限问题了,依次排查:
| 怀疑方向 | 结论 |
|---|---|
| UAC 从不通知导致弹窗不出现 | 系统 UAC 确实长期"从不通知",但之前一直没问题,不是本次根因 |
| AppX / MSIX 安装链问题 | 包注册正常(Status=Ok),AppX 服务均运行 |
| Windows Sandbox | 与问题无关 |
| 桌面应用找不到 Codex CLI 二进制 | 那是另一个报错,设 CODEX_CLI_PATH 后可解;config_load 是更早的"设置"阶段 |
浪费不少时间后,注意到关键矛盾:CLI 正常、桌面异常,且两者读取同一个 config.toml。问题大概率出在配置本身,而不是系统层。
定位根因:去看日志,而不是看界面
桌面应用把真实错误藏起来了,界面只给一句误导性的"Windows 设置未完成"。真正信息在 Codex 的日志数据库 ~/.codex/logs_2.sqlite:
sqlite3 -readonly "$HOME/.codex/logs_2.sqlite" \
"SELECT datetime(ts,'unixepoch','localtime'), level, target, substr(feedback_log_body,1,300)
FROM logs WHERE level='ERROR' ORDER BY ts DESC LIMIT 30;"
故障期间(日志时间 09:38–10:53)铁证:
ERROR codex_app_server
Invalid configuration; using defaults.
failed to parse model_catalog_json path `C:\Users\<user>\.codex\cc-switch-model-catalog.json`
as JSON: missing field `base_instructions` at line 70 column 5
Invalid configuration; using defaults. —— 配置解析失败,应用静默回退默认配置,而这个失败被上层错误地映射成了"完成 Windows 设置 / config_load"。
根因详解:两个独立的错误源
排查中发现这条链上有两个 base_instructions 错误源,都要处理:
错误源 1:config.toml 的 model_catalog_json(导致 config_load)
model_catalog_json = "cc-switch-model-catalog.json" # ← 桌面应用解析它
cc-switch 生成的 cc-switch-model-catalog.json 里,每个模型对象用的是旧 schema,缺 base_instructions 字段。新版桌面应用要求该字段存在,解析失败 → 整个配置失效。
用 cc-switch 配置自定义模型(如 deepseek)
→ cc-switch 生成旧 schema 的 catalog(缺 base_instructions)
→ config.toml 的 model_catalog_json 引用它
→ 新版桌面应用解析失败
→ Invalid configuration; using defaults.
→ 被错误映射为"完成 Windows 设置 / config_load"
→ 表现为:无 UAC 弹窗、重试即失败、重装/管理员运行无效
错误源 2:models_cache.json 缓存(导致 model/list 失败)
移除 model_catalog_json 后,桌面应用会继续报:
codex_models_manager::cache: failed to load models cache:
missing field `base_instructions` at line 86 column 5
因为应用曾把坏格式的模型列表缓存到 ~/.codex/models_cache.json(实测该缓存里 5 个模型全部缺 base_instructions)。主配置修好了,旧缓存还会让错误复现。
为什么 CLI 正常、桌面应用异常
两者读取同一个 config.toml,但对 catalog 的 schema 要求不同:
- CLI 对
base_instructions缺失宽容(或不使用该字段) - 桌面应用要求严格,缺失即整配置失败
所以"CLI 正常"恰恰是最大的误导信号。
修复步骤
正根修复(推荐):让 catalog 合规
升级 cc-switch 到新版并重新生成 model catalog,新版会为每个模型补上 base_instructions 字段(实测升级后 catalog 内模型均含该字段)。重新生成后重启桌面应用即可。
绕过修复:移除配置 + 清缓存(不依赖工具升级)
操作前先备份,全程可回滚:
# 1. 备份
Copy-Item "$env:USERPROFILE\.codex\config.toml" "$env:USERPROFILE\.codex\config.toml.bak-$(Get-Date -Format yyyyMMdd-HHmmss)"
# 2. 从 config.toml 删除 cc-switch 的接入点(这一行)
删除 config.toml 中这一行:
model_catalog_json = "cc-switch-model-catalog.json"
再清掉桌面应用的模型缓存:
# 3. 完全退出桌面应用
Get-Process -Name ChatGPT,Codex -ErrorAction SilentlyContinue | Stop-Process -Force
# 4. 备份并删除模型缓存
$mc = "$env:USERPROFILE\.codex\models_cache.json"
Copy-Item $mc "$mc.bak-$(Get-Date -Format yyyyMMdd-HHmmss)" -Force -ErrorAction SilentlyContinue
Remove-Item $mc -Force -ErrorAction SilentlyContinue
# 5. 重新启动桌面应用(MSIX 用 AppID 启动)
explorer.exe "shell:appsFolder\OpenAI.Codex_2p2nqsd0c76g0!App"
注意:绕过修复会让桌面应用不再使用 cc-switch 的模型目录(回落到默认/官方模型列表)。如果还想用自定义模型(如 deepseek),要走正根修复。
验证
重启后再查日志,两个错误都应归零:
SELECT COUNT(*) FROM logs
WHERE ts > <重启时间>
AND (feedback_log_body LIKE '%base_instructions%'
OR feedback_log_body LIKE '%Invalid configuration%');
-- 结果:0
实测:删除配置 + 清理缓存后重启,日志中 Invalid configuration 和 base_instructions 错误全部消失,应用正常进入界面。
复盘与经验
- 先看日志,别信界面。 这次最大的坑是应用把明确的配置解析错误伪装成完全无关的"Windows 设置 / UAC"问题,大幅延长排查时间。
- "一边正常、一边异常"是强信号。 CLI 正常 + 桌面异常 = 共享配置的 schema 差异,而不是系统层问题。
- 第三方工具生成的配置可能过时。 cc-switch 这类工具生成的 model catalog 要跟得上桌面应用的 schema 要求(如
base_instructions字段)。优先升级工具重新生成,而不是删配置绕过。 - 缓存是第二现场。 删了主配置后,旧缓存还会让错误复现——日志见到
models cache错误就要想到清缓存。 - 两条错误要看全。
config.toml解析失败和models_cache.json解析失败是两个独立错误源,修复要覆盖两者。
附录:有用的排查命令
# 查看配置解析 / 应用错误日志
sqlite3 -readonly "$HOME/.codex/logs_2.sqlite" \
"SELECT datetime(ts,'unixepoch','localtime'), level, target, substr(feedback_log_body,1,300)
FROM logs WHERE level='ERROR' ORDER BY ts DESC LIMIT 30;"
# 检查 model catalog 里的模型是否都带 base_instructions
python -c "import json;d=json.load(open(r'C:\Users\<user>\.codex\cc-switch-model-catalog.json',encoding='utf-8'));print([ (m.get('slug'), 'base_instructions' in m) for m in d['models']])"
# 验证 UAC 提权路径本身是否正常(可选)
Start-Process powershell -Verb RunAs -ArgumentList '-NoProfile','-Command','whoami'
# 检查 UAC / LUA 策略(只读)
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" |
Select-Object EnableLUA, ConsentPromptBehaviorAdmin, FilterAdministratorToken
葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。
更多推荐

所有评论(0)