|
| 1 | +# 完整掌握 A2UI:官方 Demo 运行指南 |
| 2 | + |
| 3 | +> 除 SwiftUI Demo App 外,你还需要运行哪些官方 Demo 才能完整理解 A2UI 协议的全部能力。 |
| 4 | +> 所有 Demo 均来自仓库自带代码,无需额外下载。 |
| 5 | +
|
| 6 | +--- |
| 7 | + |
| 8 | +## 当前 SwiftUI Demo 的覆盖范围(~25%) |
| 9 | + |
| 10 | +| Demo | 覆盖的功能 | |
| 11 | +|------|-----------| |
| 12 | +| **Catalog**(18 组件) | 全部标准组件的静态展示;基础数据绑定(TextField/CheckBox/Slider 绑 path);v0.8 JSONL 格式 | |
| 13 | +| **Samples**(3 个) | 静态 JSON 一次性加载渲染;Card + 布局组合;restaurant_list 使用了 template 展开 | |
| 14 | + |
| 15 | +**未覆盖的关键能力**:A2A Agent 通信、Action 回传、checks/validation 函数体系、formatString 插值、多 Surface、增量更新、流式渲染、自定义组件、Accessibility、Agent 身份展示、多 Agent 编排。 |
| 16 | + |
| 17 | +--- |
| 18 | + |
| 19 | +## 推荐运行的 6 个官方 Demo |
| 20 | + |
| 21 | +### Demo 1: Lit Component Gallery + Agent(最高优先级) |
| 22 | + |
| 23 | +**你能学到什么**: 全组件行为参考、Action 交互闭环、Agent 动态响应模式 |
| 24 | + |
| 25 | +**路径**: |
| 26 | +- Agent: `samples/agent/adk/component_gallery` |
| 27 | +- Client: `samples/client/lit/component_gallery` |
| 28 | + |
| 29 | +**运行方式**: |
| 30 | + |
| 31 | +```bash |
| 32 | +# Terminal 1 — Agent |
| 33 | +cd samples/agent/adk/component_gallery |
| 34 | +export GEMINI_API_KEY="your_key" |
| 35 | +uv run . |
| 36 | +# 运行在 http://localhost:10005 |
| 37 | + |
| 38 | +# Terminal 2 — Client |
| 39 | +cd samples/client/lit/component_gallery |
| 40 | +npm install && npm run dev |
| 41 | +# 浏览器打开 http://localhost:5173 |
| 42 | +``` |
| 43 | + |
| 44 | +**观察重点**: |
| 45 | +- 这是 A2UI 的 "Kitchen Sink",所有 18 个标准组件 + 交互 + Action 回传 + Agent 动态响应都能看到 |
| 46 | +- 它是官方的**参考实现** —— SwiftUI Catalog 应该对标它的行为 |
| 47 | +- Agent 响应是流式到达还是一次性到达 |
| 48 | +- 用户点击 Button 后 Action 如何回传、Agent 如何用新 UI 响应 |
| 49 | +- TextField/CheckBox/Slider 等输入组件的数据绑定行为 |
| 50 | +- 多个 Surface 同时存在的效果 |
| 51 | + |
| 52 | +--- |
| 53 | + |
| 54 | +### Demo 2: Angular Gallery(客户端独立,无需 Agent) |
| 55 | + |
| 56 | +**你能学到什么**: 组合布局模式、编程式 Surface 构造、Theme 自定义 |
| 57 | + |
| 58 | +**路径**: `samples/client/angular/projects/gallery` |
| 59 | + |
| 60 | +**运行方式**: |
| 61 | + |
| 62 | +```bash |
| 63 | +cd samples/client/angular |
| 64 | +npm install |
| 65 | +npm run build |
| 66 | +npm start -- gallery |
| 67 | +``` |
| 68 | + |
| 69 | +**观察重点**: |
| 70 | +- 这是**纯客户端**的组件展示,不需要 Agent 后端 |
| 71 | +- 用 TypeScript 代码直接构造 `Surface` 对象来渲染,对比 SwiftUI 中用 JSONL 硬编码的方式 |
| 72 | +- 组合布局模式:Row 嵌套 Column、Card 包裹复杂内容 |
| 73 | +- Theme 自定义的视觉效果 |
| 74 | +- 它分为 Library(单组件展示)和 Gallery(复合场景)两个视图 |
| 75 | + |
| 76 | +--- |
| 77 | + |
| 78 | +### Demo 3: Restaurant Finder 全链路(最接近真实产品) |
| 79 | + |
| 80 | +**你能学到什么**: template 数组展开、表单交互闭环、Action context 数据绑定 |
| 81 | + |
| 82 | +**路径**: |
| 83 | +- Agent: `samples/agent/adk/restaurant_finder` |
| 84 | +- Client: `samples/client/lit/shell` |
| 85 | + |
| 86 | +**运行方式**: |
| 87 | + |
| 88 | +```bash |
| 89 | +# Terminal 1 — 先构建渲染器依赖 |
| 90 | +cd renderers/web_core && npm install && npm run build |
| 91 | +cd ../../renderers/lit && npm install && npm run build |
| 92 | + |
| 93 | +# Terminal 2 — Agent |
| 94 | +cd samples/agent/adk/restaurant_finder |
| 95 | +export GEMINI_API_KEY="your_key" |
| 96 | +uv run . |
| 97 | + |
| 98 | +# Terminal 3 — Client (Shell) |
| 99 | +cd samples/client/lit/shell |
| 100 | +npm install && npm run dev |
| 101 | +# 浏览器打开 http://localhost:5173 |
| 102 | +``` |
| 103 | + |
| 104 | +**观察重点**: |
| 105 | +- 用户提问 → AI 生成餐厅列表 UI(`template` 展开数组数据) |
| 106 | +- 用户点击餐厅 → AI 生成预约表单(TextField + DateTimeInput + Button with action context) |
| 107 | +- 用户填写提交 → Action 带着数据模型回传 Agent → Agent 返回确认 UI |
| 108 | +- 理解 **template 数组展开、Action context 数据绑定、完整交互闭环** 的最佳场景 |
| 109 | + |
| 110 | +**官方 JSON 参考**(可直接读取理解数据结构): |
| 111 | +- `samples/agent/adk/restaurant_finder/examples/single_column_list.json` — 餐厅列表 |
| 112 | +- `samples/agent/adk/restaurant_finder/examples/booking_form.json` — 预约表单 |
| 113 | +- `samples/agent/adk/restaurant_finder/examples/confirmation.json` — 提交确认 |
| 114 | + |
| 115 | +--- |
| 116 | + |
| 117 | +### Demo 4: Contact Multiple Surfaces(多 Surface 演示) |
| 118 | + |
| 119 | +**你能学到什么**: 多 Surface 同时渲染、自定义组件注册、复杂数据模型 |
| 120 | + |
| 121 | +**路径**: |
| 122 | +- Agent: `samples/agent/adk/contact_multiple_surfaces` |
| 123 | +- Client: `samples/client/lit/contact` |
| 124 | + |
| 125 | +**运行方式**: |
| 126 | + |
| 127 | +```bash |
| 128 | +# Terminal 1 — Agent |
| 129 | +cd samples/agent/adk/contact_multiple_surfaces |
| 130 | +export GEMINI_API_KEY="your_key" |
| 131 | +uv run . --port=10004 |
| 132 | + |
| 133 | +# Terminal 2 — Client |
| 134 | +cd samples/client/lit/contact |
| 135 | +npm install && npm run dev |
| 136 | +``` |
| 137 | + |
| 138 | +**观察重点**: |
| 139 | +- 仓库中唯一演示 **多 Surface 同时渲染** 的 Demo |
| 140 | +- 一次响应中同时 `beginRendering` 两个 Surface(`contact-card` + `org-chart-view`) |
| 141 | +- 客户端如何布局多个 Surface(分屏/侧栏) |
| 142 | +- 自定义组件(`OrgChart`、`WebFrame`)的注册和渲染方式 |
| 143 | +- Client-first 扩展模型:客户端告知 Agent 自己支持哪些自定义组件 |
| 144 | + |
| 145 | +**官方 JSON 参考**: |
| 146 | +- `samples/agent/adk/contact_multiple_surfaces/examples/multi_surface.json` — 多 Surface 响应结构 |
| 147 | +- `samples/agent/adk/contact_multiple_surfaces/examples/org_chart.json` — 自定义组件 |
| 148 | +- `samples/agent/adk/contact_multiple_surfaces/examples/contact_card.json` — 联系人卡片 |
| 149 | + |
| 150 | +--- |
| 151 | + |
| 152 | +### Demo 5: Orchestrator 多 Agent 编排(最复杂场景) |
| 153 | + |
| 154 | +**你能学到什么**: 多 Agent 路由、同一客户端接收不同 Agent 的 UI |
| 155 | + |
| 156 | +**路径**: |
| 157 | +- 子 Agent: `restaurant_finder` / `contact_lookup` / `rizzcharts` |
| 158 | +- 编排 Agent: `samples/agent/adk/orchestrator` |
| 159 | +- Client: `samples/client/angular/projects/orchestrator` |
| 160 | + |
| 161 | +**运行方式**: |
| 162 | + |
| 163 | +```bash |
| 164 | +# Terminal 1 — Restaurant Agent |
| 165 | +cd samples/agent/adk/restaurant_finder |
| 166 | +export GEMINI_API_KEY="your_key" |
| 167 | +uv run . --port=10003 |
| 168 | + |
| 169 | +# Terminal 2 — Contact Agent |
| 170 | +cd samples/agent/adk/contact_lookup |
| 171 | +export GEMINI_API_KEY="your_key" |
| 172 | +uv run . --port=10004 |
| 173 | + |
| 174 | +# Terminal 3 — Rizzcharts Agent |
| 175 | +cd samples/agent/adk/rizzcharts |
| 176 | +export GEMINI_API_KEY="your_key" |
| 177 | +uv run . --port=10005 |
| 178 | + |
| 179 | +# Terminal 4 — Orchestrator Agent |
| 180 | +cd samples/agent/adk/orchestrator |
| 181 | +uv run . --port=10002 \ |
| 182 | + --subagent_urls=http://localhost:10003 \ |
| 183 | + --subagent_urls=http://localhost:10004 \ |
| 184 | + --subagent_urls=http://localhost:10005 |
| 185 | + |
| 186 | +# Terminal 5 — Angular Client |
| 187 | +cd samples/client/angular |
| 188 | +npm install && npm run build |
| 189 | +npm start -- orchestrator |
| 190 | +``` |
| 191 | + |
| 192 | +**观察重点**: |
| 193 | +- Orchestrator Agent 根据用户意图将请求路由到不同的子 Agent |
| 194 | +- 同一个客户端接收来自不同 Agent 的 UI 响应 |
| 195 | +- 理解 A2UI 在多 Agent 协作场景下的工作方式 |
| 196 | +- 注意:rizzcharts 需要 Google Maps API key,没有也能跑,只是地图部分不显示 |
| 197 | + |
| 198 | +--- |
| 199 | + |
| 200 | +### Demo 6: v0.9 Spec 官方测试用例(读 JSON,不需运行) |
| 201 | + |
| 202 | +**你能学到什么**: checks/validation 函数体系的完整语法、协议边界条件 |
| 203 | + |
| 204 | +**路径**: `specification/v0_9/test/cases/` |
| 205 | + |
| 206 | +| 文件 | 覆盖的功能 | |
| 207 | +|------|-----------| |
| 208 | +| `contact_form_example.jsonl` | **完整表单**:checks + required/email/regex 函数 + formatDate + ChoicePicker + Button action with context | |
| 209 | +| `checkable_components.json` | **所有可校验组件**的 checks 用法:TextField(required/email/regex/length) + ChoicePicker(length) + Slider(numeric) + CheckBox(required) + DateTimeInput(required) + **and/or/not 嵌套逻辑** | |
| 210 | +| `button_checks.json` | Button checks 的 **and/or 嵌套条件**、variant 属性、废弃属性检测 | |
| 211 | +| `text_variants.json` | Text 组件所有 variant 的验证 | |
| 212 | +| `theme_validation.json` | Theme(primaryColor)的合法/非法格式 | |
| 213 | +| `function_catalog_validation.json` | 函数目录的 schema 验证 | |
| 214 | +| `client_messages.json` | 客户端消息格式(UserAction 等) | |
| 215 | + |
| 216 | +**重点阅读**: `contact_form_example.jsonl` 和 `checkable_components.json`,它们定义了 checks/validation 函数体系的权威用法,直接决定你 SwiftUI 渲染器需要实现的函数引擎行为。 |
| 217 | + |
| 218 | +--- |
| 219 | + |
| 220 | +## 推荐运行顺序与收益 |
| 221 | + |
| 222 | +| 顺序 | Demo | 运行难度 | 学到什么 | 累计覆盖率 | |
| 223 | +|:----:|------|:--------:|---------|:----------:| |
| 224 | +| 1 | **Lit Component Gallery** | 中(Agent + Client) | 全组件行为参考、Action 交互、Agent 响应模式 | ~45% | |
| 225 | +| 2 | **Angular Gallery** | 低(纯客户端) | 组合布局、编程式 Surface 构造、Theme | ~50% | |
| 226 | +| 3 | **Restaurant Finder** | 中(Agent + Client) | template 展开、表单闭环、Action context | ~60% | |
| 227 | +| 4 | **Contact Multi-Surface** | 中(Agent + Client) | 多 Surface、自定义组件、复杂数据模型 | ~70% | |
| 228 | +| 5 | **Orchestrator** | 高(4 Agent + Client) | 多 Agent 编排、最复杂场景 | ~85% | |
| 229 | +| 6 | **读 v0.9 test cases** | 零(读 JSON) | checks/validation 函数体系、协议边界条件 | ~100% | |
| 230 | + |
| 231 | +--- |
| 232 | + |
| 233 | +## 每个 Demo 对 SwiftUI 渲染器开发的反哺 |
| 234 | + |
| 235 | +| 观察到的行为 | 反哺到 SwiftUI 渲染器 | |
| 236 | +|-------------|---------------------| |
| 237 | +| Lit Component Gallery 中的 Action 回传流程 | SwiftUI Demo 目前无 Agent 通信,需新建 Live Agent 页面实现 Action 回传 | |
| 238 | +| Restaurant Finder 中 template 展开数组 | 验证 SwiftUI restaurant_list.json 的 template 行为是否正确 | |
| 239 | +| Contact Multi-Surface 的多 Surface 布局 | SwiftUI `SurfaceManager` 已实现但无 Demo,需补充演示 | |
| 240 | +| Contact Multi-Surface 的自定义组件注册 | SwiftUI 需实现自定义组件注册机制 | |
| 241 | +| checkable_components.json 中 and/or/not 嵌套 | SwiftUI 需实现 checks 引擎 + 客户端函数注册表 | |
| 242 | +| contact_form_example.jsonl 中 formatDate | SwiftUI 需实现 formatDate 函数 | |
| 243 | +| Orchestrator 中不同 Agent 的 UI 路由 | SwiftUI 需实现 Agent 连接页面,支持切换/管理多 Agent | |
| 244 | + |
| 245 | +--- |
| 246 | + |
| 247 | +## 前置依赖 |
| 248 | + |
| 249 | +### 运行 Agent 需要 |
| 250 | + |
| 251 | +- Python 3.10+ 和 `uv`(Python 包管理器) |
| 252 | +- `GEMINI_API_KEY` 环境变量(从 Google AI Studio 获取) |
| 253 | + |
| 254 | +### 运行 Lit Client 需要 |
| 255 | + |
| 256 | +- Node.js 18+ 和 `npm` |
| 257 | +- 先构建渲染器:`cd renderers/web_core && npm install && npm run build && cd ../lit && npm install && npm run build` |
| 258 | + |
| 259 | +### 运行 Angular Client 需要 |
| 260 | + |
| 261 | +- Node.js 18+ 和 `npm` |
| 262 | +- `cd samples/client/angular && npm install && npm run build` |
0 commit comments