diff --git a/src/crewai/task.py b/src/crewai/task.py index ebf284317..9c48eda1b 100644 --- a/src/crewai/task.py +++ b/src/crewai/task.py @@ -336,12 +336,6 @@ class Task(BaseModel): setattr(self, key, value) return self - @model_validator(mode="after") - def check_tools(self): - """Check if the tools are set.""" - if not self.tools and self.agent and self.agent.tools: - self.tools.extend(self.agent.tools) - return self @model_validator(mode="after") def check_output(self): diff --git a/tests/test_crew.py b/tests/test_crew.py index 0a9b94695..26a434967 100644 --- a/tests/test_crew.py +++ b/tests/test_crew.py @@ -3814,6 +3814,46 @@ def test_fetch_inputs(): ) +def test_hierarchical_crew_does_not_propagate_agent_tools_to_manager(): + """ + Test that in hierarchical crews, manager agent doesn't inherit task agents' tools. + This verifies that the check_tools validator doesn't pollute task.tools at creation time. + Fixes issue #3679: https://github.com/crewAIInc/crewAI/issues/3679 + """ + from crewai.tools import tool + + @tool + def agent_specific_tool() -> str: + """A tool that should only be available to the specific agent.""" + return "agent specific result" + + agent_with_tools = Agent( + role="Specialist", + goal="Do specialized work with custom tools", + backstory="You are a specialist with specific tools", + tools=[agent_specific_tool], + allow_delegation=False, + ) + + # Create a task with an agent that has tools, but don't assign tools to the task + task = Task( + description="Perform a specialized task", + expected_output="Task result", + agent=agent_with_tools, + ) + + crew = Crew( + agents=[agent_with_tools], + tasks=[task], + process=Process.hierarchical, + manager_llm="gpt-4o", + ) + + # Verify that task.tools is empty (not populated with agent's tools) + assert task.tools == [] + assert len(task.tools) == 0 + + def test_task_tools_preserve_code_execution_tools(): """ Test that task tools don't override code execution tools when allow_code_execution=True diff --git a/tests/test_task.py b/tests/test_task.py index 0e304df54..7ab87e99d 100644 --- a/tests/test_task.py +++ b/tests/test_task.py @@ -20,11 +20,13 @@ from crewai.utilities.string_utils import interpolate_only def test_task_tool_reflect_agent_tools(): + """Test that agent tools are available during task execution via crew fallback logic.""" from crewai.tools import tool @tool - def fake_tool() -> None: + def fake_tool() -> str: "Fake tool" + return "result" researcher = Agent( role="Researcher", @@ -40,7 +42,9 @@ def test_task_tool_reflect_agent_tools(): agent=researcher, ) - assert task.tools == [fake_tool] + assert task.tools == [] + + assert researcher.tools == [fake_tool] def test_task_tool_takes_precedence_over_agent_tools():