Skip to content

fix(app): preserve thread model choices - #2061

Open
Yuimi-chaya wants to merge 1 commit into
BigPizzaV3:mainfrom
Yuimi-chaya:codex/preserve-thread-model-choice
Open

fix(app): preserve thread model choices#2061
Yuimi-chaya wants to merge 1 commit into
BigPizzaV3:mainfrom
Yuimi-chaya:codex/preserve-thread-model-choice

Conversation

@Yuimi-chaya

@Yuimi-chaya Yuimi-chaya commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

背景与影响

Codex++ 在 pure API 模式下恢复已有线程时,会把缺少 provider 的 thread/resume 请求改写为显式 modelProvider: custom。当前 Codex app-server 只有在调用方没有显式提供 model、model provider 或 reasoning 配置时,才会恢复线程持久化的整组 model/provider/reasoning 元数据。

因此这个改写会阻断线程原模型恢复,使所有已有线程回退到当前供应商在 config.toml 中配置的默认模型。用户看到的不只是模型选择器显示错误:后续 turn 会实际继续使用错误模型。

OpenAI Codex 自身在检测到恢复模型与记录模型不一致时,也会建议切回原模型,并提示不一致“may affect Codex performance”:

OpenAI Codex resume mismatch warning

这意味着本问题会在用户无感知的情况下,把多个长期线程批量置于 Codex 官方明确警告的模型不一致状态,更容易影响上下文连续性和后续表现。

根因

本地提交 341b7c1 为 pure API 已有会话补充路由时,把 thread/resume 纳入 provider override。每次恢复线程,即使 App 请求没有任何 provider,Codex++ 也会补上 modelProvider: custom。

失败现场确认:

  • Codex++ 诊断日志记录了 13 次 thread/resume,全部从 provider 缺失被改成 custom。
  • state_5.sqlite 中 887 个线程的 model 仍保持原始分布,并没有被 Provider Sync 统一改写。
  • 全局 config.toml 的 model 是当前供应商默认模型;原生 resume metadata 被显式 provider 阻断后,App 因此回退到该模型。

改动

  • thread/resume 完全退出 Codex++ provider override。
  • 恢复请求中的 model、modelProvider、model_provider 和 reasoning 配置均交由 Codex 原生逻辑处理。
  • 保留新线程 thread/start 和必要 turn/start 的现有 pure API 路由。
  • 模型解锁只追加或取消隐藏可用模型,不再写入 default_model、defaultModel、model,也不把注入模型标记为宿主默认模型。

验证

自动化:

  • cargo test -p codex-plus-core --test cdp_bridge -j 2:114/114。
  • npm test -- --runInBand:119/119。
  • 新增 thread-ID-only resume 原样透传测试。
  • 新增带显式旧 provider/model 的 resume 原样透传测试。
  • 聚焦 Rustfmt 与 git diff --check 通过。
  • Windows、macOS x64、macOS arm64 三平台构建检查全部通过。

真人验证:

  • Windows 11 上使用完整本地组合构建安装验证。
  • 从 Codex++ 启动后,多个原本选择不同模型的已有线程均保持各自模型。
  • 新线程及 pure API 路由继续正常工作。

范围

本 PR 只修复线程模型恢复和模型目录所有权,不包含字体、locale、Dream Skin、restart 或 Provider Sync 事务改动。

@Yuimi-chaya
Yuimi-chaya marked this pull request as draft August 31, 2026 00:24
@Yuimi-chaya
Yuimi-chaya force-pushed the codex/preserve-thread-model-choice branch from 2130645 to a22bd9d Compare August 31, 2026 00:40
@Yuimi-chaya

Copy link
Copy Markdown
Contributor Author

更正上一版诊断:真人测试失败是有效回归信号。原补丁只处理了 Statsig 的一条 snake_case 路径,漏掉了 renderer 模型容器中的 defaultModel / model 合成,以及注入描述符的 isDefault。当前提交已改为“只扩展 available models,永不替宿主选择默认/线程模型”,并补上缺失字段场景的契约测试。PR 将保持 Draft,直到重新构建安装并通过真人多线程验证。

@Yuimi-chaya
Yuimi-chaya force-pushed the codex/preserve-thread-model-choice branch from a22bd9d to 531275a Compare August 31, 2026 01:21
@Yuimi-chaya

Copy link
Copy Markdown
Contributor Author

第三次更正:真实覆盖点不在模型目录,而在 Codex++ 对 thread/resume 强行补 modelProvider: custom。当前 app-server 只在请求没有任何显式 model/provider/reasoning override 时恢复持久化线程元数据,因此这个 provider 补丁恰好阻断了原线程模型恢复。失败现场日志中 13 次 resume 全部命中该改写,而 SQLite 的 887 个线程模型仍保持原分布。当前提交已让 thread/resume 完全退出 provider override;PR 继续保持 Draft,等待新构建真人测试。

@Yuimi-chaya

Copy link
Copy Markdown
Contributor Author

Windows 真人多线程验证现已通过:从 Codex++ 启动后,多个原本选择不同模型的已有线程均保持各自模型,新线程和 pure API 路由正常。PR 已更新正文并转为 Ready for review。

@Yuimi-chaya
Yuimi-chaya marked this pull request as ready for review August 31, 2026 01:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant