版本
main 分支当前提交
影响范围
Service
环境信息
桌面端 / 服务端均受影响
两种表现(同一根因)
表现一:Unlink 后映射被立即重建
复现步骤:
- 在账号池中添加至少一个活跃账户(或绑定一个聚合 API)
- 打开模型管理页面,进入任意模型的「路由」弹窗
- 在「已关联来源」中,对任意一个映射点击 Unlink
- 观察映射列表
实际结果: 映射被删除后立刻重新出现(新建的映射使用新 ID,enabled=true)。从 UI 上看映射从未消失过。
表现二:账户限流恢复后已禁用的映射被重置启用
链路:
账户被限流 → status 变为 "limited" / "unavailable"
→ 下一次 bootstrap:
sync_openai_account_source_models_with_options() [apikey_models.rs:483]
→ 第 493 行: .filter(|account| account.status == "active")
→ 该账户被排除
→ 第 513 行: prune_stale_openai_account_source_routes()
→ delete_model_source_routes_for_source()
→ DELETE FROM model_source_mappings WHERE source_id=?
→ DELETE FROM model_source_models WHERE source_id=?
账户恢复后 → status 变为 "active"
→ auto_associate_source_models:
existing_source_platform_mappings 为空(已被 prune 删除)
→ 创建新映射 enabled=true ← 已 disabled 的映射被重置启用
统一根因
| 场景 |
触发方式 |
丢失的用户偏好 |
| Unlink 后重建 |
手动 Unlink → 映射删 → bootstrap 重建 |
"我不想用这个来源" |
| 限流恢复后重启用 |
账户不可用 → prune 删除映射 → 恢复后重建 |
"这个模型我已禁用" |
根源:用户意图(unlink / disable)仅存储在 model_source_mappings 行中,而 auto_associate_source_models + prune_stale_* 机制会无条件物理删除这些行并重建。系统缺少墓碑机制来区分「从未关联过」和「用户主动解除过」。
关键代码位置
apikey_models.rs:493 — 仅 status == "active" 参与,"limited"/"unavailable" 与 "banned"/"disabled" 同等处理
apikey_models.rs:513 — 非 active 账户路由全部物理删除,不区分临时/永久
apikey_models.rs:821-922 — auto_associate_source_models() 仅检查 DB 中是否已存在映射,不感知用户意图
model_sources.rs:327-346 — delete_model_source_routes_for_source() 硬删除两表,不保留偏好
bootstrap 调用时机(共 7 处)
- 路由 RPC (
apikey/modelRouting) — apikey_models.rs:443-444
- 每次代理请求 —
proxy.rs:188, 191, 194, 195
- 候选账号筛选 —
candidates.rs:49
版本
main 分支当前提交
影响范围
Service
环境信息
桌面端 / 服务端均受影响
两种表现(同一根因)
表现一:Unlink 后映射被立即重建
复现步骤:
实际结果: 映射被删除后立刻重新出现(新建的映射使用新 ID,enabled=true)。从 UI 上看映射从未消失过。
表现二:账户限流恢复后已禁用的映射被重置启用
链路:
统一根因
根源:用户意图(unlink / disable)仅存储在
model_source_mappings行中,而auto_associate_source_models+prune_stale_*机制会无条件物理删除这些行并重建。系统缺少墓碑机制来区分「从未关联过」和「用户主动解除过」。关键代码位置
apikey_models.rs:493— 仅status == "active"参与,"limited"/"unavailable"与"banned"/"disabled"同等处理apikey_models.rs:513— 非 active 账户路由全部物理删除,不区分临时/永久apikey_models.rs:821-922—auto_associate_source_models()仅检查 DB 中是否已存在映射,不感知用户意图model_sources.rs:327-346—delete_model_source_routes_for_source()硬删除两表,不保留偏好bootstrap 调用时机(共 7 处)
apikey/modelRouting) —apikey_models.rs:443-444proxy.rs:188, 191, 194, 195candidates.rs:49