Spaces:
Running
Running
| 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, hbv_assessment | |
| from api.middleware import ( | |
| ProcessTimeMiddleware, | |
| LoggingMiddleware, | |
| RateLimitMiddleware, | |
| 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 HBV AI Assistant API...") | |
| # Start background initialization of heavy components (optional for AI chat) | |
| 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 HBV AI Assistant API...") | |
| # Create FastAPI application | |
| app = FastAPI( | |
| title="HBV AI Assistant API", | |
| description="HBV Patient Selection System - Evaluates patient eligibility for HBV treatment according to SASLT 2021 guidelines", | |
| 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 | |
| # 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(hbv_assessment.router) # Primary HBV assessment endpoint | |
| app.include_router(medical.router) # Optional AI chat for guideline exploration | |
| # Root endpoint | |
| async def root(): | |
| """Root endpoint with API information""" | |
| return { | |
| "name": "HBV AI Assistant API", | |
| "version": "1.0.0", | |
| "description": "HBV Patient Selection System - Evaluates patient eligibility for HBV treatment according to SASLT 2021 guidelines", | |
| "docs": "/docs", | |
| "endpoints": { | |
| "assess": "/assess (POST) - Primary endpoint for HBV patient eligibility assessment", | |
| "assess_text": "/assess/text (POST) - Text-based HBV patient eligibility assessment", | |
| "ask": "/ask (POST) - Optional AI chat for guideline exploration", | |
| "ask_stream": "/ask/stream (POST) - Streaming AI chat responses", | |
| "health": "/health (GET) - Simple health check", | |
| } | |
| } | |
| # Simple health check endpoint | |
| async def health_check(): | |
| """Simple health check endpoint""" | |
| from datetime import datetime | |
| return { | |
| "status": "healthy", | |
| "version": "1.0.0", | |
| "timestamp": datetime.now().isoformat() | |
| } | |
| if __name__ == "__main__": | |
| import uvicorn | |
| uvicorn.run( | |
| "api.app:app", | |
| host="127.0.0.1", | |
| port=8000, | |
| reload=True, | |
| log_level="info" | |
| ) | |