@@ -375,6 +375,65 @@ async def test_append_new_message_to_session_keeps_non_duplicate_messages():
375375 assert len (matched_events ) == 2
376376
377377
378+ @pytest .mark .asyncio
379+ async def test_append_new_message_to_session_state_delta_deduping ():
380+ session_service = InMemorySessionService ()
381+ runner = Runner (
382+ app_name = "test_app" ,
383+ agent = MockLlmAgent ("root_agent" ),
384+ session_service = session_service ,
385+ artifact_service = InMemoryArtifactService (),
386+ )
387+ session = await session_service .create_session (
388+ app_name = "test_app" ,
389+ user_id = "test_user" ,
390+ )
391+ user_message = types .Content (role = "user" , parts = [types .Part (text = "same message" )])
392+ invocation_context = runner ._new_invocation_context (
393+ session ,
394+ invocation_id = "inv-state-delta" ,
395+ new_message = user_message ,
396+ run_config = RunConfig (),
397+ )
398+
399+ await runner ._append_new_message_to_session (
400+ session = session ,
401+ new_message = user_message ,
402+ invocation_context = invocation_context ,
403+ state_delta = {"attempt" : 1 },
404+ )
405+ await runner ._append_new_message_to_session (
406+ session = session ,
407+ new_message = user_message ,
408+ invocation_context = invocation_context ,
409+ state_delta = {"attempt" : 1 },
410+ )
411+ await runner ._append_new_message_to_session (
412+ session = session ,
413+ new_message = user_message ,
414+ invocation_context = invocation_context ,
415+ state_delta = {"attempt" : 2 },
416+ )
417+ await runner ._append_new_message_to_session (
418+ session = session ,
419+ new_message = user_message ,
420+ invocation_context = invocation_context ,
421+ state_delta = None ,
422+ )
423+
424+ matched_events = [
425+ event
426+ for event in session .events
427+ if event .author == "user"
428+ and event .invocation_id == "inv-state-delta"
429+ and event .content == user_message
430+ ]
431+ assert len (matched_events ) == 3
432+ assert matched_events [0 ].actions .state_delta == {"attempt" : 1 }
433+ assert matched_events [1 ].actions .state_delta == {"attempt" : 2 }
434+ assert matched_events [2 ].actions .state_delta == {}
435+
436+
378437@pytest .mark .asyncio
379438async def test_rewind_auto_create_session_on_missing_session ():
380439 """When auto_create_session=True, rewind should create session if missing.
0 commit comments