"""Agent manager for managing GPT agents""" from __future__ import annotations from typing import Union from autogpt.config.config import Singleton from autogpt.llm_utils import create_chat_completion class AgentManager(metaclass=Singleton): """Agent manager for managing GPT agents""" def __init__(self): self.next_key = 0 self.agents = {} # key, (task, full_message_history, model) # Create new GPT agent # TODO: Centralise use of create_chat_completion() to globally enforce token limit def create_agent(self, task: str, prompt: str, model: str) -> tuple[int, str]: """Create a new agent and return its key Args: task: The task to perform prompt: The prompt to use model: The model to use Returns: The key of the new agent """ messages = [ {"role": "user", "content": prompt}, ] # Start GPT instance agent_reply = create_chat_completion( model=model, messages=messages, ) # Update full message history messages.append({"role": "assistant", "content": agent_reply}) key = self.next_key # This is done instead of len(agents) to make keys unique even if agents # are deleted self.next_key += 1 self.agents[key] = (task, messages, model) return key, agent_reply def message_agent(self, key: str | int, message: str) -> str: """Send a message to an agent and return its response Args: key: The key of the agent to message message: The message to send to the agent Returns: The agent's response """ task, messages, model = self.agents[int(key)] # Add user message to message history before sending to agent messages.append({"role": "user", "content": message}) # Start GPT instance agent_reply = create_chat_completion( model=model, messages=messages, ) # Update full message history messages.append({"role": "assistant", "content": agent_reply}) return agent_reply def list_agents(self) -> list[tuple[str | int, str]]: """Return a list of all agents Returns: A list of tuples of the form (key, task) """ # Return a list of agent keys and their tasks return [(key, task) for key, (task, _, _) in self.agents.items()] def delete_agent(self, key: Union[str, int]) -> bool: """Delete an agent from the agent manager Args: key: The key of the agent to delete Returns: True if successful, False otherwise """ try: del self.agents[int(key)] return True except KeyError: return False