import webbrowser import typer from src.aws import mlflow as aws_mlflow from src.commands.utils import CONFIG_OPT, CONSOLE, load_cfg app = typer.Typer(help="Manage MLflow tracking server access") @app.command(name="open") def open_mlflow(config: str = CONFIG_OPT) -> None: """Open a presigned URL for the configured MLflow tracking server.""" cfg = load_cfg(config) tracking_server_name = cfg.effective_mlflow_tracking_server_name if not tracking_server_name: CONSOLE.print("[red]MLflow is disabled in config.yaml.[/red]") raise typer.Exit(1) try: url = aws_mlflow.create_presigned_tracking_server_url( cfg.aws.region, cfg.aws.profile, tracking_server_name, ) except Exception as e: CONSOLE.print("[yellow]Could not create a SageMaker MLflow UI URL.[/yellow]") CONSOLE.print(f"Tracking server: [cyan]{tracking_server_name}[/cyan]") CONSOLE.print(f"Reason: {e}") CONSOLE.print( "This command can create presigned URLs only for MLflow tracking servers managed by " "Amazon SageMaker. If this is an external MLflow server, open it with that server's own URL." ) raise typer.Exit(1) CONSOLE.print(f"MLflow tracking server: [cyan]{tracking_server_name}[/cyan]") CONSOLE.print(f"MLflow UI: {url}") if webbrowser.open(url): CONSOLE.print("[green]✓[/green] Opened MLflow UI in your browser.") else: CONSOLE.print("[yellow]Could not open a browser automatically. Open the URL above manually.[/yellow]")