From 6e53a206f88100949c96bff3b4ff224bf8471cca Mon Sep 17 00:00:00 2001 From: Joao Moura Date: Sun, 26 Apr 2026 17:07:33 -0700 Subject: [PATCH] fix: remove duplicate memory extraction call from _finalize_kickoff `AgentExecutor._save_to_memory` (added in 62d097a7) already handles memory persistence with full conversation context after each kickoff. Leaving the older `_save_kickoff_to_memory` call in `_finalize_kickoff` caused `extract_memories` to be invoked twice, breaking `test_agent_kickoff_memory_recall_and_save`. Update the test assertion to match the conversation-aware format now produced by `AgentExecutor._save_to_memory` (checks for "Conversation:" or "Final result:" instead of the stale "Input:/Agent:/Result:" markers). Co-Authored-By: Claude Sonnet 4.6 --- lib/crewai/src/crewai/agent/core.py | 2 -- lib/crewai/src/crewai/mcp/__init__.py | 1 + lib/crewai/tests/memory/test_unified_memory.py | 5 ++--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/crewai/src/crewai/agent/core.py b/lib/crewai/src/crewai/agent/core.py index 1c52c192c..60eac4eb1 100644 --- a/lib/crewai/src/crewai/agent/core.py +++ b/lib/crewai/src/crewai/agent/core.py @@ -1598,8 +1598,6 @@ class Agent(BaseAgent): response_format=response_format, ) - self._save_kickoff_to_memory(messages, output.raw) - crewai_event_bus.emit( self, event=LiteAgentExecutionCompletedEvent( diff --git a/lib/crewai/src/crewai/mcp/__init__.py b/lib/crewai/src/crewai/mcp/__init__.py index bb3dab199..ee057af14 100644 --- a/lib/crewai/src/crewai/mcp/__init__.py +++ b/lib/crewai/src/crewai/mcp/__init__.py @@ -27,6 +27,7 @@ from crewai.mcp.filters import ( create_static_tool_filter, ) + if TYPE_CHECKING: from crewai.mcp.client import MCPClient from crewai.mcp.tool_resolver import MCPToolResolver diff --git a/lib/crewai/tests/memory/test_unified_memory.py b/lib/crewai/tests/memory/test_unified_memory.py index be52e6db5..68a7a806a 100644 --- a/lib/crewai/tests/memory/test_unified_memory.py +++ b/lib/crewai/tests/memory/test_unified_memory.py @@ -704,11 +704,10 @@ def test_agent_kickoff_memory_recall_and_save(tmp_path: Path, mock_embedder: Mag recall_mock.assert_called_once() # Verify extract_memories and remember_many were called (passive batch save) + # Memory extraction is now conversation-aware (via AgentExecutor._save_to_memory) extract_mock.assert_called_once() raw_content = extract_mock.call_args.args[0] - assert "Input:" in raw_content - assert "Agent:" in raw_content - assert "Result:" in raw_content + assert "Conversation:" in raw_content or "Final result:" in raw_content # remember_many was called with the extracted memories remember_many_mock.assert_called_once()