import logging from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app import __version__ from app.config import get_settings from app.routers import analyze, compare, negotiate, stream from app.schemas import HealthResponse from app.services import retrieval logger = logging.getLogger("lexguard") @asynccontextmanager async def lifespan(app: FastAPI): settings = get_settings() logging.basicConfig(level=settings.log_level.upper()) logger.info("LexGuard backend starting — model=%s (vertex=%s)", settings.active_model, settings.use_vertex) retrieval.warmup() yield logger.info("LexGuard backend shutting down") app = FastAPI( title="LexGuard API", version=__version__, description="Multi-agent contract intelligence — Vertex AI Gemini 2.0 Flash", lifespan=lifespan, ) settings = get_settings() app.add_middleware( CORSMiddleware, allow_origins=settings.cors_origin_list, allow_credentials=False, allow_methods=["GET", "POST", "OPTIONS"], allow_headers=["*"], ) app.include_router(analyze.router, prefix="/api") app.include_router(stream.router, prefix="/api") app.include_router(negotiate.router, prefix="/api") app.include_router(compare.router, prefix="/api") @app.get("/api/health", response_model=HealthResponse) def health() -> HealthResponse: return HealthResponse(status="ok", version=__version__, model=settings.active_model) @app.get("/") def root() -> dict[str, str]: return { "name": "LexGuard API", "version": __version__, "docs": "/docs", "health": "/api/health", }