fix: ModelError 401 (bad model name) was cooling all keys -> cooldown avalanche 502; treat as client error, return 400 without cooling

This commit is contained in:
hmo
2026-08-15 17:30:33 +08:00
parent 3becd8ea08
commit a800d5214d
+8 -1
View File
@@ -542,7 +542,7 @@ class RouterHandler(BaseHTTPRequestHandler):
log.warning("%s via %s FAILED: %s", model_name, kid, last_error)
# 错误分类:只有真正的 key 级错误才冷却 key
# - 400 客户端错误:不重试、不冷却(换 key 无意义),直接返回给调用方
# - 401/403 认证失败:key 级故障 → 冷却 300s
# - 401/403 认证失败:key 级故障 → 冷却 300s(但 ModelError=客户端传了不存在的模型,不冷却)
# - 402/429 配额/限流:key 级 → 冷却 60s
# - 5xx/Router.Unavailable:上游服务问题 → 不冷却 key(误杀元凶),立即失败
status = result.get("status", 0)
@@ -556,6 +556,13 @@ class RouterHandler(BaseHTTPRequestHandler):
success = False
break
if status in (401, 403):
# 区分:ModelError(模型不存在/不支持)是客户端请求错误,换 key 无用且会
# 把所有 key 打进冷却(雪崩);认证失败(Invalid key)才是 key 级故障。
if "ModelError" in last_error or "model is not" in last_error.lower() \
or "not supported" in last_error.lower() or "model not found" in last_error.lower():
log.warning("client ModelError (bad model name '%s'), returning 400 without cooling keys", model_name)
success = False
break
mark_key_failed(kid, last_error, cooldown=FAIL_COOLDOWN_SEC)
elif status in (402, 429):
mark_key_failed(kid, last_error, cooldown=60)