Google A2UI 解读:当 AI 不再只是陪聊,而是开始画界面
1. 为什么我们不能只靠 Markdown?
目前的 Agent 交互虽然火热,但实际上体验极其割裂。
绝大多数 Chatbot(包括 ChatGPT)的交互只停留在 “文本 + Markdown” 的阶段。你要订票,它给你吐一段文字;你要看报表,它给你画个 ASCII 表格或者静态图片。虽然有了 Function Calling,但那是给后端用的,前端展示依然匮乏。
直接让 LLM 生成 HTML/JS 代码?在生产环境这是绝对禁忌。除了难以控制的幻觉,还有致命的 XSS 安全隐患。你不敢把 LLM 生成的 <script> 直接 innerHTML 到用户的浏览器里。
A2UI (Agent-Driven Interfaces) 的出现,就是为了解决这个问题。Google 并没有把它做成一个简单的 UI 库,而是一套协议 (Protocol)。
它的核心逻辑是:Agent 不写代码,只传数据(JSON)。客户端也不猜意图,只管渲染。 这使得 Agent 可以在不触碰一行 JS/Swift 代码的情况下,安全地驱动原生界面。
2. A2UI 的核心:流式传输与跨平台
A2UI 不是 React,也不是 Flutter,它是**“Headless 的 UI 描述语言”**。
- 声明式 (Declarative): Agent 发送的是 JSON 描述(比如“这里有个列表,列表项绑定了变量 X”),而不是命令式代码。
- 流式优先 (Streaming First): 专为 LLM 的 Token 输出特性设计。很多传统 JSON 协议需要等 JSON 闭合才能解析,A2UI 允许边生成、边解析、边渲染。首屏延迟(TTFB)被压到最低。
- 平台无关 (Framework-Agnostic): 同一套 JSON 流,在 Web 端可以是 React 组件,在 iOS 端可以是 SwiftUI,在 Android 端可以是 Jetpack Compose。这是它区别于 Vercel AI SDK (RSC) 的最大优势——它不绑死在 React 生态上。
3. 技术深挖:四种消息类型(Vue/React 视角)
A2UI 的文档里充斥着“Adjacency List(邻接表)”、“Flat Hierarchy(扁平层级)”等学术词汇。但对于前端工程师来说,如果你懂 Vue.js 或 React 的底层原理,A2UI 的机制其实就是“通过网络传输的响应式系统” (Reactivity over the wire)。
我们可以将 A2UI 的四种核心消息类型(Message Types),与 Vue 的渲染机制做一个类比:
(1) surfaceUpdate ≈ Virtual DOM / Template
这是 UI 的骨架。
-
Vue 原理: 就像你写的
<template>或者编译后的render函数。它定义了组件树的结构(Layout),以及组件属性(Props)。 -
A2UI 机制: Agent 发送
surfaceUpdate,告诉客户端:“这里放一个卡片,卡片里有个 Text,Text 的内容绑定到model.restaurantName”。 - 关键点: 它只定义结构和绑定关系,不一定包含具体的值。
(2) dataModelUpdate ≈ Reactivity System (ref / reactive)
这是 UI 的血液。
-
Vue 原理: 就像你在 Vue 里执行了
this.count++。Vue 的响应式系统会通过 Setter 劫持,通知 Watcher 去更新对应的 DOM 节点。 -
A2UI 机制: Agent 后续只需要发送
dataModelUpdate消息,包含{ "restaurantName": "海底捞" }的 JSON Patch。 - 性能杀手锏: 这意味着 Agent 不需要每次都重发整个 UI 结构。当数据变化时,客户端的 SDK 会像 Vue 一样,实现细粒度的更新 (Fine-grained updates)。这极大地节省了 Token 和带宽。
(3) beginRendering ≈ mounted Hook
- Vue 原理: 组件挂载完成,开始展示。
-
A2UI 机制: 控制渲染时机。Agent 可能想先在后台默默把数据和结构都发完,避免用户看到界面“跳变”,最后发一个
beginRendering信号,界面瞬间呈现。
(4) deleteSurface ≈ v-if="false" / unmounted
- Vue 原理: 组件销毁,DOM 移除。
- A2UI 机制: 会话结束或上下文切换时,清理不再需要的 UI 片段,释放客户端内存。
4. 生态位分析:A2UI 到底处于什么位置?
在 AI 工程化(AI Engineering)的版图中,A2UI 并不是孤立的。我们需要看看它和现在的热门工具有什么区别:
vs. Vercel AI SDK (RSC)
- Vercel: 强绑定 Next.js 和 React Server Components。如果你的全栈都是 Next.js,Vercel 的体验是无敌的。
- A2UI: 更加底层和通用。如果你的产品是一个 Flutter App 或者 Native Android 应用,你没法跑 React 组件。这时候,A2UI 这种纯 JSON 协议就是唯一解。
vs. MCP (Model Context Protocol)
Anthropic 推出的 MCP 最近很火,很多人容易混淆。
- MCP (Model Context Protocol): 解决的是 Agent 如何连接后端数据(Server-side)。比如 Agent 怎么读取你的 Git 仓库、怎么连数据库。
- A2UI: 解决的是 Agent 如何展示前端界面(Client-side)。
- 结论: 它们是互补的。理想的架构是:Agent 通过 MCP 获取数据,处理后通过 A2UI 协议画出界面展示给用户。
vs. OpenAI Canvas / ChatKit
- Canvas: OpenAI 的闭源产品功能。
-
ChatKit / CopilotKit: 这些是开源领域的应用框架。目前像 CopilotKit 这样的库,正在积极实现类似 Generative UI 的功能(通过
useCopilotAction渲染自定义组件)。
- Flutter GenUI SDK: 这是 A2UI 理念的最佳实践者。利用 Flutter 强大的渲染引擎,解析标准化的 JSON 协议,实现“一次生成,多端原生渲染”。
5. 总结:UI 开发范式的转移
A2UI 给我们最大的启示并非协议本身,而是开发模式的变革。
以前我们写 UI,是写死的页面(Page-based)。 未来我们写 UI,是提供一堆高质量的**“组件积木” (Component Registry)**。
前端工程师的工作将从“画页面”转变为“维护组件库”和“配置 Schema”。剩下的组装工作,将由 Agent 根据用户的意图,通过类似 A2UI 的协议,在运行时动态完成。这就是 "Component-First, AI-Assembled" 的未来。