【开源】切 provider 避免丢会话:Codex-Threadripper(Codex实用小工具系列第一弹)

Wangnov 2026-05-06 17:13 1

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容:



  • 我的帖子已经打上 开源推广 标签:

  • 我的开源项目完整开源,无未开源部分:

  • 我的开源项目已链接认可 LINUX DO 社区:

  • 我帖子内的项目介绍,AI生成、润色内容部分已截图发出:

  • 以上选择我承诺是永久有效的,接受社区和佬友监督:


以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出






前言

这是 Codex 实用小工具系列 第一弹。


Codex 实用小工具系列是楼主在日常使用,或应朋友要求,或工作需要Vibe开发的一系列工具。从 CLI 到 APP 到 网络服务应有尽有。


正值五一节后进入摸鱼期,趁 cdx 干活的时候,我空闲下来把开源的工具都整理了一下,分享给各位佬友,希望能帮到有需要的人,如有帮助,还望不吝 Star,多谢!



这是什么




这是 Codex 线程撕裂者,专门用于撕裂线程之间的隔阂(中二病爆发)。解决在$CODEX_HOME/config.toml 里使用 model_provider 来切换不同 API 供应商后,却发现 Codex APP 里以前在别的 Provider 下的会话不见了,CLI 里的 codex resume 也找不到会话了的问题。


切 Provider 的方法如下:


model_provider = "test" # 在这里修改来切换

[model_provider.test]
name = "test"
wire_api = "responses"
base_url = "https://a.me/v1"
experimental_bearer_token = "sk-xxx"

[model_provider.test1]
name = "test1"
wire_api = "responses"
base_url = "https://a.me/v1"
experimental_bearer_token = "sk-xxx"

以下为 AI 写的 README 截图:


效果如何


使用前:


使用后:


可以看到,撕裂之后,所有的在各种不同 Provider 下的会话都能在 APP 里看到了。


如何安装


Homebrew


brew tap wangnov/tap
brew install codex-threadripper

npm


npm i -g codex-threadripper

cargo-binstall


cargo binstall codex-threadripper

cargo install


cargo install codex-threadripper

直接在 Release 里下载二进制




如何运行


这里就直接复制 README 了:



使用效果如下:



毫秒级解决!


咋做到的


简述一下这个项目的原理和设计,其实站内我也见过有其他佬友做的类似的项目,但和我的项目在设计上还是有一些区别。


大多数人可能对 Codex 的会话本体文件($CODEX_HOME/sessions/$YEAR/$MONTH/$DAY/$SESSION_ID.jsonl)有所了解,比如搞注册机的时候都知道去里面伪造对话什么的(不是)。这个 jsonl ,也称之为 Thread,即本项目要撕裂的对象(bushi


jsonl里有一个字段:model_provider。就在第一行:



我这里显示的是 openai (小写),这个字段大小写敏感。而小写的 openai 是 Codex 的内置 Model Provider,APIKEY(应该没人用官 key 吧)和 ChatGPT 登录后,走的就是这个 Provider。它默认直打官方后端,且不能在 config.toml 里修改这个 Provider。


因此,中转使用,和官方登录使用,这两者之间的会话绝对是隔离开的。除非你 Patch 掉 Codex APP 和 CLI。


那么,很自然的我们就会想到,通过直接改 jsonl 里的 model_provider,统一为一个,不就可以实现解除隔离了吗?


是的,有的佬友的项目就是靠这个方式实现的。我一开始也是这样想的,但是实际上碰到了一个问题:



我的老天鹅,你知道 77 个 G 是什么概念吗,想修改这里面的所有 jsonl,跑一次就得好几分钟,体验极差。


不过幸好,可能 OpenAI 内部也有和我一样懒得删懒得清理又大量跑批处理的工程师吧,他们很自然的想到了一个办法:Sqlite 做索引。


得益于 Codex 出色的 APP-Server 架构,Codex APP 和 Codex CLI 都可以连接到一个统一的本地 app-server,而线程列表最终会落到一个 thread/list 接口上。这个接口直接去查 $CODEX_HOME/state_5.sqlite 里的 threads 表。


这个表里保存了每条线程的索引信息,比如:


id
rollout_path
created_at / updated_at
cwd
title
source
archived
model_provider

并且,Codex 不但把 model_provider 存在这里,还专门给它建了索引。


所以切 Provider 后会话看不到了的真实原因就不是因为在 jsonl 里的 model_provider 字段不同了,而是数据库层面的,实际上就可以简化为下面这个查询逻辑:


SELECT * FROM threads
WHERE archived = 0
AND model_provider IN ('当前 provider')
ORDER BY updated_at DESC

所以 codex-threadripper 做的事情就很简单粗暴了。搞清楚之后,我们就顺势而为::



  1. 读取当前 $CODEX_HOME/config.toml 里的 model_provider

  2. 如果没配置,就按 Codex 默认的 openai 处理

  3. 先用 SQLite 官方 backup API 备份 state_5.sqlite

  4. 然后把 threads.model_provider 统一改成当前 Provider

  5. 后台 watch 模式继续监听配置变化和新增线程,自动继续撕裂线程(


核心逻辑约等于:


UPDATE threads
SET model_provider = '当前 provider'
WHERE model_provider <> '当前 provider';

这样做的好处就很显而易见,秒级改动,不用碰 77G 的 jsonl,不用逐个解析大文件,不用改会话正文。只改索引层,速度快,风险小。


而且 codex-threadripper 其实并没有把 jsonl 文件里的原始 model_provider 改掉。也就是说如果想真的去了解一下某个会话最初是从哪个 Provider 创建的,还是可以直接回源去看的。


说完了


以上就是这个小项目,希望对大家有帮助。有问题也欢迎直接丢 issue 进来。


后续还会有其他围绕 Codex 开发的项目分享,欢迎佬友插眼,我尽快写出来,也会作为合集更新到每个分帖子。




更新(2026-05-08)


版本 v0.2.1 已发布,请更新后使用


由于官方 Codex 更新 128 版本,里面加了一个重大的设计改动,我简述一下:


原本的切 provider 之后,我们看不到原本的 provider 的会话,本质上是对我们的一种保护(但是实际上对佬友大多数没用,后面我细说)。


而有好事者发现自己改 sqlite 里的 provider 就能实现跨 provider 恢复会话了(和我的逻辑一样),就兴冲冲的做了。结果做完发现:哎我咋会话恢复报错捏?


实际上这是因为,他用的是两个正规渠道:Azure 和 OpenAI ChatGPT订阅。


而这两个渠道,各自都有对自家的会话加密的逻辑。


这就导致了,我 Azure Provider 创建的会话,在 OpenAI 下就解不了会话的密文,导致报错。


因此此人上报 Issue,而 Codex 团队看到之后一拍脑子:干脆你们切 Provider 之后如果想恢复原本 Provider 的会话,就直接用原 Provider 继续好了。


我都懒得吐槽这个设计有多SB……


我切 Provider 的原因是啥?大多数情况下不是因为没钱了吗(),那你还给我切回去是何意味啊?而且对我们来说,无非是从一个 OpenAI 官方账号切到一个中转,只要中转不掺水用逆向的,也一样是 OpenAI 官方账号,不存在不能解的问题。


顺便,Codex 更新了根据 rollout 的 json 自动重建 sqlite 里的索引,把我这个工具的原本实现方法干掉了。现在我也只能原地改 rollout 里的第一行的 model_provider。只不过我用了原地 Patch ,先加 padding,后直接 patch,这样速度会快很多。



10s 内能解决 8000 条的检查和增量替换,这个速度还说得过去,虽然没有以前快乐了(


大家 Sessions 比我少的应该会快很多。


Codex 实用小工具系列目录


第一弹:【开源】切 provider 避免丢会话:Codex-Threadripper(Codex实用小工具系列第一弹)

第二弹:【开源】逆向 Codex APP ASR 搓了一个语音转写小工具,支持 Whisper 格式(Codex 实用小工具第二弹)

第三弹:【开源】做了一个 Codex App 安装包镜像,解决 Microsoft Store 不好下载的问题(Codex 实用小工具第三弹)

最新回复 (19)
  • Wangnov 楼主 05-06 17:18
    1

    @Haleclipse 哈雷佬,我之前维护的 Codex CLI 的 Patch 项目彻底不维护了,原因是只要我一启动 Patch 版本的,就会立刻把我 Codex APP 的 Computer Use 崩掉 ^-^


    这俩签名不对付,只要有非官方签名的直接就崩,我用我开发者证书签名也没戏。


    这个有办法能解吗




    难过,被迫全线都入正了

  • 白衣渡江 05-06 17:27
    2

    这个会话,如果是官方多账号,会出现会话被分隔开的问题吗

  • Wild_Umineko 05-06 17:27
    3

    这个好,正好头疼这个切provider导致session不同步

  • Wangnov 楼主 05-06 17:31
    4

    不会的,官方多账号的话有另外两个情况:



    1. 本身 Codex APP 做的就烂,缓存刷新不及时之类的,会话都在的跑不了,建议重启。实在不行可以直接自己拼接 deeplink:codex://threads/019dda19-a889-72b2-bee5-bf4f11feba2a 类似这样的,在浏览器打开就可以跳转到 Codex APP 里

    2. 如果用了某账号的云端会话:



      这个切号肯定是不在了的

  • MeaDeo 05-06 17:58
    5

    我之前也有这个问题 我让 codex 自己解决了


    AI 总结的:

    是在 Codex App / CLI 启动 app-server 时加一层极窄的 wrapper 代理。


    这个代理只识别会话列表相关的 JSON-RPC 请求,对列表查询做参数修正和有限分页聚合,再把结果按原协议返回。其它命令、其它请求、非 JSON 内容全部原样转发给原始 Codex。


    稳定性靠三点保证:原始可执行文件先备份,wrapper 只负责转发;开关状态异常或关闭时直接旁路原始程序;服务重启时只做幂等检查和修复,不杀已有进程,不改会话文件,所以重启不会把 CLI 或 Codex App 打挂。

  • Wangnov 楼主 05-06 18:04
    6

    这个思路我的 Codex 也给我提出来过,最后我还是选择了在官方既有的方案上来改,因为会省一笔后期维护的精力(其实Vibe的哪里有什么精力)


    因为很显然官方是有注意到 sessions 膨胀后索引难的问题的,他们做了现成的 sqlite,那刷库改库就是很简单的一件事儿了~

  • Mikito 05-07 09:41
    7

    codex更新后似乎就失效了呢。刚才安装试了下,没有恢复。

  • Wangnov 楼主 05-07 12:06
    8

    能否具体说下,比如是 APP 还是 CLI?

    codex-threadripper status 截图之类的

  • 国家精神病研究中心 05-07 12:12
    9

    羡慕技术大能,我就只能跟着用一下大神的作品!哎

  • Mikito 05-07 14:03
    10

    供您参考。我看有人提了issue还以为您是每空处理。

    Codex Threadripper


    Codex home: ..codex

    Config file: ..codex\config.toml

    SQLite file: ..codex\state_5.sqlite

    Target provider: custom

    Total threads: 18

    Rows needing reconcile: 0


    Provider distribution:

    custom: 18


    Background service:

    Manager: Windows Startup

    Config path: C:\Users\xx\AppData\Roaming\Microsoft/Windows/Start Menu/Programs/Startup\dev.wangnov.codex-threadripper.cmd

    Installed: yes

    Running: yes

  • Wangnov 楼主 05-07 14:25
    11

    感谢提醒,我检查了 Codex 128 版本的源码,它们引入了一个新的行为:


    恢复会话的时候,自动切换到上一个会话使用的 Provider


    这个行为对于我这种工具来说非常不利,我来想想怎么继续最小侵入式的跟进这次更新。

  • 兔斯基不在家 05-07 19:39
    12

    有解决办法了吗?是不是还是得批量刘改jsonl文件

  • Sponge 05-07 19:46
    13

    只要provider保持一致就不会丢历史对话,session按照provider name保存的,我现在固定使用openai作为provider name,官方账号登录就不知道了

  • 兔斯基不在家 05-07 20:29
    14

    使用openai作为provider name你那边使用时不会报错吗?模型也切不了

  • Wangnov 楼主 05-07 20:42
    15

    因为openai(小写)作为内置的provider,是不支持修改的。所以才有本项目的意义。


    目前看起来sqlite偷懒的路被堵死了,只能修改全量jsonl了(悲

  • Sponge 05-07 21:11
    16

    我没出现过报错,而且只要用的模型名称和官方一致,切模型也没问题,下面是我用的配置


    model_provider = “OpenAI”

    model = “gpt-5.5”

    review_model = “gpt-5.4”

    model_reasoning_effort = “xhigh”

    disable_response_storage = true

    network_access = “enabled”

    model_context_window = 400000

    model_auto_compact_token_limit = 360000

    approvals_reviewer = “user”

    service_tier = “fast”



    model_providers.OpenAI

    name = “openai”

    base_url = “http://127.0.0.1:8137/v1”

    wire_api = “responses”

    web_search = “cached”

  • 兔斯基不在家 05-07 21:21
    17

    试了你这个OpenAI,并不会显示我使用官方订阅时的会话,如果改成openai也就是小写才会显示,但是切模型会报错,使用命令式codex也会报错。我的是最新版的codex和cursor里的codex插件

  • Sponge 05-07 21:24
    18

    哈哈哈,应该是针对公益站有用,登录了官方账号就不看provider

  • Sponge 05-07 21:29
    19

    现在不是有CPA和sub2api嘛,还省得切换账号

* 帖子来源Linux.do
返回