From 42bcc4d4ec96b5f7a4dd8ab443fdea6cc1a9715a Mon Sep 17 00:00:00 2001 From: hmo Date: Sat, 15 Aug 2026 17:32:32 +0800 Subject: [PATCH] fix: return HTTP 400 (not 502) for client ModelError/bad model requests --- gateway/scripts/ocg_router.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/gateway/scripts/ocg_router.py b/gateway/scripts/ocg_router.py index 0e6c27a..7416a2e 100644 --- a/gateway/scripts/ocg_router.py +++ b/gateway/scripts/ocg_router.py @@ -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}。"""