Skip to content

Commit

Permalink
feat(agent): add agent group feature
Browse files Browse the repository at this point in the history
* Add `divider_and_conquer` strategy for using in agent members
* Add `AgentMember` class
* Add `AgentGroup` class
* Add `hire_agent` and `create_agent` and `create_task`
* Add `test_agent_group` as an intergration test with VCR
* Add `AgentTaskStatus` for flow of doing tasks
* Add `autogpt_multi_agent.sh` file to run autogpt in multi agent mode
  • Loading branch information
MKdir98 committed Mar 14, 2024
1 parent d5aa8d3 commit 7f2e413
Show file tree
Hide file tree
Showing 18 changed files with 2,872 additions and 15 deletions.
6 changes: 4 additions & 2 deletions autogpts/autogpt/autogpt/agents/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import time
from datetime import datetime
from typing import TYPE_CHECKING, Optional
from autogpt.core.configuration.schema import SystemConfiguration
from autogpt.core.prompting.base import PromptStrategy

if TYPE_CHECKING:
from autogpt.config import Config
Expand Down Expand Up @@ -63,7 +65,7 @@ class AgentConfiguration(BaseAgentConfiguration):

class AgentSettings(BaseAgentSettings):
config: AgentConfiguration = Field(default_factory=AgentConfiguration)
prompt_config: OneShotAgentPromptConfiguration = Field(
prompt_config: SystemConfiguration = Field(
default_factory=(
lambda: OneShotAgentPromptStrategy.default_configuration.copy(deep=True)
)
Expand All @@ -84,7 +86,7 @@ class Agent(
description=__doc__,
)

prompt_strategy: OneShotAgentPromptStrategy
prompt_strategy: PromptStrategy

def __init__(
self,
Expand Down
124 changes: 124 additions & 0 deletions autogpts/autogpt/autogpt/agents/agent_group.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
import sys
import logging
from typing import Optional
from uuid import uuid4
from autogpt.agent_factory.profile_generator import AgentProfileGenerator
from autogpt.agent_manager.agent_manager import AgentManager
from autogpt.agents.agent import Agent, AgentConfiguration
from autogpt.agents.agent_member import AgentMember, AgentMemberSettings
from autogpt.config.config import ConfigBuilder
from autogpt.core.resource.model_providers.openai import OpenAIProvider
from autogpt.core.resource.model_providers.schema import ChatModelProvider
from forge.sdk.model import ( Task, TaskRequestBody )

info = "-v" in sys.argv
debug = "-vv" in sys.argv
granular = "--granular" in sys.argv

logging.basicConfig(
level=logging.DEBUG if debug else logging.INFO if info else logging.WARNING
)
logger = logging.getLogger(__name__)


class AgentGroup:

leader: AgentMember
members: dict[str, AgentMember]

def assign_group_to_all_of_member(self):
self.leader.assign_group(self)

def create_list_of_members(self):
members = self.leader.get_list_of_all_your_team_members()
self.members = {}
for agent_member in members:
self.members[agent_member.id] = agent_member

def __init__(
self,
leader: AgentMember
):
self.leader = leader
self.assign_group_to_all_of_member()
self.create_list_of_members()

async def create_task(self, task: TaskRequestBody):
await self.leader.create_task(task)

async def create_agent_member(
role: str,
initial_prompt:str,
llm_provider: ChatModelProvider,
boss: Optional['AgentMember'] = None,
recruiter: Optional['AgentMember'] = None,
create_agent: bool = False,
) -> Optional[AgentMember]:
config = ConfigBuilder.build_config_from_env()
config.logging.plain_console_output = True

config.continuous_mode = False
config.continuous_limit = 20
config.noninteractive_mode = True
config.memory_backend = "no_memory"
settings = await generate_agent_profile_for_task(
task=initial_prompt,
app_config=config,
llm_provider=llm_provider
)
settings.agent_id = str(uuid4())

agent_member = AgentMember(
role=role,
initial_prompt=initial_prompt,
settings=settings,
boss=boss,
recruiter=recruiter,
create_agent=create_agent,
llm_provider=llm_provider,
)

agent_manager = AgentManager(config.app_data_dir)
agent_member.attach_fs(agent_manager.get_agent_dir(agent_member.id))

if boss:
boss.members.append(agent_member)

return agent_member

async def generate_agent_profile_for_task(
task: str,
llm_provider: ChatModelProvider,
app_config
) -> AgentMemberSettings:
agent_profile_generator = AgentProfileGenerator(
**AgentProfileGenerator.default_configuration.dict() # HACK
)

prompt = agent_profile_generator.build_prompt(task)
output = (
await llm_provider.create_chat_completion(
prompt.messages,
model_name=app_config.smart_llm,
functions=prompt.functions,
)
).response

ai_profile, ai_directives = agent_profile_generator.parse_response_content(output)


return AgentMemberSettings(
name=Agent.default_settings.name,
description=Agent.default_settings.description,
task=task,
ai_profile=ai_profile,
directives=ai_directives,
config=AgentConfiguration(
fast_llm=app_config.fast_llm,
smart_llm=app_config.smart_llm,
allow_fs_access=not app_config.restrict_to_workspace,
use_functions_api=app_config.openai_functions,
plugins=app_config.plugins,
),
history=Agent.default_settings.history.copy(deep=True),
)

0 comments on commit 7f2e413

Please sign in to comment.