跳到正文

快速、可靠的 A2UI,支持可替换的推理格式

探索 A2UI 全新的可替换推理格式,包括可将延迟降低 3 倍的 A2UI Express,以及通过 Jev 实现受控生成,打造快速、可靠的生成式 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 智能体 SDK 使其与传输和渲染兼容。

模型生成的格式就是我们所说的 inference_format。您在创建生成器时通过一个参数来设置它。SDK 会为该格式生成提示指令,并将模型的回复编译为标准 A2UI 消息。本文介绍了这种替换的工作原理、我们为何将 A2UI Express 开发为新的默认推理格式,以及决策模型如何根据您预先定义的布局构建屏幕。

01-intro-rendering-format

关于 A2UI 不再成立的两件事

Gemini_Generated_Image_3c13f83c13f83c13

可替换的推理格式如何工作

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

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

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

02-how-it-works-swap

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

Express:用三分之一的 token 生成相同的屏幕

Express 每行写一条语句,风格接近 Python。每一行将一个组件赋值给一个变量,变量名即成为组件 ID。参数按位置传递:编译器按目录 schema 声明的顺序将它们映射到属性名,_ 表示跳过一个。$/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 agent SDK 中的宏,当屏幕展示的数据你的系统已经持有时,宏会很有帮助。模型只写一个带 ID 的调用,例如 OrderStatus("ord_42"),而你的宏获取订单并填入数值,这样屏幕上的每个值都直接来自你的数据。宏 README 展示了配置方法。

我们如何设计出 A2UI Express

客户反馈揭示了直接 JSON 生成在延迟和准确性方面的问题。为了解决这个问题,我们开始设计一种新的推理格式。我们尝试了四种方案:

  • 直接 JSON:这是我们 2025 年 12 月发布时使用的现有基线。
  • Express:最终受 `python` 语法启发的方案,我们将其选为新的默认格式。
  • Atom:写 Lisp 风格的 S 表达式,没有赋值,也没有闭合标签。
  • Elemental:使用自定义元素编写 HTML,押注于模型已经具备的 HTML 编写能力。

我们在 gemini-3.5-flash 上用相同的 51 项任务评估运行了所有四种格式,并比较了思考模式开启和关闭时的表现:

04-how-we-chose-express-eval

A2UI Express 遵循 python 类似的语法,部分受到 OpenUI Lang 的启发,它是开源项目 OpenUI 的语言,同样将每个组件写成一条带位置参数的 name = Component(...) 语句。OpenUI Lang 添加了自己的内置函数和状态,两种语言目前尚不能互换使用。OpenUI 团队已在 #3214 中提议朝着共享语法的方向努力。如果你感兴趣,欢迎留言。

根据我们的测试,我们观察到 Express 推理格式在关闭思考模式时同样表现良好,这可以在使用 A2UI 完整表达能力时为你提供最快的推理时间。

使用 Jev 进行受控生成

有些界面具有已知的形态,例如设置页面、结账页面或确认页面。对于这些界面,模型不需要设计布局,而是需要在你已经定义的布局中进行选择,为此需要构建一种不同类型的模型。在这种情况下,你不需要 A2UI Express 提供的完整表达能力。

Jev 来自 TypeSafe,是一种所谓的系统一模型,专为做出快速、结构化的决策而构建,代码可以直接使用这些决策。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 → value、Auto-download → switch、Log out → danger,每个的概率 p ≈ 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 个 token,Apparite 的两条 Jev 流水线在所有 11 个提示上都产生了有效的 A2UI。该项目将这些数字视为初步观察,因为样本量很小。

受控生成只能产生其语法所描述的布局。Apparite 的语法涵盖九种屏幕原型和十二种区块,因此没有已知形状的屏幕更适合使用 Express。A2UI Agent SDK 尚未包含决策模型推理格式;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(),并关闭 thinking 运行模型。你的目录和渲染器保持不变,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

07-try-it-skills

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

来源

早期的 A2UI 文章:A2UI 简介(2025 年 12 月)、A2UI v0.9(2026 年 4 月)和A2UI + MCP Apps(2026 年 6 月)。

阅读显示设置

调整正文排版

当前浏览器记住选择,应用于文章正文。手机上正文宽度以屏幕可用空间为限。

图表完整性提示

普通文章遇到图表保存问题时显示提示。