阅读视图

发现新文章,点击刷新页面。

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 的核心:流式传输与跨平台

image.png

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 的渲染机制做一个类比:

image.png

(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) beginRenderingmounted Hook

  • Vue 原理: 组件挂载完成,开始展示。
  • A2UI 机制: 控制渲染时机。Agent 可能想先在后台默默把数据和结构都发完,避免用户看到界面“跳变”,最后发一个 beginRendering 信号,界面瞬间呈现。

(4) deleteSurfacev-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 渲染自定义组件)。

image.png

  • Flutter GenUI SDK: 这是 A2UI 理念的最佳实践者。利用 Flutter 强大的渲染引擎,解析标准化的 JSON 协议,实现“一次生成,多端原生渲染”。

5. 总结:UI 开发范式的转移

A2UI 给我们最大的启示并非协议本身,而是开发模式的变革

以前我们写 UI,是写死的页面(Page-based)。 未来我们写 UI,是提供一堆高质量的**“组件积木” (Component Registry)**。

前端工程师的工作将从“画页面”转变为“维护组件库”和“配置 Schema”。剩下的组装工作,将由 Agent 根据用户的意图,通过类似 A2UI 的协议,在运行时动态完成。这就是 "Component-First, AI-Assembled" 的未来。

❌