mirror of
https://github.com/aljazceru/Auto-GPT.git
synced 2026-01-04 14:54:32 +01:00
Rough sketching out of a hello world using our refactored autogpt library. See the tracking issue here: #4770. # Run instructions There are two client applications for Auto-GPT included. ## CLI Application 🌟 **This is the reference application I'm working with for now** 🌟 The first app is a straight CLI application. I have not done anything yet to port all the friendly display stuff from the `logger.typewriter_log` logic. - [Entry Point](https://github.com/Significant-Gravitas/Auto-GPT/blob/re-arch/hello-world/autogpt/core/runner/cli_app/cli.py) - [Client Application](https://github.com/Significant-Gravitas/Auto-GPT/blob/re-arch/hello-world/autogpt/core/runner/cli_app/main.py) To run, you first need a settings file. Run ``` python REPOSITORY_ROOT/autogpt/core/runner/cli_app/cli.py make-settings ``` where `REPOSITORY_ROOT` is the root of the Auto-GPT repository on your machine. This will write a file called `default_agent_settings.yaml` with all the user-modifiable configuration keys to `~/auto-gpt/default_agent_settings.yml` and make the `auto-gpt` directory in your user directory if it doesn't exist). At a bare minimum, you'll need to set `openai.credentials.api_key` to your OpenAI API Key to run the model. You can then run Auto-GPT with ``` python REPOSITORY_ROOT/autogpt/core/runner/cli_app/cli.py make-settings ``` to launch the interaction loop. ## CLI Web App The second app is still a CLI, but it sets up a local webserver that the client application talks to rather than invoking calls to the Agent library code directly. This application is essentially a sketch at this point as the folks who were driving it have had less time (and likely not enough clarity) to proceed. - [Entry Point](https://github.com/Significant-Gravitas/Auto-GPT/blob/re-arch/hello-world/autogpt/core/runner/cli_web_app/cli.py) - [Client Application](https://github.com/Significant-Gravitas/Auto-GPT/blob/re-arch/hello-world/autogpt/core/runner/cli_web_app/client/client.py) - [Server API](https://github.com/Significant-Gravitas/Auto-GPT/blob/re-arch/hello-world/autogpt/core/runner/cli_web_app/server/api.py) To run, you still need to generate a default configuration. You can do ``` python REPOSITORY_ROOT/autogpt/core/runner/cli_web_app/cli.py make-settings ``` It invokes the same command as the bare CLI app, so follow the instructions above about setting your API key. To run, do ``` python REPOSITORY_ROOT/autogpt/core/runner/cli_web_app/cli.py client ``` This will launch a webserver and then start the client cli application to communicate with it. ⚠️ I am not actively developing this application. It is a very good place to get involved if you have web application design experience and are looking to get involved in the re-arch. --------- Co-authored-by: David Wurtz <davidjwurtz@gmail.com> Co-authored-by: Media <12145726+rihp@users.noreply.github.com> Co-authored-by: Richard Beales <rich@richbeales.net> Co-authored-by: Daryl Rodrigo <darylrodrigo@gmail.com> Co-authored-by: Daryl Rodrigo <daryl@orkestro.com> Co-authored-by: Swifty <craigswift13@gmail.com> Co-authored-by: Nicholas Tindle <nick@ntindle.com> Co-authored-by: Merwane Hamadi <merwanehamadi@gmail.com>
108 lines
2.9 KiB
Python
108 lines
2.9 KiB
Python
import abc
|
|
import typing
|
|
from typing import Any, Generic, TypeVar
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
def UserConfigurable(*args, **kwargs):
|
|
return Field(*args, **kwargs, user_configurable=True)
|
|
|
|
|
|
class SystemConfiguration(BaseModel):
|
|
def get_user_config(self) -> dict[str, Any]:
|
|
return _get_user_config_fields(self)
|
|
|
|
class Config:
|
|
extra = "forbid"
|
|
use_enum_values = True
|
|
|
|
|
|
class SystemSettings(BaseModel):
|
|
"""A base class for all system settings."""
|
|
|
|
name: str
|
|
description: str
|
|
|
|
class Config:
|
|
extra = "forbid"
|
|
use_enum_values = True
|
|
|
|
|
|
S = TypeVar("S", bound=SystemSettings)
|
|
|
|
|
|
class Configurable(abc.ABC, Generic[S]):
|
|
"""A base class for all configurable objects."""
|
|
|
|
prefix: str = ""
|
|
default_settings: typing.ClassVar[S]
|
|
|
|
@classmethod
|
|
def get_user_config(cls) -> dict[str, Any]:
|
|
return _get_user_config_fields(cls.default_settings)
|
|
|
|
@classmethod
|
|
def build_agent_configuration(cls, configuration: dict) -> S:
|
|
"""Process the configuration for this object."""
|
|
|
|
defaults = cls.default_settings.dict()
|
|
final_configuration = deep_update(defaults, configuration)
|
|
|
|
return cls.default_settings.__class__.parse_obj(final_configuration)
|
|
|
|
|
|
def _get_user_config_fields(instance: BaseModel) -> dict[str, Any]:
|
|
"""
|
|
Get the user config fields of a Pydantic model instance.
|
|
|
|
Args:
|
|
instance: The Pydantic model instance.
|
|
|
|
Returns:
|
|
The user config fields of the instance.
|
|
"""
|
|
user_config_fields = {}
|
|
|
|
for name, value in instance.__dict__.items():
|
|
field_info = instance.__fields__[name]
|
|
if "user_configurable" in field_info.field_info.extra:
|
|
user_config_fields[name] = value
|
|
elif isinstance(value, SystemConfiguration):
|
|
user_config_fields[name] = value.get_user_config()
|
|
elif isinstance(value, list) and all(
|
|
isinstance(i, SystemConfiguration) for i in value
|
|
):
|
|
user_config_fields[name] = [i.get_user_config() for i in value]
|
|
elif isinstance(value, dict) and all(
|
|
isinstance(i, SystemConfiguration) for i in value.values()
|
|
):
|
|
user_config_fields[name] = {
|
|
k: v.get_user_config() for k, v in value.items()
|
|
}
|
|
|
|
return user_config_fields
|
|
|
|
|
|
def deep_update(original_dict: dict, update_dict: dict) -> dict:
|
|
"""
|
|
Recursively update a dictionary.
|
|
|
|
Args:
|
|
original_dict (dict): The dictionary to be updated.
|
|
update_dict (dict): The dictionary to update with.
|
|
|
|
Returns:
|
|
dict: The updated dictionary.
|
|
"""
|
|
for key, value in update_dict.items():
|
|
if (
|
|
key in original_dict
|
|
and isinstance(original_dict[key], dict)
|
|
and isinstance(value, dict)
|
|
):
|
|
original_dict[key] = deep_update(original_dict[key], value)
|
|
else:
|
|
original_dict[key] = value
|
|
return original_dict
|