Vue d’ensemble
Le flux de réponse consiste en une séquence d’événements. Chaque événement a untype et une charge utile data. Le client doit écouter ces événements pour reconstruire l’activité de l’agent et le contenu final du message.
Types d’Événements
Voici les principaux types d’événements que vous rencontrerez :Événements d’Initialisation
connection_established
Envoyé immédiatement lorsque la connexion SSE est ouverte avec succès.
agent_processing_started
Indique que l’agent a reçu la demande et a commencé le traitement.
response_stream_start
Signale le début du flux de contenu.
Événements d’Exécution
agent_step_started
Déclenché lorsque l’agent commence une étape spécifique de son plan.
agent_step_progress
Fournit des mises à jour sur la progression de l’étape actuelle.
agent_response_update
Fournit une mise à jour complète du contenu de la réponse de l’agent. Ceci est souvent utilisé pour la synchronisation ou lorsque la réponse entière doit être rafraîchie.
agent_step_completed
Indique qu’une étape spécifique a été complétée avec succès.
agent_progress
Fournit une mise à jour de la progression globale de la tâche de l’agent.
response_chunk
Contient un fragment de texte partiel de la réponse de l’agent. Ces fragments doivent être concaténés pour former le texte complet. Ce flux inclut à la fois la réponse en langage naturel de l’agent et les balises injectées pour les appels d’outils.
checkpoint_created
Indique qu’un point de contrôle a été atteint dans le flux d’exécution de l’agent.
input_required
L’agent nécessite une entrée utilisateur pour continuer. Cela se produit généralement à un point de contrôle spécifique.
Événements d’Exécution d’Outils
Événements liés à l’utilisation d’outils par l’agent. Notez que la représentation textuelle des appels d’outils (entrées/sorties) apparaît dans le fluxresponse_chunk, tandis que ces événements fournissent des mises à jour de statut structurées.
Pour un tutoriel détaillé sur la façon de gérer ces événements pour construire une interface utilisateur riche, veuillez consulter le guide Gestion du Streaming d’Outils.
tool_update
Mises à jour sur le statut d’exécution de l’outil, les phases ou les métadonnées.
tool_partial_update
Sortie en continu d’un outil (par exemple, un processus long, du contenu généré, ou la “pensée” d’un sous-agent).
tool_input_required
L’outil nécessite une intervention ou une confirmation humaine.
Événements de Fin
agent_processing_complete
Indique que l’agent a terminé sa tâche.
Analyse du Contenu de la Réponse
Les événementsresponse_chunk transportent le texte brut généré par l’agent. Ce texte contient souvent des balises structurées (comme <<TOOL_STEP_START>>, <<thinking>>, etc.) qui représentent l’état interne et les actions de l’agent.
Pour une référence détaillée sur la façon d’analyser ces balises et de structurer le message final, veuillez consulter le guide Structure des Messages d’Agent.
Gestion et Reconstruction du Contenu
Pour afficher correctement la réponse de l’agent, vous avez deux options principales :Option 1 : Utiliser le SDK Ubik Agent (Recommandé)
La façon la plus simple de gérer le flux d’événements est d’utiliser les SDK officiels, qui gèrent automatiquement la connexion, l’analyse des événements, le réassemblage des morceaux et la reconstruction des messages. Ces SDK fournissent une représentation Markdown propre et prête à être affichée de l’activité de l’agent.Note : Les SDKubik-agent(JavaScript/TypeScript) etubik-agent-py(Python) sont actuellement en cours de développement.
Option 2 : Traiter les Événements Bruts (Avancé)
Si vous construisez une interface personnalisée ou ne pouvez pas utiliser les SDK, vous pouvez traiter directement les événements SSE bruts. Cela nécessite d’implémenter vous-même la logique de reconstruction d’état. Pour refléter fidèlement le comportement de l’agent, il est recommandé d’utiliser une approche de reconstruction d’état plutôt qu’un simple flux de concaténation.Logique de Reconstruction (Rebuild)
L’implémentation recommandée maintient une liste chronologique de tous les événements et reconstruit le contenu complet du message à chaque mise à jour. Voici la logique :- Stocker la Séquence : Ajoutez chaque événement entrant (
step_started,response_chunk,checkpoint, etc.) dans un tableaueventSequence. - Trier : Assurez-vous que les événements sont triés par horodatage.
- Générer le Contenu : Parcourez la séquence pour construire la chaîne finale. Pour les détails sur la construction des éléments de message, consultez le guide Structure des Messages d’Agent :
- Étapes (
agent_step_started) : Ouvrez un bloc avec<<STEP_START>>. Tous lesresponse_chunkassociés à cette étape doivent être insérés à l’intérieur. Fermez avec<<STEP_END>>une fois l’étape terminée ou lors du changement d’étape. - Fragments hors étape (
response_chunk) : Si un fragment n’est pas associé à une étape, il est ajouté directement au contenu principal (souvent après un saut de ligne). - Points de Contrôle (
checkpoint_created) : Insérez des balises<<CHECKPOINT_START>>…<<CHECKPOINT_END>>à la position chronologique appropriée. - Entrées Requises (
input_required) : Générez un bloc<<INPUT_REQUIRED_START>>contenant l’invite et les types attendus. Si une entrée a été fournie, incluez-la dans un bloc<<USER_INPUT_PROVIDED_START>>. - Outils (
tool_update) : Ces événements fournissent l’état en temps réel. Bien que vous puissiez les injecter dans le texte avec des balises temporaires (comme<<TOOL_EVENT_START>>) pour l’affichage, il est recommandé d’utiliser directement les données de l’événement pour rendre des composants d’interface utilisateur réactifs (spinners, journaux d’état) au-dessus du flux de texte. Ces balises temporaires ne sont pas conservées dans l’historique final.
- Étapes (
chunks) sont correctement représentés dans le message final.
Charges Utiles Volumineuses (Chunking)
Pour les événements très volumineux qui dépassent les limites SSE, le système peut diviser un événement unique en plusieurs morceaux. Ces événements ont un type se terminant par_delta_sse (par exemple, response_chunk_delta_sse, tool_update_delta_sse, agent_processing_complete_delta_sse).
Note : Tout type d’événement peut être fragmenté si sa charge utile est suffisamment importante. Le client doit être prêt à gérer les variantes _delta_sse pour tous les types d’événements.
La charge utile pour ces événements comprend :
chunk_id: ID unique pour l’événement divisé.chunk_index: Index du morceau actuel (base 0).total_chunks: Nombre total de morceaux à attendre.original_event_type: Le type de l’événement en cours de reconstruction.chunk_data: La chaîne de données partielle.
- Mettre en mémoire tampon les morceaux entrants par
chunk_id. - Lorsque
receivedChunks === totalChunks, joindre leschunk_datadans l’ordre. - Analyser la chaîne jointe en tant que JSON.
- Traiter le résultat comme un événement standard de type
original_event_type.
Exemple : Gestionnaire d’Événements JavaScript
Voici un exemple simplifié de la façon dont vous pourriez gérer ces événements dans une application frontend :Gestion des Erreurs
Si une erreur survient pendant le traitement, vous pouvez recevoir un événementagent_processing_error.
<<ERROR_START>> et <<ERROR_END>>, suivies éventuellement des détails JSON dans <<ERROR_JSON_START>>.
