From 1fddf90b75467be46bba5e2c1e95d1b54b450c4e Mon Sep 17 00:00:00 2001 From: Anmol Jaiswal Date: Tue, 10 Feb 2026 19:37:56 +0530 Subject: [PATCH 1/2] fix(sessions): use async iteration for VertexAiSessionService.list_sessions pagination The sessions_iterator returned by api_client.agent_engines.sessions.list() is an AsyncPager that only fetches additional pages when consumed via async iteration (__aiter__/__anext__). Using a synchronous `for` loop only retrieved the first page (~100 sessions), silently dropping all subsequent pages. Changed `for` to `async for` to enable proper async pagination, allowing all sessions to be returned regardless of count. Fixes #4302 --- .../adk/sessions/vertex_ai_session_service.py | 2 +- .../test_vertex_ai_session_service.py | 23 ++++++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/google/adk/sessions/vertex_ai_session_service.py b/src/google/adk/sessions/vertex_ai_session_service.py index f5cafee467..1837a907eb 100644 --- a/src/google/adk/sessions/vertex_ai_session_service.py +++ b/src/google/adk/sessions/vertex_ai_session_service.py @@ -215,7 +215,7 @@ async def list_sessions( config=config, ) - for api_session in sessions_iterator: + async for api_session in sessions_iterator: sessions.append( Session( app_name=app_name, diff --git a/tests/unittests/sessions/test_vertex_ai_session_service.py b/tests/unittests/sessions/test_vertex_ai_session_service.py index 12a11a93a2..fdc903c3df 100644 --- a/tests/unittests/sessions/test_vertex_ai_session_service.py +++ b/tests/unittests/sessions/test_vertex_ai_session_service.py @@ -264,6 +264,17 @@ async def to_async_iterator(data): yield item +class AsyncIterableList(list): + """A list that also supports async iteration, mimicking AsyncPager behavior.""" + + def __aiter__(self): + return self._async_iter() + + async def _async_iter(self): + for item in self: + yield item + + class MockAsyncClient: """Mocks the API Client.""" @@ -300,20 +311,20 @@ async def _list_sessions(self, name: str, config: dict[str, Any]): if user_id_match: user_id = user_id_match.group(1) if user_id == 'user_with_pages': - return [ + return AsyncIterableList([ _convert_to_object(MOCK_SESSION_JSON_PAGE1), _convert_to_object(MOCK_SESSION_JSON_PAGE2), - ] - return [ + ]) + return AsyncIterableList([ _convert_to_object(session) for session in self.session_dict.values() if session['user_id'] == user_id - ] + ]) # No user filter, return all sessions - return [ + return AsyncIterableList([ _convert_to_object(session) for session in self.session_dict.values() - ] + ]) async def _delete_session(self, name: str): session_id = name.split('/')[-1] From 14c71b607ecbf2215f4b9ba6eb4b0ff6b9eaf740 Mon Sep 17 00:00:00 2001 From: Liang Wu <18244712+wuliang229@users.noreply.github.com> Date: Tue, 10 Feb 2026 16:16:27 -0800 Subject: [PATCH 2/2] Apply suggestions from code review Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- tests/unittests/sessions/test_vertex_ai_session_service.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/unittests/sessions/test_vertex_ai_session_service.py b/tests/unittests/sessions/test_vertex_ai_session_service.py index fdc903c3df..dc6ef08b4a 100644 --- a/tests/unittests/sessions/test_vertex_ai_session_service.py +++ b/tests/unittests/sessions/test_vertex_ai_session_service.py @@ -267,10 +267,7 @@ async def to_async_iterator(data): class AsyncIterableList(list): """A list that also supports async iteration, mimicking AsyncPager behavior.""" - def __aiter__(self): - return self._async_iter() - - async def _async_iter(self): + async def __aiter__(self): for item in self: yield item