Outils UI

Le crate adk-ui permet aux agents IA de générer dynamiquement des interfaces utilisateur riches via des appels de Tool. Les agents peuvent afficher des formulaires, des cartes, des alertes, des tableaux, des graphiques et bien plus encore, le tout grâce à une API Rust sûre en termes de types 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 différents 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 - Notifications d'état brèves

Exemple : Tableau de bord analytique

Analyse ADK UI

Exemple : Formulaire d'inscription

Formulaire d'inscription ADK UI


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"                                                      │
│   })                                                                        │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

Aperçu

Les outils d'interface utilisateur permettent aux agents de :

  • Recueillir les entrées utilisateur via des formulaires dynamiques avec prise en charge de la zone 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 une confirmation à l'utilisateur via des modales
  • Afficher des notifications toast pour les mises à jour de statut

Démarrage Rapide

Ajoutez à votre Cargo.toml :

[dependencies]
adk-rust = { version = "0.2.0", features = ["ui"] }
# Or use individual crates:
adk-ui = "0.2.0"
adk-agent = "0.2.0"
adk-model = "0.2.0"

Utilisation Basique

use adk_rust::prelude::*;
use adk_rust::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.0-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#"
            Vous êtes un assistant utile qui utilise des composants d'interface utilisateur pour interagir avec les utilisateurs.
            Utilisez render_form pour recueillir des informations.
            Utilisez render_card pour afficher les résultats.
            Utilisez render_alert pour les notifications.
            Utilisez render_modal pour les boîtes de dialogue de confirmation.
            Utilisez render_toast pour les messages de statut brefs.
        "#);

    for tool in ui_tools {
        builder = builder.tool(tool);
    }

    let agent = builder.build()?;
    Ok(())
}

Outils Disponibles

render_form

Permet d'afficher 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"
}

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

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

render_alert

Affiche les notifications et les messages d'état.

{
  "title": "Payment Successful",
  "description": "Your payment of $99.00 has been processed.",
  "variant": "success"
}

Variantes : info, success, warning, error

render_confirm

Demande 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

Affiche 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é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 graphique : bar, line, area, pie

render_progress

Affiche la progression d'une tâche 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ée 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 section : stats, table, chart, alert, text

render_modal

Affiche 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

Affiche 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()      // Désactiver les graphiques
    .without_table()      // Désactiver les tableaux
    .without_progress()   // Désactiver la progression
    .without_modal()      // Désactiver les modales
    .without_toast();     // Désactiver les toasts

// Ou utiliser uniquement les formulaires
let forms_only = UiToolset::forms_only();

Gestion des Événements UI

Lorsque les utilisateurs interagissent avec l'UI rendue (soumission de formulaires, clics sur des boutons), des événements sont renvoyés à l'Agent :

use adk_ui::{UiEvent, UiEventType};

// Structure de UiEvent
pub struct UiEvent {
    pub event_type: UiEventType,  // FormSubmit, ButtonClick, InputChange
    pub action_id: Option<String>,
    pub data: Option<HashMap<String, Value>>,
}

// Convertir en message pour l'Agent
let message = ui_event.to_message();

Mises à Jour UI en Streaming

Pour les mises à jour UI en temps réel, utilisez UiUpdate pour patcher les composants par leur 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 les champs id optionnels pour les mises à jour en streaming :

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 (barre, ligne, aire, secteur via Recharts) Retour d'information : Alert, Progress, Toast, Modal, Spinner, Skeleton

Client React

Une implémentation de référence React est fournie :

cd official_docs_examples/tools/ui_test

# Démarrer le serveur UI
cargo run --bin ui_server

# Dans un autre terminal, démarrer le client React
cd ui_react_client
npm install && npm run dev -- --host

Le client React inclut :

  • Des types TypeScript correspondant au schéma Rust
  • Un moteur de 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 Modal et Toast

Architecture

┌─────────────┐                    ┌─────────────┐
│   Agent     │ ──[render_* tool]──│ UiResponse  │
│  (LLM)      │                    │   (JSON)    │
└─────────────┘                    └──────┬──────┘
       ▲                                  │
       │                                  │ SSE
       │                                  ▼
       │                           ┌─────────────┐
       └────── UiEvent ◄───────────│   Client    │
              (action utilisateur) │  (React)    │
                                   └─────────────┘

Exemples

Trois exemples illustrent les outils UI :

ExempleDescriptionCommande d'exécution
ui_agentDémo consolecargo run --bin ui_agent
ui_serverServeur HTTP avec SSEcargo run --bin ui_server
ui_react_clientFrontend Reactcd ui_react_client && npm run dev

À exécuter depuis official_docs_examples/tools/ui_test/.

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: ← Browser Tools | Suivant: MCP Tools →