Skip to content

Commit 1bd22b7

Browse files
notgitikagitikavj
andauthored
test: add thinking-mode compatibility tests for LTM retrieval (#272)
Co-authored-by: gitikavj <gitikavj@amazon.com>
1 parent 232d05c commit 1bd22b7

1 file changed

Lines changed: 96 additions & 0 deletions

File tree

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

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1888,3 +1888,99 @@ def test_mixed_conversational_and_blob_messages(self, batching_session_manager,
18881888
# Verify both paths were used
18891889
assert mock_memory_client.create_event.call_count == 1 # Conversational
18901890
assert mock_memory_client.gmdp_client.create_event.call_count == 1 # Blob
1891+
1892+
1893+
class TestThinkingModeCompatibility:
1894+
"""Test that retrieve_customer_context injects memory inline, not as an assistant message.
1895+
1896+
When thinking is enabled on Claude, assistant messages must start with a thinking block
1897+
and the conversation must end with a user message. Injecting LTM as a separate assistant
1898+
message violates both constraints.
1899+
"""
1900+
1901+
def test_retrieve_customer_context_does_not_append_assistant_message(
1902+
self, agentcore_config_with_retrieval, mock_memory_client
1903+
):
1904+
"""Test retrieved memory is injected into the user message, not as a new assistant message."""
1905+
mock_memory_client.retrieve_memories.return_value = [
1906+
{"content": {"text": "User prefers dark mode"}},
1907+
{"content": {"text": "User likes sushi"}},
1908+
]
1909+
1910+
with patch(
1911+
"bedrock_agentcore.memory.integrations.strands.session_manager.MemoryClient",
1912+
return_value=mock_memory_client,
1913+
):
1914+
with patch("boto3.Session") as mock_boto_session:
1915+
mock_session = Mock()
1916+
mock_session.region_name = "us-west-2"
1917+
mock_session.client.return_value = Mock()
1918+
mock_boto_session.return_value = mock_session
1919+
1920+
with patch(
1921+
"strands.session.repository_session_manager.RepositorySessionManager.__init__", return_value=None
1922+
):
1923+
manager = AgentCoreMemorySessionManager(agentcore_config_with_retrieval)
1924+
1925+
mock_agent = Mock()
1926+
mock_agent.messages = [{"role": "user", "content": [{"text": "What are my preferences?"}]}]
1927+
1928+
event = MessageAddedEvent(
1929+
agent=mock_agent, message={"role": "user", "content": [{"text": "What are my preferences?"}]}
1930+
)
1931+
manager.retrieve_customer_context(event)
1932+
1933+
# No new messages should be added — memory is inlined in the user message
1934+
assert len(mock_agent.messages) == 1
1935+
assert mock_agent.messages[-1]["role"] == "user"
1936+
1937+
# Memory prepended, original query remains last
1938+
content = mock_agent.messages[0]["content"]
1939+
assert len(content) == 2
1940+
assert "<retrieved_memory>" in content[0]["text"]
1941+
assert content[1]["text"] == "What are my preferences?"
1942+
1943+
def test_retrieve_customer_context_no_assistant_message_multi_turn(
1944+
self, agentcore_config_with_retrieval, mock_memory_client
1945+
):
1946+
"""Test memory injection keeps last message as user in a multi-turn conversation."""
1947+
mock_memory_client.retrieve_memories.return_value = [
1948+
{"content": {"text": "User likes sushi"}},
1949+
]
1950+
1951+
with patch(
1952+
"bedrock_agentcore.memory.integrations.strands.session_manager.MemoryClient",
1953+
return_value=mock_memory_client,
1954+
):
1955+
with patch("boto3.Session") as mock_boto_session:
1956+
mock_session = Mock()
1957+
mock_session.region_name = "us-west-2"
1958+
mock_session.client.return_value = Mock()
1959+
mock_boto_session.return_value = mock_session
1960+
1961+
with patch(
1962+
"strands.session.repository_session_manager.RepositorySessionManager.__init__", return_value=None
1963+
):
1964+
manager = AgentCoreMemorySessionManager(agentcore_config_with_retrieval)
1965+
1966+
mock_agent = Mock()
1967+
mock_agent.messages = [
1968+
{"role": "user", "content": [{"text": "I love sushi"}]},
1969+
{"role": "assistant", "content": [{"text": "That's great!"}]},
1970+
{"role": "user", "content": [{"text": "What do I like to eat?"}]},
1971+
]
1972+
1973+
event = MessageAddedEvent(
1974+
agent=mock_agent, message={"role": "user", "content": [{"text": "What do I like to eat?"}]}
1975+
)
1976+
manager.retrieve_customer_context(event)
1977+
1978+
# No new messages added
1979+
assert len(mock_agent.messages) == 3
1980+
assert mock_agent.messages[-1]["role"] == "user"
1981+
1982+
# Memory injected into last user message
1983+
content = mock_agent.messages[-1]["content"]
1984+
assert len(content) == 2
1985+
assert "<retrieved_memory>" in content[0]["text"]
1986+
assert content[1]["text"] == "What do I like to eat?"

0 commit comments

Comments
 (0)