Ferramentas de UI

O crate adk-ui permite que agentes de IA gerem dinamicamente interfaces de usuΓ‘rio avanΓ§adas por meio de chamadas de ferramentas. Os agentes podem renderizar formulΓ‘rios, cartΓ΅es, alertas, tabelas, grΓ‘ficos e muito mais β€” tudo por meio de uma API Rust com seguranΓ§a de tipos que serializa para JSON para consumo no frontend.

O que vocΓͺ criarΓ‘

Agente de UI ADK

Conceitos principais:

  • FormulΓ‘rios β€” Coletar dados do usuΓ‘rio com vΓ‘rios tipos de campos
  • CartΓ΅es β€” Exibir informaΓ§Γ΅es com botΓ΅es de aΓ§Γ£o
  • Tabelas β€” Apresentar dados estruturados em linhas/colunas
  • GrΓ‘ficos β€” Visualizar dados com grΓ‘ficos de barras, linhas, Γ‘reas e pizza
  • Alertas β€” Exibir notificaΓ§Γ΅es e mensagens de status
  • Modais β€” DiΓ‘logos de confirmaΓ§Γ£o e interaΓ§Γ΅es focadas
  • Toasts β€” Breves notificaΓ§Γ΅es de status
  • Interoperabilidade de protocolo β€” Emitir a UI como payloads de A2UI, AG-UI ou Apps MCP

Exemplo: Painel de anΓ‘lise

AnΓ‘lises de UI ADK

Exemplo: FormulΓ‘rio de registro

Registro de UI ADK


Como funciona

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 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"                                                      β”‚
β”‚   })                                                                        β”‚
β”‚                                                                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

VisΓ£o geral

As ferramentas de UI permitem que os agentes:

  • Coletem dados do usuΓ‘rio por meio de formulΓ‘rios dinΓ’micos com suporte a Γ‘reas de texto
  • Exibam informaΓ§Γ΅es com cartΓ΅es, alertas e notificaΓ§Γ΅es
  • Apresentem dados em tabelas e grΓ‘ficos interativos (Recharts)
  • Mostrem estados de progresso e carregamento (indicador giratΓ³rio, esqueleto)
  • Criem layouts de painΓ©is com vΓ‘rios componentes
  • Solicitem a confirmaΓ§Γ£o do usuΓ‘rio por meio de modais
  • Exibam notificaΓ§Γ΅es toast para atualizaΓ§Γ΅es de status

InΓ­cio rΓ‘pido

Adicione ao seu Cargo.toml:

[dependencies]
adk-ui = { git = "https://github.com/zavora-ai/adk-ui" }
adk-agent = "2.1.0"
adk-model = "2.1.0"

Uso bΓ‘sico

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(())
}

JSONL A2UI (render_screen / render_page / render_kit)

Essas ferramentas emitem JSONL A2UI v0.9 para compatibilidade com renderizadores A2UI.

render_screen (superfΓ­cie ΓΊnica)

{
  "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 (pΓ‘gina com vΓ‘rias seΓ§Γ΅es)

{
  "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 (catΓ‘logo + tokens + modelos)

{
  "name": "Fintech Pro",
  "version": "0.1.0",
  "brand": { "vibe": "trustworthy", "industry": "fintech" },
  "colors": { "primary": "#2F6BFF" },
  "typography": { "family": "Source Sans 3" },
  "templates": ["auth_login", "dashboard"]
}

Use o renderizador React para consumir JSONL de 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" />;
}

Ferramentas disponΓ­veis

render_form

Renderize formulΓ‘rios interativos para coletar dados do usuΓ‘rio.

{
  "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"
}

Renderiza como:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  πŸ“‹ Registration Form                          β”‚
β”‚  Create your account                           β”‚
β”‚  ─────────────────────────────────────────────  β”‚
β”‚                                                β”‚
β”‚  Username *                                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚                                         β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                β”‚
β”‚  Email *                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚                                         β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                β”‚
β”‚  Password *                                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ β€’β€’β€’β€’β€’β€’β€’β€’                                β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                β”‚
β”‚  Subscribe to newsletter  [β—‹]                  β”‚
β”‚                                                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚             Register                    β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Tipos de campo: text, email, password, number, date, select, multiselect, switch, slider, textarea

render_card

Exiba cartΓ΅es de informaΓ§Γ΅es com botΓ΅es de aΓ§Γ£o opcionais.

{
  "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"}
  ]
}

VariaΓ§Γ΅es de botΓ£o: primary, secondary, danger, ghost, outline

render_alert

Mostre notificaΓ§Γ΅es e mensagens de status.

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

VariaΓ§Γ΅es: info, success, warning, error

render_confirm

Solicite a confirmaΓ§Γ£o do usuΓ‘rio antes das aΓ§Γ΅es.

{
  "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

Exiba dados tabulares.

{
  "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

Crie visualizaΓ§Γ΅es de dados.

{
  "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}
  ]
}

Tipos de grΓ‘fico: bar, line, area, pie

render_progress

Mostre o progresso das tarefas com etapas opcionais.

{
  "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

Crie layouts de painel com vΓ‘rias seΓ§Γ΅es.

{
  "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"}]
    }
  ]
}

Tipos de seΓ§Γ£o: stats, table, chart, alert, text

render_modal

Exiba diΓ‘logos modais para confirmaΓ§Γ΅es ou interaΓ§Γ΅es focadas.

{
  "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"
}

Tamanhos: small, medium, large, full

render_toast

Mostre breves notificaΓ§Γ΅es toast para atualizaΓ§Γ΅es de status.

{
  "message": "Settings saved successfully",
  "variant": "success",
  "duration": 5000,
  "dismissible": true
}

VariaΓ§Γ΅es: info, success, warning, error

Ferramentas filtradas

Selecione apenas as ferramentas de que seu agente precisa:

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();

Tratamento de eventos da interface

Quando os usuΓ‘rios interagem com a interface renderizada (enviam formulΓ‘rios, clicam em botΓ΅es), os eventos sΓ£o enviados de volta ao agente:

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();

AtualizaΓ§Γ΅es de interface em streaming

Para atualizaΓ§Γ΅es da UI em tempo real, use UiUpdate para aplicar patches aos componentes por 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()),
    })),
};

OperaΓ§Γ΅es: Replace, Patch, Append, Remove

Esquema de componentes

Todos os 28 tipos de componentes sΓ£o compatΓ­veis com campos id opcionais para atualizaΓ§Γ΅es em streaming:

Átomos: Texto, BotΓ£o, Ícone, Imagem, Distintivo Entradas: TextInput, NumberInput, SeleΓ§Γ£o, MultiSelect, AlternΓ’ncia, DateInput, Controle deslizante, Área de texto Layouts: Pilha, Grade, CartΓ£o, ContΓͺiner, Divisor, Abas Dados: Tabela, Lista, KeyValue, CodeBlock VisualizaΓ§Γ£o: GrΓ‘fico (barras, linhas, Γ‘rea, pizza via Recharts) Feedback: Alerta, Progresso, NotificaΓ§Γ£o, Modal, Indicador de carregamento, Esqueleto

Cliente React

Uma implementaΓ§Γ£o de referΓͺncia em React Γ© fornecida no repositΓ³rio independente adk-ui:

npm install @zavora-ai/adk-ui-react

O cliente React inclui:

  • Tipos TypeScript correspondentes ao esquema Rust
  • Renderizador de componentes para todos os 28 tipos
  • IntegraΓ§Γ£o com Recharts para grΓ‘ficos interativos
  • Suporte Γ  renderizaΓ§Γ£o de Markdown
  • Suporte ao modo escuro
  • Tratamento do envio de formulΓ‘rios
  • Componentes de modal e notificaΓ§Γ£o

Arquitetura

Agent ──[render_* tool]──> UiResponse (JSON)
                              β”‚
                              β”‚ SSE
                              β–Ό
                         Client (React)
                              β”‚
                              └──> UiEvent (user action) ──> Agent

Interoperabilidade de protocolo

Todas as 13 ferramentas de renderizaΓ§Γ£o sΓ£o compatΓ­veis com saΓ­da ciente do protocolo por meio do argumento protocol:

ProtocoloDescriΓ§Γ£o
a2uiSuperfΓ­cies JSONL alinhadas Γ  v0.9 de A2UI (padrΓ£o para render_screen, render_page)
ag_uiSuporte hΓ­brido a AG-UI: wrappers de compatibilidade por padrΓ£o, alΓ©m de transporte de runtime nativo do protocolo para clientes adk-server
mcp_appsPayloads de aplicativos de compatibilidade MCP com recursos ui://, auxiliares de ponte aditivos, fluxos de notificaΓ§Γ£o, campos de solicitaΓ§Γ£o em tempo de execuΓ§Γ£o e adaptadores de HTML/recursos

Quando protocol Γ© omitido, as ferramentas usam seu formato de saΓ­da padrΓ£o (UiResponse JSON legado para a maioria das ferramentas, A2UI para render_screen/render_page/render_kit).

Exemplo com seleΓ§Γ£o de protocolo:

{
  "protocol": "mcp_apps",
  "mcp_apps": {
    "resource_uri": "ui://demo/surface"
  }
}

Adaptadores de interoperabilidade

adk-ui inclui primitivas de adaptador para conversΓ£o de protocolos:

  • A2uiAdapter β€” Converte superfΓ­cies canΓ΄nicas para JSONL A2UI
  • AgUiAdapter β€” Converte para cargas de eventos AG-UI
  • McpAppsAdapter β€” Converte para cargas de recursos de Apps MCP

Eles implementam um trait UiProtocolAdapter compartilhado para conversΓ£o consistente em todas as ferramentas.

Linha do tempo de descontinuaΓ§Γ£o

O perfil de runtime adk_ui legado contΓ©m metadados de descontinuaΓ§Γ£o:

DataMarco
2026-02-07DepreciaΓ§Γ£o anunciada
2026-12-31Meta de encerramento

SubstituiΓ§Γ΅es: a2ui, ag_ui, mcp_apps

Esses metadados sΓ£o expostos por meio das constantes UI_PROTOCOL_CAPABILITIES e disponibilizados por adk-server em /api/ui/capabilities.
A resposta de capacidade tambΓ©m relata implementationTier, specTrack, summary e limitations, para que os clientes possam distinguir subconjuntos hΓ­bridos ou de compatibilidade do suporte totalmente nativo ao protocolo.

Quando adk-server Γ© o limite voltado ao host, ele tambΓ©m expΓ΅e helpers aditivos da ponte de Apps MCP em /api/ui/initialize, /api/ui/message, /api/ui/update-model-context, /api/ui/notifications/poll, /api/ui/notifications/resources-list-changed e /api/ui/notifications/tools-list-changed. Esses endpoints preservam os contratos de runtime existentes de ADK e aceitam tanto corpos de solicitaΓ§Γ£o diretos quanto envelopes semelhantes a JSON-RPC com mΓ©todos ui/....

Para consumidores de runtime, adk-server tambΓ©m oferece suporte a:

  • x-adk-ui-transport: protocol_native ou uiTransport: "protocol_native" para serializaΓ§Γ£o SSE nativa do AG-UI
  • Entradas de solicitaΓ§Γ£o de caminho duplo do AG-UI por meio de input / agUiInput, alΓ©m do newMessage existente
  • Envelopes da ponte de Apps MCP dentro de /api/run_sse por meio de mcpAppsInitialize, mcpAppsRequest e mcpAppsInitialized

Essas adiΓ§Γ΅es sΓ£o opcionais. Os consumidores existentes de /api/run e /api/run_sse continuam recebendo o wrapper genΓ©rico ADK, a menos que solicitem explicitamente um modo de transporte nativo do AG-UI.

Para respostas de ferramentas do Apps MCP pertencentes ao framework, adk-server::ui_types agora expΓ΅e:

  • McpUiBridgeSnapshot para o estado tipado da ponte entre host e app
  • McpUiToolResult para o envelope de resposta aditivo
  • McpUiToolResultBridge para metadados da ponte (protocolVersion, structuredContent, hostInfo, hostCapabilities, hostContext, appInfo, appCapabilities, initialized)

Prefira McpUiBridgeSnapshot::build_tool_result(...) ao promover o estado da ponte/sessΓ£o para uma resposta de ferramenta. Isso padroniza o formato do resultado da ferramenta, preservando resourceUri e os fallbacks html inline para hosts orientados Γ  compatibilidade.

Para mapeamentos incorporados ou de navegador, a ponte aditiva HTTP corresponde aos fluxos de host/aplicativo da seguinte forma:

  • 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
  • notificaΓ§Γ΅es de host enfileiradas -> /api/ui/notifications/poll

Os endpoints diretos da ponte /api/ui/* sΓ£o o caminho preferencial do ciclo de vida para hosts de Apps MCP. Os campos de solicitaΓ§Γ£o de Apps MCP do lado do runtime continuam disponΓ­veis como um caminho de compatibilidade aditivo para clientes mistos ou legados.

Exemplos

O repositΓ³rio independente adk-ui contΓ©m os exemplos de UI executΓ‘veis:

ExemploDescriΓ§Γ£oComando de execuΓ§Γ£o
ui_agentDemonstraΓ§Γ£o do consolecargo run --bin ui_agent
ui_serverservidor HTTP com SSEcargo run --bin ui_server
ui_react_clientfrontend Reactcd ui_react_client && npm run dev

Execute esses exemplos do repositΓ³rio adk-ui para que os pacotes Rust e React permaneΓ§am na mesma linha de lanΓ§amento.

Exemplos de prompts

Teste as ferramentas de UI com estes 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"

Anterior: ← Ferramentas do navegador | PrΓ³ximo: Ferramentas MCP β†’

Ferramentas de UI - DocumentaΓ§Γ£o ADK-Rust | ADK-Rust