Ajoute un logging JSON structure (meme convention que LoggerService cote apps/api) a services/tech-step-intent-service : chaque appel POST /v1/process journalise locale/texte en entree et entites/intent/score en sortie, chaque POST /v1/train journalise les uid entraines et les compteurs resultants. Chatter interne de spaCy mis a WARNING pour ne pas noyer ces lignes. Bug trouve et corrige en verifiant les octets bruts d'un log reel (pas juste son affichage terminal) : l'encodage par defaut de sys.stdout sur Windows produisait de vrais octets UTF-8 invalides pour tout texte accentue journalise (le francais des etapes de recette) — corrige par sys.stdout.reconfigure(encoding="utf-8") au demarrage. LOG_LEVEL configurable (INFO par defaut), documente dans le README du service et .env.example. Verifie : 30/30 pytest (3 nouveaux tests sur le formateur JSON), smoke test HTTP reel confirmant au niveau des octets que les caracteres accentues sont preserves, lint complet du monorepo. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
"""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)
|