Presentation

在回复中用 OpenUI 展示布局、图表、表格和交互表单

Presentation 让 Agent 在 Desktop 回复中使用图表、比较卡片、表格和参数控件。你可以直接说“用可调利率的图表解释复利”或“把这些方案用卡片和表格比较”。

文字与模块按产生顺序穿插显示;对应模块成功发布后不重复显示成功工具活动。执行中、失败和待响应状态仍可见。

模块沿用 Desktop 的字体、字号、主题和控件圆角,采用单层细边框、突出的关键指标、细轨道滑块和紧凑参数区。普通卡片使用轻量透明布局,表格采用紧凑行距,图表弱化辅助网格并保留系列辨识度。新生成模块优先按“标题、指标、图表、参数、操作”组织,减少重复标题和嵌套卡片。

模块内的文字使用与回复正文相同的 Markdown 方言:表格渲染为真正的表格,mermaid 围栏渲染为可缩放、可全屏的图表,公式走 KaTeX,本地图片沿用受控文件协议。

生成与操作

支持本地参数、筛选、重置,以及点击按钮把当前参数和问题提交给 Agent。调整控件不产生模型请求,明确提交才会继续对话。最近视图状态保存在 Desktop 本地,不跨设备同步。

生成过程中,消息尾部的模块可以按语句逐步显示,控件在完整校验通过前禁用。这依赖模型服务发送工具参数增量;不支持或无法保证顺序时,模块在生成完成后显示。

模块发布成功后,本轮回答可以正常结束,界面仍可操作,无需等待你点击按钮。需要多个不同模块时可以依次发布;成功内容不需要反复生成来确认。

动作

presentation.show 使用 content 和 fallback_text。content 是 OpenUI Lang,采用位置参数;第一行声明 root,随后定义引用的组件与数据。

{
  "content": "root = Stack([header, chart, buttons])\nheader = CardHeader(\"增长比较\")\nchart = LineChart([\"2024\", \"2025\"], [Series(\"收入\", [10, 20])])\nbuttons = Buttons([Button(\"解释结果\", @ToAssistant(\"解释图表结果\"))])\n",
  "fallback_text": "收入从 2024 年的 10 增长到 2025 年的 20。"
}

当前开放 74 个组件(包括配套 Item):产品/概念/指标卡片、键值列表、内容列表、步骤、轮播、图标和图标按钮、Markdown、代码、图片与图库,以及已有布局、表格、图表和指标。输入支持日期、单选、多选、开关、Chips 和选项卡片,字段随表单提交给当前对话。$变量 保存本地状态,@Set 修改、@Reset 重置,@ToAssistant 提交问题。

复利可使用 @CompoundValues 与 @YearLabels:本金 0–10¹²,利率为 -1–1 小数,年限为 1–100 整数。

限制与回退

图片可使用真实 http(s) 地址、内联位图或 Desktop 已授权的本地绝对路径;本地文件复用受控文件协议,不能凭路径绕过权限。相对路径需先解析为绝对路径,图片加载失败保留文字。没有真实图片时应使用纯文字卡片。代码只展示、不执行。

不开放远程 Query / Mutation、任意业务调用或跳转;EditableTable、Modal 与新增图表类型暂未开放。内容最多 240 KiB、200 条语句、32 层嵌套,提交参数最多 16 KiB。

缺少 Renderer、协议版本不支持或组件失败时显示摘要。旧 JSON Spec 历史也使用文字回退。此版本基于 MIT 许可的 OpenUI,不要求使用其托管模型服务。