aboutsummaryrefslogtreecommitdiff
path: root/autogpts/autogpt/autogpt/core/plugin/base.py
diff options
context:
space:
mode:
Diffstat (limited to 'autogpts/autogpt/autogpt/core/plugin/base.py')
-rw-r--r--autogpts/autogpt/autogpt/core/plugin/base.py162
1 files changed, 162 insertions, 0 deletions
diff --git a/autogpts/autogpt/autogpt/core/plugin/base.py b/autogpts/autogpt/autogpt/core/plugin/base.py
new file mode 100644
index 000000000..4066a18c0
--- /dev/null
+++ b/autogpts/autogpt/autogpt/core/plugin/base.py
@@ -0,0 +1,162 @@
+import abc
+import enum
+from typing import TYPE_CHECKING, Type
+
+from pydantic import BaseModel
+
+from autogpt.core.configuration import SystemConfiguration, UserConfigurable
+
+if TYPE_CHECKING:
+ from autogpt.core.ability import Ability, AbilityRegistry
+ from autogpt.core.memory import Memory
+ from autogpt.core.resource.model_providers import (
+ ChatModelProvider,
+ EmbeddingModelProvider,
+ )
+
+ # Expand to other types as needed
+ PluginType = (
+ Type[Ability] # Swappable now
+ | Type[AbilityRegistry] # Swappable maybe never
+ | Type[ChatModelProvider] # Swappable soon
+ | Type[EmbeddingModelProvider] # Swappable soon
+ | Type[Memory] # Swappable now
+ # | Type[Planner] # Swappable soon
+ )
+
+
+class PluginStorageFormat(str, enum.Enum):
+ """Supported plugin storage formats.
+
+ Plugins can be stored at one of these supported locations.
+
+ """
+
+ INSTALLED_PACKAGE = "installed_package" # Required now, loads system defaults
+ WORKSPACE = "workspace" # Required now
+
+ # Soon (requires some tooling we don't have yet).
+ # OPENAPI_URL = "open_api_url"
+
+ # OTHER_FILE_PATH = "other_file_path" # Maybe later (maybe now)
+ # GIT = "git" # Maybe later (or soon)
+ # PYPI = "pypi" # Maybe later
+
+ # Long term solution, requires design
+ # AUTOGPT_PLUGIN_SERVICE = "autogpt_plugin_service"
+
+ # Feature for later maybe, automatically find plugin.
+ # AUTO = "auto"
+
+
+# Installed package example
+# PluginLocation(
+# storage_format='installed_package',
+# storage_route='autogpt_plugins.twitter.SendTwitterMessage'
+# )
+# Workspace example
+# PluginLocation(
+# storage_format='workspace',
+# storage_route='relative/path/to/plugin.pkl'
+# OR
+# storage_route='relative/path/to/plugin.py'
+# )
+# Git
+# PluginLocation(
+# storage_format='git',
+# Exact format TBD.
+# storage_route='https://github.com/gravelBridge/AutoGPT-WolframAlpha/blob/main/autogpt-wolframalpha/wolfram_alpha.py'
+# )
+# PyPI
+# PluginLocation(
+# storage_format='pypi',
+# storage_route='package_name'
+# )
+
+
+# PluginLocation(
+# storage_format='installed_package',
+# storage_route='autogpt_plugins.twitter.SendTwitterMessage'
+# )
+
+
+# A plugin storage route.
+#
+# This is a string that specifies where to load a plugin from
+# (e.g. an import path or file path).
+PluginStorageRoute = str
+
+
+class PluginLocation(SystemConfiguration):
+ """A plugin location.
+
+ This is a combination of a plugin storage format and a plugin storage route.
+ It is used by the PluginService to load plugins.
+
+ """
+
+ storage_format: PluginStorageFormat = UserConfigurable()
+ storage_route: PluginStorageRoute = UserConfigurable()
+
+
+class PluginMetadata(BaseModel):
+ """Metadata about a plugin."""
+
+ name: str
+ description: str
+ location: PluginLocation
+
+
+class PluginService(abc.ABC):
+ """Base class for plugin service.
+
+ The plugin service should be stateless. This defines the interface for
+ loading plugins from various storage formats.
+
+ """
+
+ @staticmethod
+ @abc.abstractmethod
+ def get_plugin(plugin_location: PluginLocation) -> "PluginType":
+ """Get a plugin from a plugin location."""
+ ...
+
+ ####################################
+ # Low-level storage format loaders #
+ ####################################
+ @staticmethod
+ @abc.abstractmethod
+ def load_from_file_path(plugin_route: PluginStorageRoute) -> "PluginType":
+ """Load a plugin from a file path."""
+
+ ...
+
+ @staticmethod
+ @abc.abstractmethod
+ def load_from_import_path(plugin_route: PluginStorageRoute) -> "PluginType":
+ """Load a plugin from an import path."""
+ ...
+
+ @staticmethod
+ @abc.abstractmethod
+ def resolve_name_to_path(
+ plugin_route: PluginStorageRoute, path_type: str
+ ) -> PluginStorageRoute:
+ """Resolve a plugin name to a plugin path."""
+ ...
+
+ #####################################
+ # High-level storage format loaders #
+ #####################################
+
+ @staticmethod
+ @abc.abstractmethod
+ def load_from_workspace(plugin_route: PluginStorageRoute) -> "PluginType":
+ """Load a plugin from the workspace."""
+ ...
+
+ @staticmethod
+ @abc.abstractmethod
+ def load_from_installed_package(plugin_route: PluginStorageRoute) -> "PluginType":
+ """Load a plugin from an installed package."""
+ ...