Skip to content

适用场景:构建可渲染 OpenClaw 富响应的 Matrix 客户端,或调试 com.openclaw.presentation 事件内容。OpenClaw 在出站 Matrix m.room.message 事件中附加标准化 MessagePresentation 元数据,普通客户端继续显示纯文本 body,而 OpenClaw 感知客户端可读取结构化元数据渲染按钮、选择框、上下文行、分割线等原生 UI。关键限制:元数据仅作为最佳努力呈现提示,未知类型/版本/块类型应忽略;交互仅通过回传值(通常是斜杠命令)到房间实现,无回调语义。

OpenClaw Matrix 消息呈现元数据配置与调试

事件内容

元数据存储在 Matrix 事件内容中:

json
{
  "msgtype": "m.text",
  "body": "Select model\n\n- DeepSeek: /model deepseek/deepseek-chat",
  "com.openclaw.presentation": {
    "version": 1,
    "type": "message.presentation",
    "title": "Select model",
    "tone": "info",
    "blocks": [
      {
        "type": "select",
        "placeholder": "Choose model",
        "options": [
          {
            "label": "DeepSeek",
            "value": "/model deepseek/deepseek-chat"
          }
        ]
      }
    ]
  }
}
  • version:Matrix 呈现元数据模式版本。客户端应忽略无法安全解释的未知版本。
  • type:OpenClaw 感知客户端的稳定鉴别器。客户端应忽略未知的 type 值。
  • blocks:富呈现块数组。每个块有 type 和对应字段。未知块类型应忽略。

回退行为

OpenClaw 始终在 body 中生成可读的纯文本回退。结构化元数据是附加的,不应要求其用于基本的 Matrix 互操作性。

  • 不支持的客户端:继续显示回退文本。
  • OpenClaw 感知客户端:可优先使用结构化元数据进行显示,同时在复制、搜索、通知和无障碍场景中保留回退文本。

支持的块类型

Matrix 出站适配器支持以下块:

  • buttons:按钮组
  • select:选择框(带选项列表)
  • context:上下文行(辅助信息)
  • divider:分割线

客户端应将这些块视为最佳努力呈现提示。未知字段和未知块类型应被忽略,而不是导致整条消息渲染失败。

交互方式

此元数据不添加 Matrix 回调语义。按钮和选择框的值是备用交互负载,通常是斜杠命令或文本命令。想支持交互的 Matrix 客户端可将选中的值以普通消息形式发送回房间。

例如,按钮的值为 /model deepseek/deepseek-chat,客户端通过向同一房间发送加密的 Matrix 文本消息来处理该命令。

与审批元数据的关系

com.openclaw.presentation 用于通用富消息呈现。

审批提示使用专用的 com.openclaw.approval 元数据,因为审批携带安全敏感的状态、决策和执行/插件细节。如果同一事件同时存在两个元数据键,客户端应优先使用专用的审批渲染器。

媒体消息

当回复包含多个媒体 URL 时,OpenClaw 每条媒体 URL 发送一个 Matrix 事件。呈现元数据仅附加到第一个媒体事件,使客户端获得一个稳定的结构化负载,并避免重复渲染器。

保持呈现元数据紧凑。用户可见的大段文本应留在 body 中,使用普通的 Matrix 文本分块路径。

常见问题

com.openclaw.presentation 元数据在 Matrix 事件中不出现怎么办?

确认 OpenClaw 已正确配置 Matrix 出站适配器并启用了富呈现。检查事件内容是否确实包含 com.openclaw.presentation 字段;如果缺失,可能是适配器版本不支持或消息类型不符(仅 m.room.messagemsgtypem.text 时附加)。

如何让 Matrix 客户端支持按钮点击交互?

客户端需要捕获用户选择的按钮值,然后以普通消息形式将值(如 /model deepseek/deepseek-chat)发送到同一房间。OpenClaw 不提供回调机制,因此客户端需自行实现值回传逻辑。

为什么媒体消息只给第一个媒体事件加呈现元数据?

避免重复渲染。OpenClaw 保证每个媒体 URL 独立事件,只有第一个事件包含结构化元数据,客户端据此渲染一次 UI,其他媒体事件仅包含纯文本回退。