Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Discord

Ejecuta tu agente ZeroClaw como un bot de Discord. Esta guía te acompaña paso a paso, clic a clic, sin necesidad de experiencia previa con bots. Al final tendrás un bot instalado en tu servidor que responde cuando la gente le habla.

Quién puede hablar con el agente

Los remitentes entrantes se filtran contra el conjunto de pares resuelto para el agente vinculado, obtenido de la configuración peer_groups a la que pertenece el agente. La coincidencia elimina el @ inicial y no distingue mayúsculas de minúsculas frente al identificador nativo de remitente del canal. Un conjunto vacío deniega a todos; un conjunto que contiene "*" acepta a cualquiera; en caso contrario, solo se aceptan los pares externos listados (y los agentes pares). Esto es independiente del emparejamiento de la puerta de enlace (gateway.require_pairing), que autentica clientes HTTP/WebSocket, no remitentes de canales de chat.

Un grupo de pares para discord establece channel en discord, enumera los remitentes permitidos en external_peers (para discord, el ID de usuario de Discord (snowflake); ["*"] acepta a cualquiera), opcionalmente nombra agents pares para el despacho entre agentes, una lista de bloqueo ignore y un output_modality (mirror, voice o text). Consulta Peer Groups para la referencia de campos.

Dónde configurar esto:

Panel de control del gateway

Abra /config/peer_groups en el panel de control web.

zerocode

En el panel Config, en Peer groups.

Inicio rápido

Cinco pasos: crea el bot, copia su token, activa dos interruptores, invítalo e inicia ZeroClaw.

1. Crea el bot

  1. Ve al Portal de Desarrolladores de Discord.
  2. Haz clic en New Application, asígnale un nombre y haz clic en Create.
  3. En la barra lateral izquierda, haz clic en Bot.
  4. Haz clic en Reset Token, luego en Copy. Esta cadena larga es tu bot_token. Guárdala en un lugar seguro para el paso 3, no podrás verla de nuevo más

El token del bot es una contraseña para tu bot. Cualquiera que lo tenga puede controlar tu bot. Nunca lo pegues en un chat público, lo incluyas en una captura de pantalla ni lo subas a git.

2. Activa los dos interruptores que el bot necesita

Todavía en la página Bot, desplázate hasta Privileged Gateway Intents y activa ambos de estos:

  • Message Content Intent para que el bot pueda leer lo que las personas escriben.
  • Server Members Intent para que pueda ver quién está en el servidor.

Haz clic en Save Changes. Si omites este paso, el bot se conecta pero nunca ve ningún mensaje, lo cual es la causa más común de “mi bot no hace nada”.

3. Informa a ZeroClaw sobre el bot

Coloca el token del paso 1 en tu configuración. El token es un secreto, así que configúralo a través de una superficie que lo cifre en lugar de escribirlo en config.toml:

Panel de control del gateway

Abre /config/channels/discord en el panel de control web.

zerocode

En el panel Config, en Channels.

channels.discord.<alias>.bot_token es un secreto. Se almacena cifrado, nunca en texto plano en config.toml. Configúralo a través de uno de estos métodos, que cifran al escribir:

Panel de control del gateway

Abre /config/channels/discord y configura allí el campo channels.discord.<alias>.bot_token.

zerocode

En el panel de Config, configura el campo channels.discord.<alias>.bot_token (la entrada está enmascarada).

zeroclaw config

zeroclaw config set channels.discord.<alias>.bot_token    # solicita entrada enmascarada, almacena cifrado

4. Invita el bot a tu servidor

  1. De vuelta en el Developer Portal, abre OAuth2 -> URL Generator.
  2. En Scopes, marca bot.
  3. En Bot Permissions, marca al menos Send Messages, Read Message History y View Channels.
  4. Copia la URL que aparece en la parte inferior, ábrela en tu navegador, elige tu servidor y haz clic en Authorize.

El bot ahora aparece en tu lista de miembros (sin conexión hasta que inicies ZeroClaw).

5. Iniciar y probar

Inicia ZeroClaw (zeroclaw service restart o zeroclaw daemon), luego envía un mensaje en un canal que el bot pueda ver. Debería responder. Si no lo hace, ve a Solución de problemas.

Configuración

La lista completa de campos, derivada del esquema en vivo. La mayoría tienen valores predeterminados razonables; para un bot básico solo necesitas configurar bot_token.

approval_timeout_secs integer · default 300

Segundos de espera para la aprobación del operador en las herramientas always_ask antes de denegar automáticamente.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.approval_timeout_secs.

zerocode

En el panel Config, configure el campo channels.discord.<alias>.approval_timeout_secs.

zeroclaw config

zeroclaw config set channels.discord.<alias>.approval_timeout_secs <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__approval_timeout_secs=
archive bool · default false

Cuando es true, el canal abre un backend de memoria SQLite auxiliar discord.db, archiva cada mensaje que no sea de bots que vea y registra la herramienta discord_search contra él. Valor predeterminado: false. Incorporado desde el bloque heredado [channels.discord-history].

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.archive.

zerocode

En el panel Config, establece el campo channels.discord.<alias>.archive.

zeroclaw config

zeroclaw config set channels.discord.<alias>.archive <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__archive=
bot_token 🔑 secret · default ""

Token del bot de Discord (del Portal para desarrolladores de Discord). #[serde(default)] por la misma razón que TelegramConfig::bot_token: un token ausente debe deserializarse como una cadena vacía en lugar de descartar el alias durante la recuperación; validate_bot_token sigue requiriendo un token real una vez que enabled = true.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.bot_token.

zerocode

En el panel Config, configure el campo channels.discord.<alias>.bot_token.

zeroclaw config

zeroclaw config set channels.discord.<alias>.bot_token    # entrada enmascarada, almacenada cifrada

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__bot_token=
channel_ids string[] · default []

IDs de canales a monitorear. Vacío = monitorear todos los canales que el bot puede ver. Usado por el sidecar de archivado (cuando archive = true) y por el filtro dentro del canal cuando está configurado.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.channel_ids.

zerocode

En el panel Config, configura el campo channels.discord.<alias>.channel_ids.

zeroclaw config

zeroclaw config set channels.discord.<alias>.channel_ids <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__channel_ids=
draft_update_interval_ms integer · default 1000

Intervalo mínimo (ms) entre ediciones del mensaje borrador para evitar límites de tasa. Solo se usa cuando stream_mode = "partial".

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.draft_update_interval_ms.

zerocode

En el panel Config, establece el campo channels.discord.<alias>.draft_update_interval_ms.

zeroclaw config

zeroclaw config set channels.discord.<alias>.draft_update_interval_ms <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__draft_update_interval_ms=
excluded_tools string[] · default []

Herramientas excluidas de la especificación de herramientas de este canal. Cuando se establece, estas herramientas no se exponen al modelo al responder a través de este canal.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.excluded_tools.

zerocode

En el panel Config, configura el campo channels.discord.<alias>.excluded_tools.

zeroclaw config

zeroclaw config set channels.discord.<alias>.excluded_tools <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__excluded_tools=
guild_ids string[] · default []

IDs de guild (servidor) a los que se restringirá el bot. Vacío = escucha en todos los guilds a los que el bot ha sido invitado. Migrado desde el campo singular heredado guild_id.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.guild_ids.

zerocode

En el panel Config, establece el campo channels.discord.<alias>.guild_ids.

zeroclaw config

zeroclaw config set channels.discord.<alias>.guild_ids <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__guild_ids=
intents_mask integer? · default null

Anulación de la máscara de intención del gateway sin procesar. Cuando se establece, este valor exacto se envía en IDENTIFY en lugar de la máscara derivada: una vía de escape para operadores en implementaciones posteriores que consumen eventos del gateway a través de compilaciones o forks personalizados. El operador asume las consecuencias: los bits privilegiados aún requieren sus interruptores en el Developer Portal, y descartar los bits de referencia silencia el manejo de mensajes (se registra una advertencia). Sin establecer (predeterminado) = derivar la máscara a partir de la configuración de características del canal.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y establece el campo channels.discord.<alias>.intents_mask.

zerocode

En el panel Config, establece el campo channels.discord.<alias>.intents_mask.

zeroclaw config

zeroclaw config set channels.discord.<alias>.intents_mask <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__intents_mask=
interrupt_on_new_message bool · default false

Cuando es true, un mensaje de Discord más reciente del mismo remitente en el mismo canal cancela la solicitud en curso e inicia una respuesta nueva con el historial preservado.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.interrupt_on_new_message.

zerocode

En el panel Config, configure el campo channels.discord.<alias>.interrupt_on_new_message.

zeroclaw config

zeroclaw config set channels.discord.<alias>.interrupt_on_new_message <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__interrupt_on_new_message=
listen_to_bots bool · default false

Cuando es true, procesa mensajes de otros bots (no solo de humanos). El bot sigue ignorando sus propios mensajes para evitar bucles de retroalimentación.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.listen_to_bots.

zerocode

En el panel Config, establece el campo channels.discord.<alias>.listen_to_bots.

zeroclaw config

zeroclaw config set channels.discord.<alias>.listen_to_bots <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__listen_to_bots=
mention_only bool · default false

Cuando es true, solo responde a los mensajes que mencionan al bot con @. Los demás mensajes del servidor se ignoran silenciosamente.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.mention_only.

zerocode

En el panel Config, configure el campo channels.discord.<alias>.mention_only.

zeroclaw config

zeroclaw config set channels.discord.<alias>.mention_only <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__mention_only=
multi_message_delay_ms integer · default 800

Retraso (ms) entre el envío de cada fragmento de mensaje en el modo multimensaje. Solo se utiliza cuando stream_mode = "multi_message".

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.multi_message_delay_ms.

zerocode

En el panel Config, establece el campo channels.discord.<alias>.multi_message_delay_ms.

zeroclaw config

zeroclaw config set channels.discord.<alias>.multi_message_delay_ms <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__multi_message_delay_ms=
proxy_url string? · default null

URL de proxy por canal (http, https, socks5, socks5h). Anula la configuración global [proxy] solo para este canal.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.proxy_url.

zerocode

En el panel Config, establece el campo channels.discord.<alias>.proxy_url.

zeroclaw config

zeroclaw config set channels.discord.<alias>.proxy_url <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__proxy_url=
reaction_notifications DiscordReactionScope · default "off"

Qué reacciones entrantes registrar: off (predeterminado: los eventos de reacción ni siquiera se solicitan a la gateway), own (reacciones a los mensajes del bot) o all (reacciones a cualquier mensaje que pase los filtros del canal). Las reacciones registradas se archivan en discord.db cuando archive está habilitado, y se eliminan de nuevo cuando un usuario quita su reacción (las limpiezas masivas, remove-all / remove-emoji, aún no se procesan). Un intents_mask definido anula la máscara derivada: si omite los intents de reacción, no se registra nada.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.reaction_notifications.

zerocode

En el panel Config, establece el campo channels.discord.<alias>.reaction_notifications.

zeroclaw config

zeroclaw config set channels.discord.<alias>.reaction_notifications <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__reaction_notifications=
reply_min_interval_secs integer · default 0

Límite mínimo de ritmo de salida por (canal, destinatario) en segundos. Rango: 0..=REPLY_MIN_INTERVAL_MAX_SECS (0 lo desactiva).

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.reply_min_interval_secs.

zerocode

En el panel Config, establece el campo channels.discord.<alias>.reply_min_interval_secs.

zeroclaw config

zeroclaw config set channels.discord.<alias>.reply_min_interval_secs <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__reply_min_interval_secs=
reply_queue_depth_max integer · default 0

Profundidad de la cola de regulación de salida por (canal, destinatario). Rango: 0..=REPLY_QUEUE_DEPTH_CEILING. Cuando reply_min_interval_secs > 0 y este valor es 0, el envoltorio de regulación sustituye DEFAULT_REPLY_QUEUE_DEPTH (16). Cuando la cola está llena, se descarta el envío más reciente y se registra un WARN.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.reply_queue_depth_max.

zerocode

En el panel Config, establece el campo channels.discord.<alias>.reply_queue_depth_max.

zeroclaw config

zeroclaw config set channels.discord.<alias>.reply_queue_depth_max <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__reply_queue_depth_max=
slash_command_scope SlashCommandScope · default "global"

Ámbito para los comandos slash registrados: global (predeterminado, para toda la aplicación, propagación de ~1h) o guild (registrado en cada entrada de guild_ids, instantáneo). Solo tiene sentido cuando slash_commands = true; guild con un guild_ids vacío genera una advertencia y revierte a global. Cambiar el ámbito elimina los comandos propios del ámbito ahora inactivo; tenga en cuenta que eliminar un guild de guild_ids (sin cambiar el ámbito) no elimina los comandos de ese guild; quite el bot del guild, o cambie el ámbito, para borrarlos.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abra /config/channels/discord y establezca el campo channels.discord.<alias>.slash_command_scope.

zerocode

En el panel de Config, establece el campo channels.discord.<alias>.slash_command_scope.

zeroclaw config

zeroclaw config set channels.discord.<alias>.slash_command_scope <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__slash_command_scope=
slash_commands bool · default false

Cuando es true, registra y sirve comandos de barra de Discord (p. ej. /ask) a través del WebSocket de Gateway, además del manejo de mensajes. El valor predeterminado es false. (Prototipo: actualmente registra un único /ask <prompt>.)

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.slash_commands.

zerocode

En el panel Config, configura el campo channels.discord.<alias>.slash_commands.

zeroclaw config

zeroclaw config set channels.discord.<alias>.slash_commands <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__slash_commands=
stall_timeout_secs integer · default 0

Tiempo de espera del watchdog de bloqueo en segundos. Cuando es distinto de cero, el bot abortará y reintentará si no se produce ningún progreso dentro de esta duración. 0 = deshabilitado.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.stall_timeout_secs.

zerocode

En el panel Config, establece el campo channels.discord.<alias>.stall_timeout_secs.

zeroclaw config

zeroclaw config set channels.discord.<alias>.stall_timeout_secs <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__stall_timeout_secs=
stream_mode StreamMode · default "off"

Modo de streaming para entrega progresiva de respuestas. off (predeterminado): mensaje único. partial: actualizaciones de borrador editables. multi_message: divide la respuesta en mensajes separados en los límites de párrafo.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.stream_mode.

zerocode

En el panel Config, establece el campo channels.discord.<alias>.stream_mode.

zeroclaw config

zeroclaw config set channels.discord.<alias>.stream_mode <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__discord__<alias>__stream_mode=

Restricción de dónde escucha el bot

De forma predeterminada, el bot escucha en todos los servidores a los que es invitado y en todos los canales que puede ver. Para limitar su alcance:

  • guild_ids: limita el bot a servidores (guilds) específicos. Vacío significa todos.
  • channel_ids: limítalo a canales específicos. Vacío significa todos los visibles.

Para encontrar un ID, habilita el Modo desarrollador en Discord (Ajustes de usuario -> Avanzado), luego haz clic derecho en un servidor o canal y selecciona Copiar ID.

Hilos y contexto

Cuando una conversación de Discord ocurre en un hilo, ese hilo es su propia conversación. ZeroClaw deriva una clave de sesión distinta por hilo, de modo que cada hilo lleva una ventana de contexto y un historial independientes: los mensajes de un hilo nunca se filtran a otro, y el agente no ve los turnos anteriores de un hilo hermano. En Discord, los hilos son canales nativos, por lo que cada hilo ya es una conversación separada: no hay ninguna opción que configurar.

  • El aislamiento es el objetivo. El contexto de cada hilo es autónomo: no se filtra fuera del hilo, y nada de fuera del hilo se filtra hacia dentro. Los hilos paralelos mantienen estados conversacionales separados, por lo que las tareas no relacionadas nunca se contaminan entre sí.
  • Los hilos largos hacen crecer el contexto. Un hilo acumula historial mientras permanece activo, por lo que un hilo muy largo eventualmente llena la ventana de contexto del modelo como cualquier otra conversación larga. Inicia un nuevo hilo para restablecer.
  • El trabajo en curso está delimitado por hilo. Un mensaje nuevo en un hilo no cancela una respuesta en curso en otro; la tarea de cada hilo es independiente.

Archivar y buscar

Establece archive = true y el canal abre un almacén de memoria discord.db auxiliar, registra cada mensaje que ve y registra una herramienta discord_search que el agente puede usar para buscar conversaciones anteriores. Déjalo desactivado si no necesitas búsqueda en el historial; el bot responde normalmente de cualquier manera.

Transmisión

Discord transmite respuestas en streaming mediante la configuración stream_mode:

  • off (predeterminado): toda la respuesta se publica como un solo mensaje una vez que el agente termina. Es lo más simple, y nunca muestra una respuesta a medio escribir.
  • partial: el bot publica un borrador inmediatamente y lo edita en el mismo lugar a medida que la respuesta se transmite. draft_update_interval_ms regula el ritmo de las ediciones; auméntalo si Discord les aplica límites de velocidad.
  • multi_message: cada párrafo se publica como un mensaje independiente, separados por multi_message_delay_ms. Útil para respuestas largas que de otro modo serían un solo bloque de texto.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/discord y configura el campo channels.discord.<alias>.stream_mode.

zerocode

En el panel Config, establece el campo channels.discord.<alias>.stream_mode.

zeroclaw config

zeroclaw config set channels.discord.<alias>.stream_mode <value>

Respuestas que suenan naturales

  • mention_only: cuando es true, el bot solo responde a los mensajes que lo @-mencionan, de modo que permanece en silencio en canales con mucha actividad.
  • reply_min_interval_secs: un intervalo mínimo entre respuestas a la misma persona, útil si las respuestas instantáneas resultan robóticas.

Solución de problemas

SíntomaCausa probableCorregir
El bot está en línea pero nunca respondeMessage Content Intent está desactivadoActívalo en el Developer Portal (paso 2) y reinicia
El bot no responde en ninguna parteNo invitado, o faltan los permisos Ver canales / Enviar mensajesVuelve a ejecutar la invitación (paso 4) con los permisos correctos
El bot ignora la mayoría de los mensajesmention_only = true@-menciona el bot, o configúralo en false
“Invalid token” al iniciarToken mal escrito o restablecidoRestablezca el token en el portal y configúrelo de nuevo (paso 3)

Ejecutar Discord como complemento (experimental)

Todo lo anterior usa el canal de Discord integrado en ZeroClaw. Discord también está disponible como plugin de canal WASM instalable, el paquete discord del registro de plugins. El plugin se ejecuta dentro del sandbox de plugins y solo puede acceder a los hosts que le concedas. Es experimental y solo gestiona mensajes de texto; el canal integrado sigue siendo el predeterminado.

Asigna cada token de bot al canal integrado o al plugin, nunca a ambos. Discord entrega cada evento a cada conexión establecida con el token, por lo que los dos responderían a todos los mensajes. Antes de mover un bot al plugin, elimina su tabla [channels.discord.<alias>]. El plugin nunca lee esa tabla.

Lo que necesitas

  • Un binario de zeroclaw cuyo host de plugins compila componentes .wasm, es decir, uno compilado con la característica plugins-wasm-cranelift (véase características de compilación). En un binario sin el host de plugins, el comando zeroclaw plugin no existe. zeroclaw plugin install comprueba que el paquete se carga en este host antes de instalar nada.
  • El bot de la Guía de inicio rápido: su token, el Message Content Intent activado y el bot invitado a tu servidor.
  • En un canal privado, el bot (o uno de sus roles) necesita Ver canal, Enviar mensajes y Leer el historial de mensajes en ese canal. Discord no envía eventos de un canal que el bot no puede ver, y el plugin no registra nada al respecto: el bot se conecta y parece correcto, pero nunca ve un mensaje. Lo mismo ocurre cuando channel_ids nombra un canal que el bot no puede ver.
  • El ID numérico de usuario de cada persona autorizada para hablar con el agente. Activa el Modo de desarrollador (Configuración de usuario -> Avanzado), haz clic derecho en el usuario y haz clic en Copiar ID de usuario.

1. Instala el paquete y vincula una instancia

Elige un alias para la instancia, aquí main, e instala el paquete vinculado a él:

zeroclaw plugin install discord --channel-alias main --egress declared

El comando descarga discord desde el registro, lo verifica, escribe un enlace [channels.plugin.main] y crea la fila de configuración de la instancia. --egress declared concede acceso a los hosts que declara el paquete: discord.com para la API REST y *.discord.gg para el WebSocket de la pasarela, ya que Discord asigna sus hosts de pasarela y de reanudación bajo ese dominio. Con --egress none, en cambio, la instancia no tiene acceso a la red hasta que lo concedas.

Si el paquete ya está instalado, vincula el alias por sí solo:

zeroclaw plugin bind discord --channel-alias main --egress declared

Vinculación de una instancia de canal describe tanto los comandos como el informe que imprimen.

La instancia guarda su configuración bajo una clave derivada del paquete, la capacidad channel y el alias. Para el alias main, la clave es zpi1_WyJkaXNjb3JkIiwiY2hhbm5lbCIsIm1haW4iXQ, y zeroclaw plugin info discord muestra la clave de cada alias vinculado.

2. Configura el token del bot

El token es un secreto. Omite el valor de la línea de comandos y zeroclaw config set lo solicitará sin mostrarlo en pantalla y lo almacenará cifrado:

zeroclaw config set plugins.entries.zpi1_WyJkaXNjb3JkIiwiY2hhbm5lbCIsIm1haW4iXQ.config.bot_token

Los demás ajustes se encuentran junto al token bajo .config. y son opcionales: guild_ids y channel_ids limitan en qué lugares escucha el bot (consulta Limitar dónde escucha el bot), y mention_only y listen_to_bots aceptan true o false. ZeroClaw almacena cada ajuste del plugin cifrado, así que zeroclaw config set solicita cada uno de ellos, igual que hace con el token; usa --no-interactive para indicar en la línea de comandos un ajuste que no es secreto. Define una lista como texto JSON:

zeroclaw config set --no-interactive plugins.entries.zpi1_WyJkaXNjb3JkIiwiY2hhbm5lbCIsIm1haW4iXQ.config.channel_ids '["123456789012345678"]'

3. Actívalo y enrútalo a un agente

Binding nunca activa el sistema de plugins y nunca asigna la instancia a un agente. Activa el sistema de plugins:

zeroclaw config set plugins.enabled true

Luego añade plugin.main a la lista channels del agente que debe responder, manteniendo los canales que ya tiene, y admite a tus usuarios con un grupo de pares en el mismo canal:

[agents.assistant]
channels = ["plugin.main"]

[peer_groups.discord_plugin]
channel = "plugin.main"
external_peers = ["111111111111111111"]

El plugin informa de cada remitente mediante su ID de usuario numérico, y un canal de plugin compara a los remitentes de forma exacta, por lo que debes indicar los ID de usuario, no los nombres de usuario. Reinicia ZeroClaw (zeroclaw service restart) para iniciar la instancia.

4. Comprueba que se ejecuta

  • zeroclaw plugin info discord indica si el paquete se carga en este host, muestra la clave de la instancia y enumera todo lo que la instancia aún necesita antes de poder iniciarse.
  • Al iniciarse, la lista de canales del daemon incluye plugin.main, y la instantánea de /health del gateway muestra un componente channel:plugin.main. El componente muestra error cuando falla el sondeo del plugin; en los demás casos sigue el propio chequeo de estado del plugin, que ZeroClaw solicita aproximadamente cada 30 segundos. Lo que cubre ese chequeo depende del plugin, así que la prueba de que el bot está conectado a Discord es que un mensaje de un usuario admitido llegue al agente y que la respuesta del agente aparezca en Discord.
  • Un mensaje de un usuario admitido se registra como channel inbound message con zeroclaw.channel = plugin.main. Un mensaje de cualquier otra persona se descarta y se registra con error_key = plugin_channel_sender_denied.
  • Se rechaza una conexión a un host que queda fuera de la concesión. Una solicitud HTTP rechazada se registra con error_key = plugin_egress_denied, el host rechazado y el comando zeroclaw config set que lo concede. Una conexión rechazada al gateway todavía no se registra, así que un bot que permanece sin conexión tras un cambio en egress_hosts probablemente ha perdido *.discord.gg.

Cómo se diferencia el plugin del canal integrado

Canal integradoComplemento discord
Configuración[channels.discord.<alias>][channels.plugin.<alias>] y la fila plugins.entries de la instancia
Nombre del canal en registros, grupos de pares y sesionesdiscord.<alias>plugin.<alias>
Alcance de redSin concesión por hostSolo los hosts en egress_hosts de la instancia
FuncionesTodo en esta páginaSolo mensajes de texto: sin adjuntos, hilos, comandos de barra diagonal, reacciones, streaming, indicadores de escritura ni búsqueda en el archivo.

Las conversaciones se guardan por nombre de canal, por lo que un bot que se mueva de discord.main a plugin.main inicia conversaciones nuevas.

Ver también