跳转至

组件与审批

丰富的 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.enabled
  • channels.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