Przejdź do głównej treści

Slack

Status: gotowe do użycia produkcyjnego dla DM-ów i kanałów przez integracje aplikacji Slack. Domyślnym trybem jest Socket Mode; HTTP Request URLs są również obsługiwane.

Parowanie

Slack DM-y domyślnie używają trybu parowania.

Polecenia slash

Natywne zachowanie poleceń i katalog poleceń.

Rozwiązywanie problemów z kanałami

Diagnostyka międzykanałowa i instrukcje naprawy.

Szybka konfiguracja

1

Utwórz nową aplikację Slack

W ustawieniach aplikacji Slack naciśnij przycisk Create New App:
  • wybierz from a manifest i wybierz workspace dla swojej aplikacji
  • wklej przykładowy manifest poniżej i kontynuuj tworzenie
  • wygeneruj App-Level Token (xapp-...) z connections:write
  • zainstaluj aplikację i skopiuj wyświetlony Bot Token (xoxb-...)
2

Skonfiguruj OpenClaw

{
  channels: {
    slack: {
      enabled: true,
      mode: "socket",
      appToken: "xapp-...",
      botToken: "xoxb-...",
    },
  },
}
Zapasowa konfiguracja przez env (tylko konto domyślne):
SLACK_APP_TOKEN=xapp-...
SLACK_BOT_TOKEN=xoxb-...
3

Uruchom gateway

openclaw gateway

Lista kontrolna manifestu i zakresów

{
  "display_information": {
    "name": "OpenClaw",
    "description": "Slack connector for OpenClaw"
  },
  "features": {
    "bot_user": {
      "display_name": "OpenClaw",
      "always_online": true
    },
    "app_home": {
      "messages_tab_enabled": true,
      "messages_tab_read_only_enabled": false
    },
    "slash_commands": [
      {
        "command": "/openclaw",
        "description": "Send a message to OpenClaw",
        "should_escape": false
      }
    ]
  },
  "oauth_config": {
    "scopes": {
      "bot": [
        "app_mentions:read",
        "assistant:write",
        "channels:history",
        "channels:read",
        "chat:write",
        "commands",
        "emoji:read",
        "files:read",
        "files:write",
        "groups:history",
        "groups:read",
        "im:history",
        "im:read",
        "im:write",
        "mpim:history",
        "mpim:read",
        "mpim:write",
        "pins:read",
        "pins:write",
        "reactions:read",
        "reactions:write",
        "users:read"
      ]
    }
  },
  "settings": {
    "socket_mode_enabled": true,
    "event_subscriptions": {
      "bot_events": [
        "app_mention",
        "channel_rename",
        "member_joined_channel",
        "member_left_channel",
        "message.channels",
        "message.groups",
        "message.im",
        "message.mpim",
        "pin_added",
        "pin_removed",
        "reaction_added",
        "reaction_removed"
      ]
    }
  }
}
Dodaj zakres bota chat:write.customize, jeśli chcesz, aby wiadomości wychodzące używały tożsamości aktywnego agenta (niestandardowa nazwa użytkownika i ikona) zamiast domyślnej tożsamości aplikacji Slack.Jeśli używasz ikony emoji, Slack oczekuje składni :emoji_name:.
Jeśli konfigurujesz channels.slack.userToken, typowe zakresy odczytu to:
  • channels:history, groups:history, im:history, mpim:history
  • channels:read, groups:read, im:read, mpim:read
  • users:read
  • reactions:read
  • pins:read
  • emoji:read
  • search:read (jeśli korzystasz z odczytów wyszukiwania Slacka)

Model tokenów

  • botToken + appToken są wymagane dla Socket Mode.
  • Tryb HTTP wymaga botToken + signingSecret.
  • botToken, appToken, signingSecret i userToken akceptują zwykłe ciągi znaków lub obiekty SecretRef.
  • Tokeny z konfiguracji mają pierwszeństwo przed zapasową konfiguracją env.
  • Zapasowa konfiguracja env SLACK_BOT_TOKEN / SLACK_APP_TOKEN dotyczy tylko konta domyślnego.
  • userToken (xoxp-...) jest dostępny tylko w konfiguracji (bez zapasowej konfiguracji env) i domyślnie działa w trybie tylko do odczytu (userTokenReadOnly: true).
Zachowanie migawki statusu:
  • Inspekcja konta Slack śledzi pola *Source i *Status dla każdego poświadczenia (botToken, appToken, signingSecret, userToken).
  • Status może mieć wartość available, configured_unavailable lub missing.
  • configured_unavailable oznacza, że konto jest skonfigurowane przez SecretRef lub inne niejawne źródło sekretu, ale bieżąca ścieżka polecenia/środowiska uruchomieniowego nie mogła rozwiązać rzeczywistej wartości.
  • W trybie HTTP uwzględniane jest signingSecretStatus; w Socket Mode wymagana para to botTokenStatus + appTokenStatus.
W przypadku akcji/odczytów katalogu token użytkownika może mieć pierwszeństwo, jeśli jest skonfigurowany. Do zapisów nadal preferowany jest token bota; zapisy tokenem użytkownika są dozwolone tylko wtedy, gdy userTokenReadOnly: false i token bota jest niedostępny.

Akcje i bramki

Akcje Slacka są kontrolowane przez channels.slack.actions.*. Dostępne grupy akcji w obecnych narzędziach Slacka:
GroupDefault
messagesenabled
reactionsenabled
pinsenabled
memberInfoenabled
emojiListenabled
Obecne akcje wiadomości Slack obejmują send, upload-file, download-file, read, edit, delete, pin, unpin, list-pins, member-info i emoji-list.

Kontrola dostępu i routing

channels.slack.dmPolicy kontroluje dostęp do DM-ów (starsza wersja: channels.slack.dm.policy):
  • pairing (domyślnie)
  • allowlist
  • open (wymaga, aby channels.slack.allowFrom zawierało "*"; starsza wersja: channels.slack.dm.allowFrom)
  • disabled
Flagi DM:
  • dm.enabled (domyślnie true)
  • channels.slack.allowFrom (zalecane)
  • dm.allowFrom (starsza wersja)
  • dm.groupEnabled (grupowe DM-y domyślnie false)
  • dm.groupChannels (opcjonalna lista dozwolonych MPIM)
Priorytet dla wielu kont:
  • channels.slack.accounts.default.allowFrom dotyczy tylko konta default.
  • Nazwane konta dziedziczą channels.slack.allowFrom, gdy ich własne allowFrom nie jest ustawione.
  • Nazwane konta nie dziedziczą channels.slack.accounts.default.allowFrom.
Parowanie w DM-ach używa openclaw pairing approve slack <code>.

Wątki, sesje i tagi odpowiedzi

  • DM-y są routowane jako direct; kanały jako channel; MPIM-y jako group.
  • Przy domyślnym session.dmScope=main Slack DM-y są scalane do głównej sesji agenta.
  • Sesje kanałów: agent:<agentId>:slack:channel:<channelId>.
  • Odpowiedzi w wątkach mogą tworzyć sufiksy sesji wątku (:thread:<threadTs>), gdy ma to zastosowanie.
  • Domyślną wartością channels.slack.thread.historyScope jest thread; domyślną wartością thread.inheritParent jest false.
  • channels.slack.thread.initialHistoryLimit kontroluje, ile istniejących wiadomości z wątku jest pobieranych przy rozpoczęciu nowej sesji wątku (domyślnie 20; ustaw 0, aby wyłączyć).
  • channels.slack.thread.requireExplicitMention (domyślnie false): gdy ma wartość true, wyłącza niejawne wzmianki w wątkach, tak aby bot odpowiadał tylko na jawne wzmianki @bot wewnątrz wątków, nawet jeśli bot już uczestniczył w wątku. Bez tego odpowiedzi w wątku, w którym uczestniczy bot, omijają bramkowanie requireMention.
Kontrole odpowiedzi w wątkach:
  • channels.slack.replyToMode: off|first|all|batched (domyślnie off)
  • channels.slack.replyToModeByChatType: dla direct|group|channel
  • starsza zapasowa konfiguracja dla czatów bezpośrednich: channels.slack.dm.replyToMode
Obsługiwane są ręczne tagi odpowiedzi:
  • [[reply_to_current]]
  • [[reply_to:<id>]]
Uwaga: replyToMode="off" wyłącza całe odpowiadanie w wątkach w Slacku, w tym jawne tagi [[reply_to_*]]. To różni się od Telegram, gdzie jawne tagi są nadal honorowane w trybie "off". Różnica wynika z modeli wątków na platformach: w Slacku wątki ukrywają wiadomości przed kanałem, podczas gdy odpowiedzi w Telegram pozostają widoczne w głównym przepływie czatu.

Reakcje potwierdzenia

ackReaction wysyła emoji potwierdzenia, gdy OpenClaw przetwarza wiadomość przychodzącą. Kolejność rozwiązywania:
  • channels.slack.accounts.<accountId>.ackReaction
  • channels.slack.ackReaction
  • messages.ackReaction
  • zapasowa konfiguracja emoji tożsamości agenta (agents.list[].identity.emoji, w przeciwnym razie ”👀”)
Uwagi:
  • Slack oczekuje shortcode’ów (na przykład "eyes").
  • Użyj "", aby wyłączyć reakcję dla konta Slack lub globalnie.

Strumieniowanie tekstu

channels.slack.streaming kontroluje zachowanie podglądu na żywo:
  • off: wyłącz strumieniowanie podglądu na żywo.
  • partial (domyślnie): zastępuj tekst podglądu najnowszym częściowym wynikiem.
  • block: dołączaj porcjowane aktualizacje podglądu.
  • progress: pokazuj tekst statusu postępu podczas generowania, a następnie wyślij końcowy tekst.
channels.slack.nativeStreaming kontroluje natywne strumieniowanie tekstu Slacka, gdy streaming ma wartość partial (domyślnie: true).
  • Aby pojawiło się natywne strumieniowanie tekstu, musi być dostępny wątek odpowiedzi. Wybór wątku nadal podlega replyToMode. Bez niego używany jest zwykły podgląd wersji roboczej.
  • Multimedia i ładunki inne niż tekst wracają do zwykłego dostarczania.
  • Jeśli strumieniowanie nie powiedzie się w trakcie odpowiedzi, OpenClaw wraca do zwykłego dostarczania pozostałych ładunków.
Użyj podglądu wersji roboczej zamiast natywnego strumieniowania tekstu Slacka:
{
  channels: {
    slack: {
      streaming: "partial",
      nativeStreaming: false,
    },
  },
}
Starsze klucze:
  • channels.slack.streamMode (replace | status_final | append) jest automatycznie migrowane do channels.slack.streaming.
  • wartość logiczna channels.slack.streaming jest automatycznie migrowana do channels.slack.nativeStreaming.

Zapasowa reakcja pisania

typingReaction dodaje tymczasową reakcję do przychodzącej wiadomości Slacka, gdy OpenClaw przetwarza odpowiedź, a następnie usuwa ją po zakończeniu działania. Jest to najbardziej przydatne poza odpowiedziami w wątkach, które używają domyślnego wskaźnika statusu „pisze…”. Kolejność rozwiązywania:
  • channels.slack.accounts.<accountId>.typingReaction
  • channels.slack.typingReaction
Uwagi:
  • Slack oczekuje shortcode’ów (na przykład "hourglass_flowing_sand").
  • Reakcja jest wykonywana w trybie best-effort, a po zakończeniu odpowiedzi lub ścieżki błędu automatycznie podejmowana jest próba jej usunięcia.

Multimedia, dzielenie na części i dostarczanie

Załączniki plików Slacka są pobierane z prywatnych URL-i hostowanych przez Slacka (przepływ żądań uwierzytelnianych tokenem) i zapisywane w magazynie multimediów, gdy pobranie powiedzie się i limity rozmiaru na to pozwalają.Domyślny limit rozmiaru przychodzącego w czasie działania to 20MB, chyba że zostanie nadpisany przez channels.slack.mediaMaxMb.
  • części tekstu używają channels.slack.textChunkLimit (domyślnie 4000)
  • channels.slack.chunkMode="newline" włącza dzielenie najpierw według akapitów
  • wysyłanie plików używa API przesyłania Slacka i może obejmować odpowiedzi w wątkach (thread_ts)
  • limit multimediów wychodzących podlega channels.slack.mediaMaxMb, jeśli jest skonfigurowany; w przeciwnym razie wysyłanie do kanałów używa domyślnych wartości rodzaju MIME z pipeline’u multimediów
Preferowane jawne cele:
  • user:<id> dla DM-ów
  • channel:<id> dla kanałów
Slack DM-y są otwierane przez API konwersacji Slacka podczas wysyłania do celów użytkownika.

Polecenia i zachowanie slash

  • Natywny tryb automatyczny poleceń jest wyłączony dla Slacka (commands.native: "auto" nie włącza natywnych poleceń Slacka).
  • Włącz natywne handlery poleceń Slacka za pomocą channels.slack.commands.native: true (lub globalnie commands.native: true).
  • Gdy natywne polecenia są włączone, zarejestruj pasujące polecenia slash w Slacku (nazwy /<command>), z jednym wyjątkiem:
    • zarejestruj /agentstatus dla polecenia statusu (Slack rezerwuje /status)
  • Jeśli natywne polecenia nie są włączone, możesz uruchomić jedno skonfigurowane polecenie slash przez channels.slack.slashCommand.
  • Natywne menu argumentów teraz dostosowują strategię renderowania:
    • do 5 opcji: bloki przycisków
    • 6-100 opcji: statyczne menu wyboru
    • ponad 100 opcji: zewnętrzny wybór z asynchronicznym filtrowaniem opcji, gdy dostępne są handlery opcji interaktywności
    • jeśli zakodowane wartości opcji przekraczają limity Slacka, przepływ wraca do przycisków
  • W przypadku długich ładunków opcji menu argumentów poleceń slash używają okna potwierdzenia przed wysłaniem wybranej wartości.
Domyślne ustawienia poleceń slash:
  • enabled: false
  • name: "openclaw"
  • sessionPrefix: "slack:slash"
  • ephemeral: true
Sesje slash używają izolowanych kluczy:
  • agent:<agentId>:slack:slash:<userId>
i nadal kierują wykonanie poleceń względem docelowej sesji konwersacji (CommandTargetSessionKey).

Odpowiedzi interaktywne

Slack może renderować interaktywne kontrolki odpowiedzi tworzone przez agenta, ale ta funkcja jest domyślnie wyłączona. Włącz ją globalnie:
{
  channels: {
    slack: {
      capabilities: {
        interactiveReplies: true,
      },
    },
  },
}
Albo włącz ją tylko dla jednego konta Slack:
{
  channels: {
    slack: {
      accounts: {
        ops: {
          capabilities: {
            interactiveReplies: true,
          },
        },
      },
    },
  },
}
Po włączeniu agenci mogą emitować dyrektywy odpowiedzi tylko dla Slacka:
  • [[slack_buttons: Approve:approve, Reject:reject]]
  • [[slack_select: Choose a target | Canary:canary, Production:production]]
Te dyrektywy są kompilowane do Slack Block Kit i kierują kliknięcia lub wybory z powrotem przez istniejącą ścieżkę zdarzeń interakcji Slacka. Uwagi:
  • To jest interfejs specyficzny dla Slacka. Inne kanały nie tłumaczą dyrektyw Slack Block Kit na własne systemy przycisków.
  • Interaktywne wartości callbacków to nieprzezroczyste tokeny generowane przez OpenClaw, a nie surowe wartości tworzone przez agenta.
  • Jeśli wygenerowane bloki interaktywne przekroczyłyby limity Slack Block Kit, OpenClaw wraca do oryginalnej odpowiedzi tekstowej zamiast wysyłać nieprawidłowy ładunek blocks.

Zatwierdzenia exec w Slacku

Slack może działać jako natywny klient zatwierdzeń z interaktywnymi przyciskami i interakcjami, zamiast wracać do Web UI lub terminala.
  • Zatwierdzenia exec używają channels.slack.execApprovals.* do natywnego routingu DM/kanałów.
  • Zatwierdzenia pluginów mogą nadal być rozwiązywane przez tę samą natywną powierzchnię przycisków Slacka, gdy żądanie już trafia do Slacka, a rodzaj identyfikatora zatwierdzenia to plugin:.
  • Autoryzacja zatwierdzającego jest nadal egzekwowana: tylko użytkownicy zidentyfikowani jako zatwierdzający mogą zatwierdzać lub odrzucać żądania przez Slacka.
Używa to tej samej współdzielonej powierzchni przycisków zatwierdzeń co inne kanały. Gdy interactivity jest włączone w ustawieniach aplikacji Slack, monity o zatwierdzenie są renderowane jako przyciski Block Kit bezpośrednio w konwersacji. Gdy te przyciski są obecne, są głównym UX zatwierdzania; OpenClaw powinien dołączać ręczne polecenie /approve tylko wtedy, gdy wynik narzędzia wskazuje, że zatwierdzenia na czacie są niedostępne lub ręczne zatwierdzenie jest jedyną możliwą ścieżką. Ścieżka konfiguracji:
  • channels.slack.execApprovals.enabled
  • channels.slack.execApprovals.approvers (opcjonalnie; jeśli to możliwe, używa wartości zapasowej z commands.ownerAllowFrom)
  • channels.slack.execApprovals.target (dm | channel | both, domyślnie: dm)
  • agentFilter, sessionFilter
Slack automatycznie włącza natywne zatwierdzenia exec, gdy enabled jest nieustawione lub ma wartość "auto" i zostanie rozwiązany co najmniej jeden zatwierdzający. Ustaw enabled: false, aby jawnie wyłączyć Slack jako natywnego klienta zatwierdzeń. Ustaw enabled: true, aby wymusić natywne zatwierdzenia, gdy zostaną rozwiązani zatwierdzający. Domyślne zachowanie bez jawnej konfiguracji zatwierdzeń exec dla Slacka:
{
  commands: {
    ownerAllowFrom: ["slack:U12345678"],
  },
}
Jawna natywna konfiguracja Slacka jest potrzebna tylko wtedy, gdy chcesz zastąpić zatwierdzających, dodać filtry lub włączyć dostarczanie do czatu źródłowego:
{
  channels: {
    slack: {
      execApprovals: {
        enabled: true,
        approvers: ["U12345678"],
        target: "both",
      },
    },
  },
}
Współdzielone przekazywanie approvals.exec jest oddzielne. Używaj go tylko wtedy, gdy monity zatwierdzeń exec muszą być również kierowane do innych czatów lub jawnych celów poza pasmem. Współdzielone przekazywanie approvals.plugin jest również oddzielne; natywne przyciski Slacka nadal mogą rozwiązywać zatwierdzenia pluginów, gdy te żądania już trafiają do Slacka. /approve w tym samym czacie również działa w kanałach i DM-ach Slacka, które już obsługują polecenia. Zobacz Zatwierdzenia exec, aby poznać pełny model przekazywania zatwierdzeń.

Zdarzenia i zachowanie operacyjne

  • Edycje/usunięcia wiadomości i rozgłoszenia wątków są mapowane na zdarzenia systemowe.
  • Zdarzenia dodania/usunięcia reakcji są mapowane na zdarzenia systemowe.
  • Zdarzenia dołączenia/opuszczenia członka, utworzenia/zmiany nazwy kanału oraz dodania/usunięcia przypięcia są mapowane na zdarzenia systemowe.
  • channel_id_changed może migrować klucze konfiguracji kanałów, gdy configWrites jest włączone.
  • Metadane tematu/celu kanału są traktowane jako niezaufany kontekst i mogą być wstrzykiwane do kontekstu routingu.
  • Inicjator wątku i początkowe zasianie kontekstu historii wątku są filtrowane przez skonfigurowane listy dozwolonych nadawców, jeśli ma to zastosowanie.
  • Akcje bloków i interakcje z modalami emitują ustrukturyzowane zdarzenia systemowe Slack interaction: ... z bogatymi polami ładunku:
    • akcje bloków: wybrane wartości, etykiety, wartości selektora i metadane workflow_*
    • zdarzenia modali view_submission i view_closed z routowanymi metadanymi kanału i wejściami formularza

Wskazówki do dokumentacji referencyjnej konfiguracji

Główne odniesienie:
  • Dokumentacja referencyjna konfiguracji - Slack Najważniejsze pola Slacka:
    • tryb/autoryzacja: mode, botToken, appToken, signingSecret, webhookPath, accounts.*
    • dostęp do DM-ów: dm.enabled, dmPolicy, allowFrom (starsza wersja: dm.policy, dm.allowFrom), dm.groupEnabled, dm.groupChannels
    • przełącznik zgodności: dangerouslyAllowNameMatching (awaryjny; pozostaw wyłączony, jeśli nie jest potrzebny)
    • dostęp do kanałów: groupPolicy, channels.*, channels.*.users, channels.*.requireMention
    • wątki/historia: replyToMode, replyToModeByChatType, thread.*, historyLimit, dmHistoryLimit, dms.*.historyLimit
    • dostarczanie: textChunkLimit, chunkMode, mediaMaxMb, streaming, nativeStreaming
    • operacje/funkcje: configWrites, commands.native, slashCommand.*, actions.*, userToken, userTokenReadOnly

Rozwiązywanie problemów

Sprawdź po kolei:
  • groupPolicy
  • listę dozwolonych kanałów (channels.slack.channels)
  • requireMention
  • listę dozwolonych users dla danego kanału
Przydatne polecenia:
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
Sprawdź:
  • channels.slack.dm.enabled
  • channels.slack.dmPolicy (lub starsze channels.slack.dm.policy)
  • zatwierdzenia parowania / wpisy listy dozwolonych
openclaw pairing list slack
Zweryfikuj tokeny bota i aplikacji oraz włączenie Socket Mode w ustawieniach aplikacji Slack.Jeśli openclaw channels status --probe --json pokazuje botTokenStatus lub appTokenStatus: "configured_unavailable", konto Slack jest skonfigurowane, ale bieżące środowisko uruchomieniowe nie mogło rozwiązać wartości opartej na SecretRef.
Zweryfikuj:
  • signing secret
  • ścieżkę webhooka
  • Slack Request URLs (Events + Interactivity + Slash Commands)
  • unikalny webhookPath dla każdego konta HTTP
Jeśli signingSecretStatus: "configured_unavailable" pojawia się w migawkach konta, konto HTTP jest skonfigurowane, ale bieżące środowisko uruchomieniowe nie mogło rozwiązać signing secret opartego na SecretRef.
Sprawdź, czy zamierzony był:
  • natywny tryb poleceń (channels.slack.commands.native: true) z pasującymi poleceniami slash zarejestrowanymi w Slacku
  • albo tryb pojedynczego polecenia slash (channels.slack.slashCommand.enabled: true)
Sprawdź również commands.useAccessGroups oraz listy dozwolonych kanałów/użytkowników.

Powiązane