From d4da138cf5f5236aa23aa49d57642f41f8dcb39c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=B9=8F?= <2829624376@qq.com> Date: Wed, 15 Jul 2026 02:51:56 +0800 Subject: [PATCH] fix(openai): preserve reset count on malformed details --- .../internal/service/openai_quota_reset_credits.go | 2 +- .../service/openai_quota_reset_credits_test.go | 13 +++++++++++++ backend/internal/service/openai_quota_service.go | 4 +++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/backend/internal/service/openai_quota_reset_credits.go b/backend/internal/service/openai_quota_reset_credits.go index 75756976db..9ff7e70f16 100644 --- a/backend/internal/service/openai_quota_reset_credits.go +++ b/backend/internal/service/openai_quota_reset_credits.go @@ -59,7 +59,7 @@ func parseOpenAIRateLimitResetCreditDetails(body []byte) (openAIRateLimitResetCr payload.Data, ) if err != nil { - return openAIRateLimitResetCreditDetails{}, err + return openAIRateLimitResetCreditDetails{AvailableCount: availableCount}, err } } diff --git a/backend/internal/service/openai_quota_reset_credits_test.go b/backend/internal/service/openai_quota_reset_credits_test.go index 5d994602e1..34f87f9a2f 100644 --- a/backend/internal/service/openai_quota_reset_credits_test.go +++ b/backend/internal/service/openai_quota_reset_credits_test.go @@ -82,6 +82,19 @@ func TestQueryUsageResetCreditCountPrecedence(t *testing.T) { wantCount: 5, wantCredits: 1, }, + { + name: "valid detail count survives malformed authoritative list", + usageBody: `{"rate_limit_reset_credits":{"available_count":7,"credits":[{"expires_at":"usage-expiry"}]}}`, + detailBody: `{"available_count":2,"credits":"malformed"}`, + wantCount: 2, + wantCredits: 1, + }, + { + name: "valid detail count creates quota despite malformed authoritative list", + usageBody: `{}`, + detailBody: `{"available_count":2,"credits":"malformed"}`, + wantCount: 2, + }, { name: "negative detail count without list preserves usage", usageBody: `{"rate_limit_reset_credits":{"available_count":4}}`, diff --git a/backend/internal/service/openai_quota_service.go b/backend/internal/service/openai_quota_service.go index 91b511122e..b3a1180988 100644 --- a/backend/internal/service/openai_quota_service.go +++ b/backend/internal/service/openai_quota_service.go @@ -205,7 +205,9 @@ func (s *OpenAIQuotaService) queryResetCreditDetails(ctx context.Context, client details, err := parseOpenAIRateLimitResetCreditDetails(resp.Bytes()) if err != nil { slog.Warn("openai_quota_reset_credit_details_parse_failed", "account_id", accountID, "error", err) - return nil + if details.AvailableCount == nil { + return nil + } } if details.AvailableCount == nil && !details.CreditListPresent { return nil