Google 开源 A2UI:实现 AI 智能体交互式界面对话

0 阅读11分钟

AI 智能体只能发文字?A2UI 协议打破这一限制,让智能体通过 JSON 描述生成丰富 UI。本文详解核心原理、实战案例和常见问题,带你快速上手。

1、概述

A2UI(Agent-to-User Interface)是由 Google 推出的开放标准协议,专门用于解决 AI 智能体与用户界面之间的交互问题。传统上,智能体只能通过文本与用户沟通,而 A2UI 使智能体能够生成结构化的 UI 描述(通过 JSON 格式),让智能体真正"用界面说话"。

img_1.jpg

通过 A2UI,智能体可以动态生成表单、图表、按钮等交互式 UI 组件,客户端应用则将这些描述渲染为原生界面元素。这种设计既保证了安全性(不执行任意代码),又提供了丰富的表达能力,让 AI 驱动的应用能够提供更直观、更强大的用户体验。

img_2.jpg

A2UI 渲染卡片图库,展示了 A2UI 可以实现的各种 UI 组合。A2UI 目前版本为 v0.8(公开预览版)。

2、核心价值

生成式人工智能擅长生成文本和代码,但智能体在向用户呈现丰富、交互式的界面时可能面临困难,尤其是在这些智能体处于远程环境或运行于不同信任边界之间时。

A2UI 使智能体能够"用 UI 说话"。采用声明式 JSON 格式来描述用户界面,将 UI 的生成(智能体端)与渲染(客户端)完全解耦。客户端应用则利用自身原生的组件库(如 Flutter、Angular、Lit 等)对该描述进行渲染。

这种设计让 AI 智能体能够生成丰富、交互式的用户界面,同时保证了安全性和跨平台兼容性。智能体生成的用户界面既像数据一样安全,又像代码一样富有表现力。

凭借创新的技术架构与灵活的应用特性,A2UI 正在工业制造、智慧城市、能源管理、智慧医疗和数字政务等领域加速应用。 PART 03****核心特性 A2UI 旨在应对智能体生成的用户界面在互操作性、跨平台性以及生成式或模板化 UI 响应方面的特定挑战,其核心特性包括:

  • 🔒 安全优先

规避 LLM 生成的任意代码的风险,采用声明式数据格式,客户端仅加载预置的可信组件(例如: Card, Button, TextField),从源头实现安全管控。

  • 🤖 对 LLM 友好且支持增量更新

UI 表示为带 ID 引用的扁平组件列表,便于 LLM 逐步生成,支持渐进渲染、快速响应,并可高效局部更新。

  • 🌐 框架无关且可移植

将 UI 结构与 UI 实现解耦,智能体仅发送组件树描述与数据模型,客户端负责映射到原生控件——无论是 Web组件、Flutter Widget、React 组件、SwiftUI 视图,还是其他任何技术栈。同一份 A2UI JSON 数据可在不同框架的多个客户端上渲染。

  • 🔧 灵活性

采用开放注册表模式,支持将服务端类型映射至任意客户端实现(原生移动控件、React组件)。通过"智能包装器",开发者可将现有 UI(含安全 iframe)接入 A2UI 的数据与事件系统,并在自定义逻辑中直接实施沙箱和"信任阶梯",自主掌控安全,无需依赖核心框架。

4、应用场景

📝 动态数据收集

在对话过程中,智能体根据具体业务上下文(如预订特殊服务)实时生成定制化表单,包含日期选择器、滑块、输入框等交互控件。

🌐 远程子代理

主控智能体将任务委派给远程的专业子智能体(如差旅预订助手),后者返回结构化 UI 内容,直接嵌入主聊天界面中呈现。

📊 自适应工作流

企业级智能体可根据用户查询即时生成审批看板、数据图表等可视化界面,动态支撑决策与操作流程。

5、端到端的架构流程

A2UI 将用户界面的生成与执行解耦,实现了一个完整的闭环交互系统。整体流程包含以下六个阶段:

img_3.jpg

1.📝 生成(Generation) 智能体基于当前上下文(如用户初始请求或历史对话)生成 A2UI JSON 响应。

2.📡 传输(Transport) 该消息通过 A2A、AG UI 等协议发送至客户端应用。

3.🔍 解析(Resolution) 客户端的 A2UI 渲染器解析该 JSON 内容。

4.🎨 渲染(Rendering) 渲染器将抽象组件(如type: 'text-field')映射原生 UI 元素(如 Vue 组件、Flutter Widget 或 Web Component 等)。

5.🔄 交互与反馈(Interaction & Event Capture) 用户与界面交互(如点击按钮、提交表单),客户端捕获事件和数据,并将其作为新输入发送回智能体(通常附带当前会话状态)。

6.⚡ 增量更新(Incremental Regeneration & Re-rendering) 智能体根据新输入生成增量式 A2UI 更新(例如仅修改某个组件的属性或替换子树),客户端接收后局部更新界面,实现流畅交互。

💡关键设计点:扁平结构 + 组件 ID 引用机制为高效支持局部更新而设计闭环设计不仅适用于"一次性展示",更适用于多轮对话、动态表单、审批流、向导式操作等复杂交互场景支持事件回传与增量刷新,构成完整的 agent-in-the-loop(智能体在环)工作流

6、技术架构 依赖关系

A2UI 本身是一个轻量级格式,但需融入更广泛的生态系统:

6.1 📡 传输协议

A2UI 兼容以下协议进行消息传输:

  • A2A 协议 Agent-to-Agent 通信协议,用于智能体之间消息传递。
  • AG UI Google 的智能体 UI 传输协议

这些协议负责将智能体生成的 A2UI JSON 消息安全、高效地传输到客户端应用。

6.2 🤖 大语言模型

A2UI 的设计对 LLM 非常友好,可由任何能输出 JSON 的模型生成,包括:

  • Gemini(Google)
  • GPT 系列(OpenAI)
  • Claude(Anthropic)
  • 其他支持结构化输出的现代 LLM

6.3 🖥️ 宿主框架

A2UI 需要运行在支持的宿主应用中,目前官方支持的框架包括:

  • Web 基于 Lit/Web Components,可在现代浏览器中运行
  • Flutter 支持移动端和桌面端应用

未来还将支持更多框架,如 React、Vue、Angular、SwiftUI 等。 PART 07****快速开始 实战案例 运行"餐厅搜索"演示,快速上手 A2UI。本指南将带你 5 分钟内体验智能体生成的用户界面。

📋 先决条件

在开始之前,请确保您已经:

  • Node.js(v18 或更高版本,推荐 v20+)
  • Gemini API 密钥— 从 Google AI Studio 免费获取
  • Python 3.11+(用于运行后端智能体)
  • Git(用于克隆仓库)

🎯 你将构建什么

完成本快速入门后,你将拥有:

  • ✅一个运行中的 Web 应用,集成 A2UI Lit 渲染器
  • ✅ 一个由 Gemini 驱动的智能体,可动态生成用户界面
  • ✅ 一个交互式餐厅搜索应用,支持表单生成、时间选择和确认流程
  • ✅ 理解 A2UI 消息如何从智能体传递并渲染为用户界面

📥 Step 1: 克隆仓库

git clone https://github.com/google/A2UI.gitcd A2UI

🔑 Step 2: 设置 API 密钥

将 Gemini API 密钥设置为环境变量:

Windows (PowerShell):

$env:GOOGLE_GENAI_USE_VERTEXAI = "TRUE"$env:GEMINI_API_KEY = "your_gemini_api_key_here"

Linux / macOS:

export GEMINI_API_KEY="your_gemini_api_key_here"

⚠️注意:请将your_gemini_api_key_here替换为你从 Google AI Studio 获取的实际 API 密钥。

🚀 Step 3: 导航到 Lit 客户端并启动

cd samples/client/litnpm installnpm run demo:all

💡提示:如果遇到 Node.js 版本问题,建议升级到 Node.js 20 或更高版本。

此命令将自动完成以下操作:

  1. 安装所有依赖项
  2. 构建 A2UI 渲染器
  3. 启动 A2A 餐厅查找代理(Python 后端)
  4. 启动开发服务器
  5. 访问http://localhost:5173

如果一切正常,您应该在浏览器中看到 Web 应用程序。代理现在已准备好生成 UI!

img_4.jpg

🎮 Step 4: 试试看

在 Web 应用程序中,尝试以下提示:

  1. "Book a table for 2" — 观看智能体生成预订表单 转存失败,建议直接上传图片文件

用户提交

img_6.jpg

2. "Find Italian restaurants near me" — 查看动态搜索结果

  1. "What are your hours?" — 体验不同意图的不同 UI 布局

🔍 后台发生了什么?

下图展示了 A2UI 的完整工作流程:

img_7.jpg

工作流程详解:

  1. 用户发送消息 通过网页界面发送一条消息(如 "Book a table for 2")
  2. 智能体接收 A2A 智能体接收该消息,并将对话内容转发给 Gemini
  3. LLM 生成 JSON Gemini 生成描述用户界面的 A2UI JSON 消息(包括组件定义、数据模型等)
  4. 流式传输 A2A 智能体将这些消息以流式方式传回网页应用
  5. 解析渲染 A2UI 渲染器解析 JSON 并将其转换为原生 Web 组件
  6. 界面展示 你在浏览器中看到渲染后的界面(预订表单、按钮等)

📦 A2UI 消息结构解析

让我们来看看智能体发送的内容。以下是一个简化的 JSON 消息示例:

📝 定义用户界面

{
  "surfaceUpdate": {
    "surfaceId": "main",
    "components": [
      {
        "id": "header",
        "component": {
          "Text": {
            "text": {
              "literalString": "Book Your Table"
            },
            "usageHint": "h1"
          }
        }
      },
      {
        "id": "date-picker",
        "component": {
          "DateTimeInput": {
            "label": {
              "literalString": "Select Date"
            },
            "value": {
              "path": "/reservation/date"
            },
            "enableDate": true
          }
        }
      },
      {
        "id": "submit-btn",
        "component": {
          "Button": {
            "child": "submit-text",
            "action": {
              "name": "confirm_booking"
            }
          }
        }
      },
      {
        "id": "submit-text",
        "component": {
          "Text": {
            "text": {
              "literalString": "Confirm Reservation"
            }
          }
        }
      }
    ]
  }
}

这定义了该界面区域的 UI 组件:一个文本标题、一个日期选择器和一个按钮。

💾 填充数据

{
  "dataModelUpdate": {
    "surfaceId": "main",
    "contents": [
      {
        "key": "reservation",
        "valueMap": [
          {
            "key": "date",
            "valueString": "2025-12-15"
          },
          {
            "key": "time",
            "valueString": "16:25"
          },
          {
            "key": "partySize",
            "valueInt": 2
          },
          {
            "key": "dietaryRequirements",
            "valueString": "微辣"
          }
        ]
      }
    ]
  }
}

这会填充组件可绑定的数据模型。

🎨 触发渲染

{
  "beginRendering": {
    "surfaceId": "main",
    "root": "header"
  }
}

这会通知客户端:已有足够信息,可以渲染 UI 了。

💡这只是 JSON注意这段内容多么清晰且结构化?大语言模型(LLMs)可以轻松生成此类数据,而且传输和渲染都是安全的——无需执行任何代码。这正是 A2UI 的核心优势:安全性与表现力的完美平衡。

8、更多演示-联系人查询智能体

A2UI 还提供了其他演示场景,帮助你更好地理解其应用范围。尝试联系人查询演示:

cd A2UI\samples\client\litnpm run demo:contact

该演示展示了一个联系人查询智能体,它能动态生成搜索表单和结果列表,展示了 A2UI 在处理数据检索和展示方面的能力。

img_8.jpg

生成展示界面

img_9.jpg

🎉恭喜!你已成功运行第一个 A2UI 应用。你见证了 AI 智能体如何通过安全、声明式的 JSON 消息,生成丰富且可交互的用户界面,并在 Web 应用中实现原生渲染。

9、更多演示-联系人查询智能体

在运行A2UI智能体时,遇到的问题:

9.1 ⚠️ Node.js 版本问题

**问题:**安装依赖时出现EBADENGINE警告,提示 Node.js 版本不兼容。

错误示例:

npm warn EBADENGINE Unsupported engine {npm warn EBADENGINE   package: 'vite@7.3.0',npm warn EBADENGINE   required: { node: '^20.19.0 || >=22.12.0' },npm warn EBADENGINE   current: { node: 'v18.17.0' }}

9.2 Windows 系统上的构建错误

问题: 在 Windows 上运行npm run build:renderer时出现copy-spec脚本失败。

原因: copy-spec脚本使用了 Unix 命令(mkdir -pcp),在 Windows PowerShell 中不兼容。

9.3 🔑 环境变量设置

问题: Agent 启动时提示GEMINI_API_KEY environment variable not set

9.4 🌐 无法访问 localhost:5173

问题: 服务启动成功,但浏览器无法访问http://localhost:5173/

9.5 🔌 Agent 连接失败

问题: 客户端无法连接到 Agent 服务器,出现ETIMEDOUTECONNREFUSED错误。

9.6 🔤 中文乱码问题

问题: 在 Windows PowerShell 中,日志输出的中文显示为乱码(如ûҵˡ)。

9.7 📜 找不到 npm 脚本

问题: 运行npm run demo:contact时提示 "Missing script"。

9.8 📦 依赖安装失败

问题: npm install失败或出现网络错误。

9.9 🔨 构建失败

问题:npm run build:renderer失败。

10、后续步骤

现在你已经亲身体验了 A2UI 的运行效果,接下来可以:

  • 📚学习核心概念:深入了解界面区域(surfaces)、组件类型和数据绑定机制
  • 🔧搭建自己的客户端:将 A2UI 集成到你现有的 Web 或移动应用中
  • 🤖开发智能体:创建能生成 A2UI 响应的智能体,实现自定义业务场景
  • 📖深入协议规范:查阅完整的 A2UI 技术协议说明,了解所有组件类型和 API

💡更多资源:访问 A2UI 官方仓库 获取最新文档和示例代码。

END

如果你觉得本文有帮助,欢迎点赞👍、在看👀、转发📤,也欢迎留言💬分享你的经验!