"""Point d'entrée FastAPI — `uv run uvicorn intent_service.main:app` (voir le Dockerfile et le README de ce service). Le chargement des modèles spaCy de base (`PipelineRegistry.preload_all`) se fait dans le handler `lifespan` ci-dessous, *avant* qu'uvicorn n'accepte de requêtes — `GET /health` ne répond donc `200` qu'une fois ce coût payé, jamais pendant un chargement encore en cours (uvicorn ne sert aucune requête tant que le `lifespan` de démarrage n'est pas terminé). """ from contextlib import asynccontextmanager from fastapi import FastAPI from .config import settings from .logging_config import configure_logging from .pipeline_registry import registry from .routes import health, process, train # Avant tout le reste : `routes/process.py`/`routes/train.py` journalisent # dès la première requête, `preload_all()` ci-dessous journalise aussi (voir # `pipeline_registry.py`) — le formateur JSON doit déjà être en place. configure_logging(settings.log_level) @asynccontextmanager async def lifespan(app: FastAPI): registry.preload_all() yield app = FastAPI(title="tech-step-intent-service", lifespan=lifespan) app.include_router(health.router) app.include_router(train.router) app.include_router(process.router)