From c6ffdc160bc7526ec3244d9a1fb7930d57aa2621 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 19:06:27 +0000 Subject: [PATCH] fix: Handle no-crew case in reset-memories command - Modify RAGStorage to handle initialization without crew - Add test for resetting memories without crew - Fixes #2123 Co-Authored-By: Joe Moura --- src/crewai/cli/reset_memories_command.py | 18 +++++++++++++--- src/crewai/memory/storage/rag_storage.py | 11 +++++----- tests/cli/cli_test.py | 27 ++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/crewai/cli/reset_memories_command.py b/src/crewai/cli/reset_memories_command.py index 4870d6424..0e391f83f 100644 --- a/src/crewai/cli/reset_memories_command.py +++ b/src/crewai/cli/reset_memories_command.py @@ -27,10 +27,22 @@ def reset_memories_command( try: crew = get_crew() - if not crew: - raise ValueError("No crew found.") if all: - crew.reset_memories(command_type="all") + if crew: + crew.reset_memories(command_type="all") + else: + # When no crew exists, use default storage paths + from crewai.memory.short_term.short_term_memory import ShortTermMemory + from crewai.memory.entity.entity_memory import EntityMemory + from crewai.memory.long_term.long_term_memory import LongTermMemory + from crewai.utilities.task_output_storage_handler import TaskOutputStorageHandler + from crewai.knowledge.storage.knowledge_storage import KnowledgeStorage + + ShortTermMemory().reset() + EntityMemory().reset() + LongTermMemory().reset() + TaskOutputStorageHandler().reset() + KnowledgeStorage().reset() click.echo("All memories have been reset.") return diff --git a/src/crewai/memory/storage/rag_storage.py b/src/crewai/memory/storage/rag_storage.py index fd4c77838..61e962ba4 100644 --- a/src/crewai/memory/storage/rag_storage.py +++ b/src/crewai/memory/storage/rag_storage.py @@ -43,14 +43,15 @@ class RAGStorage(BaseRAGStorage): self, type, allow_reset=True, embedder_config=None, crew=None, path=None ): super().__init__(type, allow_reset, embedder_config, crew) - agents = crew.agents if crew else [] - agents = [self._sanitize_role(agent.role) for agent in agents] - agents = "_".join(agents) + if crew: + agents = crew.agents + agents = [self._sanitize_role(agent.role) for agent in agents] + agents = "_".join(agents) + else: + agents = "no_crew" self.agents = agents self.storage_file_name = self._build_storage_file_name(type, agents) - self.type = type - self.allow_reset = allow_reset self.path = path self._initialize_app() diff --git a/tests/cli/cli_test.py b/tests/cli/cli_test.py index dc0c502b7..f0d5c41ca 100644 --- a/tests/cli/cli_test.py +++ b/tests/cli/cli_test.py @@ -65,6 +65,33 @@ def test_reset_all_memories(mock_get_crew, runner): assert result.output == "All memories have been reset.\n" +@mock.patch("crewai.cli.reset_memories_command.get_crew") +@mock.patch("crewai.cli.reset_memories_command.ShortTermMemory") +@mock.patch("crewai.cli.reset_memories_command.EntityMemory") +@mock.patch("crewai.cli.reset_memories_command.LongTermMemory") +@mock.patch("crewai.cli.reset_memories_command.TaskOutputStorageHandler") +@mock.patch("crewai.cli.reset_memories_command.KnowledgeStorage") +def test_reset_all_memories_no_crew( + MockKnowledgeStorage, + MockTaskOutputStorageHandler, + MockLongTermMemory, + MockEntityMemory, + MockShortTermMemory, + mock_get_crew, + runner, +): + mock_get_crew.return_value = None + result = runner.invoke(reset_memories, ["-a"]) + + MockShortTermMemory().reset.assert_called_once() + MockEntityMemory().reset.assert_called_once() + MockLongTermMemory().reset.assert_called_once() + MockTaskOutputStorageHandler().reset.assert_called_once() + MockKnowledgeStorage().reset.assert_called_once() + assert result.output == "All memories have been reset.\n" + assert result.exit_code == 0 + + @mock.patch("crewai.cli.reset_memories_command.get_crew") def test_reset_short_term_memories(mock_get_crew, runner): mock_crew = mock.Mock()