aboutsummaryrefslogtreecommitdiff
path: root/autogpts/autogpt/autogpt/agent_manager/agent_manager.py
blob: dc3bc646187a53019b3cad02683ef7591128fcec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from __future__ import annotations

import uuid
from pathlib import Path
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from autogpt.agents.agent import AgentSettings

from autogpt.agents.utils.agent_file_manager import AgentFileManager


class AgentManager:
    def __init__(self, app_data_dir: Path):
        self.agents_dir = app_data_dir / "agents"
        if not self.agents_dir.exists():
            self.agents_dir.mkdir()

    @staticmethod
    def generate_id(agent_name: str) -> str:
        unique_id = str(uuid.uuid4())[:8]
        return f"{agent_name}-{unique_id}"

    def list_agents(self) -> list[str]:
        return [
            dir.name
            for dir in self.agents_dir.iterdir()
            if dir.is_dir() and AgentFileManager(dir).state_file_path.exists()
        ]

    def get_agent_dir(self, agent_id: str, must_exist: bool = False) -> Path:
        agent_dir = self.agents_dir / agent_id
        if must_exist and not agent_dir.exists():
            raise FileNotFoundError(f"No agent with ID '{agent_id}'")
        return agent_dir

    def retrieve_state(self, agent_id: str) -> AgentSettings:
        from autogpt.agents.agent import AgentSettings

        agent_dir = self.get_agent_dir(agent_id, True)
        state_file = AgentFileManager(agent_dir).state_file_path
        if not state_file.exists():
            raise FileNotFoundError(f"Agent with ID '{agent_id}' has no state.json")

        state = AgentSettings.load_from_json_file(state_file)
        state.agent_data_dir = agent_dir
        return state