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 匹配

当两者一致时:

✅ 历史记录可见

当两者不一致时:

❌ 历史记录被过滤

因此解决方案只有两种:

  1. 修改 config.toml 中的 Provider;
  2. 修改历史 Session 中的 Provider。

对于 OpenAI 官方账号迁移到自定义 Provider 的场景,由于无法继续使用 openai 作为自定义 Provider 名称,因此通常只能采用第二种方案。

如果不想手工修改大量 Session 文件,可以直接使用:

Codex Provider Change

项目地址:

https://github.com/haixin-ye/Codex_provider_change

一键完成历史会话迁移与修复。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐