diff --git a/src/crewai/agent.py b/src/crewai/agent.py index d75f0d97a..b7a42da5d 100644 --- a/src/crewai/agent.py +++ b/src/crewai/agent.py @@ -219,6 +219,7 @@ class Agent(BaseAgent): collection_name=self.role, storage=self.knowledge_storage or None, ) + self.knowledge.add_sources() except (TypeError, ValueError) as e: raise ValueError(f"Invalid Knowledge Configuration: {str(e)}") @@ -260,6 +261,27 @@ class Agent(BaseAgent): ValueError: If the max execution time is not a positive integer. RuntimeError: If the agent execution fails for other reasons. """ + if self.reasoning: + try: + from crewai.utilities.reasoning_handler import ( + AgentReasoning, + AgentReasoningOutput, + ) + + reasoning_handler = AgentReasoning(task=task, agent=self) + reasoning_output: AgentReasoningOutput = ( + reasoning_handler.handle_agent_reasoning() + ) + + # Add the reasoning plan to the task description + task.description += f"\n\nReasoning Plan:\n{reasoning_output.plan.plan}" + except Exception as e: + if hasattr(self, "_logger"): + self._logger.log( + "error", f"Error during reasoning process: {str(e)}" + ) + else: + print(f"Error during reasoning process: {str(e)}") self._inject_date_to_task(task) @@ -669,8 +691,20 @@ class Agent(BaseAgent): """Inject the current date into the task description if inject_date is enabled.""" if self.inject_date: from datetime import datetime + try: - valid_format_codes = ['%Y', '%m', '%d', '%H', '%M', '%S', '%B', '%b', '%A', '%a'] + valid_format_codes = [ + "%Y", + "%m", + "%d", + "%H", + "%M", + "%S", + "%B", + "%b", + "%A", + "%a", + ] is_valid = any(code in self.date_format for code in valid_format_codes) if not is_valid: @@ -679,12 +713,11 @@ class Agent(BaseAgent): current_date: str = datetime.now().strftime(self.date_format) task.description += f"\n\nCurrent Date: {current_date}" except Exception as e: - if hasattr(self, '_logger'): + if hasattr(self, "_logger"): self._logger.log("warning", f"Failed to inject date: {str(e)}") else: print(f"Warning: Failed to inject date: {str(e)}") - def _validate_docker_installation(self) -> None: """Check if Docker is installed and running.""" if not shutil.which("docker"): diff --git a/tests/agent_test.py b/tests/agent_test.py index 800860c9f..22748ab2e 100644 --- a/tests/agent_test.py +++ b/tests/agent_test.py @@ -309,7 +309,9 @@ def test_cache_hitting(): def handle_tool_end(source, event): received_events.append(event) - with (patch.object(CacheHandler, "read") as read,): + with ( + patch.object(CacheHandler, "read") as read, + ): read.return_value = "0" task = Task( description="What is 2 times 6? Ignore correctness and just return the result of the multiplication tool, you must use the tool.", @@ -1628,13 +1630,13 @@ def test_agent_execute_task_with_ollama(): @pytest.mark.vcr(filter_headers=["authorization"]) def test_agent_with_knowledge_sources(): - # Create a knowledge source with some content content = "Brandon's favorite color is red and he likes Mexican food." string_source = StringKnowledgeSource(content=content) with patch("crewai.knowledge") as MockKnowledge: mock_knowledge_instance = MockKnowledge.return_value mock_knowledge_instance.sources = [string_source] mock_knowledge_instance.search.return_value = [{"content": content}] + MockKnowledge.add_sources.return_value = [string_source] agent = Agent( role="Information Agent", @@ -1644,7 +1646,6 @@ def test_agent_with_knowledge_sources(): knowledge_sources=[string_source], ) - # Create a task that requires the agent to use the knowledge task = Task( description="What is Brandon's favorite color?", expected_output="Brandon's favorite color.", @@ -1652,10 +1653,11 @@ def test_agent_with_knowledge_sources(): ) crew = Crew(agents=[agent], tasks=[task]) - result = crew.kickoff() - - # Assert that the agent provides the correct information - assert "red" in result.raw.lower() + with patch.object(Knowledge, "add_sources") as mock_add_sources: + result = crew.kickoff() + assert mock_add_sources.called, "add_sources() should have been called" + mock_add_sources.assert_called_once() + assert "red" in result.raw.lower() @pytest.mark.vcr(filter_headers=["authorization"])