mirror of
https://github.com/aljazceru/Auto-GPT.git
synced 2026-01-21 15:04:28 +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>
168 lines
5.0 KiB
Python
168 lines
5.0 KiB
Python
import logging
|
|
import os
|
|
|
|
from autogpt.core.ability.base import Ability, AbilityConfiguration
|
|
from autogpt.core.ability.schema import AbilityResult, ContentType, Knowledge
|
|
from autogpt.core.workspace import Workspace
|
|
|
|
|
|
class ReadFile(Ability):
|
|
default_configuration = AbilityConfiguration(
|
|
packages_required=["unstructured"],
|
|
workspace_required=True,
|
|
)
|
|
|
|
def __init__(
|
|
self,
|
|
logger: logging.Logger,
|
|
workspace: Workspace,
|
|
):
|
|
self._logger = logger
|
|
self._workspace = workspace
|
|
|
|
@property
|
|
def description(self) -> str:
|
|
return "Read and parse all text from a file."
|
|
|
|
@property
|
|
def arguments(self) -> dict:
|
|
return {
|
|
"filename": {
|
|
"type": "string",
|
|
"description": "The name of the file to read.",
|
|
},
|
|
}
|
|
|
|
def _check_preconditions(self, filename: str) -> AbilityResult | None:
|
|
message = ""
|
|
try:
|
|
pass
|
|
except ImportError:
|
|
message = "Package charset_normalizer is not installed."
|
|
|
|
try:
|
|
file_path = self._workspace.get_path(filename)
|
|
if not file_path.exists():
|
|
message = f"File {filename} does not exist."
|
|
if not file_path.is_file():
|
|
message = f"{filename} is not a file."
|
|
except ValueError as e:
|
|
message = str(e)
|
|
|
|
if message:
|
|
return AbilityResult(
|
|
ability_name=self.name(),
|
|
ability_args={"filename": filename},
|
|
success=False,
|
|
message=message,
|
|
data=None,
|
|
)
|
|
|
|
def __call__(self, filename: str) -> AbilityResult:
|
|
if result := self._check_preconditions(filename):
|
|
return result
|
|
|
|
from unstructured.partition.auto import partition
|
|
|
|
file_path = self._workspace.get_path(filename)
|
|
try:
|
|
elements = partition(str(file_path))
|
|
# TODO: Lots of other potentially useful information is available
|
|
# in the partitioned file. Consider returning more of it.
|
|
new_knowledge = Knowledge(
|
|
content="\n\n".join([element.text for element in elements]),
|
|
content_type=ContentType.TEXT,
|
|
content_metadata={"filename": filename},
|
|
)
|
|
success = True
|
|
message = f"File {file_path} read successfully."
|
|
except IOError as e:
|
|
new_knowledge = None
|
|
success = False
|
|
message = str(e)
|
|
|
|
return AbilityResult(
|
|
ability_name=self.name(),
|
|
ability_args={"filename": filename},
|
|
success=success,
|
|
message=message,
|
|
new_knowledge=new_knowledge,
|
|
)
|
|
|
|
|
|
class WriteFile(Ability):
|
|
default_configuration = AbilityConfiguration(
|
|
packages_required=["unstructured"],
|
|
workspace_required=True,
|
|
)
|
|
|
|
def __init__(
|
|
self,
|
|
logger: logging.Logger,
|
|
workspace: Workspace,
|
|
):
|
|
self._logger = logger
|
|
self._workspace = workspace
|
|
|
|
@property
|
|
def description(self) -> str:
|
|
return "Write text to a file."
|
|
|
|
@property
|
|
def arguments(self) -> dict:
|
|
return {
|
|
"filename": {
|
|
"type": "string",
|
|
"description": "The name of the file to write.",
|
|
},
|
|
"contents": {
|
|
"type": "string",
|
|
"description": "The contents of the file to write.",
|
|
},
|
|
}
|
|
|
|
def _check_preconditions(
|
|
self, filename: str, contents: str
|
|
) -> AbilityResult | None:
|
|
message = ""
|
|
try:
|
|
file_path = self._workspace.get_path(filename)
|
|
if file_path.exists():
|
|
message = f"File {filename} already exists."
|
|
if len(contents):
|
|
message = f"File {filename} was not given any content."
|
|
except ValueError as e:
|
|
message = str(e)
|
|
|
|
if message:
|
|
return AbilityResult(
|
|
ability_name=self.name(),
|
|
ability_args={"filename": filename, "contents": contents},
|
|
success=False,
|
|
message=message,
|
|
data=None,
|
|
)
|
|
|
|
def __call__(self, filename: str, contents: str) -> AbilityResult:
|
|
if result := self._check_preconditions(filename, contents):
|
|
return result
|
|
|
|
file_path = self._workspace.get_path(filename)
|
|
try:
|
|
directory = os.path.dirname(file_path)
|
|
os.makedirs(directory)
|
|
with open(filename, "w", encoding="utf-8") as f:
|
|
f.write(contents)
|
|
success = True
|
|
message = f"File {file_path} written successfully."
|
|
except IOError as e:
|
|
success = False
|
|
message = str(e)
|
|
|
|
return AbilityResult(
|
|
ability_name=self.name(),
|
|
ability_args={"filename": filename},
|
|
success=success,
|
|
message=message,
|
|
)
|