from typing import List import os import argparse import socket from typing import Optional import uvicorn from typeguard import typechecked from backend.ports import get_backend_port from backend.config.Apps import MainApp from backend.apps.agents.agents import agents from backend.apps.dashboards.dashboards import dashboards from backend.apps.health.health import health from backend.apps.settings.settings import settings from backend.apps.modes.modes import modes from backend.apps.tools.tools import tools from backend.apps.app_builder.app_builder import app_builder from backend.apps.skills.skills import skills from backend.apps.subscriptions.subscriptions import subscriptions from fastapi.middleware.cors import CORSMiddleware main_app = MainApp([ health, tools, agents, settings, dashboards, modes, app_builder, skills, subscriptions, ]) app = main_app.app app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) if __name__ == "__main__": parser: argparse.ArgumentParser = argparse.ArgumentParser(description="OpenSwarm backend server") parser.add_argument("--port", type=int, default=get_backend_port()) parser.add_argument("--host", default=os.environ.get("OPENSWARM_HOST", "127.0.0.1")) parser.add_argument("--reload", action="store_true", default=False) args: argparse.Namespace = parser.parse_args() os.environ["OPENSWARM_PORT"] = str(args.port) class P_ReadyServer(uvicorn.Server): """Subclass that prints a machine-readable READY line on startup.""" @typechecked async def startup(self, sockets: Optional[List[socket.socket]] = None) -> None: await super().startup(sockets) print(f"READY:PORT={args.port}", flush=True) if args.reload: uvicorn.run("backend.main:app", host=args.host, port=args.port, reload=True) else: config = uvicorn.Config("backend.main:app", host=args.host, port=args.port) server = P_ReadyServer(config) import asyncio asyncio.run(server.serve())