Rithwik Ravi
fix(ui): remove vestigial math dataset generation, sync evaluation script to 120 steps, and truncate metrics log on run
7918944 | import os | |
| import sys | |
| import time | |
| import psutil | |
| import subprocess | |
| import signal | |
| PORTS_TO_CHECK = [8000] | |
| processes = [] | |
| def kill_process_on_port(port): | |
| for proc in psutil.process_iter(['pid', 'name']): | |
| try: | |
| for conn in proc.net_connections(kind='inet'): | |
| if conn.laddr.port == port: | |
| print(f"[CLEANUP] Found process {proc.info['name']} (PID: {proc.info['pid']}) on port {port}. Terminating...") | |
| proc.kill() | |
| proc.wait(timeout=3) | |
| except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): | |
| pass | |
| def cleanup_ports(): | |
| print("[CLEANUP] Checking for zombied ports...") | |
| for port in PORTS_TO_CHECK: | |
| kill_process_on_port(port) | |
| def start_background_process(args_list, name): | |
| print(f"[START] Launching {name} in background...") | |
| proc = subprocess.Popen(args_list, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) | |
| return proc | |
| def cleanup_servers(signum=None, frame=None): | |
| print("\n[SHUTDOWN] Terminating background servers...") | |
| for proc in processes: | |
| try: | |
| proc.terminate() | |
| proc.wait(timeout=2) | |
| except Exception: | |
| try: | |
| proc.kill() | |
| except Exception: | |
| pass | |
| cleanup_ports() | |
| print("[SHUTDOWN] Complete.") | |
| sys.exit(0) | |
| def main(): | |
| signal.signal(signal.SIGINT, cleanup_servers) | |
| if hasattr(signal, 'SIGTERM'): | |
| signal.signal(signal.SIGTERM, cleanup_servers) | |
| cleanup_ports() | |
| python_exe = sys.executable | |
| # Launch Core Server (API + UI merged) using sys.executable -m uvicorn | |
| p1 = start_background_process([python_exe, "-m", "uvicorn", "src.api.server:app", "--port", "8000"], "Core API Server") | |
| processes.append(p1) | |
| print("[WAIT] Allowing servers to initialize (2 seconds)...") | |
| time.sleep(2) | |
| print("\n[EVALUATION] Starting Headless Evaluator...\n") | |
| if os.path.exists("metrics.jsonl"): | |
| open("metrics.jsonl", "w").close() | |
| try: | |
| subprocess.run([python_exe, "src/inference/evaluate.py"], check=True) | |
| except subprocess.CalledProcessError as e: | |
| print(f"[ERROR] Evaluator failed with exit code {e.returncode}") | |
| except KeyboardInterrupt: | |
| pass | |
| print("\n[EVALUATION] Finished.") | |
| print("[READY] Servers are still running in background. View UI at http://127.0.0.1:8000") | |
| print("[READY] Press Ctrl+C to shutdown completely.") | |
| try: | |
| while True: | |
| time.sleep(1) | |
| except KeyboardInterrupt: | |
| cleanup_servers() | |
| if __name__ == "__main__": | |
| main() | |