mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-10 00:28:31 +00:00
Add support to delegate work
This commit is contained in:
@@ -4,6 +4,7 @@ from pydantic.v1 import BaseModel, Field
|
||||
from .process import Process
|
||||
from .agent import Agent
|
||||
from .task import Task
|
||||
from .tools.agent_tools import AgentTools
|
||||
|
||||
class Crew(BaseModel):
|
||||
"""
|
||||
@@ -35,6 +36,10 @@ class Crew(BaseModel):
|
||||
"""
|
||||
task_outcome = None
|
||||
for task in self.tasks:
|
||||
# Add delegation tools to the task if the agent allows it
|
||||
if task.agent.allow_delegation:
|
||||
tools = AgentTools(agents=self.agents).tools()
|
||||
task.tools += tools
|
||||
task_outcome = task.execute(task_outcome)
|
||||
|
||||
return task_outcome
|
||||
@@ -22,17 +22,21 @@ class Task(BaseModel):
|
||||
|
||||
@root_validator(pre=False)
|
||||
def _set_tools(cls, values):
|
||||
if values.get('agent'):
|
||||
values['tools'] = values.get('agent.tools')
|
||||
if (values.get('agent')) and not (values.get('tools')):
|
||||
values['tools'] = values.get('agent').tools
|
||||
return values
|
||||
|
||||
def execute(self, context) -> str:
|
||||
def execute(self, context: str = None) -> str:
|
||||
"""
|
||||
Execute the task.
|
||||
Returns:
|
||||
output (str): Output of the task.
|
||||
"""
|
||||
if self.agent:
|
||||
return self.agent.execute_task(self.description, context)
|
||||
return self.agent.execute_task(
|
||||
task = self.description,
|
||||
context = context,
|
||||
tools = self.tools
|
||||
)
|
||||
else:
|
||||
raise Exception(f"The task '{self.description}' has no agent assigned, therefore it can't be executed directly and should be executed in a Crew using a specific process that support that, either consensual or hierarchical.")
|
||||
57
crewai/tools/agent_tools.py
Normal file
57
crewai/tools/agent_tools.py
Normal file
@@ -0,0 +1,57 @@
|
||||
from typing import List, Any
|
||||
from pydantic.v1 import BaseModel, Field
|
||||
from textwrap import dedent
|
||||
from langchain.tools import Tool
|
||||
|
||||
from ..agent import Agent
|
||||
|
||||
class AgentTools(BaseModel):
|
||||
"""Tools for generic agent."""
|
||||
agents: List[Agent] = Field(description="List of agents in this crew.")
|
||||
|
||||
def tools(self):
|
||||
return [
|
||||
Tool.from_function(
|
||||
func=self.delegate_work,
|
||||
name="Delegate Work to Co-Worker",
|
||||
description=dedent(f"""Useful to delegate a specific task to one of the
|
||||
following co-workers: [{', '.join([agent.role for agent in self.agents])}].
|
||||
The input to this tool should be a pipe (|) separated text of length
|
||||
three, representing the role you want to delegate it to, the task and
|
||||
information necessary. For example, `coworker|task|information`.
|
||||
""")
|
||||
),
|
||||
Tool.from_function(
|
||||
func=self.ask_question,
|
||||
name="Ask Question to Co-Worker",
|
||||
description=dedent(f"""Useful to ask a question, opinion or take from on
|
||||
of the following co-workers: [{', '.join([agent.role for agent in self.agents])}].
|
||||
The input to this tool should be a pipe (|) separated text of length
|
||||
three, representing the role you want to ask it to, the question and
|
||||
information necessary. For example, `coworker|question|information`.
|
||||
""")
|
||||
),
|
||||
]
|
||||
|
||||
def delegate_work(self, command):
|
||||
"""Useful to delegate a specific task to a coworker."""
|
||||
return self.__execute(command)
|
||||
|
||||
def ask_question(self, command):
|
||||
"""Useful to ask a question, opinion or take from a coworker."""
|
||||
return self.__execute(command)
|
||||
|
||||
def __execute(self, command):
|
||||
"""Execute the command."""
|
||||
agent, task, information = command.split("|")
|
||||
if not agent or not task or not information:
|
||||
return "Error executing tool."
|
||||
|
||||
agent = [available_agent for available_agent in self.agents if available_agent.role == agent]
|
||||
|
||||
if len(agent) == 0:
|
||||
return "Error executing tool."
|
||||
|
||||
agent = agent[0]
|
||||
result = agent.execute_task(task, information)
|
||||
return result
|
||||
Reference in New Issue
Block a user