"""Modèles Pydantic du contrat HTTP — voir le plan de migration pour le contrat exact attendu côté `apps/api` (`IntentServiceClient`, `apps/api/src/lib/recipe-matching/intent-service-client.ts`). Pas de `POST /v1/train` ici — ce service s'entraîne lui-même au démarrage depuis `training_data.py` (voir `pipeline_registry.py`/`main.py`), plus besoin d'un contrat HTTP pour ça. """ from typing import Literal from pydantic import BaseModel # --------------------------------------------------------------------------- # POST /v1/process # --------------------------------------------------------------------------- class ProcessRequest(BaseModel): locale: str text: str class EntityPayload(BaseModel): """Une mention candidate — technique ou ustensile, voir `kind` — offsets caractère `[start, end)` dans `text`, convention identique à `String.prototype.slice` côté `apps/api` (pas de décalage `+1` à appliquer côté Node, contrairement à l'ancien `NlpManager` de node-nlp). `kind` distingue de quel `PhraseMatcher` la mention vient (voir `locale_pipeline.py`'s `Entity`) — `apps/api`'s `tech-step-matcher.ts` en a besoin pour savoir laquelle des deux résoudre (`TechStep.key` vs `Utensil.key`).""" uid: str start: int end: int kind: Literal["technique", "utensil"] = "technique" class ProcessResponse(BaseModel): entities: list[EntityPayload] intent: str | None score: float # --------------------------------------------------------------------------- # GET /health # --------------------------------------------------------------------------- class HealthResponse(BaseModel): status: str