200 lines
6.6 KiB
Python
200 lines
6.6 KiB
Python
"""The application entry point. Can be invoked by a CLI or any other front end application."""
|
|
import logging
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from colorama import Fore, Style
|
|
|
|
from autogpt.agent import Agent
|
|
from autogpt.commands.command import CommandRegistry
|
|
from autogpt.config import Config, check_openai_api_key
|
|
from autogpt.configurator import create_config
|
|
from autogpt.logs import logger
|
|
from autogpt.memory.vector import get_memory
|
|
from autogpt.plugins import scan_plugins
|
|
from autogpt.prompts.prompt import DEFAULT_TRIGGERING_PROMPT, construct_main_ai_config
|
|
from autogpt.utils import (
|
|
get_current_git_branch,
|
|
get_latest_bulletin,
|
|
get_legal_warning,
|
|
markdown_to_ansi_style,
|
|
)
|
|
from autogpt.workspace import Workspace
|
|
from scripts.install_plugin_deps import install_plugin_dependencies
|
|
|
|
COMMAND_CATEGORIES = [
|
|
"autogpt.commands.analyze_code",
|
|
"autogpt.commands.audio_text",
|
|
"autogpt.commands.execute_code",
|
|
"autogpt.commands.file_operations",
|
|
"autogpt.commands.git_operations",
|
|
"autogpt.commands.google_search",
|
|
"autogpt.commands.image_gen",
|
|
"autogpt.commands.improve_code",
|
|
"autogpt.commands.web_selenium",
|
|
"autogpt.commands.write_tests",
|
|
"autogpt.app",
|
|
"autogpt.commands.task_statuses",
|
|
]
|
|
|
|
|
|
def run_auto_gpt(
|
|
continuous: bool,
|
|
continuous_limit: int,
|
|
ai_settings: str,
|
|
prompt_settings: str,
|
|
skip_reprompt: bool,
|
|
speak: bool,
|
|
debug: bool,
|
|
gpt3only: bool,
|
|
gpt4only: bool,
|
|
memory_type: str,
|
|
browser_name: str,
|
|
allow_downloads: bool,
|
|
skip_news: bool,
|
|
workspace_directory: str,
|
|
install_plugin_deps: bool,
|
|
):
|
|
# Configure logging before we do anything else.
|
|
logger.set_level(logging.DEBUG if debug else logging.INFO)
|
|
logger.speak_mode = speak
|
|
|
|
cfg = Config()
|
|
# TODO: fill in llm values here
|
|
check_openai_api_key()
|
|
|
|
create_config(
|
|
cfg,
|
|
continuous,
|
|
continuous_limit,
|
|
ai_settings,
|
|
prompt_settings,
|
|
skip_reprompt,
|
|
speak,
|
|
debug,
|
|
gpt3only,
|
|
gpt4only,
|
|
memory_type,
|
|
browser_name,
|
|
allow_downloads,
|
|
skip_news,
|
|
)
|
|
|
|
if cfg.continuous_mode:
|
|
for line in get_legal_warning().split("\n"):
|
|
logger.warn(markdown_to_ansi_style(line), "LEGAL:", Fore.RED)
|
|
|
|
if not cfg.skip_news:
|
|
motd, is_new_motd = get_latest_bulletin()
|
|
if motd:
|
|
motd = markdown_to_ansi_style(motd)
|
|
for motd_line in motd.split("\n"):
|
|
logger.info(motd_line, "NEWS:", Fore.GREEN)
|
|
if is_new_motd and not cfg.chat_messages_enabled:
|
|
input(
|
|
Fore.MAGENTA
|
|
+ Style.BRIGHT
|
|
+ "NEWS: Bulletin was updated! Press Enter to continue..."
|
|
+ Style.RESET_ALL
|
|
)
|
|
|
|
git_branch = get_current_git_branch()
|
|
if git_branch and git_branch != "stable":
|
|
logger.typewriter_log(
|
|
"WARNING: ",
|
|
Fore.RED,
|
|
f"You are running on `{git_branch}` branch "
|
|
"- this is not a supported branch.",
|
|
)
|
|
if sys.version_info < (3, 10):
|
|
logger.typewriter_log(
|
|
"WARNING: ",
|
|
Fore.RED,
|
|
"You are running on an older version of Python. "
|
|
"Some people have observed problems with certain "
|
|
"parts of Auto-GPT with this version. "
|
|
"Please consider upgrading to Python 3.10 or higher.",
|
|
)
|
|
|
|
if install_plugin_deps:
|
|
install_plugin_dependencies()
|
|
|
|
# TODO: have this directory live outside the repository (e.g. in a user's
|
|
# home directory) and have it come in as a command line argument or part of
|
|
# the env file.
|
|
if workspace_directory is None:
|
|
workspace_directory = Path(__file__).parent / "auto_gpt_workspace"
|
|
else:
|
|
workspace_directory = Path(workspace_directory)
|
|
# TODO: pass in the ai_settings file and the env file and have them cloned into
|
|
# the workspace directory so we can bind them to the agent.
|
|
workspace_directory = Workspace.make_workspace(workspace_directory)
|
|
cfg.workspace_path = str(workspace_directory)
|
|
|
|
# HACK: doing this here to collect some globals that depend on the workspace.
|
|
file_logger_path = workspace_directory / "file_logger.txt"
|
|
if not file_logger_path.exists():
|
|
with file_logger_path.open(mode="w", encoding="utf-8") as f:
|
|
f.write("File Operation Logger ")
|
|
|
|
cfg.file_logger_path = str(file_logger_path)
|
|
|
|
cfg.set_plugins(scan_plugins(cfg, cfg.debug_mode))
|
|
# Create a CommandRegistry instance and scan default folder
|
|
command_registry = CommandRegistry()
|
|
|
|
logger.debug(
|
|
f"The following command categories are disabled: {cfg.disabled_command_categories}"
|
|
)
|
|
enabled_command_categories = [
|
|
x for x in COMMAND_CATEGORIES if x not in cfg.disabled_command_categories
|
|
]
|
|
|
|
logger.debug(
|
|
f"The following command categories are enabled: {enabled_command_categories}"
|
|
)
|
|
|
|
for command_category in enabled_command_categories:
|
|
command_registry.import_commands(command_category)
|
|
|
|
ai_name = ""
|
|
ai_config = construct_main_ai_config()
|
|
ai_config.command_registry = command_registry
|
|
if ai_config.ai_name:
|
|
ai_name = ai_config.ai_name
|
|
# print(prompt)
|
|
# Initialize variables
|
|
next_action_count = 0
|
|
|
|
# add chat plugins capable of report to logger
|
|
if cfg.chat_messages_enabled:
|
|
for plugin in cfg.plugins:
|
|
if hasattr(plugin, "can_handle_report") and plugin.can_handle_report():
|
|
logger.info(f"Loaded plugin into logger: {plugin.__class__.__name__}")
|
|
logger.chat_plugins.append(plugin)
|
|
|
|
# Initialize memory and make sure it is empty.
|
|
# this is particularly important for indexing and referencing pinecone memory
|
|
memory = get_memory(cfg)
|
|
memory.clear()
|
|
logger.typewriter_log(
|
|
"Using memory of type:", Fore.GREEN, f"{memory.__class__.__name__}"
|
|
)
|
|
logger.typewriter_log("Using Browser:", Fore.GREEN, cfg.selenium_web_browser)
|
|
system_prompt = ai_config.construct_full_prompt()
|
|
if cfg.debug_mode:
|
|
logger.typewriter_log("Prompt:", Fore.GREEN, system_prompt)
|
|
|
|
agent = Agent(
|
|
ai_name=ai_name,
|
|
memory=memory,
|
|
next_action_count=next_action_count,
|
|
command_registry=command_registry,
|
|
system_prompt=system_prompt,
|
|
triggering_prompt=DEFAULT_TRIGGERING_PROMPT,
|
|
workspace_directory=workspace_directory,
|
|
ai_config=ai_config,
|
|
config=cfg,
|
|
)
|
|
agent.start_interaction_loop()
|