Spaces:
Building
Building
from fastapi import FastAPI | |
from fastapi.staticfiles import StaticFiles | |
from fastapi.responses import FileResponse | |
from fastapi.middleware.cors import CORSMiddleware | |
import uvicorn | |
import os | |
from pathlib import Path | |
import mimetypes | |
from utils import log | |
from chat_handler import router as chat_router # β start_session & chat | |
from admin_routes import router as admin_router, start_cleanup_task | |
from spark_startup import run_in_thread | |
from session import session_store, start_session_cleanup | |
from config_provider import ConfigProvider | |
# ===================== Environment Setup ===================== | |
def setup_environment(): | |
"""Setup environment based on deployment""" | |
cfg = ConfigProvider.get() | |
log("=" * 60) | |
log(f"π Flare Starting") | |
log(f"π€ LLM Provider: {cfg.global_config.llm_provider.name}") | |
log(f"π TTS Provider: {cfg.global_config.tts_provider.name}") | |
log(f"π€ STT Provider: {cfg.global_config.stt_provider.name}") | |
log("=" * 60) | |
# Check if running in HuggingFace Space | |
if os.environ.get("SPACE_ID"): | |
log("βοΈ Running in HuggingFace Space") | |
log("π Using environment secrets for API keys") | |
else: | |
log("π’ Local/On-Premise deployment") | |
if not Path(".env").exists(): | |
log("β οΈ WARNING: .env file not found!") | |
log("π Copy .env.example to .env and configure it") | |
# Run setup | |
setup_environment() | |
# Fix MIME types for JavaScript files | |
mimetypes.add_type("application/javascript", ".js") | |
mimetypes.add_type("text/css", ".css") | |
app = FastAPI( | |
title="Flare Orchestration Service", | |
version="0.1.0", | |
description="LLM-driven intent & API flow engine", | |
) | |
# CORS for development | |
if os.getenv("ENVIRONMENT") == "development": | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=["http://localhost:4200"], # Angular dev server | |
allow_credentials=True, | |
allow_methods=["*"], | |
allow_headers=["*"], | |
) | |
log("π§ CORS enabled for development") | |
run_in_thread() | |
start_cleanup_task() # Activity log cleanup | |
start_session_cleanup() # Session cleanup | |
# ---------------- Core chat/session routes -------------------------- | |
app.include_router(chat_router, prefix="/api") | |
# ---------------- Admin API routes ---------------------------------- | |
app.include_router(admin_router) | |
# ---------------- Serve Angular UI if exists ------------------------ | |
ui_path = Path(__file__).parent / "ui" / "dist" / "flare-ui" | |
if ui_path.exists(): | |
log(f"π Serving UI from: {ui_path}") | |
# Serve static files | |
app.mount("/assets", StaticFiles(directory=ui_path / "assets"), name="assets") | |
# Catch-all route for Angular routing | |
async def serve_angular(full_path: str): | |
"""Serve Angular app for all non-API routes""" | |
# Skip API routes | |
if full_path.startswith("api/"): | |
return {"error": "API endpoint not found"} | |
# Serve index.html for all routes (Angular will handle routing) | |
return FileResponse(ui_path / "index.html") | |
else: | |
log("β οΈ UI not found - only API endpoints available") | |
def root(): | |
return { | |
"service": "Flare Orchestration Service", | |
"version": "0.1.0", | |
"status": "running", | |
"ui": "not available - build Angular UI first" | |
} | |
if __name__ == "__main__": | |
log("π Starting Flare backend on port 7860...") | |
uvicorn.run(app, host="0.0.0.0", port=7860) |