Spaces:
Running
Running
| """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 | |