fix: return HTTP 400 (not 502) for client ModelError/bad model requests
This commit is contained in:
@@ -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}。"""
|
||||||
|
|||||||
Reference in New Issue
Block a user