
A2UI(Agent to UI)是一种用于智能体驱动界面的声明式用户界面协议。它的核心在于,让人工智能Agent能够生成丰富的交互式用户界面,这些界面可以直接在各种平台(Web、移动设备、桌面设备)上进行原生渲染,而无需执行任何潜在危险的任意代码。
A2UI (Agent to UI) is a declarative UI protocol for agent-driven interfaces. AI agents generate rich, interactive UIs that render natively across platforms (web, mobile, desktop) without executing arbitrary code.
设计理念:为何需要A2UI?
A2UI的设计旨在解决智能体在互操作性、跨平台、生成式UI响应等方面面临的特定挑战。其设计建立在几个核心原则之上:
- 安全至上:运行由大语言模型生成的任意代码存在固有的安全风险。A2UI采用声明式数据格式,而非可执行代码。客户端应用维护一个受信任的、预先批准的UI组件“目录”(如卡片、按钮、文本框),Agent只能请求渲染目录中的组件,从而将风险隔离在可控范围内。
- 对LLM友好且可增量更新:UI以带有ID引用的扁平化组件列表形式表示,这使得LLM能够轻松地进行增量生成,实现渐进式渲染和响应式用户体验。随着对话进行,Agent可以根据新的用户请求,高效地对UI进行增量更改。
- 框架无关且可移植:A2UI将UI结构与具体实现分离。Agent发送的是组件树及其关联数据模型的描述,而客户端应用程序则负责将这些抽象描述映射到其原生组件(如Web Component、Flutter组件、React组件、SwiftUI视图等)。来自同一个Agent的A2UI JSON数据,可以在基于不同前端框架构建的多个客户端上渲染。
- 灵活性:A2UI采用开放的注册表模式,允许开发者将服务器端类型映射到自定义的客户端实现。通过注册“智能包装器”,开发者可以将任何现有的UI组件(包括用于承载传统内容的安全iframe容器)连接到A2UI的数据绑定和事件系统中,从而让开发者能够直接在自定义组件逻辑中强制执行严格的沙箱策略,将安全控制权牢牢掌握在自己手中。

A2UI的典型应用场景包括:
- 动态数据收集:Agent根据对话的具体上下文,实时生成定制化的表单(包含日期选择器、滑块、输入框等)。
- 远程子Agent协调:主协调Agent将任务委托给远程的专业Agent,后者可以返回一个UI数据包,并在主聊天窗口中直接渲染。
- 自适应工作流:企业级Agent能够根据用户的查询,动态生成审批仪表板或数据可视化图表。
目前,A2UI项目在GitHub上采用Apache-2.0许可证开源,短时间内已获得超过1万Star,是一个值得开发者关注的前沿开源项目。
核心原理:JSON描述与原生渲染
在多Agent系统中,Agent通常远程运行在不同服务器上,无法直接操作用户界面,只能发送消息。传统方法(如在iframe中发送HTML/JavaScript)存在笨重、视觉不协调、安全性复杂、与主应用风格不匹配等缺点。
A2UI则选择通过结构化的JSON数据来描述用户界面,其工作流程如下:
- LLM生成结构化的JSON输出。
- 该JSON可通过多种传输方式(如A2A、SSE、WebSocket)发送。
- 客户端接收后,使用其自身的原生UI组件库进行渲染。
这样一来,客户端完全掌控了安全性和样式,Agent生成的界面能够无缝、自然地融入宿主应用。
通信流程与示例
整个端到端的数据流清晰展示了服务器与客户端之间的协作。服务器通过Server-Sent Events (SSE) 发送JSON流,客户端进行缓冲、解析,并在收到明确的渲染信号后,利用本地组件注册表(Widget Registry)递归构建UI树、解析数据绑定,最终实例化原生组件。用户交互产生的事件则通过独立的消息通道发送回服务器,触发服务器生成新的UI更新流,从而实现动态交互。

例如,一个智能体可能会发送如下JSON消息来定义一个简单的预订界面:
首先是定义UI表面的组件结构(surfaceUpdate):
{"surfaceUpdate": {"surfaceId": "booking", "components": [
{"id": "title", "component": {"Text": {"text": {"literalString": "Book Your Table"}, "usageHint": "h1"}}},
{"id": "datetime", "component": {"DateTimeInput": {"value": {"path": "/booking/date"}, "enableDate": true}}},
{"id": "submit-text", "component": {"Text": {"text": {"literalString": "Confirm"}}}},
{"id": "submit-btn", "component": {"Button": {"child": "submit-text", "action": {"name": "confirm_booking"}}}}
]}}
接着,更新数据模型(dataModelUpdate):
{"dataModelUpdate": {"surfaceId": "booking", "contents": [
{"key": "booking", "valueMap": [{"key": "date", "valueString": "2025-12-16T19:00:00Z"}]}
]}}
最后,通知客户端开始渲染(beginRendering):
{"beginRendering": {"surfaceId": "booking", "root": "title"}}
客户端在收到这些消息后,会将其转换为Angular、Flutter、React等框架的原生组件进行渲染。这种将人工智能Agent的意图与前端具体实现解耦的设计,正是其强大灵活性的关键。
快速上手:运行一个A2UI示例
如果你想亲身体验A2UI,可以按照以下步骤快速运行一个示例项目。
-
克隆仓库:
git clone https://github.com/google/A2UI.git
cd A2UI
-
设置API密钥(以Gemini为例):
export GEMINI_API_KEY="your_gemini_api_key"
-
启动后端Agent:
cd samples/agent/adk/restaurant_finder
uv run .
-
启动前端客户端(在新终端窗口中):
# 安装并构建Lit渲染器
cd renderers/lit
npm install
npm run build
# 安装并运行Shell客户端
cd ../../samples/client/lit/shell
npm install
npm run dev
完成以上步骤后,你就可以在浏览器中看到一个由AI Agent驱动、通过A2UI协议渲染的交互式界面了。通过探索这类开源实战项目,开发者可以更深入地理解前沿技术是如何落地的。
参考资料
在云栈社区,你可以找到更多关于前端框架、AI工程化以及新兴交互协议的深度讨论和资源分享。