initial autonomous

This commit is contained in:
João Moura
2024-05-14 14:59:45 -03:00
parent 38fc5510ed
commit 9841d57216
4 changed files with 78 additions and 34 deletions

View File

@@ -1,7 +1,9 @@
import os
import json
import uuid
from typing import Any, Dict, List, Optional, Union
from langchain_openai import ChatOpenAI
from langchain_core.callbacks import BaseCallbackHandler
from pydantic import (
UUID4,
@@ -27,7 +29,6 @@ from crewai.telemetry import Telemetry
from crewai.tools.agent_tools import AgentTools
from crewai.utilities import I18N, FileHandler, Logger, RPMController
class Crew(BaseModel):
"""
Represents a group of agents, defining how they should collaborate and the tasks they should perform.
@@ -101,6 +102,15 @@ class Crew(BaseModel):
config: Optional[Union[Json, Dict[str, Any]]] = Field(default=None)
id: UUID4 = Field(default_factory=uuid.uuid4, frozen=True)
share_crew: Optional[bool] = Field(default=False)
autonomous_llm: Optional[Any] = Field(
default_factory=lambda: ChatOpenAI(
model=os.environ.get("OPENAI_MODEL_NAME", "gpt-4")
),
description="Language model that will used for agents dinamycally created.",
)
autonomous_tools: Optional[List[Any]] = Field(
default_factory=list, description="Tools at agents disposal when dinamically generated."
)
step_callback: Optional[Any] = Field(
default=None,
description="Callback to be executed after each step for all agents execution.",
@@ -266,6 +276,10 @@ class Crew(BaseModel):
result, manager_metrics = self._run_hierarchical_process() # type: ignore # Unpacking a string is disallowed
metrics.append(manager_metrics) # type: ignore # Cannot determine type of "manager_metrics"
result, manager_metrics = self._run_hierarchical_process()
metrics.append(manager_metrics)
elif self.process == Process.autonomous:
result = self._run_autonomous_process()
else:
raise NotImplementedError(
f"The process '{self.process}' is not implemented yet."
@@ -315,6 +329,61 @@ class Crew(BaseModel):
self._finish_execution(task_output)
return self._format_output(task_output)
def _run_autonomous_process(self) -> str:
"""Executes high level tasks by automatically creating agents and tasks for achieving an initial task"""
from crewai.internal.crew.planning_crew.crew import PlanningCrewCrew
#task_output = ""
# Need to decide how to break the initial task into smaller tasks
# Need to decide on what agents to create to fullfill the tasks
# Need to decide what process to use, whether sequential or hierarchical
# Need to decide on what tools to use for the agents
import pkgutil
import inspect
import crewai_tools
def list_crewai_tools():
tool_list = []
for importer, modname, ispkg in pkgutil.iter_modules(crewai_tools.__path__):
module = importer.find_module(modname).load_module(modname)
for name, obj in inspect.getmembers(module, inspect.isclass):
if obj.__module__ == module.__name__:
tool_list.append(name)
return tool_list
# Get the list of tools
tools = list_crewai_tools()
descriptions = []
for tool in tools:
args = {
k: {k2: v2 for k2, v2 in v.items() if k2 in ["description", "type"]}
for k, v in tool.args.items()
}
descriptions.append(
"\n".join(
[
f"Tool Name: {tool.name.lower()}",
f"Tool Description: {tool.description}",
f"Tool Arguments: {args}",
]
)
)
descriptions = "\n--\n".join(descriptions)
print(descriptions)
crew = PlanningCrewCrew().crew()
for task in self.tasks:
crew.kickoff({
"task": task.description,
"goal": task.expected_output,
"tools_list": descriptions
})
def _run_hierarchical_process(self) -> str:
"""Creates and assigns a manager agent to make sure the crew completes the tasks."""
@@ -364,6 +433,7 @@ class Crew(BaseModel):
for task in self.tasks:
if not task.callback:
task.callback = self.task_callback
task.callback = self.task_callback
def _interpolate_inputs(self, inputs: Dict[str, Any]) -> None:
"""Interpolates the inputs in the tasks and agents."""

View File

@@ -6,6 +6,7 @@ class Process(str, Enum):
Class representing the different processes that can be used to tackle tasks
"""
autonomous = "autonomous"
sequential = "sequential"
hierarchical = "hierarchical"
# TODO: consensual = 'consensual'

View File

@@ -4,6 +4,11 @@
"goal": "Manage the team to complete the task in the best way possible.",
"backstory": "You are a seasoned manager with a knack for getting the best out of your team.\nYou are also known for your ability to delegate work to the right people, and to ask the right questions to get the best out of your team.\nEven though you don't perform tasks by yourself, you have a lot of experience in the field, which allows you to properly evaluate the work of your team members."
},
"planning_manager_agent": {
"role": "Crew Creator",
"goal": "Do the best most granular break down of a final goal into tasks and agents to complete them.",
"backstory": "You are a very seasoned manager very capable of breaking goals into smaller tasks and recruiting the right people to complete them.\n You are also great at set expectation for the team you recruit and provide them with the best tools for their work."
},
"slices": {
"observation": "\nObservation",
"task": "\nCurrent Task: {input}\n\nBegin! This is VERY important to you, use the tools available and give your best Final Answer, your job depends on it!\n\nThought:",

View File

@@ -960,36 +960,4 @@ def test_manager_agent_in_agents_raises_exception():
process=Process.hierarchical,
manager_agent=manager,
tasks=[task],
)
def test_manager_agent_with_tools_raises_exception():
from crewai_tools import tool
@tool
def testing_tool(first_number: int, second_number: int) -> int:
"""Useful for when you need to multiply two numbers together."""
return first_number * second_number
task = Task(
description="Come up with a list of 5 interesting ideas to explore for an article, then write one amazing paragraph highlight for each idea that showcases how good an article about this topic could be. Return the list of ideas with their paragraph and your notes.",
expected_output="5 bullet points with a paragraph for each idea.",
)
manager = Agent(
role="Manager",
goal="Manage the crew and ensure the tasks are completed efficiently.",
backstory="You're an experienced manager, skilled in overseeing complex projects and guiding teams to success. Your role is to coordinate the efforts of the crew members, ensuring that each task is completed on time and to the highest standard.",
allow_delegation=False,
tools=[testing_tool],
)
crew = Crew(
agents=[researcher, writer],
process=Process.hierarchical,
manager_agent=manager,
tasks=[task],
)
with pytest.raises(Exception):
crew.kickoff()
)