mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-24 23:58:15 +00:00
Improve code quality with better import sorting and test organization
Co-Authored-By: Joe Moura <joao@crewai.com>
This commit is contained in:
@@ -2,7 +2,10 @@ import asyncio
|
|||||||
import copy
|
import copy
|
||||||
import inspect
|
import inspect
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
# Forward reference for type hints
|
||||||
from typing import (
|
from typing import (
|
||||||
|
TYPE_CHECKING,
|
||||||
Any,
|
Any,
|
||||||
Callable,
|
Callable,
|
||||||
Dict,
|
Dict,
|
||||||
@@ -17,8 +20,6 @@ from typing import (
|
|||||||
)
|
)
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
# Forward reference for type hints
|
|
||||||
from typing import TYPE_CHECKING
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from crewai.agent import Agent
|
from crewai.agent import Agent
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ from crewai.tools import BaseTool
|
|||||||
class TestToolInput(BaseModel):
|
class TestToolInput(BaseModel):
|
||||||
query: str = Field(..., description='Query to process')
|
query: str = Field(..., description='Query to process')
|
||||||
|
|
||||||
|
|
||||||
class TestTool(BaseTool):
|
class TestTool(BaseTool):
|
||||||
name: str = 'Test Tool'
|
name: str = 'Test Tool'
|
||||||
description: str = 'A test tool to demonstrate the issue'
|
description: str = 'A test tool to demonstrate the issue'
|
||||||
@@ -21,63 +22,112 @@ class TestTool(BaseTool):
|
|||||||
def _run(self, query: str) -> str:
|
def _run(self, query: str) -> str:
|
||||||
return f'Result for query: {query}'
|
return f'Result for query: {query}'
|
||||||
|
|
||||||
def test_flow_tool_result_as_answer():
|
|
||||||
"""Test that tools with result_as_answer=True are properly processed in Flow mode."""
|
|
||||||
# Create a test tool
|
|
||||||
test_tool = TestTool()
|
|
||||||
|
|
||||||
# Create a test agent with the tool
|
|
||||||
agent = Agent(
|
|
||||||
role='Tester',
|
|
||||||
goal='Test tools',
|
|
||||||
backstory='Testing tools in Flow vs Crew',
|
|
||||||
tools=[test_tool]
|
|
||||||
)
|
|
||||||
|
|
||||||
# Create a task with the tool
|
class TestFlowToolResult:
|
||||||
task = Task(
|
"""Test suite for Flow tool result handling."""
|
||||||
description='Test task using the tool',
|
|
||||||
expected_output='Test output',
|
|
||||||
agent=agent,
|
|
||||||
tools=[test_tool]
|
|
||||||
)
|
|
||||||
|
|
||||||
# Create a simple Flow with direct access to the agent
|
@pytest.fixture
|
||||||
class SimpleFlow(Flow):
|
def test_tool(self):
|
||||||
def __init__(self):
|
"""Create a test tool with result_as_answer=True."""
|
||||||
super().__init__()
|
return TestTool()
|
||||||
self.test_agent = agent
|
|
||||||
|
@pytest.fixture
|
||||||
@start()
|
def test_agent(self, test_tool):
|
||||||
def start_task(self):
|
"""Create a test agent with the tool."""
|
||||||
return 'Task started'
|
return Agent(
|
||||||
|
role='Tester',
|
||||||
@listen('start_task')
|
goal='Test tools',
|
||||||
@Flow.with_agent(agent) # Associate the agent with this method
|
backstory='Testing tools in Flow vs Crew',
|
||||||
def execute_task(self):
|
tools=[test_tool]
|
||||||
# Simulate tool execution and setting tools_results
|
)
|
||||||
self.test_agent.tools_results = [{
|
|
||||||
"name": "Test Tool",
|
@pytest.fixture
|
||||||
"input": {"query": "test"},
|
def test_task(self, test_agent, test_tool):
|
||||||
"result": "Result for query: test",
|
"""Create a task with the tool."""
|
||||||
"result_as_answer": True
|
return Task(
|
||||||
}]
|
description='Test task using the tool',
|
||||||
return "Agent task execution result"
|
expected_output='Test output',
|
||||||
|
agent=test_agent,
|
||||||
|
tools=[test_tool]
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_flow_tool_result_as_answer(self, test_agent, test_task):
|
||||||
|
"""Test that tools with result_as_answer=True are properly processed in Flow mode."""
|
||||||
|
# Create a simple Flow with direct access to the agent
|
||||||
|
class SimpleFlow(Flow):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.test_agent = test_agent
|
||||||
|
|
||||||
|
@start()
|
||||||
|
def start_task(self):
|
||||||
|
return 'Task started'
|
||||||
|
|
||||||
|
@listen('start_task')
|
||||||
|
@Flow.with_agent(test_agent) # Associate the agent with this method
|
||||||
|
def execute_task(self):
|
||||||
|
# Simulate tool execution and setting tools_results
|
||||||
|
self.test_agent.tools_results = [{
|
||||||
|
"name": "Test Tool",
|
||||||
|
"input": {"query": "test"},
|
||||||
|
"result": "Result for query: test",
|
||||||
|
"result_as_answer": True
|
||||||
|
}]
|
||||||
|
return "Agent task execution result"
|
||||||
|
|
||||||
# Create a mock for Crew to return the same result
|
# Create a mock for Crew to return the same result
|
||||||
with patch('crewai.crew.Crew.kickoff') as mock_crew_kickoff:
|
with patch('crewai.crew.Crew.kickoff') as mock_crew_kickoff:
|
||||||
mock_crew_kickoff.return_value = "Result for query: test"
|
mock_crew_kickoff.return_value = "Result for query: test"
|
||||||
|
|
||||||
# Test Flow
|
# Test Flow
|
||||||
|
flow = SimpleFlow()
|
||||||
|
flow_result = flow.kickoff()
|
||||||
|
|
||||||
|
# Verify that Flow returns the tool result with our fix
|
||||||
|
assert flow_result == "Result for query: test", "Flow should return tool result with result_as_answer=True"
|
||||||
|
|
||||||
|
# Test Crew
|
||||||
|
crew = Crew(agents=[test_agent], tasks=[test_task])
|
||||||
|
crew_result = crew.kickoff()
|
||||||
|
|
||||||
|
# Verify that Crew returns the tool result
|
||||||
|
assert crew_result == "Result for query: test", "Crew should return tool result with result_as_answer=True"
|
||||||
|
|
||||||
|
def test_flow_multiple_tool_results(self, test_agent, test_task):
|
||||||
|
"""Test handling of multiple tool results with result_as_answer=True."""
|
||||||
|
# Create a simple Flow with direct access to the agent
|
||||||
|
class SimpleFlow(Flow):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.test_agent = test_agent
|
||||||
|
|
||||||
|
@start()
|
||||||
|
def start_task(self):
|
||||||
|
return 'Task started'
|
||||||
|
|
||||||
|
@listen('start_task')
|
||||||
|
@Flow.with_agent(test_agent)
|
||||||
|
def execute_task(self):
|
||||||
|
# Simulate multiple tool executions with result_as_answer=True
|
||||||
|
self.test_agent.tools_results = [
|
||||||
|
{
|
||||||
|
"name": "Test Tool 1",
|
||||||
|
"input": {"query": "test1"},
|
||||||
|
"result": "Result for query: test1",
|
||||||
|
"result_as_answer": True
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Test Tool 2",
|
||||||
|
"input": {"query": "test2"},
|
||||||
|
"result": "Result for query: test2",
|
||||||
|
"result_as_answer": True
|
||||||
|
}
|
||||||
|
]
|
||||||
|
return "Agent task execution result"
|
||||||
|
|
||||||
|
# Test Flow with multiple tool results
|
||||||
flow = SimpleFlow()
|
flow = SimpleFlow()
|
||||||
flow_result = flow.kickoff()
|
flow_result = flow.kickoff()
|
||||||
|
|
||||||
# Verify that Flow returns the tool result with our fix
|
# Verify that Flow returns the first tool result with result_as_answer=True
|
||||||
assert flow_result == "Result for query: test", "Flow should return tool result with result_as_answer=True"
|
assert flow_result == "Result for query: test1", "Flow should return the first tool result with result_as_answer=True"
|
||||||
|
|
||||||
# Test Crew
|
|
||||||
crew = Crew(agents=[agent], tasks=[task])
|
|
||||||
crew_result = crew.kickoff()
|
|
||||||
|
|
||||||
# Verify that Crew returns the tool result
|
|
||||||
assert crew_result == "Result for query: test", "Crew should return tool result with result_as_answer=True"
|
|
||||||
|
|||||||
Reference in New Issue
Block a user