Discord (API de bot)
Estado: listo para mensajes directos y canales de servidores mediante la gateway oficial de Discord.Emparejamiento
Comandos slash
Solución de problemas del canal
Configuración rápida
Necesitarás crear una nueva aplicación con un bot, añadir el bot a tu servidor y emparejarlo con OpenClaw. Recomendamos añadir tu bot a tu propio servidor privado. Si todavía no tienes uno, crea uno primero (elige Create My Own > For me and my friends).Crear una aplicación y un bot de Discord
Habilitar intents privilegiados
- Message Content Intent (obligatorio)
- Server Members Intent (recomendado; obligatorio para listas de permitidos por rol y coincidencia de nombre a ID)
- Presence Intent (opcional; solo se necesita para actualizaciones de presencia)
Copiar el token de tu bot
Generar una URL de invitación y añadir el bot a tu servidor
botapplications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (opcional)
Habilitar el Developer Mode y recopilar tus IDs
- Haz clic en User Settings (icono de engranaje junto a tu avatar) → Advanced → activa Developer Mode
- Haz clic derecho en el icono de tu servidor en la barra lateral → Copy Server ID
- Haz clic derecho en tu propio avatar → Copy User ID
Permitir mensajes directos de miembros del servidor
Configura tu token del bot de forma segura (no lo envíes por chat)
openclaw gateway run.Configurar OpenClaw y emparejar
- Pregúntale a tu agente
- CLI / configuración
“Ya configuré mi token de bot de Discord en la configuración. Termina la configuración de Discord con User ID<user_id>y Server ID<server_id>.”
Aprobar el primer emparejamiento por mensaje directo
- Pregúntale a tu agente
- CLI
“Aprueba este código de emparejamiento de Discord: <CODE>”
DISCORD_BOT_TOKEN solo se usa para la cuenta predeterminada.
Para llamadas salientes avanzadas (herramienta de mensajes/acciones de canal), se usa un token explícito por llamada para esa llamada. Esto se aplica a acciones de envío y de lectura/sondeo (por ejemplo, read/search/fetch/thread/pins/permissions). La política de cuenta y la configuración de reintento siguen viniendo de la cuenta seleccionada en la instantánea activa del runtime.Recomendado: configurar un espacio de trabajo de servidor
Una vez que los mensajes directos funcionen, puedes configurar tu servidor de Discord como un espacio de trabajo completo donde cada canal obtiene su propia sesión de agente con su propio contexto. Esto se recomienda para servidores privados donde solo estáis tú y tu bot.Añadir tu servidor a la lista de permitidos de servidores
- Pregúntale a tu agente
- Configuración
“Añade mi Server ID de Discord <server_id> a la lista de permitidos de servidores”
Permitir respuestas sin @mention
- Pregúntale a tu agente
- Configuración
“Permite que mi agente responda en este servidor sin necesidad de que se le mencione con @”
Planificar la memoria en canales del servidor
MEMORY.md) solo se carga en sesiones de mensajes directos. Los canales del servidor no cargan MEMORY.md automáticamente.- Pregúntale a tu agente
- Manual
“Cuando haga preguntas en canales de Discord, usa memory_search o memory_get si necesitas contexto de largo plazo de MEMORY.md.”
#coding, #home, #research o lo que mejor se adapte a tu flujo de trabajo.
Modelo de runtime
- La gateway es propietaria de la conexión de Discord.
- El enrutamiento de respuestas es determinista: las respuestas entrantes de Discord vuelven a Discord.
- De forma predeterminada (
session.dmScope=main), los chats directos comparten la sesión principal del agente (agent:main:main). - Los canales del servidor usan claves de sesión aisladas (
agent:<agentId>:discord:channel:<channelId>). - Los mensajes directos de grupo se ignoran de forma predeterminada (
channels.discord.dm.groupEnabled=false). - Los comandos slash nativos se ejecutan en sesiones de comandos aisladas (
agent:<agentId>:discord:slash:<userId>), mientras siguen transportandoCommandTargetSessionKeya la sesión de conversación enrutada.
Canales de foro
Los canales de foro y multimedia de Discord solo aceptan publicaciones en hilos. OpenClaw admite dos formas de crearlos:- Envía un mensaje al padre del foro (
channel:<forumId>) para crear automáticamente un hilo. El título del hilo usa la primera línea no vacía de tu mensaje. - Usa
openclaw message thread createpara crear un hilo directamente. No pases--message-idpara canales de foro.
channel:<threadId>).
Componentes interactivos
OpenClaw admite contenedores de componentes v2 de Discord para mensajes del agente. Usa la herramienta de mensajes con una cargacomponents. Los resultados de interacción se enrutan de vuelta al agente como mensajes entrantes normales y siguen la configuración existente de Discord replyToMode.
Bloques compatibles:
text,section,separator,actions,media-gallery,file- Las filas de acciones permiten hasta 5 botones o un único menú de selección
- Tipos de selección:
string,user,role,mentionable,channel
components.reusable=true para permitir que botones, selectores y formularios se usen varias veces hasta que caduquen.
Para restringir quién puede hacer clic en un botón, establece allowedUsers en ese botón (IDs de usuario de Discord, tags o *). Cuando se configura, los usuarios no coincidentes reciben una denegación efímera.
Los comandos slash /model y /models abren un selector interactivo de modelos con listas desplegables de proveedor y modelo, además de un paso de envío. La respuesta del selector es efímera y solo el usuario que lo invocó puede usarla.
Archivos adjuntos:
- Los bloques
filedeben apuntar a una referencia de adjunto (attachment://<filename>) - Proporciona el adjunto mediante
media/path/filePath(archivo único); usamedia-gallerypara varios archivos - Usa
filenamepara sobrescribir el nombre de carga cuando deba coincidir con la referencia de adjunto
- Añade
components.modalcon hasta 5 campos - Tipos de campo:
text,checkbox,radio,select,role-select,user-select - OpenClaw añade automáticamente un botón desencadenante
Control de acceso y enrutamiento
- Política de mensajes directos
- Política de servidores
- Menciones y mensajes directos de grupo
channels.discord.dmPolicy controla el acceso a mensajes directos (anterior: channels.discord.dm.policy):pairing(predeterminado)allowlistopen(requiere quechannels.discord.allowFromincluya"*"; anterior:channels.discord.dm.allowFrom)disabled
pairing).Precedencia en varias cuentas:channels.discord.accounts.default.allowFromse aplica solo a la cuentadefault.- Las cuentas con nombre heredan
channels.discord.allowFromcuando su propioallowFromno está establecido. - Las cuentas con nombre no heredan
channels.discord.accounts.default.allowFrom.
user:<id>- mención
<@id>
Enrutamiento de agentes basado en roles
Usabindings[].match.roles para enrutar miembros de servidores de Discord a distintos agentes por ID de rol. Los bindings basados en roles aceptan solo IDs de rol y se evalúan después de los bindings peer o parent-peer y antes de los bindings solo de servidor. Si un binding también establece otros campos de coincidencia (por ejemplo peer + guildId + roles), todos los campos configurados deben coincidir.
Configuración del Developer Portal
Crear aplicación y bot
Crear aplicación y bot
- Discord Developer Portal -> Applications -> New Application
- Bot -> Add Bot
- Copia el token del bot
Intents privilegiados
Intents privilegiados
- Message Content Intent
- Server Members Intent (recomendado)
setPresence) no requiere habilitar actualizaciones de presencia para miembros.Scopes de OAuth y permisos base
Scopes de OAuth y permisos base
- scopes:
bot,applications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (opcional)
Administrator salvo que sea explícitamente necesario.Copiar IDs
Copiar IDs
- server ID
- channel ID
- user ID
Comandos nativos y autenticación de comandos
commands.nativeusa"auto"de forma predeterminada y está habilitado para Discord.- Sobrescritura por canal:
channels.discord.commands.native. commands.native=falseborra explícitamente los comandos nativos de Discord registrados previamente.- La autenticación de comandos nativos usa las mismas listas de permitidos/políticas de Discord que el manejo normal de mensajes.
- Los comandos pueden seguir siendo visibles en la interfaz de Discord para usuarios no autorizados; la ejecución sigue aplicando la autenticación de OpenClaw y devuelve “not authorized”.
ephemeral: true
Detalles de funciones
Etiquetas de respuesta y respuestas nativas
Etiquetas de respuesta y respuestas nativas
[[reply_to_current]][[reply_to:<id>]]
channels.discord.replyToMode:off(predeterminado)firstall
off desactiva el encadenamiento implícito de respuestas. Las etiquetas explícitas [[reply_to_*]] siguen respetándose.Los IDs de mensaje se muestran en el contexto/historial para que los agentes puedan apuntar a mensajes específicos.Vista previa de transmisión en vivo
Vista previa de transmisión en vivo
channels.discord.streamingcontrola la transmisión de vista previa (off|partial|block|progress, predeterminado:off).- El valor predeterminado sigue siendo
offporque las ediciones de vista previa de Discord pueden alcanzar rápidamente los límites de tasa, especialmente cuando varios bots o gateways comparten la misma cuenta o tráfico del servidor. progressse acepta para coherencia entre canales y se asigna apartialen Discord.channels.discord.streamModees un alias heredado y se migra automáticamente.partialedita un único mensaje de vista previa a medida que llegan los tokens.blockemite fragmentos del tamaño de un borrador (usadraftChunkpara ajustar tamaño y puntos de corte).
block (limitados por channels.discord.textChunkLimit):Historial, contexto y comportamiento de hilos
Historial, contexto y comportamiento de hilos
channels.discord.historyLimitpredeterminado20- fallback:
messages.groupChat.historyLimit 0desactiva
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- los hilos de Discord se enrutan como sesiones de canal
- los metadatos del hilo padre pueden usarse para vinculación con la sesión padre
- la configuración del hilo hereda la del canal padre salvo que exista una entrada específica del hilo
Sesiones vinculadas a hilos para subagentes
Sesiones vinculadas a hilos para subagentes
/focus <target>vincula el hilo actual/nuevo a un objetivo de subagente/sesión/unfocuselimina el vínculo del hilo actual/agentsmuestra ejecuciones activas y estado del vínculo/session idle <duration|off>inspecciona/actualiza la desvinculación automática por inactividad para vínculos enfocados/session max-age <duration|off>inspecciona/actualiza la antigüedad máxima estricta para vínculos enfocados
session.threadBindings.*establece valores predeterminados globales.channels.discord.threadBindings.*sobrescribe el comportamiento de Discord.spawnSubagentSessionsdebe sertruepara crear/vincular hilos automáticamente parasessions_spawn({ thread: true }).spawnAcpSessionsdebe sertruepara crear/vincular hilos automáticamente para ACP (/acp spawn ... --thread ...osessions_spawn({ runtime: "acp", thread: true })).- Si los vínculos de hilo están deshabilitados para una cuenta,
/focusy operaciones relacionadas no están disponibles.
Vínculos persistentes de canal ACP
Vínculos persistentes de canal ACP
bindings[]contype: "acp"ymatch.channel: "discord"
/acp spawn codex --bind herevincula el canal o hilo actual de Discord en su lugar y mantiene los mensajes futuros enrutados a la misma sesión ACP.- Eso aún puede significar “iniciar una nueva sesión ACP de Codex”, pero no crea por sí mismo un nuevo hilo de Discord. El canal existente sigue siendo la superficie de chat.
- Codex puede seguir ejecutándose en su propio
cwdo espacio de trabajo backend en disco. Ese espacio de trabajo es estado de runtime, no un hilo de Discord. - Los mensajes de hilos pueden heredar el binding ACP del canal padre.
- En un canal o hilo vinculado,
/newy/resetrestablecen la misma sesión ACP en el lugar. - Los vínculos temporales de hilo siguen funcionando y pueden sobrescribir la resolución de destino mientras estén activos.
spawnAcpSessionssolo es obligatorio cuando OpenClaw necesita crear/vincular un hilo hijo mediante--thread auto|here. No es obligatorio para/acp spawn ... --bind hereen el canal actual.
Notificaciones de reacciones
Notificaciones de reacciones
offown(predeterminado)allallowlist(usaguilds.<id>.users)
Reacciones de confirmación
Reacciones de confirmación
ackReaction envía un emoji de confirmación mientras OpenClaw procesa un mensaje entrante.Orden de resolución:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- fallback del emoji de identidad del agente (
agents.list[].identity.emoji, o ”👀” en su defecto)
- Discord acepta emoji unicode o nombres de emoji personalizados.
- Usa
""para desactivar la reacción en un canal o cuenta.
Escrituras de configuración
Escrituras de configuración
/config set|unset (cuando las funciones de comandos están habilitadas).Desactivar:Proxy de gateway
Proxy de gateway
channels.discord.proxy.Compatibilidad con PluralKit
Compatibilidad con PluralKit
- las listas de permitidos pueden usar
pk:<memberId> - los nombres para mostrar de miembros se comparan por nombre/slug solo cuando
channels.discord.dangerouslyAllowNameMatching: true - las búsquedas usan el ID original del mensaje y están limitadas por ventana de tiempo
- si la búsqueda falla, los mensajes proxificados se tratan como mensajes de bot y se descartan salvo que
allowBots=true
Configuración de presencia
Configuración de presencia
- 0: Playing
- 1: Streaming (requiere
activityUrl) - 2: Listening
- 3: Watching
- 4: Custom (usa el texto de la actividad como estado; el emoji es opcional)
- 5: Competing
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(admite el placeholder{reason})
Aprobaciones en Discord
Aprobaciones en Discord
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(opcional; usacommands.ownerAllowFromcomo fallback cuando es posible)channels.discord.execApprovals.target(dm|channel|both, predeterminado:dm)agentFilter,sessionFilter,cleanupAfterResolve
enabled no está establecido o vale "auto" y se puede resolver al menos un aprobador, ya sea desde execApprovals.approvers o desde commands.ownerAllowFrom. Discord no infiere aprobadores de ejecución desde allowFrom del canal, dm.allowFrom heredado ni defaultTo de mensaje directo. Establece enabled: false para desactivar explícitamente Discord como cliente nativo de aprobaciones.Cuando target es channel o both, la solicitud de aprobación es visible en el canal. Solo los aprobadores resueltos pueden usar los botones; otros usuarios reciben una denegación efímera. Las solicitudes de aprobación incluyen el texto del comando, así que habilita la entrega al canal solo en canales de confianza. Si no se puede derivar el ID del canal a partir de la clave de sesión, OpenClaw vuelve a la entrega por mensaje directo.Discord también representa los botones de aprobación compartidos usados por otros canales de chat. El adaptador nativo de Discord añade principalmente enrutamiento de mensajes directos a aprobadores y fanout a canales.
Cuando esos botones están presentes, son la UX principal de aprobación; OpenClaw
solo debe incluir un comando manual /approve cuando el resultado de la herramienta indica
que las aprobaciones por chat no están disponibles o la aprobación manual es la única vía.La autenticación de gateway para este controlador usa el mismo contrato compartido de resolución de credenciales que otros clientes de Gateway:- autenticación local con prioridad de entorno (
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORDy luegogateway.auth.*) - en modo local,
gateway.remote.*puede usarse como fallback solo cuandogateway.auth.*no está establecido; SecretRefs locales configurados pero no resueltos fallan de forma cerrada - compatibilidad con modo remoto mediante
gateway.remote.*cuando corresponda - las sobrescrituras de URL son seguras para sobrescrituras: las sobrescrituras de CLI no reutilizan credenciales implícitas, y las sobrescrituras de entorno usan solo credenciales de entorno
- los IDs con prefijo
plugin:se resuelven medianteplugin.approval.resolve. - otros IDs se resuelven mediante
exec.approval.resolve. - Discord no realiza aquí un salto extra de fallback de exec a plugin; el prefijo del ID decide qué método de gateway se llama.
Herramientas y puertas de acciones
Las acciones de mensajes de Discord incluyen mensajería, administración de canales, moderación, presencia y acciones de metadatos. Ejemplos principales:- mensajería:
sendMessage,readMessages,editMessage,deleteMessage,threadReply - reacciones:
react,reactions,emojiList - moderación:
timeout,kick,ban - presencia:
setPresence
channels.discord.actions.*.
Comportamiento predeterminado de puertas:
| Grupo de acciones | Predeterminado |
|---|---|
| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | habilitado |
| roles | deshabilitado |
| moderation | deshabilitado |
| presence | deshabilitado |
Interfaz Components v2
OpenClaw usa Discord components v2 para aprobaciones de ejecución y marcadores entre contextos. Las acciones de mensajes de Discord también pueden aceptarcomponents para una interfaz personalizada (avanzado; requiere construir una carga de componente mediante la herramienta de Discord), mientras que embeds heredados siguen disponibles pero no se recomiendan.
channels.discord.ui.components.accentColorestablece el color de acento usado por los contenedores de componentes de Discord (hexadecimal).- Establécelo por cuenta con
channels.discord.accounts.<id>.ui.components.accentColor. embedsse ignora cuando hay components v2 presentes.
Canales de voz
OpenClaw puede unirse a canales de voz de Discord para conversaciones continuas en tiempo real. Esto es independiente de los adjuntos de mensajes de voz. Requisitos:- Habilita comandos nativos (
commands.nativeochannels.discord.commands.native). - Configura
channels.discord.voice. - El bot necesita permisos Connect + Speak en el canal de voz de destino.
/vc join|leave|status para controlar sesiones. El comando usa el agente predeterminado de la cuenta y sigue las mismas reglas de lista de permitidos y política de grupo que otros comandos de Discord.
Ejemplo de unión automática:
voice.ttssobrescribemessages.ttssolo para la reproducción de voz.- Los turnos de transcripción de voz derivan el estado de propietario desde
allowFromde Discord (odm.allowFrom); los hablantes que no son propietarios no pueden acceder a herramientas exclusivas del propietario (por ejemplogatewayycron). - La voz está habilitada de forma predeterminada; establece
channels.discord.voice.enabled=falsepara desactivarla. voice.daveEncryptionyvoice.decryptionFailureTolerancese pasan a las opciones de unión de@discordjs/voice.- Los valores predeterminados de
@discordjs/voicesondaveEncryption=trueydecryptionFailureTolerance=24si no se establecen. - OpenClaw también vigila los fallos de descifrado en recepción y se recupera automáticamente saliendo y volviendo a unirse al canal de voz tras fallos repetidos en una ventana corta.
- Si los registros de recepción muestran repetidamente
DecryptionFailed(UnencryptedWhenPassthroughDisabled), esto puede ser el bug de recepción ascendente de@discordjs/voicerastreado en discord.js #11419.
Mensajes de voz
Los mensajes de voz de Discord muestran una vista previa de forma de onda y requieren audio OGG/Opus más metadatos. OpenClaw genera automáticamente la forma de onda, pero necesita queffmpeg y ffprobe estén disponibles en el host de la gateway para inspeccionar y convertir archivos de audio.
Requisitos y restricciones:
- Proporciona una ruta de archivo local (las URL se rechazan).
- Omite contenido de texto (Discord no permite texto + mensaje de voz en la misma carga).
- Se acepta cualquier formato de audio; OpenClaw lo convierte a OGG/Opus cuando sea necesario.
Solución de problemas
Se usaron intents no permitidos o el bot no ve mensajes del servidor
Se usaron intents no permitidos o el bot no ve mensajes del servidor
- habilita Message Content Intent
- habilita Server Members Intent cuando dependas de la resolución de usuario/miembro
- reinicia la gateway después de cambiar intents
Los mensajes del servidor se bloquean inesperadamente
Los mensajes del servidor se bloquean inesperadamente
- verifica
groupPolicy - verifica la lista de permitidos del servidor en
channels.discord.guilds - si existe el mapa
channelsdel servidor, solo se permiten los canales listados - verifica el comportamiento de
requireMentiony los patrones de mención
Require mention es false pero sigue bloqueado
Require mention es false pero sigue bloqueado
groupPolicy="allowlist"sin una lista de permitidos coincidente de servidor/canalrequireMentionconfigurado en el lugar incorrecto (debe ir enchannels.discord.guildso en la entrada del canal)- remitente bloqueado por la lista de permitidos
usersdel servidor/canal
Los controladores de larga duración exceden el tiempo o duplican respuestas
Los controladores de larga duración exceden el tiempo o duplican respuestas
Listener DiscordMessageListener timed out after 30000ms for event MESSAGE_CREATESlow listener detected ...discord inbound worker timed out after ...
- cuenta única:
channels.discord.eventQueue.listenerTimeout - varias cuentas:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout
- cuenta única:
channels.discord.inboundWorker.runTimeoutMs - varias cuentas:
channels.discord.accounts.<accountId>.inboundWorker.runTimeoutMs - predeterminado:
1800000(30 minutos); establece0para desactivar
eventQueue.listenerTimeout para configuración lenta del listener e inboundWorker.runTimeoutMs
solo si quieres una válvula de seguridad independiente para turnos de agente en cola.Desajustes en la auditoría de permisos
Desajustes en la auditoría de permisos
channels status --probe solo funcionan para IDs numéricos de canal.Si usas claves slug, la coincidencia en runtime puede seguir funcionando, pero el sondeo no puede verificar completamente los permisos.Problemas de mensajes directos y emparejamiento
Problemas de mensajes directos y emparejamiento
- mensajes directos desactivados:
channels.discord.dm.enabled=false - política de mensajes directos desactivada:
channels.discord.dmPolicy="disabled"(anterior:channels.discord.dm.policy) - esperando aprobación de emparejamiento en modo
pairing
Bucles de bot a bot
Bucles de bot a bot
channels.discord.allowBots=true, usa reglas estrictas de mención y listas de permitidos para evitar comportamientos en bucle.
Prefiere channels.discord.allowBots="mentions" para aceptar solo mensajes de bots que mencionan al bot.La STT de voz pierde datos con DecryptionFailed(...)
La STT de voz pierde datos con DecryptionFailed(...)
- mantén OpenClaw actualizado (
openclaw update) para que esté presente la lógica de recuperación de recepción de voz de Discord - confirma
channels.discord.voice.daveEncryption=true(predeterminado) - empieza con
channels.discord.voice.decryptionFailureTolerance=24(predeterminado ascendente) y ajusta solo si es necesario - vigila los registros para:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- si los fallos continúan después del reingreso automático, recopila registros y compáralos con discord.js #11419
Indicadores de referencia de configuración
Referencia principal: Campos de Discord de alta señal:- arranque/autenticación:
enabled,token,accounts.*,allowBots - política:
groupPolicy,dm.*,guilds.*,guilds.*.channels.* - comando:
commands.native,commands.useAccessGroups,configWrites,slashCommand.* - cola de eventos:
eventQueue.listenerTimeout(presupuesto del listener),eventQueue.maxQueueSize,eventQueue.maxConcurrency - worker entrante:
inboundWorker.runTimeoutMs - respuesta/historial:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - entrega:
textChunkLimit,chunkMode,maxLinesPerMessage - transmisión:
streaming(alias heredado:streamMode),draftChunk,blockStreaming,blockStreamingCoalesce - medios/reintento:
mediaMaxMb,retrymediaMaxMblimita las cargas salientes de Discord (predeterminado:8MB)
- acciones:
actions.* - presencia:
activity,status,activityType,activityUrl - UI:
ui.components.accentColor - funciones:
threadBindings,bindings[]de nivel superior (type: "acp"),pluralkit,execApprovals,intents,agentComponents,heartbeat,responsePrefix
Seguridad y operaciones
- Trata los tokens de bot como secretos (
DISCORD_BOT_TOKENes preferible en entornos supervisados). - Otorga permisos de Discord con privilegios mínimos.
- Si el despliegue/estado de comandos está desactualizado, reinicia la gateway y vuelve a comprobar con
openclaw channels status --probe.