图表、表格和审批
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.enabledchannels.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