Chargement...
Chargement...
LoopComment une équipe Customer Success de 4 personnes peut absorber 250+ tickets/jour, sans répondre 80 fois la même question, et sans qu'un LLM aille répondre n'importe quoi à un compte Enterprise ?
L'éditeur reçoit ~250 tickets de support par jour répartis sur 4 agents Tier-1. La répartition est typique B2B : 80 % de questions FAQ (reset password, refund policy, où trouver tel rapport), 15 % de bugs à reproduire, 5 % de problèmes complexes qui nécessitent un escalation. Avant Loop, chaque agent ouvrait la doc Notion, copiait-collait, signait, envoyait. Coût moyen : 4 minutes par ticket FAQ × 200 tickets = 13 heures-agent par jour à brûler sur du travail sans valeur. Loop attaque ce 80 % avec un pattern simple : worker .NET 10 qui poll la boîte mail toutes les 5s, ingère chaque message comme un Ticket, classifie (catégorie + priorité, classifier heuristique pour l'instant — port ML.NET prêt), retrieve les 4 meilleurs articles de la KB, demande à MEAI de drafter une réponse JSON {body, confidence, cited_article_ids}, et auto-envoie SEULEMENT si : confiance ≥ 0.90, tier client ≠ Enterprise, et statut ticket = DraftReady. Tout le reste passe en queue d'approbation humaine. L'invariant clé est sur l'agrégat : Ticket.CanAutoSend() est codifié dans le domaine, pas dans le handler — impossible qu'un dev oublie de check la tier client. Pour rester honnête : la version publique est un rebuild from scratch, pas le code livré au client, mais l'architecture, les invariants, et le workflow state-machine sont exactement ceux en prod.
L'équipe support brûlait 13 heures-agent/jour à copier-coller des réponses identiques depuis Notion. J'ai voulu prouver qu'on peut automatiser proprement le Tier-1 en .NET (MEAI + EF Core + worker pattern) sans tomber dans le piège : 1) auto-répondre n'importe quoi à un client Enterprise, 2) auto-répondre sans citer la source, 3) auto-répondre quand le modèle hallucine.
7 projets : Loop.Domain (pur C#, workflow state-machine), Application (use cases + ports), Infrastructure (EF Core + MEAI + fake email I/O), Loop.Api (Minimal APIs + Scalar UI), Loop.Worker (BackgroundService poller), Loop.Cli (Spectre demo), tests. Auto-send gate sur l'agrégat. Drafter = MEAI ou deterministic selon config. Classifier heuristique par défaut, ML.NET text-classification = swap derrière ITicketClassifier dès qu'un corpus labellisé existe.
tests verts (15 Domain, 9 Classifier, 7 Handlers, 4 API smoke, 8 invariants)
états workflow Ticket : New → Triaged → DraftReady → Replied | Escalated | Closed
auto-send possible vers un compte Enterprise (codifié sur l'agrégat)
scope mission : domaine + worker + API + portail interne support
Trois leçons sur l'intégration GenAI en .NET : 1) Les invariants critiques (auto-send, citations) DOIVENT vivre sur l'agrégat, pas dans le handler — sinon un dev les oublie. 2) Un classifier heuristique à 78 % d'accuracy est largement suffisant pour driver une sélection de prompt, et 100× plus debuggable qu'un ML.NET non-trainé. 3) Le pattern Worker + IEmailReceiver/IEmailSender ports rend l'ensemble du pipeline testable sans aucun service externe — la démo offline est la même chose que la production, juste avec des ports différents.