#!/usr/bin/env python3 """Launch a specified number of AI Bot Agent (botagent_ai) sessions for botWebWars. Example usage: # Launch 3 bots with default parameters (gemma4:e4b, str 2, hp 2) ./launch_bots.py -n 3 # Custom model, health, strength, and Ollama server ./launch_bots.py -n 2 -s 3 -H 4 --ollama-url "http://192.168.1.220:11434" --model "gemma4:e4b" # Preview commands without executing ./launch_bots.py -n 3 --dry-run """ import argparse import os import sys from pathlib import Path # Ensure workspace root is in sys.path sys.path.insert(0, str(Path(__file__).resolve().parent)) from launcher_common import ( DEFAULT_BOT_COLORS, run_agent_launcher, ) DEFAULT_SERVER_URL = os.getenv("BOT_SERVER_URL", "http://localhost:8000") DEFAULT_OLLAMA_URL = os.getenv("OLLAMA_BASE_URL", "http://192.168.1.220:11434") DEFAULT_OLLAMA_MODEL = os.getenv("OLLAMA_MODEL", "gemma4:e4b") DEFAULT_BOT_STRENGTH = int(os.getenv("BOT_STRENGTH", "2")) DEFAULT_BOT_HEALTH = int(os.getenv("BOT_HEALTH", "2")) def parse_args(): parser = argparse.ArgumentParser( description="Launch a specified number of AI Bot Agent (botagent_ai) sessions for botWebWars.", formatter_class=argparse.ArgumentDefaultsHelpFormatter, ) parser.add_argument( "-n", "--count", "--num", "--num-bots", dest="count", type=int, default=1, help="Number of bot agent instances to launch", ) parser.add_argument( "-s", "--strength", dest="strength", type=int, default=DEFAULT_BOT_STRENGTH, help="Bot strength multiplier (1-10)", ) parser.add_argument( "-H", "--health", dest="health", type=int, default=DEFAULT_BOT_HEALTH, help="Starting health points", ) parser.add_argument( "--ollama-url", dest="ollama_url", default=DEFAULT_OLLAMA_URL, help="Ollama API base URL", ) parser.add_argument( "-m", "--model", "--ollama-model", dest="model", default=DEFAULT_OLLAMA_MODEL, help="Ollama model identifier", ) parser.add_argument( "-u", "--url", "--server-url", dest="server_url", default=DEFAULT_SERVER_URL, help="botWebWars server URL", ) parser.add_argument( "-c", "--color", dest="color", default=None, help="Custom hex color code for avatar (default: auto-cycles vibrant palette)", ) parser.add_argument( "--start-index", dest="start_index", type=int, default=1, help="Starting index number for bot naming (e.g. start at 4 for botagent_ai_model_4)", ) parser.add_argument( "--prefix", dest="prefix", default="botagent_ai", help="Custom naming prefix before model and index", ) parser.add_argument( "--piece-type", dest="piece_type", choices=["knight", "warrior"], default=None, help="Optional board piece class", ) parser.add_argument( "--log-dir", dest="log_dir", default="logs", help="Directory to store per-bot log files", ) parser.add_argument( "--no-logs", dest="no_logs", action="store_true", help="Disable writing logs to files", ) parser.add_argument( "--python", dest="python", default=None, help="Custom path to python interpreter binary", ) parser.add_argument( "--dry-run", dest="dry_run", action="store_true", help="Print the launch plan and commands without executing them", ) return parser.parse_args() def extra_args_builder(args): extra = [] if args.piece_type: extra.extend(["--piece-type", args.piece_type]) return extra def main(): args = parse_args() run_agent_launcher( agent_type="Bot", folder="botagent_ai", palette=DEFAULT_BOT_COLORS, args=args, extra_args_builder=extra_args_builder, ) if __name__ == "__main__": main()