Skip to content

[Bug] Unlink 模型来源映射后被 auto-associate 机制立即重建 #294

@panzeyu2013

Description

@panzeyu2013

版本

main 分支当前提交

影响范围

Service

环境信息

桌面端 / 服务端均受影响

两种表现(同一根因)

表现一:Unlink 后映射被立即重建

复现步骤:

  1. 在账号池中添加至少一个活跃账户(或绑定一个聚合 API)
  2. 打开模型管理页面,进入任意模型的「路由」弹窗
  3. 在「已关联来源」中,对任意一个映射点击 Unlink
  4. 观察映射列表

实际结果: 映射被删除后立刻重新出现(新建的映射使用新 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-922auto_associate_source_models() 仅检查 DB 中是否已存在映射,不感知用户意图
  • model_sources.rs:327-346delete_model_source_routes_for_source() 硬删除两表,不保留偏好

bootstrap 调用时机(共 7 处)

  • 路由 RPC (apikey/modelRouting) — apikey_models.rs:443-444
  • 每次代理请求 — proxy.rs:188, 191, 194, 195
  • 候选账号筛选 — candidates.rs:49

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions