Spaces:
Sleeping
Sleeping
| """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 | |
| # ------------------------------------------------------------------ # | |
| 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, | |
| ) | |