GitHub user mochengqian added a comment to the discussion: [AI] AI gateway 
milestones

**承接本帖的方向:把 AI 失败状态下沉进 cluster picker**

接着本帖里 key 级 cooldown 的讨论(某个 API key 触发 429 不应把整个 endpoint 
标成不健康)——我想先探一下大家对这个方向上一个小而聚焦的步骤是否有兴趣。

**当前现状。** #932 之后,cluster 已经有了通过 `atomic.Pointer` 发布的不可变 `EndpointSnapshot`(成员 
+ 健康),但 picker 选址只看健康状态。AI 失败状态(cooldown)目前活在 LLM filter 的进程级全局 map 
里(`pkg/filter/llm/proxy/filter.go` 的 `sharedCooldownStore`),picker 看不到它。所以 
fallback 是 filter 侧的一个循环,“跳过处于 cooldown 的 endpoint”这件事从来没进入选址决策。

**建议方向——做的是状态基底,不是新算法。** 对 endpoint 失败做分类(429 / 5xx / timeout / context-length 
/ quota),并把 per-endpoint 的 runtime 状态放进 cluster,让 picker 能够跳过处于 cooldown 的 
endpoint。其中最值得一提的是 `context_length_exceeded`:它是请求与 endpoint 的“不匹配”,而不是 endpoint 
故障——正确的反应是把这个请求路由到 context 更大的模型,而不是把该 endpoint 
冷却掉。二元健康(healthy/unhealthy)无法表达这一点,而这和上面 key 级的问题是同一个形状。

**唯一需要先达成共识的设计点。** 我们不能简单地在 snapshot 的 endpoint 上加一个 `cooldownUntil` 
字段:cooldown / inflight / latency 是每个请求都在变的,如果每次请求都去重建那个不可变 snapshot,会毁掉 #932 
刚拿到的零分配读路径。因此建议把两者拆开:
- 不可变的成员/健康 snapshot(沿用 #932 不变),以及
- 一个按 endpoint ID 索引、跨 snapshot 重建而存活的 per-endpoint `EndpointState`,其中快变字段用 
atomic 承载;当 ID 不变时,重建时复用同一个 state 指针。

这与 Envoy 把静态 host config 和可变的负载/异常统计分开的做法是一致的。

**时序与边界。** 这是 #939(把 cooldown store 改为注入、移除全局变量)之后自然的下一步,并假设 
#958(config/runtime 解耦)确立的 ownership 模型。它刻意不包含 scorer(cost / quota / latency 
加权打分)、语义路由,以及多 cluster-kind——这些各自是后续独立的步骤。

不知道大家对这个方向是否有兴趣?如果有,我会把它整理成一个完整的 `[RFC]` issue,附上接口草图、兼容性说明,以及测试 / benchmark 计划。

GitHub link: 
https://github.com/apache/dubbo-go-pixiu/discussions/696#discussioncomment-17162858

----
This is an automatically sent email for [email protected].
To unsubscribe, please send an email to: 
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to