Dans le monde de l’intelligence artificielle générative, l’attente est une réalité. Que ce soit pour la génération d’images (15-45 secondes), de vidéos (2-5 minutes), ou le traitement audio (30-90 secondes), les opérations IA prennent du temps. Or, l’utilisateur moderne s’attend à une réactivité instantanée des applications web.
Ce décalage engendre une forme d’incertitude : l’utilisateur ne sait pas si le système travaille ou s’il a rencontré un problème, ce qui peut, à terme, générer de la frustration. Votre système est-il en train de travailler ou a-t-il planté ? Faut-il patienter, ou tout relancer ? Cette incertitude, bien plus que la durée d’attente elle-même, est l’une des principales causes d’abandon, même lorsque la requête est bel et bien en cours de traitement.
C’est pour répondre à cette problématique fondamentale que nous avons développé le « Loading Graph » : un mécanisme clair et structuré qui informe non seulement que quelque chose se passe, mais surtout quoi, où en est le processus, et comment il progresse. Une réponse directe à l’attente silencieuse qui érode la confiance.

Le « Loading Graph » : Une architecture pensée pour l’expérience
Le « Loading Graph » dépasse largement la fonction d’une simple barre de progression. C’est un système conçu pour améliorer concrètement l’expérience utilisateur, en remplaçant les indicateurs statiques par un retour d’information contextuel et évolutif.
Philosophie architecturale : Pourquoi une entité dédicacée ?
La décision de créer un graphe de chargement dédié repose sur des principes architecturaux solides :
- Séparation des préoccupations (Separation of Concerns) : Les messages de chargement relèvent de l’interface utilisateur (UI/UX), pas de la logique métier. En isolant cette fonctionnalité, nous maintenons une séparation nette entre la logique opérationnelle et les systèmes de feedback utilisateur.
- Réutilisabilité : Un seul « Loading Graph » peut servir de multiples outils et opérations sans dupliquer la logique de génération de messages.
- Intelligence contextuelle : Plutôt qu’un banal “Chargement…”, chaque nœud fournit un message précis, adapté à l’opération en cours (ex : génération d’image, traitement audio…).
- Intégration non-intrusive : Le « Loading Graph » agit en parallèle du pipeline principal, sans interférer avec la logique métier ni compromettre la stabilité du processus.
Intégration événementielle avec LangGraph : Le rôle de on_tool_start
L’intégration de notre « Loading Graph » s’appuie sur le système d’événements de LangGraph, et plus précisément sur l’événement on_tool_start
. C’est un point d’accroche parfait pour l’activation des messages de chargement :
- Moment idéal :
on_tool_start
se déclenche exactement au début de l’exécution d’un outil, offrant le moment idéal pour initier les messages de chargement contextuels. - Identification de l’outil : L’événement contient le nom de l’outil, permettant au système de sélectionner le message approprié pour l’opération spécifique.
- Gestion propre du cycle de vie : Cette approche basée sur les événements crée un cycle de démarrage/arrêt naturel pour les messages de chargement, sans nécessiter de coordination manuelle entre les systèmes.
L’état booléen tool_executing
est crucial et agit comme un verrou logique pour éviter les conflits d’exécution et stopper proprement les messages contextuels une fois l’opération terminée.

La stratégie des trois messages progressifs
Notre recherche UX a mené à l’adoption d’un schéma de trois messages par opération, pour un équilibre optimal :
- Accusé de réception initial : Confirme que la requête a été comprise et que le traitement a commencé.
- Indication de progrès : Donne un sentiment d’avancement, réduisant le doute.
- Préparation à la complétion : Signale que l’opération touche à sa fin, préparant l’utilisateur au résultat.
Plus de trois messages seraient écrasants, moins de trois, un feedback insuffisant pour les opérations longues. Chaque catégorie d’outil possède sa propre messagerie spécialisée, reflétant les étapes techniques réelles et les attentes de l’utilisateur.

Intégration en streaming et timing asynchrone
Le « Loading Graph » s’intègre en surveillant les événements via astream_events()
de LangGraph, interceptant les événements sans perturber le flux principal. Les messages de chargement sont générés de manière asynchrone, en parallèle de l’exécution de l’outil, assurant un feedback en temps réel sans bloquer les opérations. Un délai de 2 secondes entre les messages, testé sur des outils de 6 à 8 secondes, s’est avéré optimal, mais il est crucial d’adapter ce timing aux durées réelles de vos opérations.

Robustesse et maintenance simplifiée
Le système intègre une logique de dégradation gracieuse : si un outil n’a pas de configuration spécifique pour les messages de chargement, un fallback avec des messages par défaut est automatiquement activé. Cela garantit que l’expérience utilisateur reste cohérente, même en cas d’intégration partielle.
La configuration se fait de manière déclarative via un mapping centralisé, ce qui permet d’ajouter de nouveaux outils simplement, sans modifier le code de base. Cette approche favorise la réutilisabilité, limite les effets de bord, et simplifie la maintenance en réduisant la charge cognitive liée aux évolutions du système.
Bénéfices concrets
L’intégration du Loading Graph apporte des avantages tangibles, à la fois côté utilisateur et côté technique :
- Expérience utilisateur renforcée : en réduisant le doute, en créant une perception de fluidité, et en donnant à l’application un ressenti plus professionnel et maîtrisé.
- Visibilité technique accrue : le graphe permet de monitorer les exécutions, facilite le débogage en exposant les étapes internes, et pose les bases d’un futur système de profiling ou d’optimisation.
Un gain de clarté pour l’utilisateur, un gain de contrôle pour les développeurs.
En conclusion, le Loading Graph incarne une approche structurée de l’amélioration de l’expérience utilisateur dans les systèmes IA. En tirant parti du système d’événements de LangGraph et d’une gestion rigoureuse des états, il permet de fournir un feedback pertinent sans compromettre les performances ni l’intégrité architecturale.
Le design met l’accent sur la maintenabilité, la scalabilité et la cohérence fonctionnelle, tout en conservant la robustesse nécessaire aux environnements de production. Ce projet démontre que les optimisations UX peuvent s’intégrer harmonieusement dans des architectures complexes, tout en maintenant la rigueur nécessaire au bon fonctionnement.