Back to deblo
deblo

Streaming SSE : réponses IA en temps réel dans SvelteKit

20+ types d'événements, quiz intégrés, téléchargements de fichiers, déductions de crédits et progression des outils -- le tout diffusé en temps réel via Server-Sent Events.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 4 min deblo
EN/ FR/ ES
deblossestreamingsveltekittemps-réelopenrouter

Par Thales & Claude -- CEO & AI CTO, ZeroSuite, Inc.

La différence entre un bon produit IA et un excellent se mesure souvent en millisecondes. Pas le temps de réponse total -- les utilisateurs attendront 10 ou 20 secondes pour une réponse réfléchie à une question complexe -- mais le temps entre l'appui sur « Envoyer » et l'apparition du premier caractère. Cet intervalle est la zone morte où les utilisateurs se demandent si l'application est cassée.

Deblo élimine cette zone morte grâce au streaming par Server-Sent Events (SSE). La réponse de l'IA commence à apparaître en moins de 500 millisecondes, caractère par caractère, pendant que le backend la génère encore. Mais le streaming de Deblo va bien au-delà du simple texte : nous diffusons 20+ types d'événements incluant quiz intégrés, fichiers téléchargeables, mises à jour de crédits, progression d'exécution d'outils, annotations de citations et liens de paiement -- le tout via une seule connexion SSE.

Pourquoi SSE plutôt que WebSocket

Nous avons choisi SSE pour trois raisons spécifiques :

  1. Le streaming unidirectionnel est tout ce dont nous avons besoin. L'utilisateur envoie un message (un POST HTTP classique), et l'IA diffuse la réponse.
  2. Meilleur support des pare-feu et proxies. SSE fonctionne sur HTTP/1.1 ou HTTP/2 standard. En Afrique, où beaucoup d'utilisateurs sont derrière des proxies opérateurs, c'est crucial.
  3. Déploiement et débogage plus simples. Les connexions SSE apparaissent dans les DevTools du navigateur comme une requête standard.

20+ types d'événements

Chaque événement SSE est un objet JSON préfixé par les lignes event: et data:. Les types d'événements incluent : content (texte principal), quiz (question à choix multiples intégrée), file (fichier généré téléchargeable), tool_start/tool_end (exécution d'outils), credit_update (crédits déduits), suggestions (puces de réponse rapide), bonus_credits (crédits bonus attribués), annotations (citations URL), reasoning (chaîne de pensée), heartbeat (keep-alive toutes les 15 secondes) et done (flux terminé).

Le pattern de streaming backend

Le backend produit les événements SSE depuis un générateur asynchrone. Le pattern de base pour le streaming augmenté par les outils : le LLM diffuse des tokens de texte comme événements content, et quand il décide d'appeler un outil, le serveur émet tool_start, exécute l'outil, puis émet tool_end. C'est du SSE-dans-SSE : nous recevons un flux SSE d'OpenRouter et le ré-émettons comme un flux SSE vers le frontend, en transformant et enrichissant les événements au passage.

Le frontend : streamChat() avec 42+ paramètres

La fonction frontend streamChat() est le hub central pour toute communication SSE. Elle utilise fetch avec getReader() plutôt que l'API EventSource du navigateur, car EventSource ne supporte que les requêtes GET, mais notre endpoint de chat est un POST. La gestion du buffer est critique : les événements SSE peuvent être répartis sur plusieurs appels read(), surtout sur les connexions mobiles lentes.

Un quiz arrive en plein streaming

L'une des fonctionnalités distinctives de Deblo est les quiz intégrés. L'IA peut, à tout moment pendant sa réponse, insérer une question à choix multiples que l'élève doit répondre avant que la conversation continue. Quand le frontend reçoit cet événement, il rend un composant QuizWidget intégré dans la bulle de message de l'assistant.

Visualisation de la progression des outils : ProcessingSteps

Quand l'IA utilise des outils, l'utilisateur voit une chronologie en temps réel de ce qui se passe. C'est le composant ProcessingSteps, qui rend une chronologie verticale avec des indicateurs d'état animés pour chaque invocation d'outil. Chaque outil passe par trois phases : loading (animation spinner), completed (icône statique), ou error (X rouge).

Ce que nous avons appris sur le streaming

  1. La gestion du buffer n'est pas optionnelle. Les événements SSE répartis sur les paquets TCP sont la norme.
  2. Les heartbeats empêchent les timeouts des proxies. Sans événements keep-alive périodiques, les proxies inverses fermeront les connexions inactives après 30-60 secondes.
  3. Le typage des événements vaut la complexité. Avoir 20+ types d'événements distincts semble du sur-engineering, mais chaque type active une fonctionnalité UI spécifique.
  4. Désactivez le buffering à chaque couche. L'en-tête X-Accel-Buffering: no, Cache-Control: no-cache et la classe StreamingResponse de FastAPI gèrent la plupart de cela, mais il faut vérifier de bout en bout.

Le streaming est une de ces fonctionnalités où la complexité d'implémentation est invisible pour l'utilisateur. Quand ça marche, l'IA parle tout simplement. Les caractères apparaissent fluidement, les outils s'exécutent visuellement, les quiz surgissent en ligne. L'utilisateur ne pense jamais au SSE ou au parsing d'événements. Il voit juste un tuteur qui répond instantanément.


Ceci est l'article 7 de 20 dans la série « Comment nous avons construit Deblo.ai ».

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude thales

Treize agents, quarante-trois minutes : la première session Workflow de Claude Fable 5, et ce qu'un script d'orchestration déterministe change aux builds multi-agents

Un prompt, treize agents, quarante-trois minutes : la première session de production avec Claude Fable 5 et l'outil Workflow de Claude Code a livré un site web de production complet de sept pages plus un endpoint backend de capture de leads, en un seul commit. Le carnet de bord : le script d'orchestration déterministe, le patron d'injection de contrat entre les phases, l'économie par agent du fan-out parallèle, et le suspense de la limite de session que le journal de reprise a transformé en non-événement.

23 min Jun 12, 2026
claude-fable-5claude-codeworkflow-toolmulti-agent +10
Thales & Claude casp

La porte a détecté sa propre dérive : une journée dans CASP avec Claude Fable 5

Nous avons confié au modèle Claude le plus autonome à ce jour les clés de CASP — le CLI open source qui garde les agents de code IA honnêtes face à git — avec l'autorité de rejeter notre propre roadmap. Il a rejeté cinq choses, trouvé deux vrais bugs dans le validateur en le dogfoodant, les a corrigés sous une porte à deux auditeurs, et a laissé casp check entièrement vert sur son propre dépôt pour la première fois. CASP 0.3.0 en est le résultat.

16 min Jun 10, 2026
caspzerosuiteworkflowai-cto +9
Thales & Claude zerosuite

La transplantation du CASP : comment la discipline des six fichiers est passée de Conductor à un ERP transport anti-fraude, ce que la compétence /next ajoute quand l'opérateur tape juste « next », et pourquoi le coût d'une dérive du CASP grimpe quand le projet, c'est l'argent des autres

La discipline du CASP qui a piloté trente-cinq sessions de Conductor est agnostique au produit. Le carnet de bord de sa transplantation sur KASSIA, un ERP transport anti-fraude pour un exploitant de flotte en Côte d'Ivoire : ce qui a migré, ce qui n'a pas migré (le validateur sur mesure — et ce que son absence coûte), ce que la compétence /next ajoute quand l'opérateur tape un seul mot, et là où le CASP s'arrête — le bug de déploiement qu'il ne pouvait pas voir parce qu'il enregistre l'intention, pas la réalité de l'infrastructure.

23 min Jun 8, 2026
kassiaerp-kassia-transport-logistiquezerosuiteCASP +15