Codex 切换 Provider 后历史会话消失?用 codex-provider-sync 一键找回
项目运营 2026-08-13 lkb 133 36 分钟

Codex 切换 Provider 后历史会话消失?用 codex-provider-sync 一键找回

Codex 切换 Provider 后历史会话消失的根因与 codex-provider-sync 修复方案

切换 Codex Provider 后发现历史会话"消失"是常见问题,根因不是数据丢失,而是 sessions 目录和 state_5.sqlite 中的元数据仍指向旧 Provider。本文介绍开源工具 codex-provider-sync 的使用方法,涵盖 Windows GUI 和 CLI 两种操作路径,以及备份、安全边界和已知限制。

分享到:

切换 Codex 的 Provider 是个常见操作——从个人订阅切到公司账号,或者从官方 OpenAI 切到自定义中转。但切完之后打开对话列表,发现历史会话全没了。

第一反应通常是:数据是不是丢了?

大概率没丢。会话文件还在 ~/.codex/ 目录下,只是 rollout、SQLite 和项目可见性这些元数据还指向旧 Provider,新 Provider 下读不到,所以列表是空的。

手动修很麻烦——rollout 文件、SQLite 数据库、项目路径信息散落在不同位置,改错一个就可能把会话彻底搞坏。codex-provider-sync 就是专门解决这个的。它只做一件事:把旧 Provider 的会话元数据同步到当前 Provider,让历史记录重新可见。不碰认证信息,不改消息内容。

目前 GitHub 上 3.1k star,MIT 协议,提供 Windows GUI 和跨平台 CLI 两种使用方式。项目地址:github.com/Dailin521/codex-provider-sync

为什么会这样

Codex 的本地会话存储路径与 Provider 标识绑定。切换 model_provider 后,以下位置的元数据还指向旧 Provider:

  • Sessions 目录~/.codex/sessions~/.codex/archived_sessions 中的 rollout 文件
  • 状态数据库state_5.sqlite(存储插件 UI 状态及会话索引)
  • 项目可见性:相关的路径信息

这不是数据丢失,是读取路径失效。工具做的事就是把这些元数据重新映射到当前 Provider。

操作前的准备

前提条件:确保已在 IDE 中完成 Provider 切换,并关闭 Codex 进程(包括 Codex Desktop 和 app-server)。SQLite 被占用时同步会失败。

不管用什么工具操作本地数据,先备份是基本操作。工具本身每次同步前会自动备份到 ~/.codex/backups_state/provider-sync/<timestamp>,但手动再来一份更稳妥:

cp -r ~/.codex ~/.codex_bak

方式一:Windows GUI(推荐非命令行用户)

如果你的环境是 Windows,不需要命令行,直接去 Release 页面下载单文件 GUI:

github.com/Dailin521/codex-provider-sync/releases/latest

下载 CodexProviderSync.exe,打开后四步搞定:

  1. 点击「刷新」
  2. 选择目标 Provider
  3. 点击「立即同步」
  4. 等待同步完成,重启 Codex

GUI 会自动保留备份并显示同步结果。每天首次启动会检查一次更新,网络查询最多等待 10 秒。

EXE 未做代码签名,从浏览器下载后 Windows SmartScreen 可能会拦截。确认是从 GitHub Release 页面下载的即可放心使用。

方式二:CLI 命令行

CLI 支持 Node.js 16+,三个命令完成修复。

第 1 步:安装

npm install -g git+https://github.com/Dailin521/codex-provider-sync.git
 

第 2 步:检查当前状态

codex-provider status

这个命令会显示当前 Provider、rollout、SQLite 和项目可见性的诊断信息。确认信息无误后再执行同步。

第 3 步:执行同步

codex-provider sync

重启 Codex,对话列表应该就回来了。

如果你需要切换 Provider 和同步一步到位,也可以用:

codex-provider switch <provider-id>

这个命令会在修改 model_provider 后直接执行同步。

工具还会处理什么

除了基本的会话同步,codex-provider-sync 还做了这些事:

  • 同步 ~/.codex/sessions~/.codex/archived_sessions 中的 rollout metadata
  • 同步 Codex SQLite 线程记录,支持 SQLite 与 Codex Home 分开存放的场景
  • 修复项目可见性相关的路径信息,必要时同步 model metadata
  • 大型 rollout 文件在满足条件时原地更新,否则自动使用完整安全重写
  • codex-provider watch 可以监听配置、SQLite 及 WAL 变化并自动同步,适合频繁切换的场景

安全边界

这个工具的设计比较克制,几个值得注意的点:

不碰的东西:消息历史、会话标题、认证信息、auth.jsonupdated_at 时间戳。它不会修改时间戳来欺骗排序,也不会在多台设备之间复制配置或会话文件,只修复当前 Codex Home 的 metadata。

自动备份:每次 sync / switch 前都会备份到 ~/.codex/backups_state/provider-sync/<timestamp>。出了问题可以用 codex-provider restore <backup-dir> 恢复。

活跃会话锁:活跃会话锁住 rollout 文件时,工具会跳过该文件并继续处理其他会话。结束活跃会话后可以再次同步。

一个边界情况:含 encrypted_content 的会话跨 Provider/account 后,可能只能恢复列表可见性,继续对话或 compact 仍可能报 invalid_encrypted_content。这是加密机制的限制,不是工具的 bug。

首屏显示限制:Codex Desktop 首屏只显示最近 50 条会话。如果 /resume 能看到但项目侧不显示,查一下 status 里的 first page / ranks 诊断。

什么情况下不需要它

如果所有中转都能稳定复用同一个 model_provider,并且历史会话始终可见,那么统一 Provider ID 是更简单的方案,不需要额外同步。

这个工具主要用于无法统一 Provider ID,或需要在官方订阅和自定义 Provider 之间切换的场景。

写在最后

切换 Provider 导致会话消失这件事,本质上是元数据的路径映射问题,不是数据丢失。codex-provider-sync 把这个手动修起来很痛苦的活自动化了,备份和恢复机制也做得比较扎实。

如果你遇到过这个问题,可以试试:github.com/Dailin521/codex-provider-sync


本文基于 codex-provider-sync 项目 README 整理,工具持续更新中,具体命令和参数请以官方仓库最新文档为准。

文章标签

下一篇

没有了

相关文章

评论 (0)

发表评论

审核通过后公开显示

暂无评论。