Lab 077 : Protocole AG-UI — Connecter les agents aux interfaces utilisateur¶
Ce que vous apprendrez¶
- Ce qu'est le protocole AG-UI et comment il connecte les agents aux interfaces utilisateur frontend
- Comment AG-UI complète la trilogie d'interopérabilité : MCP (outils) + A2A (agents) + AG-UI (utilisateurs)
- Analyser 12 types d'événements et leurs directions (agent→frontend vs. frontend→agent)
- Comprendre les catégories d'événements : cycle de vie, texte, outil, état et entrée
- Construire un diagramme de flux d'événements à partir d'une trace d'interaction réelle
Introduction¶
Le protocole AG-UI (Agent–User Interface) est un protocole basé sur les événements qui standardise la communication entre les agents IA et les applications frontend. Alors que MCP connecte les agents aux outils et A2A connecte les agents entre eux, AG-UI ferme la boucle en connectant les agents aux utilisateurs via leurs interfaces.
La trilogie d'interopérabilité¶
| Protocole | Connecte | Objectif |
|---|---|---|
| MCP | Agent ↔ Outils | Accès standardisé aux outils/ressources |
| A2A | Agent ↔ Agent | Collaboration multi-agents |
| AG-UI | Agent ↔ Utilisateur | Streaming en temps réel et interaction UI |
Comment ça fonctionne¶
AG-UI utilise un modèle d'événements en streaming. Au lieu d'un schéma requête/réponse, l'agent et le frontend échangent un flux continu d'événements typés :
Frontend Agent
│ │
│── RunAgent (start) ──────────►│
│ │
│◄──── LifecycleStarted ────────│
│◄──── TextMessageStart ────────│
│◄──── TextMessageContent ──────│
│◄──── TextMessageEnd ──────────│
│◄──── ToolCallStart ──────────│
│◄──── ToolCallArgs ───────────│
│◄──── ToolCallEnd ────────────│
│ │
│── ToolResult (response) ─────►│
│ │
│◄──── StateUpdate ─────────────│
│◄──── LifecycleCompleted ──────│
│ │
Le scénario¶
Vous êtes un ingénieur frontend intégrant un agent IA dans une interface alimentée par CopilotKit. Vous disposez d'un jeu de données de 12 types d'événements (agui_events.csv) qui définit chaque événement du protocole AG-UI. Votre mission : analyser les événements, comprendre leurs directions et catégories, et cartographier le flux d'événements d'une interaction agent typique.
Données simulées
Ce lab utilise un jeu de données de types d'événements simulé. Les noms d'événements, directions et catégories correspondent à la spécification du protocole AG-UI telle que définie par CopilotKit.
Prérequis¶
| Exigence | Pourquoi |
|---|---|
| Python 3.10+ | Exécuter les scripts d'analyse |
Bibliothèque pandas |
Manipulation des données |
Démarrage rapide avec GitHub Codespaces
Toutes les dépendances sont pré-installées dans le devcontainer.
📦 Fichiers de support¶
Téléchargez ces fichiers avant de commencer le lab
Enregistrez tous les fichiers dans un dossier lab-077/ de votre répertoire de travail.
| Fichier | Description | Téléchargement |
|---|---|---|
broken_agui.py |
Exercice de correction de bugs (3 bugs + auto-tests) | 📥 Télécharger |
agui_events.csv |
12 types d'événements AG-UI avec directions et catégories | 📥 Télécharger |
Étape 1 : Comprendre le modèle d'événements¶
Les événements AG-UI sont organisés par direction et catégorie :
| Direction | Signification |
|---|---|
| agent→frontend | L'agent envoie des données à l'UI (texte en streaming, appels d'outils, mises à jour d'état) |
| frontend→agent | L'utilisateur/UI envoie une entrée à l'agent (commande d'exécution, résultats d'outils) |
| Catégorie | Exemples |
|---|---|
| lifecycle | LifecycleStarted, LifecycleCompleted — marque les limites d'exécution de l'agent |
| text | TextMessageStart, TextMessageContent, TextMessageEnd — sortie de texte en streaming |
| tool | ToolCallStart, ToolCallArgs, ToolCallEnd, ToolResult — exécution d'outils |
| state | StateUpdate, StateSnapshot — synchronisation d'état partagé |
| input | RunAgent — le frontend lance une exécution d'agent |
Étape 2 : Charger et explorer les événements¶
import pandas as pd
df = pd.read_csv("lab-077/agui_events.csv")
print(f"Total event types: {len(df)}")
print(f"Directions: {df['direction'].value_counts().to_dict()}")
print(f"Categories: {df['category'].value_counts().to_dict()}")
print(f"\nAll events:")
print(df[["event_name", "direction", "category"]].to_string(index=False))
Sortie attendue :
Total event types: 12
Directions: {'agent_to_frontend': 9, 'frontend_to_agent': 3}
Categories: {'tool': 4, 'text': 3, 'lifecycle': 2, 'state': 2, 'input': 1}
Étape 3 : Analyser les directions des événements¶
Quels événements vont de l'agent vers le frontend, et lesquels vont dans l'autre sens ?
agent_to_ui = df[df["direction"] == "agent_to_frontend"]
ui_to_agent = df[df["direction"] == "frontend_to_agent"]
print(f"Agent → Frontend events: {len(agent_to_ui)}")
for _, row in agent_to_ui.iterrows():
print(f" {row['event_name']:>25s} [{row['category']}]")
print(f"\nFrontend → Agent events: {len(ui_to_agent)}")
for _, row in ui_to_agent.iterrows():
print(f" {row['event_name']:>25s} [{row['category']}]")
Aperçu de conception
Le protocole est fortement asymétrique : 9 événements vont de l'agent vers le frontend, mais seulement 3 du frontend vers l'agent. Cela reflète la réalité selon laquelle les agents produisent la majorité des données (texte en streaming, appels d'outils, mises à jour d'état) tandis que les frontends envoient principalement des commandes et des résultats d'outils.
Étape 4 : Cartographier le flux d'événements¶
Construisez une chronologie des événements pour une interaction agent typique :
# Define a typical interaction sequence
sequence = [
"RunAgent",
"LifecycleStarted",
"TextMessageStart",
"TextMessageContent",
"TextMessageEnd",
"ToolCallStart",
"ToolCallArgs",
"ToolCallEnd",
"ToolResult",
"StateUpdate",
"TextMessageStart",
"TextMessageContent",
"TextMessageEnd",
"LifecycleCompleted"
]
print("Typical AG-UI Event Flow:")
print("=" * 60)
for i, event_name in enumerate(sequence, 1):
match = df[df["event_name"] == event_name]
if not match.empty:
row = match.iloc[0]
direction = "►" if row["direction"] == "frontend_to_agent" else "◄"
side = "Frontend" if row["direction"] == "frontend_to_agent" else "Agent "
print(f" {i:>2}. {side} {direction} {event_name:<25s} [{row['category']}]")
Étape 5 : Analyser les catégories en profondeur¶
print("Events by category:\n")
for category, group in df.groupby("category"):
print(f" {category.upper()} ({len(group)} events):")
for _, row in group.iterrows():
arrow = "→" if row["direction"] == "agent_to_frontend" else "←"
print(f" {arrow} {row['event_name']}")
print()
# Summary statistics
print("Category × Direction matrix:")
pivot = df.groupby(["category", "direction"]).size().unstack(fill_value=0)
print(pivot.to_string())
Responsabilité du frontend
Lorsque l'agent émet un événement ToolCallEnd, le frontend est responsable de l'exécution de l'outil et du renvoi d'un événement ToolResult. Si le frontend ne répond pas, l'agent attendra indéfiniment. Implémentez toujours une gestion de timeout pour l'exécution des outils.
Étape 6 : Construire le résumé du protocole¶
report = f"""# 📋 AG-UI Protocol Summary
## Overview
| Metric | Value |
|--------|-------|
| Total Event Types | {len(df)} |
| Agent → Frontend | {len(agent_to_ui)} |
| Frontend → Agent | {len(ui_to_agent)} |
| Categories | {df['category'].nunique()} |
## Event Catalog
"""
for _, row in df.iterrows():
arrow = "→ Frontend" if row["direction"] == "agent_to_frontend" else "→ Agent"
report += f"| `{row['event_name']}` | {row['category']} | {arrow} |\n"
report += f"""
## Protocol Trilogy
| Protocol | Connection | Events |
|----------|-----------|--------|
| MCP | Agent ↔ Tools | Request/Response |
| A2A | Agent ↔ Agent | Task-based |
| AG-UI | Agent ↔ User | {len(df)} streaming events |
"""
print(report)
with open("lab-077/protocol_summary.md", "w") as f:
f.write(report)
print("💾 Saved to lab-077/protocol_summary.md")
🐛 Exercice de correction de bugs¶
Le fichier lab-077/broken_agui.py contient 3 bugs qui produisent une analyse d'événements incorrecte. Pouvez-vous les trouver et les corriger tous ?
Exécutez les auto-tests pour voir lesquels échouent :
Vous devriez voir 3 tests échoués. Chaque test correspond à un bug :
| Test | Ce qu'il vérifie | Indice |
|---|---|---|
| Test 1 | Nombre d'événements agent→frontend | Devrait filtrer agent_to_frontend, pas frontend_to_agent |
| Test 2 | Nombre total de types d'événements | Devrait utiliser len(df), pas df['category'].nunique() |
| Test 3 | Nombre d'événements frontend→agent | Devrait compter la direction frontend_to_agent, pas la catégorie input |
Corrigez les 3 bugs, puis relancez. Quand vous voyez All passed!, c'est terminé !
🧠 Vérification des connaissances¶
Q1 (Choix multiple) : Quel rôle joue AG-UI dans la trilogie d'interopérabilité ?
- A) Il connecte les agents aux outils et API externes
- B) Il connecte les agents entre eux pour la collaboration
- C) Il connecte les agents aux interfaces utilisateur frontend via des événements en streaming
- D) Il connecte les agents aux bases de données pour le stockage
✅ Révéler la réponse
Correct : C) Il connecte les agents aux interfaces utilisateur frontend via des événements en streaming
La trilogie d'interopérabilité se compose de MCP (agent↔outils), A2A (agent↔agents) et AG-UI (agent↔utilisateurs). AG-UI utilise un modèle d'événements en streaming pour permettre la communication en temps réel entre les agents IA et les applications frontend comme CopilotKit.
Q2 (Choix multiple) : Pourquoi le protocole AG-UI est-il asymétrique (plus d'événements agent→frontend que frontend→agent) ?
- A) Le frontend est trop lent pour envoyer beaucoup d'événements
- B) Les agents produisent la majorité des données (texte, appels d'outils, état) tandis que les frontends envoient principalement des commandes et résultats d'outils
- C) Le protocole limite les événements frontend pour des raisons de sécurité
- D) Les événements frontend sont regroupés en moins de messages
✅ Révéler la réponse
Correct : B) Les agents produisent la majorité des données (texte, appels d'outils, état) tandis que les frontends envoient principalement des commandes et résultats d'outils
Dans une interaction typique, l'agent diffuse des tokens de texte, émet des événements d'appels d'outils et pousse des mises à jour d'état — tout cela allant vers le frontend. Le rôle du frontend est principalement d'initier les exécutions (RunAgent) et de retourner les résultats d'exécution d'outils (ToolResult).
Q3 (Exécutez le lab) : Combien de types d'événements vont de l'agent vers le frontend ?
Exécutez l'analyse de l'étape 3 sur 📥 agui_events.csv et comptez les événements agent_to_frontend.
✅ Révéler la réponse
9 événements
Les événements suivants vont de l'agent vers le frontend : LifecycleStarted, LifecycleCompleted, TextMessageStart, TextMessageContent, TextMessageEnd, ToolCallStart, ToolCallArgs, ToolCallEnd et StateUpdate. Cela fait 9 sur 12 types d'événements au total.
Q4 (Exécutez le lab) : Combien de types d'événements vont du frontend vers l'agent ?
Comptez les événements avec la direction frontend_to_agent.
✅ Révéler la réponse
3 événements
Seuls 3 événements vont du frontend vers l'agent : RunAgent (entrée), ToolResult (outil) et StateSnapshot (état). Le protocole est fortement asymétrique — les agents envoient 3× plus de types d'événements que les frontends.
Q5 (Exécutez le lab) : Quel est le nombre total de types d'événements dans le protocole AG-UI ?
Chargez le CSV et vérifiez le nombre total de lignes.
✅ Révéler la réponse
12 types d'événements
Le protocole AG-UI définit exactement 12 types d'événements répartis en 5 catégories : tool (4), text (3), lifecycle (2), state (2) et input (1).
Résumé¶
| Sujet | Ce que vous avez appris |
|---|---|
| Protocole AG-UI | Protocole basé sur les événements connectant les agents aux interfaces frontend |
| Trilogie d'interopérabilité | MCP (outils) + A2A (agents) + AG-UI (utilisateurs) = écosystème d'agents complet |
| Modèle d'événements | 12 types d'événements : 9 agent→frontend, 3 frontend→agent |
| Catégories | lifecycle, text, tool, state, input |
| Architecture de streaming | Un flux continu d'événements remplace le modèle requête/réponse |
| Responsabilité du frontend | L'UI doit exécuter les outils et retourner les résultats lorsque l'agent le demande |
Prochaines étapes¶
- Lab 029 — Protocole MCP (le volet outils de la trilogie)
- Lab 070 — Modèles UX d'agents (patrons de conception pour les interfaces alimentées par des agents)
- Lab 076 — Microsoft Agent Framework (créer des agents qui parlent AG-UI)
- Lab 034 — Multi-Agent avec Semantic Kernel (agents qui collaborent via A2A)