Passer au contenu principal

Discord (API Bot)

Statut : prêt pour les DM et les canaux de serveur via la passerelle Discord officielle.

Appairage

Les DM Discord utilisent par défaut le mode d’appairage.

Commandes slash

Comportement natif des commandes et catalogue de commandes.

Dépannage du canal

Diagnostics et flux de réparation inter-canaux.

Configuration rapide

Vous devrez créer une nouvelle application avec un bot, ajouter le bot à votre serveur, puis l’appairer à OpenClaw. Nous vous recommandons d’ajouter votre bot à votre propre serveur privé. Si vous n’en avez pas encore, créez-en un d’abord (choisissez Create My Own > For me and my friends).
1

Créer une application Discord et un bot

Accédez au Portail développeur Discord et cliquez sur New Application. Donnez-lui un nom comme « OpenClaw ».Cliquez sur Bot dans la barre latérale. Définissez le Username sur le nom que vous donnez à votre agent OpenClaw.
2

Activer les intents privilégiés

Toujours sur la page Bot, faites défiler jusqu’à Privileged Gateway Intents et activez :
  • Message Content Intent (requis)
  • Server Members Intent (recommandé ; requis pour les listes d’autorisation par rôle et la correspondance nom-vers-ID)
  • Presence Intent (facultatif ; nécessaire uniquement pour les mises à jour de présence)
3

Copier votre jeton de bot

Revenez en haut de la page Bot et cliquez sur Reset Token.
Malgré son nom, cela génère votre premier jeton — rien n’est « réinitialisé ».
Copiez le jeton et enregistrez-le quelque part. Il s’agit de votre Bot Token et vous en aurez besoin sous peu.
4

Générer une URL d’invitation et ajouter le bot à votre serveur

Cliquez sur OAuth2 dans la barre latérale. Vous allez générer une URL d’invitation avec les bonnes autorisations pour ajouter le bot à votre serveur.Faites défiler jusqu’à OAuth2 URL Generator et activez :
  • bot
  • applications.commands
Une section Bot Permissions apparaîtra en dessous. Activez :
  • View Channels
  • Send Messages
  • Read Message History
  • Embed Links
  • Attach Files
  • Add Reactions (facultatif)
Copiez l’URL générée en bas, collez-la dans votre navigateur, sélectionnez votre serveur, puis cliquez sur Continue pour vous connecter. Vous devriez maintenant voir votre bot dans le serveur Discord.
5

Activer le mode développeur et récupérer vos ID

De retour dans l’application Discord, vous devez activer le mode développeur afin de pouvoir copier les ID internes.
  1. Cliquez sur User Settings (icône d’engrenage à côté de votre avatar) → Advanced → activez Developer Mode
  2. Faites un clic droit sur l’icône de votre serveur dans la barre latérale → Copy Server ID
  3. Faites un clic droit sur votre propre avatarCopy User ID
Enregistrez votre Server ID et votre User ID avec votre Bot Token — vous enverrez les trois à OpenClaw à l’étape suivante.
6

Autoriser les DM des membres du serveur

Pour que l’appairage fonctionne, Discord doit autoriser votre bot à vous envoyer un DM. Faites un clic droit sur l’icône de votre serveurPrivacy Settings → activez Direct Messages.Cela permet aux membres du serveur (y compris les bots) de vous envoyer des DM. Laissez cette option activée si vous souhaitez utiliser les DM Discord avec OpenClaw. Si vous prévoyez d’utiliser uniquement des canaux de serveur, vous pouvez désactiver les DM après l’appairage.
7

Définir votre jeton de bot de manière sécurisée (ne l’envoyez pas dans le chat)

Le jeton de votre bot Discord est un secret (comme un mot de passe). Définissez-le sur la machine qui exécute OpenClaw avant d’envoyer un message à votre agent.
export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN"
openclaw config set channels.discord.token --ref-provider default --ref-source env --ref-id DISCORD_BOT_TOKEN --dry-run
openclaw config set channels.discord.token --ref-provider default --ref-source env --ref-id DISCORD_BOT_TOKEN
openclaw config set channels.discord.enabled true --strict-json
openclaw gateway
Si OpenClaw s’exécute déjà comme service en arrière-plan, redémarrez-le via l’application Mac OpenClaw ou en arrêtant puis en redémarrant le processus openclaw gateway run.
8

Configurer OpenClaw et appairer

Discutez avec votre agent OpenClaw sur n’importe quel canal existant (par ex. Telegram) et dites-lui. Si Discord est votre premier canal, utilisez plutôt l’onglet CLI / configuration.
« J’ai déjà défini mon jeton de bot Discord dans la configuration. Veuillez terminer la configuration de Discord avec l’ID utilisateur <user_id> et l’ID serveur <server_id>. »
9

Approuver le premier appairage DM

Attendez que la passerelle soit en cours d’exécution, puis envoyez un DM à votre bot dans Discord. Il répondra avec un code d’appairage.
Envoyez le code d’appairage à votre agent sur votre canal existant :
« Approuve ce code d’appairage Discord : <CODE> »
Les codes d’appairage expirent après 1 heure.Vous devriez maintenant pouvoir discuter avec votre agent dans Discord via DM.
La résolution de jeton tient compte du compte. Les valeurs de jeton dans la configuration priment sur la solution de repli env. DISCORD_BOT_TOKEN n’est utilisé que pour le compte par défaut. Pour les appels sortants avancés (outil de message/actions de canal), un token explicite par appel est utilisé pour cet appel. Cela s’applique aux actions de type envoi et lecture/probe (par exemple read/search/fetch/thread/pins/permissions). Les paramètres de stratégie de compte et de nouvelle tentative proviennent toujours du compte sélectionné dans l’instantané d’exécution actif.

Recommandé : configurer un espace de travail de serveur

Une fois que les DM fonctionnent, vous pouvez configurer votre serveur Discord comme un espace de travail complet où chaque canal obtient sa propre session d’agent avec son propre contexte. Cela est recommandé pour les serveurs privés où il n’y a que vous et votre bot.
1

Ajouter votre serveur à la liste d’autorisation des serveurs

Cela permet à votre agent de répondre dans n’importe quel canal de votre serveur, pas seulement en DM.
« Ajoute mon ID de serveur Discord <server_id> à la liste d’autorisation des serveurs »
2

Autoriser les réponses sans @mention

Par défaut, votre agent ne répond dans les canaux de serveur que lorsqu’il est mentionné avec @. Pour un serveur privé, vous souhaiterez probablement qu’il réponde à chaque message.
« Autorise mon agent à répondre sur ce serveur sans avoir besoin d’être @mentionné »
3

Prévoir la mémoire dans les canaux de serveur

Par défaut, la mémoire à long terme (MEMORY.md) n’est chargée que dans les sessions DM. Les canaux de serveur ne chargent pas automatiquement MEMORY.md.
« Quand je pose des questions dans les canaux Discord, utilise memory_search ou memory_get si tu as besoin du contexte à long terme de MEMORY.md. »
Créez maintenant quelques canaux sur votre serveur Discord et commencez à discuter. Votre agent peut voir le nom du canal, et chaque canal obtient sa propre session isolée — vous pouvez donc configurer #coding, #home, #research ou tout autre canal adapté à votre flux de travail.

Modèle d’exécution

  • La passerelle possède la connexion Discord.
  • Le routage des réponses est déterministe : les réponses entrantes Discord retournent vers Discord.
  • Par défaut (session.dmScope=main), les conversations directes partagent la session principale de l’agent (agent:main:main).
  • Les canaux de serveur sont des clés de session isolées (agent:<agentId>:discord:channel:<channelId>).
  • Les DM de groupe sont ignorés par défaut (channels.discord.dm.groupEnabled=false).
  • Les commandes slash natives s’exécutent dans des sessions de commande isolées (agent:<agentId>:discord:slash:<userId>), tout en portant CommandTargetSessionKey vers la session de conversation routée.

Canaux de forum

Les canaux de forum et de médias Discord n’acceptent que les publications de fils. OpenClaw prend en charge deux façons de les créer :
  • Envoyer un message au parent du forum (channel:<forumId>) pour créer automatiquement un fil. Le titre du fil utilise la première ligne non vide de votre message.
  • Utiliser openclaw message thread create pour créer un fil directement. Ne passez pas --message-id pour les canaux de forum.
Exemple : envoyer au parent du forum pour créer un fil
openclaw message send --channel discord --target channel:<forumId> \
  --message "Topic title\nBody of the post"
Exemple : créer explicitement un fil de forum
openclaw message thread create --channel discord --target channel:<forumId> \
  --thread-name "Topic title" --message "Body of the post"
Les parents de forum n’acceptent pas les composants Discord. Si vous avez besoin de composants, envoyez au fil lui-même (channel:<threadId>).

Composants interactifs

OpenClaw prend en charge les conteneurs Discord components v2 pour les messages d’agent. Utilisez l’outil de message avec une charge utile components. Les résultats d’interaction sont renvoyés à l’agent comme des messages entrants normaux et suivent les paramètres Discord replyToMode existants. Blocs pris en charge :
  • text, section, separator, actions, media-gallery, file
  • Les rangées d’actions autorisent jusqu’à 5 boutons ou un seul menu de sélection
  • Types de sélection : string, user, role, mentionable, channel
Par défaut, les composants sont à usage unique. Définissez components.reusable=true pour permettre l’utilisation multiple des boutons, sélecteurs et formulaires jusqu’à leur expiration. Pour restreindre qui peut cliquer sur un bouton, définissez allowedUsers sur ce bouton (ID utilisateur Discord, tags ou *). Lorsqu’il est configuré, les utilisateurs sans correspondance reçoivent un refus éphémère. Les commandes slash /model et /models ouvrent un sélecteur de modèle interactif avec des menus déroulants de fournisseur et de modèle, ainsi qu’une étape de soumission. La réponse du sélecteur est éphémère et seul l’utilisateur qui l’a invoqué peut l’utiliser. Pièces jointes de fichiers :
  • les blocs file doivent pointer vers une référence de pièce jointe (attachment://<filename>)
  • fournissez la pièce jointe via media/path/filePath (fichier unique) ; utilisez media-gallery pour plusieurs fichiers
  • utilisez filename pour remplacer le nom de téléversement lorsqu’il doit correspondre à la référence de pièce jointe
Formulaires modaux :
  • ajoutez components.modal avec jusqu’à 5 champs
  • types de champ : text, checkbox, radio, select, role-select, user-select
  • OpenClaw ajoute automatiquement un bouton déclencheur
Exemple :
{
  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" },
          ],
        },
      ],
    },
  },
}

Contrôle d’accès et routage

channels.discord.dmPolicy contrôle l’accès DM (hérité : channels.discord.dm.policy) :
  • pairing (par défaut)
  • allowlist
  • open (nécessite que channels.discord.allowFrom inclue "*" ; hérité : channels.discord.dm.allowFrom)
  • disabled
Si la politique DM n’est pas ouverte, les utilisateurs inconnus sont bloqués (ou invités à s’appairer en mode pairing).Priorité multi-comptes :
  • channels.discord.accounts.default.allowFrom s’applique uniquement au compte default.
  • Les comptes nommés héritent de channels.discord.allowFrom lorsque leur propre allowFrom n’est pas défini.
  • Les comptes nommés n’héritent pas de channels.discord.accounts.default.allowFrom.
Format cible DM pour la livraison :
  • user:<id>
  • mention <@id>
Les ID numériques bruts sont ambigus et rejetés sauf si un type de cible utilisateur/canal explicite est fourni.

Routage d’agent basé sur les rôles

Utilisez bindings[].match.roles pour router les membres de serveurs Discord vers différents agents selon l’ID de rôle. Les liaisons basées sur les rôles n’acceptent que les ID de rôle et sont évaluées après les liaisons pair ou parent-pair et avant les liaisons serveur seules. Si une liaison définit aussi d’autres champs de correspondance (par exemple peer + guildId + roles), tous les champs configurés doivent correspondre.
{
  bindings: [
    {
      agentId: "opus",
      match: {
        channel: "discord",
        guildId: "123456789012345678",
        roles: ["111111111111111111"],
      },
    },
    {
      agentId: "sonnet",
      match: {
        channel: "discord",
        guildId: "123456789012345678",
      },
    },
  ],
}

Configuration du Portail développeur

  1. Portail développeur Discord -> Applications -> New Application
  2. Bot -> Add Bot
  3. Copiez le jeton du bot
Dans Bot -> Privileged Gateway Intents, activez :
  • Message Content Intent
  • Server Members Intent (recommandé)
Presence intent est facultatif et requis uniquement si vous souhaitez recevoir des mises à jour de présence. Définir la présence du bot (setPresence) ne nécessite pas d’activer les mises à jour de présence pour les membres.
Générateur d’URL OAuth :
  • portées : bot, applications.commands
Autorisations de base typiques :
  • View Channels
  • Send Messages
  • Read Message History
  • Embed Links
  • Attach Files
  • Add Reactions (facultatif)
Évitez Administrator sauf nécessité explicite.
Activez le mode développeur Discord, puis copiez :
  • l’ID du serveur
  • l’ID du canal
  • l’ID de l’utilisateur
Préférez les ID numériques dans la configuration OpenClaw pour des audits et probes fiables.

Commandes natives et authentification des commandes

  • commands.native vaut par défaut "auto" et est activé pour Discord.
  • Remplacement par canal : channels.discord.commands.native.
  • commands.native=false efface explicitement les commandes natives Discord précédemment enregistrées.
  • L’authentification des commandes natives utilise les mêmes listes d’autorisation/politiques Discord que la gestion normale des messages.
  • Les commandes peuvent toujours être visibles dans l’interface Discord pour les utilisateurs non autorisés ; l’exécution applique quand même l’authentification OpenClaw et renvoie « non autorisé ».
Voir Commandes slash pour le catalogue et le comportement des commandes. Paramètres par défaut des commandes slash :
  • ephemeral: true

Détails des fonctionnalités

Discord prend en charge les balises de réponse dans la sortie d’agent :
  • [[reply_to_current]]
  • [[reply_to:<id>]]
Contrôlé par channels.discord.replyToMode :
  • off (par défaut)
  • first
  • all
Remarque : off désactive le fil de réponse implicite. Les balises explicites [[reply_to_*]] restent honorées.Les ID de message sont exposés dans le contexte/l’historique afin que les agents puissent cibler des messages spécifiques.
OpenClaw peut diffuser des brouillons de réponse en envoyant un message temporaire puis en le modifiant à mesure que le texte arrive.
  • channels.discord.streaming contrôle la diffusion d’aperçu (off | partial | block | progress, par défaut : off).
  • La valeur par défaut reste off car les modifications d’aperçu Discord peuvent atteindre rapidement les limites de débit, en particulier lorsque plusieurs bots ou passerelles partagent le même compte ou trafic de serveur.
  • progress est accepté pour la cohérence inter-canaux et est mappé à partial sur Discord.
  • channels.discord.streamMode est un alias hérité et est migré automatiquement.
  • partial modifie un seul message d’aperçu au fil de l’arrivée des jetons.
  • block émet des morceaux de taille brouillon (utilisez draftChunk pour ajuster la taille et les points de coupure).
Exemple :
{
  channels: {
    discord: {
      streaming: "partial",
    },
  },
}
Valeurs par défaut de segmentation du mode block (bornées par channels.discord.textChunkLimit) :
{
  channels: {
    discord: {
      streaming: "block",
      draftChunk: {
        minChars: 200,
        maxChars: 800,
        breakPreference: "paragraph",
      },
    },
  },
}
La diffusion d’aperçu est réservée au texte ; les réponses média reviennent à la livraison normale.Remarque : la diffusion d’aperçu est distincte de la diffusion par blocs. Lorsque la diffusion par blocs est explicitement activée pour Discord, OpenClaw ignore le flux d’aperçu afin d’éviter une double diffusion.
Contexte d’historique des serveurs :
  • channels.discord.historyLimit par défaut 20
  • solution de repli : messages.groupChat.historyLimit
  • 0 désactive
Contrôles de l’historique DM :
  • channels.discord.dmHistoryLimit
  • channels.discord.dms["<user_id>"].historyLimit
Comportement des fils :
  • les fils Discord sont routés comme des sessions de canal
  • les métadonnées du fil parent peuvent être utilisées pour la liaison à la session parente
  • la configuration du fil hérite de celle du canal parent sauf si une entrée spécifique au fil existe
Les sujets de canal sont injectés comme contexte non fiable (et non comme prompt système). Le contexte des réponses et messages cités reste actuellement tel que reçu. Les listes d’autorisation Discord servent principalement à contrôler qui peut déclencher l’agent, et non à établir une frontière complète de rédaction du contexte supplémentaire.
Discord peut lier un fil à une cible de session afin que les messages suivants dans ce fil continuent à être routés vers la même session (y compris les sessions de sous-agent).Commandes :
  • /focus <target> lie le fil actuel/nouveau à une cible de sous-agent/session
  • /unfocus supprime la liaison du fil actuel
  • /agents affiche les exécutions actives et l’état de liaison
  • /session idle <duration|off> inspecte/met à jour la suppression automatique du focus par inactivité pour les liaisons ciblées
  • /session max-age <duration|off> inspecte/met à jour l’âge maximal strict pour les liaisons ciblées
Configuration :
{
  session: {
    threadBindings: {
      enabled: true,
      idleHours: 24,
      maxAgeHours: 0,
    },
  },
  channels: {
    discord: {
      threadBindings: {
        enabled: true,
        idleHours: 24,
        maxAgeHours: 0,
        spawnSubagentSessions: false, // activation explicite
      },
    },
  },
}
Remarques :
  • session.threadBindings.* définit les valeurs par défaut globales.
  • channels.discord.threadBindings.* remplace le comportement Discord.
  • spawnSubagentSessions doit être à true pour créer/lier automatiquement des fils pour sessions_spawn({ thread: true }).
  • spawnAcpSessions doit être à true pour créer/lier automatiquement des fils pour ACP (/acp spawn ... --thread ... ou sessions_spawn({ runtime: "acp", thread: true })).
  • Si les liaisons de fil sont désactivées pour un compte, /focus et les opérations associées ne sont pas disponibles.
Voir Sous-agents, Agents ACP et Référence de configuration.
Pour des espaces de travail ACP stables « toujours actifs », configurez des liaisons ACP typées de niveau supérieur ciblant les conversations Discord.Chemin de configuration :
  • bindings[] avec type: "acp" et match.channel: "discord"
Exemple :
{
  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,
            },
          },
        },
      },
    },
  },
}
Remarques :
  • /acp spawn codex --bind here lie le canal ou le fil Discord actuel sur place et maintient le routage des messages futurs vers la même session ACP.
  • Cela peut toujours vouloir dire « démarrer une nouvelle session ACP Codex », mais cela ne crée pas en soi un nouveau fil Discord. Le canal existant reste la surface de discussion.
  • Codex peut toujours s’exécuter dans son propre cwd ou espace de travail backend sur disque. Cet espace de travail est un état d’exécution, pas un fil Discord.
  • Les messages de fil peuvent hériter de la liaison ACP du canal parent.
  • Dans un canal ou fil lié, /new et /reset réinitialisent la même session ACP sur place.
  • Les liaisons de fil temporaires continuent de fonctionner et peuvent remplacer la résolution de cible tant qu’elles sont actives.
  • spawnAcpSessions n’est requis que lorsque OpenClaw doit créer/lier un fil enfant via --thread auto|here. Il n’est pas requis pour /acp spawn ... --bind here dans le canal actuel.
Voir Agents ACP pour les détails du comportement de liaison.
Mode de notification de réaction par serveur :
  • off
  • own (par défaut)
  • all
  • allowlist (utilise guilds.<id>.users)
Les événements de réaction sont transformés en événements système et attachés à la session Discord routée.
ackReaction envoie un emoji d’accusé de réception pendant qu’OpenClaw traite un message entrant.Ordre de résolution :
  • channels.discord.accounts.<accountId>.ackReaction
  • channels.discord.ackReaction
  • messages.ackReaction
  • solution de repli sur l’emoji d’identité de l’agent (agents.list[].identity.emoji, sinon ”👀”)
Remarques :
  • Discord accepte les emoji unicode ou les noms d’emoji personnalisés.
  • Utilisez "" pour désactiver la réaction pour un canal ou un compte.
Les écritures de configuration initiées depuis le canal sont activées par défaut.Cela affecte les flux /config set|unset (lorsque les fonctionnalités de commande sont activées).Désactiver :
{
  channels: {
    discord: {
      configWrites: false,
    },
  },
}
Faites passer le trafic WebSocket de la passerelle Discord et les recherches REST de démarrage (ID d’application + résolution de liste d’autorisation) via un proxy HTTP(S) avec channels.discord.proxy.
{
  channels: {
    discord: {
      proxy: "http://proxy.example:8080",
    },
  },
}
Remplacement par compte :
{
  channels: {
    discord: {
      accounts: {
        primary: {
          proxy: "http://proxy.example:8080",
        },
      },
    },
  },
}
Activez la résolution PluralKit pour mapper les messages proxifiés à l’identité du membre du système :
{
  channels: {
    discord: {
      pluralkit: {
        enabled: true,
        token: "pk_live_...", // facultatif ; nécessaire pour les systèmes privés
      },
    },
  },
}
Remarques :
  • les listes d’autorisation peuvent utiliser pk:<memberId>
  • les noms d’affichage des membres ne sont mis en correspondance par nom/slug que lorsque channels.discord.dangerouslyAllowNameMatching: true
  • les recherches utilisent l’ID de message d’origine et sont limitées à une fenêtre temporelle
  • si la recherche échoue, les messages proxifiés sont traités comme des messages de bot et ignorés sauf si allowBots=true
Les mises à jour de présence sont appliquées lorsque vous définissez un champ de statut ou d’activité, ou lorsque vous activez la présence automatique.Exemple de statut seul :
{
  channels: {
    discord: {
      status: "idle",
    },
  },
}
Exemple d’activité (le statut personnalisé est le type d’activité par défaut) :
{
  channels: {
    discord: {
      activity: "Focus time",
      activityType: 4,
    },
  },
}
Exemple de streaming :
{
  channels: {
    discord: {
      activity: "Live coding",
      activityType: 1,
      activityUrl: "https://twitch.tv/openclaw",
    },
  },
}
Correspondance des types d’activité :
  • 0 : Playing
  • 1 : Streaming (nécessite activityUrl)
  • 2 : Listening
  • 3 : Watching
  • 4 : Custom (utilise le texte d’activité comme état du statut ; l’emoji est facultatif)
  • 5 : Competing
Exemple de présence automatique (signal de santé d’exécution) :
{
  channels: {
    discord: {
      autoPresence: {
        enabled: true,
        intervalMs: 30000,
        minUpdateIntervalMs: 15000,
        exhaustedText: "token exhausted",
      },
    },
  },
}
La présence automatique mappe la disponibilité d’exécution vers le statut Discord : healthy => online, degraded ou unknown => idle, exhausted ou unavailable => dnd. Remplacements de texte facultatifs :
  • autoPresence.healthyText
  • autoPresence.degradedText
  • autoPresence.exhaustedText (prend en charge l’espace réservé {reason})
Discord prend en charge la gestion des approbations par bouton dans les DM et peut éventuellement publier les invites d’approbation dans le canal d’origine.Chemin de configuration :
  • channels.discord.execApprovals.enabled
  • channels.discord.execApprovals.approvers (facultatif ; revient à commands.ownerAllowFrom lorsque possible)
  • channels.discord.execApprovals.target (dm | channel | both, par défaut : dm)
  • agentFilter, sessionFilter, cleanupAfterResolve
Discord active automatiquement les approbations d’exécution natives lorsque enabled n’est pas défini ou vaut "auto" et qu’au moins un approbateur peut être résolu, soit depuis execApprovals.approvers, soit depuis commands.ownerAllowFrom. Discord ne déduit pas les approbateurs d’exécution à partir de allowFrom du canal, de l’ancien dm.allowFrom ou de defaultTo en message direct. Définissez enabled: false pour désactiver explicitement Discord comme client d’approbation natif.Lorsque target vaut channel ou both, l’invite d’approbation est visible dans le canal. Seuls les approbateurs résolus peuvent utiliser les boutons ; les autres utilisateurs reçoivent un refus éphémère. Les invites d’approbation incluent le texte de la commande ; n’activez donc la livraison dans le canal que dans des canaux de confiance. Si l’ID du canal ne peut pas être dérivé de la clé de session, OpenClaw revient à une livraison par DM.Discord rend également les boutons d’approbation partagés utilisés par d’autres canaux de discussion. L’adaptateur Discord natif ajoute principalement le routage DM des approbateurs et la diffusion au canal. Lorsque ces boutons sont présents, ils constituent l’expérience d’approbation principale ; OpenClaw ne doit inclure une commande manuelle /approve que lorsque le résultat de l’outil indique que les approbations de chat ne sont pas disponibles ou que l’approbation manuelle est la seule voie.L’authentification Gateway pour ce gestionnaire utilise le même contrat partagé de résolution des informations d’identification que les autres clients Gateway :
  • authentification locale prioritaire via env (OPENCLAW_GATEWAY_TOKEN / OPENCLAW_GATEWAY_PASSWORD puis gateway.auth.*)
  • en mode local, gateway.remote.* peut être utilisé en solution de repli uniquement lorsque gateway.auth.* n’est pas défini ; les SecretRef locaux configurés mais non résolus échouent en mode fermé
  • prise en charge du mode distant via gateway.remote.* lorsque applicable
  • les remplacements d’URL sont sûrs vis-à-vis des remplacements : les remplacements CLI ne réutilisent pas les identifiants implicites, et les remplacements env utilisent uniquement les identifiants env
Comportement de résolution des approbations :
  • les ID préfixés par plugin: sont résolus via plugin.approval.resolve.
  • les autres ID sont résolus via exec.approval.resolve.
  • Discord n’effectue pas ici de saut supplémentaire de repli exec-vers-plugin ; le préfixe de l’ID décide de la méthode Gateway appelée.
Les approbations d’exécution expirent après 30 minutes par défaut. Si les approbations échouent avec des ID d’approbation inconnus, vérifiez la résolution des approbateurs, l’activation de la fonctionnalité et que le type d’ID d’approbation livré correspond à la demande en attente.Documentation connexe : Approbations d’exécution

Outils et barrières d’action

Les actions de message Discord incluent la messagerie, l’administration de canaux, la modération, la présence et les actions de métadonnées. Exemples principaux :
  • messagerie : sendMessage, readMessages, editMessage, deleteMessage, threadReply
  • réactions : react, reactions, emojiList
  • modération : timeout, kick, ban
  • présence : setPresence
Les barrières d’action se trouvent sous channels.discord.actions.*. Comportement par défaut des barrières :
Groupe d’actionsPar défaut
reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissionsactivé
rolesdésactivé
moderationdésactivé
presencedésactivé

UI components v2

OpenClaw utilise Discord components v2 pour les approbations d’exécution et les marqueurs inter-contextes. Les actions de message Discord peuvent également accepter components pour une UI personnalisée (avancé ; nécessite la construction d’une charge utile de composant via l’outil Discord), tandis que les anciens embeds restent disponibles mais ne sont pas recommandés.
  • channels.discord.ui.components.accentColor définit la couleur d’accent utilisée par les conteneurs de composants Discord (hexadécimal).
  • Définissez-la par compte avec channels.discord.accounts.<id>.ui.components.accentColor.
  • embeds sont ignorés lorsque des components v2 sont présents.
Exemple :
{
  channels: {
    discord: {
      ui: {
        components: {
          accentColor: "#5865F2",
        },
      },
    },
  },
}

Canaux vocaux

OpenClaw peut rejoindre des canaux vocaux Discord pour des conversations continues en temps réel. Cela est distinct des pièces jointes de message vocal. Exigences :
  • Activez les commandes natives (commands.native ou channels.discord.commands.native).
  • Configurez channels.discord.voice.
  • Le bot doit disposer des autorisations Connect + Speak dans le canal vocal cible.
Utilisez la commande native propre à Discord /vc join|leave|status pour contrôler les sessions. La commande utilise l’agent par défaut du compte et suit les mêmes règles de liste d’autorisation et de politique de groupe que les autres commandes Discord. Exemple de jonction automatique :
{
  channels: {
    discord: {
      voice: {
        enabled: true,
        autoJoin: [
          {
            guildId: "123456789012345678",
            channelId: "234567890123456789",
          },
        ],
        daveEncryption: true,
        decryptionFailureTolerance: 24,
        tts: {
          provider: "openai",
          openai: { voice: "alloy" },
        },
      },
    },
  },
}
Remarques :
  • voice.tts remplace messages.tts uniquement pour la lecture vocale.
  • Les tours de transcription vocale dérivent le statut de propriétaire à partir de Discord allowFrom (ou dm.allowFrom) ; les locuteurs non propriétaires ne peuvent pas accéder aux outils réservés au propriétaire (par exemple gateway et cron).
  • La voix est activée par défaut ; définissez channels.discord.voice.enabled=false pour la désactiver.
  • voice.daveEncryption et voice.decryptionFailureTolerance sont transmis aux options de jonction de @discordjs/voice.
  • Les valeurs par défaut de @discordjs/voice sont daveEncryption=true et decryptionFailureTolerance=24 si elles ne sont pas définies.
  • OpenClaw surveille également les échecs de déchiffrement en réception et récupère automatiquement en quittant puis en rejoignant à nouveau le canal vocal après des échecs répétés dans une courte fenêtre.
  • Si les journaux de réception affichent de façon répétée DecryptionFailed(UnencryptedWhenPassthroughDisabled), cela peut correspondre au bug de réception amont @discordjs/voice suivi dans discord.js #11419.

Messages vocaux

Les messages vocaux Discord affichent un aperçu de forme d’onde et nécessitent de l’audio OGG/Opus ainsi que des métadonnées. OpenClaw génère automatiquement la forme d’onde, mais il a besoin de ffmpeg et ffprobe disponibles sur l’hôte Gateway pour inspecter et convertir les fichiers audio. Exigences et contraintes :
  • Fournissez un chemin de fichier local (les URL sont rejetées).
  • Omettez le contenu texte (Discord n’autorise pas texte + message vocal dans la même charge utile).
  • Tout format audio est accepté ; OpenClaw convertit en OGG/Opus si nécessaire.
Exemple :
message(action="send", channel="discord", target="channel:123", path="/path/to/audio.mp3", asVoice=true)

Dépannage

  • activez Message Content Intent
  • activez Server Members Intent lorsque vous dépendez de la résolution utilisateur/membre
  • redémarrez la passerelle après avoir modifié les intents
  • vérifiez groupPolicy
  • vérifiez la liste d’autorisation du serveur sous channels.discord.guilds
  • si la map channels du serveur existe, seuls les canaux listés sont autorisés
  • vérifiez le comportement requireMention et les motifs de mention
Vérifications utiles :
openclaw doctor
openclaw channels status --probe
openclaw logs --follow
Causes fréquentes :
  • groupPolicy="allowlist" sans liste d’autorisation serveur/canal correspondante
  • requireMention configuré au mauvais endroit (doit être sous channels.discord.guilds ou dans l’entrée de canal)
  • expéditeur bloqué par la liste d’autorisation users du serveur/canal
Journaux typiques :
  • Listener DiscordMessageListener timed out after 30000ms for event MESSAGE_CREATE
  • Slow listener detected ...
  • discord inbound worker timed out after ...
Paramètre de budget du listener :
  • compte unique : channels.discord.eventQueue.listenerTimeout
  • multi-comptes : channels.discord.accounts.<accountId>.eventQueue.listenerTimeout
Paramètre de délai d’expiration d’exécution du worker :
  • compte unique : channels.discord.inboundWorker.runTimeoutMs
  • multi-comptes : channels.discord.accounts.<accountId>.inboundWorker.runTimeoutMs
  • par défaut : 1800000 (30 minutes) ; définissez 0 pour désactiver
Référence recommandée :
{
  channels: {
    discord: {
      accounts: {
        default: {
          eventQueue: {
            listenerTimeout: 120000,
          },
          inboundWorker: {
            runTimeoutMs: 1800000,
          },
        },
      },
    },
  },
}
Utilisez eventQueue.listenerTimeout pour une initialisation lente du listener et inboundWorker.runTimeoutMs uniquement si vous souhaitez une soupape de sécurité distincte pour les tours d’agent en file d’attente.
Les vérifications d’autorisation de channels status --probe ne fonctionnent que pour les ID de canal numériques.Si vous utilisez des clés slug, la correspondance d’exécution peut toujours fonctionner, mais la probe ne peut pas vérifier complètement les autorisations.
  • DM désactivé : channels.discord.dm.enabled=false
  • politique DM désactivée : channels.discord.dmPolicy="disabled" (hérité : channels.discord.dm.policy)
  • en attente d’approbation d’appairage en mode pairing
Par défaut, les messages rédigés par des bots sont ignorés.Si vous définissez channels.discord.allowBots=true, utilisez des règles strictes de mention et de liste d’autorisation pour éviter les boucles. Préférez channels.discord.allowBots="mentions" pour n’accepter que les messages de bot qui mentionnent le bot.
  • gardez OpenClaw à jour (openclaw update) afin que la logique de récupération de réception vocale Discord soit présente
  • confirmez channels.discord.voice.daveEncryption=true (par défaut)
  • partez de channels.discord.voice.decryptionFailureTolerance=24 (valeur par défaut amont) et ajustez uniquement si nécessaire
  • surveillez les journaux pour :
    • discord voice: DAVE decrypt failures detected
    • discord voice: repeated decrypt failures; attempting rejoin
  • si les échecs persistent après la reconnexion automatique, collectez les journaux et comparez-les à discord.js #11419

Pointeurs de référence de configuration

Référence principale : Champs Discord à fort signal :
  • démarrage/authentification : enabled, token, accounts.*, allowBots
  • politique : groupPolicy, dm.*, guilds.*, guilds.*.channels.*
  • commande : commands.native, commands.useAccessGroups, configWrites, slashCommand.*
  • file d’événements : eventQueue.listenerTimeout (budget du listener), eventQueue.maxQueueSize, eventQueue.maxConcurrency
  • worker entrant : inboundWorker.runTimeoutMs
  • réponse/historique : replyToMode, historyLimit, dmHistoryLimit, dms.*.historyLimit
  • livraison : textChunkLimit, chunkMode, maxLinesPerMessage
  • streaming : streaming (alias hérité : streamMode), draftChunk, blockStreaming, blockStreamingCoalesce
  • média/nouvelle tentative : mediaMaxMb, retry
    • mediaMaxMb limite les téléversements Discord sortants (par défaut : 8MB)
  • actions : actions.*
  • présence : activity, status, activityType, activityUrl
  • UI : ui.components.accentColor
  • fonctionnalités : threadBindings, bindings[] de niveau supérieur (type: "acp"), pluralkit, execApprovals, intents, agentComponents, heartbeat, responsePrefix

Sécurité et opérations

  • Traitez les jetons de bot comme des secrets (DISCORD_BOT_TOKEN de préférence dans les environnements supervisés).
  • Accordez les autorisations Discord minimales nécessaires.
  • Si le déploiement/l’état des commandes est obsolète, redémarrez la passerelle et revérifiez avec openclaw channels status --probe.

Lié