📰 正文

A2UI(全称 Agent-to-User Interface)是 Google 推出的一个开源项目,目标是让 AI 智能体(agent)能自动生成安全的图形化界面(UI)。

🧠 一句话解释: A2UI 是一种“让 AI 能说 UI 的语言”。

让智能体(Agents)能生成上下文相关的、动态的、可交互的用户界面(UI)。

传统上,AI 只能输出文字(比如 ChatGPT 给你一段文本),但它不能生成一个安全可交互的界面。

有两个难题: 1.

安全问题:如果让 AI 输出 HTML/JS 代码,会有执行任意代码的风险(如 XSS、RCE)。

跨平台问题:HTML、Flutter、React、SwiftUI 各有不同的渲染方式,AI 生成的代码往往不能通用。

A2UI 的出现就是为了解决这两个问题

它定义了一种开放的 UI 描述标准,让 AI 不直接生成代码,而是生成一种声明式的数据结构(JSON),用于描述界面的结构和行为。

客户端程序(前端 App)再根据这份数据结构,用自己的安全组件库去“解释并绘制”UI。

这样:

AI 不需要知道具体框架;

UI 可以跨平台;

安全性得到保证;

交互体验可以动态更新。

它让 AI 能用一种安全、标准的格式(JSON)告诉应用该怎么生成界面,而不是直接写代码。

举个例子:

以前你问 AI:“帮我查下东京餐厅” → AI 只能回一句文字说明;

用了 A2UI 后 → AI 能“生成”一个可交互的界面,比如地图上标出东京餐厅的位置。

也就是说,AI 不再只是“说话”,还能“画界面”。 但它不是写代码(这会有安全风险),而是生成一种安全的数据描述(JSON),告诉应用程序要显示什么界面。

image

A2UI 的核心特性

让智能体安全地生成 UI,而不是执行代码。

也就是说:

AI 只输出结构化 JSON;

客户端渲染 UI;

所有组件都来自安全的“组件白名单”。

🚫 不再发送代码

过去的远程 UI 往往通过 HTML/JS 传递,这会带来:

安全隐患(执行脚本);

样式不一致;

难以跨平台。

image

A2UI 为什么重要?

让我们看一个例子 👇


❌ 传统做法

AI 想生成一个界面(比如一个“酒店预订表单”),可能会输出:

<form>
  <input type="text" placeholder="Destination">
  <input type="date">
  <button>Book</button>
</form>

但是:

这个代码可能包含恶意脚本(安全风险⚠️);

前端框架可能不兼容(React、Flutter、SwiftUI 各不相同);

更新 UI 很难做到“动态增量修改”。


✅ 用 A2UI 的做法

AI 不直接写代码,而是输出一个安全的 JSON:

{
  "type": "form",
  "children": [
    { "type": "text-field", "label": "Destination", "id": "input_destination" },
    { "type": "date-picker", "label": "Check-in Date", "id": "input_date" },
    { "type": "button", "text": "Book", "onClick": "submit_form" }
  ]
}

前端(比如 Flutter、Lit、React)拿到这个 JSON 后, 会自动用本地的组件库去渲染出界面。

这样:

不运行 AI 生成的“可执行代码”,只解析数据 ✅

不限前端框架 ✅

AI 可以随时“增量更新 UI” ✅


技术结构与架构

A2UI 本质上是一个:

“声明式 UI 消息规范” + “跨平台渲染协议”

可以理解为:

AI → 生成 A2UI JSON → 前端解析 → 渲染本地组件

可以把整个 A2UI 的工作过程分为四个阶段。

image

  1. 生成(Generation)

智能体(Agent)——例如使用 Gemini 或其他大型语言模型(LLM)——生成一个符合 A2UI 规范的 JSON。 这个 JSON 包含界面的结构、组件类型、内容、事件标识等。

  1. 传输(Transport)

这个 JSON 数据通过网络传给客户端。 A2UI 支持的传输协议包括:

A2A Protocol(Agent-to-Agent 协议)

WebSocket

未来可能支持 REST、gRPC 等形式

  1. 解析(Resolution)

客户端应用收到 JSON 后,由 A2UI Renderer(渲染器)进行解析。 渲染器负责识别组件类型(如 “button”)并找到相应的本地实现。

  1. 渲染(Rendering)

渲染器将这些抽象组件映射到真实的 UI 元素上。 例如:

在 Flutter 中,“type”: “button” 映射为 ElevatedButton

在 Web 上,映射为 Lit 或 React 的