Skip to content

结构化回复 ​

数字人与 Yeaft 原生 Session 可按需使用 PresentResponse,将已经获得的结果表达为更易阅读的结构化内容。普通短回答仍然直接使用文字;这不是每轮必经的「美化模型」,不会为渲染额外调用模型。

展示与边界 ​

同一份版本化内容协议和前端组件服务两条链路;消息身份、执行生命周期及持久化仍分别归属于原生 Session transcript 与数字人的 owner-scoped 存储。

支持 Markdown、方案卡片、紧凑指标、对比表、柱状/折线图、时间线、关系图、图片、交付链接与地点坐标示意。组件的布局、颜色及几何由客户端控制,不接受模型提供的 HTML、CSS、JavaScript 或任意 SVG。

  • 卡片用于实际分组,避免把所有段落装进重复的卡片外壳。
  • 图表必须使用真实数据,并说明单位、来源和限制;渲染不会验证数据真实性。
  • 未设置 embed 的地图仍是明确标注的坐标示意图与地点列表,不加载外部地图瓦片,不是导航地图。可选的受认可第三方地图直接嵌入回复;坐标与详情独立可读,不依赖服务商加载成功。不得凭空推测坐标。
  • 外部图片自动加载,不发送来源信息,失败时可手动重试;外链仅接受无凭据的 HTTP(S),Server/Agent 不抓取。查看会向对应站点发起浏览器请求,应注意隐私。此工具不生成图片,也不按路径读取本机文件。
  • 已有本地图片、文件交付机制保持独立;不要用不受所有权校验的本机路径或其他 owner 的资源代替有效交付链接。

一个工具,十种内容类型 ​

PresentResponse 是统一发布工具,单次 blocks 可以混合多种类型,不需要为图表、图片、地图分别调用渲染工具。

type用途当前边界
markdown标题、段落、列表、代码与文字链接不执行 HTML、脚本;Markdown 图片不会自动转成图片块
cards方案与条目分组,可选已提供图片/来源最多 8 张卡片
metrics重点数字与说明最多 8 项
table方案对比与数据最多 8 列、50 行,局部横向滚动
chart柱状/折线图最多 4 系列、40 个横轴标签,提供数据表
timeline时间/步骤序列最多 16 项
diagram架构与关系最多 12 个节点、24 条边
image已有图片展示自动加载、失败重试、展开预览;不生成图片
link来源、报告与交付链接默认在所属内置浏览器中打开
map坐标示意或受认可地图嵌入,保留地点列表最多 20 点;可选 OpenStreetMap/Google 分享嵌入

普通点击富响应中的链接:Session/Work Center 打开其所属 Workbench 浏览器;数字人复用同一个浏览器组件,在自己的交付侧栏打开,绝不借用其他 Session 的 route。点击链接旁的 ↗、浏览器内「新标签页打开」,或使用 Ctrl/Cmd/中键等浏览器操作可显式选择外部打开。内置浏览器不可用时提示,不自动跳转新标签页。部分网站禁止嵌入;不因此放宽 iframe 隔离或代理远端内容。

数字人的窄屏阅读器支持使用 Tab / Shift+Tab 进入和离开嵌入网页控件。跨域网页内的 Escape 无法传递给阅读器;可使用“返回阅读器控件”或“关闭阅读器”。

卡片图片与地图嵌入选项 ​

这些是 v1 的增量可选字段,不是新工具或新类型;仍是一个工具、十种内容类型。

卡片可设置 image: { "url": "https://…", "alt": "…", "fit": "contain" },以及来源/操作 url。URL 只接受无凭据的 HTTP(S)。已有 logo/图标使用 fit: "contain",摄影使用 "cover"(默认)。图片自动加载且不发送 referrer,预留展示空间、保留可访问描述,失败可重试。天气、NBA 等信息仅在实际提供有效图片引用时显示图片;组件不会编造数据或图标。

地图可设置 embed: { "provider": "openstreetmap" }。客户端生成官方 https://www.openstreetmap.org/export/embed.html URL,使用有边界的 bbox、layer=mapnik 和 marker=纬度,经度。多地点时通过「地图地点」选择一个嵌入标记,完整编号坐标/详情列表始终保留。不要提供任意 OSM 嵌入地址。经度跨越 ±180° 时地图保持选中位置居中;纬度超出 Web Mercator 支持范围(约 ±85.05113°)时明确提示,仅保留坐标和详情,不替换为其他位置的地图。

也可设置 embed: { "provider": "google", "url": "https://www.google.com/maps/embed?pb=…" },但必须是已验证的官方分享嵌入 URL。从 Google 地图的分享/嵌入功能复制 iframe 的 URL,而不是 HTML。通用首页、未知域名、任意 HTML、URL 凭据、API key 及 /maps/embed/v1/… API 均不支持。Google Maps Embed API 需要另行获得授权的密钥配置,本功能不支持该 API。 分享视图可能与列表坐标不同,因此保留全部地点详情,不声称能在该视图中选择任意地点标记。

iframe 仅授予 sandbox="allow-scripts allow-same-origin",使用 referrerpolicy="no-referrer"、可访问标题和键盘焦点;不授予定位、弹窗或顶层导航权限。加载会联系外部服务商。跨域 load 事件不能验证内容,网络限制、CSP 或服务商策略仍可能导致空白。没有事件时 12 秒后提示超时;可重试、选择「仅显示坐标」、点击服务商/来源链接或显式 ↗。任何失败都不会自动打开外部标签页。未设置 embed 的现有坐标示意保持不变。

「在 Google 地图中导航」使用 https://www.google.com/maps/dir/?api=1&destination=纬度,经度。Google 可能在其页面询问出发位置,这不授予 Yeaft 定位权限。来源/服务商/导航链接普通点击仍打开所属内置浏览器,↗ 才是显式的浏览器新标签页操作。

json
{
  "type": "cards",
  "items": [{
    "title": "已验证地点",
    "text": "来自所提供来源的详情。",
    "image": { "url": "https://example.org/place.jpg", "alt": "所提供的地点照片", "fit": "cover" },
    "url": "https://example.org/place"
  }]
}
json
{
  "type": "map",
  "embed": { "provider": "openstreetmap" },
  "points": [{ "label": "Civic Center", "latitude": 37.7793, "longitude": -122.4193, "detail": "已验证坐标,并非入口位置。" }]
}

Loop 中的语义 ​

工具/能力首先校验全部内容,然后发布用户可见回复。非法类型、超限内容、不一致的表格/图表、不存在的关系端点及不安全 URL 均拒绝发布;模型可以修正参数或使用文字回复。

phase: "progress" 表示阶段性沟通;phase: "final" 表示交付意图,不自行终止 turn、提交认知状态或证明任务完成。Session 沿用引擎 terminal boundary;数字人仍由认知提案的 next:null 完成提交。发布后的取消/失败不能撤销已交付内容,执行中的状态也不能因存在 final 内容而变成成功。

不强制工具只能在最后调用。先展示有依据的部分结果,可以继续检查;完整结果发布后,不需要再重复输出相同长文。

协议示例 ​

原生 Session 工具参数,以及数字人能力的 args,使用相同结构:

json
{
  "title": "两种方案对比",
  "summary": "建议先选择方案 A:验证成本更低。下列成本仅为估计,尚未包含外部服务费用。",
  "phase": "final",
  "blocks": [
    {
      "type": "cards",
      "items": [
        { "title": "方案 A", "label": "建议", "text": "复用既有能力,先验证关键链路。" },
        { "title": "方案 B", "text": "单独建设,维护成本较高。" }
      ]
    },
    {
      "type": "table",
      "columns": ["方案", "改动范围", "验证"],
      "rows": [["A", "局部", "聚焦测试与浏览器"], ["B", "跨模块", "端到端与恢复"]]
    }
  ]
}

summary 必须独立可读,供复制、搜索、模型历史和旧客户端降级,不只是「见上图」。单次内容上限 48 KiB,最多 12 个 block;每种 block 还有条目、长度和维度限制。原生工具 schema 和数字人按需加载的完整能力契约描述实际字段。

兼容范围 ​

  • 原生 Session:通过内置工具按需发现、执行并发布,支持实时展示与持久历史回放。
  • 数字人:通过能力目录发现、准备、调用,继续使用现有同 episode 分段展示。
  • Claude Code/Copilot CLI Chat:前端组件可以复用,但其 CLI 工具协议不因原生工具注册而自动增加此能力。
  • 旧消息没有结构化内容,保持原来的文字展示;不迁移旧 transcript 或运行数据。未知内容版本保留可读摘要。

验证关注点 ​

变更需要同时覆盖协议校验、发布与终止分离、取消/失效执行权、持久化重开、实时与历史去重、身份隔离,以及 light/dark、320px 窄屏、桌面、长内容、键盘访问和外部图片失败。没有调用该工具的普通文字回答不应改变。

Released under the MIT License.