#!/usr/bin/env python3 """Launch a specified number of AI Troll Agent (trollagent_ai) sessions for botWebWars. Example usage: # Launch 2 trolls with default parameters (gemma4:e4b, str 2, hp 2) ./launch_trolls.py -n 2 # Custom strength, health, model, and Ollama server ./launch_trolls.py -n 3 -s 3 -H 4 --ollama-url "http://192.168.1.220:11434" --model "gemma4:e4b" # Preview commands without executing ./launch_trolls.py -n 2 --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_TROLL_COLORS, run_agent_launcher, ) DEFAULT_SERVER_URL = os.getenv("TROLL_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_TROLL_STRENGTH = float(os.getenv("TROLL_STRENGTH", "2.0")) DEFAULT_TROLL_HEALTH = float(os.getenv("TROLL_HEALTH", "2.0")) def parse_args(): parser = argparse.ArgumentParser( description="Launch a specified number of AI Troll Agent (trollagent_ai) sessions for botWebWars.", formatter_class=argparse.ArgumentDefaultsHelpFormatter, ) parser.add_argument( "-n", "--count", "--num", "--num-trolls", dest="count", type=int, default=1, help="Number of troll agent instances to launch", ) parser.add_argument( "-s", "--strength", dest="strength", type=float, default=DEFAULT_TROLL_STRENGTH, help="Troll strength multiplier (1-10)", ) parser.add_argument( "-H", "--health", dest="health", type=float, default=DEFAULT_TROLL_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 troll green palette)", ) parser.add_argument( "--start-index", dest="start_index", type=int, default=1, help="Starting index number for troll naming (e.g. start at 3 for trollagent_ai_model_3)", ) parser.add_argument( "--prefix", dest="prefix", default="trollagent_ai", help="Custom naming prefix before model and index", ) parser.add_argument( "--loop-delay", dest="loop_delay", type=float, default=1.0, help="Turn polling interval in seconds", ) parser.add_argument( "--log-dir", dest="log_dir", default="logs", help="Directory to store per-troll 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.loop_delay: extra.extend(["--loop-delay", str(args.loop_delay)]) return extra def main(): args = parse_args() run_agent_launcher( agent_type="Troll", folder="trollagent_ai", palette=DEFAULT_TROLL_COLORS, args=args, extra_args_builder=extra_args_builder, ) if __name__ == "__main__": main()