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.
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ón
Socket Mode (predeterminado)
URL de solicitud HTTP
URL de puerta de enlace pública
No requerido
Requerido (DNS, TLS, proxy inverso o túnel)
Red saliente
WSS de salida hacia wss-primary.slack.com debe ser alcanzable
Sin WS saliente; solo HTTPS entrante
Tokens necesarios
Token de bot + Token de nivel de aplicación con connections:write
Token de bot + Secreto de firma
Portátil de desarrollo / detrás de un firewall
Funciona tal cual
Necesita un túnel público (ngrok, Cloudflare Tunnel, Tailscale Funnel) o una puerta de enlace de ensayo
Escalado horizontal
Una sesión de Socket Mode por aplicación por host; múltiples puertas de enlace necesitan aplicaciones de Slack separadas
Manejador 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 enlace
Compatible; cada cuenta abre su propio WS
Compatible; cada cuenta necesita un webhookPath único (por defecto /slack/events) para que los registros no colisionen
Transporte de comandos de barra
Entregado a través de la conexión WS; se ignora slash_commands[].url
Slack hace POST a slash_commands[].url; el campo es obligatorio para que el comando se despache
Firma de la solicitud
No 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ón
La 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
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.
Abre api.slack.com/apps → Create New App → From a manifest → selecciona tu espacio de trabajo → pega uno de los manifiestos a continuación → Next → Create.
Abra api.slack.com/apps → Create New App → From a manifest → seleccione su espacio de trabajo → pegue uno de los manifiestos a continuación → reemplace https://gateway-host.example.com/slack/events con su URL pública de Gateway → Next → Create.
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.
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.
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:
”
},
{
“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”
}
]
}
Use la misma lista `slash_commands` que en el Modo Socket anterior y agregue `"url": "https://gateway-host.example.com/slack/events"` a cada entrada. Ejemplo:
Repita ese valor `url` en cada comando de la lista.
Á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:
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:
Grupo
Predeterminado
mensajes
habilitado
reacciones
habilitado
fijados
habilitado
informaciónDeMiembro
habilitado
listaDeEmojis
habilitado
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.
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.postMessagereply_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.
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.
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.
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)
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
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
- 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
openclawchannelsstatus--probe
openclawlogs--follow
openclawdoctor
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
openclawpairinglistslack
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.
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:
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.
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.
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.