Ir al contenido

Slack

Listo para producción para MDs y canales mediante integraciones de aplicaciones de Slack. El modo predeterminado es Socket Mode; también se admiten URLs de solicitud HTTP.

Emparejamiento

Los MD de Slack por defecto están en modo de emparejamiento.

Comandos de barra

Comportamiento de comando nativo y catálogo de comandos.

Solución de problemas del canal

Manuales de diagnóstico y reparación entre canales.

Elegir entre Socket Mode y URL de solicitud HTTP

Sección titulada «Elegir entre Socket Mode y URL de solicitud HTTP»

Ambos transportes están listos para producción y alcanzan paridad de características para mensajería, comandos de barra, App Home e interactividad. Elija según la forma de implementación, no las características.

PreocupaciónSocket Mode (predeterminado)URL de solicitud HTTP
URL de puerta de enlace públicaNo requeridoRequerido (DNS, TLS, proxy inverso o túnel)
Red salienteWSS de salida hacia wss-primary.slack.com debe ser alcanzableSin WS saliente; solo HTTPS entrante
Tokens necesariosToken de bot + Token de nivel de aplicación con connections:writeToken de bot + Secreto de firma
Portátil de desarrollo / detrás de un firewallFunciona tal cualNecesita un túnel público (ngrok, Cloudflare Tunnel, Tailscale Funnel) o una puerta de enlace de ensayo
Escalado horizontalUna sesión de Socket Mode por aplicación por host; múltiples puertas de enlace necesitan aplicaciones de Slack separadasManejador POST sin estado; múltiples réplicas de Gateway pueden compartir una aplicación detrás de un equilibrador de carga
Multicuenta en una sola puerta de enlaceCompatible; cada cuenta abre su propio WSCompatible; cada cuenta necesita un webhookPath único (por defecto /slack/events) para que los registros no colisionen
Transporte de comandos de barraEntregado a través de la conexión WS; se ignora slash_commands[].urlSlack hace POST a slash_commands[].url; el campo es obligatorio para que el comando se despache
Firma de la solicitudNo se utiliza (la autenticación es el Token de nivel de aplicación)Slack firma cada solicitud; OpenClaw verifica con signingSecret
Recuperación ante la caída de la conexiónLa reconexión automática del SDK de Slack está habilitada; OpenClaw también reinicia las sesiones de Socket Mode fallidas con retroceso limitado. Se aplica la sintonización del transporte de tiempo de espera de Pong.No hay conexión persistente que se caiga; los reintentos son por solicitud desde Slack

Instale Slack antes de configurar el canal:

Ventana de terminal
openclaw plugins install @openclaw/slack

plugins install registra y habilita el complemento. El complemento aún no hace nada hasta que configure la aplicación de Slack y la configuración del canal a continuación. Consulte Plugins para conocer el comportamiento general del complemento y las reglas de instalación.

  1. Crear una nueva aplicación de Slack

    Abre api.slack.com/appsCreate New AppFrom a manifest → selecciona tu espacio de trabajo → pega uno de los manifiestos a continuación → NextCreate.

    {
    "display_information": {
    "name": "OpenClaw",
    "description": "Slack connector for OpenClaw"
    },
    "features": {
    "bot_user": { "display_name": "OpenClaw", "always_online": true },
    "app_home": {
    "home_tab_enabled": true,
    "messages_tab_enabled": true,
    "messages_tab_read_only_enabled": false
    },
    "assistant_view": {
    "assistant_description": "OpenClaw connects Slack assistant threads to OpenClaw agents.",
    "suggested_prompts": [
    { "title": "What can you do?", "message": "What can you help me with?" },
    {
    "title": "Summarize this channel",
    "message": "Summarize the recent activity in this channel."
    },
    { "title": "Draft a reply", "message": "Help me draft a reply." }
    ]
    },
    "slash_commands": [
    {
    "command": "/openclaw",
    "description": "Send a message to OpenClaw",
    "should_escape": false
    }
    ]
    },
    "oauth_config": {
    "scopes": {
    "bot": ["app_mentions:read", "assistant:write", "channels:history", "channels:read", "chat:write", "commands", "emoji:read", "files:read", "files:write", "groups:history", "groups:read", "im:history", "im:read", "im:write", "mpim:history", "mpim:read", "mpim:write", "pins:read", "pins:write", "reactions:read", "reactions:write", "usergroups:read", "users:read"]
    }
    },
    "settings": {
    "socket_mode_enabled": true,
    "event_subscriptions": {
    "bot_events": ["app_home_opened", "app_mention", "assistant_thread_context_changed", "assistant_thread_started", "channel_rename", "member_joined_channel", "member_left_channel", "message.channels", "message.groups", "message.im", "message.mpim", "pin_added", "pin_removed", "reaction_added", "reaction_removed"]
    }
    }
    }
    {
    "display_information": {
    "name": "OpenClaw",
    "description": "Slack connector for OpenClaw"
    },
    "features": {
    "bot_user": { "display_name": "OpenClaw", "always_online": true },
    "app_home": {
    "home_tab_enabled": true,
    "messages_tab_enabled": true,
    "messages_tab_read_only_enabled": false
    },
    "assistant_view": {
    "assistant_description": "OpenClaw connects Slack assistant threads to OpenClaw agents.",
    "suggested_prompts": [
    { "title": "What can you do?", "message": "What can you help me with?" },
    {
    "title": "Summarize this channel",
    "message": "Summarize the recent activity in this channel."
    },
    { "title": "Draft a reply", "message": "Help me draft a reply." }
    ]
    },
    "slash_commands": [
    {
    "command": "/openclaw",
    "description": "Send a message to OpenClaw",
    "should_escape": false
    }
    ]
    },
    "oauth_config": {
    "scopes": {
    "bot": ["app_mentions:read", "assistant:write", "channels:history", "channels:read", "chat:write", "commands", "groups:history", "groups:read", "im:history", "im:read", "im:write", "users:read"]
    }
    },
    "settings": {
    "socket_mode_enabled": true,
    "event_subscriptions": {
    "bot_events": ["app_home_opened", "app_mention", "assistant_thread_context_changed", "assistant_thread_started", "message.channels", "message.groups", "message.im"]
    }
    }
    }

    Después de que Slack cree la aplicación:

    • Basic Information -> App-Level Tokens -> Generate Token and Scopes: añade connections:write, guarda, copia el App-Level Token.
    • Install App -> Install to Workspace: copia el Bot User OAuth Token.
  2. Configurar OpenClaw

    Configuración SecretRef recomendada:
    Ventana de terminal
    export SLACK_APP_TOKEN=slack-app-token-example
    export SLACK_BOT_TOKEN=slack-bot-token-example
    cat > slack.socket.patch.json5 <<'JSON5'
    {
    channels: {
    slack: {
    enabled: true,
    mode: "socket",
    appToken: { source: "env", provider: "default", id: "SLACK_APP_TOKEN" },
    botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" },
    },
    },
    }
    JSON5
    openclaw config patch --file ./slack.socket.patch.json5 --dry-run
    openclaw config patch --file ./slack.socket.patch.json5
    Alternativa Env (solo cuenta predeterminada):
    Ventana de terminal
    SLACK_APP_TOKEN=slack-app-token-example
    SLACK_BOT_TOKEN=slack-bot-token-example
  3. Iniciar puerta de enlace

    Ventana de terminal
    openclaw gateway

Por defecto, OpenClaw establece el tiempo de espera de pong del cliente Slack SDK en 15 segundos para el modo Socket. Anule la configuración de transporte solo cuando necesite un ajuste específico del espacio de trabajo o del host:

{
channels: {
slack: {
mode: "socket",
socketMode: {
clientPingTimeout: 20000,
serverPingTimeout: 30000,
pingPongLoggingEnabled: false,
},
},
},
}

Use esto solo para espacios de trabajo en modo Socket que registren tiempos de espera de pong/ping del servidor websocket de Slack o se ejecuten en hosts con inanición conocida del bucle de eventos. clientPingTimeout es la espera del pong después de que el SDK envía un ping de cliente; serverPingTimeout es la espera de los pings del servidor de Slack. Los mensajes y eventos de la aplicación permanecen como estado de la aplicación, no como señales de actividad del transporte.

Notas:

  • socketMode se ignora en el modo de URL de solicitud HTTP.
  • La configuración base de channels.slack.socketMode se aplica a todas las cuentas de Slack a menos que se anule. Las anulaciones por cuenta usan `channels.slack.accounts.

.socketMode`; debido a que es una anulación de objeto, incluya cada campo de ajuste de socket que desee para esa cuenta.

  • Solo clientPingTimeout tiene un valor predeterminado de OpenClaw (15000). serverPingTimeout y pingPongLoggingEnabled se pasan al SDK de Slack solo cuando se configuran.
  • El retroceso de reinicio del modo Socket comienza alrededor de 2 segundos y alcanza un máximo de alrededor de 30 segundos. Los fallos consecutivos recuperables de inicio/espera de inicio se detienen después de 12 intentos; después de una conexión exitosa, las desconexiones recuperables posteriores inician un nuevo ciclo de reintentos. Los errores de autenticación de Slack no recuperables, como invalid_auth, tokens revocados o alcances faltantes, fallan rápidamente en lugar de reintentar para siempre.

Lista de verificación de manifiesto y alcances

Sección titulada «Lista de verificación de manifiesto y alcances»

El manifiesto base de la aplicación de Slack es el mismo para el modo Socket y las URL de solicitud HTTP. Solo el bloque settings (y el comando de barra url) difiere.

Manifiesto base (predeterminado de Socket Mode):

{
"display_information": {
"name": "OpenClaw",
"description": "Slack connector for OpenClaw"
},
"features": {
"bot_user": { "display_name": "OpenClaw", "always_online": true },
"app_home": {
"home_tab_enabled": true,
"messages_tab_enabled": true,
"messages_tab_read_only_enabled": false
},
"assistant_view": {
"assistant_description": "OpenClaw connects Slack assistant threads to OpenClaw agents.",
"suggested_prompts": [
{ "title": "What can you do?", "message": "What can you help me with?" },
{
"title": "Summarize this channel",
"message": "Summarize the recent activity in this channel."
},
{ "title": "Draft a reply", "message": "Help me draft a reply." }
]
},
"slash_commands": [
{
"command": "/openclaw",
"description": "Send a message to OpenClaw",
"should_escape": false
}
]
},
"oauth_config": {
"scopes": {
"bot": ["app_mentions:read", "assistant:write", "channels:history", "channels:read", "chat:write", "commands", "emoji:read", "files:read", "files:write", "groups:history", "groups:read", "im:history", "im:read", "im:write", "mpim:history", "mpim:read", "mpim:write", "pins:read", "pins:write", "reactions:read", "reactions:write", "usergroups:read", "users:read"]
}
},
"settings": {
"socket_mode_enabled": true,
"event_subscriptions": {
"bot_events": ["app_home_opened", "app_mention", "assistant_thread_context_changed", "assistant_thread_started", "channel_rename", "member_joined_channel", "member_left_channel", "message.channels", "message.groups", "message.im", "message.mpim", "pin_added", "pin_removed", "reaction_added", "reaction_removed"]
}
}
}

Para el modo de URL de solicitud HTTP, reemplace settings con la variante HTTP y agregue url a cada comando de barra. Se requiere una URL pública:

{
"features": {
"slash_commands": [
{
"command": "/openclaw",
"description": "Send a message to OpenClaw",
"should_escape": false,
"url": "https://gateway-host.example.com/slack/events"
}
]
},
"settings": {
"event_subscriptions": {
"request_url": "https://gateway-host.example.com/slack/events",
"bot_events": ["app_home_opened", "app_mention", "assistant_thread_context_changed", "assistant_thread_started", "channel_rename", "member_joined_channel", "member_left_channel", "message.channels", "message.groups", "message.im", "message.mpim", "pin_added", "pin_removed", "reaction_added", "reaction_removed"]
},
"interactivity": {
"is_enabled": true,
"request_url": "https://gateway-host.example.com/slack/events",
"message_menu_options_url": "https://gateway-host.example.com/slack/events"
}
}
}

Exponga diferentes características que extiendan los valores predeterminados anteriores.

El manifiesto predeterminado habilita la pestaña Inicio de Slack App Home y se suscribe a app_home_opened. Cuando un miembro del espacio de trabajo abre la pestaña Inicio, OpenClaw publica una vista de Inicio predeterminada segura con views.publish; no se incluye ninguna carga útil de conversación ni configuración privada. La pestaña Mensajes permanece habilitada para los mensajes directos de Slack. El manifiesto también habilita los hilos del asistente de Slack con features.assistant_view, assistant:write, assistant_thread_started y assistant_thread_context_changed; los hilos del asistente se enrutan a sus propias sesiones de hilos de OpenClaw y mantienen el contexto de hilo proporcionado por Slack disponible para el agente.

Comandos de barra nativos opcionales

Se pueden usar múltiples comandos de barra nativos en lugar de un solo comando configurado con matices:

  • Use /agentstatus en lugar de /status porque el comando /status está reservado.
  • No se pueden poner a disposición más de 25 comandos de barra a la vez.

Reemplace su sección features.slash_commands existente con un subconjunto de comandos disponibles:

{
"slash_commands": [
{
"command": "/new",
"description": "Start a new session",
"usage_hint": "[model]"
},
{
"command": "/reset",
"description": "Reset the current session"
},
{
"command": "/compact",
"description": "Compact the session context",
"usage_hint": "[instructions]"
},
{
"command": "/stop",
"description": "Stop the current run"
},
{
"command": "/session",
"description": "Manage thread-binding expiry",
"usage_hint": "idle

or max-age

” }, { “command”: “/think”, “description”: “Set the thinking level”, “usage_hint”: ”

” }, { “command”: “/verbose”, “description”: “Toggle verbose output”, “usage_hint”: “on|off|full” }, { “command”: “/fast”, “description”: “Show or set fast mode”, “usage_hint”: “[status|on|off]” }, { “command”: “/reasoning”, “description”: “Toggle reasoning visibility”, “usage_hint”: “[on|off|stream]” }, { “command”: “/elevated”, “description”: “Toggle elevated mode”, “usage_hint”: “[on|off|ask|full]” }, { “command”: “/exec”, “description”: “Show or set exec defaults”, “usage_hint”: “host=

security=

ask=

node=

” }, { “command”: “/approve”, “description”: “Approve or deny pending approval requests”, “usage_hint”: ”

” }, { “command”: “/model”, “description”: “Show or set the model”, “usage_hint”: “[name|#|status]” }, { “command”: “/models”, “description”: “List providers/models”, “usage_hint”: “[provider] [page] [limit=

|size=

|all]” }, { “command”: “/help”, “description”: “Show the short help summary” }, { “command”: “/commands”, “description”: “Show the generated command catalog” }, { “command”: “/tools”, “description”: “Show what the current agent can use right now”, “usage_hint”: “[compact|verbose]” }, { “command”: “/agentstatus”, “description”: “Show runtime status, including provider usage/quota when available” }, { “command”: “/tasks”, “description”: “List active/recent background tasks for the current session” }, { “command”: “/context”, “description”: “Explain how context is assembled”, “usage_hint”: “[list|detail|json]” }, { “command”: “/whoami”, “description”: “Show your sender identity” }, { “command”: “/skill”, “description”: “Run a skill by name”, “usage_hint”: ”

[input]” }, { “command”: “/btw”, “description”: “Ask a side question without changing session context”, “usage_hint”: ”

” }, { “command”: “/side”, “description”: “Ask a side question without changing session context”, “usage_hint”: ”

” }, { “command”: “/usage”, “description”: “Control the usage footer or show cost summary”, “usage_hint”: “off|tokens|full|cost” } ] }

Ámbitos de autoría opcionales (operaciones de escritura)

Agregue el ámbito de bot chat:write.customize si desea que los mensajes salientes utilicen la identidad del agente activo (nombre de usuario e icono personalizados) en lugar de la identidad predeterminada de la aplicación de Slack.

Si usa un icono de emoji, Slack espera la sintaxis :emoji_name:.

Optional user-token scopes (read operations)

Si configura channels.slack.userToken, los alcances de lectura típicos son:

  • channels:history, groups:history, im:history, mpim:history
  • channels:read, groups:read, im:read, mpim:read
  • users:read
  • reactions:read
  • pins:read
  • emoji:read
  • search:read (si depende de las lecturas de búsqueda de Slack)
  • botToken + appToken son necesarios para el modo Socket.
  • El modo HTTP requiere botToken + signingSecret.
  • botToken, appToken, signingSecret y userToken aceptan cadenas de texto sin formato u objetos SecretRef.
  • Los tokens de configuración anulan la alternativa de env (env fallback).
  • La reserva de entorno SLACK_BOT_TOKEN / SLACK_APP_TOKEN se aplica solo a la cuenta predeterminada.
  • userToken es solo de configuración (sin reserva de entorno) y el valor predeterminado es el comportamiento de solo lectura (userTokenReadOnly: true).

Comportamiento de la instantánea de estado:

  • La inspección de la cuenta de Slack rastrea los campos *Source y *Status por credencial (botToken, appToken, signingSecret, userToken).
  • El estado es available, configured_unavailable o missing.
  • configured_unavailable significa que la cuenta está configurada a través de SecretRef u otra fuente de secreto que no sea en línea, pero la ruta de comando/tiempo de ejecución actual no pudo resolver el valor real.
  • En modo HTTP, se incluye signingSecretStatus; en modo Socket, el par requerido es botTokenStatus + appTokenStatus.

Las acciones de Slack están controladas por channels.slack.actions.*.

Grupos de acciones disponibles en las herramientas actuales de Slack:

GrupoPredeterminado
mensajeshabilitado
reaccioneshabilitado
fijadoshabilitado
informaciónDeMiembrohabilitado
listaDeEmojishabilitado

Las acciones actuales de mensajes de Slack incluyen send, upload-file, download-file, read, edit, delete, pin, unpin, list-pins, member-info y emoji-list. download-file acepta los IDs de archivo de Slack que se muestran en los marcadores de posición de archivos entrantes y devuelve vistas previas de imágenes para imágenes o metadatos de archivos locales para otros tipos de archivos.

channels.slack.dmPolicy controla el acceso a MD. channels.slack.allowFrom es la lista de permitidos (allowlist) canónica para MD.

  • pairing (predeterminado)
  • allowlist
  • open (requiere que channels.slack.allowFrom incluya "*")
  • disabled

Marcadores de MD:

  • dm.enabled (predeterminado true)
  • channels.slack.allowFrom
  • dm.allowFrom (heredado)
  • dm.groupEnabled (grupos de MD predeterminado false)
  • dm.groupChannels (lista de permitidos MPIM opcional)

Precedencia multicuenta:

  • channels.slack.accounts.default.allowFrom se aplica solo a la cuenta default.
  • Las cuentas con nombre heredan channels.slack.allowFrom cuando su propio allowFrom no está establecido.
  • Las cuentas con nombre no heredan channels.slack.accounts.default.allowFrom.

El channels.slack.dm.policy heredado y channels.slack.dm.allowFrom todavía se leen por compatibilidad. openclaw doctor --fix los migra a dmPolicy y allowFrom cuando puede hacerlo sin cambiar el acceso.

El emparejamiento en MD usa `openclaw pairing approve slack

`.

  • Los MD se enrutan como direct; los canales como channel; los MPIM como group.
  • Los enlaces de ruta de Slack aceptan IDs de pares sin procesar además de formas de destino de Slack como channel:C12345678, user:U12345678 y <@U12345678>.
  • Con el session.dmScope=main predeterminado, los MD de Slack colapsan hacia la sesión principal del agente.
  • Sesiones de canal: `agent:

:slack:channel:

`.

  • Los mensajes ordinarios de nivel superior del canal se mantienen en la sesión por canal, incluso cuando replyToMode es distinto de off.
  • Las respuestas de hilos de Slack usan el thread_ts de Slack principal para los sufijos de sesión (`:thread:

), incluso cuando el hilado de respuesta saliente está desactivado con replyToMode=“off”`.

  • OpenClaw siembra una raíz de canal de nivel superior elegible en `agent:

:slack:channel:

:thread:

cuando se espera que esa raíz inicie un hilo visible de Slack, de modo que la raíz y las respuestas posteriores del hilo compartan una sesión de OpenClaw. Esto se aplica a eventosapp_mention, coincidencias de bot explícitas o patrones de mención configurados, y canales requireMention: falseconreplyToModedistinto deoff`.

  • El valor predeterminado de channels.slack.thread.historyScope es thread; el valor predeterminado de thread.inheritParent es false.
  • channels.slack.thread.initialHistoryLimit controla cuántos mensajes de hilo existentes se obtienen cuando comienza una nueva sesión de hilo (predeterminado 20; establezca 0 para desactivar).
  • channels.slack.thread.requireExplicitMention (predeterminado false): cuando es true, suprime las menciones implícitas de hilo para que el bot solo responda a menciones @bot explícitas dentro de los hilos, incluso cuando el bot ya ha participado en el hilo. Sin esto, las respuestas en un hilo con participación del bot omiten el filtrado requireMention.

Controles de hilado de respuestas:

  • channels.slack.replyToMode: off|first|all|batched (predeterminado off)
  • channels.slack.replyToModeByChatType: por direct|group|channel
  • retroalternativa heredada para chats directos: channels.slack.dm.replyToMode

Se admiten etiquetas de respuesta manuales:

  • [[reply_to_current]]
  • `[[reply_to:

]]`

Para respuestas explícitas de hilos de Slack desde la herramienta message, establezca replyBroadcast: true con action: "send" y threadId o replyTo para pedir a Slack que también transmita la respuesta del hilo al canal principal. Esto corresponde al indicador chat.postMessage reply_broadcast de Slack y solo es compatible con envíos de texto o Block Kit, no con cargas de medios.

Cuando una llamada a la herramienta message se ejecuta dentro de un hilo de Slack y tiene como objetivo el mismo canal, OpenClaw normalmente hereda el hilo de Slack actual según replyToMode. Establezca topLevel: true en action: "send" o action: "upload-file" para forzar un nuevo mensaje de canal principal en su lugar. Se acepta threadId: null como la misma opción de exclusión de nivel superior.

ackReaction envía un emoji de reconocimiento mientras OpenClaw procesa un mensaje entrante. ackReactionScope decide cuándo se envía realmente ese emoji.

Orden de resolución:

  • `channels.slack.accounts.

.ackReaction`

  • channels.slack.ackReaction
  • messages.ackReaction
  • emoji de identidad del agente de retroalternativa (agents.list[].identity.emoji, si no "eyes" / 👀)

Notas:

  • Slack espera códigos cortos (por ejemplo "eyes").
  • Use "" para deshabilitar la reacción para la cuenta de Slack o globalmente.

El proveedor de Slack lee el ámbito desde messages.ackReactionScope (por defecto "group-mentions"). Hoy en día no hay una invalidación a nivel de cuenta de Slack o de canal de Slack; el valor es global para la puerta de enlace.

Valores:

  • "all": reacciona en mensajes directos y grupos.
  • "direct": reacciona solo en mensajes directos.
  • "group-all": reacciona en cada mensaje de grupo (sin mensajes directos).
  • "group-mentions" (predeterminado): reacciona en grupos, pero solo cuando el bot es mencionado (o en grupos mencionables que han optado por participar). Los mensajes directos están excluidos.
  • "off" / "none": nunca reacciona.
{
messages: {
ackReaction: "eyes",
ackReactionScope: "all", // react in DMs and groups
},
}

channels.slack.streaming controla el comportamiento de la vista previa en vivo:

  • off: desactiva la transmisión de vista previa en vivo.
  • partial (predeterminado): reemplaza el texto de vista previa con la última salida parcial.
  • block: añade actualizaciones de vista previa fragmentadas.
  • progress: muestra el texto de estado de progreso mientras se genera, y luego envía el texto final.
  • streaming.preview.toolProgress: cuando la vista previa de borrador está activa, envía las actualizaciones de herramientas/progreso al mismo mensaje de vista previa editado (predeterminado: true). Configure false para mantener mensajes de herramientas/progreso separados.
  • streaming.preview.commandText / streaming.progress.commandText: establezca en status para mantener líneas compactas de progreso de herramientas mientras se oculta el texto de comando/exec sin procesar (predeterminado: raw).

Ocultar el texto de comando/ejecución sin procesar mientras se mantienen las líneas de progreso compactas:

{
"channels": {
"slack": {
"streaming": {
"mode": "progress",
"progress": {
"toolProgress": true,
"commandText": "status"
}
}
}
}
}

channels.slack.streaming.nativeTransport controla la transmisión de texto nativa de Slack cuando channels.slack.streaming.mode es partial (predeterminado: true).

Las tarjetas de tareas de progreso nativas de Slack son opcionales para el modo de progreso. Establezca channels.slack.streaming.progress.nativeTaskCards en true con channels.slack.streaming.mode="progress" para enviar una tarjeta de plan/tarea nativa de Slack mientras se ejecuta el trabajo y luego actualizar la misma tarjeta de tareas al finalizar. Sin esta marca, el modo de progreso mantiene el comportamiento de vista previa de borrador portátil.

  • Debe haber un hilo de respuesta disponible para que aparezca la transmisión de texto nativa y el estado del hilo del asistente de Slack. La selección de hilo todavía sigue replyToMode.
  • Las raíces de nivel superior de canales, chats grupales y MDs aún pueden usar la vista previa de borrador normal cuando la transmisión nativa no está disponible o no existe un hilo de respuesta.
  • Los MDs de nivel superior de Slack permanecen fuera del hilo de forma predeterminada, por lo que no muestran la vista previa de flujo/estado nativa estilo hilo de Slack; en su lugar, OpenClaw publica y edita una vista previa de borrador en el MD.
  • Las cargas útiles de medios y las que no son de texto vuelven a la entrega normal.
  • Los finales de medios/errores cancelan las ediciones de vista previa pendientes; los finales de texto/bloque elegibles solo se envían cuando pueden editar la vista previa en su lugar.
  • Si la transmisión falla a mitad de una respuesta, OpenClaw vuelve a la entrega normal para las cargas útiles restantes.

Usar la vista previa de borrador en lugar de la transmisión de texto nativa de Slack:

{
channels: {
slack: {
streaming: {
mode: "partial",
nativeTransport: false,
},
},
},
}

Optar por las tarjetas de tareas de progreso nativas de Slack:

{
channels: {
slack: {
streaming: {
mode: "progress",
progress: {
nativeTaskCards: true,
render: "rich",
},
},
},
},
}

Claves heredadas:

  • channels.slack.streamMode (replace | status_final | append) es un alias de tiempo de ejecución heredado para channels.slack.streaming.mode.
  • el valor booleano channels.slack.streaming es un alias de tiempo de ejecución heredado para channels.slack.streaming.mode y channels.slack.streaming.nativeTransport.
  • el valor heredado channels.slack.nativeStreaming es un alias de tiempo de ejecución para channels.slack.streaming.nativeTransport.
  • Ejecute openclaw doctor --fix para reescribir la configuración de transmisión de Slack persistente a las claves canónicas.

typingReaction añade una reacción temporal al mensaje entrante de Slack mientras OpenClaw procesa una respuesta y luego la elimina cuando finaliza la ejecución. Esto es más útil fuera de las respuestas en hilos, que usan un indicador de estado “escribiendo…” predeterminado.

Orden de resolución:

  • `channels.slack.accounts.

.typingReaction`

  • channels.slack.typingReaction

Notas:

  • Slack espera shortcodes (por ejemplo "hourglass_flowing_sand").
  • La reacción es de mejor esfuerzo y la limpieza se intenta automáticamente después de que se completa la ruta de respuesta o error.
Archivos adjuntos entrantes

Los archivos adjuntos de Slack se descargan de URL privadas alojadas en Slack (flujo de solicitud autenticado por token) y se escriben en el almacén de medios cuando la descarga tiene éxito y los límites de tamaño lo permiten. Los marcadores de posición de archivos incluyen el fileId de Slack para que los agentes puedan obtener el archivo original con download-file.

Las descargas usan tiempos de espera limitados de inactividad y totales. Si la recuperación del archivo de Slack se detiene o falla, OpenClaw continúa procesando el mensaje y recurre al marcador de posición del archivo.

El límite de tamaño de entrada en tiempo de ejecución es 20MB de forma predeterminada, a menos que se anule con channels.slack.mediaMaxMb.

Texto y archivos salientes
  • los fragmentos de texto usan channels.slack.textChunkLimit (predeterminado 4000)
  • channels.slack.chunkMode="newline" habilita la división prioritaria de párrafos
  • el envío de archivos usa las APIs de carga de Slack y puede incluir respuestas de hilos (thread_ts)
  • el límite de medios salientes sigue channels.slack.mediaMaxMb cuando está configurado; de lo contrario, los envíos de canales usan los valores predeterminados de tipo MIME de la canalización de medios
Destinos de entrega

Objetivos explícitos preferidos:

  • `user:

para MDs -channel:

` para canales

Los MD de Slack de solo texto/bloques pueden publicarse directamente en los ID de usuario; las cargas de archivos y los envíos en hilos abren el MD primero a través de las APIs de conversación de Slack porque esas rutas requieren un ID de conversación concreto.

Los comandos de barra aparecen en Slack como un solo comando configurado o múltiples comandos nativos. Configure channels.slack.slashCommand para cambiar los valores predeterminados de los comandos:

  • enabled: false
  • name: "openclaw"
  • sessionPrefix: "slack:slash"
  • ephemeral: true
/openclaw /help

Los comandos nativos requieren configuraciones de manifiesto adicionales en su aplicación de Slack y se habilitan con channels.slack.commands.native: true o commands.native: true en las configuraciones globales en su lugar.

  • El modo automático de comandos nativos está desactivado para Slack, por lo que commands.native: "auto" no habilita los comandos nativos de Slack.
/help

Los menús de argumentos nativos utilizan una estrategia de renderizado adaptativo que muestra un modal de confirmación antes de enviar el valor de una opción seleccionada:

  • hasta 5 opciones: bloques de botones
  • 6-100 opciones: menú de selección estática
  • más de 100 opciones: selección externa con filtrado de opciones asíncrono cuando hay controladores de opciones de interactividad disponibles
  • límites de Slack excedidos: los valores de las opciones codificadas vuelven a los botones
/think

Las sesiones de slash usan claves aisladas como `agent:

:slack:slash:

y aún enrutan las ejecuciones de comandos a la sesión de conversación de destino usandoCommandTargetSessionKey`.

Slack puede renderizar controles de respuesta interactivos creados por el agente, pero esta función está deshabilitada de forma predeterminada. Para nuevos resultados de agente, CLI y complementos, prefiera los botones o bloques de selección compartidos presentation. Utilizan la misma ruta de interacción de Slack mientras que también se degradan en otros canales.

Actívelo globalmente:

{
channels: {
slack: {
capabilities: {
interactiveReplies: true,
},
},
},
}

O actívelo solo para una cuenta de Slack:

{
channels: {
slack: {
accounts: {
ops: {
capabilities: {
interactiveReplies: true,
},
},
},
},
},
}

Cuando está habilitado, los agentes aún pueden emitir directivas de respuesta obsoletas exclusivas de Slack:

  • [[slack_buttons: Approve:approve, Reject:reject]]
  • [[slack_select: Choose a target | Canary:canary, Production:production]]

Estas directivas se compilan en Slack Block Kit y enrutan clics o selecciones a través de la ruta del evento de interacción existente de Slack. Manténgalas para viejas instrucciones y escapehatches específicos de Slack; use presentación compartida para nuevos controles portátiles.

Las API del compilador de directivas también están obsoletas para el nuevo código de productor:

  • compileSlackInteractiveReplies(...)
  • parseSlackOptionsLine(...)
  • isSlackInteractiveRepliesEnabled(...)
  • buildSlackInteractiveBlocks(...)

Use cargas útiles presentation y buildSlackPresentationBlocks(...) para nuevos controles renderizados por Slack.

Notas:

  • Esta es una interfaz de usuario heredada específica de Slack. Otros canales no traducen las directivas de Slack Block Kit en sus propios sistemas de botones.
  • Los valores de devolución de llamada interactivos son tokens opacos generados por OpenClaw, no valores creados por el agente en bruto.
  • Si los bloques interactivos generados exceden los límites de Slack Block Kit, OpenClaw recurre a la respuesta de texto original en lugar de enviar una carga útil de bloques no válida.

Envíos de modales propiedad del complemento

Sección titulada «Envíos de modales propiedad del complemento»

Los complementos de Slack que registran un controlador interactivo también pueden recibir eventos del ciclo de vida modal view_submission y view_closed antes de que OpenClaw compacte la carga útil para el evento del sistema visible por el agente. Use uno de estos patrones de enrutamiento al abrir un modal de Slack:

  • Establezca callback_id en `openclaw:

:

`.

  • O conserve un callback_id existente y coloque `pluginInteractiveData: ”

:

in the modalprivate_metadata`.

El controlador recibe ctx.interaction.kind como view_submission o view_closed, inputs normalizado y el objeto stateValues sin procesar completo de Slack. El enrutamiento solo por callback-id es suficiente para invocar el controlador del complemento; incluya los campos de enrutamiento de usuario/sesión del modal private_metadata existentes cuando el modal también debe producir un evento del sistema visible por el agente. El agente recibe un evento del sistema Slack interaction: ... compacto y redactado. Si el controlador devuelve systemEvent.summary, systemEvent.reference o systemEvent.data, esos campos se incluyen en ese evento compacto para que el agente pueda hacer referencia al almacenamiento propiedad del complemento sin ver la carga completa del formulario.

Slack puede actuar como un cliente de aprobación nativo con botones e interacciones interactivas, en lugar de recurrir a la interfaz de usuario web o a la terminal.

  • Las aprobaciones de ejecución y de complementos pueden renderizarse como indicadores de Block Kit nativos de Slack.
  • channels.slack.execApprovals.* sigue siendo la habilitación del cliente de aprobación de ejecución nativa y la configuración de enrutamiento de DM/canal.
  • Los DM de aprobación de ejecución usan channels.slack.execApprovals.approvers o commands.ownerAllowFrom.
  • Las aprobaciones de complementos usan botones nativos de Slack cuando Slack está habilitado como cliente de aprobación nativo para la sesión de origen, o cuando approvals.plugin enruta a la sesión de Slack de origen o a un destino de Slack.
  • Los mensajes directos de aprobación de complementos usan los aprobadores de complementos de Slack de channels.slack.allowFrom, la cuenta con nombre allowFrom o la ruta predeterminada de la cuenta.
  • La autorización del aprobador todavía se hace cumplir: los aprobadores de solo ejecución no pueden aprobar solicitudes de complementos a menos que también sean aprobadores de complementos.

Esto utiliza la misma superficie de botón de aprobación compartida que otros canales. Cuando interactivity está habilitado en la configuración de tu aplicación de Slack, las solicitudes de aprobación se renderizan como botones de Block Kit directamente en la conversación. 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 del chat no están disponibles o la aprobación manual es la única ruta.

Ruta de configuración:

  • channels.slack.execApprovals.enabled
  • channels.slack.execApprovals.approvers (opcional; se usa commands.ownerAllowFrom de forma alternativa cuando es posible)
  • channels.slack.execApprovals.target (dm | channel | both, predeterminado: dm)
  • agentFilter, sessionFilter

Slack habilita automáticamente las aprobaciones de ejecución nativas cuando enabled no está definido o es "auto" y al menos un aprobador de ejecución resuelve. Slack también puede manejar aprobaciones de complementos nativas a través de esta ruta de cliente nativo cuando los aprobadores de complementos de Slack resuelven y la solicitud coincide con los filtros de cliente nativo. Establece enabled: false para deshabilitar explícitamente Slack como cliente de aprobación nativa. Establece enabled: true para forzar la activación de las aprobaciones nativas cuando los aprobadores resuelven. Deshabilitar las aprobaciones de ejecución de Slack no deshabilita la entrega de aprobaciones de complementos de Slack nativas que esté habilitada a través de approvals.plugin; la entrega de aprobaciones de complementos usa los aprobadores de complementos de Slack en su lugar.

Comportamiento predeterminado sin una configuración explícita de aprobación de ejecución de Slack:

{
commands: {
ownerAllowFrom: ["slack:U12345678"],
},
}

La configuración nativa explícita de Slack solo es necesaria cuando deseas anular los aprobadores, agregar filtros u optar por la entrega al chat de origen:

{
channels: {
slack: {
execApprovals: {
enabled: true,
approvers: ["U12345678"],
target: "both",
},
},
},
}

El reenvío de approvals.exec compartido es independiente. Úselo solo cuando los avisos de aprobación de ejecución también deban enrutarse a otros chats o objetivos explícitos fuera de banda. El reenvío de approvals.plugin compartido también es independiente; la entrega nativa de Slack suprime ese respaldo solo cuando Slack puede manejar la solicitud de aprobación del complemento de forma nativa.

El /approve del mismo chat también funciona en canales y MD de Slack que ya admiten comandos. Consulte Aprobaciones de ejecución para el modelo completo de reenvío de aprobaciones.

  • Las ediciones/eliminaciones de mensajes se asignan a eventos del sistema.
  • Las transmisiones de hilos (respuestas de hilo “También enviar al canal”) se procesan como mensajes de usuario normales.
  • Los eventos de agregar/eliminar reacciones se asignan a eventos del sistema.
  • Los eventos de incorporación/salida de miembros, creación/cambio de nombre de canal y agregar/eliminar fijaciones se asignan a eventos del sistema.
  • channel_id_changed puede migrar las claves de configuración del canal cuando configWrites está habilitado.
  • Los metadatos del tema/propósito del canal se tratan como contexto no confiable y se pueden inyectar en el contexto de enrutamiento.
  • El iniciador del hilo y la siembra inicial del contexto del historial del hilo se filtran mediante listas de permitidos de remitentes configuradas, cuando corresponda.
  • Las acciones de bloque y las interacciones modales emiten eventos del sistema Slack interaction: ... estructurados con campos de carga útiles enriquecidos:
    • acciones de bloque: valores seleccionados, etiquetas, valores de selector y metadatos de workflow_*
    • eventos modales view_submission y view_closed con metadatos de canal enrutados y entradas de formulario

Referencia principal: Referencia de configuración - Slack.

Campos importantes de Slack
  • modo/autenticación: mode, botToken, appToken, signingSecret, webhookPath, accounts.*
  • acceso a MD: dm.enabled, dmPolicy, allowFrom (heredado: dm.policy, dm.allowFrom), dm.groupEnabled, dm.groupChannels
  • interruptor de compatibilidad: dangerouslyAllowNameMatching (de emergencia; manténgalo apagado a menos que sea necesario)
  • acceso al canal: groupPolicy, channels.*, channels.*.users, channels.*.requireMention
  • hilos/historial: replyToMode, replyToModeByChatType, thread.*, historyLimit, dmHistoryLimit, dms.*.historyLimit
  • entrega: textChunkLimit, chunkMode, mediaMaxMb, streaming, streaming.nativeTransport, streaming.preview.toolProgress
  • unfurls: unfurlLinks (predeterminado: false), unfurlMedia para el control de vista previa de chat.postMessage enlaces/medios; establezca unfurlLinks: true para volver a activar las vistas previas de enlaces
  • operaciones/funciones: configWrites, commands.native, slashCommand.*, actions.*, userToken, userTokenReadOnly
No replies in channels
Compruebe, en orden:
- `groupPolicy`
- lista de permitidos de canales (`channels.slack.channels`) — **las claves deben ser IDs de canales** (`C12345678`), no nombres (`#channel-name`). Las claves basadas en nombres fallan silenciosamente bajo `groupPolicy: "allowlist"` porque el enrutamiento de canales es prioritario por ID de manera predeterminada. Para encontrar un ID: haga clic derecho en el canal en Slack → **Copy link** — el valor `C...` al final de la URL es el ID del canal.
- `requireMention`
- lista de permitidos de `users` por canal
- `messages.groupChat.visibleReplies`: las solicitudes normales de grupo/canal predeterminan a `"automatic"`. Si optó por `"message_tool"` y los registros muestran texto del asistente sin ninguna llamada `message(action=send)`, el modelo perdió la ruta de la herramienta de mensajes visible. El texto final permanece privado en este modo; inspeccione el registro detallado de la puerta de enlace para metadatos de carga útil suprimidos, o configúrelo en `"automatic"` si desea que cada respuesta final normal del asistente se publique a través de la ruta heredada.
- `messages.groupChat.unmentionedInbound`: si es `"room_event"`, las conversaciones permitidas del canal sin mención son contexto ambiental y permanecen en silencio a menos que el agente llame a la herramienta `message`. Consulte [Ambient room events](/es/channels/ambient-room-events).
{
messages: {
groupChat: {
visibleReplies: "automatic",
},
},
}
Comandos útiles:
Ventana de terminal
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
Mensajes de DM ignorados
Comprobar:
- `channels.slack.dm.enabled`
- `channels.slack.dmPolicy` (o el heredado `channels.slack.dm.policy`)
- aprobaciones de emparejamiento / entradas de lista de permitidos (`dmPolicy: "open"` todavía requiere `channels.slack.allowFrom: ["*"]`)
- los mensajes directos de grupo usan el manejo MPIM; habilite `channels.slack.dm.groupEnabled` y, si está configurado, incluya el MPIM en `channels.slack.dm.groupChannels`
- eventos de DM del Asistente de Slack: los registros detallados que mencionan `drop message_changed`
generalmente significan que Slack envió un evento de hilo del Asistente editado sin un
remitente humano recuperable en los metadatos del mensaje
Ventana de terminal
openclaw pairing list slack
Modo socket no se conecta

Valide los tokens de bot + aplicación y la habilitación del Modo Socket en la configuración de la aplicación de Slack. El Token a Nivel de Aplicación necesita connections:write y el Token de OAuth de Usuario de Bot debe pertenecer a la misma aplicación/espacio de trabajo de Slack que el token de la aplicación.

Si openclaw channels status --probe --json muestra botTokenStatus o appTokenStatus: "configured_unavailable", la cuenta de Slack está configurada pero el tiempo de ejecución actual no pudo resolver el valor respaldado por SecretRef.

Registros como slack socket mode failed to start; retry ... son fallos de inicio recuperables. Los alcances faltantes, los tokens revocados y la autenticación no válida fallan rápidamente en su lugar. Un registro slack token mismatch ... significa que el token de bot y el token de aplicación parecen pertenecer a diferentes aplicaciones de Slack; corrija las credenciales de la aplicación de Slack.

HTTP mode not receiving events

Valide:

  • signing secret (secreto de firma)
  • webhook path (ruta del webhook)
  • Slack Request URLs (Events + Interactivity + Slash Commands)
  • webhookPath único por cuenta HTTP
  • la URL pública termina TLS y reenvía las solicitudes a la ruta del Gateway
  • la ruta request_url de la aplicación de Slack coincide exactamente con channels.slack.webhookPath (por defecto /slack/events)

Si signingSecretStatus: "configured_unavailable" aparece en las instantáneas de la cuenta, la cuenta HTTP está configurada pero el tiempo de ejecución actual no pudo resolver el secreto de firma respaldado por SecretRef.

Un registro repetido slack: webhook path ... already registered significa que dos cuentas HTTP están usando el mismo webhookPath; asigne una ruta distinta a cada cuenta.

Native/slash commands not firing

Verifique si tenía la intención de:

  • modo de comando nativo (channels.slack.commands.native: true) con comandos de barra coincidentes registrados en Slack
  • o modo de comando de barra único (channels.slack.slashCommand.enabled: true)

Slack no crea ni elimina comandos de barra automáticamente. commands.native: "auto" no habilita los comandos nativos de Slack; use true y cree los comandos coincidentes en la aplicación de Slack. En modo HTTP, cada comando de barra de Slack debe incluir la URL del Gateway. En modo Socket, las cargas útiles de los comandos llegan a través del websocket y Slack ignora slash_commands[].url.

También verifique commands.useAccessGroups, la autorización de DM, las listas permitidas de canales, y las listas permitidas users por canal. Slack devuelve errores efímeros para los remitentes de comandos de barra bloqueados, incluyendo:

  • This channel is not allowed.
  • You are not authorized to use this command here.

Slack puede adjuntar medios descargados al turno del agente cuando las descargas de archivos de Slack tienen éxito y los límites de tamaño lo permiten. Los archivos de imagen pueden pasarse a través de la ruta de comprensión de medios o directamente a un modelo de respuesta con capacidad de visión; otros archivos se conservan como contexto de archivo descargable en lugar de ser tratados como entrada de imagen.

Tipo de medioFuenteComportamiento actualNotas
Imágenes JPEG / PNG / GIF / WebPURL de archivo de SlackDescargado y adjunto al turno para el manejo con capacidad de visiónLímite por archivo: channels.slack.mediaMaxMb (20 MB de forma predeterminada)
Archivos PDFURL de archivo de SlackDescargado y expuesto como contexto de archivo para herramientas como download-file o pdfSlack entrante no convierte los archivos PDF en entrada de imagen-visión automáticamente
Otros archivosURL de archivo de SlackDescargado cuando sea posible y expuesto como contexto de archivoLos archivos binarios no se tratan como entrada de imagen
Respuestas de hilosArchivos del iniciador del hiloLos archivos de mensaje raíz se pueden hidratar como contexto cuando la respuesta no tiene medios directosLos iniciadores que solo tienen archivos usan un marcador de posición de archivo adjunto
Mensajes con múltiples imágenesMúltiples archivos de SlackCada archivo se evalúa de forma independienteEl procesamiento de Slack está limitado a ocho archivos por mensaje

Cuando llega un mensaje de Slack con archivos adjuntos:

  1. OpenClaw descarga el archivo desde la URL privada de Slack utilizando el token del bot.
  2. El archivo se escribe en el almacén de medios tras una descarga exitosa.
  3. Las rutas de los medios descargados y los tipos de contenido se agregan al contexto de entrada.
  4. Las rutas de modelo/herramienta con capacidad de imagen pueden usar archivos adjuntos de ese contexto.
  5. Los archivos que no son imágenes permanecen disponibles como metadatos de archivo o referencias de medios para herramientas que puedan manejarlos.

Cuando llega un mensaje en un hilo (tiene un padre thread_ts):

  • Si la respuesta en sí no tiene medios directos y el mensaje raíz incluido tiene archivos, Slack puede hidratar los archivos raíz como contexto de iniciador del hilo.
  • Los adjuntos de respuesta directa tienen prioridad sobre los adjuntos del mensaje raíz.
  • Un mensaje raíz que solo tiene archivos y sin texto se representa con un marcador de posición de adjunto para que la alternativa aún pueda incluir sus archivos.

Cuando un solo mensaje de Slack contiene múltiples archivos adjuntos:

  • Cada adjunto se procesa de forma independiente a través de la canalización de medios.
  • Las referencias de medios descargados se agregan en el contexto del mensaje.
  • El orden de procesamiento sigue el orden de archivos de Slack en la carga útil del evento.
  • Un fallo en la descarga de un adjunto no bloquea a los demás.
  • Límite de tamaño: 20 MB de forma predeterminada por archivo. Configurable mediante channels.slack.mediaMaxMb.
  • Fallos de descarga: Se omiten los archivos que Slack no puede servir, las URLs caducadas, los archivos inaccesibles, los archivos demasiado grandes y las respuestas HTML de autenticación/inicio de sesión de Slack, en lugar de informarse como formatos no admitidos.
  • Modelo de visión: El análisis de imágenes utiliza el modelo de respuesta activo cuando admite visión, o el modelo de imagen configurado en agents.defaults.imageModel.
EscenarioComportamiento actualSolución
URL de archivo de Slack caducadaArchivo omitido; no se muestra ningún errorVolver a subir el archivo en Slack
Modelo de visión no configuradoLos adjuntos de imagen se almacenan como referencias de medios, pero no se analizan como imágenesConfigure agents.defaults.imageModel o utilice un modelo de respuesta con capacidad de visión
Imágenes muy grandes (> 20 MB de forma predeterminada)Omitido según el límite de tamañoAumente channels.slack.mediaMaxMb si Slack lo permite
Adjuntos reenviados/compartidosLos textos y los medios de imagen/archivo alojados en Slack se procesan en la medida de lo posibleComparta de nuevo directamente en el hilo de OpenClaw
Adjuntos PDFAlmacenados como contexto de archivo/medios, no enrutados automáticamente a través de la visión de imágenesUse download-file para los metadatos del archivo o la herramienta pdf para el análisis de PDF
Emparejamiento

Emparejar un usuario de Slack con la pasarela.

Grupos

Comportamiento de canales y mensajes directos de grupo.

Enrutamiento de canales

Enrutar mensajes entrantes a los agentes.

Seguridad

Modelo de amenazas y endurecimiento.

Configuración

Diseño y precedencia de la configuración.

Comandos de barra

Catálogo y comportamiento de comandos.