Outils dโinterface
La crate adk-ui permet aux agents IA de gรฉnรฉrer dynamiquement des interfaces utilisateur riches grรขce ร des appels dโoutils. Les agents peuvent afficher des formulaires, des cartes, des alertes, des tableaux, des graphiques et bien plus encore โ le tout via un API Rust ร typage sรปr, sรฉrialisรฉ en JSON pour รชtre utilisรฉ par le frontend.
Ce que vous allez construire

Concepts clรฉs :
- Formulaires โ Recueillir les saisies utilisateur avec diffรฉrents types de champs
- Cartes โ Afficher des informations avec des boutons dโaction
- Tableaux โ Prรฉsenter des donnรฉes structurรฉes en lignes et colonnes
- Graphiques โ Visualiser des donnรฉes avec des graphiques ร barres, linรฉaires, en aires et circulaires
- Alertes โ Afficher des notifications et des messages dโรฉtat
- Modales โ Afficher des boรฎtes de dialogue de confirmation et des interactions ciblรฉes
- Toasts โ Afficher de brรจves notifications dโรฉtat
- Interopรฉrabilitรฉ des protocoles โ รmettre lโinterface utilisateur sous forme de charges utiles A2UI, AG-UI ou MCP Apps
Exemple : Tableau de bord analytique

Exemple : Formulaire dโinscription

Fonctionnement
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 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" โ
โ }) โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Vue dโensemble
Les outils dโinterface permettent aux agents de :
- Recueillir les saisies utilisateur au moyen de formulaires dynamiques prenant en charge les 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 les รฉtats de progression et de chargement (indicateur de chargement, squelette)
- Crรฉer des mises en page de tableaux de bord avec plusieurs composants
- Demander la confirmation de lโutilisateur via des modales
- Afficher des notifications toast pour les mises ร jour dโรฉtat
Dรฉmarrage rapide
Ajoutez ร votre Cargo.toml :
[dependencies]
adk-ui = { git = "https://github.com/zavora-ai/adk-ui" }
adk-agent = "2.1.0"
adk-model = "2.1.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-3.7-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 JSONL A2UI v0.9 pour assurer 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 ร plusieurs 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" }]
}
]
}
render_kit (catalogue + jetons + modรจles)
{
"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 moteur de rendu React pour consommer le JSONL A2UI :
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
render_form
Affichez des formulaires interactifs pour recueillir les informations 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"
}
Sโaffiche comme suit :
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐ 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
render_card
Affichez des cartes dโinformation avec des boutons dโaction facultatifs.
{
"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 boutons : primary, secondary, danger, ghost, outline
render_alert
Affichez 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
render_confirm
Demandez la confirmation de lโutilisateur avant dโeffectuer des 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"
}
render_table
Affichez des donnรฉes sous forme de tableau.
{
"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"}
]
}
render_chart
Crรฉez 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
Affichez la progression des tรขches avec des รฉtapes facultatives.
{
"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รฉez 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
Affichez 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
Affichez de brรจves notifications toast pour les mises ร jour dโรฉtat.
{
"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 de lโinterface utilisateur
Lorsque les utilisateurs interagissent avec lโinterface utilisateur affichรฉe (soumettent des formulaires, cliquent 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 de lโinterface utilisateur en temps rรฉel, utilisez UiUpdate pour modifier 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 tous en charge les champs facultatifs id pour les mises ร jour en flux continu :
Atomes : Text, Button, Icon, Image, Badge
Entrรฉes : TextInput, NumberInput, Select, MultiSelect, Switch, DateInput, Slider, Textarea
Mises en page : Stack, Grid, Card, Container, Divider, Tabs
Donnรฉes : Table, List, KeyValue, CodeBlock
Visualisation : Chart (barres, lignes, aires, secteurs via Recharts)
Rรฉtroaction : Alert, Progress, Toast, Modal, Spinner, Skeleton
Client React
Une implรฉmentation de rรฉfรฉrence en React est fournie dans le dรฉpรดt autonome adk-ui :
npm install @zavora-ai/adk-ui-react
Le client React comprend :
- des types TypeScript correspondant au schรฉma Rust
- un moteur de rendu des composants pour les 28 types
- lโintรฉgration de Recharts pour les graphiques interactifs
- la prise en charge du rendu Markdown
- la prise en charge du mode sombre
- la gestion de lโenvoi des formulaires
- des composants de fenรชtre modale 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 tous en charge une sortie compatible avec les protocoles via lโargument protocol :
| Protocole | Description |
|---|---|
a2ui | Interfaces JSONL alignรฉes sur A2UI v0.9 (par dรฉfaut pour render_screen, render_page) |
ag_ui | Prise en charge hybride dโAG-UI : wrappers de compatibilitรฉ par dรฉfaut, ainsi quโun transport dโexรฉcution natif du protocole et additif pour les clients adk-server |
mcp_apps | Compatibilitรฉ des charges utiles des applications MCP avec les ressources ui://, assistants de pont additifs, flux de notifications, champs de requรชte dโexรฉcution et adaptateurs HTML/de ressources |
Lorsque protocol est omis, les outils utilisent leur format de sortie par dรฉfaut (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โadaptation pour la conversion de protocole :
A2uiAdapterโ Convertit les surfaces canoniques en JSONL A2UIAgUiAdapterโ Convertit en charges utiles dโรฉvรฉnements AG-UIMcpAppsAdapterโ Convertit en charges utiles de ressources Apps MCP
Celles-ci implรฉmentent un trait UiProtocolAdapter partagรฉ pour assurer une conversion cohรฉrente entre tous les outils.
Calendrier dโobsolescence
Le profil dโexรฉcution adk_ui hรฉritรฉ contient des mรฉtadonnรฉes dโobsolescence :
| Date | รtape importante |
|---|---|
| 2026-02-07 | Dรฉprรฉciation annoncรฉe |
| 2026-12-31 | Date cible de fin de vie |
Remplacements : a2ui, ag_ui, mcp_apps
Ces mรฉtadonnรฉes sont exposรฉes via les constantes UI_PROTOCOL_CAPABILITIES et prรฉsentรฉes par adk-server ร /api/ui/capabilities.
La rรฉponse de capacitรฉ fournit รฉgalement implementationTier, specTrack, summary et limitations afin que les clients puissent distinguer les sous-ensembles hybrides ou de compatibilitรฉ dโune prise en charge entiรจrement native du protocole.
Lorsque adk-server constitue la limite exposรฉe ร lโhรดte, il expose รฉgalement les assistants supplรฉmentaires du pont Apps MCP ร /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 de terminaison prรฉservent les contrats dโexรฉcution ADK existants et acceptent soit des corps de requรชte directs, soit des enveloppes de type 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 de SSE- les entrรฉes de requรชtes AG-UI ร double voie via
input/agUiInput, en complรฉment denewMessageexistant - les enveloppes du pont Apps MCP dans
/api/run_sseviamcpAppsInitialize,mcpAppsRequestetmcpAppsInitialized
Ces ajouts nรฉcessitent une activation explicite. Les consommateurs existants de /api/run et /api/run_sse continuent de recevoir lโenveloppe gรฉnรฉrique ADK, sauf sโils demandent explicitement un mode de transport AG-UI natif.
Pour les rรฉponses dโoutils Apps MCP gรฉrรฉes par le framework, adk-server::ui_types expose dรฉsormais :
McpUiBridgeSnapshotpour lโรฉtat typรฉ du pont hรดte/applicationMcpUiToolResultpour lโenveloppe de rรฉponse supplรฉmentaireMcpUiToolResultBridgepour les mรฉtadonnรฉes du pont (protocolVersion,structuredContent,hostInfo,hostCapabilities,hostContext,appInfo,appCapabilities,initialized)
Privilรฉgiez McpUiBridgeSnapshot::build_tool_result(...) lorsque vous intรฉgrez lโรฉtat du pont ou de la session dans une rรฉponse dโoutil. Cela standardise la structure du rรฉsultat dโoutil tout en prรฉservant resourceUri et les solutions de repli html intรฉgrรฉes pour les hรดtes privilรฉgiant la compatibilitรฉ.
Pour les mappages intรฉgrรฉs ou hรฉbergรฉs par un 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 hรดte mises en file dโattente ->
/api/ui/notifications/poll
Les points de terminaison directs du pont /api/ui/* constituent le chemin de cycle de vie privilรฉgiรฉ pour les hรดtes Apps MCP. Les champs de requรชte Apps 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รฉmonstration de la console | cargo run --bin ui_agent |
ui_server | Serveur avec HTTP et SSE | cargo run --bin ui_server |
ui_react_client | interface front-end React | cd ui_react_client && npm run dev |
Exรฉcutez ces exemples depuis le dรฉpรดt adk-ui afin que les packages Rust et React restent sur la mรชme ligne de publication.
Exemples de prompts
Testez les outils dโinterface utilisateur avec ces prompts :
# 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 du navigateur | Suivant : Outils MCP โ