""" CLI entrance for all rdagent application. This will - make rdagent a nice entry and - autoamtically load dotenv """ import sys from dotenv import load_dotenv load_dotenv(".env") # 1) Make sure it is at the beginning of the script so that it will load dotenv before initializing BaseSettings. # 2) The ".env" argument is necessary to make sure it loads `.env` from the current directory. import subprocess from importlib.resources import path as rpath from typing import Optional import typer from typing_extensions import Annotated from rdagent.app.data_science.loop import main as data_science from rdagent.app.finetune.llm.loop import main as llm_finetune from rdagent.app.general_model.general_model import ( extract_models_and_implement as general_model, ) from rdagent.app.qlib_rd_loop.factor import main as fin_factor from rdagent.app.qlib_rd_loop.factor_from_report import main as fin_factor_report from rdagent.app.qlib_rd_loop.model import main as fin_model from rdagent.app.qlib_rd_loop.quant import main as fin_quant from rdagent.app.utils.health_check import health_check from rdagent.app.utils.info import collect_info from rdagent.log.mle_summary import grade_summary as grade_summary app = typer.Typer() CheckoutOption = Annotated[bool, typer.Option("--checkout/--no-checkout", "-c/-C")] CheckEnvOption = Annotated[bool, typer.Option("--check-env/--no-check-env", "-e/-E")] CheckDockerOption = Annotated[bool, typer.Option("--check-docker/--no-check-docker", "-d/-D")] CheckPortsOption = Annotated[bool, typer.Option("--check-ports/--no-check-ports", "-p/-P")] def ui(port=19899, log_dir="", debug: bool = False, data_science: bool = False): """ start web app to show the log traces. """ if data_science: with rpath("rdagent.log.ui", "dsapp.py") as app_path: cmds = ["streamlit", "run", app_path, f"--server.port={port}"] subprocess.run(cmds) return with rpath("rdagent.log.ui", "app.py") as app_path: cmds = ["streamlit", "run", app_path, f"--server.port={port}"] if log_dir or debug: cmds.append("--") if log_dir: cmds.append(f"--log_dir={log_dir}") if debug: cmds.append("--debug") subprocess.run(cmds) def server_ui(port=19899): """ start the Flask log server in real time """ from rdagent.log.server.app import main as log_server_main log_server_main(port=port) def ds_user_interact(port=19900): """ start web app to show the log traces in real time """ commands = ["streamlit", "run", "rdagent/log/ui/ds_user_interact.py", f"--server.port={port}"] subprocess.run(commands) @app.command(name="fin_factor") def fin_factor_cli( path: Optional[str] = None, step_n: Optional[int] = None, loop_n: Optional[int] = None, all_duration: Optional[str] = None, checkout: CheckoutOption = True, ): fin_factor(path=path, step_n=step_n, loop_n=loop_n, all_duration=all_duration, checkout=checkout) @app.command(name="fin_model") def fin_model_cli( path: Optional[str] = None, step_n: Optional[int] = None, loop_n: Optional[int] = None, all_duration: Optional[str] = None, checkout: CheckoutOption = True, ): fin_model(path=path, step_n=step_n, loop_n=loop_n, all_duration=all_duration, checkout=checkout) @app.command(name="fin_quant") def fin_quant_cli( path: Optional[str] = None, step_n: Optional[int] = None, loop_n: Optional[int] = None, all_duration: Optional[str] = None, checkout: CheckoutOption = True, ): fin_quant(path=path, step_n=step_n, loop_n=loop_n, all_duration=all_duration, checkout=checkout) @app.command(name="fin_factor_report") def fin_factor_report_cli( report_folder: Optional[str] = None, path: Optional[str] = None, all_duration: Optional[str] = None, checkout: CheckoutOption = True, ): fin_factor_report(report_folder=report_folder, path=path, all_duration=all_duration, checkout=checkout) @app.command(name="general_model") def general_model_cli(report_file_path: str): general_model(report_file_path) @app.command(name="data_science") def data_science_cli( path: Optional[str] = None, checkout: CheckoutOption = True, step_n: Optional[int] = None, loop_n: Optional[int] = None, timeout: Optional[str] = None, competition: Optional[str] = None, ): data_science( path=path, checkout=checkout, step_n=step_n, loop_n=loop_n, timeout=timeout, competition=competition, ) @app.command(name="llm_finetune") def llm_finetune_cli( path: Optional[str] = None, checkout: CheckoutOption = True, benchmark: Optional[str] = None, benchmark_description: Optional[str] = None, dataset: Optional[str] = None, base_model: Optional[str] = None, upper_data_size_limit: Optional[int] = None, step_n: Optional[int] = None, loop_n: Optional[int] = None, timeout: Optional[str] = None, ): llm_finetune( path=path, checkout=checkout, benchmark=benchmark, benchmark_description=benchmark_description, dataset=dataset, base_model=base_model, upper_data_size_limit=upper_data_size_limit, step_n=step_n, loop_n=loop_n, timeout=timeout, ) @app.command(name="grade_summary") def grade_summary_cli(log_folder: str): grade_summary(log_folder) app.command(name="ui")(ui) app.command(name="server_ui")(server_ui) @app.command(name="health_check") def health_check_cli( check_env: CheckEnvOption = True, check_docker: CheckDockerOption = True, check_ports: CheckPortsOption = True, ): health_check(check_env=check_env, check_docker=check_docker, check_ports=check_ports) @app.command(name="collect_info") def collect_info_cli(): collect_info() app.command(name="ds_user_interact")(ds_user_interact) if __name__ == "__main__": app()