-
-
Notifications
You must be signed in to change notification settings - Fork 221
Open
Labels
Description
场景描述
设置了两个供应商:
- 供应商 A:优先级 0(便宜但不稳定的渠道)
- 供应商 B:优先级 1(稳定但昂贵的渠道)
当供应商 A 连接失败后,系统正确地 failover 到供应商 B。但当供应商 A 恢复正常后,由于 session 的 sticky binding 机制,同一会话内后续请求仍然走供应商 B,持续产生高额费用。
对于 Claude Code 这种长会话场景,会话可能持续数十分钟甚至数小时(每次请求都会刷新 TTL),一旦 failover 到贵渠道,整个会话期间都无法切回便宜渠道。
为什么不能改为全局默认行为
当前的 sticky binding 设计对很多用户是合理的:
- 同倍率的多渠道场景,保持绑定可以最大化缓存命中率,减少不必要的供应商切换
- 频繁切换供应商会导致上下文缓存失效,反而增加成本
只有渠道间价格差异大的场景才需要尽快切回高优先级供应商。
期望行为
在供应商设置中增加一个独立的开关/选项(例如"故障恢复后强制切回"或"始终优先选择"),启用后:
- 当该供应商从熔断状态恢复时,即使当前会话已绑定到其他健康供应商,也无条件将绑定迁移回该供应商
- 未启用此选项的供应商保持现有行为(保持当前绑定,最大化缓存命中)
当前代码行为参考
src/lib/session-manager.ts 的 updateSessionBindingSmart 函数中,故障转移后的绑定更新逻辑:
| 场景 | 当前决策 |
|---|---|
| 故障转移成功 | 无条件更新绑定到备用供应商 |
| 原供应商恢复,当前绑定仍健康 | 保持当前绑定(keep_healthy_higher_priority) |
建议在第二种场景中,检查原供应商是否开启了"强制切回"选项,如果是则执行迁移。
建议的实现方向
- 在供应商配置中增加一个布尔字段(如
alwaysPreferred/forceRecovery) - 在
updateSessionBindingSmart或findReusable中,当检测到有开启此选项的更高优先级供应商已恢复健康时,清除当前绑定并切回 - UI 上在供应商设置中增加对应的开关
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
Projects
Status
In progress