Mainstream messaging
Slack
O suporte ao Slack abrange mensagens diretas e canais por meio de integrações de aplicativos Slack. O transporte padrão é o Socket Mode; HTTP Request URLs também são compatíveis. O modo de retransmissão destina-se a implantações gerenciadas nas quais um roteador confiável controla a entrada do Slack.
Por padrão, as mensagens diretas do Slack usam o modo de pareamento.
Comportamento de comandos nativos e catálogo de comandos.
Diagnósticos entre canais e procedimentos de reparo.
Escolha de um transporte
O Socket Mode e as HTTP Request URLs têm paridade de recursos para mensagens, comandos de barra, App Home e interatividade. Escolha de acordo com o formato da implantação, não com os recursos.
| Aspecto | Socket Mode (padrão) | HTTP Request URLs |
|---|---|---|
| URL pública do Gateway | Não obrigatória | Obrigatória (DNS, TLS, proxy reverso ou túnel) |
| Rede de saída | O WSS de saída para wss-primary.slack.com deve estar acessível |
Sem WS de saída; somente HTTPS de entrada |
| Tokens necessários | Token de bot + App-Level Token com connections:write |
Token de bot + Signing Secret |
| Notebook de desenvolvimento / protegido por firewall | Funciona sem alterações | Requer um túnel público (ngrok, Cloudflare Tunnel, Tailscale Funnel) ou um Gateway de preparação |
| Escalonamento horizontal | Uma sessão de Socket Mode por aplicativo em cada host; vários Gateways exigem aplicativos Slack separados | Manipulador POST sem estado; várias réplicas do Gateway podem compartilhar um aplicativo por trá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 exclusivo (padrão /slack/events) para que os registros não entrem em conflito |
| Transporte de comandos de barra | Entregues pela conexão WS; slash_commands[].url é ignorado |
O Slack envia POSTs para slash_commands[].url; o campo é obrigatório para o comando ser encaminhado |
| Assinatura de solicitações | Não utilizada (a autenticação é feita pelo App-Level Token) | O Slack assina todas as solicitações; o OpenClaw verifica com signingSecret |
| Recuperação após queda da conexão | A reconexão automática do SDK do Slack fica ativada; o OpenClaw também reinicia sessões de Socket Mode com falha usando recuo limitado. Aplicam-se os ajustes de transporte para tempo limite de pong. | Não há conexão persistente sujeita a queda; as novas tentativas do Slack são feitas por solicitação |
Modo de retransmissão
O modo de retransmissão separa a entrada do Slack do Gateway do OpenClaw. Um roteador confiável controla a única conexão de Socket Mode do Slack, escolhe um Gateway de destino e encaminha um evento tipado por um websocket autenticado. O Gateway continua usando seu próprio token de bot para chamadas de saída à API Web do Slack.
{ channels: { slack: { mode: "relay", botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" }, relay: { url: "wss://router.example.com/gateway/ws", authToken: { source: "env", provider: "default", id: "SLACK_RELAY_AUTH_TOKEN" }, gatewayId: "team-gateway", }, }, },}A URL de retransmissão deve usar wss://, a menos que tenha como destino o localhost. Trate o token bearer e a tabela de rotas do roteador como parte do limite de autorização do Slack: os eventos roteados entram no manipulador normal de mensagens do Slack como ativações autorizadas. Um slack_identity fornecido pelo roteador no quadro hello do websocket pode definir o nome de usuário e o ícone de saída padrão; uma identidade explícita fornecida pelo chamador ainda tem precedência. A conexão de retransmissão se reconecta com o mesmo intervalo de recuo limitado do Socket Mode e limpa a identidade fornecida pelo roteador sempre que é desconectada.
Instalações em toda a organização do Enterprise Grid
Uma conta do Slack pode receber mensagens de todos os espaços de trabalho abrangidos por uma
instalação em toda a organização do Enterprise Grid. Escolha o Socket Mode direto ou HTTP
Request URLs; o modo de retransmissão não é compatível com contas empresariais. Ambos os
manifestos de privilégio mínimo abaixo habilitam somente o caminho de eventos V1 message e app_mention,
respostas imediatas e reações de status controladas pelo ouvinte.
Socket Mode
{ "display_information": { "name": "OpenClaw", "description": "Slack connector for OpenClaw" }, "features": { "bot_user": { "display_name": "OpenClaw", "always_online": true } }, "oauth_config": { "scopes": { "bot": [ "app_mentions:read", "channels:history", "channels:read", "chat:write", "files:read", "files:write", "groups:history", "groups:read", "im:history", "im:read", "mpim:history", "mpim:read", "reactions:write", "users:read" ] } }, "settings": { "org_deploy_enabled": true, "socket_mode_enabled": true, "event_subscriptions": { "bot_events": [ "app_mention", "message.channels", "message.groups", "message.im", "message.mpim" ] } }}Solicite a um Org Admin ou Org Owner do Enterprise Grid que aprove o aplicativo, instale-o no
nível da organização e escolha os espaços de trabalho abrangidos pela instalação.
Confirme se o aplicativo está disponível em todos os espaços de trabalho pretendidos antes de iniciar
o OpenClaw. Gere um token no nível do aplicativo com connections:write para o Socket Mode
e copie o token de bot da instalação da organização. Configure a conta que
usa o token de bot instalado na organização:
{ channels: { slack: { enabled: true, mode: "socket", enterpriseOrgInstall: true, appToken: { source: "env", provider: "default", id: "SLACK_APP_TOKEN" }, botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" }, dmPolicy: "open", allowFrom: ["*"], groupPolicy: "allowlist", channels: { C0123456789: { requireMention: true }, }, }, },}HTTP Request URLs
Use o modo HTTP quando o Gateway tiver um endpoint HTTPS público e não abrir uma
conexão de Socket Mode. Substitua a URL de exemplo pela URL pública
webhookPath do Gateway (padrão /slack/events):
{ "display_information": { "name": "OpenClaw", "description": "Slack connector for OpenClaw" }, "features": { "bot_user": { "display_name": "OpenClaw", "always_online": true } }, "oauth_config": { "scopes": { "bot": [ "app_mentions:read", "channels:history", "channels:read", "chat:write", "files:read", "files:write", "groups:history", "groups:read", "im:history", "im:read", "mpim:history", "mpim:read", "reactions:write", "users:read" ] } }, "settings": { "org_deploy_enabled": true, "event_subscriptions": { "request_url": "https://gateway-host.example.com/slack/events", "bot_events": [ "app_mention", "message.channels", "message.groups", "message.im", "message.mpim" ] } }}Solicite a um Org Admin ou Org Owner do Enterprise Grid que aprove o aplicativo, instale-o no nível da organização e escolha os espaços de trabalho abrangidos pela instalação. Depois que o Slack verificar a Request URL, copie o token de bot da instalação da organização e o Basic Information -> App Credentials -> Signing Secret do aplicativo. Configure a conta empresarial com o mesmo caminho da Request URL:
{ channels: { slack: { enabled: true, mode: "http", enterpriseOrgInstall: true, botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" }, signingSecret: { source: "env", provider: "default", id: "SLACK_SIGNING_SECRET", }, webhookPath: "/slack/events", dmPolicy: "open", allowFrom: ["*"], groupPolicy: "allowlist", channels: { C0123456789: { requireMention: true }, }, }, },}Na inicialização, o OpenClaw verifica enterpriseOrgInstall com o auth.test do Slack.
Um token instalado na organização sem o sinalizador, ou um token de espaço de trabalho com o sinalizador,
causa falha na inicialização. O Slack continua sendo a fonte da verdade sobre quais espaços de trabalho
concederam a instalação; em seguida, o OpenClaw aplica as políticas configuradas de canal, usuário,
mensagem direta e menção a cada evento entregue. O Enterprise V1 rejeita todos os eventos
message e app_mention criados por bots antes do encaminhamento, independentemente de
allowBots, porque as instalações da organização não fornecem uma identidade de bot estável
qualificada pelo espaço de trabalho para evitar loops.
O suporte empresarial é intencionalmente limitado ao Socket Mode direto ou aos eventos HTTP
message e app_mention e suas respostas imediatas. O modo de retransmissão,
os comandos de barra, as interações, o App Home, os ouvintes de eventos de reação, os itens fixados, as
ferramentas de ação do Slack, as aprovações nativas do Slack, as associações, a entrega em fila ou agendada
e os envios proativos não estão disponíveis para uma conta empresarial. As reações de
confirmação, digitação e status de saída são compatíveis por meio do cliente Slack
controlado pelo ouvinte e exigem reactions:write; as notificações de reação de entrada
e as ferramentas de ação de reação continuam indisponíveis.
As respostas imediatas reutilizam o comportamento padrão de entrega do Slack para partes, mídia, metadados, fallback de identidade, prévias de links e confirmações, mas somente enquanto o cliente validado pertencente ao listener permanece no turno ativo do evento. A fila de envio em memória e os registros de participação em threads são particionados pelo workspace desse evento; o próprio cliente nunca é serializado nem persistido.
As chaves de política de canal e as entradas dm.groupChannels devem usar IDs brutos e estáveis de canais do Slack ou o
formato channel:<id>. O OpenClaw normaliza ambos os formatos para o ID bruto do canal para
correspondência em tempo de execução; os prefixos slack:, group: e mpim: causam falha na inicialização.
As entradas de política de usuário devem usar IDs estáveis de usuários do Slack; nomes, slugs, nomes de exibição
e endereços de e-mail causam falha na inicialização. Os IDs devem usar o prefixo e o corpo canônicos em maiúsculas
do Slack (por exemplo, C0123456789 ou U0123456789); variantes em minúsculas e
imitações abreviadas causam falha na inicialização. Contas Enterprise não podem habilitar
dangerouslyAllowNameMatching. Contas Enterprise podem definir o valor global
mentionPatterns.mode, mas mentionPatterns.allowIn e
mentionPatterns.denyIn causam falha na inicialização porque IDs simples de canais do Slack não são
qualificados por workspace e podem ser reutilizados entre workspaces. Instalações em workspaces
mantêm o comportamento existente de padrões de menção com escopo. Cada workspace aceito
recebe identidades separadas de roteamento, sessão, transcrição, desduplicação, histórico e cache,
mesmo quando os IDs do Slack coincidem. No fluxo message, há suporte a mensagens comuns de usuários
e eventos file_share criados por usuários; outros subtipos de mensagem são
rejeitados antes da autorização ou do processamento de eventos do sistema.
As DMs Enterprise devem estar desabilitadas (dm.enabled=false ou
dmPolicy="disabled") ou explicitamente abertas com dmPolicy="open" e
uma configuração efetiva da conta allowFrom contendo o literal "*". Uma
lista de permissões vazia ou IDs específicos de usuários sem "*" causam falha na inicialização. O pareamento e
as listas de permissões de DM por usuário são rejeitados porque os IDs de usuários do Slack não são
qualificados por workspace nesses armazenamentos de autorização. A política de canal e remetente
continua sendo aplicada às mensagens de canais.
Instalação
openclaw plugins install @openclaw/slackplugins install registra e habilita o plugin. Ele não faz nada até que o aplicativo Slack e as configurações de canal abaixo sejam configurados. Consulte Plugins para ver as regras gerais de instalação de plugins.
Configuração rápida
Os manifestos desta seção criam uma instalação com escopo de workspace. Para uma instalação em toda uma organização do Enterprise Grid, use o manifesto e fluxo de trabalho para toda a organização dedicado.
Socket Mode (padrão)
Criar um novo aplicativo Slack
Abra api.slack.com/apps → Create New App → From a manifest → selecione seu workspace → cole um dos manifestos abaixo → Next → Create.
{"display_information": {"name": "OpenClaw","description": "Conector do Slack para o 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": "O OpenClaw conecta threads do assistente do Slack a agentes do OpenClaw.","suggested_prompts": [{ "title": "O que você pode fazer?", "message": "Com o que você pode me ajudar?" },{"title": "Resumir este canal","message": "Resuma a atividade recente neste canal."},{ "title": "Elaborar uma resposta", "message": "Ajude-me a elaborar uma resposta." }]},"slash_commands": [{"command": "/openclaw","description": "Enviar uma mensagem ao 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": "Conector do Slack para o 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": "O OpenClaw conecta threads do assistente do Slack a agentes do OpenClaw.","suggested_prompts": [{ "title": "O que você pode fazer?", "message": "Com o que você pode me ajudar?" },{"title": "Resumir este canal","message": "Resuma a atividade recente neste canal."},{ "title": "Elaborar uma resposta", "message": "Ajude-me a elaborar uma resposta." }]},"slash_commands": [{"command": "/openclaw","description": "Enviar uma mensagem ao 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"]}}}Depois que o Slack criar o aplicativo:
- Basic Information -> App-Level Tokens -> Generate Token and Scopes: adicione
connections:write, salve e copie o token no nível do aplicativo. - Install App -> Install to Workspace: copie o token OAuth do usuário bot.
Configurar o OpenClaw
Configuração recomendada de SecretRef:
export SLACK_APP_TOKEN=slack-app-token-exampleexport SLACK_BOT_TOKEN=slack-bot-token-examplecat > 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" },},},}JSON5openclaw config patch --file ./slack.socket.patch.json5 --dry-runopenclaw config patch --file ./slack.socket.patch.json5Fallback por variáveis de ambiente (somente conta padrão):
SLACK_APP_TOKEN=slack-app-token-exampleSLACK_BOT_TOKEN=slack-bot-token-exampleIniciar o Gateway
openclaw gatewayURLs de solicitação HTTP
Criar um novo aplicativo Slack
Abra api.slack.com/apps → Create New App → From a manifest → selecione seu workspace → cole um dos manifestos abaixo → substitua https://gateway-host.example.com/slack/events pela URL pública do Gateway → Next → Create.
{"display_information": {"name": "OpenClaw","description": "Conector do Slack para o 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": "O OpenClaw conecta threads do assistente do Slack a agentes do OpenClaw.","suggested_prompts": [{ "title": "O que você pode fazer?", "message": "Com o que você pode me ajudar?" },{"title": "Resumir este canal","message": "Resuma a atividade recente neste canal."},{ "title": "Elaborar uma resposta", "message": "Ajude-me a elaborar uma resposta." }]},"slash_commands": [{"command": "/openclaw","description": "Enviar uma mensagem ao OpenClaw","should_escape": false,"url": "https://gateway-host.example.com/slack/events"}]},"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": {"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"}}}{"display_information": {"name": "OpenClaw","description": "Conector do Slack para o 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": "O OpenClaw conecta threads do assistente do Slack a agentes do OpenClaw.","suggested_prompts": [{ "title": "O que você pode fazer?", "message": "Com o que você pode me ajudar?" },{"title": "Resumir este canal","message": "Resuma a atividade recente neste canal."},{ "title": "Elaborar uma resposta", "message": "Ajude-me a elaborar uma resposta." }]},"slash_commands": [{"command": "/openclaw","description": "Enviar uma mensagem ao OpenClaw","should_escape": false,"url": "https://gateway-host.example.com/slack/events"}]},"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": {"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","message.channels","message.groups","message.im"]},"interactivity": {"is_enabled": true,"request_url": "https://gateway-host.example.com/slack/events","message_menu_options_url": "https://gateway-host.example.com/slack/events"}}}Depois que o Slack criar o aplicativo:
- Basic Information → App Credentials: copie o Signing Secret para verificar as solicitações.
- Install App -> Install to Workspace: copie o Bot User OAuth Token.
Configurar o OpenClaw
Configuração recomendada de SecretRef:
export SLACK_BOT_TOKEN=slack-bot-token-exampleexport SLACK_SIGNING_SECRET=...cat > slack.http.patch.json5 <<'JSON5'{channels: {slack: {enabled: true,mode: "http",botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" },signingSecret: { source: "env", provider: "default", id: "SLACK_SIGNING_SECRET" },webhookPath: "/slack/events",},},}JSON5openclaw config patch --file ./slack.http.patch.json5 --dry-runopenclaw config patch --file ./slack.http.patch.json5Iniciar o Gateway
openclaw gatewayAjuste do transporte do Socket Mode
Por padrão, o OpenClaw define como 15 segundos o tempo limite de pong do cliente do SDK do Slack no Socket Mode. Sobrescreva as configurações de transporte somente quando precisar de ajustes específicos para o espaço de trabalho ou o host:
{ channels: { slack: { mode: "socket", socketMode: { clientPingTimeout: 20000, serverPingTimeout: 30000, pingPongLoggingEnabled: false, }, }, },}Use isso somente para espaços de trabalho no Socket Mode que registrem tempos limite de pong/server-ping do websocket do Slack ou sejam executados em hosts com inanição conhecida do loop de eventos. clientPingTimeout é o tempo de espera pelo pong após o SDK enviar um ping do cliente; serverPingTimeout é o tempo de espera pelos pings do servidor do Slack. As mensagens e os eventos do aplicativo continuam sendo estado da aplicação, não sinais de atividade do transporte.
Observações:
socketModeé ignorado no modo HTTP Request URL.- As configurações
channels.slack.socketModebásicas se aplicam a todas as contas do Slack, salvo quando sobrescritas. As substituições por conta usamchannels.slack.accounts.<accountId>.socketMode; como essa é uma substituição de objeto, inclua todos os campos de ajuste de socket desejados para essa conta. - Somente
clientPingTimeouttem um valor padrão do OpenClaw (15000).serverPingTimeoutepingPongLoggingEnabledsão passados ao SDK do Slack somente quando configurados. - O recuo entre reinicializações do Socket Mode começa em aproximadamente 2 segundos e chega ao limite de aproximadamente 30 segundos. Falhas recuperáveis de inicialização, espera da inicialização e desconexão são repetidas até o canal parar. Erros permanentes de conta e credenciais, como autenticação inválida, tokens revogados ou escopos ausentes, falham imediatamente em vez de repetir indefinidamente.
Lista de verificação de manifesto e escopos
O manifesto básico do aplicativo do Slack é o mesmo para o Socket Mode e para HTTP Request URLs. Apenas o bloco settings (e o url do comando de barra) é diferente.
Manifesto básico (Socket Mode padrão):
{ "display_information": { "name": "OpenClaw", "description": "Conector do Slack para o 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": "O OpenClaw conecta threads do assistente do Slack a agentes do OpenClaw.", "suggested_prompts": [ { "title": "O que você pode fazer?", "message": "Com o que você pode me ajudar?" }, { "title": "Resumir este canal", "message": "Resuma a atividade recente neste canal." }, { "title": "Elaborar uma resposta", "message": "Ajude-me a elaborar uma resposta." } ] }, "slash_commands": [ { "command": "/openclaw", "description": "Enviar uma mensagem ao 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 o modo HTTP Request URLs, substitua settings pela variante HTTP e adicione url a cada comando de barra. URL pública obrigatória:
{ "features": { "slash_commands": [ { "command": "/openclaw", "description": "Enviar uma mensagem ao 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" } }}Configurações adicionais do manifesto
Disponibilize diferentes recursos que ampliam os padrões acima.
O manifesto padrão habilita a guia Home do Slack App Home e assina app_home_opened. Quando um membro do espaço de trabalho abre a guia Home, o OpenClaw publica uma visualização inicial padrão segura com views.publish; nenhum payload de conversa ou configuração privada é incluído. Quando o modo de comando de barra único está habilitado, a dica do comando usa channels.slack.slashCommand.name; instalações que usam comandos nativos ou nenhum comando de barra omitem essa dica. A guia Messages permanece habilitada para MDs do Slack. O manifesto também habilita threads do assistente do Slack com features.assistant_view, assistant:write, assistant_thread_started e assistant_thread_context_changed; as threads do assistente são roteadas para suas próprias sessões de thread do OpenClaw e mantêm o contexto da thread fornecido pelo Slack disponível para o agente.
Comandos de barra nativos opcionais
Vários comandos de barra nativos podem ser usados no lugar de um único comando configurado, com algumas particularidades:
- Use
/agentstatusem vez de/status, pois o comando/statusé reservado. - No máximo 25 comandos de barra podem ser registrados simultaneamente em um aplicativo do Slack (limite da plataforma Slack).
Substitua a seção features.slash_commands existente por um subconjunto dos comandos disponíveis:
Socket Mode (padrão)
{"slash_commands": [{"command": "/new","description": "Iniciar uma nova sessão","usage_hint": "[model]"},{"command": "/reset","description": "Redefinir a sessão atual"},{"command": "/compact","description": "Compactar o contexto da sessão","usage_hint": "[instructions]"},{"command": "/stop","description": "Interromper a execução atual"},{"command": "/session","description": "Gerenciar a expiração da vinculação de threads","usage_hint": "inatividade <duration|off> ou idade máxima <duration|off>"},{"command": "/think","description": "Definir o nível de raciocínio","usage_hint": "<level>"},{"command": "/verbose","description": "Alternar a saída detalhada","usage_hint": "on|off|full"},{"command": "/fast","description": "Exibir ou definir o modo rápido","usage_hint": "[status|on|off]"},{"command": "/reasoning","description": "Alternar a visibilidade do raciocínio","usage_hint": "[on|off|stream]"},{"command": "/elevated","description": "Alternar o modo elevado","usage_hint": "[on|off|ask|full]"},{"command": "/exec","description": "Exibir ou definir os padrões de execução","usage_hint": "host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>"},{"command": "/approve","description": "Aprovar ou negar solicitações de aprovação pendentes","usage_hint": "<id> <decision>"},{"command": "/model","description": "Exibir ou definir o modelo","usage_hint": "[name|#|status]"},{"command": "/models","description": "Listar provedores/modelos","usage_hint": "[provider] [page] [limit=<n>|size=<n>|all]"},{"command": "/help","description": "Exibir o resumo breve da ajuda"},{"command": "/commands","description": "Exibir o catálogo de comandos gerado"},{"command": "/tools","description": "Exibir o que o agente atual pode usar neste momento","usage_hint": "[compact|verbose]"},{"command": "/agentstatus","description": "Exibir o status do ambiente de execução, incluindo o uso/a cota do provedor quando disponível"},{"command": "/tasks","description": "Listar tarefas em segundo plano ativas/recentes da sessão atual"},{"command": "/context","description": "Explicar como o contexto é montado","usage_hint": "[list|detail|json]"},{"command": "/whoami","description": "Exibir sua identidade de remetente"},{"command": "/skill","description": "Executar uma skill pelo nome","usage_hint": "<name> [input]"},{"command": "/btw","description": "Fazer uma pergunta paralela sem alterar o contexto da sessão","usage_hint": "<question>"},{"command": "/side","description": "Fazer uma pergunta paralela sem alterar o contexto da sessão","usage_hint": "<question>"},{"command": "/usage","description": "Controlar o rodapé de uso ou exibir o resumo de custos","usage_hint": "off|tokens|full|cost"}]}URLs de solicitação HTTP
Use a mesma lista slash_commands do Socket Mode acima e adicione "url": "https://gateway-host.example.com/slack/events" a cada entrada. Exemplo:
{"slash_commands": [{"command": "/new","description": "Iniciar uma nova sessão","usage_hint": "[model]","url": "https://gateway-host.example.com/slack/events"},{"command": "/help","description": "Exibir o resumo breve da ajuda","url": "https://gateway-host.example.com/slack/events"}]}Repita esse valor url em cada comando da lista.
Escopos opcionais de autoria (operações de gravação)
Adicione o escopo de bot chat:write.customize se quiser que as mensagens enviadas usem a identidade do agente ativo (nome de usuário e ícone personalizados) em vez da identidade padrão do aplicativo Slack.
Se usar um ícone de emoji, o Slack espera a sintaxe :emoji_name:.
Escopos opcionais do token de usuário (operações de leitura)
Se 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ê depender de leituras de pesquisa do Slack)
Modelo de tokens
botToken+appTokensão obrigatórios para o Socket Mode.- O modo HTTP requer
botToken+signingSecret. - O modo de retransmissão requer
botToken, além derelay.url,relay.authTokenerelay.gatewayId; ele não usa um token de aplicativo nem um segredo de assinatura. botToken,appToken,signingSecret,relay.authTokeneuserTokenaceitam strings de texto simples ou objetos SecretRef.- Os tokens da configuração substituem o fallback das variáveis de ambiente.
- Os fallbacks das variáveis de ambiente
SLACK_BOT_TOKEN,SLACK_APP_TOKENeSLACK_USER_TOKENse aplicam, cada um, somente à conta padrão. userTokenadota por padrão o comportamento somente leitura (userTokenReadOnly: true).
Comportamento do instantâneo de status:
- A inspeção de contas do Slack acompanha, por credencial, os campos
*Sourcee*Status(botToken,appToken,signingSecret,userToken). - O status é
available,configured_unavailableoumissing. configured_unavailablesignifica que a conta está configurada por meio de SecretRef ou de outra fonte de segredo não embutida, mas o caminho atual do comando/ambiente de execução 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 por channels.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 |
As ações atuais de mensagens do Slack incluem send, upload-file, download-file, read, edit, delete, pin, unpin, list-pins, member-info e emoji-list. download-file aceita IDs de arquivos do Slack exibidos nos placeholders de arquivos recebidos e retorna prévias para imagens ou metadados de arquivos locais para outros tipos de arquivo.
Controle de acesso e roteamento
Política de mensagens diretas
channels.slack.dmPolicy controla o acesso a mensagens diretas. channels.slack.allowFrom é a lista de permissões canônica de mensagens diretas.
pairing(padrão)allowlistopen(requer quechannels.slack.allowFrominclua"*")disabled
Sinalizadores de mensagens diretas:
dm.enabled(padrão: true)channels.slack.allowFromdm.allowFrom(legado)dm.groupEnabled(padrão para mensagens diretas em grupo: false)dm.groupChannels(lista de permissões MPIM opcional)
Precedência entre várias contas:
channels.slack.accounts.default.allowFromaplica-se somente à contadefault.- Contas nomeadas herdam
channels.slack.allowFromquando seu próprioallowFromnão está definido. - Contas nomeadas não herdam
channels.slack.accounts.default.allowFrom.
Os itens legados channels.slack.dm.policy e channels.slack.dm.allowFrom ainda são lidos para compatibilidade. openclaw doctor --fix os migra para dmPolicy e allowFrom quando isso pode ser feito sem alterar o acesso.
O pareamento em mensagens diretas usa openclaw pairing approve slack <code>.
Política de canais
channels.slack.groupPolicy controla o tratamento de canais:
openallowlistdisabled
A lista de permissões de canais fica em channels.slack.channels e deve usar IDs estáveis de canais do Slack (por exemplo, C12345678) como chaves de configuração.
Observação sobre o ambiente de execução: se channels.slack estiver completamente ausente (configuração somente por variáveis de ambiente), o ambiente de execução recorrerá a groupPolicy="allowlist" e registrará um aviso (mesmo que channels.defaults.groupPolicy esteja definido).
Resolução de nome/ID:
- as entradas da lista de permissões de canais e da lista de permissões de mensagens diretas são resolvidas na inicialização quando o acesso ao token permite
- as entradas de nomes de canais não resolvidas são mantidas conforme configuradas, mas ignoradas por padrão no roteamento
- a autorização de entrada e o roteamento de canais priorizam IDs por padrão; a correspondência direta de nome de usuário/slug requer
channels.slack.dangerouslyAllowNameMatching: true
Menções e usuários de canais
Por padrão, mensagens em canais exigem menção.
Fontes de menção:
- menção explícita ao aplicativo (
<@botId>) - menção a grupo de usuários do Slack (
<!subteam^S...>) quando o usuário do bot é membro desse grupo de usuários; requerusergroups:read - padrões de expressões regulares de menção (
agents.list[].groupChat.mentionPatterns, fallbackmessages.groupChat.mentionPatterns) - comportamento implícito de resposta à thread do bot (desabilitado quando
thread.requireExplicitMentionétrue)
Controles por canal (channels.slack.channels.<id>; nomes somente por resolução na inicialização ou dangerouslyAllowNameMatching):
requireMentionignoreOtherMentionsreplyToMode(off|first|all|batched; substitui o modo de resposta da conta/do tipo de conversa para este canal)users(lista de permissões)allowBotsskillssystemPrompttools,toolsBySender- formato da chave
toolsBySender:channel:,id:,e164:,username:,name:ou curinga"*"(chaves legadas sem prefixo ainda são mapeadas somente paraid:)
ignoreOtherMentions (padrão false) descarta mensagens de canais que mencionam outro usuário ou grupo de usuários, mas não este bot. Mensagens diretas e mensagens diretas em grupo (MPIMs) não são afetadas. O filtro exige um ID de usuário do bot resolvido de auth.test; se essa identidade não estiver disponível (por exemplo, uma identidade somente com token de usuário), o bloqueio falha de forma permissiva e as mensagens passam sem alterações.
allowBots é conservador para canais e canais privados: mensagens de sala enviadas por bots são aceitas somente quando o bot remetente está explicitamente listado na lista de permissões users dessa sala ou quando pelo menos um ID explícito de proprietário do Slack de channels.slack.allowFrom é atualmente membro da sala. Curingas e entradas de proprietário por nome de exibição não atendem ao requisito de presença do proprietário. A presença do proprietário usa o conversations.members do Slack; verifique se o aplicativo tem o escopo de leitura correspondente ao tipo de sala (channels:read para canais públicos, groups:read para canais privados). Se a consulta de membros falhar, o OpenClaw descartará a mensagem de sala enviada pelo bot.
Mensagens aceitas do Slack enviadas por bots usam a proteção compartilhada contra loops de bots. Configure channels.defaults.botLoopProtection para o limite padrão e, em seguida, substitua-o por channels.slack.botLoopProtection ou channels.slack.channels.<id>.botLoopProtection quando um espaço de trabalho ou canal precisar de um limite diferente.
Threads, sessões e tags de resposta
- Mensagens diretas são roteadas como
direct; canais comochannel; MPIMs comogroup. - Os vínculos de rota do Slack aceitam IDs de pares brutos e formatos de destino do Slack, como
channel:C12345678,user:U12345678e<@U12345678>. - Com o
session.dmScope=mainpadrão, as mensagens diretas do Slack são consolidadas na 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 específica do canal, mesmo quando
replyToModenão éoff. - As 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á desativado comreplyToMode="off". - O OpenClaw inicializa uma raiz de canal de nível superior qualificada em
agent:<agentId>:slack:channel:<channelId>:thread:<rootTs>quando se espera que essa raiz inicie uma thread visível do Slack, para que a raiz e as respostas posteriores da thread compartilhem uma única sessão do OpenClaw. Isso se aplica a eventosapp_mention, correspondências explícitas de menção ao bot ou de padrões de menção configurados e canaisrequireMention: falsecomreplyToModediferente 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 obtidas quando uma nova sessão de thread é iniciada (padrão20; defina como0para desativar).channels.slack.thread.requireExplicitMention(padrãofalse): quandotrue, suprime menções implícitas em threads para que o bot responda somente a menções explícitas de@botdentro das threads, mesmo quando o bot já participou da thread. Sem isso, respostas em uma thread da qual o bot participou ignoram o bloqueio derequireMention.
Controles de encadeamento de respostas:
channels.slack.channels.<id>.replyToMode: substituição por canal para mensagens de canais/canais privados do Slackchannels.slack.replyToMode:off|first|all|batched(padrãooff)channels.slack.replyToModeByChatType: pordirect|group|channel- fallback legado para conversas diretas:
channels.slack.dm.replyToMode
Há suporte a tags manuais de resposta:
[[reply_to_current]][[reply_to:<id>]]
Para respostas explícitas em threads do Slack pela ferramenta message, defina replyBroadcast: true com action: "send" e threadId ou replyTo para solicitar que o Slack também transmita a resposta da thread para o canal pai. Isso corresponde à sinalização reply_broadcast de chat.postMessage do Slack e é compatível somente com envios de texto ou Block Kit, não com uploads de mídia.
Quando uma chamada da ferramenta message é executada dentro de uma thread do Slack e tem como destino o mesmo canal, o OpenClaw normalmente herda a thread atual do Slack de acordo com o replyToMode efetivo da conta, do tipo de conversa ou específico do canal. Respostas automáticas e chamadas send ou upload-file para o mesmo canal usam a mesma substituição específica do canal. 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 exclusão de nível superior.
Reações de confirmação
ackReaction envia um emoji de confirmação enquanto o OpenClaw processa uma mensagem recebida. ackReactionScope determina quando esse emoji é efetivamente enviado.
Por padrão, a confirmação permanece estática enquanto o status nativo da thread do assistente do Slack mostra o progresso com mensagens de carregamento rotativas. Defina messages.statusReactions.enabled: true para ativar o ciclo de vida de reações de fila/raciocínio/ferramenta/conclusão/erro.
Emoji (ackReaction)
Ordem de resolução:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- fallback para o emoji de identidade do agente (
agents.list[].identity.emoji; caso contrário,"eyes"/ 👀)
Observações:
- O Slack espera códigos curtos (por exemplo,
"eyes"). - Use
""para desativar a reação na conta do Slack ou globalmente.
Escopo (messages.ackReactionScope)
O provedor do Slack lê o escopo de messages.ackReactionScope (padrão "group-mentions"). Atualmente, não há substituição no nível da conta ou do canal do Slack; o valor é global para o Gateway.
Valores:
"all": reagir em mensagens diretas e grupos, incluindo eventos ambientes de salas."direct": reagir somente em mensagens diretas."group-all": reagir a todas as mensagens de grupo, exceto eventos ambientes de salas (sem mensagens diretas)."group-mentions"(padrão): reagir em grupos, mas somente quando o bot for mencionado (ou em elementos mencionáveis do grupo que tenham aderido). Mensagens diretas são excluídas."off"/"none": nunca reagir.
{ messages: { ackReaction: "eyes", ackReactionScope: "all", // reagir em mensagens diretas e grupos },}Streaming de texto
channels.slack.streaming controla o comportamento da visualização ao vivo:
off: desativar o streaming da visualização ao vivo.partial(padrão): substituir o texto da visualização pela saída parcial mais recente.block: acrescentar atualizações fragmentadas à visualização.progress: mostrar o texto de status do progresso durante a geração e, em seguida, enviar o texto final.streaming.preview.toolProgress: quando a visualização de rascunho estiver ativa, rotear atualizações de ferramentas/progresso para a mesma mensagem de visualização editada (padrão:true). Definafalsepara manter mensagens separadas de ferramentas/progresso.streaming.preview.commandText/streaming.progress.commandText: defina comostatuspara manter linhas compactas de progresso de ferramentas e ocultar o texto bruto de comandos/execução (padrão:raw).
Oculte o texto bruto de comandos/execução mantendo linhas compactas de progresso:
{ "channels": { "slack": { "streaming": { "mode": "progress", "progress": { "toolProgress": true, "commandText": "status" } } } }}channels.slack.streaming.nativeTransport controla o streaming de texto nativo do Slack quando channels.slack.streaming.mode é partial (padrão: true).
Os cartões de tarefas de progresso nativos 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 estiver em execução e, em seguida, atualizar o mesmo cartão de tarefa na conclusão. Sem essa sinalização, o modo de progresso mantém o comportamento portátil da visualização de rascunho.
- Uma thread de resposta deve estar disponível para que o streaming de texto nativo e o status da thread do assistente do Slack apareçam. A seleção da thread ainda segue
replyToMode. - Canais, conversas em grupo e raízes de mensagens diretas de nível superior ainda podem usar a visualização de rascunho normal quando o streaming nativo não estiver disponível ou não houver uma thread de resposta.
- As mensagens diretas de nível superior do Slack permanecem fora de threads por padrão, portanto não mostram a visualização de streaming/status nativa em estilo de thread do Slack; em vez disso, o OpenClaw publica e edita uma visualização de rascunho na mensagem direta.
- Mídias e cargas que não sejam de texto usam a entrega normal como fallback.
- Resultados finais de mídia/erro cancelam edições pendentes da visualização; resultados finais qualificados de texto/bloco são enviados somente quando podem editar a visualização no lugar.
- Se o streaming falhar durante a resposta, o OpenClaw usará a entrega normal como fallback para as cargas restantes.
Use a visualização de rascunho em vez do streaming de texto nativo do Slack:
{ channels: { slack: { streaming: { mode: "partial", nativeTransport: false, }, }, },}Ative os cartões de tarefas de progresso nativos do Slack:
{ channels: { slack: { streaming: { mode: "progress", progress: { nativeTaskCards: true, render: "rich", }, }, }, },}Chaves legadas:
channels.slack.streamMode(replace | status_final | append) é um alias legado dechannels.slack.streaming.mode.- O booleano
channels.slack.streamingé um alias legado dechannels.slack.streaming.modeechannels.slack.streaming.nativeTransport. channels.slack.chunkModeechannels.slack.nativeStreamingde nível superior são aliases legados dechannels.slack.streaming.chunkModeechannels.slack.streaming.nativeTransport.- Aliases legados não são lidos em tempo de execução; execute
openclaw doctor --fixpara reescrever a configuração persistida de streaming do Slack com as chaves canônicas.
Fallback de reação de digitação
typingReaction adiciona uma reação temporária à mensagem recebida do Slack enquanto o OpenClaw processa uma resposta e a remove quando a execução termina. Isso é mais útil fora das respostas em threads, que usam um indicador de status padrão "está digitando...".
Ordem de resolução:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
Observações:
- O Slack espera códigos curtos (por exemplo,
"hourglass_flowing_sand"). - A reação é realizada com o melhor esforço possível, e a limpeza é tentada automaticamente após a conclusão da resposta ou do fluxo de falha.
Entrada de voz
Para falar com o OpenClaw no Slack atualmente, envie um clipe de áudio do Slack para o aplicativo OpenClaw. O microfone de ditado do Slackbot é um recurso separado pertencente ao Slack, não uma API de aplicativo.
- O ditado por voz do Slackbot fica dentro da conversa privada do usuário com o Slackbot. O Slack transforma a gravação em um prompt do Slackbot, mas não disponibiliza um arquivo de áudio, evento de ditado, prompt ou marcador de fonte de entrada para aplicativos de terceiros do Slack por meio da Events API. O plugin do Slack para OpenClaw não pode habilitá-lo nem recebê-lo.
- Os clipes de áudio do Slack são arquivos armazenados no Slack que podem ser publicados em uma DM, canal ou thread do OpenClaw. O OpenClaw baixa um clipe acessível com o token do bot, normaliza os metadados MIME do clipe fornecidos pelo Slack e o envia pelo pipeline compartilhado de transcrição de áudio. O manifesto de aplicativo recomendado inclui o escopo
files:readnecessário.
Os clipes de áudio e o ditado do Slackbot têm semânticas de privacidade diferentes: os clipes seguem a política de retenção de arquivos do Slack, e o OpenClaw os baixa para transcrição, enquanto o Slack afirma que o áudio do ditado não é armazenado.
Em um canal com requireMention: true, um clipe de áudio sem legenda pode satisfazer o requisito ao pronunciar um padrão de menção configurado (agents.list[].groupChat.mentionPatterns, usando messages.groupChat.mentionPatterns como alternativa). O OpenClaw autoriza o remetente antes de baixar ou transcrever o clipe e só o admite quando a transcrição corresponde ao padrão. Uma transcrição especulativa que falhe ou não corresponda é descartada junto com o clipe baixado; ela não é mantida no histórico do canal. A identidade nativa @bot do Slack não pode ser inferida pela fala; portanto, configure um padrão de nome falado ou inclua uma menção digitada. Se a repetição da transcrição estiver habilitada, ela só será enviada após a admissão.
Mídia, divisão em partes e entrega
Anexos recebidos
Os arquivos anexados do Slack são baixados de URLs privadas hospedadas pelo Slack (fluxo de solicitação autenticado por token) e gravados no armazenamento de mídia quando a busca é bem-sucedida e os limites de tamanho permitem. Os placeholders de arquivo incluem o fileId do Slack para que os agentes possam buscar o arquivo original com download-file.
Os downloads usam tempos limite ocioso e total delimitados. Se a recuperação de um arquivo do Slack travar ou falhar, o OpenClaw continuará processando a mensagem e usará o placeholder do arquivo como alternativa.
O limite de tamanho para entradas durante a execução é 20MB por padrão, a menos que seja substituído por channels.slack.mediaMaxMb.
Texto e arquivos enviados
- os blocos de texto usam
channels.slack.textChunkLimit(padrão8000, limitado ao próprio limite de comprimento de mensagens do Slack) channels.slack.streaming.chunkMode="newline"habilita a divisão priorizando parágrafos- os envios de arquivos usam as APIs de upload do Slack e podem incluir respostas em threads (
thread_ts) - legendas longas de arquivos usam o primeiro bloco de texto compatível com o Slack como comentário do upload e enviam os blocos restantes como mensagens subsequentes
- o limite de mídia de saída segue
channels.slack.mediaMaxMbquando configurado; caso contrário, os envios pelo canal usam os padrões por tipo MIME do pipeline de mídia
Destinos de entrega
Destinos explícitos preferenciais:
user:<id>para DMschannel:<id>para canais
DMs do Slack somente com texto/blocos podem publicar diretamente em IDs de usuário; uploads de arquivos e envios em threads primeiro abrem a DM por meio das APIs de conversa do Slack, pois esses caminhos exigem um ID de conversa concreto.
Comandos e comportamento de barra
Os comandos de barra aparecem no Slack como um único comando configurado ou como vários comandos nativos. Configure channels.slack.slashCommand para alterar os padrões dos comandos:
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
/openclaw /helpOs comandos nativos exigem configurações adicionais do manifesto no seu aplicativo do Slack e são habilitados com channels.slack.commands.native: true ou, em configurações globais, com commands.native: true.
- O modo automático de comandos nativos fica desativado para o Slack, portanto
commands.native: "auto"não habilita os comandos nativos do Slack.
/helpOs menus de argumentos nativos são renderizados de uma das seguintes formas, em ordem de prioridade:
- 3-5 opções suficientemente curtas: um menu adicional ("...")
- mais de 100 opções, com filtragem assíncrona de opções disponível: seleção externa
- 1-2 opções ou qualquer opção cujo valor codificado seja longo demais para uma seleção: blocos de botões
- caso contrário (6-100 opções ou mais de 100 sem filtragem assíncrona): menu de seleção estática, dividido em 100 opções por menu
/thinkAs sessões de barra usam chaves isoladas como agent:<agentId>:slack:slash:<userId> e ainda encaminham as execuções de comandos à sessão da conversa de destino usando CommandTargetSessionKey.
Gráficos nativos
O bloco data_visualization do Block Kit público do Slack
renderiza gráficos de linhas, barras, áreas e pizza nas mensagens. O OpenClaw mapeia o bloco portátil
presentation chart para esse formato nativo; nenhum escopo OAuth adicional,
upload de arquivo, renderizador de imagens ou configuração do Slack é necessário além do acesso normal a mensagens
chat:write.
{ "blocks": [ { "type": "chart", "chartType": "bar", "title": "Receita trimestral", "categories": ["1º tri", "2º tri"], "series": [{ "name": "Receita", "values": [120, 145] }], "xLabel": "Trimestre" } ]}Os limites do Slack são aplicados antes da renderização nativa:
- título e rótulos opcionais dos eixos: 50 caracteres
- pizza: 1-12 segmentos positivos
- linha/barra/área: 1-12 séries com nomes exclusivos e 1-20 categorias compartilhadas
- rótulos de segmentos, categorias e séries: 20 caracteres
- cada série deve conter um valor finito para cada categoria; valores que não sejam de pizza podem ser negativos
Cada gráfico nativo também inclui uma representação textual de nível superior para leitores
de tela, notificações, espelhamento de sessão e clientes que não conseguem renderizar o
bloco. Os envios com apresentação padrão para outros canais do OpenClaw recebem os mesmos
dados determinísticos do gráfico como texto, a menos que anunciem suporte nativo a gráficos. Se
o Slack rejeitar o gráfico com invalid_blocks durante uma implantação em fases, o OpenClaw
removerá os blocos de dados nativos rejeitados, manterá os controles irmãos e enviará
a representação completa do gráfico como texto visível.
Atualmente, o Slack aceita até dois blocos data_visualization por mensagem. Quando
uma apresentação contém mais de dois gráficos válidos, o OpenClaw mantém a ordem
deles e continua a renderização nativa em mensagens subsequentes, com no máximo dois
gráficos em cada mensagem.
O lançamento para desenvolvedores do Slack documenta o bloco como um recurso do Block Kit voltado para aplicativos e não publica nenhuma restrição de plano pago. A linguagem sobre elegibilidade para Business+/Enterprise aplica-se à geração automática de gráficos por IA do Slackbot, que é separada do envio, por um aplicativo, de um gráfico do Block Kit já estruturado. Os gráficos são blocos exclusivos de mensagens, não conteúdo do App Home, de modais ou do Canvas.
Tabelas nativas
O atual bloco data_table do Block Kit
do Slack renderiza linhas e colunas estruturadas em mensagens. O OpenClaw mapeia um bloco portátil
explícito presentation table para data_table; ele não usa o
antigo bloco table
do Slack. Nenhum escopo OAuth nem configuração adicional do Slack é necessário além do acesso normal
a mensagens chat:write.
{ "blocks": [ { "type": "table", "caption": "Pipeline aberto", "headers": ["Conta", "Etapa", "ARR"], "rows": [ ["Acme", "Ganho", 125000], ["Globex", "Revisão", 82000] ], "rowHeaderColumnIndex": 0 } ]}O OpenClaw mapeia cabeçalhos e células de texto para células raw_text do Slack. Células numéricas
são mapeadas para raw_number, com o valor numérico finito preservado para ordenação
e filtragem nativas. rowHeaderColumnIndex, quando presente, marca essa
coluna baseada em zero como cabeçalhos de linha do Slack.
Os limites publicados de data_table do Slack são aplicados antes da renderização nativa:
- 1-20 colunas
- 1-100 linhas de dados, além da linha de cabeçalho
- o mesmo número de células em cada linha
- no máximo 10.000 caracteres agregados entre todas as células de tabela em uma mensagem
Vários blocos de tabela válidos podem ser renderizados nativamente enquanto a mensagem permanecer dentro do limite agregado de caracteres. Uma tabela que não puder ser renderizada dentro do limite nativo se tornará texto determinístico completo, em vez de perder linhas ou células. Se esse texto exceder uma mensagem do Slack, os envios e as respostas a comandos de barra usarão blocos de texto ordenados. As edições de tabela falham com um erro explícito de tamanho, em vez de truncar silenciosamente linhas de uma mensagem existente.
Cada tabela nativa produzida a partir de uma apresentação portátil também inclui uma representação
textual de nível superior para leitores de tela, notificações, espelhamento de sessão e
clientes que não conseguem renderizar o bloco. Os valores brutos de gráficos e tabelas permanecem literais
no fallback, para que dados de células como <@U123> não se tornem uma menção do Slack.
Se o Slack rejeitar blocos nativos de gráfico ou tabela com invalid_blocks, o OpenClaw
removerá todos os blocos de dados nativos em uma única etapa de recuperação limitada, preservará blocos
irmãos válidos, como botões e seletores, e enviará o texto visível completo de gráficos
e tabelas com a formatação do Slack desativada. A entrega de comandos de barra
acompanha o orçamento de cinco chamadas response_url do Slack ao longo do comando. Antes de cada
lote de respostas, ela seleciona um plano completo que caiba nas chamadas restantes ou falha
antes de publicar esse lote.
Somente blocos de tabela presentation explícitos são promovidos a tabelas nativas.
Tabelas Markdown com barras verticais permanecem como texto criado; o OpenClaw não tenta deduzir a estrutura
da tabela nem os tipos das células. Produtores nativos confiáveis existentes do Slack podem continuar
enviando blocos brutos por meio de channelData.slack.blocks; o OpenClaw deriva o texto
de fallback de células data_table brutas válidas, enquanto blocos personalizados malformados podem
ser reduzidos à legenda ou ao fallback geral do Block Kit. A saída portátil de agentes, da CLI
e de plugins deve usar presentation.
Respostas interativas
O Slack pode renderizar controles de resposta interativos criados por agentes, mas esse recurso vem desativado por padrão.
Para novas saídas de agentes, da CLI e de plugins, prefira os botões ou blocos de seleção
compartilhados presentation. Eles usam o mesmo caminho de interação do Slack
e também oferecem degradação em outros canais.
Ative-o globalmente:
{ channels: { slack: { capabilities: { interactiveReplies: true, }, }, },}Ou ative-o somente para uma conta do Slack:
{ channels: { slack: { accounts: { ops: { capabilities: { interactiveReplies: true, }, }, }, }, },}Quando ativado, os agentes ainda podem emitir diretivas de resposta obsoletas exclusivas do Slack:
[[slack_buttons: Approve:approve, Reject:reject]][[slack_select: Choose a target | Canary:canary, Production:production]]
Essas diretivas são compiladas no Block Kit do Slack e encaminham cliques ou seleções de volta pelo caminho existente de eventos de interação do Slack. Mantenha-as para prompts antigos e alternativas específicas do Slack; use a apresentação compartilhada para novos controles portáteis.
As APIs do compilador de diretivas também estão obsoletas para novos códigos produtores:
compileSlackInteractiveReplies(...)parseSlackOptionsLine(...)isSlackInteractiveRepliesEnabled(...)buildSlackInteractiveBlocks(...)
Use payloads presentation e buildSlackPresentationBlocks(...) para novos
controles renderizados pelo Slack.
Observações:
- Esta é uma interface legada específica do Slack. Outros canais não traduzem as diretivas do 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 criados pelo agente.
- Se os blocos interativos gerados excederem os limites do Slack Block Kit, o OpenClaw usará como alternativa a resposta de texto original, em vez de enviar um payload de blocos inválido.
Envios de modais pertencentes a plugins
Os plugins do Slack que registram um manipulador interativo também podem receber eventos de ciclo de vida
view_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.
O manipulador recebe ctx.interaction.kind como view_submission ou
view_closed, o inputs normalizado e o objeto bruto completo stateValues do
Slack. O roteamento somente pelo ID de callback é suficiente para invocar o manipulador do plugin; inclua
os campos de roteamento de usuário/sessão private_metadata do modal existente quando o
modal também precisar produzir um evento de sistema visível ao agente. O agente recebe um
evento de sistema Slack interaction: ... compacto e censurado. 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 o
armazenamento pertencente ao plugin sem ver o payload completo do formulário.
Aprovações nativas no Slack
O Slack pode atuar como cliente nativo de aprovação com botões e interações, em vez de usar como alternativa a interface Web ou o terminal.
- As aprovações de execução e de plugins podem ser renderizadas como solicitações nativas do Slack Block Kit.
channels.slack.execApprovals.*continua sendo a configuração de habilitação do cliente nativo de aprovação de execução e de roteamento para DM/canal.- As DMs de aprovação de execução usam
channels.slack.execApprovals.approversoucommands.ownerAllowFrom. - As aprovações de plugins usam botões nativos do Slack quando o Slack está habilitado como cliente nativo de aprovação para a sessão de origem, ou quando
approvals.plugindireciona para a sessão de origem do Slack ou para um destino do Slack. - As DMs de aprovação de plugins usam os aprovadores de plugins do Slack de
channels.slack.allowFrom, oallowFromda conta nomeada ou a rota padrão da conta. - A autorização do aprovador continua sendo aplicada: aprovadores exclusivos de execução não podem aprovar solicitações de plugins, a menos que também sejam aprovadores de plugins.
Isso usa a mesma superfície compartilhada de botões de aprovação que os outros canais. Quando interactivity está habilitado nas configurações do seu aplicativo Slack, as solicitações de aprovação são renderizadas como botões do Block Kit diretamente na conversa.
Quando esses botões estão presentes, eles são a experiência principal de aprovação; o OpenClaw
só deve incluir um comando manual /approve quando o resultado da ferramenta indicar que as aprovações
pelo 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; usacommands.ownerAllowFromcomo alternativa quando possível)channels.slack.execApprovals.target(dm|channel|both, padrão:dm)agentFilter,sessionFilter
O Slack habilita automaticamente as aprovações nativas de execução quando enabled não está definido ou é "auto" e pelo menos um
aprovador de execução é resolvido. O Slack também pode processar aprovações nativas de plugins por esse caminho de cliente
nativo quando os aprovadores de plugins do Slack são resolvidos e a solicitação corresponde aos filtros do cliente nativo. Defina
enabled: false para desabilitar explicitamente o Slack como cliente nativo de aprovação. Defina enabled: true para
forçar as aprovações nativas quando os aprovadores forem resolvidos. Desabilitar as aprovações de execução do Slack não desabilita
a entrega nativa de aprovações de plugins no Slack habilitada por meio de approvals.plugin; a entrega de aprovações de
plugins usa os aprovadores de plugins do Slack.
Comportamento padrão sem configuração explícita de aprovação de execução do Slack:
{ commands: { ownerAllowFrom: ["slack:U12345678"], },}A configuração nativa do Slack explícita só é necessária quando se deseja substituir aprovadores, adicionar filtros ou ativar a entrega no chat de origem:
{ channels: { slack: { execApprovals: { enabled: true, approvers: ["U12345678"], target: "both", }, }, },}O encaminhamento compartilhado approvals.exec é separado. Use-o somente quando as solicitações de aprovação de execução também precisarem
ser direcionadas para outros chats ou destinos explícitos fora de banda. O encaminhamento compartilhado approvals.plugin também é
separado; a entrega nativa do Slack suprime essa alternativa somente quando o Slack pode processar a solicitação de aprovação de
plugin nativamente.
O /approve no mesmo chat também funciona em canais e DMs do Slack que já oferecem suporte a comandos. Consulte Aprovações de execução para ver o modelo completo de encaminhamento de aprovações.
Eventos e comportamento operacional
- Edições/exclusões de mensagens são mapeadas para eventos de sistema.
- Transmissões de threads (respostas em threads com "Also send to channel") são processadas como mensagens normais de usuário.
- Eventos de adição/remoção de reações são mapeados para eventos de sistema.
- Eventos de entrada/saída de membros, criação/renomeação de canais e adição/remoção de itens fixados são mapeados para eventos de sistema.
- A sondagem opcional de presença pode mapear uma transição observada de
awayparaactivede um participante humano para a sessão elegível do Slack em que esse participante esteve ativo mais recentemente. O padrão é desativado. channel_id_changedpode migrar chaves de configuração de canais quandoconfigWritesestá habilitado.- Os 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 iniciador da thread e a propagação inicial do contexto do histórico da thread são filtrados pelas listas de remetentes permitidos configuradas, quando aplicável.
- Ações de blocos, atalhos e interações com modais emitem eventos de sistema estruturados
Slack interaction: ...com campos de payload detalhados:- ações de blocos: valores selecionados, rótulos, valores de seletores e metadados
workflow_* - atalhos globais: metadados de callback e do ator, direcionados para a sessão direta do ator
- atalhos de mensagens: contexto do callback, ator, canal, thread e mensagem selecionada
- eventos de modal
view_submissioneview_closedcom metadados do canal roteado e entradas do formulário
- ações de blocos: valores selecionados, rótulos, valores de seletores e metadados
Defina atalhos globais ou de mensagens na configuração do seu aplicativo Slack e use qualquer ID de callback não vazio. O OpenClaw confirma o recebimento dos payloads de atalhos correspondentes, aplica a mesma política de remetentes de DM/canal das outras interações do Slack e enfileira o evento sanitizado para a sessão roteada do agente. IDs de acionamento e URLs de resposta são censurados no contexto do agente.
Eventos de presença
O Slack não envia alterações de presença pela Events API nem pelo Socket Mode. Em vez disso, o OpenClaw pode consultar periodicamente users.getPresence para participantes humanos cujas mensagens passaram pelas verificações normais de acesso e roteamento do Slack.
{ channels: { slack: { presenceEvents: { mode: "auto" }, channels: { C0123456789: { presenceEvents: { mode: "on" } }, C0987654321: { presenceEvents: { mode: "off" } }, }, }, },}off(padrão): sem temporizador de presença ou chamadas à API do Slack.auto: monitora DMs, MPIMs e threads do Slack ativas nas últimas 24 horas com no máximo 8 participantes humanos observados. Sessões de canal no nível superior são excluídas.on: monitora as mesmas conversas sem o limite de participantes e inclui sessões de canal no nível superior. Use uma substituição por canal para forçar ou suprimir um canal.
O OpenClaw consulta no máximo 45 usuários únicos por minuto em cada conta do Slack, registra o primeiro resultado sem despertar o agente e só o desperta em uma transição observada de away para active. Um período de espera persistente de 8 horas é aplicado por conta do Slack e por usuário, mesmo que essa pessoa participe de várias threads. O evento é direcionado somente para a conversa elegível em que essa pessoa esteve ativa mais recentemente e instrui o agente a consultar a memória/wiki e o contexto de fuso horário conhecido antes de decidir se deve enviar uma saudação curta. O agente pode permanecer em silêncio.
O token do bot precisa de users:read, que já está incluído no manifesto recomendado. Os eventos de presença não estão disponíveis para instalações de toda a organização no Enterprise Grid.
Referência de configuração
Referência principal: Referência de configuração — Slack.
Campos de alta relevância do Slack
- modo/autenticação:
mode,enterpriseOrgInstall,botToken,appToken,signingSecret,webhookPath,accounts.* - acesso a DMs:
dm.enabled,dmPolicy,allowFrom(legado:dm.policy,dm.allowFrom),dm.groupEnabled,dm.groupChannels - alternância de compatibilidade:
dangerouslyAllowNameMatching(uso emergencial; mantenha desativado, a menos que necessário) - acesso a canais:
groupPolicy,channels.*,channels.*.users,channels.*.requireMention - threads/histórico:
replyToMode,replyToModeByChatType,thread.*,historyLimit,dmHistoryLimit,dms.*.historyLimit - despertares por presença:
presenceEvents.mode,channels.*.presenceEvents.mode(off|auto|on; padrãooff) - entrega:
textChunkLimit,streaming.chunkMode,mediaMaxMb,streaming,streaming.nativeTransport,streaming.preview.toolProgress - expansões:
unfurlLinks(padrão:false),unfurlMediapara controle de pré-visualização de links/mídiachat.postMessage; definaunfurlLinks: truepara reativar as pré-visualizações de links - operações/recursos:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
Solução de problemas
Sem respostas nos canais
Verifique, na ordem:
groupPolicy- lista de canais permitidos (
channels.slack.channels) — as chaves devem ser IDs de canais (C12345678), não nomes (#channel-name). Chaves baseadas em nomes falham silenciosamente comgroupPolicy: "allowlist", pois, por padrão, o roteamento de canais prioriza o ID. Para encontrar um ID: clique com o botão direito no canal no Slack → Copy link — o valorC...no final da URL é o ID do canal. requireMention- lista de permissões
userspor canal messages.groupChat.visibleReplies: solicitações normais de grupo/canal usam"automatic"por padrão. Se você ativou"message_tool"e os logs mostram texto do assistente sem uma chamada amessage(action=send), o modelo não usou o caminho visível da ferramenta de mensagens. O texto final permanece privado nesse modo; inspecione o log detalhado do Gateway para ver os metadados do payload suprimido ou defina-o como"automatic"se quiser que todas as respostas finais normais do assistente sejam publicadas pelo caminho legado.messages.groupChat.unmentionedInbound: se for"room_event", conversas não mencionadas em canais permitidos são contexto ambiente e permanecem em silêncio, a menos que o agente chame a ferramentamessage. Consulte Eventos de sala ambiente.
{messages: {groupChat: { visibleReplies: "automatic",},},}Comandos úteis:
openclaw channels status --probeopenclaw logs --followopenclaw doctorMensagens de DM ignoradas
Verifique:
channels.slack.dm.enabledchannels.slack.dmPolicy(ou o legadochannels.slack.dm.policy)- aprovações de pareamento / entradas da lista de permissões (
dmPolicy: "open"ainda exigechannels.slack.allowFrom: ["*"]) - MDs em grupo usam o tratamento de MPIM; habilite
channels.slack.dm.groupEnablede, se configurado, inclua a MPIM emchannels.slack.dm.groupChannels - eventos de MD do Slack Assistant: logs detalhados que mencionam
drop message_changedgeralmente significam que o Slack enviou um evento editado de thread do Assistant sem um remetente humano recuperável nos metadados da mensagem
openclaw pairing list slackO modo Socket não está se conectando
Valide os tokens do bot e do aplicativo e a habilitação do Socket Mode nas configurações do aplicativo Slack.
O App-Level Token precisa de connections:write, e o Bot User OAuth Token
do bot deve pertencer ao mesmo aplicativo/workspace do Slack que o token do aplicativo.
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
baseado em SecretRef.
Logs como slack socket mode failed to start; retry ... representam falhas de
inicialização recuperáveis. Escopos ausentes, tokens revogados e autenticação inválida falham imediatamente.
Um log slack token mismatch ... significa que o token do bot e o token do aplicativo
parecem pertencer a aplicativos Slack diferentes; corrija as credenciais do aplicativo Slack.
O modo HTTP não está recebendo eventos
Valide:
- segredo de assinatura
- caminho do Webhook
- URLs de solicitação do Slack (eventos + interatividade + comandos de barra)
webhookPathexclusivo por conta HTTP- a URL pública encerra o TLS e encaminha as solicitações para o caminho do Gateway
- o caminho
request_urldo aplicativo Slack corresponde exatamente achannels.slack.webhookPath(padrão/slack/events)
Se signingSecretStatus: "configured_unavailable" aparecer nos snapshots da
conta, a conta HTTP está configurada, mas o runtime atual não conseguiu
resolver o segredo de assinatura baseado em SecretRef.
Um log slack: webhook path ... already registered repetido significa que duas contas
HTTP estão usando o mesmo webhookPath; atribua um caminho distinto a cada conta.
Comandos nativos/de barra não são acionados
Verifique qual opção era pretendida:
- modo de comando nativo (
channels.slack.commands.native: true) com comandos de barra correspondentes registrados no Slack - ou modo de comando de barra único (
channels.slack.slashCommand.enabled: true)
O Slack não cria nem remove comandos de barra automaticamente. commands.native: "auto" não habilita comandos nativos do Slack; use true e crie os comandos correspondentes no aplicativo Slack. No modo HTTP, todo comando de barra do Slack deve incluir a URL do Gateway. No Socket Mode, os payloads dos comandos chegam pelo websocket, e o Slack ignora slash_commands[].url.
Verifique também commands.useAccessGroups, a autorização de MD, as listas de permissões de canais
e as listas de permissões users por canal. O Slack retorna erros efêmeros para
remetentes bloqueados de comandos de barra, incluindo:
This channel is not allowed.You are not authorized to use this command here.
Referência de mídia dos anexos
O Slack pode anexar mídias baixadas ao turno do agente quando o download de arquivos do Slack é bem-sucedido e os limites de tamanho permitem. Clipes de áudio podem ser transcritos, arquivos de imagem podem passar pelo fluxo de compreensão de mídia ou diretamente para um modelo de resposta com capacidade de visão, e outros arquivos permanecem disponíveis como contexto de arquivo para download.
Tipos de mídia compatíveis
| Tipo de mídia | Origem | Comportamento atual | Observações |
|---|---|---|---|
| Clipes de áudio do Slack | URL de arquivo Slack | Baixados e encaminhados pelo sistema compartilhado de transcrição de áudio | Exige files:read e um modelo ou CLI tools.media.audio funcional |
| Imagens JPEG / PNG / GIF / WebP | URL de arquivo Slack | Baixadas e anexadas ao turno para processamento com capacidade de visão | Limite por arquivo: channels.slack.mediaMaxMb (padrão de 20 MB) |
| Arquivos PDF | URL de arquivo Slack | Baixados e expostos como contexto de arquivo para ferramentas como download-file ou pdf |
A entrada do Slack não converte PDFs automaticamente em entrada de visão por imagem |
| Outros arquivos | URL de arquivo 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 threads | Arquivos da mensagem inicial da thread | Os arquivos da mensagem raiz podem ser carregados como contexto quando a resposta não tem mídia direta | Mensagens iniciais contendo apenas arquivos usam um placeholder de anexo |
| Mensagens com vários arquivos | 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 chega uma mensagem do Slack com arquivos anexados:
- O OpenClaw baixa o arquivo da URL privada do Slack usando o token do bot.
- Após o sucesso, o arquivo é gravado no armazenamento de mídia.
- Os caminhos e os tipos de conteúdo das mídias baixadas são adicionados ao contexto de entrada.
- Os clipes de áudio são encaminhados ao pipeline compartilhado de transcrição; os fluxos de modelos/ferramentas com capacidade para imagens podem usar anexos de imagem do mesmo contexto.
- Outros arquivos permanecem disponíveis como metadados 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 pai thread_ts):
- Se a própria resposta não tiver mídia direta e a mensagem raiz incluída tiver arquivos, o Slack poderá carregar os arquivos da raiz como contexto inicial da thread.
- Os arquivos da raiz são carregados somente ao iniciar uma sessão de thread nova ou redefinida. Respostas posteriores contendo apenas texto reutilizam o contexto da sessão existente e não anexam novamente os arquivos da raiz como novas mídias.
- Os anexos diretos da resposta têm precedência sobre os anexos da mensagem raiz.
- Uma mensagem raiz que tenha apenas arquivos e nenhum texto é representada por um placeholder de anexo para que o fallback ainda possa incluir seus arquivos.
Processamento de vários anexos
Quando uma única mensagem do Slack contém vários arquivos anexados:
- Cada anexo é processado de forma independente pelo pipeline de mídia.
- As referências das mídias 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 demais.
Limites de tamanho, download e modelo
- Limite de tamanho: padrão de 20 MB por arquivo. Configurável por meio de
channels.slack.mediaMaxMb. - Limite de transcrição de áudio:
tools.media.audio.maxBytestambém se aplica quando o arquivo baixado é enviado a um provedor de transcrição ou à CLI. - Falhas de download: arquivos que o Slack não consegue fornecer, URLs expiradas, arquivos inacessíveis ou grandes demais e respostas HTML de autenticação/login do Slack são ignorados em vez de serem relatados como formatos incompatíveis.
- Modelo de visão: a análise de imagens usa o modelo de resposta ativo quando ele oferece suporte a visão ou o modelo de imagem configurado em
agents.defaults.imageModel.
Limitações conhecidas
| Cenário | Comportamento atual | Solução alternativa |
|---|---|---|
| URL de arquivo do Slack expirada | O arquivo é ignorado; nenhum erro é exibido | Reenvie o arquivo no Slack |
| Transcrição de áudio indisponível | O clipe permanece anexado, mas nenhuma transcrição é produzida | Configure tools.media.audio ou instale uma CLI de transcrição local compatível |
| Clipe sem legenda não passa pelo filtro de menção | Descartado após transcrição especulativa privada; a transcrição e o download são descartados | Configure um padrão de menção por nome falado, adicione uma menção digitada ao bot ou use uma MD |
| Modelo de visão não configurado | Os anexos de imagem são armazenados como referências de mídia, mas não são analisados como imagens | Configure agents.defaults.imageModel ou use um modelo de resposta com capacidade de visão |
| Imagens muito grandes (> 20 MB por padrão) | Ignoradas conforme o limite de tamanho | Aumente channels.slack.mediaMaxMb se o Slack permitir |
| Anexos encaminhados/compartilhados | O processamento de texto e mídia de imagem/arquivo hospedada no Slack é realizado com o melhor esforço | Compartilhe novamente diretamente na thread do OpenClaw |
| Anexos PDF | Armazenados como contexto de arquivo/mídia, sem encaminhamento automático para visão por imagem | Use download-file para metadados de arquivo ou a ferramenta pdf para análise de PDF |
Documentação relacionada
Relacionados
Pareie um usuário do Slack com o Gateway.
Comportamento de canais e MDs em grupo.
Encaminhe mensagens de entrada aos agentes.
Modelo de ameaças e proteção.
Estrutura e precedência da configuração.
Catálogo e comportamento dos comandos.