From 07bd89399dedbb92be587f08fdbb05c2bf62efc9 Mon Sep 17 00:00:00 2001 From: Gaurav <39389231+gsquared94@users.noreply.github.com> Date: Thu, 22 Jan 2026 17:33:32 -0800 Subject: [PATCH] fix: remove obsolete CloudCode PerDay quota and 120s terminal threshold (#17236) --- .../core/src/utils/googleQuotaErrors.test.ts | 27 ++----------- packages/core/src/utils/googleQuotaErrors.ts | 39 +++++-------------- 2 files changed, 14 insertions(+), 52 deletions(-) diff --git a/packages/core/src/utils/googleQuotaErrors.test.ts b/packages/core/src/utils/googleQuotaErrors.test.ts index e126589d63..c75eb8de4f 100644 --- a/packages/core/src/utils/googleQuotaErrors.test.ts +++ b/packages/core/src/utils/googleQuotaErrors.test.ts @@ -102,40 +102,21 @@ describe('classifyGoogleError', () => { expect((result as TerminalQuotaError).cause).toBe(apiError); }); - it('should return TerminalQuotaError for daily quota violations in ErrorInfo', () => { - const apiError: GoogleApiError = { - code: 429, - message: 'Quota exceeded', - details: [ - { - '@type': 'type.googleapis.com/google.rpc.ErrorInfo', - reason: 'QUOTA_EXCEEDED', - domain: 'googleapis.com', - metadata: { - quota_limit: 'RequestsPerDay_PerProject_PerUser', - }, - }, - ], - }; - vi.spyOn(errorParser, 'parseGoogleApiError').mockReturnValue(apiError); - const result = classifyGoogleError(new Error()); - expect(result).toBeInstanceOf(TerminalQuotaError); - }); - - it('should return TerminalQuotaError for long retry delays', () => { + it('should return RetryableQuotaError for long retry delays', () => { const apiError: GoogleApiError = { code: 429, message: 'Too many requests', details: [ { '@type': 'type.googleapis.com/google.rpc.RetryInfo', - retryDelay: '301s', // > 5 minutes + retryDelay: '301s', // Any delay is now retryable }, ], }; vi.spyOn(errorParser, 'parseGoogleApiError').mockReturnValue(apiError); const result = classifyGoogleError(new Error()); - expect(result).toBeInstanceOf(TerminalQuotaError); + expect(result).toBeInstanceOf(RetryableQuotaError); + expect((result as RetryableQuotaError).retryDelayMs).toBe(301000); }); it('should return RetryableQuotaError for short retry delays', () => { diff --git a/packages/core/src/utils/googleQuotaErrors.ts b/packages/core/src/utils/googleQuotaErrors.ts index dfd828f41f..f3a909a20a 100644 --- a/packages/core/src/utils/googleQuotaErrors.ts +++ b/packages/core/src/utils/googleQuotaErrors.ts @@ -174,9 +174,9 @@ function classifyValidationRequiredError( * - 403 errors with `VALIDATION_REQUIRED` from cloudcode-pa domains are classified * as `ValidationRequiredError`. * - 429 errors are classified as either `TerminalQuotaError` or `RetryableQuotaError`: - * - If the error indicates a daily limit, it's a `TerminalQuotaError`. - * - If the error suggests a retry delay of more than 2 minutes, it's a `TerminalQuotaError`. - * - If the error suggests a retry delay of 2 minutes or less, it's a `RetryableQuotaError`. + * - CloudCode API: `RATE_LIMIT_EXCEEDED` → `RetryableQuotaError`, `QUOTA_EXHAUSTED` → `TerminalQuotaError`. + * - If the error indicates a daily limit (in QuotaFailure), it's a `TerminalQuotaError`. + * - If the error has a retry delay, it's a `RetryableQuotaError`. * - If the error indicates a per-minute limit, it's a `RetryableQuotaError`. * - If the error message contains the phrase "Please retry in X[s|ms]", it's a `RetryableQuotaError`. * @@ -302,34 +302,15 @@ export function classifyGoogleError(error: unknown): unknown { } } } - - // Existing Cloud Code API quota handling - const quotaLimit = errorInfo.metadata?.['quota_limit'] ?? ''; - if (quotaLimit.includes('PerDay') || quotaLimit.includes('Daily')) { - return new TerminalQuotaError( - `You have exhausted your daily quota on this model.`, - googleApiError, - ); - } } - // 2. Check for long delays in RetryInfo - if (retryInfo?.retryDelay) { - if (delaySeconds) { - if (delaySeconds > 120) { - return new TerminalQuotaError( - `${googleApiError.message}\nSuggested retry after ${retryInfo.retryDelay}.`, - googleApiError, - delaySeconds, - ); - } - // This is a retryable error with a specific delay. - return new RetryableQuotaError( - `${googleApiError.message}\nSuggested retry after ${retryInfo.retryDelay}.`, - googleApiError, - delaySeconds, - ); - } + // 2. Check for delays in RetryInfo + if (retryInfo?.retryDelay && delaySeconds) { + return new RetryableQuotaError( + `${googleApiError.message}\nSuggested retry after ${retryInfo.retryDelay}.`, + googleApiError, + delaySeconds, + ); } // 3. Check for short-term limits in QuotaFailure or ErrorInfo