choupi-faq-api / models.py
Loren's picture
Finalizations
e1e71b6
Raw
History Blame Contribute Delete
2.37 kB
"""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
}
}
)