Skip to content

Commit 21b6f2d

Browse files
committed
fix(antigravity): correctly mark credits exhausted on "Resource has been exhausted" 429
shouldMarkCreditsExhausted was blocked by isURLLevelRateLimit check when credit overages retry returned "Resource has been exhausted (e.g. check quota).", causing credits to never be marked as exhausted. This led to an infinite loop where each request injected credits, bypassed model rate limits, and failed again. - Remove isURLLevelRateLimit guard from shouldMarkCreditsExhausted (only called for credit retry responses — if credits retry fails, mark exhausted) - Add "resource has been exhausted" to creditsExhaustedKeywords - Update tests to match corrected behavior
1 parent 0236b97 commit 21b6f2d

2 files changed

Lines changed: 12 additions & 5 deletions

File tree

backend/internal/service/antigravity_credits_overages.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ var (
4545
"minimumcreditamountforusage",
4646
"minimum credit amount for usage",
4747
"minimum credit",
48+
"resource has been exhausted",
4849
}
4950
)
5051

@@ -147,9 +148,9 @@ func shouldMarkCreditsExhausted(resp *http.Response, respBody []byte, reqErr err
147148
if resp.StatusCode >= 500 || resp.StatusCode == http.StatusRequestTimeout {
148149
return false
149150
}
150-
if isURLLevelRateLimit(respBody) {
151-
return false
152-
}
151+
// 注意:不再检查 isURLLevelRateLimit。此函数仅在积分重试失败后调用,
152+
// 如果注入 enabledCreditTypes 后仍返回 "Resource has been exhausted",
153+
// 说明积分也已耗尽,应该标记。clearCreditsExhausted 会在后续成功时自动清除。
153154
if info := parseAntigravitySmartRetryInfo(respBody); info != nil {
154155
return false
155156
}

backend/internal/service/antigravity_credits_overages_test.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,10 +406,16 @@ func TestShouldMarkCreditsExhausted(t *testing.T) {
406406
require.False(t, shouldMarkCreditsExhausted(resp, []byte(`{"error":"Insufficient credits"}`), nil))
407407
})
408408

409-
t.Run("URL 级限流不标记", func(t *testing.T) {
409+
t.Run("Resource has been exhausted 应标记为积分耗尽", func(t *testing.T) {
410410
resp := &http.Response{StatusCode: http.StatusTooManyRequests}
411411
body := []byte(`{"error":{"message":"Resource has been exhausted"}}`)
412-
require.False(t, shouldMarkCreditsExhausted(resp, body, nil))
412+
require.True(t, shouldMarkCreditsExhausted(resp, body, nil))
413+
})
414+
415+
t.Run("Resource has been exhausted (check quota) 完整格式应标记", func(t *testing.T) {
416+
resp := &http.Response{StatusCode: http.StatusTooManyRequests}
417+
body := []byte(`{"error":{"code":429,"message":"Resource has been exhausted (e.g. check quota).","status":"RESOURCE_EXHAUSTED"}}`)
418+
require.True(t, shouldMarkCreditsExhausted(resp, body, nil))
413419
})
414420

415421
t.Run("结构化限流不标记", func(t *testing.T) {

0 commit comments

Comments
 (0)