Google 发布的 A2UI v0.9,把生成式 UI 的重点从“让模型吐出一段前端代码”拉回到更稳妥的方向:AI Agent 只声明界面意图,由宿主应用、设计系统和运行平台决定如何渲染。对做 Agent、内部工具、客服台、数据分析助手的团队来说,这个变化很关键——它试图把 AI 生成界面从一次性 Demo,推进到可迁移、可治理、可维护的工程形态。
从“生成代码”转向“声明 UI 意图”
A2UI v0.9 的核心思路是 framework-agnostic:Agent 不需要知道你用 React、Flutter、Vue、SwiftUI 还是某个内部 UI 框架。它输出的是类似“这里需要一个确认卡片”“这里需要一个表单”“这里需要展示可选操作”的 UI 意图,而不是任意可执行代码。
这带来几个直接收益:
- 安全边界更清楚:宿主应用不必执行模型生成的任意 JavaScript 或模板代码。
- 跨平台更现实:同一份 UI 意图可以映射到 Web、移动端、桌面端或聊天式界面。
- 设计系统更容易接管:按钮、颜色、间距、校验提示仍由现有设计系统控制。
- Agent 输出更可测试:可以验证 JSON/schema,而不是审查一段随机生成的 UI 代码。
这不是说 A2UI 会替代前端框架。更准确地说,它站在 Agent 和 UI 框架之间,定义一个“可移植的界面协议层”。
v0.9 值得关注的变化
这次 v0.9 的摘要里有几个工程味很浓的关键词。
对齐现有设计系统 是重点。很多生成式 UI 方案的问题不是“能不能画出来”,而是“画出来以后是不是像我们的产品”。如果 Agent 直接生成组件代码,就很容易绕开团队已有的 Button、Card、Form、Alert 等规范。A2UI 的路线更像是:Agent 说“我需要一个主操作按钮”,而宿主应用决定这个按钮用哪个组件、什么样式、什么交互反馈。
Python SDK 也很重要。大量 Agent 后端、工具编排和数据处理代码都在 Python 生态里。SDK 的出现意味着开发者可以在 Python 服务里构造 A2UI payload,而不是手写协议对象。
错误处理和多种传输方式 则说明这个标准不只面向静态样例。真实系统里,Agent 可能通过 HTTP、WebSocket、队列、RPC 或已有消息通道发送 UI 意图;协议层需要能表达失败、降级、重试和兼容策略。
此外,迁移指南和演进规范意味着 A2UI 还在发展中。v0.9 不是一个“永远不变”的终点,更像是接近可用前夜的一次标准化收口。
可以这样实践:用 Python 生成一个 A2UI 风格的 UI 意图
下面示例是一个可改造的最小伪项目,用于演示 A2UI 这类协议在后端 Agent 中的使用方式。字段名和结构请以你实际采用的 A2UI SDK 或规范为准;这里重点展示工程分层:Agent 只返回 UI 意图,前端负责映射到设计系统组件。
创建文件 agent_ui_intent.py:
import json
from dataclasses import dataclass, asdict
from typing import Any, Literal
@dataclass
class A2UIAction:
id: str
label: str
intent: Literal["primary", "secondary", "danger"]
@dataclass
class A2UIIntent:
kind: str
title: str
description: str
data: dict[str, Any]
actions: list[A2UIAction]
def build_refund_review_ui(order_id: str, amount: float) -> A2UIIntent:
return A2UIIntent(
kind="confirmation_card",
title="Review refund request",
description="The agent found an order that may be eligible for refund.",
data={
"order_id": order_id,
"amount": amount,
"currency": "USD",
"policy_note": "Manual approval is required for refunds over 100 USD.",
},
actions=[
A2UIAction(id="approve_refund", label="Approve refund", intent="primary"),
A2UIAction(id="request_more_info", label="Request more info", intent="secondary"),
A2UIAction(id="reject_refund", label="Reject", intent="danger"),
],
)
if __name__ == "__main__":
ui_intent = build_refund_review_ui(order_id="ORD-10086", amount=129.99)
print(json.dumps(asdict(ui_intent), indent=2, ensure_ascii=False))
运行:
python agent_ui_intent.py
你会得到一段结构化 JSON。真实接入时,可以把它交给 Web 前端、移动端或内部控制台做映射:
const componentMap = {
confirmation_card: renderConfirmationCard,
};
function renderA2UI(intent) {
const renderer = componentMap[intent.kind];
if (!renderer) {
return renderFallbackMessage("This UI is not supported yet.");
}
return renderer({
title: intent.title,
description: intent.description,
data: intent.data,
actions: intent.actions,
});
}
这个例子里,Agent 没有控制按钮颜色、DOM 结构或 CSS 类名。它只表达业务意图:退款审核、金额、原因、可执行操作。真正的 UI 由你的设计系统接管。
接入时要盯住的边界
A2UI 这类标准最适合解决“Agent 需要动态呈现操作界面”的场景,但它不是万能胶。
如果你的界面高度定制、动画复杂、状态机非常细,仍然需要手写前端组件。A2UI 更适合承载卡片、表单、列表、确认操作、选择器、摘要视图这类模式化 UI。
落地时建议从三件事开始:
- 定义允许的 UI 类型:不要让 Agent 任意发挥,只开放经过审核的
kind。 - 建立 schema 校验:所有 Agent 输出先校验,再渲染。
- 设计降级体验:未知组件、字段缺失、动作失败时,要能回退到文本或安全提示。
- 绑定权限系统:Agent 声明的 action 不等于用户有权执行,后端仍要鉴权。
- 记录协议版本:v0.9 仍在演进,payload 中最好保留版本字段,方便迁移。
采用建议
如果你已经在做 Agent 驱动的后台系统,A2UI v0.9 值得放进技术雷达。它的价值不在于“让 AI 自动写 UI”,而在于把 UI 生成限制在一个可验证、可迁移、可治理的协议里。
比较稳妥的路线是:先选一个低风险场景,比如客服建议卡片、审批确认框、数据摘要面板;让 Agent 输出 A2UI 风格的结构化意图;前端只渲染白名单组件;再逐步扩展到复杂表单和多步骤任务。这样既能利用生成式 UI 的灵活性,又不会把生产系统交给一段不可控的模型生成代码。