Codex 切换供应商后历史记录消失?最简单的解决方案。
Codex 切换供应商后历史记录消失?原理分析和最简单的解决方案。
这里先说问题根源,其实就是Codex的历史会话文件中的provider字段和现在的配置中的provider字段对不上,导致无法给你显示。
图快的朋友可以直接下载这个工具,傻瓜式解决。
https://github.com/haixin-ye/Codex_provider_change
详细介绍原理
很多使用 Codex CLI 的用户都会遇到这样一个问题:
明明之前的历史会话都还保存在本地,但当切换 Provider(例如从 OpenAI 官方账号切换到中转站、自建 API、OpenRouter 等)之后,执行 codex resume 却发现历史记录全部消失了。
不少用户第一反应会认为:
- 历史记录丢失了
- Session 文件损坏了
- Codex 出现 Bug 了
实际上,这些历史记录并没有消失,而是由于 Codex 的历史会话召回机制导致无法显示。
本文将详细分析问题产生的原因,以及如何快速恢复历史会话。
问题现象
例如最开始使用的是 OpenAI 官方账号。
此时配置类似:
model = "gpt-5"
由于是官方登录,Codex 默认使用:
provider = openai
经过一段时间使用后,本地已经积累了大量历史会话。
后来为了使用中转站或者其他兼容 OpenAI API 的服务,修改配置:
provider = my-provider
base_url = "https://xxx.com/v1"
api_key = "xxxx"
重新启动 Codex 后执行:
codex resume
结果发现之前的历史记录全部不见了。
但实际上,Session 文件依然存在于本地。
Codex 的历史会话是如何保存的
Codex 的历史会话默认保存在本地,而不是云端。
每个会话都会对应一个 Session 文件。
除了消息内容之外,还会记录一些元数据,例如:
{
"provider": "openai",
"model": "gpt-5"
}
其中有一个非常重要的字段:
provider
这个字段决定了该会话属于哪个 Provider。
Codex 是如何召回历史会话的
很多人认为:
只要 Session 文件存在,就一定会出现在历史记录中。
实际上并不是这样。
Codex 在读取历史记录时,会根据当前配置中的 Provider 对会话进行过滤。
例如当前配置文件中(config.toml):
provider = openai
那么 Codex 只会显示:
{
"provider": "openai"
}
对应的历史会话。
而对于:
{
"provider": "my-provider"
}
这样的会话,则不会被显示。
也就是说:
Session 文件存在
≠
Session 一定可见
真正决定历史记录是否显示的是:
当前 Provider
=
Session Provider
两者是否匹配。
为什么切换 Provider 后历史记录会消失
假设原来的环境如下:
provider = openai
历史会话:
{
"provider": "openai"
}
后来切换到:
provider = my-provider
此时 Codex 会认为当前环境是:
my-provider
当它扫描历史会话时发现:
当前 Provider:
my-provider
历史 Provider:
openai
两者不一致。
于是这些历史记录会被直接过滤掉。
最终表现出来的现象就是:
历史记录全部消失
实际上:
历史记录仍然存在
只是无法被召回
最简单的解决方案
解决方案非常简单:
修改配置文件中的 Provider。
例如:
provider = openai
改成:
provider = my-provider
或者反过来。
只要保证:
config.toml 中的 provider = 历史会话中的 provider
历史记录就会重新显示。
为什么官方账号迁移会更麻烦
对于 OpenAI 官方登录的账号来说,情况会稍微复杂一些。
因为官方登录模式下provider通常不会显式写入配置文件。
Codex 默认认为:
provider = openai
因此历史会话中的记录往往都是:
{
"provider": "openai"
}
后来如果用户切换到中转站:
provider = my-provider
base_url = "https://xxx.com/v1"
这里的 Provider 其实是无法改写为openai的。
因为 Codex 会将其识别为官方 Provider,所以他不允许你重写为openai。
因此:无法通过修改当前 Provider为openai来兼容之前的历史会话。
这种情况下只能修改历史会话
既然当前 Provider 无法修改。
那么就只能反过来修改历史 Session。
将历史记录中的:
{
"provider": "openai"
}
批量替换为:
{
"provider": "my-provider"
}
这样对于 Codex 来说:
当前 Provider:
my-provider
历史 Provider:
my-provider
两者重新匹配。
历史记录自然就能够正常显示。
一键解决方案
为了方便解决这个问题,大家可以使用这个工具:
项目地址
https://github.com/haixin-ye/Codex_provider_change
该工具可以自动扫描 Codex Session 目录,并批量修改历史会话中的 Provider 字段。
核心逻辑非常简单:
旧 Provider
↓
批量替换
↓
新 Provider
从而让历史会话重新被 Codex 正常识别。
适用于:
- OpenAI → 中转站
- 中转站 A → 中转站 B
- Azure → OpenRouter
- 自定义 Provider 迁移
- Provider 重命名
等各种场景。
整个过程无需手工编辑 Session 文件。
同时该工具提供操作界面,可以让大家傻瓜式的使用,很方便。
总结
Codex 切换 Provider 后历史记录“消失”,本质上并不是历史记录丢失,而是历史会话中的 Provider 字段与当前配置中的 Provider 不匹配。
其核心逻辑可以概括为:
Codex 历史召回
=
当前 Provider
+
Session Provider 匹配
当两者一致时:
✅ 历史记录可见
当两者不一致时:
❌ 历史记录被过滤
因此解决方案只有两种:
- 修改
config.toml中的 Provider; - 修改历史 Session 中的 Provider。
对于 OpenAI 官方账号迁移到自定义 Provider 的场景,由于无法继续使用 openai 作为自定义 Provider 名称,因此通常只能采用第二种方案。
如果不想手工修改大量 Session 文件,可以直接使用:
Codex Provider Change
项目地址:
https://github.com/haixin-ye/Codex_provider_change
一键完成历史会话迁移与修复。
更多推荐




所有评论(0)