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

ADK Agent dโ€™interface

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

ADK Analytique dโ€™interface

Exemple : Formulaire dโ€™inscription

ADK Inscription dโ€™interface


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 :

ProtocoleDescription
a2uiInterfaces JSONL alignรฉes sur A2UI v0.9 (par dรฉfaut pour render_screen, render_page)
ag_uiPrise 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_appsCompatibilitรฉ 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 A2UI
  • AgUiAdapter โ€” Convertit en charges utiles dโ€™รฉvรฉnements AG-UI
  • McpAppsAdapter โ€” 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-07Dรฉprรฉciation annoncรฉe
2026-12-31Date 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_native ou uiTransport: "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 de newMessage existant
  • les enveloppes du pont Apps MCP dans /api/run_sse via mcpAppsInitialize, mcpAppsRequest et mcpAppsInitialized

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 :

  • McpUiBridgeSnapshot pour lโ€™รฉtat typรฉ du pont hรดte/application
  • McpUiToolResult pour lโ€™enveloppe de rรฉponse supplรฉmentaire
  • McpUiToolResultBridge pour 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/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 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 :

ExempleDescriptionCommande dโ€™exรฉcution
ui_agentDรฉmonstration de la consolecargo run --bin ui_agent
ui_serverServeur avec HTTP et SSEcargo run --bin ui_server
ui_react_clientinterface front-end Reactcd 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 โ†’

Outils dโ€™interface - Documentation ADK-Rust | ADK-Rust