diff options
Diffstat (limited to 'autogpts/autogpt/autogpt/core/ability/base.py')
-rw-r--r-- | autogpts/autogpt/autogpt/core/ability/base.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/autogpts/autogpt/autogpt/core/ability/base.py b/autogpts/autogpt/autogpt/core/ability/base.py new file mode 100644 index 000000000..2686c101c --- /dev/null +++ b/autogpts/autogpt/autogpt/core/ability/base.py @@ -0,0 +1,88 @@ +import abc +from pprint import pformat +from typing import Any, ClassVar + +import inflection +from pydantic import Field + +from autogpt.core.configuration import SystemConfiguration +from autogpt.core.planning.simple import LanguageModelConfiguration +from autogpt.core.plugin.base import PluginLocation +from autogpt.core.resource.model_providers import CompletionModelFunction +from autogpt.core.utils.json_schema import JSONSchema + +from .schema import AbilityResult + + +class AbilityConfiguration(SystemConfiguration): + """Struct for model configuration.""" + + location: PluginLocation + packages_required: list[str] = Field(default_factory=list) + language_model_required: LanguageModelConfiguration = None + memory_provider_required: bool = False + workspace_required: bool = False + + +class Ability(abc.ABC): + """A class representing an agent ability.""" + + default_configuration: ClassVar[AbilityConfiguration] + + @classmethod + def name(cls) -> str: + """The name of the ability.""" + return inflection.underscore(cls.__name__) + + @property + @classmethod + @abc.abstractmethod + def description(cls) -> str: + """A detailed description of what the ability does.""" + ... + + @property + @classmethod + @abc.abstractmethod + def parameters(cls) -> dict[str, JSONSchema]: + ... + + @abc.abstractmethod + async def __call__(self, *args: Any, **kwargs: Any) -> AbilityResult: + ... + + def __str__(self) -> str: + return pformat(self.spec) + + @property + @classmethod + def spec(cls) -> CompletionModelFunction: + return CompletionModelFunction( + name=cls.name(), + description=cls.description, + parameters=cls.parameters, + ) + + +class AbilityRegistry(abc.ABC): + @abc.abstractmethod + def register_ability( + self, ability_name: str, ability_configuration: AbilityConfiguration + ) -> None: + ... + + @abc.abstractmethod + def list_abilities(self) -> list[str]: + ... + + @abc.abstractmethod + def dump_abilities(self) -> list[CompletionModelFunction]: + ... + + @abc.abstractmethod + def get_ability(self, ability_name: str) -> Ability: + ... + + @abc.abstractmethod + async def perform(self, ability_name: str, **kwargs: Any) -> AbilityResult: + ... |