fix: resolve type-checker and test isolation issues

- 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 <joao@crewai.com>
This commit is contained in:
Devin AI
2025-06-27 10:06:22 +00:00
parent cd4b5b9ded
commit 201a73289a
2 changed files with 26 additions and 15 deletions

View File

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

View File

@@ -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():