File size: 2,368 Bytes
72c8410
9be7c54
 
c0724a5
72c8410
 
 
 
e1e71b6
9be7c54
 
 
 
 
 
72c8410
c0724a5
 
72c8410
9be7c54
e1e71b6
72c8410
 
c0724a5
72c8410
 
 
 
 
c0724a5
72c8410
 
 
 
 
c0724a5
 
72c8410
c0724a5
 
72c8410
 
9be7c54
72c8410
 
 
c0724a5
72c8410
 
 
 
 
 
 
c0724a5
 
72c8410
 
 
 
 
c0724a5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"""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
            }
        }
    )