跳到正文
实时
Google Developers Blog·· 19 天前精选66

Google 为 A2UI 推出可替换推理格式与 A2UI Express

Fast, reliable A2UI, with swappable inference formats

要点速览

Google 为生成式 UI 协议 A2UI 推出可替换推理格式,并新增默认格式 A2UI Express,官方称相比 Direct JSON 延迟最多降低 3 倍、生成同等 UI 所需 token 最多减少 3 倍。

Why it matters

官方给出可替换推理格式的接入方式与延迟、token 对比,便于判断生成式 UI 的工程取舍。

正文 · AI 翻译

2026年10月27日

我们听到了您关于A2UI和生成式UI体验速度的担忧:人们在模型为每个屏幕生成时等待。这次发布为您提供了一些工具来加快速度,以便您可以为每个屏幕选择合适的权衡。

在这个版本中,我们很高兴地推出可互换的推理格式,并分享利用决策模型与A2UI的示例,这些示例有助于构建更快、更可靠的生成式UI体验。使用我们的新A2UI Express作为推理格式,您可以减少高达 3倍 的延迟,使用像Jev这样的决策模型来做出布局决策,可以减少高达 80倍。与Direct JSON相比,Express生成相同类型的UI所需的token最多减少3倍。我们将在本文中详细探讨这些内容。


A2UI是一种为生成式UI优化的代理协议,其中客户端以合同的形式宣传一组受信任的组件,代理发送A2UI消息来描述由该目录组成的定制用户界面,客户端的渲染器绘制UI(参见 介绍A2UI)。

最初,代理直接生成A2UI JSON传输消息,每个花括号和嵌套元素。事实证明,为LLM生成受复杂JSON模式约束的JSON树是缓慢且容易出错的。这使A2UI与LLM(输出文本)耦合,并使其难以集成更快的System One决策模型。

现在,代理可以生成 A2UI Express,这是一种针对推理速度和准确性优化的中间格式,并依赖于A2UI代理SDK中的确定性代码将其转换为基于JSON的传输协议。代理构建者也可以为任何特殊用例交换任何其他DSL及其相关编译器,我们的A2UI Agent SDK(s)使其与传输和渲染兼容。

模型生成的格式,我们称之为 inference_format。您在创建生成器时通过一个参数来设置它。SDK为该格式生成提示指令,并将模型的回复编译成标准的A2UI消息。本文涵盖了交换的工作原理,我们为什么开发A2UI Express作为新的默认推理格式,以及决策模型如何从您预先定义的布局中构建屏幕。

01-intro-rendering-format

A2UI现在不再有这两点

Gemini_Generated_Image_3c13f83c13f83c13

可互换推理格式的工作原理

推理格式有两个部分,SDK根据您的目录的JSON模式生成这两个部分。提示部分教模型该格式的语法,编译器将模型的回复编译成经过验证的A2UI消息。由于这两个部分都来自模式,因此格式不能描述您的目录中缺少的组件或属性。

您在创建生成器时通过一个参数选择格式:

from a2ui.processor import A2uiGenerator, CatalogConfig
from a2ui.inference_formats import ExpressFormatFactory

catalog = CatalogConfig.from_path("catalog.json")
generator = A2uiGenerator(
    [catalog],
    examples=few_shot_examples,  # written once as A2UI JSON
    inference_format_factory=ExpressFormatFactory(),
)

processor = generator.create_processor(renderer_capabilities)
system_prompt = f"{instructions}\n\n{processor.prompt_snippet}"
parts = processor.parse_response(model_reply)  # text parts + validated A2UI messages

Python

已复制

02-how-it-works-swap

A2UI Express可在Python代理SDK(a2ui-agent-sdk 0.9.0在PyPI上)、TypeScript代理SDK(@a2ui/agent在npm上)和Dart SDK(a2ui_agent 0.0.1-wip004在pub.dev上)中使用。在TypeScript中,您将new ExpressFormatFactory()作为生成器的第三个参数传递。Python和TypeScript SDK都可以逐块流式传输Direct JSON,并将Express从完整的回复中编译。

Express:用三分之一token显示相同的屏幕

Express 每行写一条语句,风格接近 Python。每行将一个组件赋值给变量,变量名成为组件 ID。参数是位置性的:编译器按你的目录模式声明它们的顺序将它们映射到属性名,_ 跳过一个。$/title 将值绑定到数据模型,Event("accept") 声明一个服务器操作。这是 A2UI 画廊在 Express 中的通知卡片:

surface("gallery-notification-permission")
$/description="Get alerts for order status changes"
$/icon="check"
$/title="Enable notification"
root=Card(main_column)
main_column=Column([icon, title, description, actions], _, "center")
icon=Icon($/icon)
title=Text($/title)
description=Text($/description, "body")
actions=Row([yes_btn, no_btn], "center")
yes_btn_text=Text("Yes")
yes_btn=Button(yes_btn_text, _, Event("accept", {}))
no_btn_text=Text("No")
no_btn=Button(no_btn_text, _, Event("decline", {}))

纯文本

复制

03-express-same-card

可互换的推理格式,包括 A2UI Express,也适用于 Python 代理 SDK 中的宏,这有助于当屏幕显示你的系统已经持有的数据时。模型仅写一个 ID 的调用,例如 OrderStatus("ord_42"),你的宏获取订单并填写值,所以屏幕上的每个值都直接来自你的数据。《宏 README》显示了设置。

我们如何设计了 A2UI Express

客户反馈发现了直接生成 JSON 的延迟和准确性问题。为了修复这个问题,我们开始设计新的推理格式。我们尝试了四个选项:

  • 直接 JSON:这是我们现有的基线,我们在 2025 年 12 月发布。
  • Express:我们最终选择的 `python` 语法启发的格式,作为新的默认值。
  • Atom:使用 Lisp 风格的 S-expressions,没有赋值,没有结束标签。
  • Elemental:使用 HTML 和自定义元素,押注模型已经很好地编写 HTML。

我们将所有四个格式都通过相同的 51 任务评估在 gemini-3.5-flash 上运行,并将它们在思考模式(开和关)下进行了比较。

04-how-we-chose-express-eval

我们观察到 Express 推理格式即使在不思考的情况下也能同样有效;这可以在使用 A2UI Express 时给你最快的推理时间。

使用 Jev 进行受控生成

有些屏幕有已知的形状,例如设置页面、结账或确认页面。对于这些,模型不需要设计布局。它需要在已经定义的布局中选择,并为这种情况构建一个不同的模型。为此,你不需要 A2UI Express 提供的全部表达能力。

Jev,来自 TypeSafe,被称为 System One 模型,用于做出代码可以直接使用的快速、结构化决策。Jev 不生成文本或 JSON。你发送给它一个状态和一组类型化的问题,它用校准的概率回答每一个。一个问题可以询问一个陈述是否为真(Noul),哪个选项适合列表(Choice),或者某物在评分标准上的得分(Score)。Jev 在一个请求中回答许多问题,大约需要 100 到 300 毫秒。

Apparite(jev2ui),一个开源设计工具,展示了如何将 System One 模型连接到 A2UI。Jev 决定了每个屏幕的结构,代码根据这些决策构建 A2UI 组件,一个小模型 gemini-3.5-flash-lite 仅编写文本。问题存在于预先编写的 Markdown 语法中。一个块引用询问一个问题,其项目是其选项,每个选项都有标准。grammar/screen.md 的这个块决定了设置行获得哪个控件:

#### row_control (of each row in rows, within each group in groups)

Material: a switch for one on/off setting that takes effect at once. HIG: a disclosure indicator for a row that opens another page.

> `{row}` is a row in the supplied screen and section. Grouped rows can represent content, navigation, settings or actions; use their actual text and context to decide.
>
> What kind of row is {row}?

- **switch** — A setting that is simply on or off and takes effect at once: notifications, dark mode, autoplay, sync.
- **value** — A setting with one current value picked from several, changed on another page: language, quality, theme, frequency, units.
- **nav** — A link to another page: a content item, details, account, privacy, help, about, or managing something. Its text and section identify what it opens.
- **check** — One of several alternative options listed together, of which one is chosen: the choices of a single setting, such as '10 seconds', '30 seconds', 'High', 'Low'.
- **danger** — A final or destructive account action: sign out, delete account, clear data, reset.

纯文本

复制

05-controlled-row-control

在一个播客应用的设置屏幕上,Jev 回答 Skip forward → 值,Auto-download → 开关和 Log out → 危险,每个概率约为 1.00。Apparite 在三步中构建整个屏幕:

  1. 一个 Jev 请求回答语法的布局问题,大约需要 30 个问题来构建一个屏幕。
  2. 代码根据目录构建组件树,并在大约 200 毫秒时发送 createSurface 和 updateComponents,文本将在这些占位符处放置。
  3. gemini-3.5-flash-lite 将文本流式传输到 updateDataModel。随着每一部分到达,小的后续 Jev 请求会确定依赖于它的内容,例如上方的行控制。

06-controlled-timeline

在 11 次提示的运行中,组件树在 92 到 298 毫秒内出现在屏幕上,每个屏幕在 0.8 到 1.7 秒内完成。文本写入器每屏生成 101 到 341 个标记,Apparite 的两个 Jev 管道在所有 11 次提示中都生成了有效的 A2UI。该项目将这些数字视为初步观察,因为样本很小。

受控生成只能生成其语法描述的布局。Apparite 的语法涵盖了九种屏幕原型和十二个块,因此没有已知形状的屏幕更适合 Express。A2UI Agent SDKs 尚不包含决策模型推理格式;apparite(jev2ui) 项目是一个示例,展示了如何在使用决策模型的一批独立决策的情况下组装 A2UI 消息。

使用哪种模式

A2UI Express 快速且保留了 A2UI 的全部表达能力,但做出多个独立决策的决策模型仍然更快。根据您可以预先定义的屏幕部分多少来选择:

  • 受控,当决策模型可以生成您需要的内容时。 如果您的屏幕遵循固定且定义好的布局,决策模型可能是最快的选择。
  • Express 以获得完全的表达能力。 当屏幕需要基于您的目录获得更多表达能力时,回退到 A2UI Express。它很快,模型仍然会写入整个组件树。
  • 您自己的格式用于任何新内容。 由于推理格式是可互换的,新的用例或未来的语法只需要一个提示生成器来教模型您的 DSL,以及一个在您的 DSL 和 A2UI 消息之间进行转换的转换器。您的目录和渲染器保持不变。

试试看

在您的代理中使用 Express。 使用 pip install a2ui-agent-sdk 安装 Python SDK 或使用 npm install @a2ui/agent 安装 TypeScript SDK,在创建生成器时传递 ExpressFormatFactory(),并以关闭思考的方式运行模型。您的目录和渲染器保持不变, Express 规范 文档了语法。

要教 Gemini 或任何其他加载技能的模型仅使用您的组件来编写 Express,请使用 Python SDK 的 SkillGenerator 从您的目录生成技能:

import json
from a2ui.core import Catalog
from a2ui.inference_formats.express import ExpressFormat
from a2ui.skill import SkillGenerator

catalog = Catalog.from_json(json.load(open("catalog.json")))
skills = SkillGenerator(ExpressFormat([catalog])).generate_skillset()
skills.export_to_directory("skills")  # a2ui-core plus one skill per catalog

Python

已复制

07-try-it-skills

尝试受控生成。克隆示例 jev2ui 仓库,并按照那里的说明开始使用。一个托管版本的 Apparite(jev2ui) 运行在 apparite.cnfg.ai。

来源

早期的 A2UI 博客文章:介绍 A2UI (2025 年 12 月),A2UI v0.9 (2026 年 4 月) 和A2UI + MCP 应用 (2026 年 6 月)。

上一个

下一个

来源: Google Developers Blog · developers.googleblog.com