diff --git a/google/genai/_api_client.py b/google/genai/_api_client.py index 3b98a3451..751211e51 100644 --- a/google/genai/_api_client.py +++ b/google/genai/_api_client.py @@ -486,7 +486,8 @@ def retry_args(options: Optional[HttpRetryOptions]) -> _common.StringDict: """ if options is None: return {'stop': tenacity.stop_after_attempt(1), 'reraise': True} - + if options.attempts == 0: + options.attempts = 1 stop = tenacity.stop_after_attempt(options.attempts or _RETRY_ATTEMPTS) retriable_codes = options.http_status_codes or _RETRY_HTTP_STATUS_CODES retry = tenacity.retry_if_exception( diff --git a/google/genai/tests/client/test_retries.py b/google/genai/tests/client/test_retries.py index c01c9091c..125354771 100644 --- a/google/genai/tests/client/test_retries.py +++ b/google/genai/tests/client/test_retries.py @@ -342,6 +342,33 @@ def test_retries_failed_request_retries_unsuccessfully(): mock_transport.handle_request.assert_called() +def test_retries_failed_request_no_retries_unsuccessfully(): + mock_transport = mock.Mock(spec=httpx.BaseTransport) + mock_transport.handle_request.side_effect = ( + _httpx_response(429), + ) + + client = api_client.BaseApiClient( + vertexai=True, + project='test_project', + location='global', + http_options=_transport_options( + http_options=types.HttpOptions( + retry_options=types.HttpRetryOptions(attempts=0) + ), + transport=mock_transport, + ), + ) + + with _patch_auth_default(): + try: + client.request(http_method='GET', path='path', request_dict={}) + assert False, 'Expected APIError to be raised.' + except errors.APIError as e: + assert e.code == 429 + mock_transport.handle_request.assert_called() + + def test_retries_failed_request_retries_unsuccessfully_at_request_level(): mock_transport = mock.Mock(spec=httpx.BaseTransport) mock_transport.handle_request.side_effect = (