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 63ce173639..a94d5fe3f8 100644 --- a/backend/internal/service/openai_quota_service.go +++ b/backend/internal/service/openai_quota_service.go @@ -230,7 +230,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