mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-08 15:48:29 +00:00
agent add knowledge sources fix and test (#2948)
This commit is contained in:
@@ -219,6 +219,7 @@ class Agent(BaseAgent):
|
|||||||
collection_name=self.role,
|
collection_name=self.role,
|
||||||
storage=self.knowledge_storage or None,
|
storage=self.knowledge_storage or None,
|
||||||
)
|
)
|
||||||
|
self.knowledge.add_sources()
|
||||||
except (TypeError, ValueError) as e:
|
except (TypeError, ValueError) as e:
|
||||||
raise ValueError(f"Invalid Knowledge Configuration: {str(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.
|
ValueError: If the max execution time is not a positive integer.
|
||||||
RuntimeError: If the agent execution fails for other reasons.
|
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)
|
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."""
|
"""Inject the current date into the task description if inject_date is enabled."""
|
||||||
if self.inject_date:
|
if self.inject_date:
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
try:
|
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)
|
is_valid = any(code in self.date_format for code in valid_format_codes)
|
||||||
|
|
||||||
if not is_valid:
|
if not is_valid:
|
||||||
@@ -679,12 +713,11 @@ class Agent(BaseAgent):
|
|||||||
current_date: str = datetime.now().strftime(self.date_format)
|
current_date: str = datetime.now().strftime(self.date_format)
|
||||||
task.description += f"\n\nCurrent Date: {current_date}"
|
task.description += f"\n\nCurrent Date: {current_date}"
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if hasattr(self, '_logger'):
|
if hasattr(self, "_logger"):
|
||||||
self._logger.log("warning", f"Failed to inject date: {str(e)}")
|
self._logger.log("warning", f"Failed to inject date: {str(e)}")
|
||||||
else:
|
else:
|
||||||
print(f"Warning: Failed to inject date: {str(e)}")
|
print(f"Warning: Failed to inject date: {str(e)}")
|
||||||
|
|
||||||
|
|
||||||
def _validate_docker_installation(self) -> None:
|
def _validate_docker_installation(self) -> None:
|
||||||
"""Check if Docker is installed and running."""
|
"""Check if Docker is installed and running."""
|
||||||
if not shutil.which("docker"):
|
if not shutil.which("docker"):
|
||||||
|
|||||||
@@ -309,7 +309,9 @@ def test_cache_hitting():
|
|||||||
def handle_tool_end(source, event):
|
def handle_tool_end(source, event):
|
||||||
received_events.append(event)
|
received_events.append(event)
|
||||||
|
|
||||||
with (patch.object(CacheHandler, "read") as read,):
|
with (
|
||||||
|
patch.object(CacheHandler, "read") as read,
|
||||||
|
):
|
||||||
read.return_value = "0"
|
read.return_value = "0"
|
||||||
task = Task(
|
task = Task(
|
||||||
description="What is 2 times 6? Ignore correctness and just return the result of the multiplication tool, you must use the tool.",
|
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"])
|
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||||
def test_agent_with_knowledge_sources():
|
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."
|
content = "Brandon's favorite color is red and he likes Mexican food."
|
||||||
string_source = StringKnowledgeSource(content=content)
|
string_source = StringKnowledgeSource(content=content)
|
||||||
with patch("crewai.knowledge") as MockKnowledge:
|
with patch("crewai.knowledge") as MockKnowledge:
|
||||||
mock_knowledge_instance = MockKnowledge.return_value
|
mock_knowledge_instance = MockKnowledge.return_value
|
||||||
mock_knowledge_instance.sources = [string_source]
|
mock_knowledge_instance.sources = [string_source]
|
||||||
mock_knowledge_instance.search.return_value = [{"content": content}]
|
mock_knowledge_instance.search.return_value = [{"content": content}]
|
||||||
|
MockKnowledge.add_sources.return_value = [string_source]
|
||||||
|
|
||||||
agent = Agent(
|
agent = Agent(
|
||||||
role="Information Agent",
|
role="Information Agent",
|
||||||
@@ -1644,7 +1646,6 @@ def test_agent_with_knowledge_sources():
|
|||||||
knowledge_sources=[string_source],
|
knowledge_sources=[string_source],
|
||||||
)
|
)
|
||||||
|
|
||||||
# Create a task that requires the agent to use the knowledge
|
|
||||||
task = Task(
|
task = Task(
|
||||||
description="What is Brandon's favorite color?",
|
description="What is Brandon's favorite color?",
|
||||||
expected_output="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])
|
crew = Crew(agents=[agent], tasks=[task])
|
||||||
result = crew.kickoff()
|
with patch.object(Knowledge, "add_sources") as mock_add_sources:
|
||||||
|
result = crew.kickoff()
|
||||||
# Assert that the agent provides the correct information
|
assert mock_add_sources.called, "add_sources() should have been called"
|
||||||
assert "red" in result.raw.lower()
|
mock_add_sources.assert_called_once()
|
||||||
|
assert "red" in result.raw.lower()
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||||
|
|||||||
Reference in New Issue
Block a user