aiohttp timeout and wrapped google-auth transport exceptions are not retried despite HttpRetryOptions being configured
Maintainers usually reply within 1 day
@Venkaiahbabuneelam is already working on this.
Since Nov 11, 2026.
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 72/100
Research direction
Start in google/genai/_api_client.py at retry_args() and _AIOHTTP_TRANSIENT_EXC, then trace _async_request_once() to understand how authenticated transport exceptions are handled. Reproduce the listed predicates and add coverage for the timeout and wrapped transport cases, while checking that payload and refresh errors remain non-retryable and the no-retry_options path is unchanged.
Written by the indexing model from the issue text.
Description
Describe the bug
When HttpRetryOptions is configured and aiohttp is used as the async HTTP transport (google-genai[aiohttp]), request timeouts and wrapped google.auth.aio transport exceptions bypass retry_args() and fail on the first attempt without retrying.
Specifically:
asyncio.TimeoutError(andaiohttp.ServerTimeoutError/aiohttp.ConnectionTimeoutError):
While_HTTPX_TRANSIENT_EXCincludeshttpx.TimeoutExceptionandhttpx2.TimeoutException(added in #2345 for #2337),_AIOHTTP_TRANSIENT_EXConly lists(aiohttp.ClientConnectorError, aiohttp.ClientOSError, aiohttp.ServerDisconnectedError). Inaiohttp,ClientTimeout(total=...)(TimerContext.__exit__) raisesasyncio.TimeoutErrordirectly, andaiohttp.ServerTimeoutError/ConnectionTimeoutErrorinherit from(aiohttp.ClientConnectionError, asyncio.TimeoutError), notClientConnectorError,ClientOSError, orServerDisconnectedError.google.auth.exceptions.TimeoutError(auth_exceptions.TimeoutError):
When Vertex AI mTLS is used (_use_google_auth_async() == True),_get_aiohttp_session()returnsgoogle.auth.aio.transport.sessions.AsyncAuthorizedSession. Bothgoogle.auth.aio.transport.aiohttp.Request.__call__andgoogle.auth.aio.transport.sessions.timeout_guardcatchasyncio.TimeoutErrorand raisegoogle.auth.exceptions.TimeoutError(which inherits fromGoogleAuthError, notbuiltins.TimeoutErrororaiohttp.ClientError).google.auth.exceptions.TransportErrorwrapping_AIOHTTP_TRANSIENT_EXC:
UnderAsyncAuthorizedSession,google.auth.aio.transport.aiohttp.Request.__call__catchesaiohttp.ClientErrorand raisesgoogle.auth.exceptions.TransportError(...) from caught_exc. In_async_request_once(), theexcept (..., auth_exceptions.TransportError)block re-raises whenretry_optionsis configured (raise # HttpRetryOptions owns retries; tenacity decides.), butretry_args()does not matchauth_exceptions.TransportErrorwrapping_AIOHTTP_TRANSIENT_EXC.
Steps to reproduce
import asyncio
from google.auth import exceptions as auth_exceptions
from google.genai import _api_client as api_client
from google.genai import types
import aiohttp
retry = api_client.retry_args(types.HttpRetryOptions())['retry']
print("asyncio.TimeoutError retried:", retry.predicate(asyncio.TimeoutError()))
print("aiohttp.ServerTimeoutError retried:", retry.predicate(aiohttp.ServerTimeoutError()))
print("google.auth.exceptions.TimeoutError retried:", retry.predicate(auth_exceptions.TimeoutError("Request timed out")))
Output on main:
asyncio.TimeoutError retried: False
aiohttp.ServerTimeoutError retried: False
google.auth.exceptions.TimeoutError retried: False
Expected behavior
When HttpRetryOptions is configured, retry_args() should retry asyncio.TimeoutError (including aiohttp.ServerTimeoutError and aiohttp.ConnectionTimeoutError), google.auth.exceptions.TimeoutError, and google.auth.exceptions.TransportError whose __cause__ is in _AIOHTTP_TRANSIENT_EXC, matching the httpx.TimeoutException behavior from #2337 / #2345 while keeping non-transient errors (such as aiohttp.ClientPayloadError and google.auth.exceptions.RefreshError) and the no-retry_options path unchanged.
- Dominant language
- Python
- Stars
- 4.1k
- Forks
- 1.1k
- Avg merge
- 1d 20h
- Merged PRs (30d)
- 90
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from googleapis/python-genai
-
Interactions retries ignore the documented `initial_delay` and `max_delay` defaultsPossibly taken @Venkaiahbabuneelam claimed this 4 days ago. Openpriority: p2 status:awaiting user response type: bug
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
googleapis/python-genai#3317 · 1 comment · 1 assignee ·
Maintainers usually reply within 1 day
-
Test import module that doesn't existPossibly taken @Venkaiahbabuneelam claimed this 30 days ago. Openpriority: p2 type: bug
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
googleapis/python-genai#3122 · 6 comments · 1 assignee ·
Maintainers usually reply within 1 day
-
Curated history keeps half a user turn when the model turn is invalidPossibly taken @Venkaiahbabuneelam claimed this 39 days ago. Openpriority: p2 type: bug
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
googleapis/python-genai#3051 · 3 comments · 1 assignee ·
Maintainers usually reply within 1 day
-
[Bug]: Unsubscripted typing.List and typing.Dict crash convert_if_exist_pydantic_model in AFCPossibly taken @Venkaiahbabuneelam claimed this 39 days ago. Openpriority: p2 type: bug
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
googleapis/python-genai#3044 · 1 comment · 1 assignee ·
Maintainers usually reply within 1 day
-
Structured-output continuation merge raises AttributeError: __pydantic_generic_metadata__ when a hop has parsed JSONPossibly taken @Venkaiahbabuneelam claimed this 2 days ago. Openpriority: p2 type: bug
googleapis/python-genai#3350 · 1 comment · 1 assignee ·
Maintainers usually reply within 1 day
All issues in googleapis/python-genai
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
dbt-labs/spark-utils#51 ·
-
bug pydanty:is-working
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
pydantic/pydantic-ai#13444 ·
Maintainers usually reply within 1 day
-
good first issue help wanted
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
-
good first issue help wanted
Difficulty 1/5 Under an hour Newbie friendliness 72/100
-
changelog investigate
Difficulty 1/5 Under an hour Newbie friendliness 68/100
ramnes/notion-sdk-py#502 ·