From 201a73289ab42aeed30344c382081bcc5032ba1c Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 27 Jun 2025 10:06:22 +0000 Subject: [PATCH] fix: resolve type-checker and test isolation issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove hasattr/getattr calls that caused mypy type-checker errors - Fix test mocking to use 'crewai.agent.Knowledge' for proper isolation - Prevent network calls in tests by mocking Knowledge class constructor - All knowledge-related tests now pass locally without API dependencies Co-Authored-By: João --- src/crewai/agent.py | 7 +++---- tests/agent_test.py | 34 +++++++++++++++++++++++----------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/crewai/agent.py b/src/crewai/agent.py index a4309e87e..04c9c5e7b 100644 --- a/src/crewai/agent.py +++ b/src/crewai/agent.py @@ -198,11 +198,10 @@ class Agent(BaseAgent): def set_knowledge(self, crew_embedder: Optional[Dict[str, Any]] = None): try: current_embedder = crew_embedder or self.embedder - if (hasattr(self, '_knowledge_loaded') and - self._knowledge_loaded and + if (self._knowledge_loaded and self.knowledge is not None and - getattr(self, '_last_embedder', None) == current_embedder and - getattr(self, '_last_knowledge_sources', None) == self.knowledge_sources): + self._last_embedder == current_embedder and + self._last_knowledge_sources == self.knowledge_sources): return if self.embedder is None and crew_embedder: diff --git a/tests/agent_test.py b/tests/agent_test.py index 031d25bc1..5c4771046 100644 --- a/tests/agent_test.py +++ b/tests/agent_test.py @@ -2291,15 +2291,21 @@ def test_agent_knowledge_caching_on_multiple_set_knowledge_calls(): llm="gpt-4o-mini" ) - with patch.object(Knowledge, 'add_sources') as mock_add_sources: - agent.set_knowledge() - assert mock_add_sources.call_count == 1, "Knowledge sources should be loaded once on first call" + with patch('crewai.agent.Knowledge') as mock_knowledge_class: + mock_knowledge_instance = MagicMock() + mock_knowledge_class.return_value = mock_knowledge_instance agent.set_knowledge() - assert mock_add_sources.call_count == 1, "Knowledge sources should not be reloaded on second call" + assert mock_knowledge_class.call_count == 1, "Knowledge should be created once on first call" + assert mock_knowledge_instance.add_sources.call_count == 1, "add_sources should be called once" agent.set_knowledge() - assert mock_add_sources.call_count == 1, "Knowledge sources should not be reloaded on third call" + assert mock_knowledge_class.call_count == 1, "Knowledge should not be recreated on second call" + assert mock_knowledge_instance.add_sources.call_count == 1, "add_sources should not be called again" + + agent.set_knowledge() + assert mock_knowledge_class.call_count == 1, "Knowledge should not be recreated on third call" + assert mock_knowledge_instance.add_sources.call_count == 1, "add_sources should not be called again" def test_agent_knowledge_reloads_when_sources_change(): @@ -2317,14 +2323,17 @@ def test_agent_knowledge_reloads_when_sources_change(): llm="gpt-4o-mini" ) - with patch.object(Knowledge, 'add_sources') as mock_add_sources: + with patch('crewai.agent.Knowledge') as mock_knowledge_class: + mock_knowledge_instance = MagicMock() + mock_knowledge_class.return_value = mock_knowledge_instance + agent.set_knowledge() - assert mock_add_sources.call_count == 1, "Knowledge sources should be loaded once on first call" + assert mock_knowledge_class.call_count == 1, "Knowledge should be created once on first call" agent.knowledge_sources = [string_source2] agent.set_knowledge() - assert mock_add_sources.call_count == 2, "Knowledge sources should be reloaded when sources change" + assert mock_knowledge_class.call_count == 2, "Knowledge should be recreated when sources change" def test_agent_knowledge_reloads_when_embedder_changes(): @@ -2343,12 +2352,15 @@ def test_agent_knowledge_reloads_when_embedder_changes(): embedder1 = {"provider": "openai", "model": "text-embedding-ada-002"} embedder2 = {"provider": "openai", "model": "text-embedding-3-small"} - with patch.object(Knowledge, 'add_sources') as mock_add_sources: + with patch('crewai.agent.Knowledge') as mock_knowledge_class: + mock_knowledge_instance = MagicMock() + mock_knowledge_class.return_value = mock_knowledge_instance + agent.set_knowledge(crew_embedder=embedder1) - assert mock_add_sources.call_count == 1, "Knowledge sources should be loaded once on first call" + assert mock_knowledge_class.call_count == 1, "Knowledge should be created once on first call" agent.set_knowledge(crew_embedder=embedder2) - assert mock_add_sources.call_count == 2, "Knowledge sources should be reloaded when embedder changes" + assert mock_knowledge_class.call_count == 2, "Knowledge should be recreated when embedder changes" def test_agent_reset_knowledge_cache():