File size: 3,396 Bytes
2a8faae
 
 
 
 
 
 
 
ddc9c77
2a8faae
 
 
 
ddc9c77
2a8faae
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ddf4fef
2a8faae
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ddc9c77
2a8faae
 
 
 
 
 
 
 
ddc9c77
2a8faae
 
7a527fe
2a8faae
 
 
 
 
 
 
 
 
 
 
 
 
 
7a527fe
 
2a8faae
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111

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"
    )