Outils d'interface utilisateur
La crate adk-ui permet aux agents IA de gรฉnรฉrer dynamiquement des interfaces utilisateur riches via des appels d'outils. Les agents peuvent afficher des formulaires, des cartes, des alertes, des tableaux, des graphiques, et plus encore - le tout via une API Rust de type sรปr qui se sรฉrialise en JSON pour la consommation frontend.
Ce que vous allez construire

Concepts Clรฉs :
- Formulaires - Recueillir les entrรฉes utilisateur avec divers types de champs
- Cartes - Afficher des informations avec des boutons d'action
- Tableaux - Prรฉsenter des donnรฉes structurรฉes en lignes/colonnes
- Graphiques - Visualiser des donnรฉes avec des diagrammes ร barres, linรฉaires, en aires, circulaires
- Alertes - Afficher des notifications et des messages d'รฉtat
- Modales - Dialogues de confirmation et interactions ciblรฉes
- Toasts - Brรจves notifications d'รฉtat
- Interopรฉrabilitรฉ de Protocole - รmettre l'interface utilisateur sous forme de charges utiles A2UI, AG-UI, ou MCP Apps
Exemple : Tableau de bord analytique

Exemple : Formulaire d'inscription

Comment รงa marche
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ STEP 1: User requests something โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ User: "I want to register for an account" โ
โ โ
โ โ โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ AI AGENT (LLM) โ โ
โ โ "I should show a registration form" โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ STEP 2: Agent calls render_form tool โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ ๐ Tool Call: render_form({ โ
โ title: "Registration", โ
โ fields: [ โ
โ {name: "email", type: "email"}, โ
โ {name: "password", type: "password"} โ
โ ] โ
โ }) โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ STEP 3: Frontend renders the form โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ ๐ Registration โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ Email: [________________________] โ โ
โ โ Password: [________________________] โ โ
โ โ โ โ
โ โ [ Register ] โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ โ
User sees an interactive form, fills it out, clicks Register โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ STEP 4: Form submission sent back to agent โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ ๐ฉ Event: { โ
โ type: "form_submit", โ
โ data: { email: "user@example.com", password: "***" } โ
โ } โ
โ โ
โ Agent: "Great! I'll process your registration and show a success alert" โ
โ โ
โ ๐ Tool Call: render_alert({ โ
โ title: "Registration Complete!", โ
โ variant: "success" โ
โ }) โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Aperรงu
Les outils d'interface utilisateur permettent aux agents de :
- Collecter les entrรฉes utilisateur via des formulaires dynamiques avec prise en charge des zones de texte
- Afficher des informations avec des cartes, des alertes et des notifications
- Prรฉsenter des donnรฉes dans des tableaux et des graphiques interactifs (Recharts)
- Afficher la progression et les รฉtats de chargement (spinner, squelette)
- Crรฉer des mises en page de tableau de bord avec plusieurs composants
- Demander la confirmation de l'utilisateur via des modales
- Afficher des notifications toast pour les mises ร jour de statut
Dรฉmarrage rapide
Ajoutez ร votre Cargo.toml :
[dependencies]
adk-ui = { git = "https://github.com/zavora-ai/adk-ui" }
adk-agent = "2.0.0"
adk-model = "2.0.0"
Utilisation de base
use adk_rust::prelude::*;
use adk_ui::UiToolset;
use std::sync::Arc;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let model = Arc::new(GeminiModel::from_env("gemini-2.5-flash")?);
// Get all 10 UI tools
let ui_tools = UiToolset::all_tools();
// Create AI agent with UI tools
let mut builder = LlmAgentBuilder::new("ui_agent")
.model(model)
.instruction(r#"
You are a helpful assistant that uses UI components to interact with users.
Use render_form for collecting information.
Use render_card for displaying results.
Use render_alert for notifications.
Use render_modal for confirmation dialogs.
Use render_toast for brief status messages.
"#);
for tool in ui_tools {
builder = builder.tool(tool);
}
let agent = builder.build()?;
Ok(())
}
A2UI JSONL (render_screen / render_page / render_kit)
Ces outils รฉmettent du A2UI v0.9 JSONL pour la compatibilitรฉ avec les moteurs de rendu A2UI.
render_screen (surface unique)
{
"surface_id": "main",
"components": [
{ "id": "root", "component": "Column", "children": ["title", "cta"] },
{ "id": "title", "component": "Text", "text": "Welcome", "variant": "h1" },
{ "id": "cta_label", "component": "Text", "text": "Continue", "variant": "body" },
{ "id": "cta", "component": "Button", "child": "cta_label", "action": { "event": { "name": "continue" } } }
]
}
render_page (page multi-sections)
{
"title": "Release Notes",
"description": "Highlights for the latest launch.",
"sections": [
{
"heading": "Whatโs new",
"body": "Three big improvements shipped this week.",
"bullets": ["Faster onboarding", "Better search", "New dashboards"],
"actions": [{ "label": "View details", "action": "view_details", "variant": "borderless" }]
}
]
}
Composants d'interface utilisateur render_kit (catalog + tokens + templates)
{
"name": "Fintech Pro",
"version": "0.1.0",
"brand": { "vibe": "trustworthy", "industry": "fintech" },
"colors": { "primary": "#2F6BFF" },
"typography": { "family": "Source Sans 3" },
"templates": ["auth_login", "dashboard"]
}
Utilisez le React renderer pour consommer A2UI JSONL :
import {
A2uiStore,
A2uiSurfaceRenderer,
applyParsedMessages,
parseJsonl,
} from "@zavora-ai/adk-ui-react";
const store = new A2uiStore();
const parsed = parseJsonl(jsonl);
applyParsedMessages(store, parsed);
export function App() {
return <A2uiSurfaceRenderer store={store} surfaceId="main" />;
}
Outils disponibles
Formulaire render_form
Affiche des formulaires interactifs pour recueillir les entrรฉes de l'utilisateur.
{
"title": "Registration Form",
"description": "Create your account",
"fields": [
{"name": "username", "label": "Username", "type": "text", "required": true},
{"name": "email", "label": "Email", "type": "email", "required": true},
{"name": "password", "label": "Password", "type": "password", "required": true},
{"name": "newsletter", "label": "Subscribe to newsletter", "type": "switch"}
],
"submit_label": "Register"
}
Rendu :
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐ Registration Form โ
โ Create your account โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ Username * โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ Email * โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ Password * โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โขโขโขโขโขโขโขโข โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ Subscribe to newsletter [โ] โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Register โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Types de champs : text, email, password, number, date, select, multiselect, switch, slider, textarea
Carte render_card
Affiche des cartes d'information avec des boutons d'action optionnels.
{
"title": "Order Confirmed",
"description": "Order #12345",
"content": "Your order has been placed successfully. Expected delivery: Dec 15, 2025.",
"actions": [
{"label": "Track Order", "action_id": "track", "variant": "primary"},
{"label": "Cancel", "action_id": "cancel", "variant": "danger"}
]
}
Variantes de bouton : primary, secondary, danger, ghost, outline
Notification render_alert
Affiche des notifications et des messages d'รฉtat.
{
"title": "Payment Successful",
"description": "Your payment of $99.00 has been processed.",
"variant": "success"
}
Variantes : info, success, warning, error
Confirmation render_confirm
Demande la confirmation de l'utilisateur avant les actions.
{
"title": "Delete Account",
"message": "Are you sure you want to delete your account? This action cannot be undone.",
"confirm_label": "Delete",
"cancel_label": "Keep Account",
"variant": "danger"
}
Tableau render_table
Affiche des donnรฉes tabulaires.
{
"title": "Recent Orders",
"columns": [
{"header": "Order ID", "accessor_key": "id"},
{"header": "Date", "accessor_key": "date"},
{"header": "Amount", "accessor_key": "amount"},
{"header": "Status", "accessor_key": "status"}
],
"data": [
{"id": "#12345", "date": "2025-12-10", "amount": "$99.00", "status": "Delivered"},
{"id": "#12346", "date": "2025-12-11", "amount": "$149.00", "status": "Shipped"}
]
}
Graphique render_chart
Crรฉe des visualisations de donnรฉes.
{
"title": "Monthly Sales",
"chart_type": "bar",
"x_key": "month",
"y_keys": ["revenue", "profit"],
"data": [
{"month": "Jan", "revenue": 4000, "profit": 2400},
{"month": "Feb", "revenue": 3000, "profit": 1398},
{"month": "Mar", "revenue": 5000, "profit": 3800}
]
}
Types de graphiques: bar, line, area, pie
render_progress
Afficher la progression des tรขches avec des รฉtapes optionnelles.
{
"title": "Installing Dependencies",
"value": 65,
"description": "Installing package 13 of 20...",
"steps": [
{"label": "Download", "completed": true},
{"label": "Extract", "completed": true},
{"label": "Install", "current": true},
{"label": "Configure", "completed": false}
]
}
render_layout
Crรฉer des mises en page de tableau de bord avec plusieurs sections.
{
"title": "System Status",
"description": "Current system health overview",
"sections": [
{
"title": "Services",
"type": "stats",
"stats": [
{"label": "API Server", "value": "Healthy", "status": "operational"},
{"label": "Database", "value": "Degraded", "status": "warning"},
{"label": "Cache", "value": "Down", "status": "error"}
]
},
{
"title": "Recent Errors",
"type": "table",
"columns": [{"header": "Time", "key": "time"}, {"header": "Error", "key": "error"}],
"rows": [{"time": "10:30", "error": "Connection timeout"}]
}
]
}
Types de sections: stats, table, chart, alert, text
render_modal
Afficher des boรฎtes de dialogue modales pour les confirmations ou les interactions ciblรฉes.
{
"title": "Confirm Deletion",
"message": "Are you sure you want to delete this item? This action cannot be undone.",
"size": "medium",
"closable": true,
"confirm_label": "Delete",
"cancel_label": "Cancel",
"confirm_action": "delete_confirmed"
}
Tailles: small, medium, large, full
render_toast
Afficher de brรจves notifications toast pour les mises ร jour de statut.
{
"message": "Settings saved successfully",
"variant": "success",
"duration": 5000,
"dismissible": true
}
Variantes: info, success, warning, error
Outils filtrรฉs
Sรฉlectionnez uniquement les outils dont votre agent a besoin :
let toolset = UiToolset::new()
.without_chart() // Disable charts
.without_table() // Disable tables
.without_progress() // Disable progress
.without_modal() // Disable modals
.without_toast(); // Disable toasts
// Or use forms only
let forms_only = UiToolset::forms_only();
Gestion des รฉvรฉnements d'interface utilisateur
Lorsque les utilisateurs interagissent avec l'interface utilisateur rendue (soumission de formulaires, clics sur des boutons), les รฉvรฉnements sont renvoyรฉs ร l'agent :
use adk_ui::{UiEvent, UiEventType};
// UiEvent structure
pub struct UiEvent {
pub event_type: UiEventType, // FormSubmit, ButtonClick, InputChange
pub action_id: Option<String>,
pub data: Option<HashMap<String, Value>>,
}
// Convert to message for agent
let message = ui_event.to_message();
Mises ร jour de l'interface utilisateur en continu
Pour les mises ร jour d'interface utilisateur en temps rรฉel, utilisez UiUpdate pour patcher les composants par ID :
use adk_ui::{UiUpdate, UiOperation};
let update = UiUpdate {
target_id: "progress-bar".to_string(),
operation: UiOperation::Patch,
payload: Some(Component::Progress(Progress {
id: Some("progress-bar".to_string()),
value: 75,
label: Some("75%".to_string()),
})),
};
Opรฉrations : Replace, Patch, Append, Remove
Schรฉma des Composants
Les 28 types de composants prennent en charge des champs optionnels id pour les mises ร jour en streaming :
Atomes : Text, Button, Icon, Image, Badge Entrรฉes : TextInput, NumberInput, Select, MultiSelect, Switch, DateInput, Slider, Textarea Dispositions : Stack, Grid, Card, Container, Divider, Tabs Donnรฉes : Table, List, KeyValue, CodeBlock Visualisation : Chart (barres, lignes, aires, secteurs via Recharts) Retour d'information : Alert, Progress, Toast, Modal, Spinner, Skeleton
Client React
Une implรฉmentation de rรฉfรฉrence React est fournie dans le dรฉpรดt autonome adk-ui :
npm install @zavora-ai/adk-ui-react
Le client React inclut :
- TypeScript types correspondant au schรฉma Rust
- Rendu de composants pour les 28 types
- Intรฉgration de Recharts pour les graphiques interactifs
- Prise en charge du rendu Markdown
- Prise en charge du mode sombre
- Gestion de la soumission de formulaires
- Composants modaux et de notification (toast)
Architecture
Agent โโ[render_* tool]โโ> UiResponse (JSON)
โ
โ SSE
โผ
Client (React)
โ
โโโ> UiEvent (user action) โโ> Agent
Interopรฉrabilitรฉ des protocoles
Les 13 outils de rendu prennent en charge la sortie sensible au protocole via l'argument protocol :
| Protocole | Rรดle |
|---|---|
a2ui | Surfaces JSONL alignรฉes sur A2UI v0.9 (format par dรฉfaut pour render_screen et render_page) |
ag_ui | Prise en charge hybride dโAG-UI : enveloppes de compatibilitรฉ par dรฉfaut et transport dโexรฉcution natif du protocole disponible pour les clients adk-server |
mcp_apps | Compatibilitรฉ MCP payloads d'Apps avec ui:// resources, helpers de pont additifs, flux de notification, champs de requรชte runtime, et adapters HTML/resource |
Lorsque protocol est omis, les outils utilisent leur format de sortie par dรฉfaut (le format UiResponse JSON hรฉritรฉ pour la plupart des outils, A2UI pour render_screen/render_page/render_kit).
Exemple avec sรฉlection de protocole :
{
"protocol": "mcp_apps",
"mcp_apps": {
"resource_uri": "ui://demo/surface"
}
}
Adaptateurs d'interopรฉrabilitรฉ
adk-ui inclut des primitives d'adaptateur pour la conversion de protocole :
A2uiAdapterโ Convertit les surfaces canoniques en A2UI JSONLAgUiAdapterโ Convertit en charges utiles d'รฉvรฉnements AG-UIMcpAppsAdapterโ Convertit en charges utiles de ressources MCP Apps
Ceux-ci implรฉmentent un trait UiProtocolAdapter partagรฉ pour une conversion cohรฉrente entre tous les outils.
Chronologie de dรฉprรฉciation
Le profil d'exรฉcution adk_ui hรฉritรฉ contient des mรฉtadonnรฉes de dรฉprรฉciation :
| Date | Jalon |
|---|---|
| 2026-02-07 | Dรฉprรฉciation annoncรฉe |
| 2026-12-31 | Date de fin de support visรฉe |
Remplacements : a2ui, ag_ui, mcp_apps
Ces mรฉtadonnรฉes sont exposรฉes par les constantes UI_PROTOCOL_CAPABILITIES et publiรฉes par adk-server sur /api/ui/capabilities.
La rรฉponse de capacitรฉ fournit aussi implementationTier, specTrack, summary et limitations. Les clients peuvent ainsi distinguer les sous-ensembles hybrides ou compatibles dโune prise en charge entiรจrement native du protocole.
Lorsque adk-server constitue la frontiรจre cรดtรฉ hรดte, il expose รฉgalement les points dโaccรจs complรฉmentaires du pont MCP Apps : /api/ui/initialize, /api/ui/message, /api/ui/update-model-context, /api/ui/notifications/poll, /api/ui/notifications/resources-list-changed et /api/ui/notifications/tools-list-changed. Ces points dโaccรจs prรฉservent les contrats dโexรฉcution ADK existants et acceptent soit des corps de requรชte directs, soit des enveloppes proches de JSON-RPC avec des mรฉthodes ui/....
Pour les consommateurs d'exรฉcution, adk-server prend รฉgalement en charge :
x-adk-ui-transport: protocol_nativeouuiTransport: "protocol_native"pour la sรฉrialisation native AG-UI SSE- les entrรฉes de requรชte ร double chemin AG-UI via
input/agUiInputร cรดtรฉ de l'existantnewMessage - les enveloppes de pont MCP Apps ร l'intรฉrieur de
/api/run_sseviamcpAppsInitialize,mcpAppsRequestetmcpAppsInitialized
Ces ajouts sont optionnels. Les consommateurs existants de /api/run et /api/run_sse continuent de recevoir l'enveloppe gรฉnรฉrique ADK ร moins qu'ils ne demandent explicitement un mode de transport natif AG-UI.
Pour les rรฉponses d'outils MCP Apps dรฉtenues par le framework, adk-server::ui_types expose dรฉsormais :
McpUiBridgeSnapshotpour l'รฉtat de pont hรดte/application typรฉMcpUiToolResultpour l'enveloppe de rรฉponse additiveMcpUiToolResultBridgepour les mรฉtadonnรฉes de pont (protocolVersion,structuredContent,hostInfo,hostCapabilities,hostContext,appInfo,appCapabilities,initialized)
Privilรฉgiez McpUiBridgeSnapshot::build_tool_result(...) lors de la promotion de l'รฉtat du pont/de la session dans une rรฉponse d'outil. Cela standardise la forme du rรฉsultat de l'outil tout en prรฉservant les resourceUri et les html de secours en ligne pour les hรดtes orientรฉs compatibilitรฉ.
Pour les mappages d'hรดtes embarquรฉs ou de navigateur, le pont additif HTTP correspond aux flux hรดte/application comme suit :
ui/initialize->/api/ui/initializeui/message->/api/ui/messageui/update-model-context->/api/ui/update-model-contextnotifications/resources/list_changed->/api/ui/notifications/resources-list-changednotifications/tools/list_changed->/api/ui/notifications/tools-list-changed- notifications d'hรดte en file d'attente ->
/api/ui/notifications/poll
Les points d'extrรฉmitรฉ de pont directs /api/ui/* sont le chemin de cycle de vie prรฉfรฉrรฉ pour les hรดtes d'applications MCP. Les champs de requรชte des applications MCP cรดtรฉ exรฉcution restent disponibles comme chemin de compatibilitรฉ additif pour les clients mixtes ou hรฉritรฉs.
Exemples
Le dรฉpรดt autonome adk-ui contient les exemples d'interface utilisateur exรฉcutables :
| Exemple | Description | Commande d'exรฉcution |
|---|---|---|
ui_agent | Dรฉmo console | cargo run --bin ui_agent |
ui_server | Serveur HTTP avec SSE | cargo run --bin ui_server |
ui_react_client | React frontend | cd ui_react_client && npm run dev |
Exรฉcutez ces exemples depuis le adk-ui dรฉpรดt afin que les paquets Rust et React restent sur la mรชme ligne de version.
Exemples d'invites
Testez les outils d'interface utilisateur avec ces invites :
# Forms
"I want to register for an account"
"Create a contact form"
"Create a feedback form with a comments textarea"
# Cards
"Show me my profile"
"Display a product card for a laptop"
# Alerts
"Show a success message"
"Display a warning about expiring session"
# Modals
"I want to delete my account" (shows confirmation modal)
"Show a confirmation dialog before submitting"
# Toasts
"Show a success toast notification"
"Display an error toast"
# Tables
"Show my recent orders"
"List all users"
# Charts
"Show monthly sales chart"
"Display traffic trends as a line chart"
"Show revenue breakdown as a pie chart"
# Progress & Loading
"Show upload progress at 75%"
"Display a loading spinner"
"Show skeleton loading state"
# Dashboards
"Show system status dashboard"
Prรฉcรฉdent: โ Outils de navigateur | Suivant: MCP Outils โ