Codex供应商切换后旧对话失效问题完整解决方案总结
### 问题背景问题表现 在将Codex的供应商从 sub_lxapi 切换到 custom 后所有旧对话session打开时报错Codex 无法加载 config.toml因此此对话串无法继续。 请修复config.toml中的问题Model provider sub_lxapi not found### 问题的多层结构关键认知这个问题比表面看起来复杂得多配置存储在**四个不同层级**层级位置说明是否关键第1层全局配置文件config.toml用户可见的配置文件❌ 已正确修改但无效第2层Session文件sessions/*.jsonl每个对话的历史记录✅ 需要修复第3层SQLite数据库子目录sqlite/state_5.sqlite状态数据库副本⚠️ 修复了但未被读取第4层SQLite数据库根目录state_5.sqlite实际被Codex读取的数据库✅这是关键**关键发现**根目录下的数据库文件才是Codex实际读取的配置源这是比环境变量更深一层的问题。### 错误诊断过程#### 最初尝试无效1. **修改全局config.toml** → model_provider custom → ✅ 已正确但旧对话仍报错2. **删除config.toml** → ❌ 无效会自动重新生成3. **清除所有缓存** → ❌ 无效问题不在缓存使用专用工具尝试部分有效工具准备 - 安装Node.js 24版本必需- 安装codex-provider-sync工具npm install -g github:Dailin521/codex-provider-sync工具执行 codex-provider sync4. **使用codex-provider-sync工具** → ⚠️ 报告修改0个文件因为只检查了第1层#### 深入排查- 检查环境变量CODEX_HOME 设置正常- 检查session文件发现第2222行等多处还有旧配置- 检查SQLite数据库发现**根目录和子目录有重复的数据库实例**- 根目录数据库state_5.sqlite ← **Codex实际读取这个**- 子目录数据库sqlite/state_5.sqlite ← 这个不被读取### 完整修复步骤#### 步骤1修复Session文件JSONL使用Python脚本精确修复避免编码问题python #!/usr/bin/env python3 精确修复Codex session文件中的model_provider配置 import json from pathlib import Path def fix_session_file(filepath, old_providersub_lxapi, new_providercustom): lines_fixed 0 temp_path filepath.with_suffix(.jsonl.tmp) with open(filepath, r, encodingutf-8) as f_in: with open(temp_path, w, encodingutf-8, newline) as f_out: for line in f_in: try: data json.loads(line) if data.get(type) session_meta: payload data.get(payload, {}) if payload.get(model_provider) old_provider: payload[model_provider] new_provider data[payload] payload lines_fixed 1 f_out.write(json.dumps(data, ensure_asciiFalse, separators(,, :))) f_out.write(\n) except json.JSONDecodeError: f_out.write(line) filepath.replace(temp_path) return lines_fixed # 执行修复 sessions_dir Path(r用户名\.codex\sessions) for filepath in sessions_dir.rglob(rollout-*.jsonl): fix_session_file(filepath) **路径**用户名\.codex\sessions\YYYY\MM\DD\rollout-*.jsonl#### 步骤2更新SQLite数据库关键bash # 更新根目录数据库这是Codex实际读取的 sqlite3 用户名\.codex\state_5.sqlite \ UPDATE threads SET model_providercustom WHERE model_providersub_lxapi # 同时更新子目录数据库保持一致性 sqlite3 用户名\.codex\sqlite\state_5.sqlite \ UPDATE threads SET model_providercustom WHERE model_providersub_lxapi **关键路径**- 用户名\.codex\state_5.sqlite ← **必须修复这个**- 用户名\.codex\sqlite\state_5.sqlite#### 步骤3验证修复bash # 查询特定session的配置 sqlite3 用户名\.codex\state_5.sqlite \ SELECT id, model_provider FROM threads WHERE idsession-id # 检查是否还有旧配置 sqlite3 用户名\.codex\state_5.sqlite \ SELECT COUNT(*) FROM threads WHERE model_providersub_lxapi ### 关键经验教训#### 1. 删除config.toml和清除缓存**完全无效****原因**- config.toml 会自动重新生成删除无意义- 缓存不存储供应商配置清除无效- 问题根源在**数据库和session文件**不在配置文件或缓存#### 2. 环境变量不是根本问题虽然检查了环境变量 CODEX_HOME但真正的问题在于- **数据库实例的重复存储**- Codex读取优先级根目录数据库 子目录数据库 config.toml#### 3. 配置优先级关键认知读取优先级从高到低1. 根目录SQLite数据库state_5.sqlite ← 最高优先级2. Session文件中的session_meta记录3. 子目录SQLite数据库sqlite/state_5.sqlite4. 全局配置文件5. 环境变量配置#### 4. codex-provider-sync工具的局限性该工具只检查session文件的**第一行session_meta**忽略了- 后续的session_meta记录如第2222行- SQLite数据库中的配置### 最终解决方案总结**必须修复的三个位置**1. ✅ **根目录SQLite数据库**用户名\.codex\state_5.sqlite- 使用SQL UPDATE语句修改threads表2. ✅ **Session文件所有session_meta记录**用户名\.codex\sessions\*.jsonl- 使用Python脚本逐行修复确保UTF-8编码3. ⚠️ **子目录SQLite数据库**用户名\.codex\sqlite\state_5.sqlite- 保持一致性虽然可能不被读取### 检查清单修复完成后请验证- 全局config.toml显示 model_provider custom- SQLite查询显示无 sub_lxapi 配置- Session文件中无 sub_lxapi 引用- 重启Codex后旧对话正常打开### 预防措施1. 切换供应商前备份重要对话2. 使用专用工具而非手动删除文件3. 理解配置的存储层级不要只修改表面配置文件4. 定期检查数据库状态确保配置一致性**核心结论**这个问题比环境变量和配置文件更深一层关键在于“SQLite数据库的配置缓存”。删除config.toml和清除缓存完全无效必须直接修改数据库和session文件才能彻底解决。 如果实在无法解决可以用trae_cn等AI工具打开以下路径的文件夹让AI帮你搞记得备份!!! 记得备份!!! 记得备份!!!。系统 config.toml auth.json Windows C:\Users\用户名\.codex\ macOS / Linux ~/.codex/