mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-04-14 07:10:34 -07:00
fix: remove obsolete CloudCode PerDay quota and 120s terminal threshold (#17236)
This commit is contained in:
@@ -102,40 +102,21 @@ describe('classifyGoogleError', () => {
|
|||||||
expect((result as TerminalQuotaError).cause).toBe(apiError);
|
expect((result as TerminalQuotaError).cause).toBe(apiError);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return TerminalQuotaError for daily quota violations in ErrorInfo', () => {
|
it('should return RetryableQuotaError for long retry delays', () => {
|
||||||
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', () => {
|
|
||||||
const apiError: GoogleApiError = {
|
const apiError: GoogleApiError = {
|
||||||
code: 429,
|
code: 429,
|
||||||
message: 'Too many requests',
|
message: 'Too many requests',
|
||||||
details: [
|
details: [
|
||||||
{
|
{
|
||||||
'@type': 'type.googleapis.com/google.rpc.RetryInfo',
|
'@type': 'type.googleapis.com/google.rpc.RetryInfo',
|
||||||
retryDelay: '301s', // > 5 minutes
|
retryDelay: '301s', // Any delay is now retryable
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
vi.spyOn(errorParser, 'parseGoogleApiError').mockReturnValue(apiError);
|
vi.spyOn(errorParser, 'parseGoogleApiError').mockReturnValue(apiError);
|
||||||
const result = classifyGoogleError(new Error());
|
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', () => {
|
it('should return RetryableQuotaError for short retry delays', () => {
|
||||||
|
|||||||
@@ -174,9 +174,9 @@ function classifyValidationRequiredError(
|
|||||||
* - 403 errors with `VALIDATION_REQUIRED` from cloudcode-pa domains are classified
|
* - 403 errors with `VALIDATION_REQUIRED` from cloudcode-pa domains are classified
|
||||||
* as `ValidationRequiredError`.
|
* as `ValidationRequiredError`.
|
||||||
* - 429 errors are classified as either `TerminalQuotaError` or `RetryableQuotaError`:
|
* - 429 errors are classified as either `TerminalQuotaError` or `RetryableQuotaError`:
|
||||||
* - If the error indicates a daily limit, it's a `TerminalQuotaError`.
|
* - CloudCode API: `RATE_LIMIT_EXCEEDED` → `RetryableQuotaError`, `QUOTA_EXHAUSTED` → `TerminalQuotaError`.
|
||||||
* - If the error suggests a retry delay of more than 2 minutes, it's a `TerminalQuotaError`.
|
* - If the error indicates a daily limit (in QuotaFailure), it's a `TerminalQuotaError`.
|
||||||
* - If the error suggests a retry delay of 2 minutes or less, it's a `RetryableQuotaError`.
|
* - 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 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`.
|
* - 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
|
// 2. Check for delays in RetryInfo
|
||||||
if (retryInfo?.retryDelay) {
|
if (retryInfo?.retryDelay && delaySeconds) {
|
||||||
if (delaySeconds) {
|
return new RetryableQuotaError(
|
||||||
if (delaySeconds > 120) {
|
`${googleApiError.message}\nSuggested retry after ${retryInfo.retryDelay}.`,
|
||||||
return new TerminalQuotaError(
|
googleApiError,
|
||||||
`${googleApiError.message}\nSuggested retry after ${retryInfo.retryDelay}.`,
|
delaySeconds,
|
||||||
googleApiError,
|
);
|
||||||
delaySeconds,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// This is a retryable error with a specific delay.
|
|
||||||
return new RetryableQuotaError(
|
|
||||||
`${googleApiError.message}\nSuggested retry after ${retryInfo.retryDelay}.`,
|
|
||||||
googleApiError,
|
|
||||||
delaySeconds,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. Check for short-term limits in QuotaFailure or ErrorInfo
|
// 3. Check for short-term limits in QuotaFailure or ErrorInfo
|
||||||
|
|||||||
Reference in New Issue
Block a user