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 = "" last_error = ""
success = False success = False
client_error = False # True=客户端请求错误(400/ModelError),应返回 4xx 而非 502
for attempt, k in enumerate(ranked_keys): for attempt, k in enumerate(ranked_keys):
kid = k["key_id"] kid = k["key_id"]
@@ -553,6 +554,7 @@ class RouterHandler(BaseHTTPRequestHandler):
break break
if status == 400: if status == 400:
log.warning("client error 400, returning to caller without retry") log.warning("client error 400, returning to caller without retry")
client_error = True
success = False success = False
break break
if status in (401, 403): 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() \ 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(): 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) log.warning("client ModelError (bad model name '%s'), returning 400 without cooling keys", model_name)
client_error = True
success = False success = False
break break
mark_key_failed(kid, last_error, cooldown=FAIL_COOLDOWN_SEC) 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 " last_error = (f"all keys in cooldown until "
f"{datetime.fromtimestamp(earliest).strftime('%H:%M:%S')}" f"{datetime.fromtimestamp(earliest).strftime('%H:%M:%S')}"
f"{' (' + reason_str + ')' if reason_str else ''}") f"{' (' + reason_str + ')' if reason_str else ''}")
log.error("%s ALL KEYS EXHAUSTED (%.2fs): %s", model_name, elapsed, last_error) if client_error:
self._error_response(502, f"All OCG keys exhausted: {last_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): def _forward_request(self, api_key, body, is_stream):
"""转发单次请求到指定 key。返回 {ok, status, error}。""" """转发单次请求到指定 key。返回 {ok, status, error}。"""