from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from fastapi.responses import FileResponse import uvicorn import os from pathlib import Path from utils import log from chat_handler import router as chat_router # ← start_session & chat from admin_routes import router as admin_router # ← Admin API endpoints from spark_startup import run_in_thread app = FastAPI( title="Flare Orchestration Service", version="0.1.0", description="LLM-driven intent & API flow engine (bootstrap)", ) run_in_thread() # ---------------- Core chat/session routes -------------------------- app.include_router(chat_router) # ---------------- Admin API routes ---------------------------------- app.include_router(admin_router) # ---------------- Health probe (HF Spaces watchdog) ----------------- @app.get("/") def health_check(): return {"status": "ok"} # ---------------- Serve Angular UI if exists ------------------------ static_path = Path("static") if static_path.exists() and static_path.is_dir(): # Serve static files (Angular assets) - only if assets directory exists assets_path = static_path / "assets" if assets_path.exists() and assets_path.is_dir(): app.mount("/assets", StaticFiles(directory=str(assets_path)), name="assets") # Root path - serve index.html @app.get("/") async def serve_root(): index_path = static_path / "index.html" if index_path.exists(): return FileResponse(str(index_path)) return {"status": "ok"} # Fallback to health check # Catch-all route for Angular routing (must be last!) @app.get("/{full_path:path}") async def serve_angular(full_path: str): # Don't catch API routes if full_path.startswith("api/") or full_path in ["start_session", "chat", "health"]: return {"error": "Not found"}, 404 # Return Angular index.html for all other routes index_path = static_path / "index.html" if index_path.exists(): return FileResponse(str(index_path)) return {"error": "UI not found"}, 404 else: # No UI built, just health endpoint @app.get("/") def health_check(): return {"status": "ok", "message": "UI not found. Build Angular app first."} if __name__ == "__main__": log("🌐 Starting Flare backend …") uvicorn.run(app, host="0.0.0.0", port=7860)