From ac7503d95f086fe12682e291d61459eb3ef4c0a1 Mon Sep 17 00:00:00 2001 From: song Date: Sat, 17 Jan 2026 02:14:57 +0800 Subject: [PATCH] =?UTF-8?q?fix(antigravity):=20429=20=E6=97=B6=E4=B9=9F?= =?UTF-8?q?=E5=88=87=E6=8D=A2=20URL=20=E9=87=8D=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 429 优先切换到下一个 URL 重试 - 只有所有 URL 都返回 429 时才限流账户并返回错误 - 与 client.go 中的逻辑保持一致 --- .../service/antigravity_gateway_service.go | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/backend/internal/service/antigravity_gateway_service.go b/backend/internal/service/antigravity_gateway_service.go index fc0008ea..45381d37 100644 --- a/backend/internal/service/antigravity_gateway_service.go +++ b/backend/internal/service/antigravity_gateway_service.go @@ -591,11 +591,19 @@ urlFallbackLoop: return nil, s.writeClaudeError(c, http.StatusBadGateway, "upstream_error", "Upstream request failed after retries") } - // 429 不重试,直接限流账户 + // 429 限流:优先切换 URL,所有 URL 都 429 时才返回 if resp.StatusCode == http.StatusTooManyRequests { respBody, _ := io.ReadAll(io.LimitReader(resp.Body, 2<<20)) _ = resp.Body.Close() + // 还有其他 URL,切换重试 + if urlIdx < len(availableURLs)-1 { + antigravity.DefaultURLAvailability.MarkUnavailable(baseURL) + log.Printf("%s URL fallback (429): %s -> %s", prefix, baseURL, availableURLs[urlIdx+1]) + continue urlFallbackLoop + } + + // 所有 URL 都 429,限流账户并返回 s.handleUpstreamError(ctx, prefix, account, resp.StatusCode, resp.Header, respBody, quotaScope) log.Printf("%s status=429 rate_limited body=%s", prefix, truncateForLog(respBody, 200)) resp = &http.Response{ @@ -1144,11 +1152,19 @@ urlFallbackLoop: return nil, s.writeGoogleError(c, http.StatusBadGateway, "Upstream request failed after retries") } - // 429 不重试,直接限流账户 + // 429 限流:优先切换 URL,所有 URL 都 429 时才返回 if resp.StatusCode == http.StatusTooManyRequests { respBody, _ := io.ReadAll(io.LimitReader(resp.Body, 2<<20)) _ = resp.Body.Close() + // 还有其他 URL,切换重试 + if urlIdx < len(availableURLs)-1 { + antigravity.DefaultURLAvailability.MarkUnavailable(baseURL) + log.Printf("%s URL fallback (429): %s -> %s", prefix, baseURL, availableURLs[urlIdx+1]) + continue urlFallbackLoop + } + + // 所有 URL 都 429,限流账户并返回 s.handleUpstreamError(ctx, prefix, account, resp.StatusCode, resp.Header, respBody, quotaScope) log.Printf("%s status=429 rate_limited body=%s", prefix, truncateForLog(respBody, 200)) resp = &http.Response{