A2UI : 以动态 UI 代替 LLM 文本输出的方案

A2UI (Agent to UI) 是一个基于 JSON 的流式 UI 协议,旨在让 AI Agent 能够动态生成、控制并响应用户界面。从技术本质上看,它将 UI 视为纯粹的数据 payload,由前端运行时(Runtime)负责解析并映射为原生组件。
后端一直在生成固定格式的 json ,复杂的是前端runtime ,第一轮对话后 LLM call生成 JSON => UI ,UI 点击交互后又是新的 LLM call 之后生成的新 JSON => UI。
demo a2ui.org/quickstart/ 需要强网络环境。
初始交互流程与消息结构
在 A2UI 系统中,所有交互都始于标准的 JSON-RPC 消息。当用户在聊天框输入内容时,前端会封装一个message/send请求:

{ "jsonrpc": "2.0", "method": "message/send", "params": { "message": { "messageId": "28f374eb-5682-454a-9366-2350761362e4", "role": "user", "parts": [ { "kind": "text", "text": "查找纽约评分最高的5家中餐厅" } ] } }, "id": 1 }

后端 Agent 接收到此请求后,会调用大语言模型(LLM)。此时 LLM 的任务不仅是提供文本回复,还需要生成符合 A2UI 规范的 UI 描述 JSON。一个典型的 LLM 返回结构包含以下三个核心 DataPart:

[ { "beginRendering": { "surfaceId": "restaurant-surface", "root": "main-container" } }, { "surfaceUpdate": { "surfaceId": "restaurant-surface", "components": [ { "id": "main-container", "component": { "Column": { "children": { "explicitList": ["header-text", "result-list"] } } } }, { "id": "header-text", "component": { "Text": { "text": { "path": "title" }, "usageHint": "h1" } } }, { "id": "result-list", "component": { "List": { "children": { "template": { "componentId": "item-card", "dataBinding": "/restaurants" } } } } }, { "id": "item-card", "component": { "Card": { "child": "item-btn" } } }, { "id": "item-btn", "component": { "Button": { "child": "btn-label", "action": { "name": "view_detail", "context": [{ "key": "id", "value": { "path": "id" } }] } } } }, { "id": "btn-label", "component": { "Text": { "text": { "path": "name" } } } } ] } }, { "dataModelUpdate": { "surfaceId": "restaurant-surface", "path": "/", "contents": [ { "key": "title", "valueString": "推荐餐厅清单" }, { "key": "restaurants", "valueMap": [ { "key": "r1", "valueMap": [ { "key": "id", "valueString": "rest_001" }, { "key": "name", "valueString": "西安名吃" } ] } ] } ] } } ]

结论:A2UI 的核心逻辑是“UI 即数据”。Agent 通过surfaceUpdate定义组件的邻接表结构,通过dataModelUpdate注入业务数据。前端运行时负责维护这个状态并递归渲染。


用户交互触发的二次 LLM Call
当用户点击 UI 上的按钮(例如上述生成的“西安名吃”按钮)时,前端并不会执行本地的业务跳转,而是产生一个userAction回传给后端:

{ "userAction": { "name": "view_detail", "surfaceId": "restaurant-surface", "sourceComponentId": "item-btn", "timestamp": "2026-01-14T01:00:00Z", "context": { "id": "rest_001" } } }

后端 Agent 接收到此 Action 后,将其作为上下文再次请求 LLM,LLM 随后生成一段新的 UI JSON(例如该餐厅的详细预订表单)。
交互后 LLM 返回:动态生成的详情界面
后端 Agent 接收到userAction后,将其作为新的 Context 输入给 LLM。LLM 理解用户想要查看rest_001的详情,于是生成第二轮 UI JSON。这段 JSON 会覆盖或更新当前的渲染表面(Surface):

[ { "beginRendering": { "surfaceId": "restaurant-surface", "root": "detail-container" } }, { "surfaceUpdate": { "surfaceId": "restaurant-surface", "components": [ { "id": "detail-container", "component": { "Column": { "children": { "explicitList": ["detail-header", "booking-form"] } } } }, { "id": "detail-header", "component": { "Text": { "text": { "path": "restaurant_name" }, "usageHint": "h2" } } }, { "id": "booking-form", "component": { "Card": { "child": "form-fields" } } }, { "id": "form-fields", "component": { "Column": { "children": { "explicitList": ["phone-input", "date-picker", "confirm-btn"] } } } }, { "id": "phone-input", "component": { "TextField": { "label": { "literalString": "预订电话" }, "text": { "path": "/form/phone" } } } }, { "id": "date-picker", "component": { "DateTimeInput": { "label": { "literalString": "预订日期" }, "value": { "path": "/form/date" }, "enableDate": true } } }, { "id": "confirm-btn", "component": { "Button": { "child": "confirm-text", "primary": true, "action": { "name": "submit_booking", "context": [ { "key": "restaurantId", "value": { "literalString": "rest_001" } }, { "key": "phone", "value": { "path": "/form/phone" } } ] } } } }, { "id": "confirm-text", "component": { "Text": { "text": { "literalString": "确认预订" } } } } ] } }, { "dataModelUpdate": { "surfaceId": "restaurant-surface", "path": "/", "contents": [ { "key": "restaurant_name", "valueString": "西安名吃 - 第九大道店" }, { "key": "form", "valueMap": [] } ] } } ]

关键点:-上下文继承:LLM 记住了上一步选择的餐厅。

  • 动态组件切换:原本是列表页,现在变成了带有TextFieldDateTimeInput的预订表单。
  • 数据回传绑定confirm-btn按钮通过path绑定,会将用户在phone-input中输入的内容作为 Context 发回给后端。

标准组件库与渲染协议
A2UI 提供了一套标准组件库,目前包含 18 种原子组件,分为展示、布局、交互、表单四大类。
展示类组件 (Text, Image, Icon, Video, Audio)
这些组件负责内容呈现。以Image为例,其属性支持响应式填充:

{ "id": "poster", "component": { "Image": { "url": { "literalString": "https://cdn.example.com/img.png" }, "usageHint": "mediumFeature", "fit": "cover" } } }

布局类组件 (Row, Column, List, Card, Tabs, Divider, Modal)
布局组件通过children属性构建组件树。特别需要关注的是List组件的模板机制:
JSON

{ "List": { "direction": "vertical", "children": { "template": { "componentId": "reusable-card", "dataBinding": "/dataSourceArray" } } } }

运行时会遍历dataBinding指向的数据数组,为每个元素实例化一个componentId指定的模板组件。
交互与表单类组件 (Button, TextField, CheckBox, MultipleChoice, Slider, DateTimeInput)
TextField等组件支持数据双向绑定。当用户输入时,运行时会自动更新内部 DataModel:

{ "TextField": { "label": { "literalString": "联系电话" }, "text": { "path": "/form/phone" }, "textFieldType": "number" } }

数据绑定系统 (DynamicValue)
A2UI 弃用了硬编码字符串,所有属性均使用DynamicValue结构,支持literal(字面量)和path(路径绑定)两种模式:

类型数据模型示例JSON 绑定配置渲染结果
DynamicString{"name": "Alice"}{"path": "name"}"Alice"
DynamicNumber{"price": 99}{"path": "price"}99
DynamicBoolean{"valid": true}{"path": "valid"}true

数据路径支持绝对路径(以/开头)和相对路径(在模板循环中使用),这使得 UI 结构可以保持高度复用,仅通过切换数据源即可改变展示内容。
定制性边界
要理解 A2UI,必须明确 LLM 能做什么,以及它被禁止做什么。这类似于现代 Web 开发中的“设计系统”与“业务逻辑”的分离。
LLM 拥有完全控制权的部分(What & Where)
LLM 决定界面的业务逻辑和结构,这部分是完全动态的:

  1. 组件树拓扑:决定是先显示文字还是先显示图片,决定使用 Row 还是 Column 进行包装。
  2. 组件类型:根据上下文选择最合适的组件(如:发现需要用户输入时,动态生成TextField)。
  3. 数据映射:定义 UI 组件读取数据模型的哪个分支。
  4. 布局权重:通过weight属性(flex-grow 的 JSON 映射)决定组件占据的空间比例。
  5. 交互逻辑:定义按钮点击后发送给后端的 Action 名称和参数名。

前端 Runtime 强制控制的部分(How it looks)
为了防止 LLM 生成风格诡异、不可用或不安全的界面,样式权限被锁死在前端:

  1. 视觉样式 (CSS):LLM 无法指定具体的十六进制颜色(如 #FF0011)或像素值(如 14px)。所有的颜色、圆角、内边距、字体族都由前端的主题文件(Theme)预先定义。
  2. 交互细节:按钮点击时的缩放动画、列表滚动的物理惯性、输入框聚焦时的边框高亮。
  3. 响应式规则:在窄屏手机和宽屏显示器上如何折行,这由前端的 CSS Media Queries 固定处理。
  4. 底层实现Button在 HTML 中是用<button>还是<div>模拟,LLM 并不感知。
维度LLM 控制 (JSON 描述)前端控制 (Hardcoded/Theme)
内容✅ 文字内容、图片 URL、选项列表❌ 字体族、行高、字符间距
结构✅ 组件层级、排列顺序❌ 组件内部 DOM 嵌套
样式⚠️ 语义标记 (usageHint="h1")✅ 具体的 px、hex 颜色、阴影值
布局✅ 水平/垂直、flex 比例❌ 具体的 gap 间距、响应式断点
交互✅ 点击触发什么 Action✅ 点击时的视觉反馈、动画过渡

技术架构总结
A2UI 渲染器本质上是一个状态机。其核心逻辑如下:

// 渲染器核心伪代码逻辑 class A2uiRenderer { private surfaceState: Map<string, Surface>; processMessages(payload: JSON) { if (payload.surfaceUpdate) { // 1. 更新扁平化的组件注册表 this.updateComponents(payload.surfaceUpdate); } if (payload.dataModelUpdate) { // 2. 更新响应式数据源 this.updateDataModel(payload.dataModelUpdate); } // 3. 触发 UI 递归重绘 this.requestRender(); } renderNode(nodeId: string) { const config = this.getComponentConfig(nodeId); const componentClass = registry.get(config.type); // 自动解析数据绑定 const props = this.resolveProps(config.props, this.dataModel); return new componentClass(props, config.children); } }

总结:作为“协议”而非“框架”的 A2UI
从工程角度看,A2UI 类似于一种“强约束的低代码协议”。它的判断逻辑如下:

  1. 它是声明式的:后端不发送 JavaScript 代码,只发送 UI 的状态快照。
  2. 它是闭环的:前端的每一个有效操作(Action)都会导致后端生成新的 JSON 响应,从而驱动界面进入下一个状态。
  3. 它是安全的:由于 CSS 和底层 DOM 结构的解释权在前端,恶意 LLM 无法通过注入stylescript标签来进行 XSS 攻击或破坏 UI 规范。

这种设计的核心价值在于:它让 AI Agent 拥有了“长出手脚”的能力,能够直接通过界面引导用户完成复杂的业务流程,而不仅仅是作为一个聊天窗口存在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1161204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek-R1如何提升推理速度?CPU优化部署实战案例

DeepSeek-R1如何提升推理速度&#xff1f;CPU优化部署实战案例 1. 引言&#xff1a;轻量级大模型的本地推理新选择 随着大语言模型在逻辑推理、代码生成等复杂任务中的广泛应用&#xff0c;对高性能计算资源的依赖也日益加剧。然而&#xff0c;在许多实际场景中&#xff0c;用…

CosyVoice-300M Lite技术揭秘:如何实现高效语音合成

CosyVoice-300M Lite技术揭秘&#xff1a;如何实现高效语音合成 1. 引言 随着智能语音交互场景的不断扩展&#xff0c;从智能客服到有声读物生成&#xff0c;高质量、低延迟的文本转语音&#xff08;Text-to-Speech, TTS&#xff09;系统已成为AI应用的关键组件。然而&#x…

在线m3u8转MP4

谁懂啊&#xff01;m3u8转MP4找对工具&#xff0c;再也不用求程序员朋友了&#x1f62d; 宝子们&#xff01;有没有过这种崩溃时刻&#xff1a;好不容易找到的网课/影视片段&#xff0c;却是m3u8格式&#xff0c;手机放不了、电脑导不出&#xff0c;想存下来离线看根本没辙&am…

UE5 C++(29-2):描述碰撞响应方式的枚举类 enum ECollisionResponse。

&#xff08;162&#xff09;定义于 EngineTypes.h 头文件 &#xff1a; /** Enum indicating how each type should respond 枚举表示每个类型应如何响应*/ UENUM(BlueprintType, meta(ScriptName"CollisionResponseType")) enum ECollisionResponse : int {ECR_Ign…

BGE-Reranker-v2-m3参数详解:FP16加速与显存优化技巧

BGE-Reranker-v2-m3参数详解&#xff1a;FP16加速与显存优化技巧 1. 技术背景与核心价值 在当前的检索增强生成&#xff08;RAG&#xff09;系统中&#xff0c;向量数据库的初步检索虽然高效&#xff0c;但其基于语义距离的匹配机制容易受到关键词干扰&#xff0c;导致返回结…

bert-base-chinese教程:中文实体关系抽取详细步骤

bert-base-chinese教程&#xff1a;中文实体关系抽取详细步骤 1. 引言 随着自然语言处理技术的不断演进&#xff0c;预训练语言模型已成为中文文本理解任务的核心工具。其中&#xff0c;bert-base-chinese 作为 Google 发布的经典中文 BERT 模型&#xff0c;在命名实体识别&a…

JLink驱动开发核心要点:HID接口数据交互原理

深入JLink的“免驱”秘密&#xff1a;HID接口如何重塑嵌入式调试体验你有没有遇到过这样的场景&#xff1f;在客户现场准备调试一款工业控制器&#xff0c;插上JLink却发现Windows弹出“驱动未签名”的警告——而对方IT策略严禁安装第三方驱动。就在这尴尬时刻&#xff0c;同事…

Qwen3-VL-WEB快速体验:三步完成网页端AI推理任务

Qwen3-VL-WEB快速体验&#xff1a;三步完成网页端AI推理任务 1. 引言 随着多模态大模型的快速发展&#xff0c;视觉-语言理解能力已成为衡量AI智能水平的重要指标。Qwen3-VL作为通义千问系列中功能最强大的视觉-语言模型&#xff0c;不仅在文本生成与理解方面表现卓越&#x…

轻松搞定中文ITN转换|科哥开发的FST镜像一键部署指南

轻松搞定中文ITN转换&#xff5c;科哥开发的FST镜像一键部署指南 在自然语言处理的实际应用中&#xff0c;中文逆文本标准化&#xff08;Inverse Text Normalization, ITN&#xff09;是一个常被忽视但极为关键的环节。无论是语音识别输出、智能客服回复&#xff0c;还是会议纪…

5分钟部署BGE-M3:一键启动文本检索服务,小白也能搞定

5分钟部署BGE-M3&#xff1a;一键启动文本检索服务&#xff0c;小白也能搞定 1. 引言&#xff1a;为什么选择 BGE-M3&#xff1f; 在当前信息爆炸的时代&#xff0c;高效、精准的文本检索能力已成为构建智能搜索系统、推荐引擎和RAG&#xff08;Retrieval-Augmented Generati…

Qwen3-1.7B实战项目分享:构建个人AI助手

Qwen3-1.7B实战项目分享&#xff1a;构建个人AI助手 1. 引言&#xff1a;轻量级大模型开启本地化智能新时代 随着大语言模型技术的快速发展&#xff0c;如何在资源受限的设备上实现高效、低延迟的本地推理成为开发者关注的核心问题。阿里巴巴于2025年4月29日发布的Qwen3系列模…

DeepSeek-R1-Distill-Qwen-1.5B自动化测试:性能基准多次运行脚本实例

DeepSeek-R1-Distill-Qwen-1.5B自动化测试&#xff1a;性能基准多次运行脚本实例 1. 背景与目标 随着大模型在边缘设备和低延迟场景中的广泛应用&#xff0c;轻量化推理模型的部署与性能评估成为工程落地的关键环节。DeepSeek-R1-Distill-Qwen-1.5B作为一款基于知识蒸馏技术优…

没GPU如何微调VoxCPM?云端LoRA训练极简方案

没GPU如何微调VoxCPM&#xff1f;云端LoRA训练极简方案 你是不是也和我一样&#xff0c;是个热爱做播客的内容创作者&#xff1f;想给自己的节目配上专属AI声音&#xff0c;让听众一听就知道是“你”的风格。但看到网上那些VoxCPM的LoRA微调教程&#xff0c;动不动就写“推荐R…

Proteus电路仿真实战案例:步进电机驱动仿真分析

Proteus电路仿真实战&#xff1a;手把手带你搞定步进电机驱动仿真你有没有过这样的经历&#xff1f;辛辛苦苦焊好一块驱动板&#xff0c;通电后电机不转、发热严重&#xff0c;甚至烧了驱动芯片。查了半天才发现是相序接反了&#xff0c;或者电源没加滤波电容——这种“试错式开…

BGE-M3部署指南:多节点分布式方案

BGE-M3部署指南&#xff1a;多节点分布式方案 1. 引言 随着信息检索系统对精度和效率要求的不断提升&#xff0c;传统单一模式的文本嵌入模型已难以满足复杂场景下的多样化需求。BGE-M3 是由 FlagAI 团队推出的三模态混合检索嵌入模型&#xff0c;具备密集&#xff08;Dense&…

ComfyUI参数详解:ControlNet精准控制图像生成全解析

ComfyUI参数详解&#xff1a;ControlNet精准控制图像生成全解析 1. 引言&#xff1a;ComfyUI与ControlNet的技术协同价值 在当前AIGC&#xff08;人工智能生成内容&#xff09;快速发展的背景下&#xff0c;图像生成工具的灵活性与可控性成为工程落地的关键挑战。Stable Diff…

AI音乐创作新范式|NotaGen WebUI一键生成古典乐

AI音乐创作新范式&#xff5c;NotaGen WebUI一键生成古典乐 在人工智能技术不断重塑创意产业的今天&#xff0c;音乐创作正迎来一场静默而深刻的革命。传统上被视为人类情感与灵感专属领域的古典音乐&#xff0c;如今也能通过大模型驱动的系统实现高质量符号化生成。NotaGen 的…

TensorFlow-v2.15性能测评:不同GPU型号推理延迟对比

TensorFlow-v2.15性能测评&#xff1a;不同GPU型号推理延迟对比 1. 引言 随着深度学习模型在计算机视觉、自然语言处理等领域的广泛应用&#xff0c;推理性能成为影响实际部署效率的关键因素。TensorFlow 作为由 Google Brain 团队开发的主流开源机器学习框架&#xff0c;其最…

5分钟上手Z-Image-Turbo,文生图AI开箱即用实战指南

5分钟上手Z-Image-Turbo&#xff0c;文生图AI开箱即用实战指南 1. 引言&#xff1a;为什么你需要一个“开箱即用”的文生图方案&#xff1f; 在生成式AI快速发展的今天&#xff0c;高质量图像生成已成为设计、艺术创作和内容生产的核心工具。然而&#xff0c;大多数文生图模型…

2026年开发者必备:IQuest-Coder-V1开源部署趋势分析

2026年开发者必备&#xff1a;IQuest-Coder-V1开源部署趋势分析 1. 引言&#xff1a;代码大模型的演进与IQuest-Coder-V1的定位 随着软件工程自动化和AI编程助手的普及&#xff0c;代码大语言模型&#xff08;Code LLMs&#xff09;正从“辅助补全”迈向“自主实现”的新阶段。…