diff --git a/gateway/scripts/ocg_router.py b/gateway/scripts/ocg_router.py index 741320e..0e6c27a 100644 --- a/gateway/scripts/ocg_router.py +++ b/gateway/scripts/ocg_router.py @@ -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)