Discord (Bot API)¶
สถานะ: พร้อมใช้งานสำหรับDMและช่องข้อความของกิลด์ผ่านเกตเวย์บอตDiscordอย่างเป็นทางการ
Quick setup (beginner)¶
- สร้างบอตDiscordและคัดลอกโทเคนบอต
- ในการตั้งค่าแอปDiscord ให้เปิดใช้งาน Message Content Intent (และ Server Members Intent หากคุณวางแผนจะใช้รายการอนุญาตหรือการค้นหาชื่อ)
- ตั้งค่าโทเคนให้กับOpenClaw:
- Env:
DISCORD_BOT_TOKEN=...- หรือคอนฟิก:channels.discord.token: "...". - หากตั้งค่าทั้งสองอย่าง คอนฟิกจะมีลำดับความสำคัญสูงกว่า (env fallback ใช้ได้เฉพาะบัญชีค่าเริ่มต้น) - เชิญบอตเข้ามาในเซิร์ฟเวอร์ของคุณพร้อมสิทธิ์การส่งข้อความ (สร้างเซิร์ฟเวอร์ส่วนตัวหากต้องการใช้เฉพาะDM)
- เริ่มต้น Gateway
- การเข้าถึงDMเป็นแบบการจับคู่โดยค่าเริ่มต้น; อนุมัติรหัสการจับคู่ในการติดต่อครั้งแรก
คอนฟิกขั้นต่ำ:
{
channels: {
discord: {
enabled: true,
token: "YOUR_BOT_TOKEN",
},
},
}
Goals¶
- สนทนากับOpenClawผ่านDMของDiscordหรือช่องกิลด์
- แชตแบบตรงจะถูกรวมเข้าเป็นเซสชันหลักของเอเจนต์ (ค่าเริ่มต้น
agent:main:main); ช่องกิลด์จะถูกแยกเป็นagent:<agentId>:discord:channel:<channelId>(ชื่อที่แสดงใช้discord:<guildSlug>#<channelSlug>) - Group DMจะถูกละเว้นโดยค่าเริ่มต้น; เปิดใช้งานด้วย
channels.discord.dm.groupEnabledและอาจจำกัดด้วยchannels.discord.dm.groupChannels - คงการกำหนดเส้นทางให้เป็นแบบกำหนดแน่นอน: การตอบกลับจะส่งกลับไปยังช่องทางที่รับข้อความมาเสมอ
How it works¶
- สร้างแอปพลิเคชันDiscord → Bot เปิดใช้งานintentที่ต้องการ (DMs + ข้อความกิลด์ + เนื้อหาข้อความ) และรับโทเคนบอต
- เชิญบอตเข้ามาในเซิร์ฟเวอร์ของคุณพร้อมสิทธิ์ที่จำเป็นในการอ่าน/ส่งข้อความในตำแหน่งที่คุณต้องการใช้งาน
- กำหนดค่าOpenClawด้วย
channels.discord.token(หรือDISCORD_BOT_TOKENเป็นตัวสำรอง) - รันGateway; ระบบจะเริ่มช่องDiscordอัตโนมัติเมื่อมีโทเคน (คอนฟิกมาก่อน, envเป็นตัวสำรอง) และ
channels.discord.enabledไม่เป็นfalse. - หากต้องการใช้env vars ให้ตั้งค่าDISCORD_BOT_TOKEN(บล็อกคอนฟิกเป็นตัวเลือก) - แชตตรง: ใช้
user:<id>(หรือการกล่าวถึง<@id>) เมื่อส่งมอบ; ทุกเทิร์นจะอยู่ในเซสชันที่ใช้ร่วมกันmain. IDตัวเลขล้วนมีความกำกวมและจะถูกปฏิเสธ -
- ช่องทางของกิลด์: ใช้
channel:<channelId>สำหรับการส่ง ช่องกิลด์: ใช้channel:<channelId>สำหรับการส่งมอบ ต้องมีการกล่าวถึงโดยค่าเริ่มต้น และสามารถตั้งค่าเป็นรายกิลด์หรือรายช่องได้
- ช่องทางของกิลด์: ใช้
- แชตตรง: ปลอดภัยโดยค่าเริ่มต้นผ่าน
channels.discord.dm.policy(ค่าเริ่มต้น:"pairing"). ผู้ส่งที่ไม่รู้จักจะได้รับรหัสการจับคู่ (หมดอายุหลัง 1 ชั่วโมง); อนุมัติผ่านopenclaw pairing approve discord <code>. - หากต้องการคงพฤติกรรมแบบ “เปิดให้ใครก็ได้” เดิม: ตั้งค่าchannels.discord.dm.policy="open"และchannels.discord.dm.allowFrom=["*"]. - หากต้องการรายการอนุญาตแบบเข้มงวด: ตั้งค่าchannels.discord.dm.policy="allowlist"และระบุผู้ส่งในchannels.discord.dm.allowFrom. - หากต้องการละเว้นDMทั้งหมด: ตั้งค่าchannels.discord.dm.enabled=falseหรือchannels.discord.dm.policy="disabled". - Group DMจะถูกละเว้นโดยค่าเริ่มต้น; เปิดใช้งานด้วย
channels.discord.dm.groupEnabledและอาจจำกัดด้วยchannels.discord.dm.groupChannels. - กฎกิลด์เสริม: ตั้งค่า
channels.discord.guildsโดยคีย์เป็นguild id (แนะนำ) หรือslug พร้อมกฎรายช่อง - คำสั่งเนทีฟเสริม:
commands.nativeค่าเริ่มต้นเป็น"auto"(เปิดสำหรับDiscord/Telegram, ปิดสำหรับSlack). แทนที่ด้วยchannels.discord.commands.native: true|false|"auto";falseจะล้างคำสั่งที่ลงทะเบียนไว้ก่อนหน้า คำสั่งข้อความถูกควบคุมด้วยcommands.textและต้องส่งเป็นข้อความ/...แบบเดี่ยว ใช้commands.useAccessGroups: falseเพื่อข้ามการตรวจกลุ่มการเข้าถึงสำหรับคำสั่ง 40. คำสั่งแบบข้อความถูกควบคุมโดยcommands.textและต้องส่งเป็นข้อความ/...แบบเดี่ยว 41. ใช้commands.useAccessGroups: falseเพื่อข้ามการตรวจสอบ access-group สำหรับคำสั่ง- รายการคำสั่งทั้งหมด + คอนฟิก: Slash commands
- ประวัติบริบทกิลด์เสริม: ตั้งค่า
channels.discord.historyLimit(ค่าเริ่มต้น 20, ถอยกลับไปที่messages.groupChat.historyLimit) เพื่อรวมข้อความกิลด์ล่าสุด N รายการเป็นบริบทเมื่อตอบการกล่าวถึง ตั้งค่า0เพื่อปิดใช้งาน 42. ตั้งค่า0เพื่อปิดใช้งาน - รีแอคชัน: เอเจนต์สามารถทริกเกอร์รีแอคชันผ่านเครื่องมือ
discord(ควบคุมด้วยchannels.discord.actions.*)- ความหมายการลบรีแอคชัน: ดูที่ /tools/reactions.
- เครื่องมือ
discordจะถูกเปิดเผยเฉพาะเมื่อช่องปัจจุบันเป็นDiscord
- คำสั่งเนทีฟใช้คีย์เซสชันแบบแยก (
agent:<agentId>:discord:slash:<userId>) แทนเซสชันที่ใช้ร่วมกันmain
หมายเหตุ: การแปลงชื่อ → id ใช้การค้นหาสมาชิกกิลด์และต้องใช้Server Members Intent; หากบอตค้นหาสมาชิกไม่ได้ ให้ใช้idหรือการกล่าวถึง <@id>
หมายเหตุ: Slugเป็นตัวพิมพ์เล็กและแทนที่ช่องว่างด้วย -.
43. หมายเหตุ: slug เป็นตัวพิมพ์เล็ก และแทนที่ช่องว่างด้วย - 44. ชื่อช่องทางจะถูกทำเป็น slug โดยไม่รวม # นำหน้า
ชื่อช่องจะถูกทำเป็นslugโดยไม่มี # นำหน้า
หมายเหตุ: บรรทัดบริบทกิลด์ [from:] จะรวม author.tag + id เพื่อให้ง่ายต่อการตอบแบบping-ready
Config writes¶
โดยค่าเริ่มต้น Discord ได้รับอนุญาตให้เขียนอัปเดตคอนฟิกที่ถูกทริกเกอร์โดย /config set|unset (ต้องใช้ commands.config: true)
ปิดใช้งานด้วย:
{
channels: { discord: { configWrites: false } },
}
How to create your own bot¶
นี่คือการตั้งค่า “Discord Developer Portal” สำหรับรันOpenClawในช่องเซิร์ฟเวอร์(guild) เช่น #help.
1. สร้างแอปDiscord + ผู้ใช้บอต¶
- Discord Developer Portal → Applications → New Application
- ในแอปของคุณ:
- Bot → Add Bot
- คัดลอก Bot Token (นี่คือสิ่งที่คุณใส่ใน
DISCORD_BOT_TOKEN)
2) เปิดใช้งานgateway intentsที่OpenClawต้องใช้¶
Discordจะบล็อก “privileged intents” เว้นแต่คุณจะเปิดใช้งานอย่างชัดเจน
ใน Bot → Privileged Gateway Intents ให้เปิดใช้งาน:
- Message Content Intent (จำเป็นสำหรับการอ่านข้อความในกิลด์ส่วนใหญ่; หากไม่เปิด คุณจะเห็น “Used disallowed intents” หรือบอตจะเชื่อมต่อได้แต่ไม่ตอบสนองต่อข้อความ)
- Server Members Intent (แนะนำ; จำเป็นสำหรับการค้นหาสมาชิก/ผู้ใช้บางอย่างและการจับคู่รายการอนุญาตในกิลด์)
- โดยทั่วไปคุณ ไม่ จำเป็นต้องใช้ Presence Intent โดยทั่วไปคุณ ไม่จำเป็น ต้องใช้ Presence Intent การตั้งค่าสถานะของบอตเอง (การกระทำ
setPresence) ใช้gateway OP3 และไม่ต้องใช้intentนี้; จำเป็นเฉพาะเมื่อคุณต้องการรับอัปเดตสถานะของสมาชิกกิลด์คนอื่น
3. สร้างURLเชิญ (OAuth2 URL Generator)¶
ในแอปของคุณ: OAuth2 → URL Generator
Scopes
- ✅
bot - ✅
applications.commands(จำเป็นสำหรับคำสั่งเนทีฟ)
Bot Permissions (ขั้นต่ำ)
- ✅ View Channels
- ✅ Send Messages
- ✅ Read Message History
- ✅ Embed Links
- ✅ Attach Files
- ✅ Add Reactions (ไม่บังคับแต่แนะนำ)
- ✅ Use External Emojis / Stickers (ไม่บังคับ; เฉพาะเมื่อคุณต้องการใช้)
หลีกเลี่ยง Administrator เว้นแต่คุณกำลังดีบักและเชื่อถือบอตอย่างเต็มที่
คัดลอกURLที่สร้างขึ้น เปิดURL เลือกเซิร์ฟเวอร์ของคุณ และติดตั้งบอต
4. รับids (guild/user/channel)¶
Discordใช้idตัวเลขทุกที่; คอนฟิกOpenClawแนะนำให้ใช้id
- Discord (เดสก์ท็อป/เว็บ) → User Settings → Advanced → เปิด Developer Mode
- คลิกขวา:
- ชื่อเซิร์ฟเวอร์ → Copy Server ID (guild id)
- ช่อง (เช่น
#help) → Copy Channel ID - ผู้ใช้ของคุณ → Copy User ID
5) กำหนดค่าOpenClaw¶
Token¶
ตั้งค่าโทเคนบอตผ่านenv var (แนะนำบนเซิร์ฟเวอร์):
DISCORD_BOT_TOKEN=...
หรือผ่านคอนฟิก:
{
channels: {
discord: {
enabled: true,
token: "YOUR_BOT_TOKEN",
},
},
}
รองรับหลายบัญชี: ใช้ channels.discord.accounts พร้อมโทเคนต่อบัญชีและ name (ไม่บังคับ) รองรับหลายบัญชี: ใช้ channels.discord.accounts พร้อมโทเคนต่อบัญชีและ name (ไม่บังคับ) ดู gateway/configuration สำหรับรูปแบบที่ใช้ร่วมกัน
Allowlist + การกำหนดเส้นทางช่อง¶
ตัวอย่าง “เซิร์ฟเวอร์เดียว อนุญาตเฉพาะฉัน อนุญาตเฉพาะ #help”:
{
channels: {
discord: {
enabled: true,
dm: { enabled: false },
guilds: {
YOUR_GUILD_ID: {
users: ["YOUR_USER_ID"],
requireMention: true,
channels: {
help: { allow: true, requireMention: true },
},
},
},
retry: {
attempts: 3,
minDelayMs: 500,
maxDelayMs: 30000,
jitter: 0.1,
},
},
},
}
หมายเหตุ:
requireMention: trueหมายความว่าบอตจะตอบเฉพาะเมื่อถูกกล่าวถึง (แนะนำสำหรับช่องที่ใช้ร่วมกัน)agents.list[].groupChat.mentionPatterns(หรือmessages.groupChat.mentionPatterns) นับเป็นการกล่าวถึงสำหรับข้อความกิลด์ด้วย- การแทนที่หลายเอเจนต์: ตั้งค่ารูปแบบรายเอเจนต์ที่
agents.list[].groupChat.mentionPatterns - หากมี
channelsช่องใดที่ไม่อยู่ในรายการจะถูกปฏิเสธโดยค่าเริ่มต้น - ใช้รายการช่องแบบ
"*"เพื่อใช้ค่าเริ่มต้นกับทุกช่อง; รายการช่องที่ระบุชัดจะทับค่า wildcard - เธรดจะสืบทอดคอนฟิกจากช่องแม่ (รายการอนุญาต,
requireMention, skills, พรอมป์ต์ ฯลฯ) เว้นแต่คุณจะเพิ่มidช่องเธรดโดยตรง 46. เว้นแต่คุณจะเพิ่ม thread channel id อย่างชัดเจน - คำใบ้เจ้าของ: เมื่อรายการอนุญาต
usersระดับกิลด์หรือระดับช่องตรงกับผู้ส่ง OpenClawจะถือว่าผู้ส่งนั้นเป็นเจ้าของในsystem prompt สำหรับเจ้าของแบบส่วนกลางข้ามช่อง ให้ตั้งค่าcommands.ownerAllowFrom47. สำหรับ owner แบบ global ข้ามทุกช่องทาง ให้ตั้งค่าcommands.ownerAllowFrom - ข้อความที่บอตเป็นผู้เขียนจะถูกละเว้นโดยค่าเริ่มต้น; ตั้งค่า
channels.discord.allowBots=trueเพื่ออนุญาต (ข้อความของตนเองยังคงถูกกรอง) - คำเตือน: หากคุณอนุญาตให้ตอบบอตอื่น (
channels.discord.allowBots=true) ให้ป้องกันลูปบอตต่อบอตด้วยรายการอนุญาตrequireMention,channels.discord.guilds.*.channels.<id>.usersและ/หรือเคลียร์การ์ดเรลในAGENTS.mdและSOUL.md
6. ตรวจสอบว่าใช้งานได้¶
- เริ่มGateway
- ในช่องเซิร์ฟเวอร์ของคุณ ส่ง:
@Krill hello(หรือชื่อบอตของคุณ) - หากไม่เกิดอะไรขึ้น: ตรวจสอบ Troubleshooting ด้านล่าง
Troubleshooting¶
- ขั้นแรก: รัน
openclaw doctorและopenclaw channels status --probe(คำเตือนที่ลงมือทำได้ + การตรวจสอบอย่างรวดเร็ว) - “Used disallowed intents”: เปิด Message Content Intent (และมักจะต้อง Server Members Intent) ในDeveloper Portal จากนั้นรีสตาร์ตGateway
- บอตเชื่อมต่อได้แต่ไม่ตอบในช่องกิลด์:
- ขาด Message Content Intent หรือ
- บอตไม่มีสิทธิ์ของช่อง (View/Send/Read History) หรือ
- คอนฟิกกำหนดให้ต้องกล่าวถึงแต่คุณไม่ได้กล่าวถึง หรือ
- รายการอนุญาตกิลด์/ช่องปฏิเสธช่อง/ผู้ใช้
requireMention: falseแต่ยังไม่ตอบ:channels.discord.groupPolicyค่าเริ่มต้นเป็น allowlist; ตั้งค่าเป็น"open"หรือเพิ่มรายการกิลด์ภายใต้channels.discord.guilds(อาจระบุช่องภายใต้channels.discord.guilds.<id>.channelsเพื่อจำกัด)- หากคุณตั้งค่าเฉพาะ
DISCORD_BOT_TOKENและไม่เคยสร้างส่วนchannels.discordระบบรันไทม์จะตั้งค่าเริ่มต้นgroupPolicyเป็นopen. เพิ่มchannels.discord.groupPolicy,channels.defaults.groupPolicy, หรือรายการอนุญาตกิลด์/ช่องเพื่อจำกัด requireMentionต้องอยู่ภายใต้channels.discord.guilds(หรือช่องเฉพาะ)channels.discord.requireMentionที่ระดับบนสุดจะถูกละเว้น 48.channels.discord.requireMentionที่ระดับบนสุดจะถูกละเลย-
- การตรวจสอบสิทธิ์ (
channels status --probe) จะตรวจสอบเฉพาะ channel ID แบบตัวเลขเท่านั้น การตรวจสอบสิทธิ์ (channels status --probe) ตรวจสอบเฉพาะidช่องตัวเลข หากคุณใช้slug/ชื่อเป็นคีย์channels.discord.guilds.*.channelsการตรวจสอบจะยืนยันสิทธิ์ไม่ได้
- การตรวจสอบสิทธิ์ (
- DMไม่ทำงาน:
channels.discord.dm.enabled=false,channels.discord.dm.policy="disabled", หรือคุณยังไม่ได้รับการอนุมัติ (channels.discord.dm.policy="pairing") - การอนุมัติการรันคำสั่งในDiscord: Discordรองรับ UIปุ่ม สำหรับการอนุมัติในDM (Allow once / Always allow / Deny)
/approve <id> ...ใช้สำหรับการส่งต่อการอนุมัติเท่านั้นและจะไม่แก้ไขพรอมป์ต์ปุ่มของDiscord หากคุณเห็น❌ Failed to submit approval: Error: unknown approval idหรือUIไม่แสดง ตรวจสอบ: 50./approve <id> ...ใช้สำหรับการอนุมัติที่ถูกส่งต่อเท่านั้น และจะไม่ resolve ปุ่มยืนยันของ Discord 1. หากคุณเห็น❌ Failed to submit approval: Error: unknown approval idหรือ UI ไม่แสดงขึ้นมา ให้ตรวจสอบ: channels.discord.execApprovals.enabled: trueในคอนฟิกของคุณ- idผู้ใช้Discordของคุณอยู่ใน
channels.discord.execApprovals.approvers(UIจะส่งให้ผู้อนุมัติเท่านั้น) - ใช้ปุ่มในพรอมป์ต์DM (Allow once, Always allow, Deny)
- ดู Exec approvals และ Slash commands สำหรับโฟลว์การอนุมัติและคำสั่งโดยรวม
Capabilities & limits¶
- DMและช่องข้อความกิลด์ (เธรดถือเป็นช่องแยก; ไม่รองรับเสียง)
- ตัวบ่งชี้การพิมพ์ส่งแบบพยายามดีที่สุด; การแบ่งข้อความใช้
channels.discord.textChunkLimit(ค่าเริ่มต้น 2000) และแบ่งคำตอบยาวตามจำนวนบรรทัด (channels.discord.maxLinesPerMessage, ค่าเริ่มต้น 17) - การแบ่งบรรทัดใหม่แบบตัวเลือก: ตั้งค่า
channels.discord.chunkMode="newline"เพื่อแบ่งตามบรรทัดว่าง (ขอบเขตย่อหน้า) ก่อนการแบ่งตามความยาว - รองรับการอัปโหลดไฟล์สูงสุดตาม
channels.discord.mediaMaxMbที่กำหนด (ค่าเริ่มต้น 8 MB) -
- การตอบกลับในกิลด์จะถูกจำกัดด้วยการกล่าวถึง (mention-gated) ตามค่าเริ่มต้น เพื่อหลีกเลี่ยงบ็อตที่ส่งเสียงรบกวน
- แทรกบริบทการตอบเมื่อข้อความอ้างอิงข้อความอื่น (เนื้อหาที่อ้าง + ids)
- การทำเธรดการตอบแบบเนทีฟ ปิดโดยค่าเริ่มต้น; เปิดด้วย
channels.discord.replyToModeและแท็กการตอบ
Retry policy¶
การเรียกDiscord APIขาออกจะรีทรายเมื่อถูกจำกัดอัตรา (429) โดยใช้ retry_after ของDiscordเมื่อมี พร้อมการถอยหลังแบบเอ็กซ์โปเนนเชียลและjitter กำหนดค่าผ่าน channels.discord.retry ดู Retry policy 3. กำหนดค่าผ่าน channels.discord.retry 4. ดู Retry policy
Config¶
{
channels: {
discord: {
enabled: true,
token: "abc.123",
groupPolicy: "allowlist",
guilds: {
"*": {
channels: {
general: { allow: true },
},
},
},
mediaMaxMb: 8,
actions: {
reactions: true,
stickers: true,
emojiUploads: true,
stickerUploads: true,
polls: true,
permissions: true,
messages: true,
threads: true,
pins: true,
search: true,
memberInfo: true,
roleInfo: true,
roles: false,
channelInfo: true,
channels: true,
voiceStatus: true,
events: true,
moderation: false,
presence: false,
},
replyToMode: "off",
dm: {
enabled: true,
policy: "pairing", // pairing | allowlist | open | disabled
allowFrom: ["123456789012345678", "steipete"],
groupEnabled: false,
groupChannels: ["openclaw-dm"],
},
guilds: {
"*": { requireMention: true },
"123456789012345678": {
slug: "friends-of-openclaw",
requireMention: false,
reactionNotifications: "own",
users: ["987654321098765432", "steipete"],
channels: {
general: { allow: true },
help: {
allow: true,
requireMention: true,
users: ["987654321098765432"],
skills: ["search", "docs"],
systemPrompt: "Keep answers short.",
},
},
},
},
},
},
}
รีแอคชันยืนยัน(Ack)ถูกควบคุมทั่วทั้งระบบผ่าน messages.ackReaction +
messages.ackReactionScope. ใช้ messages.removeAckAfterReply เพื่อล้างรีแอคชันยืนยันหลังบอตตอบ
dm.enabled: ตั้งค่าfalseเพื่อเพิกเฉยDMทั้งหมด (ค่าเริ่มต้นtrue)dm.policy: การควบคุมการเข้าถึงDM (pairingแนะนำ)"open"ต้องใช้dm.allowFrom=["*"]5."open"ต้องการdm.allowFrom=["*"]-
dm.allowFrom: รายการอนุญาต DM (user id หรือชื่อผู้ใช้) 7. ใช้โดยdm.policy="allowlist"และสำหรับการตรวจสอบdm.policy="open"8. วิซาร์ดรับชื่อผู้ใช้และแปลงเป็น id เมื่อบ็อตสามารถค้นหาสมาชิกได้
dm.groupEnabled: เปิดใช้งานgroup DM (ค่าเริ่มต้นfalse)dm.groupChannels: รายการอนุญาตเสริมสำหรับidหรือslugของช่องgroup DMgroupPolicy: ควบคุมการจัดการช่องกิลด์ (open|disabled|allowlist)allowlistต้องใช้รายการอนุญาตช่องguilds: กฎรายกิลด์โดยคีย์เป็นguild id (แนะนำ) หรือslugguilds."*": การตั้งค่ารายกิลด์ค่าเริ่มต้นเมื่อไม่มีรายการระบุชัดguilds.<id>.slug: slugที่เป็นมิตรต่อผู้ใช้สำหรับการแสดงผล (ไม่บังคับ)guilds.<id>.users: รายการอนุญาตผู้ใช้รายกิลด์ (idsหรือชื่อ) แบบตัวเลือกguilds.<id>.tools: การแทนที่นโยบายเครื่องมือรายกิลด์แบบตัวเลือก (allow/deny/alsoAllow) ใช้เมื่อไม่มีการแทนที่ระดับช่องguilds.<id>.toolsBySender: การแทนที่นโยบายเครื่องมือรายผู้ส่งระดับกิลด์ (ใช้เมื่อไม่มีการแทนที่ระดับช่อง; รองรับ wildcard"*")guilds.<id>.channels.<channel>.allow: อนุญาต/ปฏิเสธช่องเมื่อgroupPolicy="allowlist"guilds.<id>.channels.<channel>.requireMention: การบังคับกล่าวถึงสำหรับช่องguilds.<id>.channels.<channel>.tools: การแทนที่นโยบายเครื่องมือรายช่องแบบตัวเลือก (allow/deny/alsoAllow)guilds.<id>.channels.<channel>.toolsBySender: การแทนที่นโยบายเครื่องมือรายผู้ส่งภายในช่องแบบตัวเลือก (รองรับ wildcard"*")guilds.<id>.channels.<channel>.users: รายการอนุญาตผู้ใช้รายช่องแบบตัวเลือกguilds.<id>.channels.<channel>.skills: ตัวกรองskill (ละเว้น = ทุกskill, ว่าง = ไม่มี)guilds.<id>.channels.<channel>9..systemPrompt`: system prompt เพิ่มเติมสำหรับช่อง 10. หัวข้อช่องของ Discord จะถูกแทรกเป็นบริบท ที่ไม่น่าเชื่อถือ (ไม่ใช่ system prompt)guilds.<id>.channels.<channel>.enabled: ตั้งค่าfalseเพื่อปิดใช้งานช่องguilds.<id>.channels: กฎช่อง (คีย์เป็นslugหรือidช่อง)guilds.<id>.requireMention: ข้อกำหนดการกล่าวถึงรายกิลด์ (แทนที่ได้รายช่อง)guilds.<id>.reactionNotifications: โหมดอีเวนต์ของระบบรีแอคชัน (off,own,all,allowlist)textChunkLimit: ขนาดการแบ่งข้อความขาออก (อักขระ) ค่าเริ่มต้น: 2000 11. ค่าเริ่มต้น: 2000chunkMode:length(ค่าเริ่มต้น) จะแบ่งเฉพาะเมื่อเกินtextChunkLimit;newlineจะแบ่งตามบรรทัดว่างก่อนการแบ่งตามความยาวmaxLinesPerMessage: จำนวนบรรทัดสูงสุดแบบนุ่มต่อข้อความ ค่าเริ่มต้น: 17 12. ค่าเริ่มต้น: 17mediaMaxMb: จำกัดสื่อขาเข้าที่บันทึกลงดิสก์historyLimit: จำนวนข้อความกิลด์ล่าสุดที่รวมเป็นบริบทเมื่อโต้ตอบการกล่าวถึง (ค่าเริ่มต้น 20; ถอยกลับไปที่messages.groupChat.historyLimit;0ปิดใช้งาน)-
dmHistoryLimit: ขีดจำกัดประวัติ DM ในจำนวนเทิร์นของผู้ใช้dmHistoryLimit: ขีดจำกัดประวัติDMเป็นจำนวนเทิร์นผู้ใช้ การแทนที่รายผู้ใช้:dms["<user_id>"].historyLimit
retry: นโยบายรีทรายสำหรับการเรียกDiscord APIขาออก (attempts, minDelayMs, maxDelayMs, jitter)pluralkit: แก้ไขข้อความที่ถูกพร็อกซีโดยPluralKitให้สมาชิกระบบปรากฏเป็นผู้ส่งที่แตกต่างกันactions: ประตูเครื่องมือต่อการกระทำ; ละเว้นเพื่ออนุญาตทั้งหมด (ตั้งค่าfalseเพื่อปิดใช้งาน)reactions(ครอบคลุม react + read reactions)stickers,emojiUploads,stickerUploads,polls,permissions,messages,threads,pins,searchmemberInfo,roleInfo,channelInfo,voiceStatus,eventschannels(สร้าง/แก้ไข/ลบช่อง + หมวดหมู่ + สิทธิ์)roles(เพิ่ม/ลบบทบาท ค่าเริ่มต้นfalse)moderation(timeout/kick/ban ค่าเริ่มต้นfalse)presence(สถานะ/กิจกรรมบอต ค่าเริ่มต้นfalse)execApprovals: DMการอนุมัติการรันคำสั่งเฉพาะDiscord (UIปุ่ม) รองรับenabled,approvers,agentFilter,sessionFilter14. รองรับenabled,approvers,agentFilter,sessionFilter
การแจ้งเตือนรีแอคชันใช้ guilds.<id>.reactionNotifications:
off: ไม่มีอีเวนต์รีแอคชันown: รีแอคชันบนข้อความของบอตเอง (ค่าเริ่มต้น)all: รีแอคชันทั้งหมดบนทุกข้อความallowlist: รีแอคชันจากguilds.<id>.usersบนทุกข้อความ (รายการว่างจะปิดใช้งาน)
PluralKit (PK) support¶
- เปิดใช้งานการค้นหา PK เพื่อให้ข้อความที่ถูก proxy แก้ไขเป็นระบบ + สมาชิกตัวจริง
เปิดใช้งานการค้นหาPKเพื่อให้ข้อความที่ถูกพร็อกซีถูกแก้ไขไปยังระบบ+สมาชิกที่แท้จริง
เมื่อเปิดใช้งาน OpenClawจะใช้ตัวตนของสมาชิกสำหรับรายการอนุญาตและติดป้ายผู้ส่งเป็น
Member (PK:System)เพื่อหลีกเลี่ยงการping Discordโดยไม่ตั้งใจ
{
channels: {
discord: {
pluralkit: {
enabled: true,
token: "pk_live_...", // optional; required for private systems
},
},
},
}
หมายเหตุรายการอนุญาต (เมื่อเปิดPK):
- ใช้
pk:<memberId>ในdm.allowFrom,guilds.<id>.users, หรือusersระดับช่อง - ชื่อแสดงของสมาชิกจะถูกจับคู่ตามชื่อ/slugด้วย
- การค้นหาใช้ idข้อความDiscordดั้งเดิม (ข้อความก่อนพร็อกซี) ดังนั้น APIของPKจะแก้ไขได้เฉพาะภายในหน้าต่าง 30 นาที
- หากการค้นหาPKล้มเหลว (เช่น ระบบส่วนตัวไม่มีโทเคน) ข้อความที่ถูกพร็อกซีจะถูกมองเป็นข้อความบอตและจะถูกทิ้ง เว้นแต่
channels.discord.allowBots=true
Tool action defaults¶
| Action group | Default | Notes |
|---|---|---|
| reactions | enabled | React + list reactions + emojiList |
| stickers | enabled | ส่งสติกเกอร์ |
| emojiUploads | enabled | 16. อัปโหลดอีโมจิ |
| stickerUploads | enabled | อัปโหลดสติกเกอร์ |
| polls | enabled | สร้างโพล |
| permissions | enabled | สแน็ปช็อตสิทธิ์ช่อง |
| messages | enabled | อ่าน/ส่ง/แก้ไข/ลบ |
| threads | enabled | สร้าง/แสดงรายการ/ตอบกลับ |
| pins | enabled | ปักหมุด/ยกเลิก/แสดงรายการ |
| search | enabled | ค้นหาข้อความ (ฟีเจอร์พรีวิว) |
| memberInfo | enabled | ข้อมูลสมาชิก |
| roleInfo | enabled | รายการบทบาท |
| channelInfo | เปิดใช้งาน | ข้อมูลช่อง + รายการ |
| channels | เปิดใช้งาน | จัดการช่อง/หมวดหมู่ |
| voiceStatus | เปิดใช้งาน | ตรวจสอบสถานะเสียง |
| events | เปิดใช้งาน | แสดงรายการ/สร้างอีเวนต์ที่ตั้งเวลา |
| บทบาท | ปิดใช้งาน | เพิ่ม/ลบบทบาท |
| การกลั่นกรอง | ปิดใช้งาน | Timeout/kick/ban |
| presence | ปิดใช้งาน | สถานะ/กิจกรรมบอต (setPresence) |
replyToMode:off(ค่าเริ่มต้น),first, หรือall. ใช้เฉพาะเมื่อโมเดลมีแท็กการตอบกลับ
Reply tags¶
เพื่อขอการตอบแบบเธรด โมเดลสามารถใส่แท็กหนึ่งรายการในเอาต์พุตได้:
[[reply_to_current]]— ตอบกลับข้อความDiscordที่เป็นตัวกระตุ้น[[reply_to:<id>]]— ตอบกลับข้อความตามidที่ระบุจากบริบท/ประวัติ idข้อความปัจจุบันจะถูกต่อท้ายพรอมป์ต์เป็น[message_id: …]; รายการประวัติมีidอยู่แล้ว 17. id ของข้อความปัจจุบันจะถูกต่อท้ายใน prompt เป็น[message_id: …]; รายการประวัติมี id รวมอยู่แล้ว
พฤติกรรมถูกควบคุมโดย channels.discord.replyToMode:
off: เพิกเฉยแท็กfirst: เฉพาะชิ้นเอาต์พุต/ไฟล์แนบแรกเป็นการตอบกลับall: ทุกชิ้นเอาต์พุต/ไฟล์แนบเป็นการตอบกลับ
หมายเหตุการจับคู่รายการอนุญาต:
allowFrom/users/groupChannelsรับid ชื่อ แท็ก หรือการกล่าวถึงเช่น<@id>- รองรับคำนำหน้าเช่น
discord:/user:(ผู้ใช้) และchannel:(group DM) - ใช้
*เพื่ออนุญาตผู้ส่ง/ช่องใดก็ได้ - เมื่อมี
guilds.<id>.channelsช่องที่ไม่อยู่ในรายการจะถูกปฏิเสธโดยค่าเริ่มต้น - เมื่อไม่ระบุ
guilds.<id>.channelsช่องทั้งหมดในกิลด์ที่อยู่ในรายการอนุญาตจะได้รับอนุญาต - หากต้องการอนุญาต ไม่มีช่องใดเลย ให้ตั้งค่า
channels.discord.groupPolicy: "disabled"(หรือคงรายการอนุญาตว่าง) - ตัวช่วยตั้งค่ารับชื่อ
Guild/Channel(สาธารณะ + ส่วนตัว) และแปลงเป็นIDเมื่อเป็นไปได้ - เมื่อเริ่มต้น OpenClawจะแปลงชื่อช่อง/ผู้ใช้ในรายการอนุญาตเป็นID (เมื่อบอตค้นหาสมาชิกได้) และบันทึกการแม็ป รายการที่แปลงไม่ได้จะคงไว้ตามที่พิมพ์
หมายเหตุคำสั่งเนทีฟ:
- คำสั่งที่ลงทะเบียนสะท้อนคำสั่งแชตของOpenClaw
- คำสั่งเนทีฟเคารพรายการอนุญาตเดียวกับDM/ข้อความกิลด์ (
channels.discord.dm.allowFrom,channels.discord.guilds, กฎรายช่อง) - Slash commands อาจยังมองเห็นได้ในUIของDiscordสำหรับผู้ใช้ที่ไม่ได้อยู่ในรายการอนุญาต; OpenClawจะบังคับใช้รายการอนุญาตเมื่อรันและตอบว่า “not authorized”
Tool actions¶
เอเจนต์สามารถเรียก discord ด้วยการกระทำเช่น:
react/reactions(เพิ่มหรือแสดงรายการรีแอคชัน)sticker,poll,permissionsreadMessages,sendMessage,editMessage,deleteMessage- เพย์โหลดเครื่องมืออ่าน/ค้นหา/ปักหมุดจะรวม
timestampMs(UTC epoch ms) และtimestampUtcที่ถูกทำให้เป็นมาตรฐาน ควบคู่กับtimestampของDiscordแบบดิบ threadCreate,threadList,threadReplypinMessage,unpinMessage,listPinssearchMessages,memberInfo,roleInfo,roleAdd,roleRemove,emojiListchannelInfo,channelList,voiceStatus,eventList,eventCreatetimeout,kick,bansetPresence(กิจกรรมบอตและสถานะออนไลน์)
idข้อความDiscordจะถูกเปิดเผยในบริบทที่แทรก ([discord message id: …] และบรรทัดประวัติ) เพื่อให้เอเจนต์กำหนดเป้าหมายได้
อีโมจิสามารถเป็นยูนิโค้ด (เช่น ✅) หรือไวยากรณ์อีโมจิแบบกำหนดเองเช่น <:party_blob:1234567890>.
18. อีโมจิอาจเป็นยูนิโค้ด (เช่น ✅) หรือไวยากรณ์อีโมจิแบบกำหนดเอง เช่น <:party_blob:1234567890>
Safety & ops¶
- ปฏิบัติต่อโทเคนบอตเหมือนรหัสผ่าน; แนะนำให้ใช้env var
DISCORD_BOT_TOKENบนโฮสต์ที่มีการดูแล หรือจำกัดสิทธิ์ไฟล์คอนฟิก - ให้สิทธิ์บอตเท่าที่จำเป็นเท่านั้น (โดยทั่วไปคือ Read/Send Messages)
- หากบอตค้างหรือถูกจำกัดอัตรา ให้รีสตาร์ตGateway (
openclaw gateway --force) หลังยืนยันว่าไม่มีโปรเซสอื่นครอบครองเซสชันDiscord