Discord (API Bot)
Statut : pret pour les Messages prives et les canaux texte de guildes via la passerelle officielle de bot Discord.Demarrage rapide (debutant)
- Creez un bot Discord et copiez le jeton du bot.
- Dans les parametres de l’application Discord, activez Message Content Intent (et Server Members Intent si vous prevoyez d’utiliser des allowlists ou des recherches par nom).
- Definissez le jeton pour OpenClaw :
- Env :
DISCORD_BOT_TOKEN=... - Ou config :
channels.discord.token: "...". - Si les deux sont definis, la config est prioritaire (le repli env est reserve au compte par defaut).
- Env :
- Invitez le bot sur votre serveur avec les permissions de message (creez un serveur prive si vous voulez uniquement des Messages prives).
- Demarrez la Gateway (passerelle).
- L’accès DM est appairage par défaut; approuve le code d’appairage au premier contact.
Objectifs
- Parler a OpenClaw via les Messages prives Discord ou les canaux de guilde.
- Les discussions directes se fondent dans la session principale de l’agent (par defaut
agent:main:main) ; les canaux de guilde restent isoles commeagent:<agentId>:discord:channel:<channelId>(les noms d’affichage utilisentdiscord:<guildSlug>#<channelSlug>). - Les Messages prives de groupe sont ignores par defaut ; activez-les via
channels.discord.dm.groupEnabledet restreignez-les optionnellement avecchannels.discord.dm.groupChannels. - Conserver un routage deterministe : les reponses reviennent toujours au canal d’origine.
Fonctionnement
- Creez une application Discord → Bot, activez les intents necessaires (Messages prives + messages de guilde + contenu des messages), puis recuperez le jeton du bot.
- Invitez le bot sur votre serveur avec les permissions requises pour lire/envoyer des messages la ou vous souhaitez l’utiliser.
- Configurez OpenClaw avec
channels.discord.token(ouDISCORD_BOT_TOKENen repli). - Lancez la Gateway (passerelle) ; elle demarre automatiquement le canal Discord lorsqu’un jeton est disponible (config en priorite, env en repli) et que
channels.discord.enabledn’est pasfalse.- Si vous preferez les variables d’environnement, definissez
DISCORD_BOT_TOKEN(un bloc de config est optionnel).
- Si vous preferez les variables d’environnement, definissez
- Discussions directes : utilisez
user:<id>(ou une mention<@id>) lors de la livraison ; tous les tours arrivent dans la session partageemain. Les ID numeriques seuls sont ambigus et rejetes. - Canaux de guilde : utilisez
channel:<channelId>pour la livraison. Les mentions sont requises par defaut et peuvent etre definies par guilde ou par canal. - Discussions directes : securisees par defaut via
channels.discord.dm.policy(defaut :"pairing"). Les expéditeurs inconnus recoivent un code d’appariement (expire apres 1 heure) ; approuvez viaopenclaw pairing approve discord <code>.- Pour conserver l’ancien comportement « ouvert a tous » : definissez
channels.discord.dm.policy="open"etchannels.discord.dm.allowFrom=["*"]. - Pour une allowlist stricte : definissez
channels.discord.dm.policy="allowlist"et listez les expediteurs danschannels.discord.dm.allowFrom. - Pour ignorer tous les Messages prives : definissez
channels.discord.dm.enabled=falseouchannels.discord.dm.policy="disabled".
- Pour conserver l’ancien comportement « ouvert a tous » : definissez
- Les Messages prives de groupe sont ignores par defaut ; activez-les via
channels.discord.dm.groupEnabledet restreignez-les optionnellement avecchannels.discord.dm.groupChannels. - Regles de guilde optionnelles : definissez
channels.discord.guildsindexe par id de guilde (prefere) ou slug, avec des regles par canal. - Commandes natives optionnelles :
commands.nativevaut par defaut"auto"(active pour Discord/Telegram, desactive pour Slack). Remplacez avecchannels.discord.commands.native: true|false|"auto";falseefface les commandes precedemment enregistrees. Les commandes texte sont controlees parcommands.textet doivent etre envoyees comme messages/...autonomes. Utilisezcommands.useAccessGroups: falsepour contourner les verifications de groupes d’acces pour les commandes.- Liste complete des commandes + config : Slash commands
- Historique de contexte de guilde optionnel : definissez
channels.discord.historyLimit(defaut 20, repli surmessages.groupChat.historyLimit) pour inclure les N derniers messages de guilde comme contexte lors d’une reponse a une mention. Definissez0pour desactiver. - Reactions : l’agent peut declencher des reactions via l’outil
discord(controle parchannels.discord.actions.*).- Semantique de suppression des reactions : voir /tools/reactions.
- L’outil
discordn’est expose que lorsque le canal courant est Discord.
- Les commandes natives utilisent des cles de session isolees (
agent:<agentId>:discord:slash:<userId>) plutot que la session partageemain.
<@id>.
Remarque : les slugs sont en minuscules avec les espaces remplaces par -. Les noms de canaux sont slugifies sans le # initial.
Remarque : les lignes de contexte de guilde [from:] incluent author.tag + id pour faciliter des reponses prêtes au ping.
Ecritures de configuration
Par defaut, Discord est autorise a ecrire des mises a jour de configuration declenchees par/config set|unset (necessite commands.config: true).
Desactivez avec :
Comment creer votre propre bot
Il s’agit de la configuration du « Discord Developer Portal » pour executer OpenClaw dans un canal de serveur (guilde) comme#help.
1. Creer l’application Discord + l’utilisateur bot
- Discord Developer Portal → Applications → New Application
- Dans votre application :
- Bot → Add Bot
- Copiez le Bot Token (c’est ce que vous mettez dans
DISCORD_BOT_TOKEN)
2) Activer les intents de passerelle necessaires a OpenClaw
Discord bloque les « privileged intents » a moins de les activer explicitement. Dans Bot → Privileged Gateway Intents, activez :- Message Content Intent (requis pour lire le texte des messages dans la plupart des guildes ; sans lui vous verrez « Used disallowed intents » ou le bot se connectera sans reagir aux messages)
- Server Members Intent (recommande ; requis pour certaines recherches de membres/utilisateurs et la correspondance des allowlists dans les guildes)
setPresence) utilise l’OP3 de la passerelle et ne requiert pas cet intent ; il n’est necessaire que si vous souhaitez recevoir des mises a jour de presence d’autres membres de guilde.
3. Generer une URL d’invitation (OAuth2 URL Generator)
Dans votre application : OAuth2 → URL Generator Scopes- ✅
bot - ✅
applications.commands(requis pour les commandes natives)
- ✅ View Channels
- ✅ Send Messages
- ✅ Read Message History
- ✅ Embed Links
- ✅ Attach Files
- ✅ Add Reactions (optionnel mais recommande)
- ✅ Use External Emojis / Stickers (optionnel ; seulement si vous les voulez)
4. Recuperer les id (guilde/utilisateur/canal)
Discord utilise des id numeriques partout ; la config OpenClaw prefere les id.- Discord (bureau/web) → User Settings → Advanced → activez Developer Mode
- Clic droit :
- Nom du serveur → Copy Server ID (id de guilde)
#help) → Copy Channel ID- Votre utilisateur → Copy User ID
5) Configurer OpenClaw
Jeton
Definissez le jeton du bot via variable d’environnement (recommande sur les serveurs) :DISCORD_BOT_TOKEN=...
channels.discord.accounts avec des jetons par compte et name optionnel. Voir gateway/configuration pour le modele partage.
Allowlist + routage des canaux
Exemple « un seul serveur, m’autoriser uniquement, autoriser seulement #help » :requireMention: truesignifie que le bot ne repond que lorsqu’il est mentionne (recommande pour les canaux partages).agents.list[].groupChat.mentionPatterns(oumessages.groupChat.mentionPatterns) comptent aussi comme des mentions pour les messages de guilde.- Surcharge multi-agent : definissez des motifs par agent sur
agents.list[].groupChat.mentionPatterns. - Si
channelsest present, tout canal non liste est refuse par defaut. - Utilisez une entree de canal
"*"pour appliquer des valeurs par defaut a tous les canaux ; les entrees explicites de canal remplacent le joker. - Les fils (threads) heritent de la config du canal parent (allowlist,
requireMention, skills, prompts, etc.) sauf si vous ajoutez explicitement l’id du canal du fil. - Indice proprietaire : lorsqu’une allowlist
userspar guilde ou par canal correspond a l’expediteur, OpenClaw traite cet expediteur comme proprietaire dans le prompt systeme. Pour un proprietaire global entre canaux, definissezcommands.ownerAllowFrom. - Les messages rediges par des bots sont ignores par defaut ; definissez
channels.discord.allowBots=truepour les autoriser (vos propres messages restent filtres). - Avertissement : si vous autorisez les reponses a d’autres bots (
channels.discord.allowBots=true), evitez les boucles bot-a-bot avec des allowlistsrequireMention,channels.discord.guilds.*.channels.<id>.userset/ou des garde-fous clairs dansAGENTS.mdetSOUL.md.
6. Verifier le fonctionnement
- Demarrez la Gateway (passerelle).
- Dans votre canal de serveur, envoyez :
@Krill hello(ou quel que soit le nom de votre bot). - Si rien ne se passe : consultez Depannage ci-dessous.
Problemes courants
- D’abord : lancez
openclaw doctoretopenclaw channels status --probe(avertissements actionnables + audits rapides). - « Used disallowed intents » : activez Message Content Intent (et probablement Server Members Intent) dans le Developer Portal, puis redemarrez la Gateway (passerelle).
- Le bot se connecte mais ne repond jamais dans un canal de guilde :
- Message Content Intent manquant, ou
- Le bot n’a pas les permissions du canal (View/Send/Read History), ou
- Votre config exige des mentions et vous ne l’avez pas mentionne, ou
- Votre allowlist de guilde/canal refuse le canal/l’utilisateur.
requireMention: falsemais toujours aucune reponse :channels.discord.groupPolicyest par defaut sur allowlist ; definissez-le sur"open"ou ajoutez une entree de guilde souschannels.discord.guilds(listez optionnellement les canaux souschannels.discord.guilds.<id>.channelspour restreindre).- Si vous ne definissez que
DISCORD_BOT_TOKENet ne creez jamais de sectionchannels.discord, le runtime metgroupPolicypar defaut aopen. Ajoutezchannels.discord.groupPolicy,channels.defaults.groupPolicy, ou une allowlist de guilde/canal pour verrouiller.
- Si vous ne definissez que
requireMentiondoit se trouver souschannels.discord.guilds(ou un canal specifique).channels.discord.requireMentionau niveau racine est ignore.- Audits de permissions (
channels status --probe) ne verifient que les ID numeriques de canal. Si vous utilisez des slugs/noms comme cleschannels.discord.guilds.*.channels, l’audit ne peut pas verifier les permissions. - Les Messages prives ne fonctionnent pas :
channels.discord.dm.enabled=false,channels.discord.dm.policy="disabled", ou vous n’avez pas encore ete approuve (channels.discord.dm.policy="pairing"). - Approbations d’exec dans Discord : Discord prend en charge une interface a boutons pour les approbations d’exec en Messages prives (Autoriser une fois / Toujours autoriser / Refuser).
/approve <id> ...est reserve aux approbations transferees et ne resoudra pas les invites a boutons de Discord. Si vous voyez❌ Failed to submit approval: Error: unknown approval idou si l’UI n’apparait jamais, verifiez :channels.discord.execApprovals.enabled: truedans votre config.- Que votre ID utilisateur Discord figure dans
channels.discord.execApprovals.approvers(l’UI n’est envoyee qu’aux approbateurs). - Utilisez les boutons dans l’invite de MP (Autoriser une fois, Toujours autoriser, Refuser).
- Voir Exec approvals et Slash commands pour le flux global d’approbations et de commandes.
Capacites et limites
- Messages prives et canaux texte de guilde (les fils sont traites comme des canaux distincts ; la voix n’est pas prise en charge).
- Indicateurs de frappe envoyes au mieux ; le decoupage des messages utilise
channels.discord.textChunkLimit(defaut 2000) et separe les longues reponses par nombre de lignes (channels.discord.maxLinesPerMessage, defaut 17). - Decoupage optionnel par nouvelle ligne : definissez
channels.discord.chunkMode="newline"pour decouper sur les lignes vides (limites de paragraphes) avant le decoupage par longueur. - Televersements de fichiers pris en charge jusqu’a la valeur configuree
channels.discord.mediaMaxMb(defaut 8 Mo). - Reponses de guilde conditionnees par mention par defaut pour eviter les bots bruyants.
- Le contexte de reponse est injecte lorsqu’un message reference un autre message (contenu cite + id).
- Le fil de reponse natif est desactive par defaut ; activez-le avec
channels.discord.replyToModeet des balises de reponse.
Politique de nouvelle tentative
Les appels sortants a l’API Discord reessaient en cas de limitation de debit (429) en utilisantretry_after de Discord lorsque disponible, avec backoff exponentiel et jitter. Configurez via channels.discord.retry. Voir Retry policy.
Configuration
messages.ackReaction +
messages.ackReactionScope. Utilisez messages.removeAckAfterReply pour effacer la reaction
d’accuse apres la reponse du bot.
dm.enabled: definissezfalsepour ignorer tous les Messages prives (defauttrue).dm.policy: controle d’acces aux Messages prives (pairingrecommande)."open"requiertdm.allowFrom=["*"].dm.allowFrom: allowlist des Messages prives (id utilisateurs ou noms). Utilisee pardm.policy="allowlist"et pour la validationdm.policy="open". L’assistant accepte les noms d’utilisateur et les resout en id lorsque le bot peut rechercher des membres.dm.groupEnabled: activer les Messages prives de groupe (defautfalse).dm.groupChannels: allowlist optionnelle pour les id ou slugs de canaux de Messages prives de groupe.groupPolicy: controle la gestion des canaux de guilde (open|disabled|allowlist) ;allowlistrequiert des allowlists de canaux.guilds: regles par guilde indexees par id de guilde (prefere) ou slug.guilds."*": parametres par defaut par guilde appliques lorsqu’aucune entree explicite n’existe.guilds.<id>.slug: slug convivial optionnel utilise pour les noms d’affichage.guilds.<id>.users: allowlist utilisateur optionnelle par guilde (id ou noms).guilds.<id>.tools: surcharges optionnelles de politique d’outils par guilde (allow/deny/alsoAllow) utilisees lorsque la surcharge de canal est absente.guilds.<id>.toolsBySender: surcharges optionnelles de politique d’outils par expediteur au niveau de la guilde (s’applique lorsque la surcharge de canal est absente ; joker"*"pris en charge).guilds.<id>.channels.<channel>.allow: autoriser/refuser le canal lorsquegroupPolicy="allowlist".guilds.<id>.channels.<channel>.requireMention: conditionnement par mention pour le canal.guilds.<id>.channels.<channel>.tools: surcharges optionnelles de politique d’outils par canal (allow/deny/alsoAllow).guilds.<id>.channels.<channel>.toolsBySender: surcharges optionnelles de politique d’outils par expediteur dans le canal (joker"*"pris en charge).guilds.<id>.channels.<channel>.users: allowlist utilisateur optionnelle par canal.guilds.<id>.channels.<channel>.skills: filtre de skill (omis = tous les Skills, vide = aucun).guilds.<id>.channels.<channel>.systemPrompt: prompt systeme supplementaire pour le canal. Les sujets de canal Discord sont injectes comme contexte non fiable (pas comme prompt systeme).guilds.<id>.channels.<channel>.enabled: definissezfalsepour desactiver le canal.guilds.<id>.channels: regles de canal (cles = slugs ou id de canaux).guilds.<id>.requireMention: exigence de mention par guilde (remplacable par canal).guilds.<id>.reactionNotifications: mode d’evenement du systeme de reactions (off,own,all,allowlist).textChunkLimit: taille de decoupage du texte sortant (caracteres). Defaut : 2000.chunkMode:length(defaut) ne decoupe que lorsquetextChunkLimitest depasse ;newlinedecoupe sur les lignes vides (limites de paragraphes) avant le decoupage par longueur.maxLinesPerMessage: nombre maximal souple de lignes par message. Defaut : 17.mediaMaxMb: plafonner les medias entrants sauvegardes sur disque.historyLimit: nombre de messages recents de guilde a inclure comme contexte lors d’une reponse a une mention (defaut 20 ; repli surmessages.groupChat.historyLimit;0desactive).dmHistoryLimit: limite d’historique des Messages prives en tours utilisateur. Surcharges par utilisateur :dms["<user_id>"].historyLimit.retry: politique de nouvelle tentative pour les appels sortants a l’API Discord (tentatives, minDelayMs, maxDelayMs, jitter).pluralkit: resoudre les messages proxifies par PluralKit afin que les membres du systeme apparaissent comme expediteurs distincts.actions: garde-fous d’outils par action ; omettre pour autoriser tout (definirfalsepour desactiver).reactions(couvre react + lecture des reactions)stickers,emojiUploads,stickerUploads,polls,permissions,messages,threads,pins,searchmemberInfo,roleInfo,channelInfo,voiceStatus,eventschannels(creer/modifier/supprimer canaux + categories + permissions)roles(ajout/suppression de roles, defautfalse)moderation(timeout/expulsion/bannissement, defautfalse)presence(statut/activite du bot, defautfalse)
execApprovals: Messages prives d’approbation d’exec propres a Discord (UI a boutons). Prend en chargeenabled,approvers,agentFilter,sessionFilter.
guilds.<id>.reactionNotifications :
off: aucun evenement de reaction.own: reactions sur les propres messages du bot (defaut).all: toutes les reactions sur tous les messages.allowlist: reactions provenant deguilds.<id>.userssur tous les messages (liste vide desactive).
Prise en charge de PluralKit (PK)
Activez les recherches PK afin que les messages proxifies se resolvent vers le systeme + membre sous-jacent. Lorsqu’active, OpenClaw utilise l’identite du membre pour les allowlists et libelle l’expediteur commeMember (PK:System) afin d’eviter les pings Discord accidentels.
- Utilisez
pk:<memberId>dansdm.allowFrom,guilds.<id>.users, ou par canalusers. - Les noms d’affichage des membres sont aussi compares par nom/slug.
- Les recherches utilisent l’ID du message Discord original (avant proxy), de sorte que l’API PK ne le resout que dans sa fenetre de 30 minutes.
- Si les recherches PK echouent (par ex., systeme prive sans jeton), les messages proxifies
sont traites comme des messages de bot et sont ignores sauf si
channels.discord.allowBots=true.
Action par défaut de l’outil
| Groupe d’actions | Par défaut | Notes |
|---|---|---|
| reactions | active | React + lister reactions + emojiList |
| stickers | active | Envoyer des stickers |
| emojiUploads | active | Televerser des emojis |
| stickerUploads | active | Televerser des stickers |
| polls | active | Creer des sondages |
| permissions | active | Instantane des permissions de canal |
| messages | active | Lire/envoyer/modifier/supprimer |
| threads | active | Creer/lister/repondre |
| pins | active | Epingler/retirer/lister |
| search | active | Recherche de messages (fonctionnalite apercu) |
| memberInfo | active | Infos membre |
| roleInfo | active | Liste des roles |
| channelInfo | active | Infos canal + liste |
| channels | active | Gestion canaux/categories |
| voiceStatus | active | Recherche d’état vocal |
| events | active | Lister/creer des evenements programmes |
| rôles | desactive | Ajout/suppression de roles |
| modération | desactive | Timeout/expulsion/bannissement |
| présence | desactive | Statut/activite du bot (setPresence) |
replyToMode:off(defaut),first, ouall. S’applique uniquement lorsque le modele inclut une balise de reponse.
Balises de reponse
Pour demander une reponse en fil, le modele peut inclure une balise dans sa sortie :[[reply_to_current]]— repondre au message Discord declencheur.[[reply_to:<id>]]— repondre a un id de message specifique depuis le contexte/historique. Les id de messages courants sont ajoutes aux prompts comme[message_id: …]; les entrees d’historique incluent deja des id.
channels.discord.replyToMode :
off: ignorer les balises.first: seul le premier bloc sortant/piece jointe est une reponse.all: chaque bloc sortant/piece jointe est une reponse.
allowFrom/users/groupChannelsacceptent des id, noms, balises ou mentions comme<@id>.- Les prefixes comme
discord:/user:(utilisateurs) etchannel:(Messages prives de groupe) sont pris en charge. - Utilisez
*pour autoriser n’importe quel expediteur/canal. - Lorsque
guilds.<id>.channelsest present, les canaux non listes sont refuses par defaut. - Lorsque
guilds.<id>.channelsest omis, tous les canaux de la guilde autorisee sont permis. - Pour n’autoriser aucun canal, definissez
channels.discord.groupPolicy: "disabled"(ou conservez une allowlist vide). - L’assistant de configuration accepte les noms
Guild/Channel(publics + prives) et les resout en ID lorsque possible. - Au demarrage, OpenClaw resout les noms de canaux/utilisateurs des allowlists en ID (lorsque le bot peut rechercher des membres) et journalise la correspondance ; les entrees non resolues sont conservees telles quelles.
- Les commandes enregistrees reflètent les commandes de chat d’OpenClaw.
- Les commandes natives respectent les memes allowlists que les Messages prives/messages de guilde (
channels.discord.dm.allowFrom,channels.discord.guilds, regles par canal). - Les slash commands peuvent rester visibles dans l’UI Discord pour des utilisateurs non autorises ; OpenClaw applique les allowlists a l’execution et repond « not authorized ».
Actions d’outils
L’agent peut appelerdiscord avec des actions telles que :
react/reactions(ajouter ou lister des reactions)sticker,poll,permissionsreadMessages,sendMessage,editMessage,deleteMessage- Les charges utiles lire/rechercher/epingler incluent des
timestampMsnormalises (epoch ms UTC) ettimestampUtcaux cotes destimestampDiscord bruts. threadCreate,threadList,threadReplypinMessage,unpinMessage,listPinssearchMessages,memberInfo,roleInfo,roleAdd,roleRemove,emojiListchannelInfo,channelList,voiceStatus,eventList,eventCreatetimeout,kick,bansetPresence(activite du bot et statut en ligne)
[discord message id: …] et les lignes d’historique) afin que l’agent puisse les cibler.
Les emojis peuvent etre unicode (par ex., ✅) ou utiliser la syntaxe d’emoji personnalise comme <:party_blob:1234567890>.
Securite et exploitation
- Traitez le jeton du bot comme un mot de passe ; privilegiez la variable d’environnement
DISCORD_BOT_TOKENsur des hôtes supervises ou verrouillez les permissions du fichier de configuration. - N’accordez au bot que les permissions necessaires (generalement Lire/Envoyer des messages).
- Si le bot est bloque ou limite par le debit, redemarrez la Gateway (passerelle) (
openclaw gateway --force) apres avoir confirme qu’aucun autre processus ne detient la session Discord.