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Γ‘

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

Exemplo: FormulΓ‘rio de registro

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:
| Protocolo | DescriΓ§Γ£o |
|---|---|
a2ui | SuperfΓcies JSONL alinhadas Γ v0.9 de A2UI (padrΓ£o para render_screen, render_page) |
ag_ui | Suporte 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_apps | Payloads 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 A2UIAgUiAdapterβ Converte para cargas de eventos AG-UIMcpAppsAdapterβ 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:
| Data | Marco |
|---|---|
| 2026-02-07 | DepreciaΓ§Γ£o anunciada |
| 2026-12-31 | Meta 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_nativeouuiTransport: "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 donewMessageexistente - Envelopes da ponte de Apps MCP dentro de
/api/run_ssepor meio demcpAppsInitialize,mcpAppsRequestemcpAppsInitialized
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:
McpUiBridgeSnapshotpara o estado tipado da ponte entre host e appMcpUiToolResultpara o envelope de resposta aditivoMcpUiToolResultBridgepara 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/initializeui/message->/api/ui/messageui/update-model-context->/api/ui/update-model-contextnotifications/resources/list_changed->/api/ui/notifications/resources-list-changednotifications/tools/list_changed->/api/ui/notifications/tools-list-changed- 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:
| Exemplo | DescriΓ§Γ£o | Comando de execuΓ§Γ£o |
|---|---|---|
ui_agent | DemonstraΓ§Γ£o do console | cargo run --bin ui_agent |
ui_server | servidor HTTP com SSE | cargo run --bin ui_server |
ui_react_client | frontend React | cd 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 β