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>
43 lines
1.6 KiB
Python
43 lines
1.6 KiB
Python
"""`POST /v1/process` — appelé par `apps/api` (`IntentServiceClient.process`)
|
|
en remplacement direct de l'ancien `NlpManager.process(locale, text)`. Voir
|
|
`LocalePipeline.process` pour la sémantique exacte (locale non entraînée ou
|
|
`text` vide -> résultat vide, jamais une erreur).
|
|
"""
|
|
|
|
import logging
|
|
|
|
from fastapi import APIRouter, Depends
|
|
|
|
from ..pipeline_registry import registry
|
|
from ..schemas import EntityPayload, ProcessRequest, ProcessResponse
|
|
from ..security import require_valid_secret
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
router = APIRouter(dependencies=[Depends(require_valid_secret)])
|
|
|
|
|
|
@router.post("/v1/process", response_model=ProcessResponse)
|
|
def process(request: ProcessRequest) -> ProcessResponse:
|
|
result = registry.process(request.locale, request.text)
|
|
|
|
# Une ligne par appel — input (`locale`/`text`) et output (`entities`/
|
|
# `intent`/`score`) réunis dans la même ligne JSON, pour pouvoir suivre
|
|
# exactement ce que le pipeline a décidé pour un texte donné (voir
|
|
# `logging_config.py` pour le format).
|
|
logger.info(
|
|
"tech-step NLP process",
|
|
extra={
|
|
"locale": request.locale,
|
|
"text": request.text,
|
|
"entities": [{"uid": entity.uid, "start": entity.start, "end": entity.end} for entity in result.entities],
|
|
"intent": result.intent,
|
|
"score": result.score,
|
|
},
|
|
)
|
|
|
|
return ProcessResponse(
|
|
entities=[EntityPayload(uid=entity.uid, start=entity.start, end=entity.end) for entity in result.entities],
|
|
intent=result.intent,
|
|
score=result.score,
|
|
)
|