@@ -302,34 +302,18 @@ def test_create_message(self, session_manager, mock_memory_client):
302302
303303 def test_list_messages (self , session_manager , mock_memory_client ):
304304 """Test listing messages."""
305+ user_text = '{"message": {"role": "user", "content": [{"text": "Hello"}]}, "message_id": 1}'
306+ asst_text = '{"message": {"role": "assistant", "content": [{"text": "Hi there"}]}, "message_id": 2}'
305307 mock_memory_client .list_events .return_value = [
306308 {
307309 "eventId" : "event-1" ,
308310 "eventTimestamp" : "2024-01-01T12:00:00Z" ,
309- "payload" : [
310- {
311- "conversational" : {
312- "content" : {
313- "text" : '{"message": {"role": "user", "content": [{"text": "Hello"}]}, "message_id": 1}'
314- },
315- "role" : "USER" ,
316- }
317- }
318- ],
311+ "payload" : [{"conversational" : {"content" : {"text" : user_text }, "role" : "USER" }}],
319312 },
320313 {
321314 "eventId" : "event-2" ,
322315 "eventTimestamp" : "2024-01-01T12:00:00Z" ,
323- "payload" : [
324- {
325- "conversational" : {
326- "content" : {
327- "text" : '{"message": {"role": "assistant", "content": [{"text": "Hi there"}]}, "message_id": 2}' # noqa E501
328- },
329- "role" : "ASSISTANT" ,
330- }
331- }
332- ],
316+ "payload" : [{"conversational" : {"content" : {"text" : asst_text }, "role" : "ASSISTANT" }}],
333317 },
334318 ]
335319
@@ -341,34 +325,18 @@ def test_list_messages(self, session_manager, mock_memory_client):
341325
342326 def test_list_messages_returns_values_in_correct_reverse_order (self , session_manager , mock_memory_client ):
343327 """Test listing messages."""
328+ user_text = '{"message": {"role": "user", "content": [{"text": "Hello"}]}, "message_id": 1}'
329+ asst_text = '{"message": {"role": "assistant", "content": [{"text": "Hi there"}]}, "message_id": 2}'
344330 mock_memory_client .list_events .return_value = [
345331 {
346332 "eventId" : "event-1" ,
347333 "eventTimestamp" : "2024-01-01T12:00:00Z" ,
348- "payload" : [
349- {
350- "conversational" : {
351- "content" : {
352- "text" : '{"message": {"role": "user", "content": [{"text": "Hello"}]}, "message_id": 1}'
353- },
354- "role" : "USER" ,
355- }
356- }
357- ],
334+ "payload" : [{"conversational" : {"content" : {"text" : user_text }, "role" : "USER" }}],
358335 },
359336 {
360337 "eventId" : "event-2" ,
361338 "eventTimestamp" : "2024-01-01T12:00:00Z" ,
362- "payload" : [
363- {
364- "conversational" : {
365- "content" : {
366- "text" : '{"message": {"role": "assistant", "content": [{"text": "Hi there"}]}, "message_id": 2}' # noqa E501
367- },
368- "role" : "ASSISTANT" ,
369- }
370- }
371- ],
339+ "payload" : [{"conversational" : {"content" : {"text" : asst_text }, "role" : "ASSISTANT" }}],
372340 },
373341 ]
374342
@@ -508,37 +476,39 @@ def test_update_message_wrong_session(self, session_manager):
508476
509477 def test_list_messages_with_limit (self , session_manager , mock_memory_client ):
510478 """Test listing messages with limit."""
511- mock_memory_client .list_events .return_value = [
512- {
513- "eventId" : "event-1" ,
514- "eventTimestamp" : "2024-01-01T12:00:00Z" ,
515- "payload" : [
516- {
517- "conversational" : {
518- "content" : {
519- "text" : '{"message": {"role": "user", '
520- '"content": [{"text": "Message 1"}]}, "message_id": 1}'
521- },
522- "role" : "USER" ,
479+ session_manager .memory_client .gmdp_client .list_events .return_value = {
480+ "events" : [
481+ {
482+ "eventId" : "event-1" ,
483+ "eventTimestamp" : "2024-01-01T12:00:00Z" ,
484+ "payload" : [
485+ {
486+ "conversational" : {
487+ "content" : {
488+ "text" : '{"message": {"role": "user", '
489+ '"content": [{"text": "Message 1"}]}, "message_id": 1}'
490+ },
491+ "role" : "USER" ,
492+ }
523493 }
524- }
525- ] ,
526- },
527- {
528- "eventId " : "event-2 " ,
529- "eventTimestamp " : "2024-01-01T12:00:00Z" ,
530- "payload" : [
531- {
532- "conversational " : {
533- " content" : {
534- "text" : '{"message": {"role": "assistant", "content": [{"text": "Message 2"}]}, "message_id": 2}' # noqa E501
535- } ,
536- "role" : "ASSISTANT" ,
494+ ],
495+ } ,
496+ {
497+ "eventId" : "event-2" ,
498+ "eventTimestamp " : "2024-01-01T12:00:00Z " ,
499+ "payload " : [
500+ {
501+ "conversational" : {
502+ "content " : {
503+ "text" : '{"message": {"role": "assistant", " content": [{"text": "Message 2"}]}, "message_id": 2}' # noqa E501
504+ },
505+ "role" : "ASSISTANT" ,
506+ }
537507 }
538- }
539- ] ,
540- },
541- ]
508+ ],
509+ } ,
510+ ]
511+ }
542512
543513 messages = session_manager .list_messages ("test-session-456" , "test-agent-123" , limit = 1 , offset = 1 )
544514
@@ -1189,25 +1159,90 @@ def test_retrieve_customer_context_filters_by_relevance_score(self, mock_memory_
11891159 assert "Low relevance 1" not in injected_context
11901160 assert "Low relevance 2" not in injected_context
11911161
1192- def test_list_messages_default_max_results (self , session_manager , mock_memory_client ):
1193- """Test listing messages without limit uses default max_results=10000."""
1194- mock_memory_client .list_events .return_value = []
1162+ def test_list_messages_with_limit_skips_state_events (self , session_manager , mock_memory_client ):
1163+ """list_messages with limit returns exactly limit messages even when state events are mixed in.
1164+
1165+ State events (session/agent blobs) share the same actorId as conversational events
1166+ after the metadata-based identification change. If list_messages counts raw events
1167+ toward the limit, state events consume slots and the caller gets fewer messages
1168+ than requested.
1169+ """
1170+
1171+ def _conv_event (eid , text , role ):
1172+ return {
1173+ "eventId" : eid ,
1174+ "payload" : [
1175+ {
1176+ "conversational" : {
1177+ "content" : {
1178+ "text" : f'{{"message": {{"role": "{ role } ", '
1179+ f'"content": [{{"text": "{ text } "}}]}}, "message_id": { eid } }}'
1180+ },
1181+ "role" : role .upper (),
1182+ }
1183+ }
1184+ ],
1185+ }
11951186
1196- session_manager .list_messages ("test-session-456" , "test-agent-123" )
1187+ def _state_event (eid ):
1188+ return {
1189+ "eventId" : eid ,
1190+ "payload" : [{"blob" : '{"session_id": "s", "session_type": "AGENT"}' }],
1191+ "metadata" : {"stateType" : {"stringValue" : "SESSION" }},
1192+ }
11971193
1198- mock_memory_client .list_events .assert_called_once ()
1199- call_kwargs = mock_memory_client .list_events .call_args [1 ]
1200- assert call_kwargs ["max_results" ] == 10000
1194+ # Page 1: 2 state + 3 conversational (5 raw events, only 3 convert to messages)
1195+ # Page 2: 3 more conversational
1196+ page1 = [
1197+ _state_event ("s1" ),
1198+ _conv_event (1 , "Hello" , "user" ),
1199+ _conv_event (2 , "Hi" , "assistant" ),
1200+ _state_event ("s2" ),
1201+ _conv_event (3 , "How are you?" , "user" ),
1202+ ]
1203+ page2 = [
1204+ _conv_event (4 , "Good" , "assistant" ),
1205+ _conv_event (5 , "Great" , "user" ),
1206+ _conv_event (6 , "Thanks" , "assistant" ),
1207+ ]
12011208
1202- def test_list_messages_with_limit_calculates_max_results (self , session_manager , mock_memory_client ):
1203- """Test listing messages with limit calculates max_results correctly."""
1204- mock_memory_client .list_events .return_value = []
1209+ mock_gmdp = session_manager .memory_client .gmdp_client
1210+ mock_gmdp .list_events .side_effect = [
1211+ {"events" : page1 , "nextToken" : "tok" },
1212+ {"events" : page2 },
1213+ ]
1214+
1215+ messages = session_manager .list_messages ("test-session-456" , "test-agent-123" , limit = 5 )
12051216
1206- session_manager . list_messages ( "test-session-456" , "test-agent-123" , limit = 500 , offset = 50 )
1217+ assert len ( messages ) == 5
12071218
1208- mock_memory_client .list_events .assert_called_once ()
1209- call_kwargs = mock_memory_client .list_events .call_args [1 ]
1210- assert call_kwargs ["max_results" ] == 550 # limit + offset
1219+ def test_list_messages_with_limit_returns_fewer_when_not_enough (self , session_manager , mock_memory_client ):
1220+ """list_messages returns all available messages when fewer than limit exist."""
1221+
1222+ def _conv_event (eid , text , role ):
1223+ return {
1224+ "eventId" : eid ,
1225+ "payload" : [
1226+ {
1227+ "conversational" : {
1228+ "content" : {
1229+ "text" : f'{{"message": {{"role": "{ role } ", '
1230+ f'"content": [{{"text": "{ text } "}}]}}, "message_id": { eid } }}'
1231+ },
1232+ "role" : role .upper (),
1233+ }
1234+ }
1235+ ],
1236+ }
1237+
1238+ mock_gmdp = session_manager .memory_client .gmdp_client
1239+ mock_gmdp .list_events .return_value = {
1240+ "events" : [_conv_event (1 , "Hello" , "user" ), _conv_event (2 , "Hi" , "assistant" )]
1241+ }
1242+
1243+ messages = session_manager .list_messages ("test-session-456" , "test-agent-123" , limit = 10 )
1244+
1245+ assert len (messages ) == 2
12111246
12121247 def test_append_message_handles_none_from_create_message (self , session_manager , test_agent ):
12131248 """Test that append_message gracefully handles None return from create_message."""
0 commit comments