| from __future__ import annotations |
| import logging |
| from contextlib import asynccontextmanager |
| from pathlib import Path |
|
|
| from fastapi import FastAPI |
| from fastapi.middleware.cors import CORSMiddleware |
|
|
| from api.routes import amd, crisis_room, demo, incidents, reports |
| from core.config import get_settings |
|
|
| logging.basicConfig( |
| level=logging.INFO, |
| format="%(asctime)s — %(name)s — %(levelname)s — %(message)s", |
| ) |
| logger = logging.getLogger(__name__) |
|
|
|
|
| @asynccontextmanager |
| async def lifespan(app: FastAPI): |
| settings = get_settings() |
| storage_path = Path(settings.storage_path) |
| for sub in ("sessions", "incidents", "signals", "resources", "dispatch"): |
| (storage_path / sub).mkdir(parents=True, exist_ok=True) |
| logger.info("ReliefLensAI backend started (demo_mode=%s)", settings.demo_mode) |
| yield |
| logger.info("ReliefLensAI backend shutting down") |
|
|
|
|
| app = FastAPI( |
| title="ReliefLensAI", |
| description="Real-time multimodal disaster triage system powered by AMD MI300X + vLLM", |
| version="1.0.0", |
| lifespan=lifespan, |
| ) |
|
|
| app.add_middleware( |
| CORSMiddleware, |
| allow_origins=["*"], |
| allow_credentials=True, |
| allow_methods=["*"], |
| allow_headers=["*"], |
| ) |
|
|
| app.include_router(crisis_room.router, prefix="/api") |
| app.include_router(reports.router, prefix="/api") |
| app.include_router(incidents.router, prefix="/api") |
| app.include_router(amd.router, prefix="/api") |
| app.include_router(demo.router, prefix="/api") |
|
|
|
|
| @app.get("/health", tags=["health"]) |
| async def health_check() -> dict: |
| settings = get_settings() |
| return { |
| "status": "healthy", |
| "demo_mode": settings.demo_mode, |
| "app_env": settings.app_env, |
| } |
|
|
|
|
| @app.get("/", tags=["root"]) |
| async def root() -> dict: |
| return {"name": "ReliefLensAI", "version": "1.0.0", "status": "ready"} |
|
|