"""Modèles Pydantic pour les requêtes et réponses API.""" from typing import Optional from pydantic import BaseModel, Field, ConfigDict class QuestionInput(BaseModel): """Modèle pour une question d'entrée.""" question: str = Field(..., min_length=1, max_length=500, description="Question en texte libre") threshold: Optional[float] = Field( None, ge=0.0, le=1.0, description="Seuil de similarité cosinus souhaité entre 0.0 et 1.0. Si omis, la valeur par défaut du service est utilisée.", ) model_config = ConfigDict( json_schema_extra={ "example": { "question": "On a besoin de télécharger une application côté famille ?", "threshold": 0.85 } } ) class AnswerOutput(BaseModel): """Modèle pour une réponse de sortie.""" question: str = Field(..., description="Question posée") formulation: str = Field(..., description="Formulation de la question trouvée dans la base FAQ") answer: str = Field(..., description="Réponse trouvée dans la base FAQ") theme: str = Field(..., description="Thème/catégorie de la réponse") similarity_score: float = Field(..., ge=0.0, le=1.0, description="Score de similarité cosinus [0, 1]") confidence: bool = Field(..., description="True si score >= seuil de confiance, False sinon") model_config = ConfigDict( json_schema_extra={ "example": { "question": "On a besoin de télécharger une application côté famille ?", "formulation": "Les parents ont-ils besoin de télécharger une application ?", "answer": "Non. Les parents accèdent aux médias via un lien web reçu par e-mail, sans installation requise.", "theme": "need_download_family_app", "similarity_score": 0.889, "confidence": True } } ) class HealthResponse(BaseModel): """Modèle pour la réponse health check.""" status: str = Field(..., description="État du service") faq_count: int = Field(..., description="Nombre de questions dans la base FAQ") model_config = ConfigDict( json_schema_extra={ "example": { "status": "ok", "faq_count": 3 } } )