GO TO A SECTION

↑ ↓ to navigate · Enter to openExplore all sections →
FDEInterviews logo

A2UI 1.0 Explained: Google's Generative UI Protocol for Agents, What Changed, and When to Use It

A2UI 1.0 lets AI agents answer with native forms, charts and approval cards instead of text. What changed from 0.9, what the 3x token claim measures, how it differs from AG-UI and MCP Apps, and where it fits in an agent stack.

BY MEI LIN · FDEINTERVIEWS EDITORIAL · UPDATED NOVEMBER 12, 2026 · 7 MIN READ

PRACTICE THIS:AG-UI and agent-user interaction, the concept ·System One decision models, the concept ·RAG and agent design questions ·The must-know FDE questions

A2UI is an open protocol that lets an AI agent answer with an interactive screen, such as a form to confirm, a chart or an approval card, instead of a wall of text. The agent describes the screen as data, using only components your app has registered, and your app draws it with its own native components. Version 1.0, released by Google on 11 November 2026, is the first stable release. It adds two-way function calls and mixing components from several catalogs, and ships agent SDKs for Python, TypeScript and Dart. Use it when an agent needs to collect a decision or show structured data across web and mobile, especially when the agent sits outside your trust boundary.

The problem it solves

Agents answer in text because text is what models produce. That works for a question and fails for a task. Comparing three products, approving a plan with ten steps or picking a time that works for four calendars turns into round after round of "which one?". The obvious fix, letting the model write HTML or React, creates a worse problem: arbitrary model-generated code running in your product, styled however the model likes, with whatever behavior it invents.

A2UI takes the middle path. The app publishes a catalog: the components the agent may use, their properties and the functions it may call. The agent composes a screen from that catalog as structured data. The app validates it and renders it natively. The agent controls layout and wiring; the app controls what exists and what it does.

How it works

Where A2UI draws the trust boundaryInference: Model writes Express or JSON, guided by the catalog. Agent SDK and transport: Parse, validate against the catalog, emit wire messages. Renderer in your app: Core library, framework adapter, approved components only. Data model: Values bound by path, filled by the agent server. Actions and functions: User events and allowed calls, sent back to the agent. A model generates a UI description, the agent SDK validates it against the app catalog and sends protocol messages, and the renderer draws only approved native components. Data reaches the screen through bound paths; user actions and permitted function calls flow back to the agent. Where A2UI draws the trust boundary The model describes a screen. The app decides which components exist and what they can do. Inference Model writes Express or JSON, guided by the catalog Agent SDK and transport Parse, validate against the catalog, emit wire messages Renderer in your app Core library, framework adapter, approved components only Data model Values bound by path, filled by the agent server Actions and functions User events and allowed calls, sent back to the agent

A2UI has three layers:

  1. Inference. A model writes a description of the UI in an inference format. The default for new work is A2UI Express, a compact constructor-call notation such as root = Text("Hello"). Direct JSON still works. A decision model can also pick components from a list instead of writing text.
  2. Transport. An agent SDK parses the model's output, validates it against the catalog, expands macros and emits wire messages: createSurface, updateComponents, updateDataModel and deleteSurface, sent as application/a2ui+json over whatever channel you use, including A2A, AG-UI or MCP.
  3. Rendering. In the app, a core library turns messages into a framework-neutral UI tree, a framework adapter maps it to native widgets, and the catalog limits what can appear.

Here is what the model actually writes. This Express block and the JSON it compiles to come from the project's own conformance tests:

text
root = Column([greeting, farewell])
greeting = Text("Hello")
farewell = Text("Goodbye")
json
{
  "version": "1.0",
  "createSurface": {
    "surfaceId": "default_surface",
    "catalogId": "conformance/simplified",
    "components": [
      { "id": "root", "component": "Column", "children": ["greeting", "farewell"] },
      { "id": "greeting", "component": "Text", "text": "Hello" },
      { "id": "farewell", "component": "Text", "text": "Goodbye" }
    ]
  }
}

Variable names become component IDs, and the SDK, not the model, writes the envelope. If the model names a component the catalog does not declare, compilation fails with a validation error before anything reaches the screen.

Values reach the screen through a data model. A component binds to a path such as /booking/time, and the agent server fills that path from your systems. The model can lay out a balance field without ever seeing the balance. User actions and permitted function calls flow back to the agent as events.

What changed in 1.0

The evolution guide from 0.9 to 1.0 is long. The changes that matter for most teams:

ChangeWhy it matters
Bidirectional function calls: callRendererFunction and callAgentFunction, each with a response messageA date picker can ask the agent for availability on the spot. The catalog declares allowedCallers per function, and the renderer rejects calls a role may not make
requiresUserActivation on functionsFunctions such as opening a URL can require a real user gesture, so an agent cannot fire them on its own
Mixed catalogs on one surfaceOne view can combine components from your app and from partners, with an explicit @catalogId per component and no silent fallback
Reserved @ keys (@path, @call, @catalogId, @checks)Custom components can now declare their own metadata or checks without colliding with the protocol. The guide warns against a blanket find-and-replace when migrating
Accessibility attributes, including ARIA live regionsStreamed UI can announce changes to screen readers
theme removed from the protocolBranding stays with the app; the agent cannot restyle your product
Whole UI in one createSurface message; renamed roles (client becomes renderer, server becomes agent)Fewer round trips; clearer vocabulary, since rendering sometimes happens on servers

Renderers ship for React, Angular and Lit on the web, Flutter, and SwiftUI. The Jetpack Compose renderer is on 0.9.1 with 1.0 support announced as coming soon, and Gemini renders 0.9.1 today, so expect mixed versions in the field for a while.

The token claim, read properly

The launch posts say Express describes the same UI in about three times fewer output tokens than JSON. The project's benchmark (54 samples, gemini-3.8-flash, temperature 0) supports that for the UI code itself and adds detail the headline leaves out:

FormatInput tokensUI code tokensTotal outputPass rate
Direct JSON, thinking off10,98080781153 of 54
Express, thinking off6,000297 (2.7x fewer)29953 of 54
Direct JSON, thinking unbounded10,9807942,32053 of 54
Express, thinking unbounded6,000260 (3.1x fewer)1,789 (23% fewer)53 of 54
Express shrinks the UI code, not the thinkingThinking off, UI code tokens: JSON 807, Express 297. Thinking off, Total output: JSON 811, Express 299. Thinking unbounded, UI code tokens: JSON 794, Express 260. Thinking unbounded, Total output: JSON 2320, Express 1789. Input tokens fall from 10,980 to 6,000 in both modes, because compact component signatures replace JSON Schemas in the prompt. Express shrinks the UI code, not the thinking A2UI inference-format benchmark: 54 samples, gemini-3.8-flash, temperature 0. Median tokens per sample; pass rate 53 of 54 for every row. Direct JSON A2UI Express Thinking off UI code tokens 807 297 (-63%) Total output 811 299 (-63%) Thinking unbounded UI code tokens 794 260 (-67%) Total output 2,320 1,789 (-23%) Input tokens fall from 10,980 to 6,000 in both modes, because compact component signatures replace JSON Schemas in the prompt.

Two readings. With thinking on, most output is reasoning, which Express does not shrink, so the saving on total output is about a quarter rather than two thirds. And the 45% input saving is the quieter win: compact component signatures replace full JSON Schemas in the system prompt, and that prompt is paid on every turn. As a rough independent check, the four multi-component cases in the project's Express conformance suite compile to minified JSON about 3.1 times larger in bytes (range 2.4 to 3.8). Bytes are not tokens, and four small cases are not a benchmark, but the direction agrees.

Who is using it

Google's launch post names four outside adopters. Atlassian is bringing A2UI to Jira, where an agent working a ticket asks the team for a missing decision through an interactive card in the work item. Alation renders metric cards and charts with it, the same feed inside its product and inside Claude through MCP Apps. ByteDance shipped an A2UI renderer for its Lynx framework in June 2026. Bloomberg is building with it. Inside Google, Gemini Notebook asks deck-format questions through A2UI cards, and Gemini Enterprise agents can already respond with A2UI.

One detail connects to work we have covered: ByteDance's Lynx playground uses a decision model, Jev, to pick components and values instead of having an LLM write text, and official SDK support for decision models is on the A2UI roadmap. Picking from a fixed catalog is a classification problem, which is where System One decision models are fast and calibrated.

A2UI, AG-UI, MCP Apps and A2A

These names arrive together, and they answer different questions:

ProtocolAnswersDirection
MCPHow does an agent call tools and read data?Agent down to tools
A2AHow do agents delegate to other agents?Agent across to agents
AG-UIHow does a front end follow an agent's run: messages, tool calls, state?Agent up to the app, as events
A2UIWhat should the screen show, built from components the app allows?Agent up to the app, as a UI description
MCP AppsHow does an MCP server ship an interactive view into an AI assistant?Server into the host assistant

They compose. A2UI messages can ride inside AG-UI events or A2A messages, and A2UI screens can render inside an MCP App, which is how Alation's feeds appear in Claude.

When to use it, and when not

Use it when:

  • The agent needs a decision or structured input: approvals, forms, pickers, comparisons.
  • The same agent serves web and mobile, and you want one description rendered natively on each.
  • The agent is remote, third-party or across a trust boundary, and you need to limit what it can put on screen.
  • Sensitive values should stay out of the model's context.

Skip it when:

  • The answer is plain text, or a single static chart you could render from a tool result.
  • You control both agent and front end, and your UI needs are a handful of fixed cards; plain typed tool results may be simpler.
  • You need arbitrary custom logic inside components. Sandboxed logic is a roadmap item, not 1.0.

The forward deployed angle

Generative UI is turning up in agent design rounds as "the agent should not just answer, it should get the user to approve something". The strong answer separates three decisions: what the model may decide (layout and wiring, from a catalog), what the app enforces (validation, allowed calls, user activation for anything with side effects), and where data comes from (bound paths filled by your systems, not values the model typed). That separation is the same instinct behind guardrails on tool calls, applied to the screen. Practice it on RAG and agent design questions, and be ready to say why you would not let a model emit HTML into a customer's product.

Facts as of 12 November 2026: A2UI protocol 1.0, launch post of 11 November 2026, inference-format benchmark from the project documentation. See a2ui.org and the repository for current versions.

PRACTICE THIS

Turn it into offers. Work the real questions and concepts this maps to:

FAQ

A2UI (Agent-to-User Interface) is an open protocol, started at Google and licensed Apache 2.0, that lets an agent answer with an interactive screen instead of text. The agent describes the UI as data that references components the app has registered, and the app renders it with its own native components in React, Angular, Lit, Flutter, SwiftUI or Jetpack Compose. Version 1.0, the first stable release, shipped on 11 November 2026.

Discussion (4)

Adam ReyesEditor

The trust-boundary framing is what makes this relevant to forward deployed work. At a bank or a hospital, the question is never 'can the agent draw a nice chart'. It is 'can a third-party agent put something on our screen that we did not approve'. A catalog allowlist is an answer a security reviewer can actually sign off on.

Michael HughesContributor

Reader question: if the model never sees sensitive values, how does it know what to show?

Mei LinEditor

It sees structure and paths, not values. The model places a TextField bound to /account/balance, and the agent server fills the data model at that path from your systems. The model decides layout and wiring; your code decides the numbers. Same idea as a parameterized query keeping data out of SQL text.

James BennettEditor

The breaking-change note matters for anyone on 0.9 already. Gemini renders 0.9.1 today and the Compose renderer is still on 0.9.1, so a mixed fleet will run two protocol versions for a while. Pin per surface, and do not blanket-replace 'path' with '@path'; the migration guide warns about exactly that.