跳转至

图表、表格和审批

OpenClaw 在 Slack 中原生渲染的 Block Kit 界面。

原生图表

Slack 的公开 data_visualization Block Kit 块 会在消息中渲染折线图、条形图、面积图和饼图。OpenClaw 将可移植的 presentation chart 块映射为该原生形态;除了常规的 chat:write 消息访问权限外,无需额外的 OAuth 范围、文件上传、图像渲染器或 Slack 配置。

{
  "blocks": [
    {
      "type": "chart",
      "chartType": "bar",
      "title": "Quarterly revenue",
      "categories": ["Q1", "Q2"],
      "series": [{ "name": "Revenue", "values": [120, 145] }],
      "xLabel": "Quarter"
    }
  ]
}

Slack 的限制会在原生渲染前强制执行:

  • 标题和可选轴标签:50 个字符
  • 饼图:1-12 个正数段
  • 折线图/条形图/面积图:1-12 个名称唯一的系列以及 1-20 个共享类别
  • 段、类别和系列标签:20 个字符
  • 每个系列必须为每个类别包含一个有限值;非饼图值可以为负数

每个原生图表还携带一个顶层文本表示,用于屏幕阅读器、通知、会话镜像以及无法渲染该块的客户端。发送到其他 OpenClaw 频道的标准 presentation 会以文本形式收到同样的确定性图表数据,除非这些频道声明支持原生图表。如果 Slack 以 invalid_blocks 拒绝该图表,OpenClaw 会移除被拒绝的原生数据块,保留任何同级控件,并将完整的图表表示作为可见文本发送。

Slack 每条消息最多接受两个 data_visualization 块;其公开参考文档未记录此每条消息的子类型限制。当 presentation 包含两个以上有效图表时,OpenClaw 会保持其顺序,并在后续消息中继续原生渲染,每条消息最多包含两个图表。

Slack 的开发者发布 将该块记录为面向应用的 Block Kit 功能,并且未发布任何付费套餐限制。Business+/Enterprise 的资格表述适用于 Slackbot 的自动 AI 图表生成,这与应用发送已结构化的 Block Kit 图表不是一回事。图表是仅限消息的块,不属于 App Home、模态或 Canvas 内容。

原生表格

Slack 当前的 data_table Block Kit 块 会在消息中渲染结构化的行和列。OpenClaw 将显式的可移植 presentation table 块映射到 data_table;它不使用 Slack 的旧版 table 块。除常规的 chat:write 消息访问权限外,无需额外的 OAuth 范围或 Slack 配置。

{
  "blocks": [
    {
      "type": "table",
      "caption": "Open pipeline",
      "headers": ["Account", "Stage", "ARR"],
      "rows": [
        ["Acme", "Won", 125000],
        ["Globex", "Review", 82000]
      ],
      "rowHeaderColumnIndex": 0
    }
  ]
}

OpenClaw 将表头和字符串单元格映射到 Slack 的 raw_text 单元格。数字单元格映射到 raw_number,并保留有限数值以用于原生排序和过滤。当 rowHeaderColumnIndex 存在时,它会将该从零开始的列标记为 Slack 行表头。

Slack 发布的 data_table 限制会在原生渲染前强制执行:

  • 1-20 列
  • 1-100 个数据行,外加表头行
  • 每一行中的单元格数量相同
  • 单条消息中所有表格单元格的总字符数最多为 10,000

在消息仍处于总字符限制内的情况下,多个有效表格块可以原生渲染。无法在原生容器内渲染的表格会变成完整的确定性文本,而不是丢失行或单元格。如果该文本超过一条 Slack 消息,发送操作和斜杠响应会使用有序的文本块。表格编辑会以明确的尺寸错误失败,而不会静默地从现有消息中截断行。

由可移植 presentation 生成的每个原生表格还携带顶层文本表示,用于屏幕阅读器、通知、会话镜像以及无法渲染该块的客户端。原始图表和表格值在回退中保持字面值,因此 <@U123> 等单元格数据不会变成 Slack 提及。如果 Slack 以 invalid_blocks 拒绝原生图表或表格块,OpenClaw 会在一个有限的恢复步骤中移除所有原生数据块,保留按钮和选择器等有效同级块,并在禁用 Slack 格式的情况下发送完整的可见图表和表格文本。斜杠命令投递会跟踪 Slack 为该命令分配的 response_url 五次调用预算。在每批回复之前,它会选择一个适合剩余调用次数的完整计划,否则会在发布该批之前失败。

只有显式的 presentation 表格块才会被提升为原生表格。Markdown 管道表格仍保持作者编写的文本;OpenClaw 不会猜测表格结构或单元格类型。现有受信任的 Slack 原生生产者可以继续通过 channelData.slack.blocks 传递原始块;OpenClaw 会从有效的原始 data_table 单元格派生回退文本,而格式错误的自定义块可能会降级为其标题或常规 Block Kit 回退。可移植的 agent、CLI 和插件输出应使用 presentation。

Slack 客户端还可以将粘贴的电子表格内容作为旧版 table 块传递到消息的顶层块或附件中。OpenClaw 会将这些入站单元格渲染为分隔符安全的 TSV,用于实时 agent 输入、线程上下文和 Slack read 操作。普通附件只接受原生表格块;链接展开(link-unfurl)和其他非转发的附件文本仍被排除在外。

插件拥有的模态提交

注册了交互处理器的 Slack 插件还可以在 OpenClaw 压缩针对 agent 可见系统事件的负载之前,接收模态 view_submission 和 view_closed 生命周期事件。打开 Slack 模态时,请使用以下路由模式之一:

  • 将 callback_id 设置为 openclaw:<namespace>:<payload>。
  • 或保留现有的 callback_id,并在模态框的 private_metadata 中放入 pluginInteractiveData: "<namespace>:<payload>"。

处理程序会收到 ctx.interaction.kind,其值为 view_submission 或 view_closed、规范化后的 inputs,以及来自 Slack 的完整原始 stateValues 对象。仅使用 callback-id 路由就足以调用插件处理程序;当模态框还应生成代理可见的系统事件时,请包含现有模态框 private_metadata 中的用户/会话路由字段。代理会收到一个紧凑且已脱敏的 Slack interaction: ... 系统事件。如果处理程序返回 systemEvent.summary、systemEvent.reference 或 systemEvent.data,这些字段会包含在该紧凑事件中,以便代理可以引用插件拥有的存储,而无需看到完整表单负载。

Slack 中的原生审批

Slack 可以作为具有交互式按钮和交互的原生审批客户端,而不是回退到 Web UI 或终端。

  • Exec 和插件审批可以渲染为 Slack 原生 Block Kit 提示。
  • channels.slack.execApprovals.* 仍然是原生 Exec 审批客户端启用和 DM/频道路由配置。
  • Exec 审批 DM 使用 channels.slack.execApprovals.approvers 或 commands.ownerAllowFrom。
  • 当 Slack 已针对来源会话启用为原生审批客户端、当 approvals.plugin 路由到来源 Slack 会话或 Slack 目标,或当显式非空的 approvals.plugin.slack 审核人列表适用于该请求时,插件审批会使用 Slack 原生按钮。
  • 插件审批 DM 在请求中配置时使用 approvals.plugin.slack 审核人。省略默认审核人列表会保留 channels.slack.allowFrom、命名账户 allowFrom 或账户默认路由。
  • 仍会强制审批人授权:仅限 Exec 的审批人不能批准插件请求,除非他们同时也是插件审批人。

对于 Enterprise Grid 组织安装,来源事件经过验证的工作区会保留用于审批提示、审批人 DM、按钮回调和最终消息更新。当组织安装账户没有该事件所属的工作区范围时,审批投递会按失败关闭处理。

这与其他渠道使用相同的共享审批按钮界面。当在你的 Slack 应用设置中启用 interactivity 时,审批提示会直接在对话中渲染为 Block Kit 按钮。 当这些按钮存在时,它们是主要的审批 UX;只有当工具结果表示聊天审批不可用,或手动审批是唯一路径时,OpenClaw 才应包含手动 /approve 命令。

配置路径:

  • channels.slack.execApprovals.enabled
  • channels.slack.execApprovals.approvers(可选;在可能时回退到 commands.ownerAllowFrom)
  • channels.slack.execApprovals.target(dm | channel | both,默认:dm)
  • agentFilter, sessionFilter

Slack 原生 Exec 审批要求 enabled: true 或 "auto",并且至少有一个已解析的 Exec 审批人。将 enabled 留空或设置为 false 会禁用原生 Exec 审批投递。当 Slack 插件审批人已解析且请求匹配其筛选器时,Slack 也可以通过此原生客户端路径处理原生插件审批。禁用 Slack Exec 审批不会禁用通过 approvals.plugin 启用的原生插件审批投递,后者改用 Slack 插件审批人。approvals.plugin.slack.approvers 设置默认的 Slack 插件审核人列表;approvals.plugin.slack.plugins 可以为选定的原生工具插件和单个工具覆盖它。审核人 ID 可以是所选账户内的原始 U…/W… ID,或 team:<workspace-id>:user:<user-id>。显式空列表会拒绝该范围内的 Slack 决策。有关优先级和工具键格式,请参阅 插件权限请求。

使用命令所有者作为审批人的最小 Slack 原生配置:

{
  channels: {
    slack: {
      execApprovals: { enabled: "auto" },
    },
  },
  commands: {
    ownerAllowFrom: ["slack:U12345678"],
  },
}

要覆盖审批人、添加筛选器或选择来源聊天投递:

{
  channels: {
    slack: {
      execApprovals: {
        enabled: true,
        approvers: ["U12345678"],
        target: "both",
      },
    },
  },
}

共享的 approvals.exec 转发是独立的。仅当 Exec 审批提示还必须路由到其他聊天或显式带外目标时,才使用它。共享的 approvals.plugin 转发也是独立的;只有当 Slack 能够原生处理插件审批请求时,Slack 原生投递才会抑制该回退。

同一聊天中的 /approve 也适用于已支持命令的 Slack 频道和 DM。有关完整的审批转发模型,请参阅 Exec 审批。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw