@@ -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