组件与审批
丰富的 Discord 消息界面:components v2 容器、交互处理与审批提示。
交互式组件¶
OpenClaw 支持在代理消息中使用 Discord components v2 容器。使用 message 工具并携带 components 负载。交互结果会作为普通入站消息路由回代理,并遵循现有的 Discord replyToMode 设置。
components 是共享 message 工具的 Discord 专用扩展。只要配置了 Discord,OpenClaw 就会暴露它,包括当前为其他渠道时。当同一条富消息需要在多个渠道中工作时,请使用 presentation;OpenClaw 会将可移植的 presentation 操作适配到每个目标。
支持的块:
text、section、separator、actions、media-gallery、file- 操作行最多允许 5 个按钮或一个选择菜单
- 按钮支持表情符号,包括链接按钮
- 选择类型:
string、user、role、mentionable、channel
默认情况下,组件为一次性使用。设置 components.reusable=true 可允许按钮、选择菜单和表单在过期前多次使用。
组件发送、编辑和原生命令回复会等待回调注册完成。消费一次性选择项会先完成移除其同级回调,之后其他交互才能解析它们。如果持久化不可用,OpenClaw 会报告失败,并为当前进程保留内存回退。
要限制谁可以点击按钮,请在该按钮上设置 allowedUsers(Discord 用户 ID、标签或 *)。未匹配的用户会收到临时拒绝消息。
组件回调默认在 30 分钟后过期。设置 channels.discord.agentComponents.ttlMs 可更改默认账户的回调注册表生命周期,或按账户设置 channels.discord.accounts.<accountId>.agentComponents.ttlMs。该值为毫秒,必须是正整数,并且上限为 86400000(24 小时)。更长的 TTL 适用于需要按钮保持可用的审核/审批工作流,但会延长旧 Discord 消息仍可触发操作的窗口。请优先选择满足需求的最短 TTL,并在过期回调会造成意外时保留默认值。
/model 和 /models 斜杠命令会打开交互式模型选择器,包含提供商、模型和兼容运行时下拉菜单,以及一个提交步骤。/models add 已弃用,并返回弃用消息,而不是从聊天中注册模型。选择器回复为临时消息,且仅调用用户可用。Discord 选择菜单最多支持 25 个选项,因此如果你希望选择器仅显示所选提供商(如 openai 或 vllm)动态发现的模型,请将 provider/* 条目添加到 agents.defaults.modelPolicy.allow。
文件附件:
file块必须指向附件引用(attachment://<filename>)- 通过
media/path/filePath提供附件(单个文件);多个文件请使用media-gallery - 当上传名称需要与附件引用匹配时,使用
filename覆盖上传名称 - 附件说明会保留文本块顺序和重复段落
模态表单:
- 添加
components.modal,最多包含 5 个字段 - 字段类型:
text、checkbox、radio、select、role-select、user-select - OpenClaw 会自动添加一个触发按钮
示例:
{
channel: "discord",
action: "send",
to: "channel:123456789012345678",
message: "Optional fallback text",
components: {
reusable: true,
text: "Choose a path",
blocks: [
{
type: "actions",
buttons: [
{
label: "Approve",
style: "success",
allowedUsers: ["123456789012345678"],
},
{ label: "Decline", style: "danger" },
],
},
{
type: "actions",
select: {
type: "string",
placeholder: "Pick an option",
options: [
{ label: "Option A", value: "a" },
{ label: "Option B", value: "b" },
],
},
},
],
modal: {
title: "Details",
triggerLabel: "Open form",
fields: [
{ type: "text", label: "Requester" },
{
type: "select",
label: "Priority",
options: [
{ label: "Low", value: "low" },
{ label: "High", value: "high" },
],
},
],
},
},
}
Components v2 界面¶
OpenClaw 使用 Discord components v2 处理 exec 审批和跨上下文标记。Discord 消息操作也可以接受 components 用于自定义 UI(高级;需要通过 discord 工具构造组件负载),而旧版 embeds 仍然可用但不推荐。
channels.discord.agentComponents.ttlMs控制已发送的 Discord 组件回调保持注册的时间(默认1800000,最大86400000)。按账户:channels.discord.accounts.<id>.agentComponents.ttlMs。- 当存在 components v2 时,
embeds会被忽略。 - 默认情况下会抑制纯 URL 预览。当单个出站链接应展开时,请在消息操作上设置
suppressEmbeds: false。
审批¶
Discord 中的审批
Discord 支持在私信中基于按钮的审批处理,并可选择在源渠道中发布审批提示。
配置路径:
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(可选;在可能时回退到commands.ownerAllowFrom)channels.discord.execApprovals.target(dm|channel|both,默认:dm)agentFilter、sessionFilter、cleanupAfterResolve
Discord 原生 exec 审批要求 enabled: true 或 enabled: "auto",并且至少有一个已解析的审批人,来自 execApprovals.approvers 或 commands.ownerAllowFrom。不设置 enabled 或将其设置为 false 会禁用原生 exec 审批投递。Discord 不会从渠道 allowFrom、旧版 dm.allowFrom 或私信 defaultTo 推断 exec 审批人。
对于仅限所有者的敏感群组命令,例如 /diagnostics 和 /export-trajectory,OpenClaw 会私密发送审批提示和最终结果。当调用该命令的所有者具有 Discord 所有者路由时,它会优先尝试 Discord DM;否则,它会回退到 commands.ownerAllowFrom 中第一个可用的所有者路由,例如 Telegram。
当 target 为 channel 或 both 时,审批提示会在频道中可见。只有已解析的审批人可以使用按钮;其他用户会收到临时拒绝。审批提示包含命令文本,因此仅在受信任的频道中启用频道投递。如果无法从会话密钥派生频道 ID,OpenClaw 会回退到 DM 投递。
Discord 会渲染其他聊天频道使用的共享审批按钮;原生 Discord 适配器主要添加审批人 DM 路由和频道扇出。当这些按钮存在时,它们是主要的审批用户体验;只有当工具结果表示聊天审批不可用或手动审批是唯一路径时,OpenClaw 才应包含手动 /approve 命令。如果 Discord 原生审批运行时未激活,OpenClaw 会保持本地确定性 /approve <id> <decision> 提示可见。如果运行时已激活但原生卡片无法投递到任何目标,OpenClaw 会发送一条同聊天回退通知,其中包含待处理审批中确切的 /approve 命令。
Gateway 身份验证和审批解析遵循共享 Gateway 客户端契约(plugin: ID 通过 plugin.approval.resolve 解析;其他 ID 通过 exec.approval.resolve 解析)。审批默认在 30 分钟后过期。
参见 执行审批。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw