182 lines
5.9 KiB
Python
182 lines
5.9 KiB
Python
"""The application entry point. Can be invoked by a CLI or any other front end application."""
|
|
import logging
|
|
import sys
|
|
|
|
from colorama import Fore, Style
|
|
|
|
from autogpt.agent import Agent
|
|
from autogpt.config.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.models.command_registry import CommandRegistry
|
|
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.execute_code",
|
|
"autogpt.commands.file_operations",
|
|
"autogpt.commands.web_search",
|
|
"autogpt.commands.web_selenium",
|
|
"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
|
|
|
|
config = Config.build_config_from_env()
|
|
|
|
# TODO: fill in llm values here
|
|
check_openai_api_key(config)
|
|
|
|
create_config(
|
|
config,
|
|
continuous,
|
|
continuous_limit,
|
|
ai_settings,
|
|
prompt_settings,
|
|
skip_reprompt,
|
|
speak,
|
|
debug,
|
|
gpt3only,
|
|
gpt4only,
|
|
memory_type,
|
|
browser_name,
|
|
allow_downloads,
|
|
skip_news,
|
|
)
|
|
|
|
if config.continuous_mode:
|
|
for line in get_legal_warning().split("\n"):
|
|
logger.warn(markdown_to_ansi_style(line), "LEGAL:", Fore.RED)
|
|
|
|
if not config.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 config.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.
|
|
workspace_directory = Workspace.get_workspace_directory(config, workspace_directory)
|
|
|
|
# HACK: doing this here to collect some globals that depend on the workspace.
|
|
Workspace.build_file_logger_path(config, workspace_directory)
|
|
|
|
config.plugins = scan_plugins(config, config.debug_mode)
|
|
# Create a CommandRegistry instance and scan default folder
|
|
command_registry = CommandRegistry()
|
|
|
|
logger.debug(
|
|
f"The following command categories are disabled: {config.disabled_command_categories}"
|
|
)
|
|
enabled_command_categories = [
|
|
x for x in COMMAND_CATEGORIES if x not in config.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(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 config.chat_messages_enabled:
|
|
for plugin in config.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(config)
|
|
memory.clear()
|
|
logger.typewriter_log(
|
|
"Using memory of type:", Fore.GREEN, f"{memory.__class__.__name__}"
|
|
)
|
|
logger.typewriter_log("Using Browser:", Fore.GREEN, config.selenium_web_browser)
|
|
system_prompt = ai_config.construct_full_prompt(config)
|
|
if config.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=config,
|
|
)
|
|
agent.start_interaction_loop()
|