"""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()