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:
@@ -542,7 +542,7 @@ class RouterHandler(BaseHTTPRequestHandler):
|
|||||||
log.warning("⚠ %s via %s FAILED: %s", model_name, kid, last_error)
|
log.warning("⚠ %s via %s FAILED: %s", model_name, kid, last_error)
|
||||||
# 错误分类:只有真正的 key 级错误才冷却 key
|
# 错误分类:只有真正的 key 级错误才冷却 key
|
||||||
# - 400 客户端错误:不重试、不冷却(换 key 无意义),直接返回给调用方
|
# - 400 客户端错误:不重试、不冷却(换 key 无意义),直接返回给调用方
|
||||||
# - 401/403 认证失败:key 级故障 → 冷却 300s
|
# - 401/403 认证失败:key 级故障 → 冷却 300s(但 ModelError=客户端传了不存在的模型,不冷却)
|
||||||
# - 402/429 配额/限流:key 级 → 冷却 60s
|
# - 402/429 配额/限流:key 级 → 冷却 60s
|
||||||
# - 5xx/Router.Unavailable:上游服务问题 → 不冷却 key(误杀元凶),立即失败
|
# - 5xx/Router.Unavailable:上游服务问题 → 不冷却 key(误杀元凶),立即失败
|
||||||
status = result.get("status", 0)
|
status = result.get("status", 0)
|
||||||
@@ -556,6 +556,13 @@ class RouterHandler(BaseHTTPRequestHandler):
|
|||||||
success = False
|
success = False
|
||||||
break
|
break
|
||||||
if status in (401, 403):
|
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)
|
mark_key_failed(kid, last_error, cooldown=FAIL_COOLDOWN_SEC)
|
||||||
elif status in (402, 429):
|
elif status in (402, 429):
|
||||||
mark_key_failed(kid, last_error, cooldown=60)
|
mark_key_failed(kid, last_error, cooldown=60)
|
||||||
|
|||||||
Reference in New Issue
Block a user