From 8b6af5d581130dd4d883623677d0e6d56e66ba6a Mon Sep 17 00:00:00 2001 From: Luyang Wang Date: Fri, 9 Jan 2026 13:46:55 -0500 Subject: [PATCH 01/11] move session creation to runner level --- src/google/adk/runners.py | 5 +++-- src/google/adk/sessions/database_session_service.py | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/google/adk/runners.py b/src/google/adk/runners.py index 730216e0b0..d352b2f353 100644 --- a/src/google/adk/runners.py +++ b/src/google/adk/runners.py @@ -454,8 +454,9 @@ async def _run_with_trace( app_name=self.app_name, user_id=user_id, session_id=session_id ) if not session: - message = self._format_session_not_found_message(session_id) - raise ValueError(message) + session = await self.session_service.create_session( + app_name=self.app_name, user_id=user_id, session_id=session_id + ) if not invocation_id and not new_message: raise ValueError( 'Running an agent requires either a new_message or an ' diff --git a/src/google/adk/sessions/database_session_service.py b/src/google/adk/sessions/database_session_service.py index 863bbfa861..8b7bda6d2a 100644 --- a/src/google/adk/sessions/database_session_service.py +++ b/src/google/adk/sessions/database_session_service.py @@ -436,8 +436,8 @@ async def append_event(self, session: Session, event: Event) -> Event: if storage_session.update_timestamp_tz > session.last_update_time: raise ValueError( "The last_update_time provided in the session object" - f" {datetime.fromtimestamp(session.last_update_time):'%Y-%m-%d %H:%M:%S'} is" - " earlier than the update_time in the storage_session" + f" {datetime.fromtimestamp(session.last_update_time):'%Y-%m-%d %H:%M:%S'}" + " is earlier than the update_time in the storage_session" f" {datetime.fromtimestamp(storage_session.update_timestamp_tz):'%Y-%m-%d %H:%M:%S'}." " Please check if it is a stale session." ) From ce2c649e1e2f5cd0dc821034082c20497203a603 Mon Sep 17 00:00:00 2001 From: Luyang Wang Date: Fri, 9 Jan 2026 14:02:17 -0500 Subject: [PATCH 02/11] removed old test case --- tests/unittests/test_runners.py | 37 --------------------------------- 1 file changed, 37 deletions(-) diff --git a/tests/unittests/test_runners.py b/tests/unittests/test_runners.py index c347a78931..359607d78b 100644 --- a/tests/unittests/test_runners.py +++ b/tests/unittests/test_runners.py @@ -200,43 +200,6 @@ def setup_method(self): ) -@pytest.mark.asyncio -async def test_session_not_found_message_includes_alignment_hint(): - - class RunnerWithMismatch(Runner): - - def _infer_agent_origin( - self, agent: BaseAgent - ) -> tuple[Optional[str], Optional[Path]]: - del agent - return "expected_app", Path("/workspace/agents/expected_app") - - session_service = InMemorySessionService() - runner = RunnerWithMismatch( - app_name="configured_app", - agent=MockLlmAgent("root_agent"), - session_service=session_service, - artifact_service=InMemoryArtifactService(), - ) - - agen = runner.run_async( - user_id="user", - session_id="missing", - new_message=types.Content(role="user", parts=[]), - ) - - with pytest.raises(ValueError) as excinfo: - await agen.__anext__() - - await agen.aclose() - - message = str(excinfo.value) - assert "Session not found" in message - assert "configured_app" in message - assert "expected_app" in message - assert "Ensure the runner app_name matches" in message - - @pytest.mark.asyncio async def test_runner_allows_nested_agent_directories(tmp_path, monkeypatch): project_root = tmp_path / "workspace" From 058922c3abf5ccbac33744d7caff97e170917f87 Mon Sep 17 00:00:00 2001 From: Luyang Wang Date: Fri, 9 Jan 2026 14:13:18 -0500 Subject: [PATCH 03/11] update to all references --- src/google/adk/runners.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/google/adk/runners.py b/src/google/adk/runners.py index d352b2f353..23ad5812f4 100644 --- a/src/google/adk/runners.py +++ b/src/google/adk/runners.py @@ -534,8 +534,9 @@ async def rewind_async( app_name=self.app_name, user_id=user_id, session_id=session_id ) if not session: - raise ValueError(f'Session not found: {session_id}') - + session = await self.session_service.create_session( + app_name=self.app_name, user_id=user_id, session_id=session_id + ) rewind_event_index = -1 for i, event in enumerate(session.events): if event.invocation_id == rewind_before_invocation_id: @@ -967,9 +968,8 @@ async def run_live( app_name=self.app_name, user_id=user_id, session_id=session_id ) if not session: - raise ValueError( - f'Session not found for user id: {user_id} and session id:' - f' {session_id}' + session = await self.session_service.create_session( + app_name=self.app_name, user_id=user_id, session_id=session_id ) invocation_context = self._new_invocation_context_for_live( session, From 5f465c1f530e8e2159a82a4041567a2b91ec7d34 Mon Sep 17 00:00:00 2001 From: Luyang Wang Date: Fri, 9 Jan 2026 14:14:48 -0500 Subject: [PATCH 04/11] update pyink --- src/google/adk/runners.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/google/adk/runners.py b/src/google/adk/runners.py index 23ad5812f4..8751455267 100644 --- a/src/google/adk/runners.py +++ b/src/google/adk/runners.py @@ -534,9 +534,9 @@ async def rewind_async( app_name=self.app_name, user_id=user_id, session_id=session_id ) if not session: - session = await self.session_service.create_session( - app_name=self.app_name, user_id=user_id, session_id=session_id - ) + session = await self.session_service.create_session( + app_name=self.app_name, user_id=user_id, session_id=session_id + ) rewind_event_index = -1 for i, event in enumerate(session.events): if event.invocation_id == rewind_before_invocation_id: From 571bee587e4b30c1a59354af2aba24d345a7e5b5 Mon Sep 17 00:00:00 2001 From: Luyang Wang Date: Fri, 9 Jan 2026 22:32:02 -0500 Subject: [PATCH 05/11] added test case --- tests/unittests/test_runners.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/unittests/test_runners.py b/tests/unittests/test_runners.py index 359607d78b..01ff06e245 100644 --- a/tests/unittests/test_runners.py +++ b/tests/unittests/test_runners.py @@ -200,6 +200,39 @@ def setup_method(self): ) +@pytest.mark.asyncio +async def test_session_auto_creation(): + + class RunnerWithMismatch(Runner): + + def _infer_agent_origin( + self, agent: BaseAgent + ) -> tuple[Optional[str], Optional[Path]]: + del agent + return "expected_app", Path("/workspace/agents/expected_app") + + session_service = InMemorySessionService() + runner = RunnerWithMismatch( + app_name="expected_app", + agent=MockLlmAgent("test_agent"), + session_service=session_service, + artifact_service=InMemoryArtifactService(), + ) + + agen = runner.run_async( + user_id="user", + session_id="missing", + new_message=types.Content(role="user", parts=[types.Part(text="hi")]), + ) + + event = await agen.__anext__() + await agen.aclose() + + # Verify that session_id="missing" doesn't error out - session is auto-created + assert event.author == "test_agent" + assert event.content.parts[0].text == "Test LLM response" + + @pytest.mark.asyncio async def test_runner_allows_nested_agent_directories(tmp_path, monkeypatch): project_root = tmp_path / "workspace" From ef90f125efacdb171bdb64d28e4089b3f9c9b06e Mon Sep 17 00:00:00 2001 From: Luyang Wang Date: Sat, 10 Jan 2026 20:11:06 -0500 Subject: [PATCH 06/11] add auto_create_session flag and default to false --- src/google/adk/runners.py | 45 ++++++++++++++++++++++++--------- tests/unittests/test_runners.py | 38 ++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 12 deletions(-) diff --git a/src/google/adk/runners.py b/src/google/adk/runners.py index 4e88caf609..6d6e992771 100644 --- a/src/google/adk/runners.py +++ b/src/google/adk/runners.py @@ -149,6 +149,7 @@ def __init__( memory_service: Optional[BaseMemoryService] = None, credential_service: Optional[BaseCredentialService] = None, plugin_close_timeout: float = 5.0, + auto_create_session: bool = False, ): """Initializes the Runner. @@ -175,6 +176,9 @@ def __init__( memory_service: The memory service for the runner. credential_service: The credential service for the runner. plugin_close_timeout: The timeout in seconds for plugin close methods. + auto_create_session: Whether to automatically create a session when + not found. Defaults to False. If False, a missing session raises + ValueError with a helpful message. Raises: ValueError: If `app` is provided along with `agent` or `plugins`, or if @@ -195,6 +199,7 @@ def __init__( self.plugin_manager = PluginManager( plugins=plugins, close_timeout=plugin_close_timeout ) + self.auto_create_session = auto_create_session ( self._agent_origin_app_name, self._agent_origin_dir, @@ -459,9 +464,13 @@ async def _run_with_trace( app_name=self.app_name, user_id=user_id, session_id=session_id ) if not session: - session = await self.session_service.create_session( - app_name=self.app_name, user_id=user_id, session_id=session_id - ) + if self.auto_create_session: + session = await self.session_service.create_session( + app_name=self.app_name, user_id=user_id, session_id=session_id + ) + else: + message = self._format_session_not_found_message(session_id) + raise ValueError(message) if not invocation_id and not new_message: raise ValueError( 'Running an agent requires either a new_message or an ' @@ -539,9 +548,13 @@ async def rewind_async( app_name=self.app_name, user_id=user_id, session_id=session_id ) if not session: - session = await self.session_service.create_session( - app_name=self.app_name, user_id=user_id, session_id=session_id - ) + if self.auto_create_session: + session = await self.session_service.create_session( + app_name=self.app_name, user_id=user_id, session_id=session_id + ) + else: + message = self._format_session_not_found_message(session_id) + raise ValueError(message) rewind_event_index = -1 for i, event in enumerate(session.events): if event.invocation_id == rewind_before_invocation_id: @@ -973,9 +986,13 @@ async def run_live( app_name=self.app_name, user_id=user_id, session_id=session_id ) if not session: - session = await self.session_service.create_session( - app_name=self.app_name, user_id=user_id, session_id=session_id - ) + if self.auto_create_session: + session = await self.session_service.create_session( + app_name=self.app_name, user_id=user_id, session_id=session_id + ) + else: + message = self._format_session_not_found_message(session_id) + raise ValueError(message) invocation_context = self._new_invocation_context_for_live( session, live_request_queue=live_request_queue, @@ -1188,9 +1205,13 @@ async def run_debug( app_name=self.app_name, user_id=user_id, session_id=session_id ) if not session: - session = await self.session_service.create_session( - app_name=self.app_name, user_id=user_id, session_id=session_id - ) + if self.auto_create_session: + session = await self.session_service.create_session( + app_name=self.app_name, user_id=user_id, session_id=session_id + ) + else: + message = self._format_session_not_found_message(session_id) + raise ValueError(message) if not quiet: print(f'\n ### Created new session: {session_id}') elif not quiet: diff --git a/tests/unittests/test_runners.py b/tests/unittests/test_runners.py index f70475b307..af85d6d21d 100644 --- a/tests/unittests/test_runners.py +++ b/tests/unittests/test_runners.py @@ -200,6 +200,43 @@ def setup_method(self): ) +@pytest.mark.asyncio +async def test_session_not_found_message_includes_alignment_hint(): + + class RunnerWithMismatch(Runner): + + def _infer_agent_origin( + self, agent: BaseAgent + ) -> tuple[Optional[str], Optional[Path]]: + del agent + return "expected_app", Path("/workspace/agents/expected_app") + + session_service = InMemorySessionService() + runner = RunnerWithMismatch( + app_name="configured_app", + agent=MockLlmAgent("root_agent"), + session_service=session_service, + artifact_service=InMemoryArtifactService(), + ) + + agen = runner.run_async( + user_id="user", + session_id="missing", + new_message=types.Content(role="user", parts=[]), + ) + + with pytest.raises(ValueError) as excinfo: + await agen.__anext__() + + await agen.aclose() + + message = str(excinfo.value) + assert "Session not found" in message + assert "configured_app" in message + assert "expected_app" in message + assert "Ensure the runner app_name matches" in message + + @pytest.mark.asyncio async def test_session_auto_creation(): @@ -217,6 +254,7 @@ def _infer_agent_origin( agent=MockLlmAgent("test_agent"), session_service=session_service, artifact_service=InMemoryArtifactService(), + auto_create_session=True, ) agen = runner.run_async( From 7df6afccd75e5e4c1959c373d3c200426b0547fb Mon Sep 17 00:00:00 2001 From: Luyang Wang Date: Sat, 10 Jan 2026 20:19:44 -0500 Subject: [PATCH 07/11] keep run_debug intact --- src/google/adk/runners.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/google/adk/runners.py b/src/google/adk/runners.py index 6d6e992771..3c39c276d5 100644 --- a/src/google/adk/runners.py +++ b/src/google/adk/runners.py @@ -1205,13 +1205,9 @@ async def run_debug( app_name=self.app_name, user_id=user_id, session_id=session_id ) if not session: - if self.auto_create_session: - session = await self.session_service.create_session( - app_name=self.app_name, user_id=user_id, session_id=session_id - ) - else: - message = self._format_session_not_found_message(session_id) - raise ValueError(message) + session = await self.session_service.create_session( + app_name=self.app_name, user_id=user_id, session_id=session_id + ) if not quiet: print(f'\n ### Created new session: {session_id}') elif not quiet: From 2fef4bcc4f20f2d02b0420db78d4856b00782628 Mon Sep 17 00:00:00 2001 From: Luyang Wang Date: Sat, 10 Jan 2026 21:48:25 -0500 Subject: [PATCH 08/11] update session not found message --- src/google/adk/runners.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/google/adk/runners.py b/src/google/adk/runners.py index 3c39c276d5..c1d9877d0f 100644 --- a/src/google/adk/runners.py +++ b/src/google/adk/runners.py @@ -348,7 +348,9 @@ def _format_session_not_found_message(self, session_id: str) -> str: return message return ( f'{message}. {self._app_name_alignment_hint} ' - 'The mismatch prevents the runner from locating the session.' + 'The mismatch prevents the runner from locating the session. ' + 'To automatically create a session when missing, set ' + 'auto_create_session=True when constructing the runner.' ) def run( From 57db5f1b5ef9b82adb27de960cfb02da35a7416e Mon Sep 17 00:00:00 2001 From: Luyang Wang Date: Sun, 11 Jan 2026 20:11:32 -0500 Subject: [PATCH 09/11] added helper function and test cases --- src/google/adk/runners.py | 97 ++++++++++++++++++++++----------- tests/unittests/test_runners.py | 87 +++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+), 33 deletions(-) diff --git a/src/google/adk/runners.py b/src/google/adk/runners.py index c1d9877d0f..f289b3cab4 100644 --- a/src/google/adk/runners.py +++ b/src/google/adk/runners.py @@ -353,6 +353,51 @@ def _format_session_not_found_message(self, session_id: str) -> str: 'auto_create_session=True when constructing the runner.' ) + async def _get_or_create_session( + self, *, user_id: str, session_id: str + ) -> Session: + """Gets the session or creates it if missing. + + This helper first attempts to retrieve the session. If not found, it + creates a new session with the provided identifiers. + + Args: + user_id: The user ID of the session. + session_id: The session ID of the session. + + Returns: + The existing or newly created `Session`. + """ + session = await self.session_service.get_session( + app_name=self.app_name, user_id=user_id, session_id=session_id + ) + if session: + return session + return await self.session_service.create_session( + app_name=self.app_name, user_id=user_id, session_id=session_id + ) + + async def _get_session(self, *, user_id: str, session_id: str) -> Session: + """Gets a session or raises a helpful error if missing. + + Args: + user_id: The user ID of the session. + session_id: The session ID of the session. + + Returns: + The existing `Session`. + + Raises: + ValueError: If the session cannot be found. + """ + session = await self.session_service.get_session( + app_name=self.app_name, user_id=user_id, session_id=session_id + ) + if not session: + message = self._format_session_not_found_message(session_id) + raise ValueError(message) + return session + def run( self, *, @@ -462,17 +507,14 @@ async def _run_with_trace( invocation_id: Optional[str] = None, ) -> AsyncGenerator[Event, None]: with tracer.start_as_current_span('invocation'): - session = await self.session_service.get_session( - app_name=self.app_name, user_id=user_id, session_id=session_id - ) - if not session: - if self.auto_create_session: - session = await self.session_service.create_session( - app_name=self.app_name, user_id=user_id, session_id=session_id - ) - else: - message = self._format_session_not_found_message(session_id) - raise ValueError(message) + if self.auto_create_session: + session = await self._get_or_create_session( + user_id=user_id, session_id=session_id + ) + else: + session = await self._get_session( + user_id=user_id, session_id=session_id + ) if not invocation_id and not new_message: raise ValueError( 'Running an agent requires either a new_message or an ' @@ -546,17 +588,12 @@ async def rewind_async( rewind_before_invocation_id: str, ) -> None: """Rewinds the session to before the specified invocation.""" - session = await self.session_service.get_session( - app_name=self.app_name, user_id=user_id, session_id=session_id - ) - if not session: - if self.auto_create_session: - session = await self.session_service.create_session( - app_name=self.app_name, user_id=user_id, session_id=session_id - ) - else: - message = self._format_session_not_found_message(session_id) - raise ValueError(message) + if self.auto_create_session: + session = await self._get_or_create_session( + user_id=user_id, session_id=session_id + ) + else: + session = await self._get_session(user_id=user_id, session_id=session_id) rewind_event_index = -1 for i, event in enumerate(session.events): if event.invocation_id == rewind_before_invocation_id: @@ -983,18 +1020,12 @@ async def run_live( DeprecationWarning, stacklevel=2, ) - if not session: - session = await self.session_service.get_session( - app_name=self.app_name, user_id=user_id, session_id=session_id + if self.auto_create_session: + session = await self._get_or_create_session( + user_id=user_id, session_id=session_id ) - if not session: - if self.auto_create_session: - session = await self.session_service.create_session( - app_name=self.app_name, user_id=user_id, session_id=session_id - ) - else: - message = self._format_session_not_found_message(session_id) - raise ValueError(message) + else: + session = await self._get_session(user_id=user_id, session_id=session_id) invocation_context = self._new_invocation_context_for_live( session, live_request_queue=live_request_queue, diff --git a/tests/unittests/test_runners.py b/tests/unittests/test_runners.py index af85d6d21d..bb44ce73d6 100644 --- a/tests/unittests/test_runners.py +++ b/tests/unittests/test_runners.py @@ -68,6 +68,24 @@ async def _run_async_impl( ) +class MockLiveAgent(BaseAgent): + """Mock live agent for unit testing.""" + + def __init__(self, name: str): + super().__init__(name=name, sub_agents=[]) + + async def _run_live_impl( + self, invocation_context: InvocationContext + ) -> AsyncGenerator[Event, None]: + yield Event( + invocation_id=invocation_context.invocation_id, + author=self.name, + content=types.Content( + role="model", parts=[types.Part(text="live hello")] + ), + ) + + class MockLlmAgent(LlmAgent): """Mock LLM agent for unit testing.""" @@ -271,6 +289,75 @@ def _infer_agent_origin( assert event.content.parts[0].text == "Test LLM response" +@pytest.mark.asyncio +async def test_rewind_auto_create_session_on_missing_session(): + """When auto_create_session=True, rewind should create session if missing. + + The newly created session won't contain the target invocation, so + `rewind_async` should raise an Invocation ID not found error (rather than + a session not found error), demonstrating auto-creation occurred. + """ + session_service = InMemorySessionService() + runner = Runner( + app_name="auto_create_app", + agent=MockLlmAgent("agent_for_rewind"), + session_service=session_service, + artifact_service=InMemoryArtifactService(), + auto_create_session=True, + ) + + with pytest.raises(ValueError, match=r"Invocation ID not found: inv_missing"): + await runner.rewind_async( + user_id="user", + session_id="missing", + rewind_before_invocation_id="inv_missing", + ) + + # Verify the session actually exists now due to auto-creation. + session = await session_service.get_session( + app_name="auto_create_app", user_id="user", session_id="missing" + ) + assert session is not None + assert session.app_name == "auto_create_app" + + +@pytest.mark.asyncio +async def test_run_live_auto_create_session(): + """run_live should auto-create session when missing and yield events.""" + session_service = InMemorySessionService() + artifact_service = InMemoryArtifactService() + runner = Runner( + app_name="live_app", + agent=MockLiveAgent("live_agent"), + session_service=session_service, + artifact_service=artifact_service, + auto_create_session=True, + ) + + # An empty LiveRequestQueue is sufficient for our mock agent. + from google.adk.agents.live_request_queue import LiveRequestQueue + + live_queue = LiveRequestQueue() + + agen = runner.run_live( + user_id="user", + session_id="missing", + live_request_queue=live_queue, + ) + + event = await agen.__anext__() + await agen.aclose() + + assert event.author == "live_agent" + assert event.content.parts[0].text == "live hello" + + # Session should have been created automatically. + session = await session_service.get_session( + app_name="live_app", user_id="user", session_id="missing" + ) + assert session is not None + + @pytest.mark.asyncio async def test_runner_allows_nested_agent_directories(tmp_path, monkeypatch): project_root = tmp_path / "workspace" From 555293c79ae299b602aa2dc235c748daae1d8ae6 Mon Sep 17 00:00:00 2001 From: Luyang Wang Date: Mon, 12 Jan 2026 14:04:36 -0500 Subject: [PATCH 10/11] combine helper function --- src/google/adk/runners.py | 61 ++++++++++++--------------------------- 1 file changed, 19 insertions(+), 42 deletions(-) diff --git a/src/google/adk/runners.py b/src/google/adk/runners.py index f289b3cab4..97eb85dfdc 100644 --- a/src/google/adk/runners.py +++ b/src/google/adk/runners.py @@ -356,10 +356,11 @@ def _format_session_not_found_message(self, session_id: str) -> str: async def _get_or_create_session( self, *, user_id: str, session_id: str ) -> Session: - """Gets the session or creates it if missing. + """Gets the session or creates it if auto-creation is enabled. - This helper first attempts to retrieve the session. If not found, it - creates a new session with the provided identifiers. + This helper first attempts to retrieve the session. If not found and + auto_create_session is True, it creates a new session with the provided + identifiers. Otherwise, it raises a ValueError with a helpful message. Args: user_id: The user ID of the session. @@ -367,35 +368,21 @@ async def _get_or_create_session( Returns: The existing or newly created `Session`. - """ - session = await self.session_service.get_session( - app_name=self.app_name, user_id=user_id, session_id=session_id - ) - if session: - return session - return await self.session_service.create_session( - app_name=self.app_name, user_id=user_id, session_id=session_id - ) - - async def _get_session(self, *, user_id: str, session_id: str) -> Session: - """Gets a session or raises a helpful error if missing. - - Args: - user_id: The user ID of the session. - session_id: The session ID of the session. - - Returns: - The existing `Session`. Raises: - ValueError: If the session cannot be found. + ValueError: If the session is not found and auto_create_session is False. """ session = await self.session_service.get_session( app_name=self.app_name, user_id=user_id, session_id=session_id ) if not session: - message = self._format_session_not_found_message(session_id) - raise ValueError(message) + if self.auto_create_session: + session = await self.session_service.create_session( + app_name=self.app_name, user_id=user_id, session_id=session_id + ) + else: + message = self._format_session_not_found_message(session_id) + raise ValueError(message) return session def run( @@ -507,14 +494,9 @@ async def _run_with_trace( invocation_id: Optional[str] = None, ) -> AsyncGenerator[Event, None]: with tracer.start_as_current_span('invocation'): - if self.auto_create_session: - session = await self._get_or_create_session( - user_id=user_id, session_id=session_id - ) - else: - session = await self._get_session( - user_id=user_id, session_id=session_id - ) + session = await self._get_or_create_session( + user_id=user_id, session_id=session_id + ) if not invocation_id and not new_message: raise ValueError( 'Running an agent requires either a new_message or an ' @@ -588,12 +570,9 @@ async def rewind_async( rewind_before_invocation_id: str, ) -> None: """Rewinds the session to before the specified invocation.""" - if self.auto_create_session: - session = await self._get_or_create_session( - user_id=user_id, session_id=session_id - ) - else: - session = await self._get_session(user_id=user_id, session_id=session_id) + session = await self._get_or_create_session( + user_id=user_id, session_id=session_id + ) rewind_event_index = -1 for i, event in enumerate(session.events): if event.invocation_id == rewind_before_invocation_id: @@ -1020,12 +999,10 @@ async def run_live( DeprecationWarning, stacklevel=2, ) - if self.auto_create_session: + if not session: session = await self._get_or_create_session( user_id=user_id, session_id=session_id ) - else: - session = await self._get_session(user_id=user_id, session_id=session_id) invocation_context = self._new_invocation_context_for_live( session, live_request_queue=live_request_queue, From 2221386a5344a3b0e7de6dacb60b87b3212b95d6 Mon Sep 17 00:00:00 2001 From: Luyang Wang Date: Mon, 12 Jan 2026 14:36:31 -0500 Subject: [PATCH 11/11] fix linting error --- src/google/adk/sessions/database_session_service.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/google/adk/sessions/database_session_service.py b/src/google/adk/sessions/database_session_service.py index 8b7bda6d2a..863bbfa861 100644 --- a/src/google/adk/sessions/database_session_service.py +++ b/src/google/adk/sessions/database_session_service.py @@ -436,8 +436,8 @@ async def append_event(self, session: Session, event: Event) -> Event: if storage_session.update_timestamp_tz > session.last_update_time: raise ValueError( "The last_update_time provided in the session object" - f" {datetime.fromtimestamp(session.last_update_time):'%Y-%m-%d %H:%M:%S'}" - " is earlier than the update_time in the storage_session" + f" {datetime.fromtimestamp(session.last_update_time):'%Y-%m-%d %H:%M:%S'} is" + " earlier than the update_time in the storage_session" f" {datetime.fromtimestamp(storage_session.update_timestamp_tz):'%Y-%m-%d %H:%M:%S'}." " Please check if it is a stale session." )