using System; using System.Collections.Generic; namespace ManagerService.Data { /// /// Une question posée au guide IA, et ce qu'il a répondu. /// Une ligne par tour de conversation — pas l'historique complet à chaque tour, /// sinon le tour 5 réécrirait les tours 1 à 4. /// /// ⚠️ RGPD : texte libre saisi par un visiteur, pouvant contenir des données /// personnelles voire sensibles (« je suis en fauteuil, c'est accessible ? »). /// Aucun identifiant nominatif — ConversationId est un GUID de session. /// Les questions brutes se purgent à 90 jours, les agrégats survivent. /// public class VisitorQuestion { public long Id { get; set; } /// GUID de session généré par le front, stable sur une conversation. Seul lien entre deux tours. public string ConversationId { get; set; } public string InstanceId { get; set; } /// Null = question posée hors d'une visite (scope instance). public string ConfigurationId { get; set; } public AppType AppType { get; set; } public bool IsVoice { get; set; } public string Language { get; set; } public string Question { get; set; } public string Reply { get; set; } public long TokensUsed { get; set; } /// Faux = le guide n'a rien trouvé. C'est la colonne qui produit le rapport de trous de contenu. public bool HasAnswer { get; set; } /// Meilleur score de similarité du retrieval. 0 tant que le RAG n'est pas branché. public double TopScore { get; set; } /// Contenus cités dans la réponse (Section.Id / Resource.Id). public List CitedContentIds { get; set; } /// Rempli a posteriori par le job de regroupement, null jusque-là. public string ThemeId { get; set; } public DateTime CreatedAt { get; set; } } }