From bcd16b7b547d34479f810a56de1c37f450b821dd Mon Sep 17 00:00:00 2001 From: Chris Kinzel Date: Sat, 16 May 2026 21:07:11 +0000 Subject: [PATCH] fix(sessions): add universal deduplication check in InMemorySessionService (#5723) --- .../adk/sessions/in_memory_session_service.py | 2 ++ .../sessions/test_session_service.py | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/google/adk/sessions/in_memory_session_service.py b/src/google/adk/sessions/in_memory_session_service.py index b8f6cfab46..52b1acad5b 100644 --- a/src/google/adk/sessions/in_memory_session_service.py +++ b/src/google/adk/sessions/in_memory_session_service.py @@ -314,6 +314,8 @@ def _delete_session_impl( @override async def append_event(self, session: Session, event: Event) -> Event: + if any(e.id == event.id for e in session.events): + return event if event.partial: return event diff --git a/tests/unittests/sessions/test_session_service.py b/tests/unittests/sessions/test_session_service.py index 02f5159a45..b1e3de5333 100644 --- a/tests/unittests/sessions/test_session_service.py +++ b/tests/unittests/sessions/test_session_service.py @@ -763,6 +763,29 @@ async def test_session_last_update_time_updates_on_event(session_service): assert refreshed_session.last_update_time > original_update_time +@pytest.mark.asyncio +async def test_append_event_deduplication(): + session_service = InMemorySessionService() + app_name = 'my_app' + user_id = 'user' + + session = await session_service.create_session( + app_name=app_name, user_id=user_id + ) + event = Event( + id='event_id_1', + invocation_id='invocation', + author='user', + timestamp=123456789.0, + ) + await session_service.append_event(session=session, event=event) + assert len(session.events) == 1 + + # Append the same event again + await session_service.append_event(session=session, event=event) + assert len(session.events) == 1 + + @pytest.mark.asyncio async def test_append_event_to_stale_session(): session_service = get_session_service(