fix: Add error handling and consolidate tool assignment logic

Co-Authored-By: Joe Moura <joao@crewai.com>
This commit is contained in:
Devin AI
2025-02-14 20:32:16 +00:00
parent e4282f7c53
commit 26751bb2cb
4 changed files with 46 additions and 14 deletions

View File

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

View File

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

View File

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

View File

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