Local
Mini run script
Full source code
#!/usr/bin/env python3
"""Run mini-SWE-agent in your local environment. This is the default executable `mini`."""
# Read this first: https://mini-swe-agent.com/latest/usage/mini/ (usage)
import os
import traceback
from pathlib import Path
from typing import Any
import typer
import yaml
from prompt_toolkit.formatted_text import HTML
from prompt_toolkit.history import FileHistory
from prompt_toolkit.shortcuts import PromptSession
from rich.console import Console
from minisweagent import global_config_dir
from minisweagent.agents.interactive import InteractiveAgent
from minisweagent.agents.interactive_textual import TextualAgent
from minisweagent.config import builtin_config_dir, get_config_path
from minisweagent.environments.local import LocalEnvironment
from minisweagent.models import get_model
from minisweagent.run.extra.config import configure_if_first_time
from minisweagent.run.utils.save import save_traj
from minisweagent.utils.log import logger
DEFAULT_CONFIG = Path(os.getenv("MSWEA_MINI_CONFIG_PATH", builtin_config_dir / "mini.yaml"))
DEFAULT_OUTPUT = global_config_dir / "last_mini_run.traj.json"
console = Console(highlight=False)
app = typer.Typer(rich_markup_mode="rich")
prompt_session = PromptSession(history=FileHistory(global_config_dir / "mini_task_history.txt"))
_HELP_TEXT = """Run mini-SWE-agent in your local environment.
[not dim]
There are two different user interfaces:
[bold green]mini[/bold green] Simple REPL-style interface
[bold green]mini -v[/bold green] Pager-style interface (Textual)
More information about the usage: [bold green]https://mini-swe-agent.com/latest/usage/mini/[/bold green]
[/not dim]
"""
# fmt: off
@app.command(help=_HELP_TEXT)
def main(
visual: bool = typer.Option(False, "-v", "--visual", help="Toggle (pager-style) UI (Textual) depending on the MSWEA_VISUAL_MODE_DEFAULT environment setting",),
model_name: str | None = typer.Option( None, "-m", "--model", help="Model to use",),
model_class: str | None = typer.Option(None, "--model-class", help="Model class to use (e.g., 'anthropic' or 'minisweagent.models.anthropic.AnthropicModel')", rich_help_panel="Advanced"),
task: str | None = typer.Option(None, "-t", "--task", help="Task/problem statement", show_default=False),
yolo: bool = typer.Option(False, "-y", "--yolo", help="Run without confirmation"),
cost_limit: float | None = typer.Option(None, "-l", "--cost-limit", help="Cost limit. Set to 0 to disable."),
config_spec: Path = typer.Option(DEFAULT_CONFIG, "-c", "--config", help="Path to config file"),
output: Path | None = typer.Option(DEFAULT_OUTPUT, "-o", "--output", help="Output trajectory file"),
exit_immediately: bool = typer.Option( False, "--exit-immediately", help="Exit immediately when the agent wants to finish instead of prompting.", rich_help_panel="Advanced"),
) -> Any:
# fmt: on
configure_if_first_time()
config_path = get_config_path(config_spec)
console.print(f"Loading agent config from [bold green]'{config_path}'[/bold green]")
config = yaml.safe_load(config_path.read_text())
if not task:
console.print("[bold yellow]What do you want to do?")
task = prompt_session.prompt(
"",
multiline=True,
bottom_toolbar=HTML(
"Submit task: <b fg='yellow' bg='black'>Esc+Enter</b> | "
"Navigate history: <b fg='yellow' bg='black'>Arrow Up/Down</b> | "
"Search history: <b fg='yellow' bg='black'>Ctrl+R</b>"
),
)
console.print("[bold green]Got that, thanks![/bold green]")
if yolo:
config.setdefault("agent", {})["mode"] = "yolo"
if cost_limit is not None:
config.setdefault("agent", {})["cost_limit"] = cost_limit
if exit_immediately:
config.setdefault("agent", {})["confirm_exit"] = False
if model_class is not None:
config.setdefault("model", {})["model_class"] = model_class
model = get_model(model_name, config.get("model", {}))
env = LocalEnvironment(**config.get("env", {}))
# Both visual flag and the MSWEA_VISUAL_MODE_DEFAULT flip the mode, so it's essentially a XOR
agent_class = InteractiveAgent
if visual == (os.getenv("MSWEA_VISUAL_MODE_DEFAULT", "false") == "false"):
agent_class = TextualAgent
agent = agent_class(model, env, **config.get("agent", {}))
exit_status, result, extra_info = None, None, None
try:
exit_status, result = agent.run(task) # type: ignore[arg-type]
except Exception as e:
logger.error(f"Error running agent: {e}", exc_info=True)
exit_status, result = type(e).__name__, str(e)
extra_info = {"traceback": traceback.format_exc()}
finally:
if output:
save_traj(agent, output, exit_status=exit_status, result=result, extra_info=extra_info) # type: ignore[arg-type]
return agent
if __name__ == "__main__":
app()
minisweagent.run.mini
Run mini-SWE-agent in your local environment. This is the default executable mini.
DEFAULT_CONFIG
module-attribute
DEFAULT_CONFIG = Path(
getenv(
"MSWEA_MINI_CONFIG_PATH",
builtin_config_dir / "mini.yaml",
)
)
DEFAULT_OUTPUT
module-attribute
DEFAULT_OUTPUT = (
global_config_dir / "last_mini_run.traj.json"
)
console
module-attribute
console = Console(highlight=False)
app
module-attribute
app = Typer(rich_markup_mode='rich')
prompt_session
module-attribute
prompt_session = PromptSession(
history=FileHistory(
global_config_dir / "mini_task_history.txt"
)
)
main
main(
visual: bool = Option(
False,
"-v",
"--visual",
help="Toggle (pager-style) UI (Textual) depending on the MSWEA_VISUAL_MODE_DEFAULT environment setting",
),
model_name: str | None = Option(
None, "-m", "--model", help="Model to use"
),
model_class: str | None = Option(
None,
"--model-class",
help="Model class to use (e.g., 'anthropic' or 'minisweagent.models.anthropic.AnthropicModel')",
rich_help_panel="Advanced",
),
task: str | None = Option(
None,
"-t",
"--task",
help="Task/problem statement",
show_default=False,
),
yolo: bool = Option(
False,
"-y",
"--yolo",
help="Run without confirmation",
),
cost_limit: float | None = Option(
None,
"-l",
"--cost-limit",
help="Cost limit. Set to 0 to disable.",
),
config_spec: Path = Option(
DEFAULT_CONFIG,
"-c",
"--config",
help="Path to config file",
),
output: Path | None = Option(
DEFAULT_OUTPUT,
"-o",
"--output",
help="Output trajectory file",
),
exit_immediately: bool = Option(
False,
"--exit-immediately",
help="Exit immediately when the agent wants to finish instead of prompting.",
rich_help_panel="Advanced",
),
) -> Any
Source code in src/minisweagent/run/mini.py
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | |