diff --git a/src/crewai/agent.py b/src/crewai/agent.py index 75e20f37d..4779aa196 100644 --- a/src/crewai/agent.py +++ b/src/crewai/agent.py @@ -137,7 +137,16 @@ class Agent(BaseAgent): # If this is a manager agent, ensure it only has delegation tools if self.role == "Manager" and self.allow_delegation and self.crew: - self.tools = self.get_delegation_tools(self.crew.agents) + try: + self.tools = self.get_delegation_tools(self.crew.agents) + self._logger.log( + "info", + f"Manager agent has delegation tools: {[tool.name for tool in self.tools]}", + color="blue", + ) + except Exception as e: + self._logger.log("error", f"Failed to set delegation tools: {str(e)}", color="red") + raise ValueError(f"Failed to set delegation tools: {str(e)}") return self diff --git a/src/crewai/crew.py b/src/crewai/crew.py index bc192f4b2..51d803073 100644 --- a/src/crewai/crew.py +++ b/src/crewai/crew.py @@ -694,14 +694,18 @@ class Crew(BaseModel): if self.manager_agent is not None: manager = self.manager_agent manager.allow_delegation = True - # Only use delegation tools for manager agent - delegation_tools = AgentTools(agents=self.agents).tools() - manager.tools = delegation_tools - self._logger.log( - "info", - f"Manager agent has delegation tools: {[tool.name for tool in manager.tools]}", - color="blue", - ) + manager.crew = self + try: + delegation_tools = AgentTools(agents=self.agents).tools() + manager.tools = delegation_tools + self._logger.log( + "info", + f"Manager agent has delegation tools: {[tool.name for tool in manager.tools]}", + color="blue", + ) + except Exception as e: + self._logger.log("error", f"Failed to set manager tools: {str(e)}", color="red") + raise ValueError(f"Failed to set manager tools: {str(e)}") else: self.manager_llm = create_llm(self.manager_llm) manager = Agent( @@ -714,9 +718,19 @@ class Crew(BaseModel): verbose=self.verbose, ) self.manager_agent = manager - # Set delegation tools after initialization - manager.tools = AgentTools(agents=self.agents).tools() - manager.crew = self + manager.crew = self + try: + delegation_tools = AgentTools(agents=self.agents).tools() + manager.tools = delegation_tools + self._logger.log( + "info", + f"Manager agent has delegation tools: {[tool.name for tool in manager.tools]}", + color="blue", + ) + except Exception as e: + self._logger.log("error", f"Failed to set manager tools: {str(e)}", color="red") + raise ValueError(f"Failed to set manager tools: {str(e)}") + def _execute_tasks( self, diff --git a/src/crewai/task.py b/src/crewai/task.py index 4088c3fb0..d5faf0d62 100644 --- a/src/crewai/task.py +++ b/src/crewai/task.py @@ -358,6 +358,10 @@ class Task(BaseModel): self.start_time = datetime.datetime.now() self._execution_span = self._telemetry.task_started(crew=agent.crew, task=self) + # Track delegation if this task is being executed by a different agent + if self.agent and agent.role != self.agent.role: + self.increment_delegations(agent.role) + self.prompt_context = context tools = tools or self.tools or [] diff --git a/src/crewai/tools/agent_tools/agent_tools.py b/src/crewai/tools/agent_tools/agent_tools.py index 16a8ff51f..5a6ba58c0 100644 --- a/src/crewai/tools/agent_tools/agent_tools.py +++ b/src/crewai/tools/agent_tools/agent_tools.py @@ -6,6 +6,11 @@ from .ask_question_tool import AskQuestionTool from .delegate_work_tool import DelegateWorkTool +# Tool name constants +DELEGATE_WORK_TOOL = "Delegate Work" +ASK_QUESTION_TOOL = "Ask Question" + + class AgentTools: """Manager class for agent-related tools""" @@ -21,14 +26,14 @@ class AgentTools: agents=self.agents, i18n=self.i18n, description=self.i18n.tools("delegate_work").format(coworkers=coworkers), # type: ignore - name="Delegate Work" + name=DELEGATE_WORK_TOOL # Using constant for consistency ) ask_tool = AskQuestionTool( agents=self.agents, i18n=self.i18n, description=self.i18n.tools("ask_question").format(coworkers=coworkers), # type: ignore - name="Ask Question" + name=ASK_QUESTION_TOOL # Using constant for consistency ) return [delegate_tool, ask_tool]