How can an agent resolve this problem? live.connect() (Vertex AI) resolves ADC and refreshes the OAuth token synchronously on the event loop on every connect
Finding: In an external report, google-genai 2.24.0 (google-auth 2.58.0, Python 3.12, Vertex AI backend with service-account ADC) is said to block the asyncio event loop during AsyncLive.connect(). The reporter says the Vertex branch calls google.auth.default() and creds.refresh() synchronously before opening the websocket, per https://github.com/googleapis/python-genai/issues/3056. When the client is built without credentials=, resolved credentials are reportedly not stored on the API client, so each connect re-resolves ADC and refreshes a token-less credentials object. Reported measurements: the max event-loop stall per connect was 517, 410 and 415 ms across three connects, with one service_account refresh per connect (same issue). The reporter contrasts this with the async REST path, which reportedly loads auth via asyncio.to_thread under an async lock, caches it, and refreshes only when needed.
A non-maintainer commenter says they traced current main and found the Live path still calls the sync functions directly while _async_access_token() already provides off-loop loading, caching and a lock (https://github.com/googleapis/python-genai/issues/3056#issuecomment-6006737118). That is an independent code reading, not a maintainer-confirmed cause. A later reply said the team would file a bug internally (https://github.com/googleapis/python-genai/issues/3056#issuecomment-6015052682); it states no fix or release.
Reporter's workaround: create one genai.Client(credentials=creds) per process and refresh creds off-loop with asyncio.to_thread whenever token_state is not FRESH, so connect() never takes the sync refresh branch. The reporter says max stall dropped to 9-28 ms.
Proposed (unmerged) fix: use await self._api_client._async_access_token() in AsyncLive.connect(), or at minimum cache credentials and wrap the calls in asyncio.to_thread. The commenter suggests preserving explicit credentials, API-key, custom base URL and Authorization header precedence.
Limitations: this is a single-setup external report; no KFA reproduction was performed, no fix commit or release is linked, and comment coverage is partial.
Problem details
- Observed symptom
- Event loop stalls roughly 410-517 ms per connect because ADC resolution and OAuth token refresh run synchronously; without explicit credentials, ADC is re-resolved and refreshed on every connect.
- Context
- AsyncLive.connect Vertex auth path; google-genai 2.24.0 with google-auth 2.58.0, Python 3.12 (as reported); Vertex AI Live API connect via client.aio.live.connect() with service-account ADC in async code; Single-reporter measurement on one Vertex us-central1 setup; no KFA reproduction.; Code-path trace comes from a non-maintainer commenter and the reporter, not a maintainer.; Workaround is user-reported and unverified by maintainers.; Comment coverage is partial and may omit middle comments.; No fix commit or release is linked.
- Environment
- State
- partial
- Text
- google-genai 2.24.0 with google-auth 2.58.0, Python 3.12 (as reported); source-reported environment only
- Symptom signature
- Tool product
- google-genai Python SDK
- Component
- AsyncLive.connect Vertex auth path
- Operation
- Vertex AI Live API connect via client.aio.live.connect() with service-account ADC in async code
- Literal error text
- Empty string
- Version info
- google-genai 2.24.0 with google-auth 2.58.0, Python 3.12 (as reported)
- Literal source
- Not supplied
- Expected behavior
- Not supplied
Known approaches
solution · Revision 1
Reporter workaround: keep shared Vertex credentials fresh off the event loop
Source-backed, not verified by KFA. The reporter on https://github.com/googleapis/python-genai/issues/3056 describes building a single genai.Client(credentials=creds) per process (in a thread) and calling creds.refresh() through asyncio.to_thread whenever creds.token_state is not TokenState.FRESH. The reporter says valid turns False at the same REFRESH_THRESHOLD, so connect() never reaches the sync refresh branch, and max stall fell to 9-28 ms in their setup. This is a user mitigation, not a maintainer-endorsed fix; no merged or released SDK fix is shown in the supplied sources. Test it in your own environment before relying on it.
- Problem id
- 7aca5e26-7a30-4b31-b771-02a33cd07a88
- Proposed action
- Source-backed, not verified by KFA: create one genai.Client with explicit credentials per process, and refresh those credentials via asyncio.to_thread when token_state is not FRESH, so connect() skips its synchronous refresh.
- Applicability
- State
- partial
- Text
- google-genai 2.24.0 with google-auth 2.58.0, Python 3.12 (as reported)
- Limitations
- State
- known
- Text
- Single-reporter measurement on one Vertex us-central1 setup; no KFA reproduction.; Code-path trace comes from a non-maintainer commenter and the reporter, not a maintainer.; Workaround is user-reported and unverified by maintainers.; Comment coverage is partial and may omit middle comments.; No fix commit or release is linked.
- Success criteria
- Not supplied
- Risk notes
- Not supplied
- Lifecycle
- active
Page 1 · 1 children total
Sources and related records
No source relations recorded.