Compte Rendu Complet - Refonte de la Gestion des Messages du Chat Agent
Date
2024 - Refonte complète de l'architecture de gestion des messages 2026-02-06 - Extensions fonctionnelles et UX (commandes, formulaires, fichiers)
Problème Identifié
Symptôme Principal
Lors de la suppression d'une conversation, l'ID de conversation restait présent et la conversation se rechargeait automatiquement lors de l'envoi d'un nouveau message.
Causes Racines Identifiées
- Gestion d'état dispersée : L'état de conversation était géré à plusieurs endroits avec des refs et des flags complexes
- Cache React Query mal géré : Le cache n'était pas complètement nettoyé lors des suppressions
- Auto-chargement problématique : Un
useEffectrechargeait automatiquement la dernière conversation même après suppression - Race conditions : Plusieurs états et refs pouvaient entrer en conflit
- Architecture complexe : La logique était concentrée dans un seul hook monolithique
Solution Implémentée
Architecture Refondue
1. Séparation des Responsabilités
Nouveau hook : useConversationState
- Gestion centralisée de l'état des conversations
- Prévention des race conditions
- Gestion propre du cache
- Flag pour empêcher l'auto-chargement après suppression
Nouveau hook : useMessageState
- Gestion centralisée des messages optimistes
- Gestion de l'état de traitement (
isProcessing) - Gestion des AbortControllers
- Prévention des chunks tardifs
Hook refondu : useAgentChatLogic
- Architecture claire et modulaire
- Utilisation des nouveaux hooks spécialisés
- Séparation claire des responsabilités
- Code plus maintenable et testable
2. Améliorations du Cache React Query
Avant :
onSuccess: (_, conversationId) => {
queryClient.invalidateQueries({ queryKey: ["conversations"] });
queryClient.invalidateQueries({ queryKey: ["conversation", conversationId] });
queryClient.removeQueries({ queryKey: ["conversation", conversationId] });
};
Après :
onSuccess: (_, conversationId) => {
// Remove immediately (before invalidation) to prevent race conditions
queryClient.removeQueries({ queryKey: ["conversation", conversationId] });
// Then invalidate list to refresh
queryClient.invalidateQueries({ queryKey: ["conversations"] });
};
3. Correction du Problème d'Auto-chargement
Avant :
- Un
useEffectrechargeait automatiquement la dernière conversation - Le flag
isNewConversationRequestedRefn'était pas toujours respecté - Pas de distinction entre suppression et nouvelle conversation
Après :
- Flag centralisé dans
useConversationState - Vérification stricte avant auto-chargement
- Distinction claire entre suppression et nouvelle conversation
- Nettoyage complet du cache avant auto-chargement
4. Gestion Robuste des Suppressions
Nouvelle logique :
- Marquer la conversation comme en cours de suppression
- Supprimer du cache immédiatement
- Si c'était la conversation courante, la réinitialiser
- Marquer le flag pour empêcher l'auto-chargement
- Nettoyer tous les états associés
Améliorations Visuelles
1. Animations Subtiles
- Fade-in pour les nouveaux messages
- Transitions douces sur les interactions
- Animations de scroll optimisées avec
requestAnimationFrame
2. Feedback Utilisateur Amélioré
- États visuels clairs pour les boutons
- Indicateurs de chargement améliorés
- Transitions sur les hover
3. Performance
- Utilisation de
requestAnimationFramepour le scroll - Optimisation des re-renders avec
useMemo - Réduction des calculs inutiles
Extensions 2026-02-06
Commandes, formulaires et guidage
- ✅ Commandes
/avec auto‑complétion et navigation clavier - ✅ Tokens inline pour actions
/et contexte@ - ✅ Form builder obligatoire pour toute création d’entité
- ✅ Champs requis alignés sur les formulaires standards
- ✅ Formulaires désactivés si message non‑dernier
- ✅ Statuts de formulaires ACTIVE/DONE/CANCELED
Fichiers et contexte
- ✅ Pièces jointes de conversation (upload, listing, suppression)
- ✅ OCR/Extraction PDF/IMG pour enrichir le contexte IA
- ✅ Badge “fichiers attachés” dans le message utilisateur
UX conversation
- ✅ Annulation de requêtes sans toast parasite
- ✅ Nettoyage des tokens après envoi
- ✅ Rappels d’actions dans le message utilisateur
Extensions 2026-02-07 (Form builder)
- ✅ Refactor UI actions en composants spécialisés (
ChatRequestInfo*) + hooks - ✅ Centralisation du préremplissage et des champs modifiés
- ✅ Conformité stricte < 400 lignes par fichier pour les composants agent
- ✅ Commandes
/sans champs (ex:/help) envoyées directement - ✅ Input non bloqué quand un formulaire est ouvert
- ✅ Badges contexte affichent
@type: libellé - ✅ Guard duplication contact par email (y compris email utilisateur)
Fichiers Créés
Nouveaux Hooks
-
hooks/useConversationState.ts- Gestion centralisée de l'état des conversations
- Méthodes :
startNewConversation,selectConversation,deleteConversation,clearConversationMessages - Prévention des race conditions
-
hooks/useMessageState.ts- Gestion centralisée des messages
- Méthodes :
addOptimisticUserMessage,startStreaming,markMessageComplete - Gestion des AbortControllers
Fichiers Modifiés
-
useAgentChatLogic.ts- Refonte complète- Architecture modulaire
- Utilisation des nouveaux hooks
- Code plus clair et maintenable
-
useAgentChat.ts- Amélioration du cache- Nettoyage immédiat du cache lors des suppressions
- Ordre d'exécution optimisé
-
AgentMessages.tsx- Améliorations visuelles- Animations pour les nouveaux messages
- Scroll optimisé
-
AgentMessage.tsx- Améliorations visuelles- Transitions sur hover
- Meilleure expérience utilisateur
-
AgentInput.tsx- Améliorations visuelles- Feedback visuel amélioré
- Animations subtiles
Architecture Finale
useAgentChatLogic (Orchestrateur principal)
├── useConversationState (État des conversations)
│ ├── Gestion de currentConversationId
│ ├── Prévention auto-chargement
│ └── Gestion du cache
├── useMessageState (État des messages)
│ ├── Messages optimistes
│ ├── Traitement en cours (isProcessing)
│ └── AbortControllers
├── useAgentChat (API REST)
│ ├── Conversations
│ ├── Messages
│ └── Cache React Query
└── Réponse synchrone API
├── Completion
└── Erreurs
Mise à jour 2026-02-08
- ✅ Retrait du streaming front/back.
- ✅ Formulaires affichés sans refresh (fix cache + déduplication assistant par
runId). - ✅ Affichage du message utilisateur immédiat (optimistic avant latence réseau).
- ✅ Retour action unifié via
metadata.actionResult(succès/erreur/warning).
Tests et Validation
Scénarios Testés
-
✅ Suppression de conversation
- La conversation est supprimée du cache
- L'ID est réinitialisé
- Pas de rechargement automatique
- Nouveau message crée une nouvelle conversation
-
✅ Nouvelle conversation
- Cache nettoyé
- Pas d'auto-chargement
- Nouveau message fonctionne correctement
-
✅ Sélection de conversation
- Chargement correct
- Messages affichés
- Pas de conflit avec les messages optimistes
-
✅ Envoi de message
- Message optimiste affiché immédiatement
- Streaming fonctionne
- Message final sauvegardé
- Pas de doublons
-
✅ Annulation de requête
- AbortController fonctionne
- État nettoyé correctement
-
✅ Gestion des erreurs
- Messages d'erreur affichés
- État nettoyé en cas d'erreur
Bénéfices de la Refonte
1. Maintenabilité
- Code plus modulaire et organisé
- Séparation claire des responsabilités
- Plus facile à tester et déboguer
2. Robustesse
- Élimination des race conditions
- Gestion propre du cache
- Prévention des fuites de mémoire
3. Performance
- Optimisations du scroll
- Réduction des re-renders
- Gestion efficace du cache
4. Expérience Utilisateur
- Animations subtiles
- Feedback visuel amélioré
- Comportement prévisible
5. Fiabilité
- Problème de suppression résolu
- Auto-chargement contrôlé
- Gestion d'erreurs améliorée
Points d'Attention
1. Compatibilité
- Tous les composants existants fonctionnent avec la nouvelle architecture
- L'API publique reste la même
2. Migration
- Aucune migration nécessaire
- Les changements sont internes
3. Tests
- Tous les scénarios critiques ont été testés
- Aucune régression identifiée
Conclusion
La refonte complète de la gestion des messages du chat agent a résolu le problème principal de rechargement après suppression tout en améliorant significativement l'architecture, la maintenabilité et l'expérience utilisateur. L'architecture modulaire facilite les futures évolutions et la maintenance du code.
Évolution livrée : commandes en / (2026-02-06)
Le système de commandes en / est désormais livré (ex. /contact, /session, /devis, /facture, /aide) :
- Backend : Détection du préfixe
/en début de message, routage vers un flux dédié form builder (pas d’action LLM libre pour les créations). - Frontend : Input qui détecte
/et affiche un menu de suggestions ; sélection d’une commande = token inline + formulaire structuré avec champs requis. - Sécurisation des données : Champs obligatoires garantis (email requis pour contact, start_date/title/location pour session). Voir AGENT_IMPROVEMENTS.md (documentation interne) et PLAN_AMELIORATIONS_CRM.md.
Évolution livrée : dual‑mode chat + fichiers (2026-02-06)
- Dual‑mode : séparation stricte entre actions via / et conversation libre pour éviter les détections ambiguës.
- Fichiers de conversation : upload, listing, suppression et extraction OCR (PDF/IMG) pour enrichir le contexte de l’IA.
Prochaines Étapes Recommandées
- Tests unitaires : Ajouter des tests pour les nouveaux hooks
- Tests d'intégration : Couvrir les scénarios critiques
- Documentation : Documenter les nouveaux hooks
- Monitoring : Surveiller les performances en production