Emparelhamento
Comandos slash
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 emparelhá-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).Crie um aplicativo e um bot do Discord
Ative intents privilegiados
- Message Content Intent (obrigatório)
- Server Members Intent (recomendado; obrigatório para listas de permissões de funções e correspondência de nome para ID)
- Presence Intent (opcional; necessário apenas para atualizações de presença)
Copie o token do seu bot
Gere uma URL de convite e adicione o bot ao seu servidor
botapplications.commands
- Ver canais
- Enviar mensagens
- Ler histórico de mensagens
- Incorporar links
- Anexar arquivos
- Adicionar reações (opcional)
Ative o Modo de Desenvolvedor e colete seus IDs
- Clique em User Settings (ícone de engrenagem ao lado do seu avatar) → Role até Developer na barra lateral → ative Developer Mode (Observação: no aplicativo móvel do Discord, o Modo de Desenvolvedor fica em App Settings → Advanced)
- Clique com o botão direito no ícone do servidor na barra lateral → Copy Server ID
- Clique com o botão direito no seu próprio avatar → Copy User ID
Permita DMs de membros do servidor
Defina o token do seu bot com segurança (não o envie no chat)
openclaw gateway run.
Para instalações de serviço gerenciado, execute openclaw gateway install a partir de um shell em que DISCORD_BOT_TOKEN esteja presente, ou armazene a variável em ~/.openclaw/.env, para que o serviço possa resolver o SecretRef de env após a reinicialização.
Se seu host for bloqueado ou tiver limite de taxa pela consulta de aplicativo de inicialização do Discord, defina o ID de aplicativo/cliente do Discord no Portal de Desenvolvedores para que a inicialização possa pular essa chamada REST. Use channels.discord.applicationId para a conta padrão, ou channels.discord.accounts.<accountId>.applicationId quando executar vários bots do Discord.Configure o OpenClaw e emparelhe
- Pergunte ao seu agente
- CLI / configuração
“Já defini meu token de bot do Discord na configuração. Conclua a configuração do Discord com User ID<user_id>e Server ID<server_id>.”
Aprove o primeiro emparelhamento por DM
- Pergunte ao seu agente
- CLI
“Aprove este código de emparelhamento do Discord: <CODE>”
DISCORD_BOT_TOKEN é usado apenas para a conta padrão.
Se duas contas do Discord ativadas resolverem para o mesmo token de bot, o OpenClaw inicia apenas um monitor de Gateway para esse token. Um token vindo da configuração tem prioridade sobre o fallback de env padrão; caso contrário, a primeira conta ativada vence e a conta duplicada é reportada como desativada.
Para chamadas de saída avançadas (ferramenta de mensagem/ações de canal), um token explícito por chamada é usado para essa chamada. Isso se aplica a ações de envio e leitura/sondagem (por exemplo, ler/pesquisar/buscar/thread/pins/permissões). As configurações de política/tentativa da conta ainda vêm da conta selecionada no snapshot de runtime ativo.Recomendado: configure um workspace de guilda
Depois que as DMs estiverem funcionando, você pode configurar seu servidor Discord como um workspace completo, onde cada canal recebe sua própria sessão de agente com seu próprio contexto. Isso é recomendado para servidores privados em que há apenas você e seu bot.Adicione seu servidor à lista de permissões de guilda
- Pergunte ao seu agente
- Configuração
“Adicione meu Server ID do Discord <server_id> à lista de permissões de guilda”
Permita respostas sem @mention
messages.groupChat.visibleReplies: "message_tool" para que o agente possa ficar à espreita e postar apenas quando decidir que uma resposta no canal é útil. Isso funciona melhor com modelos de última geração e confiáveis em ferramentas, como GPT 5.5. Eventos de sala ambiente ficam silenciosos a menos que a ferramenta envie. Consulte Eventos de sala ambiente para a configuração completa do modo de observação.Se o Discord mostrar digitação e os logs mostrarem uso de token, mas nenhuma mensagem publicada, verifique se o turno foi configurado como um evento de sala ambiente ou optou por respostas visíveis via ferramenta de mensagem.- Pergunte ao seu agente
- Configuração
“Permita que meu agente responda neste servidor sem precisar receber @mention”
Planeje a memória em canais de guilda
- 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 de MEMORY.md.”
#coding, #home, #research ou o que se ajustar ao seu fluxo de trabalho.
Modelo de runtime
- Gateway é dono da conexão do Discord.
- O roteamento de respostas é determinístico: respostas de entrada do Discord voltam para o Discord.
- Metadados de guild/canal do Discord são adicionados ao prompt do modelo como contexto não confiável, não como um prefixo de resposta visível ao usuário. Se um modelo copiar esse envelope de volta, o OpenClaw remove os metadados copiados das respostas de saída e do contexto de reprodução futuro.
- Por padrão (
session.dmScope=main), conversas diretas compartilham a sessão principal do agente (agent:main:main). - Canais de guild são 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. - A entrega de anúncio de Cron/Heartbeat somente texto para o Discord usa a resposta final visível ao assistente uma vez. Payloads de mídia e componentes estruturados continuam em várias mensagens quando o agente emite vários payloads entregáveis.
Canais de fórum
Canais de fórum e mídia do Discord aceitam apenas publicações em threads. O OpenClaw oferece suporte a duas formas de criá-las:- Envie uma mensagem ao pai do fórum (
channel:<forumId>) para criar uma thread automaticamente. O título da thread usa a primeira linha não vazia da sua mensagem. - Use
openclaw message thread createpara criar uma thread diretamente. Não passe--message-idpara canais de fórum.
channel:<threadId>).
Componentes interativos
O OpenClaw oferece suporte a contêineres de componentes v2 do Discord para mensagens de agente. Use a ferramenta de mensagem com um payloadcomponents. Os resultados de interação são roteados de volta ao agente como mensagens de entrada 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.
Callbacks de componentes expiram após 30 minutos por padrão. Defina channels.discord.agentComponents.ttlMs para alterar esse tempo de vida do registro de callbacks para a conta padrão do Discord, ou channels.discord.accounts.<accountId>.agentComponents.ttlMs para sobrescrever uma conta em uma configuração com várias contas. O valor é em milissegundos, deve ser um inteiro positivo e é limitado a 86400000 (24 horas). TTLs mais longos são úteis para fluxos de trabalho de revisão ou aprovação que precisam que botões permaneçam utilizáveis, mas também ampliam a janela em que uma mensagem antiga do Discord ainda pode acionar uma ação. Prefira o menor TTL que atenda ao fluxo de trabalho e mantenha o padrão quando callbacks obsoletos seriam surpreendentes.
Os comandos de barra /model e /models abrem um seletor de modelo interativo com menus suspensos de provedor, modelo e runtime compatível, além de uma etapa de envio. /models add está obsoleto e agora retorna uma mensagem de obsolescência em vez de registrar modelos pelo chat. A resposta do seletor é efêmera e somente o usuário que invocou pode usá-la. Menus de seleção do Discord são limitados a 25 opções, então adicione entradas provider/* a agents.defaults.models quando quiser que o seletor mostre modelos descobertos dinamicamente apenas para provedores selecionados, como openai ou vllm.
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 sobrescrever o nome de upload quando ele deve 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 um botão de acionamento automaticamente
Controle de acesso e roteamento
- DM policy
- Access groups
- Guild policy
- Mentions and group DMs
channels.discord.dmPolicy controla o acesso por DM. channels.discord.allowFrom é a lista de permissões canônica para DM.pairing(padrão)allowlistopen(exige quechannels.discord.allowFrominclua"*")disabled
pairing).Precedência de várias contas:channels.discord.accounts.default.allowFromse aplica apenas à contadefault.- Para uma conta,
allowFromtem precedência sobre odm.allowFromlegado. - Contas nomeadas herdam
channels.discord.allowFromquando seus própriosallowFromedm.allowFromlegado não estão definidos. - Contas nomeadas não herdam
channels.discord.accounts.default.allowFrom.
channels.discord.dm.policy e channels.discord.dm.allowFrom legados ainda são lidos para compatibilidade. openclaw doctor --fix os migra para dmPolicy e allowFrom quando pode fazer isso sem alterar o acesso.Formato de destino de DM para entrega:user:<id>- menção
<@id>
allowFrom efetivo de DM da conta são tratados como destinos de DM de usuário para compatibilidade.Roteamento de agentes baseado em função
Usebindings[].match.roles para rotear membros de guildas do Discord para agentes diferentes por ID de função. Associações baseadas em função aceitam apenas IDs de função e são avaliadas depois de associações de par ou par pai e antes de associações somente de guilda. Se uma associação também definir outros campos de correspondência (por exemplo peer + guildId + roles), todos os campos configurados devem corresponder.
Comandos nativos e autenticação de comandos
commands.nativeusa"auto"como padrão e é habilitado para Discord.- Substituição por canal:
channels.discord.commands.native. commands.native=falseignora o registro e a limpeza de comandos de barra do Discord durante a inicialização. Comandos registrados anteriormente podem permanecer visíveis no Discord até que você os remova do app do Discord.- A autenticação de comandos nativos usa as mesmas listas de permissão/políticas do Discord que o tratamento normal de mensagens.
- Os comandos ainda podem ficar visíveis na interface do Discord para usuários que não estão autorizados; a execução ainda aplica a autenticação do OpenClaw e retorna “não autorizado”.
ephemeral: true
Detalhes do recurso
Link previews
Link previews
channels.discord.accounts.<id>.suppressEmbeds para substituir em uma conta. Envios pela ferramenta de mensagens do agente também podem passar suppressEmbeds: false para uma única mensagem. Payloads explícitos de embeds do Discord não são suprimidos pela configuração padrão de prévia de links.Live stream preview
Live stream preview
channels.discord.streaming aceita off | partial | block | progress (padrão). progress mantém um rascunho de status editável e o atualiza com o progresso de ferramentas até a entrega final; o rótulo inicial compartilhado é uma linha contínua, então ele rola para fora como o restante quando trabalho suficiente aparece. streamMode é um alias de runtime legado. Execute openclaw doctor --fix para regravar a configuração persistida para a chave canônica.Defina channels.discord.streaming.mode como off para desabilitar edições de prévia do Discord. Se a transmissão em bloco do Discord estiver explicitamente habilitada, o OpenClaw ignora a transmissão de prévia para evitar transmissão duplicada.partialedita uma única mensagem de prévia conforme tokens chegam.blockemite blocos do tamanho de rascunho (usedraftChunkpara ajustar tamanho e pontos de quebra, limitado atextChunkLimit).- Finais com mídia, erro e resposta explícita cancelam edições de prévia pendentes.
streaming.preview.toolProgress(padrãotrue) controla se atualizações de ferramenta/progresso reutilizam a mensagem de prévia.- Linhas de ferramenta/progresso são renderizadas como emoji compacto + título + detalhe quando disponível, por exemplo
🛠️ Bash: run testsou🔎 Web Search: for "query". streaming.progress.commentary(padrãofalse) opta por incluir texto de comentário/preâmbulo do assistente no rascunho temporário de progresso. O comentário é limpo antes da exibição, permanece transitório e não altera a entrega da resposta final.streaming.progress.maxLineCharscontrola o orçamento de prévia de progresso por linha. A prosa é encurtada nos limites de palavras; detalhes de comando e caminho mantêm sufixos úteis.streaming.preview.commandText/streaming.progress.commandTextcontrola detalhes de comando/execução em linhas compactas de progresso:raw(padrão) oustatus(somente rótulo da ferramenta).
block é explicitamente habilitada, o OpenClaw ignora a transmissão de prévia para evitar transmissão duplicada.History, context, and thread behavior
History, context, and thread behavior
channels.discord.historyLimitpadrão20- fallback:
messages.groupChat.historyLimit 0desabilita
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- Threads do Discord são roteadas como sessões de canal e herdam a configuração do canal pai, a menos que substituídas.
- Sessões de thread herdam a seleção de
/modelem nível de sessão do canal pai como fallback somente de modelo; seleções de/modellocais à thread ainda têm precedência, e o histórico de transcrição do pai não é copiado, a menos que a herança de transcrição esteja habilitada. channels.discord.thread.inheritParent(padrãofalse) faz com que novas auto-threads sejam semeadas a partir da transcrição pai. Substituições por conta ficam emchannels.discord.accounts.<id>.thread.inheritParent.- Reações da ferramenta de mensagens podem resolver alvos de DM
user:<id>. guilds.<guild>.channels.<channel>.requireMention: falseé preservado durante o fallback de ativação na etapa de resposta.
Thread-bound sessions for subagents
Thread-bound sessions for subagents
/focus <target>associa a thread atual/nova a um alvo de subagente/sessão/unfocusremove a associação da thread atual/agentsmostra execuções ativas e o estado de associação/session idle <duration|off>inspeciona/atualiza o desfoco automático por inatividade para associações focadas/session max-age <duration|off>inspeciona/atualiza a idade máxima rígida para associações focadas
session.threadBindings.*define padrões globais.channels.discord.threadBindings.*substitui o comportamento do Discord.spawnSessionscontrola a criação/associação automática de threads parasessions_spawn({ thread: true })e spawns de thread ACP. Padrão:true.defaultSpawnContextcontrola o contexto nativo de subagente para spawns associados a thread. Padrão:"fork".- Chaves obsoletas
spawnSubagentSessions/spawnAcpSessionssão migradas poropenclaw doctor --fix. - Se associações de thread estiverem desabilitadas para uma conta,
/focuse operações relacionadas de associação de thread ficam indisponíveis.
Persistent ACP channel bindings
Persistent ACP channel bindings
bindings[]comtype: "acp"ematch.channel: "discord"
/acp spawn codex --bind hereassocia o canal ou a thread atual no local e mantém mensagens futuras na mesma sessão ACP. Mensagens de thread herdam a associação do canal pai.- Em um canal ou thread associado,
/newe/resetredefinem a mesma sessão ACP no local. Associações temporárias de thread podem substituir a resolução de alvo enquanto ativas. spawnSessionscontrola a criação/associação de threads filhas via--thread auto|here.
Reaction notifications
Reaction notifications
offown(padrão)allallowlist(usaguilds.<id>.users)
Ack reactions
Ack reactions
ackReaction envia um emoji de confirmação enquanto o OpenClaw processa uma mensagem de entrada.Ordem de resolução:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- fallback de emoji da identidade do agente (
agents.list[].identity.emoji, senão ”👀”)
- O Discord aceita emoji unicode ou nomes de emoji personalizados.
- Use
""para desabilitar a reação para um canal ou conta.
Config writes
Config writes
/config set|unset (quando recursos de comando estão habilitados).Desabilitar:Gateway proxy
Gateway proxy
channels.discord.proxy.
O proxy WebSocket do Gateway do Discord é explícito; conexões WebSocket não herdam variáveis de ambiente de proxy do ambiente do processo do Gateway. Consultas REST de inicialização usam esse proxy quando channels.discord.proxy está configurado.PluralKit support
PluralKit support
- listas de permissão podem usar
pk:<memberId> - nomes de exibição de membros são correspondidos por nome/slug somente quando
channels.discord.dangerouslyAllowNameMatching: true - consultas usam o ID da mensagem original e são limitadas por janela de tempo
- se a consulta falhar, mensagens intermediadas são tratadas como mensagens de bot e descartadas, a menos que
allowBots=true
Outbound mention aliases
Outbound mention aliases
mentionAliases quando agentes precisarem de menções de saída determinísticas para usuários conhecidos do Discord. As chaves são identificadores sem o @ inicial; os valores são IDs de usuários do Discord. Identificadores desconhecidos, @everyone, @here e menções dentro de spans de código Markdown permanecem inalterados.Presence configuration
Presence configuration
- 0: Jogando
- 1: Streaming (requer
activityUrl) - 2: Ouvindo
- 3: Assistindo
- 4: Personalizado (usa o texto da atividade como estado do status; emoji é opcional)
- 5: Competindo
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(aceita o placeholder{reason})
Approvals in Discord
Approvals in Discord
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(opcional; recorre acommands.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 de execApprovals.approvers ou de commands.ownerAllowFrom. O Discord não infere aprovadores de exec a partir de allowFrom do canal, dm.allowFrom legado ou defaultTo de mensagens diretas. Defina enabled: false para desativar explicitamente o Discord como cliente de aprovação nativo.Para comandos de grupo confidenciais exclusivos do proprietário, como /diagnostics e /export-trajectory, o OpenClaw envia solicitações de aprovação e resultados finais de forma privada. Ele tenta primeiro uma DM do Discord quando o proprietário que invocou o comando tem uma rota de proprietário do Discord; se isso não estiver disponível, recorre à primeira rota de proprietário disponível em commands.ownerAllowFrom, como Telegram.Quando target é channel ou both, a solicitação de aprovação fica visível no canal. Somente aprovadores resolvidos podem usar os botões; outros usuários recebem uma negativa efêmera. Solicitações de aprovação incluem o texto do comando, portanto ative a entrega no canal somente em canais confiáveis. Se o ID do canal não puder ser derivado da chave da 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 de 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 por chat estão indisponíveis ou que a aprovação manual é o único caminho.
Se o runtime de aprovação nativa do Discord não estiver ativo, o OpenClaw mantém o
prompt determinístico local /approve <id> <decision> visível. Se o
runtime estiver ativo, mas um cartão nativo não puder ser entregue a nenhum destino,
o OpenClaw envia um aviso de fallback no mesmo chat com o comando /approve
exato da aprovação pendente.A autenticação do Gateway e a resolução de aprovações seguem o contrato compartilhado do cliente Gateway (IDs plugin: são resolvidos por plugin.approval.resolve; outros IDs por exec.approval.resolve). Aprovações expiram após 30 minutos por padrão.Consulte Aprovações de exec.Ferramentas e controles de ação
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.
Controles de ação ficam em channels.discord.actions.*.
Comportamento padrão dos controles:
| Grupo de ações | Padrão |
|---|---|
| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | ativado |
| roles | desativado |
| moderation | desativado |
| presence | desativado |
UI de componentes v2
O OpenClaw usa componentes v2 do Discord para aprovações de exec e marcadores entre contextos. Ações de mensagem do Discord também podem aceitarcomponents para UI personalizada (avançado; requer construir um payload de componente via a ferramenta discord), enquanto embeds legados continuam disponíveis, mas não são recomendados.
channels.discord.ui.components.accentColordefine a cor de destaque usada pelos contêineres de componentes do Discord (hex).- Defina por conta com
channels.discord.accounts.<id>.ui.components.accentColor. channels.discord.agentComponents.ttlMscontrola por quanto tempo callbacks de componentes do Discord enviados permanecem registrados (padrão1800000, máximo86400000). Defina por conta comchannels.discord.accounts.<id>.agentComponents.ttlMs.embedssão ignorados quando componentes v2 estão presentes.- Pré-visualizações de URL simples são suprimidas por padrão. Defina
suppressEmbeds: falseem uma ação de mensagem quando um único link de saída deve ser expandido.
Voz
O Discord tem duas superfícies de voz distintas: canais de voz em tempo real (conversas contínuas) e anexos de mensagem de voz (o formato de pré-visualização de forma de onda). O Gateway oferece suporte a ambos.Canais de voz
Checklist de configuração:- Ative Message Content Intent no Discord Developer Portal.
- Ative Server Members Intent quando listas de permissão por função/usuário forem usadas.
- Convide o bot com os escopos
boteapplications.commands. - Conceda Connect, Speak, Send Messages e Read Message History no canal de voz de destino.
- Ative comandos nativos (
commands.nativeouchannels.discord.commands.native). - Configure
channels.discord.voice.
/vc join|leave|status para controlar sessões. O comando usa o agente padrão da conta e segue as mesmas regras de lista de permissão e política de grupo de outros comandos do Discord.
voice.ttssubstituimessages.ttsapenas para reprodução de vozstt-tts. Modos em tempo real usamvoice.realtime.speakerVoice.voice.modecontrola o caminho da conversa. O padrão éagent-proxy: um front-end de voz em tempo real gerencia o tempo dos turnos, interrupção e reprodução, delega o trabalho substantivo ao agente OpenClaw roteado por meio deopenclaw_agent_consulte trata o resultado como um prompt digitado do Discord daquele falante.stt-ttsmantém o fluxo em lote mais antigo de STT mais TTS.bidipermite que o modelo em tempo real converse diretamente enquanto expõeopenclaw_agent_consultpara o cérebro do OpenClaw.voice.agentSessioncontrola qual conversa do OpenClaw recebe turnos de voz. Deixe sem definir para a sessão própria do canal de voz, ou defina{ mode: "target", target: "channel:<text-channel-id>" }para fazer o canal de voz atuar como a extensão de microfone/alto-falante de uma sessão existente de canal de texto do Discord, como#maintainers.voice.modelsubstitui o cérebro do agente OpenClaw para respostas de voz do Discord e consultas em tempo real. Deixe sem definir para herdar o modelo do agente roteado. Ele é separado devoice.realtime.model.voice.followUserspermite que o bot entre, se mova e saia da voz do Discord com usuários selecionados. Veja Seguir usuários na voz para regras de comportamento e exemplos.agent-proxyroteia fala pordiscord-voice, que preserva a autorização normal de proprietário/ferramenta para o falante e a sessão de destino, mas oculta a ferramentattsdo agente porque a voz do Discord controla a reprodução. Por padrão,agent-proxydá à consulta acesso total a ferramentas equivalente ao proprietário para falantes proprietários (voice.realtime.toolPolicy: "owner") e prefere fortemente consultar o agente OpenClaw antes de respostas substantivas (voice.realtime.consultPolicy: "always"). Nesse modo padrãoalways, a camada em tempo real não fala automaticamente preenchimento antes da resposta da consulta; ela captura e transcreve a fala, depois fala a resposta roteada do OpenClaw. Se várias respostas de consulta forçada terminarem enquanto o Discord ainda estiver reproduzindo a primeira resposta, respostas posteriores de fala exata serão enfileiradas até a reprodução ficar ociosa, em vez de substituir a fala no meio da frase.- No modo
stt-tts, o STT usatools.media.audio;voice.modelnão afeta a transcrição. - Em modos em tempo real,
voice.realtime.provider,voice.realtime.modelevoice.realtime.speakerVoiceconfiguram a sessão de áudio em tempo real. Para OpenAI Realtime 2 mais o cérebro Codex, usevoice.realtime.model: "gpt-realtime-2"evoice.model: "openai/gpt-5.5". - Modos de voz em tempo real incluem pequenos arquivos de perfil
IDENTITY.md,USER.mdeSOUL.mdnas instruções do provedor em tempo real por padrão, para que turnos diretos rápidos mantenham a mesma identidade, base do usuário e persona do agente OpenClaw roteado. Definavoice.realtime.bootstrapContextFilescomo um subconjunto para personalizar isso, ou[]para desativar. Os arquivos de inicialização em tempo real compatíveis são limitados a esses arquivos de perfil;AGENTS.mdpermanece no contexto normal do agente. O contexto de perfil injetado não substituiopenclaw_agent_consultpara trabalho no workspace, fatos atuais, busca de memória ou ações apoiadas por ferramentas. - No modo em tempo real
agent-proxyda OpenAI, definavoice.realtime.requireWakeName: truepara manter a voz em tempo real do Discord silenciosa até que uma transcrição comece ou termine com um nome de ativação. Nomes de ativação configurados devem ter uma ou duas palavras. Sevoice.realtime.wakeNamesnão estiver definido, o OpenClaw usa onamedo agente roteado maisOpenClaw, recorrendo ao id do agente maisOpenClaw. O bloqueio por nome de ativação desativa a resposta automática do provedor em tempo real, roteia turnos aceitos pelo caminho de consulta do agente OpenClaw e dá uma breve confirmação falada quando um nome de ativação inicial é reconhecido pela transcrição parcial antes da transcrição final chegar. - O provedor em tempo real da OpenAI aceita nomes de eventos atuais do Realtime 2 e aliases legados compatíveis com Codex para eventos de áudio de saída e transcrição, para que snapshots compatíveis do provedor possam divergir sem descartar áudio do assistente.
voice.realtime.bargeIncontrola se eventos de início de fala no Discord interrompem a reprodução ativa em tempo real. Se não estiver definido, segue a configuração de interrupção de áudio de entrada do provedor em tempo real.voice.realtime.minBargeInAudioEndMscontrola a duração mínima de reprodução do assistente antes que uma interrupção em tempo real da OpenAI trunque o áudio. Padrão:250. Defina0para interrupção imediata em salas com pouco eco, ou aumente para configurações de alto-falantes com muito eco.- Para uma voz da OpenAI na reprodução do Discord, defina
voice.tts.provider: "openai"e escolha uma voz de Text-to-speech emvoice.tts.providers.openai.speakerVoice.cedaré uma boa escolha com sonoridade masculina no modelo TTS atual da OpenAI. - Substituições de
systemPromptpor canal do Discord se aplicam a turnos de transcrição de voz desse canal de voz. - Turnos de transcrição de voz derivam o status de proprietário de
allowFrom(oudm.allowFrom) do Discord para comandos protegidos por proprietário e ações de canal. A visibilidade das ferramentas do agente segue a política de ferramentas configurada para a sessão roteada. - Voz do Discord é opcional para configurações somente texto; defina
channels.discord.voice.enabled=true(ou mantenha um blocochannels.discord.voiceexistente) para habilitar comandos/vc, o runtime de voz e a intent de GatewayGuildVoiceStates. channels.discord.intents.voiceStatespode substituir explicitamente a assinatura de intent de estado de voz. Deixe sem definir para que a intent siga a ativação efetiva de voz.- Se
voice.autoJointiver várias entradas para o mesmo servidor, o OpenClaw entra no último canal configurado para esse servidor. voice.allowedChannelsé uma lista opcional de permissão de residência. Deixe sem definir para permitir/vc joinem qualquer canal de voz autorizado do Discord. Quando definida,/vc join, entrada automática na inicialização e movimentos de estado de voz do bot ficam restritos às entradas{ guildId, channelId }listadas. Defina como um array vazio para negar todas as entradas em voz do Discord. Se o Discord mover o bot para fora da lista de permissão, o OpenClaw sai desse canal e retorna ao destino configurado de entrada automática quando houver um disponível.voice.daveEncryptionevoice.decryptionFailureTolerancesão repassados às opções de entrada de@discordjs/voice.- Os padrões de
@discordjs/voicesãodaveEncryption=trueedecryptionFailureTolerance=24se não forem definidos. - O OpenClaw usa o codec
libopus-wasmincluído para recebimento de voz do Discord e reprodução PCM bruta em tempo real. Ele inclui uma build WebAssembly fixada da libopus e não exige addons opus nativos. voice.connectTimeoutMscontrola a espera inicial por Ready de@discordjs/voicepara tentativas de/vc joine entrada automática. Padrão:30000.voice.reconnectGraceMscontrola por quanto tempo o OpenClaw espera que uma sessão de voz desconectada comece a se reconectar antes de destruí-la. Padrão:15000.- No modo
stt-tts, a reprodução de voz não para só porque outro usuário começa a falar. Para evitar loops de feedback, o OpenClaw ignora nova captura de voz enquanto o TTS está reproduzindo; fale depois que a reprodução terminar para o próximo turno. Modos em tempo real encaminham inícios de fala como sinais de interrupção ao provedor em tempo real. - Em modos em tempo real, eco de alto-falantes em um microfone aberto pode parecer interrupção e interromper a reprodução. Para salas do Discord com muito eco, defina
voice.realtime.providers.openai.interruptResponseOnInputAudio: falsepara impedir que a OpenAI interrompa automaticamente com áudio de entrada. Adicionevoice.realtime.bargeIn: truese você ainda quiser que eventos de início de fala do Discord interrompam a reprodução ativa. A ponte em tempo real da OpenAI ignora truncamentos de reprodução menores quevoice.realtime.minBargeInAudioEndMscomo provável eco/ruído e os registra como ignorados em vez de limpar a reprodução do Discord. voice.captureSilenceGraceMscontrola por quanto tempo o OpenClaw espera depois que o Discord informa que um falante parou antes de finalizar esse segmento de áudio para STT. Padrão:2000; aumente isso se o Discord dividir pausas normais em transcrições parciais picotadas.- Quando ElevenLabs é o provedor TTS selecionado, a reprodução de voz do Discord usa TTS por streaming e começa a partir do stream de resposta do provedor. Provedores sem suporte a streaming recorrem ao caminho de arquivo temporário sintetizado.
- O OpenClaw também monitora falhas de descriptografia de recebimento e se recupera automaticamente saindo e entrando novamente no canal de voz após falhas repetidas em uma janela curta.
- Se os logs de recebimento mostrarem repetidamente
DecryptionFailed(UnencryptedWhenPassthroughDisabled)após a atualização, colete um relatório de dependências e logs. A linha incluída de@discordjs/voicecontém a correção de padding upstream do PR #11449 do discord.js, que fechou a issue #11419 do discord.js. - Eventos de recebimento
The operation was abortedsão esperados quando o OpenClaw finaliza um segmento capturado de falante; são diagnósticos detalhados, não avisos. - Logs detalhados de voz do Discord incluem uma prévia limitada de uma linha da transcrição STT para cada segmento de falante aceito, para que a depuração mostre tanto o lado do usuário quanto o lado da resposta do agente sem despejar texto de transcrição ilimitado.
- No modo
agent-proxy, o fallback de consulta forçada ignora fragmentos de transcrição provavelmente incompletos, como texto terminando em...ou um conector final comoand, além de encerramentos obviamente não acionáveis como “já volto” ou “tchau”. Os logs mostramforced agent consult skipped reason=...quando isso impede uma resposta enfileirada obsoleta.
Seguir usuários na voz
Usevoice.followUsers quando você quiser que o bot de voz do Discord fique com um ou mais usuários conhecidos do Discord em vez de entrar em um canal fixo na inicialização ou esperar por /vc join.
followUsersaceita IDs brutos de usuário do Discord e valoresdiscord:<id>. O OpenClaw normaliza as duas formas antes de corresponder eventos de estado de voz.followUsersEnabledusatruecomo padrão quandofollowUsersestá configurado. Defina comofalsepara manter a lista salva, mas interromper o acompanhamento automático de voz.- Quando um usuário seguido entra em um canal de voz permitido, o OpenClaw entra nesse canal. Quando o usuário se move, o OpenClaw se move com ele. Quando o usuário seguido ativo se desconecta, o OpenClaw sai.
- Se vários usuários seguidos estiverem no mesmo servidor e o usuário seguido ativo sair, o OpenClaw se move para o canal de outro usuário seguido rastreado antes de sair do servidor. Se vários usuários seguidos se moverem ao mesmo tempo, o evento de estado de voz observado mais recente vence.
allowedChannelsainda se aplica. Um usuário seguido em um canal não permitido é ignorado, e uma sessão controlada por acompanhamento se move para outro usuário seguido ou sai.- O OpenClaw reconcilia eventos de estado de voz perdidos na inicialização e em um intervalo limitado. A reconciliação amostra servidores configurados e limita buscas REST por execução, então listas
followUsersmuito grandes podem levar mais de um intervalo para convergir. - Se o Discord ou um administrador mover o bot enquanto ele está seguindo um usuário, o OpenClaw reconstrói a sessão de voz e preserva a propriedade de acompanhamento quando o destino é permitido. Se o bot for movido para fora de
allowedChannels, o OpenClaw sai e retorna ao destino configurado quando houver um. - A recuperação de recebimento DAVE pode sair e entrar novamente no mesmo canal após falhas repetidas de descriptografia. Sessões controladas por acompanhamento mantêm sua propriedade de acompanhamento por esse caminho de recuperação, então uma desconexão posterior do usuário seguido ainda faz o canal ser deixado.
- Use
followUserspara configurações pessoais ou de operador em que o bot deve estar automaticamente na voz quando você estiver. - Use
autoJoinpara bots de sala fixa que devem estar presentes mesmo quando nenhum usuário rastreado estiver na voz. - Use
/vc joinpara entradas pontuais ou salas em que presença automática na voz seria inesperada.
- Os logs de recebimento de voz mostram
discord voice: opus decoder: libopus-wasm. - A reprodução em tempo real codifica PCM estéreo bruto de 48 kHz para Opus com o mesmo pacote
libopus-wasmincluído antes de entregar os pacotes ao@discordjs/voice. - A reprodução de arquivos e fluxos de provedor transcodifica para PCM estéreo bruto de 48 kHz com ffmpeg e, em seguida, usa
libopus-wasmpara o fluxo de pacotes Opus enviado ao Discord.
- A captura PCM do Discord é convertida em um arquivo temporário WAV.
tools.media.audiolida com STT, por exemploopenai/gpt-4o-mini-transcribe.- A transcrição é enviada pelo ingresso e roteamento do Discord enquanto o LLM de resposta é executado com uma política de saída por voz que oculta a ferramenta
ttsdo agente e solicita texto retornado, porque a voz do Discord controla a reprodução final de TTS. voice.model, quando definido, substitui apenas o LLM de resposta para esta rodada de canal de voz.voice.ttsé mesclado sobremessages.tts; provedores compatíveis com streaming alimentam o player diretamente, caso contrário o arquivo de áudio resultante é reproduzido no canal conectado.
voice.agentSession, cada canal de voz recebe sua própria sessão roteada do OpenClaw. Por exemplo, /vc join channel:234567890123456789 conversa com a sessão desse canal de voz do Discord. O modelo em tempo real é apenas a interface de voz; solicitações substantivas são entregues ao agente OpenClaw configurado. Se o modelo em tempo real produzir uma transcrição final sem chamar a ferramenta de consulta, o OpenClaw força a consulta como fallback para que o padrão ainda se comporte como falar com o agente.
Exemplo legado de STT mais TTS:
agent-proxy, o bot entra no canal de voz configurado, mas as rodadas do agente OpenClaw usam a sessão roteada normal e o agente do canal de destino. A sessão de voz em tempo real fala o resultado retornado de volta no canal de voz. O agente supervisor ainda pode usar ferramentas normais de mensagem de acordo com sua política de ferramentas, incluindo enviar uma mensagem separada no Discord se essa for a ação correta.
Enquanto uma execução delegada do OpenClaw estiver ativa, novas transcrições de voz do Discord são tratadas como controle de execução ao vivo antes de iniciar outra rodada do agente. Frases como “status”, “cancel that”, “use the smaller fix” ou “when you’re done also check tests” são classificadas como entrada de status, cancelamento, direcionamento ou acompanhamento para a sessão ativa. Resultados de status, cancelamento, direcionamento aceito e acompanhamento são falados de volta no canal de voz para que quem chamou saiba se o OpenClaw lidou com a solicitação.
Formas de destino úteis:
target: "channel:123456789012345678"é roteado por meio de uma sessão de canal de texto do Discord.target: "123456789012345678"é tratado como um alvo de canal.target: "dm:123456789012345678"outarget: "user:123456789012345678"é roteado por meio dessa sessão de mensagem direta.
bargeIn: true permite que eventos de início de fala do Discord e áudio de falante já ativo cancelem respostas realtime ativas antes que o próximo turno capturado chegue ao OpenAI. Sinais de interrupção muito iniciais com audioEndMs abaixo de minBargeInAudioEndMs são tratados como provável eco/ruído e ignorados para que o modelo não seja cortado no primeiro quadro de reprodução.
Logs de voz esperados:
- Ao entrar:
discord voice: joining ... voiceSession=... supervisorSession=... agentSessionMode=... voiceModel=... realtimeModel=... - Ao iniciar realtime:
discord voice: realtime bridge starting ... autoRespond=false interruptResponse=false bargeIn=false minBargeInAudioEndMs=... - Em áudio de falante:
discord voice: realtime speaker turn opened ...,discord voice: realtime input audio started ... outputAudioMs=... outputActive=...ediscord voice: realtime speaker turn closed ... chunks=... discordBytes=... realtimeBytes=... interruptedPlayback=... - Em fala antiga ignorada:
discord voice: realtime forced agent consult skipped reason=incomplete-transcript ...oureason=non-actionable-closing ... - Na conclusão da resposta realtime:
discord voice: realtime audio playback finishing reason=response.done ... audioMs=... chunks=... - Ao parar/redefinir a reprodução:
discord voice: realtime audio playback stopped reason=... audioMs=... elapsedMs=... chunks=... - Em consulta realtime:
discord voice: realtime consult requested ... voiceSession=... supervisorSession=... question=... - Em resposta do agente:
discord voice: agent turn answer ... - Em fala exata enfileirada:
discord voice: realtime exact speech queued ... queued=... outputAudioMs=... outputActive=..., seguido pordiscord voice: realtime exact speech dequeued reason=player-idle ... - Na detecção de barge-in:
discord voice: realtime barge-in detected source=speaker-start ...oudiscord voice: realtime barge-in detected source=active-speaker-audio ..., seguido pordiscord voice: realtime barge-in requested reason=... outputAudioMs=... outputActive=... - Na interrupção realtime:
discord voice: realtime model interrupt requested client:response.cancel reason=barge-in, seguido pordiscord voice: realtime model audio truncated client:conversation.item.truncate reason=barge-in audioEndMs=...oudiscord voice: realtime model interrupt confirmed server:response.done status=cancelled ... - Em eco/ruído ignorado:
discord voice: realtime model interrupt ignored client:conversation.item.truncate.skipped reason=barge-in audioEndMs=0 minAudioEndMs=250 - Com barge-in desativado:
discord voice: realtime capture ignored during playback (barge-in disabled) ... - Em reprodução ociosa:
discord voice: realtime barge-in ignored reason=... outputActive=false ... playbackChunks=0
realtime audio playback startedsignifica que o Discord começou a reproduzir áudio do assistente. A ponte começa a contar blocos de saída do assistente, bytes PCM do Discord, bytes realtime do provedor e duração de áudio sintetizado a partir desse ponto.realtime speaker turn openedmarca um falante do Discord se tornando ativo. Se a reprodução já estiver ativa ebargeInestiver habilitado, isso pode ser seguido porbarge-in detected source=speaker-start.realtime input audio startedmarca o primeiro quadro de áudio real recebido para esse turno de falante.outputActive=trueou umoutputAudioMsdiferente de zero aqui significa que o microfone está enviando entrada enquanto a reprodução do assistente ainda está ativa.barge-in detected source=active-speaker-audiosignifica que o OpenClaw viu áudio de falante ao vivo enquanto a reprodução do assistente estava ativa. Isso é útil para distinguir uma interrupção real de um evento de início de fala do Discord sem áudio útil.barge-in requested reason=...significa que o OpenClaw pediu ao provedor realtime para cancelar ou truncar a resposta ativa. Ele incluioutputAudioMs,outputActiveeplaybackChunkspara que você possa ver quanto áudio do assistente realmente havia sido reproduzido antes da interrupção.realtime audio playback stopped reason=...é o ponto local de redefinição da reprodução do Discord. O motivo diz quem parou a reprodução:barge-in,player-idle,provider-clear-audio,forced-agent-consult,stream-closeousession-close.realtime speaker turn closedresume o turno de entrada capturado.chunks=0ouhasAudio=falsesignifica que o turno de falante abriu, mas nenhum áudio utilizável chegou à ponte realtime.interruptedPlayback=truesignifica que esse turno de entrada se sobrepôs à saída do assistente e acionou a lógica de barge-in.
outputAudioMs: duração do áudio do assistente gerada pelo provedor realtime antes da linha de log.audioMs: duração do áudio do assistente que o OpenClaw contou antes de a reprodução parar.elapsedMs: tempo de relógio decorrido entre abrir e fechar o fluxo de reprodução ou o turno de falante.discordBytes: bytes PCM estéreo de 48 kHz enviados para ou recebidos da voz do Discord.realtimeBytes: bytes PCM no formato do provedor enviados para ou recebidos do provedor realtime.playbackChunks: blocos de áudio do assistente encaminhados ao Discord para a resposta ativa.sinceLastAudioMs: intervalo entre o último quadro de áudio de falante capturado e o fechamento do turno de falante.
- Corte imediato com
source=active-speaker-audio,outputAudioMspequeno e o mesmo usuário por perto geralmente indica eco do alto-falante entrando no microfone. Aumentevoice.realtime.minBargeInAudioEndMs, reduza o volume do alto-falante, use fones de ouvido ou definavoice.realtime.providers.openai.interruptResponseOnInputAudio: false. source=speaker-startseguido porspeaker turn closed ... hasAudio=falsesignifica que o Discord informou um início de fala, mas nenhum áudio chegou ao OpenClaw. Isso pode ser um evento transitório de voz do Discord, comportamento de gate de ruído ou um cliente acionando brevemente o microfone.audio playback stopped reason=stream-closesem um barge-in próximo ouprovider-clear-audiosignifica que o fluxo local de reprodução do Discord terminou inesperadamente. Verifique os logs anteriores do provedor e do player do Discord.capture ignored during playback (barge-in disabled)significa que o OpenClaw descartou intencionalmente a entrada enquanto o áudio do assistente estava ativo. Habilitevoice.realtime.bargeInse quiser que a fala interrompa a reprodução.barge-in ignored ... outputActive=falsesignifica que o VAD do Discord ou do provedor informou fala, mas o OpenClaw não tinha reprodução ativa para interromper. Isso não deve cortar o áudio.
voice.model, autenticação STT para tools.media.audio, autenticação TTS para messages.tts/voice.tts e autenticação do provedor realtime para voice.realtime.providers ou a configuração normal de autenticação do provedor.
Mensagens de voz
Mensagens de voz do Discord mostram uma prévia de forma de onda e exigem áudio OGG/Opus. O OpenClaw gera a forma de onda automaticamente, mas precisa deffmpeg e ffprobe no host do gateway para inspecionar e converter.
- Forneça um caminho de arquivo local (URLs são rejeitadas).
- Omita conteúdo de texto (o Discord rejeita texto + mensagem de voz no mesmo payload).
- Qualquer formato de áudio é aceito; o OpenClaw converte para OGG/Opus conforme necessário.
Solução de problemas
Intents não permitidos usados ou o bot não vê mensagens de guilda
Intents não permitidos usados ou o bot não vê mensagens de guilda
- habilite Message Content Intent
- habilite Server Members Intent quando você depender da resolução de usuário/membro
- reinicie o gateway depois de alterar intents
Mensagens de guilda bloqueadas inesperadamente
Mensagens de guilda bloqueadas inesperadamente
- verifique
groupPolicy - verifique a allowlist de guildas em
channels.discord.guilds - se o mapa
channelsda guilda existir, somente os canais listados serão permitidos - verifique o comportamento de
requireMentione os padrões de menção
Require mention falso, mas ainda bloqueado
Require mention falso, mas ainda bloqueado
groupPolicy="allowlist"sem allowlist de guilda/canal correspondenterequireMentionconfigurado no lugar errado (deve ficar emchannels.discord.guildsou na entrada do canal)- remetente bloqueado pela allowlist
usersda guilda/canal
Turnos longos do Discord ou respostas duplicadas
Turnos longos do Discord ou respostas duplicadas
Slow listener detected ...stuck session: sessionKey=agent:...:discord:... state=processing ...
- conta única:
channels.discord.eventQueue.listenerTimeout - várias contas:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout - isso controla apenas o trabalho do listener do gateway do Discord, não a duração do turno do agente
Avisos de tempo limite na busca de metadados do Gateway
Avisos de tempo limite na busca de metadados do Gateway
/gateway/bot do Discord antes de conectar. Falhas transitórias recorrem à URL padrão do gateway do Discord e são limitadas por taxa nos logs.Controles de tempo limite de metadados:- conta única:
channels.discord.gatewayInfoTimeoutMs - várias contas:
channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs - fallback de env quando a configuração não está definida:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - padrão:
30000(30 segundos), máximo:120000
Reinícios por tempo limite de READY do Gateway
Reinícios por tempo limite de READY do Gateway
READY do gateway do Discord durante a inicialização e após reconexões de runtime. Configurações com várias contas e escalonamento de inicialização podem precisar de uma janela READY de inicialização maior que o padrão.Controles de tempo limite de READY:- inicialização com conta única:
channels.discord.gatewayReadyTimeoutMs - inicialização com várias contas:
channels.discord.accounts.<accountId>.gatewayReadyTimeoutMs - fallback de env de inicialização quando a configuração não está definida:
OPENCLAW_DISCORD_READY_TIMEOUT_MS - padrão de inicialização:
15000(15 segundos), máximo:120000 - runtime com conta única:
channels.discord.gatewayRuntimeReadyTimeoutMs - runtime com várias contas:
channels.discord.accounts.<accountId>.gatewayRuntimeReadyTimeoutMs - fallback de env de runtime quando a configuração não está definida:
OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS - padrão de runtime:
30000(30 segundos), máximo:120000
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 o probe não consegue verificar permissões por completo.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 de bot para bot
Loops de bot para bot
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.O OpenClaw também inclui proteção contra loop de bots compartilhada. Sempre que allowBots permite que mensagens criadas por bots cheguem ao dispatch, o Discord mapeia o evento de entrada para fatos de (conta, canal, par de bots) e a proteção genérica de par suprime o par depois que ele ultrapassa o orçamento de eventos configurado. A proteção evita loops descontrolados entre dois bots que antes precisavam ser interrompidos pelos limites de taxa do Discord; ela não afeta implantações com um único bot nem respostas pontuais de bots que permanecem abaixo do orçamento.Configurações padrão (ativas quando allowBots está definido):maxEventsPerWindow: 20— o par de bots pode trocar 20 mensagens dentro da janela deslizantewindowSeconds: 60— duração da janela deslizantecooldownSeconds: 60— quando o orçamento é atingido, toda mensagem adicional de bot para bot em qualquer direção é descartada por um minuto
channels.defaults.botLoopProtection e então sobrescreva o Discord quando um fluxo de trabalho legítimo precisar de mais margem. A precedência é:channels.discord.accounts.<account>.botLoopProtectionchannels.discord.botLoopProtectionchannels.defaults.botLoopProtection- padrões integrados
maxEventsPerWindow, windowSeconds e cooldownSeconds.Quedas de STT de voz com DecryptionFailed(...)
Quedas de STT de voz com DecryptionFailed(...)
- mantenha o OpenClaw atualizado (
openclaw update) para que a lógica de recuperação de recebimento 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 - observe os 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 o histórico upstream de recebimento DAVE em discord.js #11419 e discord.js #11449
Referência de configuração
Referência principal: Referência de configuração - Discord.Campos de alto sinal do Discord
Campos de alto sinal do Discord
- inicialização/auth:
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 - gateway:
gatewayInfoTimeoutMs,gatewayReadyTimeoutMs,gatewayRuntimeReadyTimeoutMs - resposta/histórico:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - entrega:
textChunkLimit,chunkMode,maxLinesPerMessage - streaming:
streaming(alias legado:streamMode),streaming.preview.toolProgress,draftChunk,blockStreaming,blockStreamingCoalesce - mídia/tentativa:
mediaMaxMb(limita uploads de saída do Discord, padrão100MB),retry - 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.enabled,agentComponents.ttlMs,heartbeat,responsePrefix
Segurança e operações
- Trate tokens de bot como segredos (
DISCORD_BOT_TOKENé preferido em ambientes supervisionados). - Conceda permissões de menor privilégio no Discord.
- Se o deploy/estado de comandos estiver desatualizado, reinicie o gateway e verifique novamente com
openclaw channels status --probe.