import logging from contextlib import asynccontextmanager from fastapi import FastAPI, HTTPException from fastapi.exceptions import RequestValidationError from starlette.exceptions import HTTPException as StarletteHTTPException # Import routers from api.routers import medical, health, export, auth from api.middleware import ( ProcessTimeMiddleware, LoggingMiddleware, RateLimitMiddleware, AuthenticationMiddleware, get_cors_middleware_config ) from fastapi.middleware.cors import CORSMiddleware from api.exceptions import ( http_exception_handler, validation_exception_handler, general_exception_handler, starlette_exception_handler ) # Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) @asynccontextmanager async def lifespan(app: FastAPI): """Application lifespan management with background initialization""" # Startup logger.info("Starting Medical RAG AI Advisor API...") # Start background initialization of heavy components try: from core.background_init import start_background_initialization logger.info("🚀 Starting background initialization of components...") start_background_initialization() logger.info("API started successfully (components loading in background)") except Exception as e: logger.error(f"Failed to start background initialization: {e}") logger.info("API started with lazy loading fallback") yield # Shutdown logger.info("Shutting down Medical RAG AI Advisor API...") # Create FastAPI application app = FastAPI( title="Medical RAG AI Advisor API", description="Professional API for medical information retrieval and advisory services", version="1.0.0", docs_url="/docs", redoc_url="/redoc", lifespan=lifespan ) # Add middleware app.add_middleware(CORSMiddleware, **get_cors_middleware_config()) app.add_middleware(ProcessTimeMiddleware) app.add_middleware(LoggingMiddleware) app.add_middleware(RateLimitMiddleware, calls_per_minute=100) # Adjust as needed app.add_middleware(AuthenticationMiddleware) # Protect API endpoints # Add exception handlers app.add_exception_handler(HTTPException, http_exception_handler) app.add_exception_handler(RequestValidationError, validation_exception_handler) app.add_exception_handler(StarletteHTTPException, starlette_exception_handler) app.add_exception_handler(Exception, general_exception_handler) # Include routers app.include_router(auth.router) app.include_router(health.router) app.include_router(medical.router) app.include_router(export.router) # Root endpoint @app.get("/") async def root(): """Root endpoint with API information""" return { "name": "Medical RAG AI Advisor API", "version": "1.0.0", "description": "Professional API for medical information retrieval and advisory services", "docs": "/docs", "health": "/health", "endpoints": { "ask": "/ask", "ask_stream": "/ask/stream", "initialization_status": "/health/initialization", "export": "/export/{format}?session_id={session_id}" } } if __name__ == "__main__": import uvicorn uvicorn.run( "api.app:app", host="127.0.0.1", port=8000, reload=True, log_level="info" )