Google 为 A2UI 推出可替换推理格式与 A2UI Express
Fast, reliable A2UI, with swappable inference formats
Google 为生成式 UI 协议 A2UI 推出可替换推理格式,并新增默认格式 A2UI Express,官方称相比 Direct JSON 延迟最多降低 3 倍、生成同等 UI 所需 token 最多减少 3 倍。
官方给出可替换推理格式的接入方式与延迟、token 对比,便于判断生成式 UI 的工程取舍。
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作为新的默认推理格式,以及决策模型如何从您预先定义的布局中构建屏幕。
A2UI现在不再有这两点
可互换推理格式的工作原理
推理格式有两个部分,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 messagesPython
已复制
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", {}))纯文本
复制
可互换的推理格式,包括 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 上运行,并将它们在思考模式(开和关)下进行了比较。
我们观察到 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.纯文本
复制
在一个播客应用的设置屏幕上,Jev 回答 Skip forward → 值,Auto-download → 开关和 Log out → 危险,每个概率约为 1.00。Apparite 在三步中构建整个屏幕:
- 一个 Jev 请求回答语法的布局问题,大约需要 30 个问题来构建一个屏幕。
- 代码根据目录构建组件树,并在大约 200 毫秒时发送
createSurface和updateComponents,文本将在这些占位符处放置。 - gemini-3.5-flash-lite 将文本流式传输到
updateDataModel。随着每一部分到达,小的后续 Jev 请求会确定依赖于它的内容,例如上方的行控制。
在 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 catalogPython
已复制
尝试受控生成。克隆示例 jev2ui 仓库,并按照那里的说明开始使用。一个托管版本的 Apparite(jev2ui) 运行在 apparite.cnfg.ai。
来源
早期的 A2UI 博客文章:介绍 A2UI (2025 年 12 月),A2UI v0.9 (2026 年 4 月) 和A2UI + MCP 应用 (2026 年 6 月)。
- A2UI Express 规范
- A2UI Elemental 规范和 A2UI Atom 规范
- A2UI 评估中的推理格式基线
- a2ui-agent-sdk 更改日志 (0.9.0, 2026 年 10 月 17 日) 和 @a2ui/agent 在 npm (0.0.1)
- Python 代理 SDK 中的技能生成器
- TypeSafe 的Jev 文档
- Apparite (jev2ui) README,"迄今为止的结果" 和 "已知限制",以及其屏幕语法
上一个
下一个
来源: Google Developers Blog · developers.googleblog.com