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 app = FastAPI( title="Flare Orchestration Service", version="0.1.0", description="LLM-driven intent & API flow engine (bootstrap)", ) from spark_startup import run_in_thread run_in_thread() # ---------------- Health probe (HF Spaces watchdog) ----------------- @app.get("/") def health_check(): return {"status": "ok"} # ---------------- Core chat/session routes -------------------------- app.include_router(chat_router) # ---------------- Admin API routes ---------------------------------- app.include_router(admin_router) # ---------------- Serve Angular UI if exists ------------------------ static_path = Path("static") if static_path.exists() and static_path.is_dir(): # Serve static files (Angular assets) app.mount("/assets", StaticFiles(directory="static/assets"), name="assets") # 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"]: 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 if __name__ == "__main__": log("🌐 Starting Flare backend …") uvicorn.run(app, host="0.0.0.0", port=7860)