Mainstream messaging
Discord
Listo para mensajes directos y canales de servidor mediante el Gateway oficial de Discord.
Los mensajes directos de Discord usan el modo de emparejamiento de forma predeterminada.
Comportamiento nativo de comandos y catálogo de comandos.
Diagnóstico multicanal y flujo de reparación.
Configuración rápida
Tendrás que crear una nueva aplicación con un bot, agregar el bot a tu servidor y emparejarlo con OpenClaw. Recomendamos agregar 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
Ve al Portal de desarrolladores de Discord y haz clic en New Application. Ponle un nombre como "OpenClaw".
Haz clic en Bot en la barra lateral. Configura el Username con el nombre que uses para tu agente de OpenClaw.
Habilitar intents privilegiados
Todavía en la página Bot, desplázate hacia abajo hasta Privileged Gateway Intents y habilita:
- Message Content Intent (obligatorio)
- Server Members Intent (recomendado; obligatorio para listas de permitidos de roles y coincidencia de nombre a ID)
- Presence Intent (opcional; solo necesario para actualizaciones de presencia)
Copiar el token de tu bot
Desplázate de nuevo hacia arriba en la página Bot y haz clic en Reset Token.
Copia el token y guárdalo en algún lugar. Este es tu Bot Token y lo necesitarás en breve.
Generar una URL de invitación y agregar el bot a tu servidor
Haz clic en OAuth2 en la barra lateral. Generarás una URL de invitación con los permisos adecuados para agregar el bot a tu servidor.
Desplázate hacia abajo hasta OAuth2 URL Generator y habilita:
botapplications.commands
Aparecerá una sección Bot Permissions debajo. Habilita al menos:
General Permissions
- View Channels Text Permissions
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (opcional)
Este es el conjunto base para canales de texto normales. Si planeas publicar en hilos de Discord, incluidos flujos de trabajo de foros o canales multimedia que crean o continúan un hilo, habilita también Send Messages in Threads. Copia la URL generada en la parte inferior, pégala en tu navegador, selecciona tu servidor y haz clic en Continue para conectar. Ahora deberías ver tu bot en el servidor de Discord.
Habilitar el modo de desarrollador y recopilar tus IDs
De vuelta en la aplicación de Discord, necesitas habilitar el modo de desarrollador para poder copiar IDs internos.
- 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
Guarda tu Server ID y User ID junto con tu Bot Token; enviarás los tres a OpenClaw en el siguiente paso.
Permitir mensajes directos de miembros del servidor
Para que el emparejamiento funcione, Discord debe permitir que tu bot te envíe mensajes directos. Haz clic derecho en el icono de tu servidor → Privacy Settings → activa Direct Messages.
Esto permite que los miembros del servidor (incluidos los bots) te envíen mensajes directos. Mantén esto habilitado si quieres usar mensajes directos de Discord con OpenClaw. Si solo planeas usar canales de servidor, puedes deshabilitar los mensajes directos después del emparejamiento.
Configurar el token de tu bot de forma segura (no lo envíes en el chat)
Tu token de bot de Discord es un secreto (como una contraseña). Configúralo en la máquina que ejecuta OpenClaw antes de enviar mensajes a tu agente.
export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN"
cat > discord.patch.json5 <<'JSON5'
{
channels: {
discord: {
enabled: true,
token: { source: "env", provider: "default", id: "DISCORD_BOT_TOKEN" },
},
},
}
JSON5
openclaw config patch --file ./discord.patch.json5 --dry-run
openclaw config patch --file ./discord.patch.json5
openclaw gateway
Si OpenClaw ya se está ejecutando como servicio en segundo plano, reinícialo mediante la aplicación de OpenClaw para Mac o deteniendo y reiniciando el proceso openclaw gateway run.
Para instalaciones como servicio gestionado, ejecuta openclaw gateway install desde una shell donde DISCORD_BOT_TOKEN esté presente, o guarda la variable en ~/.openclaw/.env, para que el servicio pueda resolver el SecretRef de entorno después del reinicio.
Si tu host está bloqueado o limitado por frecuencia por la búsqueda de aplicación de inicio de Discord, configura el ID de aplicación/cliente de Discord desde el Portal de desarrolladores para que el inicio pueda omitir esa llamada REST. Usa channels.discord.applicationId para la cuenta predeterminada, o channels.discord.accounts.<accountId>.applicationId cuando ejecutes varios bots de Discord.
Configurar OpenClaw y emparejar
Pregúntale a tu agente
Chatea con tu agente de OpenClaw en cualquier canal existente (por ejemplo, Telegram) y díselo. Si Discord es tu primer canal, usa la pestaña de CLI / configuración en su lugar.
"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>."
CLI / configuración
Si prefieres una configuración basada en archivos, configura:
{
channels: {
discord: {
enabled: true,
token: {
source: "env",
provider: "default",
id: "DISCORD_BOT_TOKEN",
},
},
},
}
Respaldo de entorno para la cuenta predeterminada:
DISCORD_BOT_TOKEN=...
Para una configuración remota o con scripts, escribe el mismo bloque JSON5 con openclaw config patch --file ./discord.patch.json5 --dry-run y luego vuelve a ejecutarlo sin --dry-run. Se admiten valores token en texto sin formato. También se admiten valores SecretRef para channels.discord.token en proveedores env/file/exec. Consulta Gestión de secretos.
Para varios bots de Discord, mantén cada token de bot e ID de aplicación dentro de su cuenta. Un channels.discord.applicationId de nivel superior se hereda en las cuentas, así que configúralo ahí solo cuando todas las cuentas deban usar el mismo ID de aplicación.
{
channels: {
discord: {
enabled: true,
accounts: {
personal: {
token: { source: "env", provider: "default", id: "DISCORD_PERSONAL_TOKEN" },
applicationId: "111111111111111111",
},
work: {
token: { source: "env", provider: "default", id: "DISCORD_WORK_TOKEN" },
applicationId: "222222222222222222",
},
},
},
},
}
Aprobar el primer emparejamiento por mensaje directo
Espera hasta que el Gateway se esté ejecutando y luego envía un mensaje directo a tu bot en Discord. Responderá con un código de emparejamiento.
Pregúntale a tu agente
Envía el código de emparejamiento a tu agente en tu canal existente:
"Aprueba este código de emparejamiento de Discord:
<CODE>"
CLI
openclaw pairing list discord
openclaw pairing approve discord <CODE>
Los códigos de emparejamiento caducan después de 1 hora.
Ahora deberías poder chatear con tu agente en Discord mediante mensaje directo.
Recomendado: Configurar un espacio de trabajo de servidor
Cuando los mensajes directos funcionen, puedes configurar tu servidor de Discord como un espacio de trabajo completo donde cada canal tenga su propia sesión de agente con su propio contexto. Esto se recomienda para servidores privados donde solo estén tú y tu bot.
Agregar tu servidor a la lista de permitidos de servidor
Esto permite que tu agente responda en cualquier canal de tu servidor, no solo en mensajes directos.
Pregúntale a tu agente
"Agrega mi Discord Server ID
<server_id>a la lista de permitidos de servidor"
Configuración
{
channels: {
discord: {
groupPolicy: "allowlist",
guilds: {
YOUR_SERVER_ID: {
requireMention: true,
users: ["YOUR_USER_ID"],
},
},
},
},
}
Permitir respuestas sin @mención
De forma predeterminada, tu agente solo responde en canales de servidor cuando se le @menciona. Para un servidor privado, probablemente quieras que responda a todos los mensajes.
En canales de servidor, las respuestas finales normales del asistente permanecen privadas de forma predeterminada. La salida visible de Discord debe enviarse explícitamente con la herramienta message, para que el agente pueda permanecer a la espera de forma predeterminada y solo publicar cuando decida que una respuesta en el canal es útil.
Esto significa que el modelo seleccionado debe llamar herramientas de forma fiable. Si Discord muestra que está escribiendo y los registros muestran uso de tokens, pero no se publica ningún mensaje, revisa el registro de sesión para buscar texto del asistente con didSendViaMessagingTool: false. Eso significa que el modelo produjo una respuesta final privada en lugar de llamar a message(action=send). Cambia a un modelo más fuerte para llamadas a herramientas, o usa la configuración siguiente para restaurar las respuestas finales automáticas heredadas.
Pregúntale a tu agente
"Permite que mi agente responda en este servidor sin tener que ser @mencionado"
Configuración
Configura requireMention: false en tu configuración de servidor:
{
channels: {
discord: {
guilds: {
YOUR_SERVER_ID: {
requireMention: false,
},
},
},
},
}
Para restaurar las respuestas finales automáticas heredadas para salas de grupo/canal, configura messages.groupChat.visibleReplies: "automatic".
Planificar la memoria en canales de servidor
De forma predeterminada, la memoria a largo plazo (MEMORY.md) solo se carga en sesiones de mensajes directos. Los canales de servidor no cargan MEMORY.md automáticamente.
Pregúntale a tu agente
"Cuando haga preguntas en canales de Discord, usa memory_search o memory_get si necesitas contexto a largo plazo de MEMORY.md."
Manual
Si necesitas contexto compartido en todos los canales, coloca las instrucciones estables en AGENTS.md o USER.md (se inyectan en cada sesión). Mantén las notas a largo plazo en MEMORY.md y accede a ellas bajo demanda con herramientas de memoria.
Ahora crea algunos canales en tu servidor de Discord y empieza a chatear. Tu agente puede ver el nombre del canal, y cada canal obtiene su propia sesión aislada, así que puedes configurar #coding, #home, #research o lo que se ajuste a tu flujo de trabajo.
Modelo de runtime
- Gateway es propietario de la conexión de Discord.
- El enrutamiento de respuestas es determinista: las respuestas entrantes de Discord vuelven a Discord.
- Los metadatos de servidor/canal de Discord se añaden al prompt del modelo como contexto no confiable, no como prefijo de respuesta visible para el usuario. Si un modelo copia ese contenedor de vuelta, OpenClaw elimina los metadatos copiados de las respuestas salientes y del contexto de reproducción futuro.
- De forma predeterminada (
session.dmScope=main), los chats directos comparten la sesión principal del agente (agent:main:main). - Los canales de servidor son claves de sesión aisladas (
agent:<agentId>:discord:channel:<channelId>). - Los MD de grupo se ignoran de forma predeterminada (
channels.discord.dm.groupEnabled=false). - Los comandos slash nativos se ejecutan en sesiones de comando aisladas (
agent:<agentId>:discord:slash:<userId>), mientras siguen llevandoCommandTargetSessionKeya la sesión de conversación enrutada. - La entrega de anuncios de cron/heartbeat de solo texto a Discord usa una vez la respuesta final visible para el asistente. Los payloads de medios y componentes estructurados siguen siendo multimensaje cuando el agente emite varios payloads entregables.
Canales de foro
Los canales de foro y medios 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.
Ejemplo: enviar al padre del foro para crear un hilo
openclaw message send --channel discord --target channel:<forumId> \
--message "Topic title\nBody of the post"
Ejemplo: crear un hilo de foro explícitamente
openclaw message thread create --channel discord --target channel:<forumId> \
--thread-name "Topic title" --message "Body of the post"
Los padres de foro no aceptan componentes de Discord. Si necesitas componentes, envía al propio hilo (channel:<threadId>).
Componentes interactivos
OpenClaw admite contenedores de componentes v2 de Discord para mensajes de agente. Usa la herramienta de mensajes con un payload components. 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 admitidos:
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
De forma predeterminada, los componentes son de un solo uso. Establece 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, etiquetas 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 desplegables de proveedor, modelo y runtime compatible, además de un paso de envío. /models add está obsoleto y ahora devuelve un mensaje de obsolescencia en lugar de registrar modelos desde el chat. La respuesta del selector es efímera y solo puede usarla el usuario que la invocó.
Adjuntos de archivo:
- 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
Formularios modales:
- 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 activador
Ejemplo:
{
channel: "discord",
action: "send",
to: "channel:123456789012345678",
message: "Optional fallback text",
components: {
reusable: true,
text: "Choose a path",
blocks: [
{
type: "actions",
buttons: [
{
label: "Approve",
style: "success",
allowedUsers: ["123456789012345678"],
},
{ label: "Decline", style: "danger" },
],
},
{
type: "actions",
select: {
type: "string",
placeholder: "Pick an option",
options: [
{ label: "Option A", value: "a" },
{ label: "Option B", value: "b" },
],
},
},
],
modal: {
title: "Details",
triggerLabel: "Open form",
fields: [
{ type: "text", label: "Requester" },
{
type: "select",
label: "Priority",
options: [
{ label: "Low", value: "low" },
{ label: "High", value: "high" },
],
},
],
},
},
}
Control de acceso y enrutamiento
DM policy
channels.discord.dmPolicy controla el acceso por MD. channels.discord.allowFrom es la lista de permitidos canónica para MD.
pairing(predeterminado)allowlistopen(requiere quechannels.discord.allowFromincluya"*")disabled
Si la política de MD no está abierta, los usuarios desconocidos se bloquean (o se les solicita emparejamiento en modo pairing).
Precedencia multicuenta:
channels.discord.accounts.default.allowFromse aplica solo a la cuentadefault.- Para una cuenta,
allowFromtiene precedencia sobre eldm.allowFromheredado. - Las cuentas con nombre heredan
channels.discord.allowFromcuando sus propiosallowFromydm.allowFromheredado no están configurados. - Las cuentas con nombre no heredan
channels.discord.accounts.default.allowFrom.
Los channels.discord.dm.policy y channels.discord.dm.allowFrom heredados aún se leen por compatibilidad. openclaw doctor --fix los migra a dmPolicy y allowFrom cuando puede hacerlo sin cambiar el acceso.
Formato de destino de MD para entrega:
user:<id>- mención
<@id>
Los IDs numéricos sin formato normalmente se resuelven como IDs de canal cuando hay un canal predeterminado activo, pero los IDs listados en el allowFrom de MD efectivo de la cuenta se tratan como destinos de MD de usuario por compatibilidad.
DM access groups
Los MD de Discord pueden usar entradas dinámicas accessGroup:<name> en channels.discord.allowFrom.
Los nombres de grupos de acceso se comparten entre canales de mensajes. Usa type: "message.senders" para un grupo estático cuyos miembros se expresan con la sintaxis normal de allowFrom de cada canal, o type: "discord.channelAudience" cuando la audiencia actual de ViewChannel de un canal de Discord deba definir la pertenencia dinámicamente. El comportamiento compartido de grupos de acceso está documentado aquí: Grupos de acceso.
{
accessGroups: {
operators: {
type: "message.senders",
members: {
"*": ["global-owner-id"],
discord: ["discord:123456789012345678"],
telegram: ["987654321"],
},
},
},
channels: {
discord: {
dmPolicy: "allowlist",
allowFrom: ["accessGroup:operators"],
},
},
}
Un canal de texto de Discord no tiene una lista de miembros separada. type: "discord.channelAudience" modela la pertenencia así: el remitente del MD es miembro del servidor configurado y actualmente tiene permiso efectivo ViewChannel en el canal configurado después de aplicar sobrescrituras de rol y canal.
Ejemplo: permitir que cualquier persona que pueda ver #maintainers envíe MD al bot, manteniendo cerrados los MD para todos los demás.
{
accessGroups: {
maintainers: {
type: "discord.channelAudience",
guildId: "1456350064065904867",
channelId: "1456744319972282449",
membership: "canViewChannel",
},
},
channels: {
discord: {
dmPolicy: "allowlist",
allowFrom: ["accessGroup:maintainers"],
},
},
}
Puedes mezclar entradas dinámicas y estáticas:
{
accessGroups: {
maintainers: {
type: "discord.channelAudience",
guildId: "1456350064065904867",
channelId: "1456744319972282449",
},
},
channels: {
discord: {
dmPolicy: "allowlist",
allowFrom: ["accessGroup:maintainers", "discord:123456789012345678"],
},
},
}
Las consultas fallan cerradas. Si Discord devuelve Missing Access, falla la consulta del miembro, o el canal pertenece a otro servidor, el remitente del MD se trata como no autorizado.
Activa Server Members Intent en el Portal para desarrolladores de Discord para el bot cuando uses grupos de acceso de audiencia de canal. Los MD no incluyen estado de miembro del servidor, por lo que OpenClaw resuelve el miembro mediante Discord REST en el momento de la autorización.
Guild policy
El manejo de servidores se controla mediante channels.discord.groupPolicy:
openallowlistdisabled
La base segura cuando existe channels.discord es allowlist.
Comportamiento de allowlist:
- el servidor debe coincidir con
channels.discord.guilds(idpreferido, slug aceptado) - listas opcionales de remitentes permitidos:
users(se recomiendan IDs estables) yroles(solo IDs de rol); si cualquiera está configurada, se permite a los remitentes cuando coinciden conusersOroles - la coincidencia directa por nombre/etiqueta está desactivada de forma predeterminada; activa
channels.discord.dangerouslyAllowNameMatching: truesolo como modo de compatibilidad de emergencia - se admiten nombres/etiquetas para
users, pero los IDs son más seguros;openclaw security auditadvierte cuando se usan entradas de nombre/etiqueta - si un servidor tiene
channelsconfigurado, los canales no listados se deniegan - si un servidor no tiene bloque
channels, se permiten todos los canales de ese servidor en la lista de permitidos
Ejemplo:
{
channels: {
discord: {
groupPolicy: "allowlist",
guilds: {
"123456789012345678": {
requireMention: true,
ignoreOtherMentions: true,
users: ["987654321098765432"],
roles: ["123456789012345678"],
channels: {
general: { allow: true },
help: { allow: true, requireMention: true },
},
},
},
},
},
}
Si solo estableces DISCORD_BOT_TOKEN y no creas un bloque channels.discord, el fallback de runtime es groupPolicy="allowlist" (con una advertencia en los registros), incluso si channels.defaults.groupPolicy es open.
Mentions and group DMs
Los mensajes de servidor requieren mención de forma predeterminada.
La detección de menciones incluye:
- mención explícita al bot
- patrones de mención configurados (
agents.list[].groupChat.mentionPatterns, fallbackmessages.groupChat.mentionPatterns) - comportamiento implícito de respuesta al bot en casos admitidos
Al escribir mensajes salientes de Discord, usa la sintaxis canónica de menciones: <@USER_ID> para usuarios, <#CHANNEL_ID> para canales y <@&ROLE_ID> para roles. No uses la forma heredada de mención por apodo <@!USER_ID>.
requireMention se configura por servidor/canal (channels.discord.guilds...).
ignoreOtherMentions opcionalmente descarta mensajes que mencionan a otro usuario/rol pero no al bot (excluyendo @everyone/@here).
MD de grupo:
- predeterminado: ignorado (
dm.groupEnabled=false) - lista de permitidos opcional mediante
dm.groupChannels(IDs o slugs de canal)
Enrutamiento de agentes basado en roles
Usa bindings[].match.roles para enrutar miembros de servidores de Discord a distintos agentes por ID de rol. Los bindings basados en roles solo aceptan IDs de rol y se evalúan después de bindings de par o par padre, y antes de 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.
{
bindings: [
{
agentId: "opus",
match: {
channel: "discord",
guildId: "123456789012345678",
roles: ["111111111111111111"],
},
},
{
agentId: "sonnet",
match: {
channel: "discord",
guildId: "123456789012345678",
},
},
],
}
Comandos nativos y autorización de comandos
commands.nativetoma"auto"como valor predeterminado y está habilitado para Discord.- Anulación por canal:
channels.discord.commands.native. commands.native=falseomite el registro y la limpieza de comandos de barra de Discord durante el inicio. Los comandos registrados anteriormente pueden seguir visibles en Discord hasta que los elimines de la aplicación de Discord.- La autenticación de comandos nativos usa las mismas listas de permitidos/políticas de Discord que el manejo normal de mensajes.
- Es posible que los comandos sigan visibles en la interfaz de Discord para usuarios no autorizados; la ejecución sigue aplicando la autenticación de OpenClaw y devuelve "not authorized".
Consulta Comandos de barra para ver el catálogo y el comportamiento de los comandos.
Configuración predeterminada de comandos de barra:
ephemeral: true
Detalles de la función
Etiquetas de respuesta y respuestas nativas
Discord admite etiquetas de respuesta en la salida del agente:
[[reply_to_current]][[reply_to:<id>]]
Controlado por channels.discord.replyToMode:
off(predeterminado)firstallbatched
Nota: off deshabilita el encadenamiento implícito de respuestas. Las etiquetas explícitas [[reply_to_*]] se siguen respetando.
first siempre adjunta la referencia implícita de respuesta nativa al primer mensaje saliente de Discord del turno.
batched solo adjunta la referencia implícita de respuesta nativa de Discord cuando el
turno entrante fue un lote con rebote de varios mensajes. Esto es útil
cuando quieres respuestas nativas principalmente para chats ambiguos en ráfaga, no para cada
turno de un solo mensaje.
Los ID de mensajes se exponen en el contexto/historial para que los agentes puedan dirigirse a mensajes específicos.
Vista previa de transmisión en vivo
OpenClaw puede transmitir borradores de respuestas enviando un mensaje temporal y editándolo a medida que llega el texto. channels.discord.streaming acepta off | partial | block | progress (predeterminado). progress mantiene un borrador de estado editable y lo actualiza con el progreso de herramientas hasta la entrega final; streamMode es un alias heredado en tiempo de ejecución. Ejecuta openclaw doctor --fix para reescribir la configuración persistida a la clave canónica.
Establece channels.discord.streaming.mode en off para deshabilitar las ediciones de vista previa de Discord. Si la transmisión por bloques de Discord está habilitada explícitamente, OpenClaw omite la transmisión de vista previa para evitar transmitir dos veces.
{
channels: {
discord: {
streaming: {
mode: "progress",
progress: {
label: "auto",
maxLines: 8,
toolProgress: true,
},
},
},
},
}
partialedita un único mensaje de vista previa a medida que llegan los tokens.blockemite fragmentos del tamaño de borrador (usadraftChunkpara ajustar el tamaño y los puntos de corte, limitado atextChunkLimit).- Los finales con medios, errores y respuestas explícitas cancelan las ediciones de vista previa pendientes.
streaming.preview.toolProgress(predeterminadotrue) controla si las actualizaciones de herramientas/progreso reutilizan el mensaje de vista previa.streaming.preview.commandText/streaming.progress.commandTextcontrola el detalle de comandos/ejecución en líneas de progreso compactas:raw(predeterminado) ostatus(solo etiqueta de herramienta).
Oculta el texto sin procesar de comandos/ejecución mientras mantienes líneas de progreso compactas:
{
"channels": {
"discord": {
"streaming": {
"mode": "progress",
"progress": {
"toolProgress": true,
"commandText": "status"
}
}
}
}
}
La transmisión de vista previa solo admite texto; las respuestas con medios recurren a la entrega normal. Cuando la transmisión block está habilitada explícitamente, OpenClaw omite la transmisión de vista previa para evitar transmitir dos veces.
Historial, contexto y comportamiento de hilos
Contexto de historial de servidor:
channels.discord.historyLimitpredeterminado20- alternativa:
messages.groupChat.historyLimit 0deshabilita
Controles de historial de mensajes directos:
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
Comportamiento de hilos:
- Los hilos de Discord se enrutan como sesiones de canal y heredan la configuración del canal padre salvo que se anule.
- Las sesiones de hilo heredan la selección
/modela nivel de sesión del canal padre como alternativa solo de modelo; las selecciones/modellocales del hilo siguen teniendo prioridad y el historial de transcripción del padre no se copia salvo que la herencia de transcripción esté habilitada. channels.discord.thread.inheritParent(predeterminadofalse) opta los nuevos hilos automáticos para inicializarse desde la transcripción padre. Las anulaciones por cuenta viven enchannels.discord.accounts.<id>.thread.inheritParent.- Las reacciones de la herramienta de mensajes pueden resolver destinos de mensajes directos
user:<id>. guilds.<guild>.channels.<channel>.requireMention: falsese conserva durante la alternativa de activación en fase de respuesta.
Los temas de canal se inyectan como contexto no confiable. Las listas de permitidos limitan quién puede activar el agente, no son un límite completo de censura de contexto suplementario.
Sesiones vinculadas a hilos para subagentes
Discord puede vincular un hilo a un destino de sesión para que los mensajes de seguimiento en ese hilo sigan enrutándose a la misma sesión (incluidas las sesiones de subagentes).
Comandos:
/focus <target>vincula el hilo actual/nuevo a un destino de subagente/sesión/unfocuselimina la vinculación del hilo actual/agentsmuestra ejecuciones activas y estado de vinculación/session idle <duration|off>inspecciona/actualiza el desenfoque automático por inactividad para vinculaciones enfocadas/session max-age <duration|off>inspecciona/actualiza la edad máxima estricta para vinculaciones enfocadas
Configuración:
{
session: {
threadBindings: {
enabled: true,
idleHours: 24,
maxAgeHours: 0,
},
},
channels: {
discord: {
threadBindings: {
enabled: true,
idleHours: 24,
maxAgeHours: 0,
spawnSessions: true,
defaultSpawnContext: "fork",
},
},
},
}
Notas:
session.threadBindings.*establece valores predeterminados globales.channels.discord.threadBindings.*anula el comportamiento de Discord.spawnSessionscontrola la creación/vinculación automática de hilos parasessions_spawn({ thread: true })y generaciones de hilos ACP. Predeterminado:true.defaultSpawnContextcontrola el contexto nativo de subagente para generaciones vinculadas a hilos. Predeterminado:"fork".- Las claves obsoletas
spawnSubagentSessions/spawnAcpSessionsse migran medianteopenclaw doctor --fix. - Si las vinculaciones de hilos están deshabilitadas para una cuenta,
/focusy las operaciones relacionadas de vinculación de hilos no están disponibles.
Consulta Subagentes, Agentes ACP y Referencia de configuración.
Vinculaciones persistentes de canales ACP
Para espacios de trabajo ACP estables "siempre activos", configura vinculaciones ACP tipadas de nivel superior dirigidas a conversaciones de Discord.
Ruta de configuración:
bindings[]contype: "acp"ymatch.channel: "discord"
Ejemplo:
{
agents: {
list: [
{
id: "codex",
runtime: {
type: "acp",
acp: {
agent: "codex",
backend: "acpx",
mode: "persistent",
cwd: "/workspace/openclaw",
},
},
},
],
},
bindings: [
{
type: "acp",
agentId: "codex",
match: {
channel: "discord",
accountId: "default",
peer: { kind: "channel", id: "222222222222222222" },
},
acp: { label: "codex-main" },
},
],
channels: {
discord: {
guilds: {
"111111111111111111": {
channels: {
"222222222222222222": {
requireMention: false,
},
},
},
},
},
},
}
Notas:
/acp spawn codex --bind herevincula el canal o hilo actual en su lugar y mantiene los mensajes futuros en la misma sesión ACP. Los mensajes de hilo heredan la vinculación del canal padre.- En un canal o hilo vinculado,
/newy/resetrestablecen la misma sesión ACP en su lugar. Las vinculaciones temporales de hilos pueden anular la resolución de destino mientras estén activas. spawnSessionscontrola la creación/vinculación de hilos hijos mediante--thread auto|here.
Consulta Agentes ACP para obtener detalles del comportamiento de vinculación.
Notificaciones de reacciones
Modo de notificación de reacciones por servidor:
offown(predeterminado)allallowlist(usaguilds.<id>.users)
Los eventos de reacción se convierten en eventos del sistema y se adjuntan a la sesión de Discord enrutada.
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- alternativa de emoji de identidad del agente (
agents.list[].identity.emoji, de lo contrario "👀")
Notas:
- Discord acepta emoji Unicode o nombres de emoji personalizados.
- Usa
""para deshabilitar la reacción para un canal o una cuenta.
Escrituras de configuración
Las escrituras de configuración iniciadas por canal están habilitadas de forma predeterminada.
Esto afecta los flujos /config set|unset (cuando las funciones de comandos están habilitadas).
Deshabilitar:
{
channels: {
discord: {
configWrites: false,
},
},
}
Proxy de Gateway
Enruta el tráfico WebSocket del Gateway de Discord y las búsquedas REST de inicio (ID de aplicación + resolución de listas de permitidos) a través de un proxy HTTP(S) con channels.discord.proxy.
{
channels: {
discord: {
proxy: "http://proxy.example:8080",
},
},
}
Anulación por cuenta:
{
channels: {
discord: {
accounts: {
primary: {
proxy: "http://proxy.example:8080",
},
},
},
},
}
Compatibilidad con PluralKit
Habilita la resolución de PluralKit para asignar mensajes proxy a la identidad de miembro del sistema:
{
channels: {
discord: {
pluralkit: {
enabled: true,
token: "pk_live_...", // optional; needed for private systems
},
},
},
}
Notas:
- las listas de permitidos pueden usar
pk:<memberId> - los nombres visibles de miembros se coinciden por nombre/slug solo cuando
channels.discord.dangerouslyAllowNameMatching: true - las búsquedas usan el ID del mensaje original y están restringidas por ventana de tiempo
- si la búsqueda falla, los mensajes proxy se tratan como mensajes de bot y se descartan salvo que
allowBots=true
Alias de menciones salientes
Usa mentionAliases cuando los agentes necesiten menciones salientes deterministas para usuarios conocidos de Discord. Las claves son identificadores sin la @ inicial; los valores son ID de usuario de Discord. Los identificadores desconocidos, @everyone, @here y las menciones dentro de spans de código Markdown se dejan sin cambios.
{
channels: {
discord: {
mentionAliases: {
Vladislava: "123456789012345678",
},
accounts: {
ops: {
mentionAliases: {
OpsLead: "234567890123456789",
},
},
},
},
},
}
Configuración de presencia
Las actualizaciones de presencia se aplican cuando estableces un campo de estado o actividad, o cuando habilitas la presencia automática.
Ejemplo solo de estado:
{
channels: {
discord: {
status: "idle",
},
},
}
Ejemplo de actividad (el estado personalizado es el tipo de actividad predeterminado):
{
channels: {
discord: {
activity: "Focus time",
activityType: 4,
},
},
}
Ejemplo de transmisión:
{
channels: {
discord: {
activity: "Live coding",
activityType: 1,
activityUrl: "https://twitch.tv/openclaw",
},
},
}
Mapa de tipos de actividad:
- 0: Jugando
- 1: Transmitiendo (requiere
activityUrl) - 2: Escuchando
- 3: Viendo
- 4: Personalizado (usa el texto de actividad como estado; el emoji es opcional)
- 5: Compitiendo
Ejemplo de presencia automática (señal de salud en tiempo de ejecución):
{
channels: {
discord: {
autoPresence: {
enabled: true,
intervalMs: 30000,
minUpdateIntervalMs: 15000,
exhaustedText: "token exhausted",
},
},
},
}
La presencia automática asigna la disponibilidad en tiempo de ejecución al estado de Discord: healthy => online, degraded o unknown => idle, exhausted o unavailable => dnd. Sobrescrituras de texto opcionales:
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(admite el marcador de posición{reason})
Approvals in Discord
Discord admite la gestión de aprobaciones mediante botones en mensajes directos y, opcionalmente, puede publicar solicitudes de aprobación en el canal de origen.
Ruta de configuración:
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(opcional; recurre acommands.ownerAllowFromcuando es posible)channels.discord.execApprovals.target(dm|channel|both, valor predeterminado:dm)agentFilter,sessionFilter,cleanupAfterResolve
Discord habilita automáticamente las aprobaciones de ejecución nativas cuando enabled no está definido o es "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 a partir de allowFrom del canal, dm.allowFrom heredado ni defaultTo de mensajes directos. Define enabled: false para deshabilitar Discord explícitamente como cliente de aprobación nativo.
Para comandos de grupo sensibles solo para el propietario, como /diagnostics y /export-trajectory, OpenClaw envía solicitudes de aprobación y resultados finales de forma privada. Primero intenta enviar un mensaje directo de Discord cuando el propietario que invoca el comando tiene una ruta de propietario de Discord; si no está disponible, recurre a la primera ruta de propietario disponible de commands.ownerAllowFrom, como Telegram.
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 en canal solo en canales de confianza. Si el ID del canal no puede derivarse de la clave de sesión, OpenClaw recurre a la entrega por mensaje directo.
Discord también renderiza los botones de aprobación compartidos que usan otros canales de chat. El adaptador nativo de Discord añade principalmente enrutamiento de mensajes directos para aprobadores y distribución 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 indique
que las aprobaciones por chat no están disponibles o que la aprobación manual es la única vía.
Si el runtime de aprobación nativo de Discord no está activo, OpenClaw mantiene visible la
solicitud local determinista /approve <id> <decision>. Si el
runtime está activo pero no se puede entregar una tarjeta nativa a ningún destino,
OpenClaw envía un aviso de reserva en el mismo chat con el comando /approve
exacto de la aprobación pendiente.
La autenticación de Gateway y la resolución de aprobaciones siguen el contrato compartido del cliente de Gateway (los ID plugin: se resuelven mediante plugin.approval.resolve; otros ID mediante exec.approval.resolve). Las aprobaciones caducan después de 30 minutos de forma predeterminada.
Consulta Aprobaciones de ejecución.
Herramientas y controles de acciones
Las acciones de mensaje 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
La acción event-create acepta un parámetro opcional image (URL o ruta de archivo local) para establecer la imagen de portada del evento programado.
Los controles de acciones se encuentran en channels.discord.actions.*.
Comportamiento predeterminado de los controles:
| 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 |
IU de componentes v2
OpenClaw usa componentes v2 de Discord para aprobaciones de ejecución y marcadores entre contextos. Las acciones de mensaje de Discord también pueden aceptar components para IU personalizada (avanzado; requiere construir una carga útil de componente mediante la herramienta discord), mientras que los 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 (hex).- Configúralo por cuenta con
channels.discord.accounts.<id>.ui.components.accentColor. - Los
embedsse ignoran cuando hay componentes v2 presentes.
Ejemplo:
{
channels: {
discord: {
ui: {
components: {
accentColor: "#5865F2",
},
},
},
},
}
Voz
Discord tiene dos superficies de voz distintas: canales de voz en tiempo real (conversaciones continuas) y adjuntos de mensajes de voz (el formato de vista previa con forma de onda). El gateway admite ambas.
Canales de voz
Lista de configuración:
- Habilita Message Content Intent en el Portal para desarrolladores de Discord.
- Habilita Server Members Intent cuando se usen listas de permitidos de roles/usuarios.
- Invita al bot con los ámbitos
botyapplications.commands. - Concede Connect, Speak, Send Messages y Read Message History en el canal de voz de destino.
- Habilita comandos nativos (
commands.nativeochannels.discord.commands.native). - Configura
channels.discord.voice.
Usa /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.
/vc join channel:<voice-channel-id>
/vc status
/vc leave
Ejemplo de unión automática:
{
channels: {
discord: {
voice: {
enabled: true,
model: "openai/gpt-5.4-mini",
autoJoin: [
{
guildId: "123456789012345678",
channelId: "234567890123456789",
},
],
daveEncryption: true,
decryptionFailureTolerance: 24,
connectTimeoutMs: 30000,
reconnectGraceMs: 15000,
tts: {
provider: "openai",
openai: { voice: "onyx" },
},
},
},
},
}
Notas:
voice.ttssobrescribemessages.ttssolo para la reproducción de voz.voice.modelsobrescribe el LLM usado solo para respuestas de canal de voz de Discord. Déjalo sin definir para heredar el modelo del agente enrutado.- STT usa
tools.media.audio;voice.modelno afecta la transcripción. - Las sobrescrituras
systemPromptde Discord por canal se aplican a los turnos de transcripción de voz de ese canal de voz. - Los turnos de transcripción de voz derivan el estado de propietario de
allowFromde Discord (odm.allowFrom); los hablantes que no sean propietarios no pueden acceder a herramientas solo para propietarios (por ejemplo,gatewayycron). - La voz de Discord es opcional para configuraciones solo de texto; define
channels.discord.voice.enabled=true(o conserva un bloquechannels.discord.voiceexistente) para habilitar los comandos/vc, el runtime de voz y el intent de gatewayGuildVoiceStates. channels.discord.intents.voiceStatespuede sobrescribir explícitamente la suscripción al intent de estado de voz. Déjalo sin definir para que el intent siga la habilitación efectiva de voz.voice.daveEncryptionyvoice.decryptionFailureTolerancese pasan a las opciones de unión de@discordjs/voice.- Los valores predeterminados de
@discordjs/voicesondaveEncryption=trueydecryptionFailureTolerance=24si no se definen. voice.connectTimeoutMscontrola la espera inicial de Ready de@discordjs/voicepara/vc joine intentos de unión automática. Valor predeterminado:30000.voice.reconnectGraceMscontrola cuánto tiempo espera OpenClaw a que una sesión de voz desconectada empiece a reconectarse antes de destruirla. Valor predeterminado:15000.- OpenClaw también vigila errores de descifrado de recepción y se recupera automáticamente saliendo del canal de voz y volviendo a unirse después de errores repetidos en una ventana breve.
- Si los registros de recepción muestran repetidamente
DecryptionFailed(UnencryptedWhenPassthroughDisabled)después de actualizar, recopila un informe de dependencias y registros. La línea incluida de@discordjs/voiceincluye la corrección de relleno ascendente del PR #11449 de discord.js, que cerró el issue #11419 de discord.js.
Canalización de canal de voz:
- La captura PCM de Discord se convierte en un archivo temporal WAV.
tools.media.audiogestiona STT, por ejemploopenai/gpt-4o-mini-transcribe.- La transcripción se envía a través de la entrada y el enrutamiento de Discord mientras el LLM de respuesta se ejecuta con una política de salida de voz que oculta la herramienta
ttsdel agente y solicita texto devuelto, porque la voz de Discord posee la reproducción TTS final. voice.model, cuando está definido, sobrescribe solo el LLM de respuesta para este turno de canal de voz.voice.ttsse fusiona sobremessages.tts; el audio resultante se reproduce en el canal unido.
Las credenciales se resuelven por componente: autenticación de ruta LLM para voice.model, autenticación STT para tools.media.audio y autenticación TTS para messages.tts/voice.tts.
Mensajes de voz
Los mensajes de voz de Discord muestran una vista previa de forma de onda y requieren audio OGG/Opus. OpenClaw genera la forma de onda automáticamente, pero necesita ffmpeg y ffprobe en el host del gateway para inspeccionar y convertir.
- Proporciona una ruta de archivo local (las URL se rechazan).
- Omite el contenido de texto (Discord rechaza texto + mensaje de voz en la misma carga útil).
- Se acepta cualquier formato de audio; OpenClaw lo convierte a OGG/Opus según sea necesario.
message(action="send", channel="discord", target="channel:123", path="/path/to/audio.mp3", asVoice=true)
Solución de problemas
Used disallowed intents or bot sees no guild messages
- habilita Message Content Intent
- habilita Server Members Intent cuando dependas de la resolución de usuario/miembro
- reinicia el gateway después de cambiar intents
Guild messages blocked unexpectedly
- 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
Comprobaciones útiles:
openclaw doctor
openclaw channels status --probe
openclaw logs --follow
Require mention false but still blocked
Causas comunes:
groupPolicy="allowlist"sin lista de permitidos de servidor/canal coincidenterequireMentionconfigurado en el lugar incorrecto (debe estar bajochannels.discord.guildso en la entrada del canal)- remitente bloqueado por la lista de permitidos
usersdel servidor/canal
Long-running Discord turns or duplicate replies
Registros típicos:
Slow listener detected ...stuck session: sessionKey=agent:...:discord:... state=processing ...
Parámetros de la cola de gateway de Discord:
- una sola cuenta:
channels.discord.eventQueue.listenerTimeout - varias cuentas:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout - esto solo controla el trabajo del listener de gateway de Discord, no la duración del turno del agente
Discord no aplica un tiempo de espera propio del canal a los turnos de agente en cola. Los listeners de mensajes delegan de inmediato, y las ejecuciones de Discord en cola conservan el orden por sesión hasta que el ciclo de vida de sesión/herramienta/runtime completa o aborta el trabajo.
{
channels: {
discord: {
accounts: {
default: {
eventQueue: {
listenerTimeout: 120000,
},
},
},
},
},
}
Advertencias de tiempo de espera de búsqueda de metadatos de Gateway
OpenClaw obtiene los metadatos /gateway/bot de Discord antes de conectarse. Los fallos transitorios recurren a la URL de Gateway predeterminada de Discord y se limitan por tasa en los registros.
Ajustes de tiempo de espera de metadatos:
- cuenta única:
channels.discord.gatewayInfoTimeoutMs - varias cuentas:
channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs - alternativa de entorno cuando la configuración no está definida:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - valor predeterminado:
30000(30 segundos), máximo:120000
Reinicios por tiempo de espera de READY de Gateway
OpenClaw espera el evento READY de Gateway de Discord durante el inicio y después de reconexiones en tiempo de ejecución. Las configuraciones con varias cuentas y escalonamiento de inicio pueden necesitar una ventana READY de inicio más larga que la predeterminada.
Ajustes de tiempo de espera de READY:
- inicio con cuenta única:
channels.discord.gatewayReadyTimeoutMs - inicio con varias cuentas:
channels.discord.accounts.<accountId>.gatewayReadyTimeoutMs - alternativa de entorno de inicio cuando la configuración no está definida:
OPENCLAW_DISCORD_READY_TIMEOUT_MS - valor predeterminado de inicio:
15000(15 segundos), máximo:120000 - tiempo de ejecución con cuenta única:
channels.discord.gatewayRuntimeReadyTimeoutMs - tiempo de ejecución con varias cuentas:
channels.discord.accounts.<accountId>.gatewayRuntimeReadyTimeoutMs - alternativa de entorno de tiempo de ejecución cuando la configuración no está definida:
OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS - valor predeterminado de tiempo de ejecución:
30000(30 segundos), máximo:120000
Discordancias en auditorías de permisos
Las comprobaciones de permisos de channels status --probe solo funcionan con ID numéricos de canales.
Si usas claves de slug, la coincidencia en tiempo de ejecución aún puede funcionar, pero la sonda no puede verificar completamente los permisos.
Problemas de MD y emparejamiento
- MD deshabilitados:
channels.discord.dm.enabled=false - política de MD deshabilitada:
channels.discord.dmPolicy="disabled"(heredado:channels.discord.dm.policy) - esperando aprobación de emparejamiento en modo
pairing
Bucles de bot a bot
De forma predeterminada, se ignoran los mensajes escritos por bots.
Si estableces channels.discord.allowBots=true, usa reglas estrictas de menciones y listas de permitidos para evitar comportamientos de bucle.
Prefiere channels.discord.allowBots="mentions" para aceptar solo mensajes de bots que mencionen al bot.
{
channels: {
discord: {
accounts: {
mantis: {
// Mantis listens to other bots only when they mention her.
allowBots: "mentions",
},
molty: {
// Molty listens to all bot-authored Discord messages.
allowBots: true,
mentionAliases: {
// Lets Molty write "@Mantis" and send a real Discord mention.
Mantis: "MANTIS_DISCORD_USER_ID",
},
},
},
},
},
}
Caídas de STT de voz 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 upstream) y ajusta solo si es necesario - revisa los registros en busca de:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- si los fallos continúan después de la reincorporación automática, recopila registros y compáralos con el historial upstream de recepción de DAVE en discord.js #11419 y discord.js #11449
Referencia de configuración
Referencia principal: Referencia de configuración - Discord.
Campos de Discord de alta señal
- inicio/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 - Gateway:
gatewayInfoTimeoutMs,gatewayReadyTimeoutMs,gatewayRuntimeReadyTimeoutMs - respuesta/historial:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - entrega:
textChunkLimit,chunkMode,maxLinesPerMessage - streaming:
streaming(alias heredado:streamMode),streaming.preview.toolProgress,draftChunk,blockStreaming,blockStreamingCoalesce - medios/reintento:
mediaMaxMb(limita las cargas salientes a Discord, predeterminado100MB),retry - acciones:
actions.* - presencia:
activity,status,activityType,activityUrl - IU:
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 (se prefiere
DISCORD_BOT_TOKENen entornos supervisados). - Concede permisos de Discord con el mínimo privilegio.
- Si el despliegue/estado de comandos está obsoleto, reinicia Gateway y vuelve a comprobar con
openclaw channels status --probe.
Relacionado
Empareja un usuario de Discord con Gateway.
Comportamiento de chat grupal y lista de permitidos.
Enruta mensajes entrantes a agentes.
Modelo de amenazas y endurecimiento.
Asigna gremios y canales a agentes.
Comportamiento de comandos nativos.