Discord: add component v2 UI tool support (#17419)
This commit is contained in:
@@ -87,6 +87,77 @@ Token resolution is account-aware. Config token values win over env fallback. `D
|
||||
- Group DMs are ignored by default (`channels.discord.dm.groupEnabled=false`).
|
||||
- Native slash commands run in isolated command sessions (`agent:<agentId>:discord:slash:<userId>`), while still carrying `CommandTargetSessionKey` to the routed conversation session.
|
||||
|
||||
## Interactive components
|
||||
|
||||
OpenClaw supports Discord components v2 containers for agent messages. Use the message tool with a `components` payload. Interaction results are routed back to the agent as normal inbound messages and follow the existing Discord `replyToMode` settings.
|
||||
|
||||
Supported blocks:
|
||||
|
||||
- `text`, `section`, `separator`, `actions`, `media-gallery`, `file`
|
||||
- Action rows allow up to 5 buttons or a single select menu
|
||||
- Select types: `string`, `user`, `role`, `mentionable`, `channel`
|
||||
|
||||
File attachments:
|
||||
|
||||
- `file` blocks must point to an attachment reference (`attachment://<filename>`)
|
||||
- Provide the attachment via `media`/`path`/`filePath` (single file); use `media-gallery` for multiple files
|
||||
- Use `filename` to override the upload name when it should match the attachment reference
|
||||
|
||||
Modal forms:
|
||||
|
||||
- Add `components.modal` with up to 5 fields
|
||||
- Field types: `text`, `checkbox`, `radio`, `select`, `role-select`, `user-select`
|
||||
- OpenClaw adds a trigger button automatically
|
||||
|
||||
Example:
|
||||
|
||||
```json5
|
||||
{
|
||||
channel: "discord",
|
||||
action: "send",
|
||||
to: "channel:123456789012345678",
|
||||
message: "Optional fallback text",
|
||||
components: {
|
||||
text: "Choose a path",
|
||||
blocks: [
|
||||
{
|
||||
type: "actions",
|
||||
buttons: [
|
||||
{ label: "Approve", style: "success" },
|
||||
{ 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" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
## Access control and routing
|
||||
|
||||
<Tabs>
|
||||
|
||||
Reference in New Issue
Block a user