"""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`). """ from pydantic import BaseModel, ConfigDict, Field from pydantic.alias_generators import to_camel # --------------------------------------------------------------------------- # POST /v1/train # --------------------------------------------------------------------------- class TrainEntryPayload(BaseModel): """Une technique — mêmes champs qu'une entrée de `TECH_STEP_TRAINING_DATA` (`apps/api/src/lib/recipe-matching/tech-step-training-data.ts`) pour une locale donnée.""" uid: str synonyms: list[str] = Field(default_factory=list) utterances: list[str] = Field(default_factory=list) class TrainRequest(BaseModel): locale: str entries: list[TrainEntryPayload] class TrainResponse(BaseModel): # camelCase en sortie (`labelCount`, pas `label_count`) — cohérent avec # la convention JSON déjà en place côté `apps/api`/`packages/shared` # (voir `TechStepAuditClauseView` etc.), même si le code Python interne # reste en snake_case (convention PEP 8). model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True) locale: str label_count: int utterance_count: int synonym_count: int # --------------------------------------------------------------------------- # POST /v1/process # --------------------------------------------------------------------------- class ProcessRequest(BaseModel): locale: str text: str class EntityPayload(BaseModel): """Une mention candidate d'une technique — 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).""" uid: str start: int end: int class ProcessResponse(BaseModel): entities: list[EntityPayload] intent: str | None score: float # --------------------------------------------------------------------------- # GET /health # --------------------------------------------------------------------------- class HealthResponse(BaseModel): status: str