"""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 *et* l'entraînement de chaque locale (`PipelineRegistry.initialize`) se font 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é (chargement + entraînement), jamais pendant qu'il est encore en cours (uvicorn ne sert aucune requête tant que le `lifespan` de démarrage n'est pas terminé). Ce service est autonome : `training_data.TECH_STEP_TRAINING_DATA` vit dans ce module, `apps/api` ne pousse plus rien via HTTP (voir `pipeline_registry.py` pour le détail de ce que ça change par rapport à la version précédente). """ 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 # Avant tout le reste : `routes/process.py` journalise dès la première # requête, `initialize()` 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.initialize() yield app = FastAPI(title="tech-step-intent-service", lifespan=lifespan) app.include_router(health.router) app.include_router(process.router)