AutoGPT/classic/original_autogpt/autogpt/app/cli.py

217 lines
5.9 KiB
Python

"""Main script for the autogpt package."""
from logging import _nameToLevel as logLevelMap
from pathlib import Path
from typing import Optional
import click
from forge.logging.config import LogFormatName
from .telemetry import setup_telemetry
@click.group(invoke_without_command=True)
@click.pass_context
def cli(ctx: click.Context):
setup_telemetry()
# Invoke `run` by default
if ctx.invoked_subcommand is None:
ctx.invoke(run)
@cli.command()
@click.option("-c", "--continuous", is_flag=True, help="Enable Continuous Mode")
@click.option(
"-l",
"--continuous-limit",
type=int,
help="Defines the number of times to run in continuous mode",
)
@click.option("--speak", is_flag=True, help="Enable Speak Mode")
@click.option(
"--install-plugin-deps",
is_flag=True,
help="Installs external dependencies for 3rd party plugins.",
)
@click.option(
"--skip-news",
is_flag=True,
help="Specifies whether to suppress the output of latest news on startup.",
)
@click.option(
"--skip-reprompt",
"-y",
is_flag=True,
help="Skips the re-prompting messages at the beginning of the script",
)
@click.option(
"--ai-name",
type=str,
help="AI name override",
)
@click.option(
"--ai-role",
type=str,
help="AI role override",
)
@click.option(
"--constraint",
type=str,
multiple=True,
help=(
"Add or override AI constraints to include in the prompt;"
" may be used multiple times to pass multiple constraints"
),
)
@click.option(
"--resource",
type=str,
multiple=True,
help=(
"Add or override AI resources to include in the prompt;"
" may be used multiple times to pass multiple resources"
),
)
@click.option(
"--best-practice",
type=str,
multiple=True,
help=(
"Add or override AI best practices to include in the prompt;"
" may be used multiple times to pass multiple best practices"
),
)
@click.option(
"--override-directives",
is_flag=True,
help=(
"If specified, --constraint, --resource and --best-practice will override"
" the AI's directives instead of being appended to them"
),
)
@click.option(
"--debug", is_flag=True, help="Implies --log-level=DEBUG --log-format=debug"
)
@click.option("--log-level", type=click.Choice([*logLevelMap.keys()]))
@click.option(
"--log-format",
help=(
"Choose a log format; defaults to 'simple'."
" Also implies --log-file-format, unless it is specified explicitly."
" Using the 'structured_google_cloud' format disables log file output."
),
type=click.Choice([i.value for i in LogFormatName]),
)
@click.option(
"--log-file-format",
help=(
"Override the format used for the log file output."
" Defaults to the application's global --log-format."
),
type=click.Choice([i.value for i in LogFormatName]),
)
@click.option(
"--component-config-file",
help="Path to a json configuration file",
type=click.Path(exists=True, dir_okay=False, resolve_path=True, path_type=Path),
)
def run(
continuous: bool,
continuous_limit: Optional[int],
speak: bool,
install_plugin_deps: bool,
skip_news: bool,
skip_reprompt: bool,
ai_name: Optional[str],
ai_role: Optional[str],
resource: tuple[str],
constraint: tuple[str],
best_practice: tuple[str],
override_directives: bool,
debug: bool,
log_level: Optional[str],
log_format: Optional[str],
log_file_format: Optional[str],
component_config_file: Optional[Path],
) -> None:
"""
Sets up and runs an agent, based on the task specified by the user, or resumes an
existing agent.
"""
# Put imports inside function to avoid importing everything when starting the CLI
from autogpt.app.main import run_auto_gpt
run_auto_gpt(
continuous=continuous,
continuous_limit=continuous_limit,
skip_reprompt=skip_reprompt,
speak=speak,
debug=debug,
log_level=log_level,
log_format=log_format,
log_file_format=log_file_format,
skip_news=skip_news,
install_plugin_deps=install_plugin_deps,
override_ai_name=ai_name,
override_ai_role=ai_role,
resources=list(resource),
constraints=list(constraint),
best_practices=list(best_practice),
override_directives=override_directives,
component_config_file=component_config_file,
)
@cli.command()
@click.option(
"--install-plugin-deps",
is_flag=True,
help="Installs external dependencies for 3rd party plugins.",
)
@click.option(
"--debug", is_flag=True, help="Implies --log-level=DEBUG --log-format=debug"
)
@click.option("--log-level", type=click.Choice([*logLevelMap.keys()]))
@click.option(
"--log-format",
help=(
"Choose a log format; defaults to 'simple'."
" Also implies --log-file-format, unless it is specified explicitly."
" Using the 'structured_google_cloud' format disables log file output."
),
type=click.Choice([i.value for i in LogFormatName]),
)
@click.option(
"--log-file-format",
help=(
"Override the format used for the log file output."
" Defaults to the application's global --log-format."
),
type=click.Choice([i.value for i in LogFormatName]),
)
def serve(
install_plugin_deps: bool,
debug: bool,
log_level: Optional[str],
log_format: Optional[str],
log_file_format: Optional[str],
) -> None:
"""
Starts an Agent Protocol compliant AutoGPT server, which creates a custom agent for
every task.
"""
# Put imports inside function to avoid importing everything when starting the CLI
from autogpt.app.main import run_auto_gpt_server
run_auto_gpt_server(
debug=debug,
log_level=log_level,
log_format=log_format,
log_file_format=log_file_format,
install_plugin_deps=install_plugin_deps,
)
if __name__ == "__main__":
cli()