Skip to content

[Feature] 供应商级别可配置:故障转移恢复后是否强制切回高优先级供应商 #898

@Mriris

Description

@Mriris

场景描述

设置了两个供应商:

  • 供应商 A:优先级 0(便宜但不稳定的渠道)
  • 供应商 B:优先级 1(稳定但昂贵的渠道)

当供应商 A 连接失败后,系统正确地 failover 到供应商 B。但当供应商 A 恢复正常后,由于 session 的 sticky binding 机制,同一会话内后续请求仍然走供应商 B,持续产生高额费用。

对于 Claude Code 这种长会话场景,会话可能持续数十分钟甚至数小时(每次请求都会刷新 TTL),一旦 failover 到贵渠道,整个会话期间都无法切回便宜渠道。

为什么不能改为全局默认行为

当前的 sticky binding 设计对很多用户是合理的:

  • 同倍率的多渠道场景,保持绑定可以最大化缓存命中率,减少不必要的供应商切换
  • 频繁切换供应商会导致上下文缓存失效,反而增加成本

只有渠道间价格差异大的场景才需要尽快切回高优先级供应商。

期望行为

在供应商设置中增加一个独立的开关/选项(例如"故障恢复后强制切回"或"始终优先选择"),启用后:

  • 当该供应商从熔断状态恢复时,即使当前会话已绑定到其他健康供应商,也无条件将绑定迁移回该供应商
  • 未启用此选项的供应商保持现有行为(保持当前绑定,最大化缓存命中)

当前代码行为参考

src/lib/session-manager.tsupdateSessionBindingSmart 函数中,故障转移后的绑定更新逻辑:

场景 当前决策
故障转移成功 无条件更新绑定到备用供应商
原供应商恢复,当前绑定仍健康 保持当前绑定keep_healthy_higher_priority

建议在第二种场景中,检查原供应商是否开启了"强制切回"选项,如果是则执行迁移。

建议的实现方向

  1. 在供应商配置中增加一个布尔字段(如 alwaysPreferred / forceRecovery
  2. updateSessionBindingSmartfindReusable 中,当检测到有开启此选项的更高优先级供应商已恢复健康时,清除当前绑定并切回
  3. UI 上在供应商设置中增加对应的开关

Metadata

Metadata

Assignees

No one assigned

    Projects

    Status

    In progress

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions