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") log(f"🔍 Checking for static directory at: {static_path.absolute()}") log(f"🔍 Static directory exists: {static_path.exists()}") if static_path.exists() and static_path.is_dir(): # List files in static directory files = list(static_path.iterdir()) log(f"📁 Files in static directory: {[f.name for f in files]}") # Check for index.html index_path = static_path / "index.html" log(f"🔍 index.html exists: {index_path.exists()}") # 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(): log("📄 Serving index.html") return FileResponse(str(index_path)) log("⚠️ index.html not found, returning health check") return {"status": "ok", "sessions": len(session_store._sessions)} # 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: log("⚠️ Static directory not found") # No UI built, just health endpoint @app.get("/") def health_check(): return {"status": "ok", "message": "UI not found. Build Angular app first."}I not found. Build Angular app first."} if __name__ == "__main__": log("🌐 Starting Flare backend …") uvicorn.run(app, host="0.0.0.0", port=7860)