Skip to content

Commit 3a6496e

Browse files
authored
fix: handle empty payload gracefully (#683)
1 parent c7423e5 commit 3a6496e

2 files changed

Lines changed: 23 additions & 5 deletions

File tree

‎src/bedrock_agentcore/memory/integrations/strands/session_manager.py‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -322,8 +322,10 @@ def read_session(self, session_id: str, **kwargs: Any) -> Optional[Session]:
322322
max_results=1,
323323
)
324324
if events:
325-
session_data = json.loads(events[0].get("payload", {})[0].get("blob"))
326-
return Session.from_dict(session_data)
325+
payload = events[0].get("payload") or []
326+
if payload:
327+
session_data = json.loads(payload[0].get("blob"))
328+
return Session.from_dict(session_data)
327329

328330
# 2. Fallback: check for legacy event and migrate
329331
legacy_actor_id = f"{LEGACY_SESSION_PREFIX}{session_id}"
@@ -335,7 +337,10 @@ def read_session(self, session_id: str, **kwargs: Any) -> Optional[Session]:
335337
)
336338
if events:
337339
old_event = events[0]
338-
session_data = json.loads(old_event.get("payload", {})[0].get("blob"))
340+
payload = old_event.get("payload") or []
341+
if not payload:
342+
return None
343+
session_data = json.loads(payload[0].get("blob"))
339344
session = Session.from_dict(session_data)
340345
# Migrate: create new event with metadata, delete old
341346
if self.persistence_mode is not PersistenceMode.NONE:

‎tests/bedrock_agentcore/memory/integrations/strands/test_agentcore_memory_session_manager.py‎

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,10 +207,10 @@ def test_read_session_legacy_migration(self, session_manager, mock_memory_client
207207
"""Test reading a legacy session event triggers migration."""
208208
legacy_session_data = '{"session_id": "test-session-456", "session_type": "AGENT"}'
209209

210-
# First call (new approach with metadata) returns empty
210+
# First call returns an event whose payload is no longer available
211211
# Second call (legacy actor_id) returns the legacy event
212212
mock_memory_client.list_events.side_effect = [
213-
[], # New approach returns nothing
213+
[{"eventId": "expired-session-event", "payload": []}],
214214
[{"eventId": "legacy-event-1", "payload": [{"blob": legacy_session_data}]}], # Legacy approach
215215
]
216216
mock_memory_client.gmdp_client.create_event.return_value = {"event": {"eventId": "new-event-1"}}
@@ -234,6 +234,19 @@ def test_read_session_legacy_migration(self, session_manager, mock_memory_client
234234
assert delete_call_kwargs["actorId"] == "session_test-session-456"
235235
assert delete_call_kwargs["eventId"] == "legacy-event-1"
236236

237+
def test_read_session_empty_payload_returns_none(self, session_manager, mock_memory_client):
238+
"""Test session events with empty payloads are treated as unavailable."""
239+
mock_memory_client.list_events.side_effect = [
240+
[{"eventId": "session-event-1", "payload": []}],
241+
[{"eventId": "legacy-event-1", "payload": []}],
242+
]
243+
244+
result = session_manager.read_session("test-session-456")
245+
246+
assert result is None
247+
mock_memory_client.gmdp_client.create_event.assert_not_called()
248+
mock_memory_client.gmdp_client.delete_event.assert_not_called()
249+
237250
def test_create_agent(self, session_manager):
238251
"""Test creating an agent."""
239252
session_agent = SessionAgent(agent_id="test-agent-123", state={}, conversation_manager_state={})

0 commit comments

Comments
 (0)