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

Agent d'interface utilisateur ADK

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

ADK Analyse de l'interface utilisateur

Exemple : Formulaire d'inscription

ADK Inscription ร  l'interface utilisateur


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 :

ProtocoleRรดle
a2uiSurfaces JSONL alignรฉes sur A2UI v0.9 (format par dรฉfaut pour render_screen et render_page)
ag_uiPrise 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_appsCompatibilitรฉ 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 JSONL
  • AgUiAdapter โ€” Convertit en charges utiles d'รฉvรฉnements AG-UI
  • McpAppsAdapter โ€” 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 :

DateJalon
2026-02-07Dรฉprรฉciation annoncรฉe
2026-12-31Date 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_native ou uiTransport: "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'existant newMessage
  • les enveloppes de pont MCP Apps ร  l'intรฉrieur de /api/run_sse via mcpAppsInitialize, mcpAppsRequest et mcpAppsInitialized

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 :

  • McpUiBridgeSnapshot pour l'รฉtat de pont hรดte/application typรฉ
  • McpUiToolResult pour l'enveloppe de rรฉponse additive
  • McpUiToolResultBridge pour 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/initialize
  • ui/message -> /api/ui/message
  • ui/update-model-context -> /api/ui/update-model-context
  • notifications/resources/list_changed -> /api/ui/notifications/resources-list-changed
  • notifications/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 :

ExempleDescriptionCommande d'exรฉcution
ui_agentDรฉmo consolecargo run --bin ui_agent
ui_serverServeur HTTP avec SSEcargo run --bin ui_server
ui_react_clientReact frontendcd 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 โ†’

Outils d'interface utilisateur - Documentation ADK-Rust | ADK-Rust