from __future__ import annotations from pathlib import Path from typing import Any, Dict from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import FileResponse, HTMLResponse, JSONResponse from fastapi.staticfiles import StaticFiles from asr.config import ensure_runtime_dirs from asr.router import router as asr_router from tts.router import router as tts_router app = FastAPI(title="ASR/TTS Gateway", docs_url="/docs", redoc_url="/redoc") app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) UI_DIR = Path("/app/ui") app.include_router(asr_router, prefix="/asr", tags=["asr"]) app.include_router(tts_router, prefix="/tts", tags=["tts"]) @app.on_event("startup") def startup() -> None: ensure_runtime_dirs() if UI_DIR.exists(): app.mount("/ui", StaticFiles(directory=str(UI_DIR), html=True), name="ui") app.mount("/assets", StaticFiles(directory=str(UI_DIR / "assets")), name="assets") @app.get("/health") def health() -> Dict[str, Any]: return {"status": "ok", "ui_installed": UI_DIR.exists(), "api": "/docs"} @app.get("/", response_class=HTMLResponse) def root() -> Any: index = UI_DIR / "index.html" if index.exists(): return FileResponse(index) return JSONResponse({"status": "ok", "message": "UI not installed", "api": "/docs"})