Pairing
DMs do Slack usam o modo de pareamento por padrão.
Slash commands
Comportamento nativo de comandos e catálogo de comandos.
Channel troubleshooting
Diagnóstico entre canais e playbooks de reparo.
Escolhendo Socket Mode ou URLs de solicitação HTTP
Ambos os transportes estão prontos para produção e alcançam paridade de recursos para mensagens, comandos de barra, App Home e interatividade. Escolha pelo formato da implantação, não pelos recursos.| Aspecto | Socket Mode (padrão) | URLs de solicitação HTTP |
|---|---|---|
| URL pública do Gateway | Não obrigatória | Obrigatória (DNS, TLS, proxy reverso ou túnel) |
| Rede de saída | WSS de saída para wss-primary.slack.com deve estar acessível | Sem WS de saída; apenas HTTPS de entrada |
| Tokens necessários | Token de bot + token de nível de app com connections:write | Token de bot + Signing Secret |
| Laptop de desenvolvimento / atrás de firewall | Funciona como está | Precisa de um túnel público (ngrok, Cloudflare Tunnel, Tailscale Funnel) ou Gateway de staging |
| Escalabilidade horizontal | Uma sessão de Socket Mode por app por host; múltiplos Gateways precisam de apps do Slack separados | Manipulador POST sem estado; múltiplas réplicas do Gateway podem compartilhar um app atrás de um balanceador de carga |
| Várias contas em um Gateway | Compatível; cada conta abre seu próprio WS | Compatível; cada conta precisa de um webhookPath único (padrão /slack/events) para que os registros não colidam |
| Transporte de comando de barra | Entregue pela conexão WS; slash_commands[].url é ignorado | O Slack envia POST para slash_commands[].url; o campo é obrigatório para o comando ser despachado |
| Assinatura da solicitação | Não usada (a autenticação é o token de nível de app) | O Slack assina cada solicitação; o OpenClaw verifica com signingSecret |
| Recuperação em queda de conexão | A reconexão automática do SDK do Slack fica habilitada; o OpenClaw também reinicia sessões de Socket Mode com falha usando backoff limitado. Aplica-se o ajuste de transporte por tempo limite de pong. | Sem conexão persistente para cair; novas tentativas são por solicitação a partir do Slack |
Escolha Socket Mode para hosts com um único Gateway, laptops de desenvolvimento e redes locais que conseguem acessar
*.slack.com na saída, mas não conseguem aceitar HTTPS de entrada.Escolha URLs de solicitação HTTP ao executar múltiplas réplicas do Gateway atrás de um balanceador de carga, quando WSS de saída estiver bloqueado mas HTTPS de entrada for permitido, ou quando você já encerrar webhooks do Slack em um proxy reverso.Modo de relay
O modo de relay separa a entrada do Slack do gateway do OpenClaw. Um roteador confiável controla a conexão única do Slack em Socket Mode, escolhe um gateway de destino e encaminha um evento tipado por um websocket autenticado. O gateway continua usando seu token de bot para chamadas de saída à Web API do Slack.wss://, a menos que aponte para localhost. Trate o token de bearer e
a tabela de rotas do roteador como parte do limite de autorização do Slack: eventos roteados entram no
manipulador normal de mensagens do Slack como ativações autorizadas. Uma slack_identity
fornecida pelo roteador no frame hello do websocket pode definir o nome de usuário e o ícone padrão de saída; uma
identidade explícita fornecida pelo chamador ainda prevalece. A conexão de relay se reconecta com a mesma
temporização de backoff limitado usada pelo Socket Mode e limpa a identidade fornecida pelo roteador sempre que
é desconectada.
Instalar
Instale o Slack antes de configurar o canal:plugins install registra e habilita o Plugin. O Plugin ainda não faz nada até você configurar o app do Slack e as configurações de canal abaixo. Consulte Plugins para o comportamento geral de Plugin e regras de instalação.
Configuração rápida
- Socket Mode (default)
- URLs de requisição HTTP
Create a new Slack app
Abra api.slack.com/apps → Create New App → From a manifest → selecione seu workspace → cole um dos manifestos abaixo → Next → Create.Depois que o Slack criar o app:
Recommended corresponde ao conjunto completo de recursos do Plugin do Slack: App Home, comandos de barra, arquivos, reações, pins, DMs em grupo e leituras de emoji/grupo de usuários. Escolha Minimal quando a política do workspace restringir escopos — ele cobre DMs, histórico de canais/grupos, menções e comandos de barra, mas remove arquivos, reações, pins, DM em grupo (
mpim:*), emoji:read e usergroups:read. Consulte Checklist de manifesto e escopos para a justificativa por escopo e opções aditivas, como comandos de barra extras.- Basic Information -> App-Level Tokens -> Generate Token and Scopes: adicione
connections:write, salve e copie o token de nível de app. - Install App -> Install to Workspace: copie o Bot User OAuth Token.
Ajuste de transporte do Socket Mode
O OpenClaw define o timeout de pong do cliente do SDK do Slack como 15 segundos por padrão para o Socket Mode. Sobrescreva as configurações de transporte somente quando precisar de ajustes específicos de workspace ou host:clientPingTimeout é a espera pelo pong depois que o SDK envia um ping do cliente; serverPingTimeout é a espera por pings do servidor do Slack. Mensagens e eventos do app continuam sendo estado da aplicação, não sinais de vivacidade do transporte.
Notas:
socketModeé ignorado no modo URL de requisição HTTP.- As configurações base de
channels.slack.socketModese aplicam a todas as contas do Slack, a menos que sejam sobrescritas. Sobrescritas por conta usamchannels.slack.accounts.<accountId>.socketMode; como isso é uma sobrescrita de objeto, inclua todos os campos de ajuste de socket que você quiser para essa conta. - Somente
clientPingTimeouttem um padrão do OpenClaw (15000).serverPingTimeoutepingPongLoggingEnabledsão passados para o SDK do Slack somente quando configurados. - O backoff de reinício do Socket Mode começa em torno de 2 segundos e tem limite em torno de 30 segundos. Falhas recuperáveis de início, espera de início e desconexão tentam novamente até que o canal pare. Erros permanentes de conta e credenciais, como autenticação inválida, tokens revogados ou escopos ausentes, falham rapidamente em vez de tentar para sempre.
Lista de verificação de manifesto e escopos
O manifesto base do app Slack é o mesmo para Socket Mode e URLs de requisição HTTP. Apenas o blocosettings (e a url do comando slash) difere.
Manifesto base (padrão do Socket Mode):
settings pela variante HTTP e adicione url a cada comando slash. URL pública obrigatória:
Configurações adicionais do manifesto
Expõe diferentes recursos que estendem os padrões acima. O manifesto padrão habilita a aba Home do Slack App Home e assinaapp_home_opened. Quando um membro do workspace abre a aba Home, o OpenClaw publica uma visualização Home padrão segura com views.publish; nenhuma carga de conversa ou configuração privada é incluída. A aba Messages permanece habilitada para DMs do Slack. O manifesto também habilita threads de assistente do Slack com features.assistant_view, assistant:write, assistant_thread_started e assistant_thread_context_changed; threads de assistente são roteadas para suas próprias sessões de thread do OpenClaw e mantêm o contexto de thread fornecido pelo Slack disponível para o agente.
Comandos de barra nativos opcionais
Comandos de barra nativos opcionais
Vários comandos de barra nativos podem ser usados em vez de um único comando configurado, com algumas nuances:
- Use
/agentstatusem vez de/status, porque o comando/statusé reservado. - No máximo 25 comandos de barra podem ficar disponíveis ao mesmo tempo.
features.slash_commands existente por um subconjunto dos comandos disponíveis:- Socket Mode (padrão)
- URLs de solicitação HTTP
Escopos de autoria opcionais (operações de escrita)
Escopos de autoria opcionais (operações de escrita)
Adicione o escopo de bot
chat:write.customize se quiser que mensagens enviadas usem a identidade do agente ativo (nome de usuário e ícone personalizados) em vez da identidade padrão do app Slack.Se você usar um ícone de emoji, o Slack espera a sintaxe :emoji_name:.Escopos opcionais de token de usuário (operações de leitura)
Escopos opcionais de token de usuário (operações de leitura)
Se você configurar
channels.slack.userToken, os escopos de leitura típicos são:channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read(se você depende de leituras de busca do Slack)
Modelo de tokens
botToken+appTokensão obrigatórios para Socket Mode.- O modo HTTP requer
botToken+signingSecret. - O modo Relay requer
botTokenmaisrelay.url,relay.authTokenerelay.gatewayId; ele não usa token de app nem segredo de assinatura. botToken,appToken,signingSecret,relay.authTokeneuserTokenaceitam strings em texto claro ou objetos SecretRef.- Tokens de configuração substituem o fallback de env.
- O fallback de env
SLACK_BOT_TOKEN/SLACK_APP_TOKENse aplica apenas à conta padrão. userTokené somente de configuração (sem fallback de env) e o padrão é comportamento somente leitura (userTokenReadOnly: true).
- A inspeção de contas do Slack rastreia campos
*Sourcee*Statuspor credencial (botToken,appToken,signingSecret,userToken). - O status é
available,configured_unavailableoumissing. configured_unavailablesignifica que a conta está configurada por SecretRef ou outra fonte de segredo não inline, mas o caminho atual de comando/runtime não conseguiu resolver o valor real.- No modo HTTP,
signingSecretStatusé incluído; no Socket Mode, o par obrigatório ébotTokenStatus+appTokenStatus.
Ações e controles
As ações do Slack são controladas porchannels.slack.actions.*.
Grupos de ações disponíveis nas ferramentas atuais do Slack:
| Grupo | Padrão |
|---|---|
| messages | habilitado |
| reactions | habilitado |
| pins | habilitado |
| memberInfo | habilitado |
| emojiList | habilitado |
send, upload-file, download-file, read, edit, delete, pin, unpin, list-pins, member-info e emoji-list. download-file aceita IDs de arquivo do Slack mostrados em placeholders de arquivos recebidos e retorna pré-visualizações de imagem para imagens ou metadados de arquivo local para outros tipos de arquivo.
Controle de acesso e roteamento
- Política de DM
- Política de canal
- Menções e usuários de canal
channels.slack.dmPolicy controla o acesso a DMs. channels.slack.allowFrom é a allowlist canônica de DM.pairing(padrão)allowlistopen(requer quechannels.slack.allowFrominclua"*")disabled
dm.enabled(padrão verdadeiro)channels.slack.allowFromdm.allowFrom(legado)dm.groupEnabled(DMs em grupo padrão falso)dm.groupChannels(allowlist MPIM opcional)
channels.slack.accounts.default.allowFromse aplica apenas à contadefault.- Contas nomeadas herdam
channels.slack.allowFromquando seu próprioallowFromnão está definido. - Contas nomeadas não herdam
channels.slack.accounts.default.allowFrom.
channels.slack.dm.policy e channels.slack.dm.allowFrom legados ainda são lidos por compatibilidade. openclaw doctor --fix os migra para dmPolicy e allowFrom quando consegue fazer isso sem alterar o acesso.O pareamento em DMs usa openclaw pairing approve slack <code>.Threads, sessões e etiquetas de resposta
- DMs roteiam como
direct; canais comochannel; MPIMs comogroup. - Vínculos de rota do Slack aceitam IDs brutos de pares, além de formas de destino do Slack como
channel:C12345678,user:U12345678e<@U12345678>. - Com o padrão
session.dmScope=main, DMs do Slack colapsam para a sessão principal do agente. - Sessões de canal:
agent:<agentId>:slack:channel:<channelId>. - Mensagens comuns de nível superior em canais permanecem na sessão por canal, mesmo quando
replyToModenão éoff. - Respostas em threads do Slack usam o
thread_tsdo Slack pai para os sufixos de sessão (:thread:<threadTs>), mesmo quando o encadeamento de respostas de saída está desabilitado comreplyToMode="off". - O OpenClaw injeta uma raiz elegível de canal de nível superior em
agent:<agentId>:slack:channel:<channelId>:thread:<rootTs>quando se espera que essa raiz inicie uma thread visível no Slack, para que a raiz e respostas posteriores na thread compartilhem uma sessão do OpenClaw. Isso se aplica a eventosapp_mention, correspondências explícitas ao bot ou a padrões de menção configurados, e canais comrequireMention: falseereplyToModediferente deoff. - O padrão de
channels.slack.thread.historyScopeéthread; o padrão dethread.inheritParentéfalse. channels.slack.thread.initialHistoryLimitcontrola quantas mensagens existentes da thread são buscadas quando uma nova sessão de thread começa (padrão20; defina0para desabilitar).channels.slack.thread.requireExplicitMention(padrãofalse): quandotrue, suprime menções implícitas em threads para que o bot responda apenas a menções explícitas@botdentro de threads, mesmo quando o bot já participou da thread. Sem isso, respostas em uma thread com participação do bot ignoram o bloqueio derequireMention.
channels.slack.replyToMode:off|first|all|batched(padrãooff)channels.slack.replyToModeByChatType: pordirect|group|channel- fallback legado para conversas diretas:
channels.slack.dm.replyToMode
[[reply_to_current]][[reply_to:<id>]]
message, defina replyBroadcast: true com action: "send" e threadId ou replyTo para pedir ao Slack que também transmita a resposta da thread para o canal pai. Isso mapeia para a flag reply_broadcast de chat.postMessage do Slack e só é compatível com envios de texto ou Block Kit, não com uploads de mídia.
Quando uma chamada da ferramenta message roda dentro de uma thread do Slack e mira o mesmo canal, o OpenClaw normalmente herda a thread atual do Slack conforme replyToMode. Defina topLevel: true em action: "send" ou action: "upload-file" para forçar uma nova mensagem no canal pai. threadId: null é aceito como a mesma opção de saída para nível superior.
replyToMode="off" desabilita o encadeamento de respostas de saída do Slack, incluindo etiquetas explícitas [[reply_to_*]]. Ele não achata sessões de thread de entrada do Slack: mensagens já postadas dentro de uma thread do Slack ainda roteiam para a sessão :thread:<threadTs>. Isso difere do Telegram, onde etiquetas explícitas ainda são respeitadas no modo "off". Threads do Slack ocultam mensagens do canal, enquanto respostas do Telegram permanecem visíveis em linha.Reações de confirmação
ackReaction envia um emoji de confirmação enquanto o OpenClaw está processando uma mensagem de entrada. ackReactionScope decide quando esse emoji é realmente enviado.
Emoji (ackReaction)
Ordem de resolução:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- fallback de emoji da identidade do agente (
agents.list[].identity.emoji; caso contrário,"eyes"/ 👀)
- O Slack espera shortcodes (por exemplo,
"eyes"). - Use
""para desabilitar a reação para a conta do Slack ou globalmente.
Escopo (messages.ackReactionScope)
O provedor Slack lê o escopo de messages.ackReactionScope (padrão "group-mentions"). Hoje não há substituição em nível de conta do Slack ou de canal do Slack; o valor é global para o Gateway.
Valores:
"all": reage em DMs e grupos."direct": reage apenas em DMs."group-all": reage a toda mensagem de grupo (sem DMs)."group-mentions"(padrão): reage em grupos, mas apenas quando o bot é mencionado (ou em mencionáveis de grupo que optaram por participar). DMs são excluídas."off"/"none": nunca reage.
O escopo padrão (
"group-mentions") não dispara reações de confirmação em mensagens diretas. Para ver o ackReaction configurado (por exemplo, "eyes") em DMs de entrada do Slack, defina messages.ackReactionScope como "direct" ou "all". messages.ackReactionScope é lido na inicialização do provedor Slack, então é necessário reiniciar o Gateway para a alteração surtir efeito.Streaming de texto
channels.slack.streaming controla o comportamento de prévia ao vivo:
off: desabilita o streaming de prévia ao vivo.partial(padrão): substitui o texto de prévia pela saída parcial mais recente.block: acrescenta atualizações de prévia em partes.progress: mostra texto de status de progresso durante a geração e depois envia o texto final.streaming.preview.toolProgress: quando a prévia de rascunho está ativa, roteia atualizações de ferramenta/progresso para a mesma mensagem de prévia editada (padrão:true). Definafalsepara manter mensagens separadas de ferramenta/progresso.streaming.preview.commandText/streaming.progress.commandText: defina comostatuspara manter linhas compactas de progresso de ferramentas enquanto oculta texto bruto de comando/execução (padrão:raw).
channels.slack.streaming.nativeTransport controla o streaming de texto nativo do Slack quando channels.slack.streaming.mode é partial (padrão: true).
Cartões de tarefa nativos de progresso do Slack são opcionais no modo de progresso. Defina channels.slack.streaming.progress.nativeTaskCards como true com channels.slack.streaming.mode="progress" para enviar um cartão de plano/tarefa nativo do Slack enquanto o trabalho está em execução e depois atualizar o mesmo cartão de tarefa na conclusão. Sem essa flag, o modo de progresso mantém o comportamento portátil de prévia de rascunho.
- Uma thread de resposta deve estar disponível para que o streaming de texto nativo e o status de thread do assistente do Slack apareçam. A seleção da thread ainda segue
replyToMode. - Raízes de canais, conversas em grupo e DMs de nível superior ainda podem usar a prévia de rascunho normal quando o streaming nativo está indisponível ou não existe thread de resposta.
- DMs de nível superior do Slack ficam fora de thread por padrão, então não mostram a prévia nativa de stream/status em estilo de thread do Slack; em vez disso, o OpenClaw posta e edita uma prévia de rascunho na DM.
- Mídia e cargas não textuais usam a entrega normal como fallback.
- Finais de mídia/erro cancelam edições de prévia pendentes; finais elegíveis de texto/bloco só são descarregados quando podem editar a prévia no lugar.
- Se o streaming falhar no meio da resposta, o OpenClaw usa a entrega normal como fallback para as cargas restantes.
channels.slack.streamMode(replace | status_final | append) é um alias legado de runtime parachannels.slack.streaming.mode.- booleano
channels.slack.streamingé um alias legado de runtime parachannels.slack.streaming.modeechannels.slack.streaming.nativeTransport. channels.slack.nativeStreaminglegado é um alias de runtime parachannels.slack.streaming.nativeTransport.- Execute
openclaw doctor --fixpara reescrever a configuração persistida de streaming do Slack para as chaves canônicas.
Fallback de reação de digitação
typingReaction adiciona uma reação temporária à mensagem de entrada do Slack enquanto o OpenClaw está processando uma resposta e depois a remove quando a execução termina. Isso é mais útil fora de respostas em threads, que usam um indicador de status padrão “está digitando…”.
Ordem de resolução:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
- O Slack espera shortcodes (por exemplo,
"hourglass_flowing_sand"). - A reação é de melhor esforço, e a limpeza é tentada automaticamente depois que a resposta ou o caminho de falha é concluído.
Mídia, divisão em partes e entrega
Inbound attachments
Inbound attachments
Anexos de arquivo do Slack são baixados de URLs privadas hospedadas pelo Slack (fluxo de requisição autenticada por token) e gravados no armazenamento de mídia quando a busca é bem-sucedida e os limites de tamanho permitem. Placeholders de arquivo incluem o
fileId do Slack para que agentes possam buscar o arquivo original com download-file.Downloads usam timeouts delimitados de inatividade e tempo total. Se a recuperação de arquivo do Slack travar ou falhar, o OpenClaw continua processando a mensagem e usa o placeholder de arquivo como fallback.O limite de tamanho de entrada em runtime tem padrão 20MB, a menos que seja substituído por channels.slack.mediaMaxMb.Outbound text and files
Outbound text and files
- partes de texto usam
channels.slack.textChunkLimit(padrão 4000) channels.slack.chunkMode="newline"habilita divisão priorizando parágrafos- envios de arquivo usam APIs de upload do Slack e podem incluir respostas em threads (
thread_ts) - o limite de mídia de saída segue
channels.slack.mediaMaxMbquando configurado; caso contrário, envios de canal usam padrões por tipo MIME do pipeline de mídia
Delivery targets
Delivery targets
Destinos explícitos preferenciais:
user:<id>para DMschannel:<id>para canais
Comandos e comportamento de barra
Comandos de barra aparecem no Slack como um único comando configurado ou vários comandos nativos. Configurechannels.slack.slashCommand para alterar os padrões de comando:
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
channels.slack.commands.native: true ou commands.native: true em configurações globais.
- O modo automático de comando nativo fica desativado para Slack, então
commands.native: "auto"não habilita comandos nativos do Slack.
- até 5 opções: blocos de botões
- 6-100 opções: menu de seleção estático
- mais de 100 opções: seleção externa com filtragem assíncrona de opções quando manipuladores de opções de interatividade estão disponíveis
- limites do Slack excedidos: valores de opção codificados recorrem a botões
agent:<agentId>:slack:slash:<userId> e ainda roteiam execuções de comando para a sessão de conversa de destino usando CommandTargetSessionKey.
Respostas interativas
O Slack pode renderizar controles de resposta interativa escritos pelo agente, mas esse recurso fica desabilitado por padrão. Para novas saídas de agente, CLI e Plugin, prefira os botões ou blocos de seleçãopresentation compartilhados. Eles usam o mesmo caminho de interação do Slack
e também degradam em outros canais.
Habilite globalmente:
[[slack_buttons: Approve:approve, Reject:reject]][[slack_select: Choose a target | Canary:canary, Production:production]]
compileSlackInteractiveReplies(...)parseSlackOptionsLine(...)isSlackInteractiveRepliesEnabled(...)buildSlackInteractiveBlocks(...)
presentation e buildSlackPresentationBlocks(...) para novos
controles renderizados no Slack.
Observações:
- Esta é uma interface legada específica do Slack. Outros canais não traduzem diretivas Slack Block Kit para seus próprios sistemas de botões.
- Os valores de callback interativo são tokens opacos gerados pelo OpenClaw, não valores brutos escritos pelo agente.
- Se blocos interativos gerados excederem os limites do Slack Block Kit, o OpenClaw recorre à resposta de texto original em vez de enviar um payload de blocos inválido.
Envios de modal pertencentes ao Plugin
Plugins do Slack que registram um manipulador interativo também podem receber eventos de ciclo de vidaview_submission e view_closed antes que o OpenClaw compacte
o payload para o evento de sistema visível ao agente. Use um destes padrões de roteamento
ao abrir um modal do Slack:
- Defina
callback_idcomoopenclaw:<namespace>:<payload>. - Ou mantenha um
callback_idexistente e coloquepluginInteractiveData: "<namespace>:<payload>"noprivate_metadatado modal.
ctx.interaction.kind como view_submission ou
view_closed, inputs normalizados e o objeto bruto completo stateValues do
Slack. O roteamento somente por ID de callback é suficiente para invocar o manipulador do plugin; inclua
os campos de roteamento de usuário/sessão existentes em private_metadata do modal quando o
modal também deve produzir um evento de sistema visível ao agente. O agente recebe um
evento de sistema compacto e redigido Slack interaction: .... Se o manipulador retornar
systemEvent.summary, systemEvent.reference ou systemEvent.data, esses
campos serão incluídos nesse evento compacto para que o agente possa referenciar
armazenamento pertencente ao plugin sem ver o payload completo do formulário.
Aprovações nativas no Slack
O Slack pode atuar como um cliente de aprovação nativo com botões e interações interativos, em vez de recorrer à Web UI ou ao terminal.- Aprovações de exec e plugin podem ser renderizadas como prompts Slack-native Block Kit.
channels.slack.execApprovals.*continua sendo a configuração de habilitação do cliente nativo de aprovação de exec e de roteamento para DM/canal.- DMs de aprovação de exec usam
channels.slack.execApprovals.approversoucommands.ownerAllowFrom. - Aprovações de Plugin usam botões nativos do Slack quando o Slack está habilitado como cliente de aprovação nativo para a sessão de origem, ou quando
approvals.pluginroteia para a sessão Slack de origem ou para um destino Slack. - DMs de aprovação de Plugin usam aprovadores do plugin Slack de
channels.slack.allowFrom,allowFromde conta nomeada ou a rota padrão da conta. - A autorização do aprovador ainda é imposta: aprovadores somente de exec não podem aprovar solicitações de plugin, a menos que também sejam aprovadores de plugin.
interactivity está habilitado nas configurações do seu app Slack, prompts de aprovação são renderizados como botões Block Kit diretamente na conversa.
Quando esses botões estão presentes, eles são a UX de aprovação principal; o OpenClaw
só deve incluir um comando manual /approve quando o resultado da ferramenta diz que aprovações
por chat estão indisponíveis ou que a aprovação manual é o único caminho.
Caminho de configuração:
channels.slack.execApprovals.enabledchannels.slack.execApprovals.approvers(opcional; recorre acommands.ownerAllowFromquando possível)channels.slack.execApprovals.target(dm|channel|both, padrão:dm)agentFilter,sessionFilter
enabled não está definido ou é "auto" e pelo menos um
aprovador de exec é resolvido. O Slack também pode lidar com aprovações nativas de plugin por esse caminho de cliente nativo
quando aprovadores do plugin Slack são resolvidos e a solicitação corresponde aos filtros de cliente nativo. Defina
enabled: false para desabilitar explicitamente o Slack como cliente de aprovação nativo. Defina enabled: true para
forçar aprovações nativas quando aprovadores forem resolvidos. Desabilitar aprovações de exec do Slack não desabilita
a entrega de aprovação nativa de plugin do Slack habilitada por meio de approvals.plugin; a entrega de aprovação de plugin
usa aprovadores do plugin Slack em vez disso.
Comportamento padrão sem configuração explícita de aprovação de exec do Slack:
approvals.exec é separado. Use-o apenas quando prompts de aprovação de exec também precisarem
ser roteados para outros chats ou destinos explícitos fora de banda. O encaminhamento compartilhado approvals.plugin também é
separado; a entrega nativa do Slack suprime esse fallback apenas quando o Slack consegue lidar com a solicitação de aprovação de plugin
nativamente.
/approve no mesmo chat também funciona em canais e DMs do Slack que já dão suporte a comandos. Veja Aprovações de exec para o modelo completo de encaminhamento de aprovação.
Eventos e comportamento operacional
- Edições/exclusões de mensagens são mapeadas para eventos de sistema.
- Transmissões de threads (respostas de thread com “Também enviar para o canal”) são processadas como mensagens normais de usuário.
- Eventos de adicionar/remover reação são mapeados para eventos de sistema.
- Eventos de entrada/saída de membro, canal criado/renomeado e adicionar/remover fixação são mapeados para eventos de sistema.
channel_id_changedpode migrar chaves de configuração de canal quandoconfigWritesestá habilitado.- Metadados de tópico/finalidade do canal são tratados como contexto não confiável e podem ser injetados no contexto de roteamento.
- O contexto inicial de iniciador de thread e histórico de thread é filtrado por allowlists de remetentes configuradas quando aplicável.
- Ações de bloco, atalhos e interações de modal emitem eventos de sistema estruturados
Slack interaction: ...com campos de payload ricos:- ações de bloco: valores selecionados, rótulos, valores de seletor e metadados
workflow_* - atalhos globais: metadados de callback e ator, roteados para a sessão direta do ator
- atalhos de mensagem: callback, ator, canal, thread e contexto da mensagem selecionada
- eventos de modal
view_submissioneview_closedcom metadados de canal roteados e entradas de formulário
- ações de bloco: valores selecionados, rótulos, valores de seletor e metadados
Referência de configuração
Referência principal: Referência de configuração - Slack.Campos Slack de alto sinal
Campos Slack de alto sinal
- modo/autenticação:
mode,botToken,appToken,signingSecret,webhookPath,accounts.* - acesso a DM:
dm.enabled,dmPolicy,allowFrom(legado:dm.policy,dm.allowFrom),dm.groupEnabled,dm.groupChannels - alternância de compatibilidade:
dangerouslyAllowNameMatching(emergência; mantenha desativado, a menos que seja necessário) - acesso a canal:
groupPolicy,channels.*,channels.*.users,channels.*.requireMention - threading/histórico:
replyToMode,replyToModeByChatType,thread.*,historyLimit,dmHistoryLimit,dms.*.historyLimit - entrega:
textChunkLimit,chunkMode,mediaMaxMb,streaming,streaming.nativeTransport,streaming.preview.toolProgress - unfurls:
unfurlLinks(padrão:false),unfurlMediapara controle de prévia de link/mídia dechat.postMessage; definaunfurlLinks: truepara reativar prévias de links - ops/recursos:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
Solução de problemas
Sem respostas em canais
Sem respostas em canais
Verifique, em ordem:Comandos úteis:
groupPolicy- allowlist de canais (
channels.slack.channels) — as chaves devem ser IDs de canal (C12345678), não nomes (#channel-name). Chaves baseadas em nome falham silenciosamente comgroupPolicy: "allowlist"porque o roteamento de canal é por ID por padrão. Para encontrar um ID: clique com o botão direito no canal no Slack → Copiar link — o valorC...no fim da URL é o ID do canal. requireMention- allowlist de
userspor canal messages.groupChat.visibleReplies: solicitações normais de grupo/canal usam"automatic"por padrão. Se você aderiu a"message_tool"e os logs mostram texto do assistente sem chamadamessage(action=send), o modelo perdeu o caminho da ferramenta de mensagem visível. O texto final permanece privado nesse modo; inspecione o log detalhado do Gateway em busca de metadados de payload suprimidos ou defina como"automatic"se quiser que toda resposta final normal do assistente seja publicada pelo caminho legado.messages.groupChat.unmentionedInbound: se for"room_event", conversa de canal permitida sem menção é contexto ambiente e permanece silenciosa, a menos que o agente chame a ferramentamessage. Veja Eventos de sala ambiente.
Mensagens de DM ignoradas
Mensagens de DM ignoradas
Verifique:
channels.slack.dm.enabledchannels.slack.dmPolicy(ou legadochannels.slack.dm.policy)- aprovações de pareamento / entradas de allowlist (
dmPolicy: "open"ainda exigechannels.slack.allowFrom: ["*"]) - DMs de grupo usam tratamento MPIM; habilite
channels.slack.dm.groupEnablede, se configurado, inclua o MPIM emchannels.slack.dm.groupChannels - Eventos de DM do Slack Assistant: logs detalhados mencionando
drop message_changedgeralmente significam que o Slack enviou um evento de thread do Assistant editado sem um remetente humano recuperável nos metadados da mensagem
Modo Socket não conecta
Modo Socket não conecta
Valide os tokens do bot e do app e a habilitação do Socket Mode nas configurações do app Slack.
O token de nível de app precisa de
connections:write, e o token de bot
Bot User OAuth Token deve pertencer ao mesmo app/workspace do Slack que o token do app.Se openclaw channels status --probe --json mostrar botTokenStatus ou
appTokenStatus: "configured_unavailable", a conta do Slack está
configurada, mas o runtime atual não conseguiu resolver o valor apoiado por
SecretRef.Logs como slack socket mode failed to start; retry ... são falhas de
inicialização recuperáveis. Escopos ausentes, tokens revogados e autenticação inválida falham rapidamente.
Um log slack token mismatch ... significa que o token do bot e o token do app
parecem pertencer a apps Slack diferentes; corrija as credenciais do app Slack.Modo HTTP não recebe eventos
Modo HTTP não recebe eventos
Valide:
- segredo de assinatura
- caminho do Webhook
- URLs de solicitação do Slack (Events + Interactivity + Slash Commands)
webhookPathexclusivo por conta HTTP- a URL pública termina TLS e encaminha solicitações para o caminho do Gateway
- o caminho
request_urldo app Slack corresponde exatamente achannels.slack.webhookPath(padrão/slack/events)
signingSecretStatus: "configured_unavailable" aparecer em snapshots de
conta, a conta HTTP está configurada, mas o runtime atual não conseguiu
resolver o segredo de assinatura apoiado por SecretRef.Um log repetido slack: webhook path ... already registered significa que duas contas HTTP
estão usando o mesmo webhookPath; dê a cada conta um caminho distinto.Comandos nativos/slash não disparam
Comandos nativos/slash não disparam
Verifique qual era sua intenção:
- modo de comando nativo (
channels.slack.commands.native: true) com comandos slash correspondentes registrados no Slack - ou modo de comando slash único (
channels.slack.slashCommand.enabled: true)
commands.native: "auto" não habilita comandos nativos do Slack; use true e crie os comandos correspondentes no app Slack. No modo HTTP, todo comando slash do Slack deve incluir a URL do Gateway. No Socket Mode, os payloads de comandos chegam pelo websocket e o Slack ignora slash_commands[].url.Verifique também commands.useAccessGroups, autorização por DM, allowlists de canais
e allowlists users por canal. O Slack retorna erros efêmeros para
remetentes bloqueados de comandos slash, incluindo:This channel is not allowed.You are not authorized to use this command here.
Referência de visão para anexos
O Slack pode anexar mídia baixada ao turno do agente quando os downloads de arquivos do Slack são bem-sucedidos e os limites de tamanho permitem. Arquivos de imagem podem passar pelo caminho de entendimento de mídia ou diretamente para um modelo de resposta com suporte a visão; outros arquivos são mantidos como contexto de arquivo baixável, em vez de tratados como entrada de imagem.Tipos de mídia compatíveis
| Tipo de mídia | Origem | Comportamento atual | Observações |
|---|---|---|---|
| Imagens JPEG / PNG / GIF / WebP | URL de arquivo do Slack | Baixadas e anexadas ao turno para processamento com suporte a visão | Limite por arquivo: channels.slack.mediaMaxMb (padrão 20 MB) |
| Arquivos PDF | URL de arquivo do Slack | Baixados e expostos como contexto de arquivo para ferramentas como download-file ou pdf | A entrada do Slack não converte PDFs em entrada de visão por imagem automaticamente |
| Outros arquivos | URL de arquivo do Slack | Baixados quando possível e expostos como contexto de arquivo | Arquivos binários não são tratados como entrada de imagem |
| Respostas em thread | Arquivos do início da thread | Arquivos da mensagem raiz podem ser hidratados como contexto quando a resposta não tem mídia direta | Inícios contendo apenas arquivos usam um placeholder de anexo |
| Mensagens com várias imagens | Vários arquivos do Slack | Cada arquivo é avaliado de forma independente | O processamento do Slack é limitado a oito arquivos por mensagem |
Pipeline de entrada
Quando uma mensagem do Slack com anexos de arquivo chega:- O OpenClaw baixa o arquivo da URL privada do Slack usando o token do bot.
- O arquivo é gravado no armazenamento de mídia em caso de sucesso.
- Caminhos de mídia baixados e tipos de conteúdo são adicionados ao contexto de entrada.
- Caminhos de modelo/ferramenta com suporte a imagem podem usar anexos de imagem desse contexto.
- Arquivos que não são imagens continuam disponíveis como metadados de arquivo ou referências de mídia para ferramentas capazes de processá-los.
Herança de anexos da raiz da thread
Quando uma mensagem chega em uma thread (tem um paithread_ts):
- Se a própria resposta não tiver mídia direta e a mensagem raiz incluída tiver arquivos, o Slack pode hidratar os arquivos raiz como contexto de início da thread.
- Anexos diretos da resposta têm precedência sobre anexos da mensagem raiz.
- Uma mensagem raiz que tem apenas arquivos e nenhum texto é representada com um placeholder de anexo para que o fallback ainda possa incluir seus arquivos.
Tratamento de vários anexos
Quando uma única mensagem do Slack contém vários anexos de arquivo:- Cada anexo é processado de forma independente pelo pipeline de mídia.
- Referências de mídia baixadas são agregadas ao contexto da mensagem.
- A ordem de processamento segue a ordem dos arquivos do Slack no payload do evento.
- Uma falha no download de um anexo não bloqueia os outros.
Limites de tamanho, download e modelo
- Limite de tamanho: padrão de 20 MB por arquivo. Configurável via
channels.slack.mediaMaxMb. - Falhas de download: arquivos que o Slack não consegue servir, URLs expiradas, arquivos inacessíveis, arquivos acima do tamanho permitido e respostas HTML de autenticação/login do Slack são ignorados em vez de relatados como formatos incompatíveis.
- Modelo de visão: a análise de imagem usa o modelo de resposta ativo quando ele oferece suporte a visão, ou o modelo de imagem configurado em
agents.defaults.imageModel.
Limites conhecidos
| Cenário | Comportamento atual | Solução alternativa |
|---|---|---|
| URL de arquivo do Slack expirada | Arquivo ignorado; nenhum erro exibido | Reenvie o arquivo no Slack |
| Modelo de visão não configurado | Anexos de imagem são armazenados como referências de mídia, mas não analisados como imagens | Configure agents.defaults.imageModel ou use um modelo de resposta com suporte a visão |
| Imagens muito grandes (> 20 MB por padrão) | Ignoradas pelo limite de tamanho | Aumente channels.slack.mediaMaxMb se o Slack permitir |
| Anexos encaminhados/compartilhados | Texto e mídia de imagem/arquivo hospedada no Slack são processados em melhor esforço | Compartilhe novamente diretamente na thread do OpenClaw |
| Anexos PDF | Armazenados como contexto de arquivo/mídia, não roteados automaticamente por visão de imagem | Use download-file para metadados de arquivo ou a ferramenta pdf para análise de PDF |
Documentação relacionada
- Pipeline de entendimento de mídia
- Ferramenta PDF
- Epic: #51349 — habilitação de visão para anexos do Slack
- Testes de regressão: #51353
- Verificação ao vivo: #51354
Relacionado
Pareamento
Pareie um usuário do Slack ao gateway.
Grupos
Comportamento de canais e DMs de grupo.
Roteamento de canais
Roteie mensagens de entrada para agentes.
Segurança
Modelo de ameaças e hardening.
Configuração
Layout e precedência de configuração.
Comandos slash
Catálogo e comportamento de comandos.