Improve code quality with better import sorting and test organization

Co-Authored-By: Joe Moura <joao@crewai.com>
This commit is contained in:
Devin AI
2025-03-12 13:27:10 +00:00
parent 8ce05791d9
commit dd1b812a7f
2 changed files with 107 additions and 56 deletions

View File

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

View File

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