devjhawar's picture
Upload folder using huggingface_hub
b9ba43b verified
"""PolicyDecoder RAG API β€” FastAPI application entry point."""
import sys
import io
import os
# Force UTF-8 encoding for stdout and stderr on Windows to prevent logging crashes
if sys.platform == "win32":
try:
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
except Exception:
pass # Fallback if buffer is not available
from contextlib import asynccontextmanager
import logging
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import uvicorn
from api.routes.query import router as query_router
from api.routes.ingest import router as ingest_router
from api.routes.health import router as health_router
logger = logging.getLogger(__name__)
def _get_cors_origins() -> list[str]:
raw_origins = os.getenv("CORS_ORIGINS", "*")
origins = [origin.strip() for origin in raw_origins.split(",") if origin.strip()]
return origins or ["*"]
# ------------------------------------------------------------------ #
# Lifespan β€” pre-load heavy components once at startup
# ------------------------------------------------------------------ #
@asynccontextmanager
async def lifespan(app: FastAPI):
logger.info("Lifespan: Loading heavy components...")
from rag_engine.services.query_service import QueryService
logger.info("Initializing QueryService...")
app.state.query_service = QueryService()
logger.info("QueryService loaded and ready")
yield # app is running
# shutdown cleanup (nothing required for now)
# ------------------------------------------------------------------ #
# App
# ------------------------------------------------------------------ #
app = FastAPI(
title="PolicyDecoder RAG API",
description="AI-powered insurance policy Q&A engine",
version="1.0.0",
lifespan=lifespan,
)
# CORS β€” wide open for development; backend team will restrict in prod
cors_origins = _get_cors_origins()
app.add_middleware(
CORSMiddleware,
allow_origins=cors_origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# ------------------------------------------------------------------ #
# Routers
# ------------------------------------------------------------------ #
app.include_router(query_router)
app.include_router(ingest_router)
app.include_router(health_router)
# ------------------------------------------------------------------ #
# Dev entry point
# ------------------------------------------------------------------ #
if __name__ == "__main__":
uvicorn.run(
"api.main:app",
host=os.getenv("HOST", "0.0.0.0"),
port=int(os.getenv("PORT", "8000")),
reload=True,
)