QORM 对比 Google A2UI
A2UI 定义了 Agent 如何向客户端描述界面;QORM 则是渲染、签名、分发并打包整个应用的运行时。二者处于不同层级 —— 以下精确标明各自的边界。
A2UI 是什么 —— 以及它刻意“不”做什么
A2UI 是 Google 开源的 Agent 到客户端 UI 消息格式。Agent 不输出 HTML 或代码,而是以扁平的邻接表组件模型进行流式输出:每条消息描述的组件通过 ID 引用其子组件。这使得该格式对 LLM 十分友好 —— 模型可以逐 token 增量生成,客户端也可以在消息到达时渐进渲染。CopilotKit、Flutter 的 GenUI SDK 等项目已将其采纳为 Agent 与生成式 UI 客户端之间的传输格式。
这种刻意收窄的设计是一种优点,而非缺陷。A2UI 不规定渲染器(每个客户端将消息映射到自己的组件目录)、传输方式、分发或更新机制、内容签名或完整性校验,也不涉及任何形式的应用打包。它只专注回答一个问题:Agent 对客户端说了什么?
QORM 是什么
QORM(Query · Observe · Render · Mutate)是一个完整的、Agent 原生的纯 Go 应用平台。应用是语言中立的 JSON —— qorm.json 加上 scenes/ 与 actions/ —— 其余工作由同一个运行时完成:在浏览器中实时渲染应用、快照生成静态 HTML、将其 ed25519 签名为内容寻址的 bundle、通过 OTA 推送更新并支持一键回滚,还能将同一应用打包到 Web、iOS、Android、桌面端和小程序。
由于运行时本身就是集成点,QORM 通过 20+ 个 MCP 工具将运行中的应用暴露给 AI Agent:检查 UI 树、查询和设置状态、预览并应用补丁(带乐观令牌),以及用 qorm measure 和 qorm check 验证渲染几何。人类与 Agent 共享同一个实时会话 —— SSE 让所有观察者保持同步,qorm_activity 则将用户操作流式回传给 Agent。
并排对比
| 维度 | Google A2UI | QORM |
|---|---|---|
| 定位 | 协议 —— Agent 与客户端之间的 UI 消息格式 | 平台 —— 面向完整应用的运行时、分发与打包 |
| 渲染器 | 不作规定;每个客户端将消息映射到自己的组件 | 内置:同一个纯 Go 运行时渲染为 HTML/CSS 与原生壳 |
| 分发 / OTA | 不在范围内 | 内容寻址 bundle、OTA 更新、即时回滚 |
| 签名 / 完整性 | 不在范围内 | 每个 bundle 均经 ed25519 签名,激活前完成校验 |
| 打包目标 | 不在范围内 | Web、iOS、Android、桌面、小程序 —— 来自同一份 JSON 应用 |
| 人机共享实时会话 | 规范未定义 | 支持 —— SSE 同步,qorm_activity 将用户操作流式传给 Agent |
| 验证能力 | 规范未定义 | Agent 用 qorm measure / qorm check 验证渲染几何 |
你该选哪一个?
如果你正在构建自己的生成式 UI 客户端,需要一种干净、可流式、对 LLM 友好的方式让 Agent 描述界面树,A2UI 正是为此而生的优秀格式 —— 它可以与你已有的渲染器和框架自然组合。
如果你需要的是应用本身 —— 完成渲染、签名、OTA 分发、打包到各大平台,并能让人类与 AI Agent 在同一会话中实时驱动 —— 这正是 A2UI 刻意留白的层级,也是 QORM 填补的层级。二者并非对立:QORM 运行时原则上完全可以把 A2UI 流作为又一种输入格式来消费。
另请参阅 QORM 对比 AG-UI(CopilotKit) 了解生态中的事件传输一侧,或返回生态概览。