Spaces:
Running
Running
Enhance API security and functionality by adding authentication middleware and session management. Updated app.py to include the new auth router and integrated authentication checks for protected endpoints. Modified requirements.txt to include necessary libraries for session handling. Updated .env.example to include authentication credentials. Improved retrieval functions with query expansion for better medical term matching and enriched context in responses.
ddc9c77
| 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__) | |
| 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 | |
| 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" | |
| ) | |