fix: return HTTP 400 (not 502) for client ModelError/bad model requests

This commit is contained in:
hmo
2026-08-15 17:32:32 +08:00
parent a800d5214d
commit 42bcc4d4ec
+10 -2
View File
@@ -513,6 +513,7 @@ class RouterHandler(BaseHTTPRequestHandler):
last_error = ""
success = False
client_error = False # True=客户端请求错误(400/ModelError),应返回 4xx 而非 502
for attempt, k in enumerate(ranked_keys):
kid = k["key_id"]
@@ -553,6 +554,7 @@ class RouterHandler(BaseHTTPRequestHandler):
break
if status == 400:
log.warning("client error 400, returning to caller without retry")
client_error = True
success = False
break
if status in (401, 403):
@@ -561,6 +563,7 @@ class RouterHandler(BaseHTTPRequestHandler):
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)
client_error = True
success = False
break
mark_key_failed(kid, last_error, cooldown=FAIL_COOLDOWN_SEC)
@@ -590,8 +593,13 @@ class RouterHandler(BaseHTTPRequestHandler):
last_error = (f"all keys in cooldown until "
f"{datetime.fromtimestamp(earliest).strftime('%H:%M:%S')}"
f"{' (' + reason_str + ')' if reason_str else ''}")
log.error("%s ALL KEYS EXHAUSTED (%.2fs): %s", model_name, elapsed, last_error)
self._error_response(502, f"All OCG keys exhausted: {last_error}")
if client_error:
# 客户端请求错误(400/ModelError):返回 400,不是服务端故障
log.warning("%s client error (%.2fs): %s", model_name, elapsed, last_error)
self._error_response(400, last_error)
else:
log.error("%s ALL KEYS EXHAUSTED (%.2fs): %s", model_name, elapsed, last_error)
self._error_response(502, f"All OCG keys exhausted: {last_error}")
def _forward_request(self, api_key, body, is_stream):
"""转发单次请求到指定 key。返回 {ok, status, error}。"""