diff --git a/python/packages/mem0/agent_framework_mem0/_provider.py b/python/packages/mem0/agent_framework_mem0/_provider.py index 3c962d58c2..6d726f3a0f 100644 --- a/python/packages/mem0/agent_framework_mem0/_provider.py +++ b/python/packages/mem0/agent_framework_mem0/_provider.py @@ -146,6 +146,10 @@ async def invoking(self, messages: ChatMessage | MutableSequence[ChatMessage], * messages_list = [messages] if isinstance(messages, ChatMessage) else list(messages) input_text = "\n".join(msg.text for msg in messages_list if msg and msg.text and msg.text.strip()) + # Validate input text is not empty before searching (possible for function approval responses) + if not input_text.strip(): + return Context(messages=None) + search_response: MemorySearchResponse_v1_1 | MemorySearchResponse_v2 = await self.mem0_client.search( # type: ignore[misc] query=input_text, user_id=self.user_id, diff --git a/python/packages/mem0/tests/test_mem0_context_provider.py b/python/packages/mem0/tests/test_mem0_context_provider.py index 324a655bf3..4c1be141dc 100644 --- a/python/packages/mem0/tests/test_mem0_context_provider.py +++ b/python/packages/mem0/tests/test_mem0_context_provider.py @@ -406,6 +406,32 @@ async def test_model_invoking_no_memories_returns_none_instructions(self, mock_m assert isinstance(context, Context) assert not context.messages + async def test_model_invoking_function_approval_response_returns_none_instructions( + self, mock_mem0_client: AsyncMock + ) -> None: + """Test invoking with function approval response content messages returns context with None instructions.""" + from agent_framework import FunctionApprovalResponseContent, FunctionCallContent + + provider = Mem0Provider(user_id="user123", mem0_client=mock_mem0_client) + function_call = FunctionCallContent(call_id="1", name="test_func", arguments='{"arg1": "value1"}') + message = ChatMessage( + role=Role.USER, + contents=[ + FunctionApprovalResponseContent( + id="approval_1", + function_call=function_call, + approved=True, + ) + ], + ) + + mock_mem0_client.search.return_value = [] + + context = await provider.invoking(message) + + assert isinstance(context, Context) + assert not context.messages + async def test_model_invoking_filters_empty_message_text(self, mock_mem0_client: AsyncMock) -> None: """Test that empty message text is filtered out from query.""" provider = Mem0Provider(user_id="user123", mem0_client=mock_mem0_client)