--- summary: "Native Block Kit 图表和表格、模式提交和批准按钮" read_when: - "在 Slack 中本地渲染图表或表格" - "处理插件拥有的 Slack 模式提交" - "批准来自 Slack 的执行或插件请求" title: "Slack 图表、表格和认证" sidebarTitle: "图表、表格和批准" --- Block Kit 表面 OpenClaw 在 Slack 中本地渲染。 ## 原生图表 Slack 的公开 [`data_visualization` Block Kit 区块](https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block/) 可在消息中渲染折线图、柱状图、面积图和饼图。OpenClaw 将可移植的 `presentation` `chart` 区块映射为这种原生形态;除正常的 `chat:write` 消息访问权限外,不需要额外的 OAuth 作用域、 文件上传、图像渲染器或 Slack 配置。 ```json { "blocks": [ { "type": "chart", "chartType": "bar", "title": "Quarterly revenue", "categories": ["Q1", "Q2"], "series": [{ "name": "Revenue", "values": [120, 145] }], "xLabel": "Quarter" } ] } ``` Slack 的限制会在原生渲染前强制执行: - 标题和可选坐标轴标签:50 个字符 - 饼图:1-12 个正值分段 - line/bar/area:1-12个唯一命名的系列和1-20个共享类别 - 分段、类别和系列标签:20 个字符 - 每个系列都必须为每个类别包含一个有限值;非饼图数值可以为负数 每个本机图表还带有用于屏幕阅读器、通知、会话镜像和无法呈现块的客户端的顶级文本表示。发送到其他 OpenClaw 通道的标准演示文稿会接收与文本相同的图表数据,除非它们宣传本机图表支持。如果 Slack 拒绝带有 `invalid_blocks` 的图表,则 OpenClaw 会删除被拒绝的本机数据块,保留所有同级控件,并将完整的图表表示形式作为可见文本发送。 Slack 每条消息最多接受两个 `data_visualization` 块;它的公共参考没有记录每个消息子类型的限制。当演示文稿包含两个以上的有效图表时,OpenClaw 会保持其顺序并在后续消息中继续本机呈现,每条消息中的图表不超过两个。 Slack 的 [开发者发布](https://docs.slack.dev/changelog/2026/06/16/block-kit-data-visualization-block/) 将该区块描述为面向应用的 Block Kit 功能,并未公布任何付费方案限制。Business+/Enterprise 的资格说明适用于 Slackbot 自动生成 AI 图表,这与应用发送一个已经结构化的 Block Kit 图表是不同的。图表是仅限消息的区块,不是 App Home、模态窗口或 Canvas 内容。 ## 原生表格 Slack 当前的 [`data_table` Block Kit 区块](https://docs.slack.dev/reference/block-kit/blocks/data-table-block/) 可在消息中渲染结构化的行和列。OpenClaw 会将显式的、可移植的 `presentation` `table` 块映射为 `data_table`;它不使用 Slack 旧版的 [`table` 区块](https://docs.slack.dev/reference/block-kit/blocks/table-block/)。 除了正常的 `chat:write` 消息访问权限之外,不需要额外的 OAuth 作用域或 Slack 配置。 ```json { "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`单元格,而格式错误的自定义块可能会降级为其标题或一般块套件后备。便携式代理,CLI,并且插件输出应该使用`presentation`。 Slack 客户端还可以将粘贴的电子表格内容作为旧版 `table` 块发送到消息的顶层 blocks 或 attachments 中。OpenClaw 会将这些传入单元格渲染为对分隔符安全的 TSV,用于实时 agent 输入、线程上下文,以及 Slack `read` 操作。只有原生表格块才会从普通 attachments 中被接纳;link-unfurl 和其他未转发的 attachment 文本仍然被排除在外。 入站消息和表格单元格中的富文本日期保留 Slack 提供的后备文本。当该可选文本不存在或为空白时,OpenClaw 将有效的 Unix 秒时间戳呈现为 ISO UTC 瞬时,例如 `2023-11-14T22:13:20.000Z`。这使得仅日期消息可读,而无需猜测 Slack 查看器的时区或相对日期格式。 ## 插件拥有的模态框提交 注册了交互处理器的 Slack 插件,也可以在 OpenClaw 为 agent 可见的系统事件压缩负载之前,接收模态框的 `view_submission` 和 `view_closed` 生命周期事件。在打开 Slack 模态框时,请使用以下一种路由模式: - 将 `callback_id` 设为 `openclaw::`。 - 或者保留现有的 `callback_id` 并将 `pluginInteractiveData: ":"` 放入模态 `private_metadata` 中。 处理程序接收 `ctx.interaction.kind` 作为 `view_submission` 或 `view_closed`、标准化 `inputs` 以及来自 Slack 的完整原始 `stateValues` 对象。仅回调 ID 路由足以调用插件处理程序;当模态还应产生代理可见的系统事件时,包括现有模态 `private_metadata` user/session 路由字段。代理收到一个紧凑的、经过编辑的 `Slack interaction: ...` 系统事件。如果处理程序返回 `systemEvent.summary`、`systemEvent.reference` 或 `systemEvent.data`,这些字段将包含在该紧凑事件中,以便代理可以引用插件拥有的存储,而无需查看完整的表单负载。 ## Slack 中的原生审批 Slack 可以作为原生审批客户端,通过交互式按钮和交互操作来处理审批,而不是回退到 Web UI 或终端。 - Exec 和插件批准可以呈现为 Slack-native Block Kit 提示。 - `channels.slack.execApprovals.*` 保留本机执行批准客户端启用和 DM/channel 路由配置。 - Exec 批准 DM 使用 `channels.slack.execApprovals.approvers` 或 `commands.ownerAllowFrom`。 - 当 Slack 启用为原始会话的本机批准客户端时、当 `approvals.plugin` 路由到原始 Slack 会话或 Slack 目标时、或者当显式非空 `approvals.plugin.slack` 时,Plugin 批准使用 Slack-native 按钮审阅者列表适用于该请求。 - Plugin 审批 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 本机执行批准需要 `enabled: true` 或 `"auto"` 以及至少一个已解析的执行批准者。保留 `enabled` 未设置或将其设置为 `false` 将禁用本机执行批准交付。当 Slack 插件审批者解析并且请求与其过滤器匹配时,Slack 还可以通过此本机客户端路径处理本机插件审批。禁用 Slack 执行批准不会禁用通过 `approvals.plugin` 启用的本机插件批准交付,它使用 Slack 插件批准者。 `approvals.plugin.slack.approvers` 设置默认的 Slack 插件审阅者列表; `approvals.plugin.slack.plugins` 可以为选定的本机工具插件和单个工具覆盖它。审阅者 ID 可以是所选账户内的原始 `U…`/`W…` ID 或 `team::user:`。显式空列表拒绝针对该范围的 Slack 决策。有关优先级和工具密钥格式,请参阅 [Plugin 权限请求](/plugins/plugin-permission-requests#route-approval-prompts)。 使用命令所有者作为审批者的最小 Slack-native 配置: ```json5 { channels: { slack: { execApprovals: { enabled: "auto" }, }, }, commands: { ownerAllowFrom: ["slack:U12345678"], }, } ``` 要覆盖批准者、添加过滤器或选择原始聊天传送: ```json5 { channels: { slack: { execApprovals: { enabled: true, approvers: ["U12345678"], target: "both", }, }, }, } ``` 共享的 `approvals.exec` 转发是独立的。仅当 exec 审批提示也必须路由到其他聊天或显式的带外目标时才使用它。共享的 `approvals.plugin` 转发也同样独立;只有当 Slack 能够原生处理插件审批请求时,Slack 原生投递才会抑制该回退。 Same-chat `/approve` 也适用于已经支持命令的 Slack 频道和 DM。有关完整批准转发模型,请参阅 [Exec批准](/tools/exec-approvals)。