"""`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, "kind": entity.kind} for entity in result.entities ], "intent": result.intent, "score": result.score, }, ) return ProcessResponse( entities=[ EntityPayload(uid=entity.uid, start=entity.start, end=entity.end, kind=entity.kind) for entity in result.entities ], intent=result.intent, score=result.score, )