Skip to content

fix(relay-switch): 切换前回填不再采纳 cc-switch 写入的外部供应商配置 (issue #1497 #783 #975) - #2388

Open
leiming2333 wants to merge 1 commit into
BigPizzaV3:mainfrom
leiming2333:fix/cc-switch-provider-backfill
Open

leiming2333 wants to merge 1 commit into
BigPizzaV3:mainfrom
leiming2333:fix/cc-switch-provider-backfill

Conversation

@leiming2333

Copy link
Copy Markdown

问题

cc-switch 与 Codex++ 存在配置接管冲突(#1497 #783 #975):

  • 两个工具的默认模板占用同一个 provider id(model_provider = "custom")。
  • 用户用 cc-switch 切换供应商后,~/.codex/config.toml 变成 cc-switch 供应商的投影(不同的 base_url / API Key / 模型,以及 model_catalog_json = "cc-switch-model-catalog.json" 指针)。
  • 此时用户回 Codex++ 切换供应商:切换前的 backfill(backfill_relay_profile_from_home_with_common)会把 live 整段采纳进"上一个 Codex++ 供应商"(restore_profile_provider_id_for_backfill 只在 provider id 不同时改名保护,同名时不设防)。
  • 用户切回该供应商时,写入的是 Codex++ 供应商的名字 + cc-switch 的 base_url / 模型 / catalog 指针——上游、密钥、模型全部错乱,模型再也切不回去。即 [Bug]: 供应商配置会与cc-siwtch相冲突,导致config.toml配置混乱 #1497 描述的"内容为供应商 1 的名字、base_url 为供应商 2",以及 [Bug]: 模型映射后codex内模型没有改变或者消失 #975 的"模型列表消失或不变"。

修复

在切换前回填入口新增守卫 live_config_is_foreign_provider:三条条件同时满足才判定 live 已被外部管理器写成另一套供应商,跳过整段回填(保持模板原样,交给本次切换直接覆盖 live):

  1. live 与模板的活跃 provider id 相同(外部工具占用了同一 provider 位,这是双方默认模板撞名 custom 的根源);
  2. 双方 base_url 均非空且不相等(Codex++ 自己的 apply / 切回永远写模板里的 base_url,协议代理改写另有专门的还原分支);
  3. live auth.json 的 OPENAI_API_KEY 与模板 API Key 均非空且不相等(base_url 与密钥两个身份锚点同时漂移,只可能是另一套供应商)。

不影响既有契约:

  • 手工编辑回填(manual_a 形态:改 provider id + base_url + Key)不满足条件 1,仍完整回填,switch_backfills_previous_profile_from_live_before_selecting_target 保持通过;
  • 协议代理 / 聚合模式写 live 时复用 profile 自己的 Key,不满足条件 3,仍走原有回填与 base_url 还原分支;
  • 仅改 base_url 或仅换 Key 的手工编辑同样不触发守卫。

测试

  • 新增回归 switch_does_not_backfill_foreign_provider_written_by_cc_switch:复现"cc-switch 接管 → Codex++ 切换供应商 → 上一个供应商被污染"的完整链路。修复前失败(供应商 a 被写入 cc-switch 的 base_url、模型与 catalog 指针),修复后通过。
  • cargo test -p codex-plus-core:909 通过。唯一失败的 app_paths_resolves_portable_current_link_to_directory_version 在未修改的 main 上同样失败(本机 GNU 工具链环境相关,与本次改动无关)。

Closes #1497
Closes #783
Refs #975

 BigPizzaV3#783 BigPizzaV3#975)

cc-switch 与 Codex++ 的默认模板占用同一个 provider id(custom)。
cc-switch 接管 ~/.codex 后,live config.toml 变成另一套供应商的投影,
此时用户回 Codex++ 切换供应商,backfill 会把外部供应商的 base_url /
API Key 身份 / 模型 / cc-switch catalog 指针整段固化进上一个 Codex++
供应商;用户切回该供应商时上游、密钥、模型全部错乱,表现为切不回模型。

判定条件(三条同时满足才跳过回填,手工编辑不受影响):
- live 与模板的活跃 provider id 相同;
- 双方 base_url 均非空且不相等;
- live auth.json 的 OPENAI_API_KEY 与模板 API Key 均非空且不相等。

协议代理/聚合模式写 live 时复用 profile 自己的 Key,仅改 base_url 或
仅换 Key 的手工编辑、以及换了 provider id 的形态均不满足全部条件,
仍走原有回填路径。

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant