Skip to content

A2UI Integration

A2UI (Agent-to-UI) is an open protocol created by Google that enables AI agents to generate rich, interactive user interfaces. Instead of text-only responses or risky code execution, A2UI lets agents send declarative component descriptions that clients render using native widgets.

Flow-Like integrates A2UI to bring agent-driven interfaces directly into your workflow automation—creating Pages and Widgets that connect seamlessly to your flows.

Flow-Like doesn’t just consume A2UI from agents—we provide a visual drag-and-drop builder that produces the same A2UI format. This means:

┌─────────────────────────────────────────────────────────────┐
│ Two Ways to Build UIs │
├─────────────────────────────────────────────────────────────┤
│ │
│ 🤖 AI-Generated 👤 Human-Created │
│ ───────────────── ───────────────── │
│ Agent creates UI Visual builder │
│ from prompts drag-and-drop │
│ │ │ │
│ └──────────┬─────────────────┘ │
│ ▼ │
│ ┌─────────────┐ │
│ │ A2UI │ │
│ │ Format │ │
│ └──────┬──────┘ │
│ ▼ │
│ ┌─────────────┐ │
│ │ Flow-Like │ │
│ │ Renderer │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
ApproachBest ForOutput
AI AgentRapid prototyping, natural language descriptionsA2UI JSON
Visual BuilderPrecise control, pixel-perfect designA2UI JSON
CombinedAI generates, human refinesA2UI JSON
  • Interoperable: AI-generated and human-created UIs use the same format
  • Iterate Freely: Start with AI, refine manually—or vice versa
  • No Lock-in: Everything is standard A2UI, portable and future-proof
  • Collaborate: Designers use the builder, developers use code, AI assists both
┌─────────────────────────────────────────────────────────────┐
│ Your App │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ PAGES │ │
│ │ (App-specific layouts) │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Dashboard │ │ Reports │ │ Settings │ │ │
│ │ └──────┬──────┘ └──────┬──────┘ └─────────────┘ │ │
│ └─────────┼────────────────┼──────────────────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ WIDGETS │ │
│ │ (Reusable across projects) │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │KPI Card │ │ Chart │ │ Table │ │ Form │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

Flow-Like extends A2UI with two concepts:

ConceptScopeDescription
PagesApp-specificFull-screen layouts configured for your app. Define navigation, structure, and app-specific UI.
WidgetsReusableSelf-contained UI components that can be used across your project or shared with other projects.

A2UI solves a fundamental problem: how can AI agents safely send rich UIs across trust boundaries?

FeatureDescription
Secure by DesignDeclarative data format, not executable code. Agents can only use pre-approved components.
LLM-FriendlyFlat, streaming JSON structure designed for easy generation by language models.
Framework-AgnosticOne agent response works everywhere—React, Angular, Flutter, native mobile.
Progressive RenderingStream UI updates as they’re generated. Users see interfaces building in real-time.
  1. User sends a message to an AI agent
  2. Agent generates A2UI messages describing the UI
  3. Messages stream to the Flow-Like client
  4. Client renders using native components
  5. User interacts with the UI, sending actions back
  6. Agent responds with updated A2UI messages

A2UI uses four message types:

MessagePurpose
`surfaceUpdate`Define or update UI components
`dataModelUpdate`Update application state
`beginRendering`Signal the client to render
`deleteSurface`Remove a UI surface

Unlike nested JSON trees, A2UI uses a flat adjacency list where components reference children by ID:

```json { “surfaceUpdate”: { “components”: [ {“id”: “root”, “component”: {“Column”: {“children”: {“explicitList”: [“greeting”, “buttons”]}}}}, {“id”: “greeting”, “component”: {“Text”: {“text”: {“literalString”: “Hello!”}}}}, {“id”: “buttons”, “component”: {“Row”: {“children”: {“explicitList”: [“cancel”, “ok”]}}}}, {“id”: “cancel”, “component”: {“Button”: {“child”: “cancel-text”, “action”: {“name”: “cancel”}}}}, {“id”: “cancel-text”, “component”: {“Text”: {“text”: {“literalString”: “Cancel”}}}}, {“id”: “ok”, “component”: {“Button”: {“child”: “ok-text”, “action”: {“name”: “ok”}}}}, {“id”: “ok-text”, “component”: {“Text”: {“text”: {“literalString”: “OK”}}}} ] } } ```

Why flat lists?

  • ✅ Easy for LLMs to generate (no perfect nesting required)
  • ✅ Send components incrementally as they’re ready
  • ✅ Update any component by ID
  • ✅ Clear separation of structure and data

A2UI defines a standard catalog organized by purpose:

CategoryComponents
LayoutRow, Column, List
DisplayText, Image, Icon, Video, Divider
InteractiveButton, TextField, CheckBox, DateTimeInput, Slider
ContainerCard, Tabs, Modal

A2UI components integrate with Flow-Like’s execution engine:

``` ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ A2UI │ ──▶ │ Flow-Like │ ──▶ │ A2UI │ │ Input │ │ Board │ │ Output │ │ Widget │ │ │ │ Widget │ └──────────────┘ └──────────────┘ └──────────────┘ ```

  • Trigger Flows: Button actions start flow executions
  • Display Results: Flow outputs bind to component data
  • Bidirectional Binding: Form inputs sync with flow variables
  • Real-time Updates: Stream results as flows execute

Beyond the standard catalog, Flow-Like provides custom components for:

  • Charts & Visualizations: Data-bound charts connected to flows
  • Flow Controls: Start, stop, monitor flow executions
  • Data Tables: Display flow outputs with sorting/filtering
  • File Handling: Upload/download integrated with storage

Pages define the full-screen layouts for your application:

``` ┌─────────────────────────────────────────────┐ │ App Navigation │ ├─────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────┐ │ │ │ Page: Dashboard │ │ │ │ ┌─────────┐ ┌─────────┐ │ │ │ │ │ Widget │ │ Widget │ │ │ │ │ │ (KPIs) │ │ (Chart) │ │ │ │ │ └─────────┘ └─────────┘ │ │ │ │ ┌─────────────────────────────┐ │ │ │ │ │ Widget (Data Table) │ │ │ │ │ └─────────────────────────────┘ │ │ │ └─────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────┘ ```

  • Configure navigation structure
  • Define page layouts
  • Set access permissions
  • Bind to app-specific data

Widgets are self-contained components you can share:

``` ┌──────────────────────────────────────────────────────┐ │ Widget: Customer Card │ │ ─────────────────────────────────────────────────── │ │ ┌──────────┐ │ │ │ Avatar │ John Doe │ │ │ [👤] │ john@example.com │ │ └──────────┘ Customer since 2023 │ │ │ │ [View Profile] [Send Message] │ └──────────────────────────────────────────────────────┘ ```

  • Create Once: Build the widget in your project
  • Reuse Anywhere: Use it in any page of your app
  • Share Across Projects: Export and import widgets
  • Bind to Any Data: Configure data sources per usage
PhaseFeaturesStatus
Phase 1A2UI renderer, basic components🔧 In Development
Phase 2Pages & widgets, flow bindings📋 Planned
Phase 3Widget sharing, custom components📋 Planned
Phase 4Visual builder, advanced theming�� Planned