Discord (Bot API)
Status: pronto para DMs e canais de servidor via gateway oficial do Discord.Pareamento
Comandos de barra
Solução de problemas de canal
Configuração rápida
Você precisará criar um novo aplicativo com um bot, adicionar o bot ao seu servidor e pareá-lo com o OpenClaw. Recomendamos adicionar seu bot ao seu próprio servidor privado. Se você ainda não tiver um, crie um primeiro (escolha Create My Own > For me and my friends).Criar um aplicativo e bot do Discord
Habilitar intents privilegiadas
- Message Content Intent (obrigatória)
- Server Members Intent (recomendada; obrigatória para allowlists de função e correspondência de nome para ID)
- Presence Intent (opcional; necessária apenas para atualizações de presença)
Copiar o token do seu bot
Gerar uma URL de convite e adicionar o bot ao seu servidor
botapplications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (opcional)
Habilitar o Modo de Desenvolvedor e coletar seus IDs
- Clique em User Settings (ícone de engrenagem ao lado do seu avatar) → Advanced → ative Developer Mode
- Clique com o botão direito no ícone do seu servidor na barra lateral → Copy Server ID
- Clique com o botão direito no seu próprio avatar → Copy User ID
Permitir DMs de membros do servidor
Definir o token do seu bot com segurança (não o envie no chat)
openclaw gateway run.Configurar o OpenClaw e parear
- Pergunte ao seu agente
- CLI / config
“Já configurei meu token do bot do Discord na config. Conclua a configuração do Discord com o User ID<user_id>e o Server ID<server_id>.”
Aprovar o primeiro pareamento por DM
- Pergunte ao seu agente
- CLI
“Aprove este código de pareamento do Discord: <CODE>”
DISCORD_BOT_TOKEN é usado apenas para a conta padrão.
Para chamadas avançadas de saída (ferramenta de mensagem/ações de canal), um token explícito por chamada é usado para aquela chamada. Isso se aplica a ações de envio e de leitura/sondagem (por exemplo, read/search/fetch/thread/pins/permissions). As configurações de política/retry da conta ainda vêm da conta selecionada no snapshot ativo do runtime.Recomendado: configurar um workspace de servidor
Quando as DMs estiverem funcionando, você poderá configurar seu servidor do Discord como um workspace completo, em que cada canal recebe sua própria sessão de agente com seu próprio contexto. Isso é recomendado para servidores privados onde há apenas você e seu bot.Adicionar seu servidor à allowlist de servidores
- Pergunte ao seu agente
- Config
“Adicione meu Server ID do Discord <server_id> à allowlist de servidores”
Permitir respostas sem @mention
- Pergunte ao seu agente
- Config
“Permita que meu agente responda neste servidor sem precisar ser mencionado com @”
Planejar memória em canais de servidor
- Pergunte ao seu agente
- Manual
“Quando eu fizer perguntas em canais do Discord, use memory_search ou memory_get se precisar de contexto de longo prazo do MEMORY.md.”
#coding, #home, #research ou o que melhor se encaixar no seu fluxo de trabalho.
Modelo de runtime
- O gateway é responsável pela conexão com o Discord.
- O roteamento de respostas é determinístico: respostas recebidas do Discord voltam para o Discord.
- Por padrão (
session.dmScope=main), chats diretos compartilham a sessão principal do agente (agent:main:main). - Canais de servidor usam chaves de sessão isoladas (
agent:<agentId>:discord:channel:<channelId>). - DMs em grupo são ignoradas por padrão (
channels.discord.dm.groupEnabled=false). - Comandos de barra nativos são executados em sessões de comando isoladas (
agent:<agentId>:discord:slash:<userId>), enquanto ainda carregamCommandTargetSessionKeypara a sessão de conversa roteada.
Canais de fórum
Canais de fórum e mídia do Discord aceitam apenas postagens em tópicos. O OpenClaw oferece suporte a duas formas de criá-los:- Envie uma mensagem para o pai do fórum (
channel:<forumId>) para criar um tópico automaticamente. O título do tópico usa a primeira linha não vazia da sua mensagem. - Use
openclaw message thread createpara criar um tópico diretamente. Não passe--message-idpara canais de fórum.
channel:<threadId>).
Componentes interativos
O OpenClaw oferece suporte a contêineres Discord components v2 para mensagens do agente. Use a ferramenta de mensagem com uma cargacomponents. Os resultados de interação são roteados de volta ao agente como mensagens recebidas normais e seguem as configurações existentes de replyToMode do Discord.
Blocos compatíveis:
text,section,separator,actions,media-gallery,file- Linhas de ação permitem até 5 botões ou um único menu de seleção
- Tipos de seleção:
string,user,role,mentionable,channel
components.reusable=true para permitir que botões, seleções e formulários sejam usados várias vezes até expirarem.
Para restringir quem pode clicar em um botão, defina allowedUsers nesse botão (IDs de usuário do Discord, tags ou *). Quando configurado, usuários sem correspondência recebem uma negação efêmera.
Os comandos de barra /model e /models abrem um seletor de modelo interativo com menus suspensos de provider e modelo, além de uma etapa Submit. A resposta do seletor é efêmera e apenas o usuário que a invocou pode usá-la.
Anexos de arquivo:
- Blocos
filedevem apontar para uma referência de anexo (attachment://<filename>) - Forneça o anexo via
media/path/filePath(arquivo único); usemedia-gallerypara vários arquivos - Use
filenamepara substituir o nome do upload quando ele precisar corresponder à referência de anexo
- Adicione
components.modalcom até 5 campos - Tipos de campo:
text,checkbox,radio,select,role-select,user-select - O OpenClaw adiciona automaticamente um botão de gatilho
Controle de acesso e roteamento
- Política de DM
- Política de servidor
- Menções e DMs em grupo
channels.discord.dmPolicy controla o acesso por DM (legado: channels.discord.dm.policy):pairing(padrão)allowlistopen(exige quechannels.discord.allowFrominclua"*"; legado:channels.discord.dm.allowFrom)disabled
pairing).Precedência com múltiplas contas:channels.discord.accounts.default.allowFromse aplica apenas à contadefault.- Contas nomeadas herdam
channels.discord.allowFromquando o próprioallowFromnão está definido. - Contas nomeadas não herdam
channels.discord.accounts.default.allowFrom.
user:<id>- menção
<@id>
Roteamento de agente baseado em função
Usebindings[].match.roles para rotear membros de servidores do Discord para agentes diferentes por ID de função. Bindings baseados em função aceitam apenas IDs de função e são avaliados após bindings de peer ou parent-peer e antes de bindings somente de servidor. Se um binding também definir outros campos de correspondência (por exemplo peer + guildId + roles), todos os campos configurados devem corresponder.
Configuração do Developer Portal
Criar app e bot
Criar app e bot
- Discord Developer Portal -> Applications -> New Application
- Bot -> Add Bot
- Copie o token do bot
Intents privilegiadas
Intents privilegiadas
- Message Content Intent
- Server Members Intent (recomendado)
setPresence) não exige habilitar atualizações de presença para membros.Escopos OAuth e permissões de linha de base
Escopos OAuth e permissões de linha de base
- escopos:
bot,applications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (opcional)
Administrator, a menos que seja explicitamente necessário.Copiar IDs
Copiar IDs
- ID do servidor
- ID do canal
- ID do usuário
Comandos nativos e autenticação de comandos
commands.nativeusa"auto"por padrão e está habilitado para Discord.- Substituição por canal:
channels.discord.commands.native. commands.native=falseremove explicitamente comandos nativos do Discord registrados anteriormente.- A autenticação de comandos nativos usa as mesmas allowlists/políticas do Discord que o tratamento normal de mensagens.
- Os comandos ainda podem ficar visíveis na interface do Discord para usuários não autorizados; a execução ainda aplica a autenticação do OpenClaw e retorna “not authorized”.
ephemeral: true
Detalhes do recurso
Tags de resposta e respostas nativas
Tags de resposta e respostas nativas
Prévia de stream ao vivo
Prévia de stream ao vivo
channels.discord.streamingcontrola a transmissão de prévia (off|partial|block|progress, padrão:off).- O padrão continua sendo
offporque edições de prévia no Discord podem atingir limites de taxa rapidamente, especialmente quando vários bots ou gateways compartilham a mesma conta ou tráfego do servidor. progressé aceito para consistência entre canais e mapeia parapartialno Discord.channels.discord.streamModeé um alias legado e é migrado automaticamente.partialedita uma única mensagem de prévia à medida que os tokens chegam.blockemite blocos do tamanho de rascunho (usedraftChunkpara ajustar tamanho e pontos de quebra).
block (limitados por channels.discord.textChunkLimit):Histórico, contexto e comportamento de tópicos
Histórico, contexto e comportamento de tópicos
channels.discord.historyLimitpadrão20- fallback:
messages.groupChat.historyLimit 0desativa
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- tópicos do Discord são roteados como sessões de canal
- metadados do tópico pai podem ser usados para vínculo com a sessão pai
- a config do tópico herda a config do canal pai, a menos que exista uma entrada específica para o tópico
Sessões vinculadas a tópicos para subagentes
Sessões vinculadas a tópicos para subagentes
/focus <target>vincula o tópico atual/novo a um alvo de subagente/sessão/unfocusremove o vínculo do tópico atual/agentsmostra execuções ativas e o estado do vínculo/session idle <duration|off>inspeciona/atualiza o desfoco automático por inatividade para vínculos focados/session max-age <duration|off>inspeciona/atualiza a idade máxima rígida para vínculos focados
session.threadBindings.*define padrões globais.channels.discord.threadBindings.*substitui o comportamento do Discord.spawnSubagentSessionsdeve ser true para criar/vincular automaticamente tópicos parasessions_spawn({ thread: true }).spawnAcpSessionsdeve ser true para criar/vincular automaticamente tópicos para ACP (/acp spawn ... --thread ...ousessions_spawn({ runtime: "acp", thread: true })).- Se os vínculos de tópico estiverem desabilitados para uma conta,
/focuse operações relacionadas de vínculo de tópico ficarão indisponíveis.
Vínculos persistentes de canal ACP
Vínculos persistentes de canal ACP
bindings[]comtype: "acp"ematch.channel: "discord"
/acp spawn codex --bind herevincula o canal ou tópico atual do Discord no local e mantém mensagens futuras roteadas para a mesma sessão ACP.- Isso ainda pode significar “iniciar uma nova sessão ACP do Codex”, mas não cria um novo tópico do Discord por si só. O canal existente continua sendo a superfície de chat.
- O Codex ainda pode ser executado em seu próprio
cwdou workspace de backend em disco. Esse workspace é estado de runtime, não um tópico do Discord. - Mensagens do tópico podem herdar o vínculo ACP do canal pai.
- Em um canal ou tópico vinculado,
/newe/resetredefinem a mesma sessão ACP no local. - Vínculos temporários de tópico ainda funcionam e podem substituir a resolução do alvo enquanto ativos.
spawnAcpSessionssó é necessário quando o OpenClaw precisa criar/vincular um tópico filho via--thread auto|here. Não é necessário para/acp spawn ... --bind hereno canal atual.
Notificações de reação
Notificações de reação
offown(padrão)allallowlist(usaguilds.<id>.users)
Reações de confirmação
Reações de confirmação
ackReaction envia um emoji de confirmação enquanto o OpenClaw está processando uma mensagem recebida.Ordem de resolução:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- fallback para emoji de identidade do agente (
agents.list[].identity.emoji, senão ”👀”)
- O Discord aceita emoji unicode ou nomes de emoji personalizados.
- Use
""para desativar a reação para um canal ou conta.
Gravações de config
Gravações de config
/config set|unset (quando os recursos de comando estão habilitados).Desativar:Proxy do gateway
Proxy do gateway
channels.discord.proxy.Suporte ao PluralKit
Suporte ao PluralKit
- allowlists podem usar
pk:<memberId> - nomes de exibição de membro são correspondidos por nome/slug apenas quando
channels.discord.dangerouslyAllowNameMatching: true - buscas usam o ID da mensagem original e são restritas por janela de tempo
- se a busca falhar, mensagens com proxy são tratadas como mensagens de bot e descartadas, a menos que
allowBots=true
Configuração de presença
Configuração de presença
- 0: Playing
- 1: Streaming (exige
activityUrl) - 2: Listening
- 3: Watching
- 4: Custom (usa o texto da atividade como estado do status; emoji é opcional)
- 5: Competing
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(oferece suporte ao placeholder{reason})
Aprovações no Discord
Aprovações no Discord
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(opcional; usa fallback paracommands.ownerAllowFromquando possível)channels.discord.execApprovals.target(dm|channel|both, padrão:dm)agentFilter,sessionFilter,cleanupAfterResolve
enabled não está definido ou é "auto" e pelo menos um aprovador pode ser resolvido, seja a partir de execApprovals.approvers ou de commands.ownerAllowFrom. O Discord não infere aprovadores exec a partir de allowFrom do canal, dm.allowFrom legado ou defaultTo de mensagem direta. Defina enabled: false para desabilitar explicitamente o Discord como cliente nativo de aprovação.Quando target é channel ou both, o prompt de aprovação fica visível no canal. Apenas aprovadores resolvidos podem usar os botões; outros usuários recebem uma negação efêmera. Prompts de aprovação incluem o texto do comando, então habilite a entrega no canal apenas em canais confiáveis. Se o ID do canal não puder ser derivado da chave de sessão, o OpenClaw recorre à entrega por DM.O Discord também renderiza os botões de aprovação compartilhados usados por outros canais de chat. O adaptador nativo do Discord adiciona principalmente roteamento de DM para aprovadores e fanout para canal.
Quando esses botões estão presentes, eles são a UX principal de aprovação; o OpenClaw
só deve incluir um comando manual /approve quando o resultado da ferramenta disser
que aprovações via chat não estão disponíveis ou que a aprovação manual é o único caminho.A autenticação do gateway para esse manipulador usa o mesmo contrato compartilhado de resolução de credenciais que outros clientes do gateway:- autenticação local com prioridade para env (
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORDe entãogateway.auth.*) - no modo local,
gateway.remote.*pode ser usado como fallback somente quandogateway.auth.*não estiver definido; SecretRefs locais configurados, mas não resolvidos, falham fechados - suporte a modo remoto via
gateway.remote.*quando aplicável - substituições de URL são seguras para override: substituições de CLI não reutilizam credenciais implícitas, e substituições de env usam apenas credenciais de env
- IDs prefixados com
plugin:são resolvidos porplugin.approval.resolve. - Outros IDs são resolvidos por
exec.approval.resolve. - O Discord não faz aqui um salto extra de fallback de exec para plugin; o prefixo do ID decide qual método do gateway ele chama.
Ferramentas e gates de ação
As ações de mensagem do Discord incluem mensagens, administração de canal, moderação, presença e ações de metadados. Exemplos principais:- mensagens:
sendMessage,readMessages,editMessage,deleteMessage,threadReply - reações:
react,reactions,emojiList - moderação:
timeout,kick,ban - presença:
setPresence
event-create aceita um parâmetro opcional image (URL ou caminho de arquivo local) para definir a imagem de capa do evento agendado.
Os gates de ação ficam em channels.discord.actions.*.
Comportamento padrão dos gates:
| Grupo de ação | Padrão |
|---|---|
| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | habilitado |
| roles | desabilitado |
| moderation | desabilitado |
| presence | desabilitado |
UI de Components v2
O OpenClaw usa Discord components v2 para aprovações exec e marcadores de contexto cruzado. Ações de mensagem do Discord também podem aceitarcomponents para UI personalizada (avançado; requer construir uma carga de componente via ferramenta do Discord), enquanto embeds legados continuam disponíveis, mas não são recomendados.
channels.discord.ui.components.accentColordefine a cor de destaque usada por contêineres de componentes do Discord (hex).- Defina por conta com
channels.discord.accounts.<id>.ui.components.accentColor. embedssão ignorados quando components v2 estão presentes.
Canais de voz
O OpenClaw pode entrar em canais de voz do Discord para conversas contínuas em tempo real. Isso é separado de anexos de mensagens de voz. Requisitos:- Habilite comandos nativos (
commands.nativeouchannels.discord.commands.native). - Configure
channels.discord.voice. - O bot precisa de permissões Connect + Speak no canal de voz alvo.
/vc join|leave|status para controlar sessões. O comando usa o agente padrão da conta e segue as mesmas regras de allowlist e group policy que outros comandos do Discord.
Exemplo de entrada automática:
voice.ttssubstituimessages.ttsapenas para reprodução por voz.- Turnos de transcrição de voz derivam o status de owner de
allowFromdo Discord (oudm.allowFrom); falantes que não são owners não podem acessar ferramentas exclusivas de owner (por exemplogatewayecron). - Voz é habilitada por padrão; defina
channels.discord.voice.enabled=falsepara desabilitá-la. voice.daveEncryptionevoice.decryptionFailureTolerancesão repassados para as opções de entrada de@discordjs/voice.- Os padrões de
@discordjs/voicesãodaveEncryption=trueedecryptionFailureTolerance=24se não estiverem definidos. - O OpenClaw também monitora falhas de descriptografia na recepção e faz recuperação automática saindo e entrando novamente no canal de voz após falhas repetidas em uma janela curta.
- Se os logs de recepção mostrarem repetidamente
DecryptionFailed(UnencryptedWhenPassthroughDisabled), isso pode ser o bug de recepção upstream de@discordjs/voicerastreado em discord.js #11419.
Mensagens de voz
Mensagens de voz do Discord exibem uma prévia de forma de onda e exigem áudio OGG/Opus mais metadados. O OpenClaw gera a forma de onda automaticamente, mas precisa deffmpeg e ffprobe disponíveis no host do gateway para inspecionar e converter arquivos de áudio.
Requisitos e restrições:
- Forneça um caminho de arquivo local (URLs são rejeitadas).
- Omita conteúdo de texto (o Discord não permite texto + mensagem de voz na mesma carga).
- Qualquer formato de áudio é aceito; o OpenClaw converte para OGG/Opus quando necessário.
Solução de problemas
Usou intents não permitidas ou o bot não vê mensagens do servidor
Usou intents não permitidas ou o bot não vê mensagens do servidor
- habilite Message Content Intent
- habilite Server Members Intent quando você depender de resolução de usuário/membro
- reinicie o gateway após alterar as intents
Mensagens do servidor bloqueadas inesperadamente
Mensagens do servidor bloqueadas inesperadamente
- verifique
groupPolicy - verifique a allowlist de servidor em
channels.discord.guilds - se existir o mapa
guild channels, apenas os canais listados serão permitidos - verifique o comportamento de
requireMentione os padrões de menção
Require mention false mas ainda bloqueado
Require mention false mas ainda bloqueado
groupPolicy="allowlist"sem allowlist correspondente de servidor/canalrequireMentionconfigurado no lugar errado (deve ficar emchannels.discord.guildsou na entrada do canal)- remetente bloqueado pela allowlist
usersdo servidor/canal
Manipuladores de longa duração expiram ou duplicam respostas
Manipuladores de longa duração expiram ou duplicam respostas
Listener DiscordMessageListener timed out after 30000ms for event MESSAGE_CREATESlow listener detected ...discord inbound worker timed out after ...
- conta única:
channels.discord.eventQueue.listenerTimeout - múltiplas contas:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout
- conta única:
channels.discord.inboundWorker.runTimeoutMs - múltiplas contas:
channels.discord.accounts.<accountId>.inboundWorker.runTimeoutMs - padrão:
1800000(30 minutos); defina0para desabilitar
eventQueue.listenerTimeout para configuração lenta do listener e inboundWorker.runTimeoutMs
apenas se você quiser uma válvula de segurança separada para turnos de agente enfileirados.Incompatibilidades na auditoria de permissões
Incompatibilidades na auditoria de permissões
channels status --probe funcionam apenas para IDs numéricos de canal.Se você usar chaves slug, a correspondência em runtime ainda pode funcionar, mas a sondagem não consegue verificar permissões completamente.Problemas de DM e pareamento
Problemas de DM e pareamento
- DM desabilitada:
channels.discord.dm.enabled=false - política de DM desabilitada:
channels.discord.dmPolicy="disabled"(legado:channels.discord.dm.policy) - aguardando aprovação de pareamento no modo
pairing
Loops entre bots
Loops entre bots
channels.discord.allowBots=true, use regras estritas de menção e allowlist para evitar comportamento de loop.
Prefira channels.discord.allowBots="mentions" para aceitar apenas mensagens de bot que mencionem o bot.STT de voz falha com DecryptionFailed(...)
STT de voz falha com DecryptionFailed(...)
- mantenha o OpenClaw atualizado (
openclaw update) para que a lógica de recuperação de recepção de voz do Discord esteja presente - confirme
channels.discord.voice.daveEncryption=true(padrão) - comece com
channels.discord.voice.decryptionFailureTolerance=24(padrão upstream) e ajuste somente se necessário - monitore logs para:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- se as falhas continuarem após a reentrada automática, colete logs e compare com discord.js #11419
Ponteiros para a referência de configuração
Referência principal: Campos do Discord de alto sinal:- inicialização/autenticação:
enabled,token,accounts.*,allowBots - política:
groupPolicy,dm.*,guilds.*,guilds.*.channels.* - comando:
commands.native,commands.useAccessGroups,configWrites,slashCommand.* - fila de eventos:
eventQueue.listenerTimeout(orçamento do listener),eventQueue.maxQueueSize,eventQueue.maxConcurrency - worker de entrada:
inboundWorker.runTimeoutMs - resposta/histórico:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - entrega:
textChunkLimit,chunkMode,maxLinesPerMessage - streaming:
streaming(alias legado:streamMode),draftChunk,blockStreaming,blockStreamingCoalesce - mídia/retry:
mediaMaxMb,retrymediaMaxMblimita uploads de saída do Discord (padrão:100MB)
- ações:
actions.* - presença:
activity,status,activityType,activityUrl - UI:
ui.components.accentColor - recursos:
threadBindings,bindings[]de nível superior (type: "acp"),pluralkit,execApprovals,intents,agentComponents,heartbeat,responsePrefix
Segurança e operações
- Trate tokens de bot como segredos (
DISCORD_BOT_TOKENpreferido em ambientes supervisionados). - Conceda permissões do Discord com privilégio mínimo.
- Se o estado/implantação de comandos estiver desatualizado, reinicie o gateway e verifique novamente com
openclaw channels status --probe.