Chuyển đến nội dung chính

Documentation Index

Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt

Use this file to discover all available pages before exploring further.

Sẵn sàng cho tin nhắn riêng và kênh guild qua Gateway Discord chính thức.

Pairing

Tin nhắn riêng Discord mặc định ở chế độ ghép nối.

Slash commands

Hành vi lệnh gốc và danh mục lệnh.

Channel troubleshooting

Chẩn đoán đa kênh và luồng sửa chữa.

Thiết lập nhanh

Bạn sẽ cần tạo một ứng dụng mới có bot, thêm bot vào máy chủ của bạn và ghép nối bot đó với OpenClaw. Chúng tôi khuyên bạn nên thêm bot vào máy chủ riêng của chính bạn. Nếu chưa có, hãy tạo một máy chủ trước (chọn Create My Own > For me and my friends).
1

Create a Discord application and bot

Truy cập Discord Developer Portal và nhấp New Application. Đặt tên tương tự như “OpenClaw”.Nhấp Bot trên thanh bên. Đặt Username thành bất kỳ tên nào bạn dùng để gọi tác nhân OpenClaw của mình.
2

Enable privileged intents

Vẫn trên trang Bot, cuộn xuống Privileged Gateway Intents và bật:
  • Message Content Intent (bắt buộc)
  • Server Members Intent (khuyến nghị; bắt buộc cho danh sách vai trò được phép và khớp tên với ID)
  • Presence Intent (tùy chọn; chỉ cần cho cập nhật trạng thái hiện diện)
3

Copy your bot token

Cuộn lại lên trên trang Bot và nhấp Reset Token.
Dù tên là vậy, thao tác này tạo token đầu tiên của bạn — không có gì đang được “đặt lại.”
Sao chép token và lưu ở đâu đó. Đây là Bot Token của bạn và bạn sẽ cần nó ngay sau đây.
4

Generate an invite URL and add the bot to your server

Nhấp OAuth2 trên thanh bên. Bạn sẽ tạo một URL mời với các quyền phù hợp để thêm bot vào máy chủ của mình.Cuộn xuống OAuth2 URL Generator và bật:
  • bot
  • applications.commands
Một mục Bot Permissions sẽ xuất hiện bên dưới. Bật tối thiểu:General Permissions
  • Xem kênh Text Permissions
  • Gửi tin nhắn
  • Đọc lịch sử tin nhắn
  • Nhúng liên kết
  • Đính kèm tệp
  • Thêm phản ứng (tùy chọn)
Đây là bộ quyền cơ sở cho các kênh văn bản thông thường. Nếu bạn dự định đăng trong các luồng Discord, bao gồm quy trình kênh diễn đàn hoặc kênh media tạo hoặc tiếp tục một luồng, hãy bật cả Send Messages in Threads. Sao chép URL được tạo ở cuối, dán vào trình duyệt, chọn máy chủ của bạn và nhấp Continue để kết nối. Bây giờ bạn sẽ thấy bot trong máy chủ Discord.
5

Enable Developer Mode and collect your IDs

Quay lại ứng dụng Discord, bạn cần bật Developer Mode để có thể sao chép các ID nội bộ.
  1. Nhấp User Settings (biểu tượng bánh răng cạnh ảnh đại diện của bạn) → Advanced → bật Developer Mode
  2. Nhấp chuột phải vào biểu tượng máy chủ của bạn trong thanh bên → Copy Server ID
  3. Nhấp chuột phải vào ảnh đại diện của chính bạnCopy User ID
Lưu Server IDUser ID cùng với Bot Token của bạn — bạn sẽ gửi cả ba cho OpenClaw ở bước tiếp theo.
6

Allow DMs from server members

Để ghép nối hoạt động, Discord cần cho phép bot nhắn tin riêng cho bạn. Nhấp chuột phải vào biểu tượng máy chủ của bạn → Privacy Settings → bật Direct Messages.Điều này cho phép thành viên máy chủ (bao gồm bot) gửi tin nhắn riêng cho bạn. Hãy giữ bật tùy chọn này nếu bạn muốn dùng tin nhắn riêng Discord với OpenClaw. Nếu bạn chỉ định dùng kênh guild, bạn có thể tắt tin nhắn riêng sau khi ghép nối.
7

Set your bot token securely (do not send it in chat)

Discord bot token của bạn là bí mật (giống mật khẩu). Hãy thiết lập nó trên máy đang chạy OpenClaw trước khi nhắn tin cho tác nhân của bạn.
export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN"
cat > discord.patch.json5 <<'JSON5'
{
  channels: {
    discord: {
      enabled: true,
      token: { source: "env", provider: "default", id: "DISCORD_BOT_TOKEN" },
    },
  },
}
JSON5
openclaw config patch --file ./discord.patch.json5 --dry-run
openclaw config patch --file ./discord.patch.json5
openclaw gateway
Nếu OpenClaw đã chạy dưới dạng dịch vụ nền, hãy khởi động lại qua ứng dụng OpenClaw Mac hoặc bằng cách dừng rồi khởi động lại tiến trình openclaw gateway run. Với các bản cài đặt dịch vụ được quản lý, hãy chạy openclaw gateway install từ shell có DISCORD_BOT_TOKEN, hoặc lưu biến trong ~/.openclaw/.env, để dịch vụ có thể phân giải env SecretRef sau khi khởi động lại.
8

Configure OpenClaw and pair

Trò chuyện với tác nhân OpenClaw của bạn trên bất kỳ kênh hiện có nào (ví dụ Telegram) và nói với nó. Nếu Discord là kênh đầu tiên của bạn, hãy dùng thẻ CLI / config thay thế.
“Tôi đã thiết lập Discord bot token trong cấu hình. Vui lòng hoàn tất thiết lập Discord với User ID <user_id> và Server ID <server_id>.”
9

Approve first DM pairing

Chờ cho đến khi Gateway đang chạy, rồi nhắn tin riêng cho bot của bạn trong Discord. Bot sẽ phản hồi bằng mã ghép nối.
Gửi mã ghép nối cho tác nhân của bạn trên kênh hiện có:
“Phê duyệt mã ghép nối Discord này: <CODE>
Mã ghép nối hết hạn sau 1 giờ.Bây giờ bạn có thể trò chuyện với tác nhân của mình trong Discord qua tin nhắn riêng.
Việc phân giải token có nhận biết tài khoản. Giá trị token trong cấu hình thắng dự phòng env. DISCORD_BOT_TOKEN chỉ được dùng cho tài khoản mặc định. Nếu hai tài khoản Discord đã bật phân giải tới cùng một bot token, OpenClaw chỉ khởi động một bộ giám sát Gateway cho token đó. Token từ cấu hình thắng dự phòng env mặc định; nếu không, tài khoản đã bật đầu tiên thắng và tài khoản trùng lặp được báo cáo là đã tắt. Với các lệnh gọi đi nâng cao (hành động công cụ/kênh nhắn tin), token rõ ràng theo từng lệnh gọi được dùng cho lệnh gọi đó. Điều này áp dụng cho các hành động gửi và đọc/thăm dò (ví dụ read/search/fetch/thread/pins/permissions). Thiết lập chính sách tài khoản/thử lại vẫn đến từ tài khoản được chọn trong ảnh chụp runtime đang hoạt động.

Khuyến nghị: Thiết lập không gian làm việc guild

Khi tin nhắn riêng đã hoạt động, bạn có thể thiết lập máy chủ Discord của mình thành một không gian làm việc đầy đủ, trong đó mỗi kênh có phiên tác nhân riêng với ngữ cảnh riêng. Cách này được khuyến nghị cho máy chủ riêng chỉ có bạn và bot của bạn.
1

Add your server to the guild allowlist

Điều này cho phép tác nhân của bạn phản hồi trong bất kỳ kênh nào trên máy chủ của bạn, không chỉ tin nhắn riêng.
“Thêm Discord Server ID <server_id> của tôi vào danh sách guild được phép”
2

Allow responses without @mention

Theo mặc định, tác nhân của bạn chỉ phản hồi trong kênh guild khi được @nhắc đến. Với máy chủ riêng, có thể bạn muốn tác nhân phản hồi mọi tin nhắn.Trong kênh guild, phản hồi cuối bình thường của trợ lý vẫn ở chế độ riêng tư theo mặc định. Đầu ra Discord hiển thị phải được gửi rõ ràng bằng công cụ message, để tác nhân có thể theo dõi mặc định và chỉ đăng khi quyết định rằng một phản hồi trong kênh là hữu ích.
“Cho phép tác nhân của tôi phản hồi trên máy chủ này mà không cần được @nhắc đến”
3

Plan for memory in guild channels

Theo mặc định, bộ nhớ dài hạn (MEMORY.md) chỉ tải trong các phiên tin nhắn riêng. Kênh guild không tự động tải MEMORY.md.
“Khi tôi đặt câu hỏi trong kênh Discord, hãy dùng memory_search hoặc memory_get nếu bạn cần ngữ cảnh dài hạn từ MEMORY.md.”
Bây giờ hãy tạo một số kênh trên máy chủ Discord của bạn và bắt đầu trò chuyện. Tác nhân của bạn có thể thấy tên kênh, và mỗi kênh có phiên cô lập riêng — vì vậy bạn có thể thiết lập #coding, #home, #research, hoặc bất kỳ thứ gì phù hợp với quy trình làm việc của bạn.

Mô hình runtime

  • Gateway sở hữu kết nối Discord.
  • Định tuyến phản hồi là xác định: phản hồi đến từ Discord sẽ quay lại Discord.
  • Metadata guild/kênh Discord được thêm vào prompt của mô hình như ngữ cảnh không đáng tin cậy, không phải tiền tố phản hồi hiển thị cho người dùng. Nếu mô hình sao chép phong bì đó trở lại, OpenClaw sẽ loại bỏ metadata đã sao chép khỏi phản hồi đi và khỏi ngữ cảnh phát lại trong tương lai.
  • Theo mặc định (session.dmScope=main), trò chuyện trực tiếp dùng chung phiên chính của tác nhân (agent:main:main).
  • Kênh guild là các khóa phiên cô lập (agent:<agentId>:discord:channel:<channelId>).
  • Tin nhắn riêng nhóm bị bỏ qua theo mặc định (channels.discord.dm.groupEnabled=false).
  • Lệnh slash gốc chạy trong các phiên lệnh cô lập (agent:<agentId>:discord:slash:<userId>), đồng thời vẫn mang CommandTargetSessionKey tới phiên hội thoại được định tuyến.
  • Việc gửi thông báo cron/Heartbeat chỉ văn bản tới Discord dùng câu trả lời cuối hiển thị cho trợ lý một lần. Payload media và thành phần có cấu trúc vẫn là nhiều tin nhắn khi tác nhân phát ra nhiều payload có thể gửi.

Kênh diễn đàn

Kênh diễn đàn và media của Discord chỉ chấp nhận bài đăng luồng. OpenClaw hỗ trợ hai cách để tạo chúng:
  • Gửi tin nhắn tới diễn đàn cha (channel:<forumId>) để tự động tạo luồng. Tiêu đề luồng dùng dòng không rỗng đầu tiên của tin nhắn.
  • Dùng openclaw message thread create để tạo luồng trực tiếp. Không truyền --message-id cho kênh diễn đàn.
Ví dụ: gửi tới diễn đàn cha để tạo luồng
openclaw message send --channel discord --target channel:<forumId> \
  --message "Topic title\nBody of the post"
Ví dụ: tạo rõ ràng một luồng diễn đàn
openclaw message thread create --channel discord --target channel:<forumId> \
  --thread-name "Topic title" --message "Body of the post"
Diễn đàn cha không chấp nhận thành phần Discord. Nếu bạn cần thành phần, hãy gửi tới chính luồng đó (channel:<threadId>).

Thành phần tương tác

OpenClaw hỗ trợ các vùng chứa thành phần v2 của Discord cho thông điệp của tác tử. Dùng công cụ thông điệp với payload components. Kết quả tương tác được định tuyến trở lại tác tử như các thông điệp đến bình thường và tuân theo các thiết lập Discord replyToMode hiện có. Khối được hỗ trợ:
  • text, section, separator, actions, media-gallery, file
  • Hàng hành động cho phép tối đa 5 nút hoặc một menu chọn duy nhất
  • Loại chọn: string, user, role, mentionable, channel
Theo mặc định, các thành phần chỉ dùng một lần. Đặt components.reusable=true để cho phép nút, lựa chọn và biểu mẫu được dùng nhiều lần cho đến khi hết hạn. Để giới hạn người có thể nhấp vào nút, đặt allowedUsers trên nút đó (ID người dùng Discord, thẻ, hoặc *). Khi được cấu hình, người dùng không khớp sẽ nhận một thông báo từ chối tạm thời chỉ họ thấy. Các lệnh gạch chéo /model/models mở một bộ chọn mô hình tương tác với danh sách thả xuống nhà cung cấp, mô hình và runtime tương thích, kèm bước Gửi. /models add đã bị phản đối và hiện trả về thông báo phản đối thay vì đăng ký mô hình từ cuộc trò chuyện. Phản hồi của bộ chọn là tạm thời và chỉ người dùng gọi lệnh mới có thể sử dụng. Tệp đính kèm:
  • Khối file phải trỏ đến một tham chiếu tệp đính kèm (attachment://<filename>)
  • Cung cấp tệp đính kèm qua media/path/filePath (một tệp); dùng media-gallery cho nhiều tệp
  • Dùng filename để ghi đè tên tải lên khi tên đó phải khớp với tham chiếu tệp đính kèm
Biểu mẫu modal:
  • Thêm components.modal với tối đa 5 trường
  • Loại trường: text, checkbox, radio, select, role-select, user-select
  • OpenClaw tự động thêm một nút kích hoạt
Ví dụ:
{
  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" },
          ],
        },
      ],
    },
  },
}

Kiểm soát truy cập và định tuyến

channels.discord.dmPolicy kiểm soát quyền truy cập DM. channels.discord.allowFrom là danh sách cho phép DM chính tắc.
  • pairing (mặc định)
  • allowlist
  • open (yêu cầu channels.discord.allowFrom bao gồm "*")
  • disabled
Nếu chính sách DM không mở, người dùng không xác định sẽ bị chặn (hoặc được nhắc ghép nối trong chế độ pairing).Thứ tự ưu tiên nhiều tài khoản:
  • channels.discord.accounts.default.allowFrom chỉ áp dụng cho tài khoản default.
  • Với một tài khoản, allowFrom được ưu tiên hơn dm.allowFrom cũ.
  • Tài khoản có tên kế thừa channels.discord.allowFrom khi allowFrom riêng của chúng và dm.allowFrom cũ chưa được đặt.
  • Tài khoản có tên không kế thừa channels.discord.accounts.default.allowFrom.
channels.discord.dm.policychannels.discord.dm.allowFrom cũ vẫn được đọc để tương thích. openclaw doctor --fix di chuyển chúng sang dmPolicyallowFrom khi có thể làm vậy mà không thay đổi quyền truy cập.Định dạng đích DM để gửi:
  • user:<id>
  • đề cập <@id>
ID số thuần thường phân giải thành ID kênh khi một mặc định kênh đang hoạt động, nhưng các ID được liệt kê trong allowFrom DM hiệu lực của tài khoản được xử lý như đích DM người dùng để tương thích.

Định tuyến tác tử dựa trên vai trò

Dùng bindings[].match.roles để định tuyến thành viên guild Discord đến các tác tử khác nhau theo ID vai trò. Liên kết dựa trên vai trò chỉ chấp nhận ID vai trò và được đánh giá sau liên kết ngang hàng hoặc cha-ngang hàng và trước liên kết chỉ guild. Nếu một liên kết cũng đặt các trường khớp khác (ví dụ peer + guildId + roles), tất cả các trường đã cấu hình phải khớp.
{
  bindings: [
    {
      agentId: "opus",
      match: {
        channel: "discord",
        guildId: "123456789012345678",
        roles: ["111111111111111111"],
      },
    },
    {
      agentId: "sonnet",
      match: {
        channel: "discord",
        guildId: "123456789012345678",
      },
    },
  ],
}

Lệnh native và xác thực lệnh

  • commands.native mặc định là "auto" và được bật cho Discord.
  • Ghi đè theo kênh: channels.discord.commands.native.
  • commands.native=false xóa rõ ràng các lệnh native Discord đã đăng ký trước đó.
  • Xác thực lệnh native dùng cùng danh sách cho phép/chính sách Discord như xử lý thông điệp bình thường.
  • Lệnh vẫn có thể hiển thị trong giao diện Discord cho người dùng không được ủy quyền; việc thực thi vẫn áp dụng xác thực OpenClaw và trả về “không được ủy quyền”.
Xem Lệnh gạch chéo để biết danh mục lệnh và hành vi. Thiết lập lệnh gạch chéo mặc định:
  • ephemeral: true

Chi tiết tính năng

Discord hỗ trợ thẻ trả lời trong đầu ra của tác tử:
  • [[reply_to_current]]
  • [[reply_to:<id>]]
Được kiểm soát bởi channels.discord.replyToMode:
  • off (mặc định)
  • first
  • all
  • batched
Lưu ý: off tắt phân luồng trả lời ngầm định. Các thẻ [[reply_to_*]] rõ ràng vẫn được tôn trọng. first luôn gắn tham chiếu trả lời native ngầm định vào thông điệp Discord gửi đi đầu tiên của lượt. batched chỉ gắn tham chiếu trả lời native ngầm định của Discord khi lượt đến là một lô đã debounce gồm nhiều thông điệp. Điều này hữu ích khi bạn muốn trả lời native chủ yếu cho các cuộc trò chuyện bùng phát mơ hồ, không phải mọi lượt một thông điệp.ID thông điệp được đưa vào ngữ cảnh/lịch sử để tác tử có thể nhắm đến thông điệp cụ thể.
OpenClaw có thể stream bản nháp trả lời bằng cách gửi một thông điệp tạm thời và chỉnh sửa nó khi văn bản đến. channels.discord.streaming nhận off (mặc định) | partial | block | progress. progress ánh xạ sang partial trên Discord; streamMode là bí danh cũ và được tự động di chuyển.Mặc định vẫn là off vì các chỉnh sửa bản xem trước trên Discord nhanh chóng chạm giới hạn tốc độ khi nhiều bot hoặc Gateway dùng chung một tài khoản.
{
  channels: {
    discord: {
      streaming: "block",
      draftChunk: {
        minChars: 200,
        maxChars: 800,
        breakPreference: "paragraph",
      },
    },
  },
}
  • partial chỉnh sửa một thông điệp xem trước duy nhất khi token đến.
  • block phát các đoạn cỡ bản nháp (dùng draftChunk để tinh chỉnh kích thước và điểm ngắt, được kẹp theo textChunkLimit).
  • Kết quả cuối có phương tiện, lỗi và trả lời rõ ràng sẽ hủy các chỉnh sửa xem trước đang chờ.
  • streaming.preview.toolProgress (mặc định true) kiểm soát việc cập nhật công cụ/tiến trình có tái sử dụng thông điệp xem trước hay không.
Stream xem trước chỉ dành cho văn bản; trả lời có phương tiện quay về cách gửi bình thường. Khi stream block được bật rõ ràng, OpenClaw bỏ qua stream xem trước để tránh stream hai lần.
Ngữ cảnh lịch sử guild:
  • channels.discord.historyLimit mặc định 20
  • fallback: messages.groupChat.historyLimit
  • 0 tắt
Điều khiển lịch sử DM:
  • channels.discord.dmHistoryLimit
  • channels.discord.dms["<user_id>"].historyLimit
Hành vi thread:
  • Thread Discord định tuyến như phiên kênh và kế thừa cấu hình kênh cha trừ khi bị ghi đè.
  • Phiên thread kế thừa lựa chọn /model cấp phiên của kênh cha như một fallback chỉ mô hình; lựa chọn /model cục bộ của thread vẫn được ưu tiên và lịch sử bản chép lời của cha không được sao chép trừ khi bật kế thừa bản chép lời.
  • channels.discord.thread.inheritParent (mặc định false) chọn cho các auto-thread mới được gieo dữ liệu từ bản chép lời cha. Ghi đè theo tài khoản nằm dưới channels.discord.accounts.<id>.thread.inheritParent.
  • Phản ứng của công cụ thông điệp có thể phân giải đích DM user:<id>.
  • guilds.<guild>.channels.<channel>.requireMention: false được giữ nguyên trong fallback kích hoạt giai đoạn trả lời.
Chủ đề kênh được chèn dưới dạng ngữ cảnh không đáng tin cậy. Danh sách cho phép kiểm soát ai có thể kích hoạt tác tử, không phải là ranh giới biên tập lại ngữ cảnh bổ sung đầy đủ.
Discord có thể liên kết một thread với đích phiên để các thông điệp tiếp theo trong thread đó tiếp tục định tuyến đến cùng phiên (bao gồm cả phiên tác tử con).Lệnh:
  • /focus <target> liên kết thread hiện tại/mới với đích tác tử con/phiên
  • /unfocus gỡ liên kết thread hiện tại
  • /agents hiển thị các lượt chạy đang hoạt động và trạng thái liên kết
  • /session idle <duration|off> kiểm tra/cập nhật tự động bỏ focus do không hoạt động cho các liên kết đã focus
  • /session max-age <duration|off> kiểm tra/cập nhật tuổi tối đa cứng cho các liên kết đã focus
Cấu hình:
{
  session: {
    threadBindings: {
      enabled: true,
      idleHours: 24,
      maxAgeHours: 0,
    },
  },
  channels: {
    discord: {
      threadBindings: {
        enabled: true,
        idleHours: 24,
        maxAgeHours: 0,
        spawnSubagentSessions: false, // opt-in
      },
    },
  },
}
Ghi chú:
  • session.threadBindings.* đặt các giá trị mặc định toàn cục.
  • channels.discord.threadBindings.* ghi đè hành vi của Discord.
  • spawnSubagentSessions phải là true để tự động tạo/liên kết luồng cho sessions_spawn({ thread: true }).
  • spawnAcpSessions phải là true để tự động tạo/liên kết luồng cho ACP (/acp spawn ... --thread ... hoặc sessions_spawn({ runtime: "acp", thread: true })).
  • Nếu liên kết luồng bị tắt cho một tài khoản, /focus và các thao tác liên kết luồng liên quan sẽ không khả dụng.
Xem Sub-agents, ACP AgentsTham chiếu cấu hình.
Đối với các không gian làm việc ACP “luôn bật” ổn định, hãy cấu hình các liên kết ACP có kiểu ở cấp cao nhất nhắm đến các cuộc trò chuyện Discord.Đường dẫn cấu hình:
  • bindings[] với type: "acp"match.channel: "discord"
Ví dụ:
{
  agents: {
    list: [
      {
        id: "codex",
        runtime: {
          type: "acp",
          acp: {
            agent: "codex",
            backend: "acpx",
            mode: "persistent",
            cwd: "/workspace/openclaw",
          },
        },
      },
    ],
  },
  bindings: [
    {
      type: "acp",
      agentId: "codex",
      match: {
        channel: "discord",
        accountId: "default",
        peer: { kind: "channel", id: "222222222222222222" },
      },
      acp: { label: "codex-main" },
    },
  ],
  channels: {
    discord: {
      guilds: {
        "111111111111111111": {
          channels: {
            "222222222222222222": {
              requireMention: false,
            },
          },
        },
      },
    },
  },
}
Ghi chú:
  • /acp spawn codex --bind here liên kết kênh hoặc luồng hiện tại tại chỗ và giữ các tin nhắn trong tương lai trên cùng phiên ACP. Tin nhắn luồng kế thừa liên kết kênh cha.
  • Trong một kênh hoặc luồng đã liên kết, /new/reset đặt lại cùng phiên ACP tại chỗ. Các liên kết luồng tạm thời có thể ghi đè cách phân giải đích khi đang hoạt động.
  • spawnAcpSessions chỉ bắt buộc khi OpenClaw cần tạo/liên kết một luồng con qua --thread auto|here.
Xem ACP Agents để biết chi tiết về hành vi liên kết.
Chế độ thông báo phản ứng theo từng guild:
  • off
  • own (mặc định)
  • all
  • allowlist (dùng guilds.<id>.users)
Sự kiện phản ứng được chuyển thành sự kiện hệ thống và gắn vào phiên Discord đã được định tuyến.
ackReaction gửi một emoji xác nhận trong khi OpenClaw đang xử lý tin nhắn đến.Thứ tự phân giải:
  • channels.discord.accounts.<accountId>.ackReaction
  • channels.discord.ackReaction
  • messages.ackReaction
  • emoji dự phòng từ danh tính agent (agents.list[].identity.emoji, nếu không có thì ”👀”)
Ghi chú:
  • Discord chấp nhận emoji unicode hoặc tên emoji tùy chỉnh.
  • Dùng "" để tắt phản ứng cho một kênh hoặc tài khoản.
Ghi cấu hình do kênh khởi tạo được bật theo mặc định.Điều này ảnh hưởng đến các luồng /config set|unset (khi tính năng lệnh được bật).Tắt:
{
  channels: {
    discord: {
      configWrites: false,
    },
  },
}
Định tuyến lưu lượng Discord gateway WebSocket và các tra cứu REST khi khởi động (ID ứng dụng + phân giải allowlist) qua proxy HTTP(S) bằng channels.discord.proxy.
{
  channels: {
    discord: {
      proxy: "http://proxy.example:8080",
    },
  },
}
Ghi đè theo tài khoản:
{
  channels: {
    discord: {
      accounts: {
        primary: {
          proxy: "http://proxy.example:8080",
        },
      },
    },
  },
}
Bật phân giải PluralKit để ánh xạ tin nhắn được proxy tới danh tính thành viên hệ thống:
{
  channels: {
    discord: {
      pluralkit: {
        enabled: true,
        token: "pk_live_...", // optional; needed for private systems
      },
    },
  },
}
Ghi chú:
  • allowlist có thể dùng pk:<memberId>
  • tên hiển thị của thành viên chỉ được khớp theo tên/slug khi channels.discord.dangerouslyAllowNameMatching: true
  • tra cứu dùng ID tin nhắn gốc và bị giới hạn theo cửa sổ thời gian
  • nếu tra cứu thất bại, tin nhắn được proxy được coi là tin nhắn bot và bị bỏ qua trừ khi allowBots=true
Cập nhật presence được áp dụng khi bạn đặt trường trạng thái hoặc hoạt động, hoặc khi bạn bật auto presence.Ví dụ chỉ trạng thái:
{
  channels: {
    discord: {
      status: "idle",
    },
  },
}
Ví dụ hoạt động (trạng thái tùy chỉnh là loại hoạt động mặc định):
{
  channels: {
    discord: {
      activity: "Focus time",
      activityType: 4,
    },
  },
}
Ví dụ streaming:
{
  channels: {
    discord: {
      activity: "Live coding",
      activityType: 1,
      activityUrl: "https://twitch.tv/openclaw",
    },
  },
}
Bản đồ loại hoạt động:
  • 0: Đang chơi
  • 1: Đang streaming (yêu cầu activityUrl)
  • 2: Đang nghe
  • 3: Đang xem
  • 4: Tùy chỉnh (dùng văn bản hoạt động làm trạng thái; emoji là tùy chọn)
  • 5: Đang thi đấu
Ví dụ auto presence (tín hiệu sức khỏe runtime):
{
  channels: {
    discord: {
      autoPresence: {
        enabled: true,
        intervalMs: 30000,
        minUpdateIntervalMs: 15000,
        exhaustedText: "token exhausted",
      },
    },
  },
}
Auto presence ánh xạ khả dụng runtime sang trạng thái Discord: khỏe mạnh => trực tuyến, suy giảm hoặc không xác định => rảnh, cạn kiệt hoặc không khả dụng => dnd. Các văn bản ghi đè tùy chọn:
  • autoPresence.healthyText
  • autoPresence.degradedText
  • autoPresence.exhaustedText (hỗ trợ placeholder {reason})
Discord hỗ trợ xử lý phê duyệt bằng nút trong DM và có thể tùy chọn đăng lời nhắc phê duyệt trong kênh khởi nguồn.Đường dẫn cấu hình:
  • channels.discord.execApprovals.enabled
  • channels.discord.execApprovals.approvers (tùy chọn; dùng lại commands.ownerAllowFrom khi có thể)
  • channels.discord.execApprovals.target (dm | channel | both, mặc định: dm)
  • agentFilter, sessionFilter, cleanupAfterResolve
Discord tự động bật phê duyệt exec gốc khi enabled chưa được đặt hoặc là "auto" và có thể phân giải ít nhất một người phê duyệt, từ execApprovals.approvers hoặc từ commands.ownerAllowFrom. Discord không suy luận người phê duyệt exec từ allowFrom của kênh, dm.allowFrom cũ, hoặc defaultTo của tin nhắn trực tiếp. Đặt enabled: false để tắt rõ ràng Discord làm client phê duyệt gốc.Đối với các lệnh nhóm nhạy cảm chỉ dành cho chủ sở hữu như /diagnostics/export-trajectory, OpenClaw gửi lời nhắc phê duyệt và kết quả cuối cùng một cách riêng tư. Trước tiên, OpenClaw thử Discord DM khi chủ sở hữu gọi lệnh có tuyến chủ sở hữu Discord; nếu không khả dụng, OpenClaw dùng tuyến chủ sở hữu khả dụng đầu tiên từ commands.ownerAllowFrom, chẳng hạn Telegram.Khi targetchannel hoặc both, lời nhắc phê duyệt sẽ hiển thị trong kênh. Chỉ những người phê duyệt đã được phân giải mới có thể dùng các nút; người dùng khác nhận thông báo từ chối ephemeral. Lời nhắc phê duyệt bao gồm văn bản lệnh, vì vậy chỉ bật gửi qua kênh trong các kênh đáng tin cậy. Nếu không thể suy ra ID kênh từ khóa phiên, OpenClaw dùng lại cách gửi qua DM.Discord cũng hiển thị các nút phê duyệt dùng chung được các kênh chat khác sử dụng. Adapter Discord gốc chủ yếu bổ sung định tuyến DM cho người phê duyệt và phát tán qua kênh. Khi có các nút đó, chúng là UX phê duyệt chính; OpenClaw chỉ nên bao gồm lệnh /approve thủ công khi kết quả công cụ cho biết phê duyệt qua chat không khả dụng hoặc phê duyệt thủ công là đường duy nhất. Nếu runtime phê duyệt gốc của Discord không hoạt động, OpenClaw giữ lời nhắc /approve <id> <decision> cục bộ xác định hiển thị. Nếu runtime đang hoạt động nhưng không thể gửi thẻ gốc tới bất kỳ đích nào, OpenClaw gửi thông báo dự phòng trong cùng chat với lệnh /approve chính xác từ phê duyệt đang chờ.Xác thực Gateway và phân giải phê duyệt tuân theo hợp đồng client Gateway dùng chung (ID plugin: phân giải qua plugin.approval.resolve; các ID khác qua exec.approval.resolve). Phê duyệt hết hạn sau 30 phút theo mặc định.Xem Phê duyệt exec.

Công cụ và cổng hành động

Các hành động tin nhắn Discord bao gồm nhắn tin, quản trị kênh, kiểm duyệt, presence và hành động metadata. Ví dụ cốt lõi:
  • nhắn tin: sendMessage, readMessages, editMessage, deleteMessage, threadReply
  • phản ứng: react, reactions, emojiList
  • kiểm duyệt: timeout, kick, ban
  • presence: setPresence
Hành động event-create chấp nhận tham số image tùy chọn (URL hoặc đường dẫn tệp cục bộ) để đặt ảnh bìa sự kiện đã lên lịch. Các cổng hành động nằm dưới channels.discord.actions.*. Hành vi cổng mặc định:
Nhóm hành độngMặc định
reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissionsbật
rolestắt
moderationtắt
presencetắt

Giao diện người dùng components v2

OpenClaw dùng Discord components v2 cho phê duyệt exec và dấu mốc xuyên ngữ cảnh. Các hành động tin nhắn Discord cũng có thể chấp nhận components cho giao diện người dùng tùy chỉnh (nâng cao; yêu cầu xây dựng payload component qua công cụ discord), trong khi embeds cũ vẫn khả dụng nhưng không được khuyến nghị.
  • channels.discord.ui.components.accentColor đặt màu nhấn dùng bởi các container component của Discord (hex).
  • Đặt theo từng tài khoản bằng channels.discord.accounts.<id>.ui.components.accentColor.
  • embeds bị bỏ qua khi có components v2.
Ví dụ:
{
  channels: {
    discord: {
      ui: {
        components: {
          accentColor: "#5865F2",
        },
      },
    },
  },
}

Thoại

Discord có hai bề mặt thoại riêng biệt: kênh thoại thời gian thực (cuộc trò chuyện liên tục) và tệp đính kèm tin nhắn thoại (định dạng xem trước dạng sóng). Gateway hỗ trợ cả hai.

Kênh thoại

Danh sách kiểm tra thiết lập:
  1. Bật Message Content Intent trong Discord Developer Portal.
  2. Bật Server Members Intent khi dùng danh sách cho phép theo vai trò/người dùng.
  3. Mời bot với phạm vi botapplications.commands.
  4. Cấp quyền Connect, Speak, Send Messages và Read Message History trong kênh thoại đích.
  5. Bật lệnh gốc (commands.native hoặc channels.discord.commands.native).
  6. Cấu hình channels.discord.voice.
Dùng /vc join|leave|status để điều khiển phiên. Lệnh này dùng tác nhân mặc định của tài khoản và tuân theo cùng các quy tắc danh sách cho phép và chính sách nhóm như các lệnh Discord khác.
/vc join channel:<voice-channel-id>
/vc status
/vc leave
Ví dụ tự động tham gia:
{
  channels: {
    discord: {
      voice: {
        enabled: true,
        model: "openai/gpt-5.4-mini",
        autoJoin: [
          {
            guildId: "123456789012345678",
            channelId: "234567890123456789",
          },
        ],
        daveEncryption: true,
        decryptionFailureTolerance: 24,
        tts: {
          provider: "openai",
          openai: { voice: "onyx" },
        },
      },
    },
  },
}
Ghi chú:
  • voice.tts chỉ ghi đè messages.tts cho phát lại thoại.
  • voice.model chỉ ghi đè LLM dùng cho phản hồi kênh thoại Discord. Để trống để kế thừa mô hình tác nhân được định tuyến.
  • STT dùng tools.media.audio; voice.model không ảnh hưởng đến phiên âm.
  • Các lượt bản ghi thoại suy ra trạng thái chủ sở hữu từ Discord allowFrom (hoặc dm.allowFrom); người nói không phải chủ sở hữu không thể truy cập công cụ chỉ dành cho chủ sở hữu (ví dụ gatewaycron).
  • Thoại được bật theo mặc định; đặt channels.discord.voice.enabled=false để tắt runtime thoại và intent Gateway GuildVoiceStates.
  • channels.discord.intents.voiceStates có thể ghi đè rõ ràng đăng ký intent trạng thái thoại. Để trống để intent đi theo voice.enabled.
  • voice.daveEncryptionvoice.decryptionFailureTolerance được chuyển tiếp vào tùy chọn tham gia của @discordjs/voice.
  • Mặc định của @discordjs/voicedaveEncryption=truedecryptionFailureTolerance=24 nếu chưa đặt.
  • OpenClaw cũng theo dõi lỗi giải mã nhận và tự khôi phục bằng cách rời/tham gia lại kênh thoại sau các lỗi lặp lại trong một khoảng thời gian ngắn.
  • Nếu nhật ký nhận liên tục hiển thị DecryptionFailed(UnencryptedWhenPassthroughDisabled) sau khi cập nhật, hãy thu thập báo cáo phụ thuộc và nhật ký. Dòng @discordjs/voice đi kèm có bản sửa lỗi padding thượng nguồn từ discord.js PR #11449, vốn đã đóng issue discord.js #11419.
Quy trình kênh thoại:
  • Ghi PCM của Discord được chuyển đổi thành tệp WAV tạm.
  • tools.media.audio xử lý STT, ví dụ openai/gpt-4o-mini-transcribe.
  • Bản phiên âm được gửi qua luồng nhận và định tuyến Discord thông thường.
  • voice.model, khi được đặt, chỉ ghi đè LLM phản hồi cho lượt kênh thoại này.
  • voice.tts được hợp nhất đè lên messages.tts; âm thanh kết quả được phát trong kênh đã tham gia.
Thông tin xác thực được phân giải theo từng thành phần: xác thực tuyến LLM cho voice.model, xác thực STT cho tools.media.audio, và xác thực TTS cho messages.tts/voice.tts.

Tin nhắn thoại

Tin nhắn thoại Discord hiển thị bản xem trước dạng sóng và yêu cầu âm thanh OGG/Opus. OpenClaw tự động tạo dạng sóng, nhưng cần ffmpegffprobe trên máy chủ Gateway để kiểm tra và chuyển đổi.
  • Cung cấp đường dẫn tệp cục bộ (URL bị từ chối).
  • Bỏ qua nội dung văn bản (Discord từ chối văn bản + tin nhắn thoại trong cùng một payload).
  • Chấp nhận mọi định dạng âm thanh; OpenClaw chuyển đổi sang OGG/Opus khi cần.
message(action="send", channel="discord", target="channel:123", path="/path/to/audio.mp3", asVoice=true)

Khắc phục sự cố

  • bật Message Content Intent
  • bật Server Members Intent khi bạn phụ thuộc vào phân giải người dùng/thành viên
  • khởi động lại gateway sau khi thay đổi intent
  • xác minh groupPolicy
  • xác minh danh sách cho phép guild trong channels.discord.guilds
  • nếu bản đồ channels của guild tồn tại, chỉ các kênh được liệt kê mới được phép
  • xác minh hành vi requireMention và mẫu mention
Kiểm tra hữu ích:
openclaw doctor
openclaw channels status --probe
openclaw logs --follow
Nguyên nhân thường gặp:
  • groupPolicy="allowlist" mà không có danh sách cho phép guild/kênh khớp
  • requireMention được cấu hình sai chỗ (phải nằm dưới channels.discord.guilds hoặc mục kênh)
  • người gửi bị chặn bởi danh sách cho phép users của guild/kênh
Nhật ký điển hình:
  • Slow listener detected ...
  • stuck session: sessionKey=agent:...:discord:... state=processing ...
Núm điều chỉnh hàng đợi Gateway Discord:
  • một tài khoản: channels.discord.eventQueue.listenerTimeout
  • nhiều tài khoản: channels.discord.accounts.<accountId>.eventQueue.listenerTimeout
  • mục này chỉ kiểm soát công việc listener Gateway Discord, không phải thời lượng lượt của tác nhân
Discord không áp dụng timeout do kênh sở hữu cho các lượt tác nhân đã xếp hàng. Listener tin nhắn bàn giao ngay lập tức, và các lần chạy Discord đã xếp hàng giữ nguyên thứ tự theo phiên cho đến khi vòng đời phiên/công cụ/runtime hoàn tất hoặc hủy công việc.
{
  channels: {
    discord: {
      accounts: {
        default: {
          eventQueue: {
            listenerTimeout: 120000,
          },
        },
      },
    },
  },
}
OpenClaw lấy metadata /gateway/bot của Discord trước khi kết nối. Lỗi tạm thời sẽ quay về URL Gateway mặc định của Discord và được giới hạn tần suất trong nhật ký.Núm điều chỉnh timeout metadata:
  • một tài khoản: channels.discord.gatewayInfoTimeoutMs
  • nhiều tài khoản: channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs
  • fallback env khi cấu hình chưa đặt: OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS
  • mặc định: 30000 (30 giây), tối đa: 120000
Kiểm tra quyền channels status --probe chỉ hoạt động với ID kênh dạng số.Nếu bạn dùng khóa slug, khớp runtime vẫn có thể hoạt động, nhưng probe không thể xác minh đầy đủ quyền.
  • DM bị tắt: channels.discord.dm.enabled=false
  • chính sách DM bị tắt: channels.discord.dmPolicy="disabled" (cũ: channels.discord.dm.policy)
  • đang chờ phê duyệt ghép đôi trong chế độ pairing
Theo mặc định, tin nhắn do bot tạo bị bỏ qua.Nếu bạn đặt channels.discord.allowBots=true, hãy dùng quy tắc mention và danh sách cho phép nghiêm ngặt để tránh hành vi lặp. Ưu tiên channels.discord.allowBots="mentions" để chỉ chấp nhận tin nhắn bot có mention bot.
  • giữ OpenClaw luôn mới (openclaw update) để có logic khôi phục nhận thoại Discord
  • xác nhận channels.discord.voice.daveEncryption=true (mặc định)
  • bắt đầu từ channels.discord.voice.decryptionFailureTolerance=24 (mặc định thượng nguồn) và chỉ tinh chỉnh khi cần
  • theo dõi nhật ký cho:
    • discord voice: DAVE decrypt failures detected
    • discord voice: repeated decrypt failures; attempting rejoin
  • nếu lỗi tiếp diễn sau khi tự động tham gia lại, hãy thu thập nhật ký và so sánh với lịch sử nhận DAVE thượng nguồn trong discord.js #11419discord.js #11449

Tham chiếu cấu hình

Tham chiếu chính: Tham chiếu cấu hình - Discord.
  • khởi động/xác thực: enabled, token, accounts.*, allowBots
  • chính sách: groupPolicy, dm.*, guilds.*, guilds.*.channels.*
  • lệnh: commands.native, commands.useAccessGroups, configWrites, slashCommand.*
  • hàng đợi sự kiện: eventQueue.listenerTimeout (ngân sách listener), eventQueue.maxQueueSize, eventQueue.maxConcurrency
  • metadata Gateway: gatewayInfoTimeoutMs
  • phản hồi/lịch sử: replyToMode, historyLimit, dmHistoryLimit, dms.*.historyLimit
  • gửi: textChunkLimit, chunkMode, maxLinesPerMessage
  • streaming: streaming (bí danh cũ: streamMode), streaming.preview.toolProgress, draftChunk, blockStreaming, blockStreamingCoalesce
  • media/thử lại: mediaMaxMb (giới hạn tải lên Discord đi ra, mặc định 100MB), retry
  • hành động: actions.*
  • hiện diện: activity, status, activityType, activityUrl
  • UI: ui.components.accentColor
  • tính năng: threadBindings, cấp cao nhất bindings[] (type: "acp"), pluralkit, execApprovals, intents, agentComponents, heartbeat, responsePrefix

An toàn và vận hành

  • Xem token bot là bí mật (ưu tiên DISCORD_BOT_TOKEN trong môi trường được giám sát).
  • Cấp quyền Discord theo đặc quyền tối thiểu.
  • Nếu triển khai/trạng thái lệnh đã cũ, hãy khởi động lại gateway và kiểm tra lại bằng openclaw channels status --probe.

Liên quan

Ghép đôi

Ghép đôi người dùng Discord với gateway.

Nhóm

Hành vi trò chuyện nhóm và danh sách cho phép.

Định tuyến kênh

Định tuyến tin nhắn đến vào tác nhân.

Bảo mật

Mô hình đe dọa và gia cố.

Định tuyến đa tác nhân

Ánh xạ guild và kênh tới tác nhân.

Lệnh slash

Hành vi lệnh gốc.