Reliability: endpoint-level health state machine (suspect/quarantined + background probe recovery)
Summary
本提案在现有的按请求失败记账(cooldown ladder / model benching)与 bandit 评分层之间,增加一个端点(endpoint)级健康状态机。目标:不让真实用户请求反复撞上“结构性死亡”或“持续不可用”的端点,并在后台发现恢复。
范围说明:不改动现有 cooldown ladder、model benching、bandit、degraded mode 机制,只在更细的粒度——(platform, endpoint) 对——上补一层目前缺失的记忆。
生产数据(单台自托管实例,7 天窗口,971 成功 / 496 错误)
错误收敛为三类,全部指向同一个结构性缺口——端点级没有持久记忆:
| 类别 | 占比 | attempt trail 实例 |
|---|---|---|
| 结构性死亡端点,每个请求都重新撞一遍 | ~30% | deepseek-v4-flash 请求 34 次、26 个错误:每次都按 opencode(400 Model is unavailable) → bazaarlink(404 model not available) → huggingface(fetch failed) 同样顺序走完,最后落到 custom |
| 站点级免费池枯竭(402/403/429 站点级) | ~13% | NavyAI 403 Free plan temporarily disabled due to abuse、BazaarLink 429 site-wide free-model capacity is currently full |
| 上游持续不可用(relay 下架了模型) | ~11% | BazaarLink API error 404: model ... is not available |
两个加重因素:
- 失败请求平均要挂 7.3s 才报错(最长 15s)——大部分时间花在重新发现“上一个请求几分钟前已经证明死亡”的端点上;
- 坏状态是“持续”的而非“随机”的:同一窗口内一天 208 个错误、次日同样流量只有 36 个。端点健康是持久状态,状态机是正确的建模方式。
设计
1. 失败归因到端点粒度(前置,无行为变化)
request_attempts 已记录每次 attempt 的 platform + model_id + outcome。补上(或派生)端点身份(platform + endpoint_scope,含 custom base-url 哈希),使每类失败都能归因到服务它的端点。
2. 端点健康状态机(suspect → quarantined → healthy)
- Suspect:窗口内 N 次结构性失败(404 model-not-found、400 upstream-unavailable、TLS/fetch 失败)→ 端点不再被优先选择;仅当无健康端点时请求才落到它。
- Quarantined:结构性失败持续 → chain 构造期直接跳过该端点(不是降权——这与 bandit penalty 的区别在于 bandit 降权后仍会让真实请求去探测)。
- 恢复:隔离端点由后台 probe 验证(复用现有
cooldown-probe.ts的模式:错峰、指数退避、绝不烧用户请求),探活成功回到 healthy。 - 限速类失败(429/402)不触发隔离——它们是周期性的,已由 cooldown ladder 处理。只有结构性失败才升级。
3. 可调参数(遵循现有 settings/env 约定)
endpoint_suspect_threshold、endpoint_quarantine_threshold、endpoint_probe_interval_ms、kill switch ENDPOINT_HEALTH_DISABLED=1。
为什么不直接扩展现有 cooldown ladder?
Ladder 已经能 bench model/key——但视野是 90s 到分钟级,且按计时器到期重新放行、不按证据。对一个下架了模型的 relay 或 TLS 坏掉的主机,结果是:bench 90s → 用真实请求再撞一次 → 失败 → 再 bench,无限循环,每个用户请求付出 ~7s 代价。状态机的 quarantined + 后台 probe 补上了这个闭环。
PR 计划(一个 PR 一个关注点)
- attempt 记账补端点粒度归因
- 端点健康状态机 + 后台 probe 恢复
- 错误分类调优(结构性失败快速升级、周期性失败不升级)
我可以认领这些工作。相关但独立的想法(tools/vision 观测能力分、任务意图→链映射)等本提案落地或讨论收敛后另开 issue。
正文为中文,标题保留英文便于检索;日志引用均为上游原始英文错误。
Source: tashfeenahmed/freellmapi