Mainstream messaging

Slack

Gotowe do produkcyjnego użycia w wiadomościach prywatnych i kanałach przez integracje aplikacji Slack. Domyślny tryb to Socket Mode; obsługiwane są też adresy URL żądań HTTP.

Wybór Socket Mode albo adresów URL żądań HTTP

Oba transporty są gotowe do produkcyjnego użycia i osiągają parytet funkcji dla wiadomości, poleceń slash, App Home oraz interaktywności. Wybierz na podstawie kształtu wdrożenia, nie funkcji.

Obszar Socket Mode (domyślny) Adresy URL żądań HTTP
Publiczny adres URL Gateway Nie jest wymagany Wymagany (DNS, TLS, odwrotny serwer proxy albo tunel)
Sieć wychodząca Wychodzący WSS do wss-primary.slack.com musi być osiągalny Bez wychodzącego WS; tylko przychodzący HTTPS
Wymagane tokeny Token bota (xoxb-...) + token na poziomie aplikacji (xapp-...) z connections:write Token bota (xoxb-...) + sekret podpisywania
Laptop deweloperski / za zaporą Działa od razu Wymaga publicznego tunelu (ngrok, Cloudflare Tunnel, Tailscale Funnel) albo stagingowego Gateway
Skalowanie poziome Jedna sesja Socket Mode na aplikację na host; wiele Gateway wymaga osobnych aplikacji Slack Bezstanowy handler POST; wiele replik Gateway może współdzielić jedną aplikację za load balancerem
Wiele kont na jednym Gateway Obsługiwane; każde konto otwiera własny WS Obsługiwane; każde konto potrzebuje unikalnego webhookPath (domyślnie /slack/events), aby rejestracje się nie zderzały
Transport poleceń slash Dostarczane przez połączenie WS; slash_commands[].url jest ignorowane Slack wysyła POST do slash_commands[].url; pole jest wymagane, aby polecenie zostało obsłużone
Podpisywanie żądań Nie jest używane (uwierzytelnianie to token na poziomie aplikacji) Slack podpisuje każde żądanie; OpenClaw weryfikuje je za pomocą signingSecret
Odzyskiwanie po zerwaniu połączenia SDK Slack automatycznie ponawia połączenie; obowiązuje strojenie transportu timeoutu pong Gateway Brak trwałego połączenia do zerwania; ponowienia są per żądanie od Slack

Szybka konfiguracja

Socket Mode (default)

  • Create a new Slack app

    Otwórz api.slack.com/appsCreate New AppFrom a manifest → wybierz swój workspace → wklej jeden z poniższych manifestów → NextCreate.

    {
    "display_information": {
    "name": "OpenClaw",
    "description": "Slack connector for OpenClaw"
    },
    "features": {
    "bot_user": { "display_name": "OpenClaw", "always_online": true },
    "app_home": {
    "home_tab_enabled": true,
    "messages_tab_enabled": true,
    "messages_tab_read_only_enabled": false
    },
    "slash_commands": [
    {
    "command": "/openclaw",
    "description": "Send a message to OpenClaw",
    "should_escape": false
    }
    ]
    },
    "oauth_config": {
    "scopes": {
    "bot": [
    "app_mentions:read",
    "assistant:write",
    "channels:history",
    "channels:read",
    "chat:write",
    "commands",
    "emoji:read",
    "files:read",
    "files:write",
    "groups:history",
    "groups:read",
    "im:history",
    "im:read",
    "im:write",
    "mpim:history",
    "mpim:read",
    "mpim:write",
    "pins:read",
    "pins:write",
    "reactions:read",
    "reactions:write",
    "usergroups:read",
    "users:read"
    ]
    }
    },
    "settings": {
    "socket_mode_enabled": true,
    "event_subscriptions": {
    "bot_events": [
    "app_home_opened",
    "app_mention",
    "channel_rename",
    "member_joined_channel",
    "member_left_channel",
    "message.channels",
    "message.groups",
    "message.im",
    "message.mpim",
    "pin_added",
    "pin_removed",
    "reaction_added",
    "reaction_removed"
    ]
    }
    }
    }
    
    {
    "display_information": {
    "name": "OpenClaw",
    "description": "Slack connector for OpenClaw"
    },
    "features": {
    "bot_user": { "display_name": "OpenClaw", "always_online": true },
    "app_home": {
    "home_tab_enabled": true,
    "messages_tab_enabled": true,
    "messages_tab_read_only_enabled": false
    },
    "slash_commands": [
    {
    "command": "/openclaw",
    "description": "Send a message to OpenClaw",
    "should_escape": false
    }
    ]
    },
    "oauth_config": {
    "scopes": {
    "bot": [
    "app_mentions:read",
    "assistant:write",
    "channels:history",
    "channels:read",
    "chat:write",
    "commands",
    "groups:history",
    "groups:read",
    "im:history",
    "im:read",
    "im:write",
    "users:read"
    ]
    }
    },
    "settings": {
    "socket_mode_enabled": true,
    "event_subscriptions": {
    "bot_events": [
    "app_home_opened",
    "app_mention",
    "message.channels",
    "message.groups",
    "message.im"
    ]
    }
    }
    }
    

    Po utworzeniu aplikacji przez Slack:

    • Basic Information → App-Level Tokens → Generate Token and Scopes: dodaj connections:write, zapisz, skopiuj wartość xapp-....
    • Install App → Install to Workspace: skopiuj token OAuth użytkownika bota xoxb-....
  • Configure OpenClaw

    Zalecana konfiguracja SecretRef:

    export SLACK_APP_TOKEN=xapp-...
    export SLACK_BOT_TOKEN=xoxb-...
    cat > slack.socket.patch.json5 <<'JSON5'
    {
    channels: {
    slack: {
    enabled: true,
    mode: "socket",
    appToken: { source: "env", provider: "default", id: "SLACK_APP_TOKEN" },
    botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" },
    },
    },
    }
    JSON5
    openclaw config patch --file ./slack.socket.patch.json5 --dry-run
    openclaw config patch --file ./slack.socket.patch.json5
    

    Fallback przez zmienne środowiskowe (tylko konto domyślne):

    SLACK_APP_TOKEN=xapp-...
    SLACK_BOT_TOKEN=xoxb-...
    
  • Start gateway

    openclaw gateway
    
  • HTTP Request URLs

  • Create a new Slack app

    Otwórz api.slack.com/appsCreate New AppFrom a manifest → wybierz swój workspace → wklej jeden z poniższych manifestów → zastąp https://gateway-host.example.com/slack/events publicznym adresem URL Gateway → NextCreate.

    {
    "display_information": {
    "name": "OpenClaw",
    "description": "Slack connector for OpenClaw"
    },
    "features": {
    "bot_user": { "display_name": "OpenClaw", "always_online": true },
    "app_home": {
    "home_tab_enabled": true,
    "messages_tab_enabled": true,
    "messages_tab_read_only_enabled": false
    },
    "slash_commands": [
    {
    "command": "/openclaw",
    "description": "Send a message to 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",
    "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": "Slack connector for OpenClaw"
    },
    "features": {
    "bot_user": { "display_name": "OpenClaw", "always_online": true },
    "app_home": {
    "home_tab_enabled": true,
    "messages_tab_enabled": true,
    "messages_tab_read_only_enabled": false
    },
    "slash_commands": [
    {
    "command": "/openclaw",
    "description": "Send a message to 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",
    "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"
    }
    }
    }
    

    Po utworzeniu aplikacji przez Slack:

    • Basic Information → App Credentials: skopiuj Signing Secret do weryfikacji żądań.
    • Install App → Install to Workspace: skopiuj token OAuth użytkownika bota xoxb-....
  • Configure OpenClaw

    Zalecana konfiguracja SecretRef:

    export SLACK_BOT_TOKEN=xoxb-...
    export 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",
    },
    },
    }
    JSON5
    openclaw config patch --file ./slack.http.patch.json5 --dry-run
    openclaw config patch --file ./slack.http.patch.json5
    
  • Start gateway

    openclaw gateway
    
  • Dostrajanie transportu w trybie Socket Mode

    OpenClaw domyślnie ustawia limit czasu pong klienta Slack SDK na 15 sekund dla trybu Socket Mode. Nadpisuj ustawienia transportu tylko wtedy, gdy potrzebujesz dostrojenia specyficznego dla obszaru roboczego lub hosta:

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

    Używaj tego tylko w obszarach roboczych Socket Mode, które rejestrują limity czasu pong WebSocket Slack lub server-ping, albo działają na hostach ze znanym problemem głodzenia pętli zdarzeń. clientPingTimeout to czas oczekiwania na pong po wysłaniu przez SDK pingu klienta; serverPingTimeout to czas oczekiwania na pingi serwera Slack. Wiadomości i zdarzenia aplikacji pozostają stanem aplikacji, a nie sygnałami żywotności transportu.

    Lista kontrolna manifestu i zakresów

    Podstawowy manifest aplikacji Slack jest taki sam dla Socket Mode i adresów URL żądań HTTP. Różni się tylko blok settings (oraz url polecenia ukośnikowego).

    Podstawowy manifest (domyślny Socket Mode):

    {
      "display_information": {
        "name": "OpenClaw",
        "description": "Slack connector for OpenClaw"
      },
      "features": {
        "bot_user": { "display_name": "OpenClaw", "always_online": true },
        "app_home": {
          "home_tab_enabled": true,
          "messages_tab_enabled": true,
          "messages_tab_read_only_enabled": false
        },
        "slash_commands": [
          {
            "command": "/openclaw",
            "description": "Send a message to OpenClaw",
            "should_escape": false
          }
        ]
      },
      "oauth_config": {
        "scopes": {
          "bot": [
            "app_mentions:read",
            "assistant:write",
            "channels:history",
            "channels:read",
            "chat:write",
            "commands",
            "emoji:read",
            "files:read",
            "files:write",
            "groups:history",
            "groups:read",
            "im:history",
            "im:read",
            "im:write",
            "mpim:history",
            "mpim:read",
            "mpim:write",
            "pins:read",
            "pins:write",
            "reactions:read",
            "reactions:write",
            "usergroups:read",
            "users:read"
          ]
        }
      },
      "settings": {
        "socket_mode_enabled": true,
        "event_subscriptions": {
          "bot_events": [
            "app_home_opened",
            "app_mention",
            "channel_rename",
            "member_joined_channel",
            "member_left_channel",
            "message.channels",
            "message.groups",
            "message.im",
            "message.mpim",
            "pin_added",
            "pin_removed",
            "reaction_added",
            "reaction_removed"
          ]
        }
      }
    }
    

    Dla trybu adresów URL żądań HTTP zastąp settings wariantem HTTP i dodaj url do każdego polecenia ukośnikowego. Wymagany jest publiczny URL:

    {
      "features": {
        "slash_commands": [
          {
            "command": "/openclaw",
            "description": "Send a message to OpenClaw",
            "should_escape": false,
            "url": "https://gateway-host.example.com/slack/events"
          }
        ]
      },
      "settings": {
        "event_subscriptions": {
          "request_url": "https://gateway-host.example.com/slack/events",
          "bot_events": [
            "app_home_opened",
            "app_mention",
            "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"
        }
      }
    }
    

    Dodatkowe ustawienia manifestu

    Udostępniaj różne funkcje rozszerzające powyższe wartości domyślne.

    Domyślny manifest włącza kartę Home w Slack App Home i subskrybuje app_home_opened. Gdy członek obszaru roboczego otworzy kartę Home, OpenClaw publikuje bezpieczny domyślny widok Home za pomocą views.publish; ładunek konwersacji ani prywatna konfiguracja nie są dołączane. Karta Messages pozostaje włączona dla wiadomości DM Slack.

    Optional native slash commands

    Zamiast jednego skonfigurowanego polecenia można z niuansami używać wielu natywnych poleceń ukośnikowych:

    • Użyj /agentstatus zamiast /status, ponieważ polecenie /status jest zarezerwowane.
    • Jednocześnie można udostępnić nie więcej niż 25 poleceń ukośnikowych.

    Zastąp istniejącą sekcję features.slash_commands podzbiorem dostępnych poleceń:

    Socket Mode (default)

    {
    "slash_commands": [
    {
    "command": "/new",
    "description": "Start a new session",
    "usage_hint": "[model]"
    },
    {
    "command": "/reset",
    "description": "Reset the current session"
    },
    {
    "command": "/compact",
    "description": "Compact the session context",
    "usage_hint": "[instructions]"
    },
    {
    "command": "/stop",
    "description": "Stop the current run"
    },
    {
    "command": "/session",
    "description": "Manage thread-binding expiry",
    "usage_hint": "idle <duration|off> or max-age <duration|off>"
    },
    {
    "command": "/think",
    "description": "Set the thinking level",
    "usage_hint": "<level>"
    },
    {
    "command": "/verbose",
    "description": "Toggle verbose output",
    "usage_hint": "on|off|full"
    },
    {
    "command": "/fast",
    "description": "Show or set fast mode",
    "usage_hint": "[status|on|off]"
    },
    {
    "command": "/reasoning",
    "description": "Toggle reasoning visibility",
    "usage_hint": "[on|off|stream]"
    },
    {
    "command": "/elevated",
    "description": "Toggle elevated mode",
    "usage_hint": "[on|off|ask|full]"
    },
    {
    "command": "/exec",
    "description": "Show or set exec defaults",
    "usage_hint": "host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>"
    },
    {
    "command": "/model",
    "description": "Show or set the model",
    "usage_hint": "[name|#|status]"
    },
    {
    "command": "/models",
    "description": "List providers/models",
    "usage_hint": "[provider] [page] [limit=<n>|size=<n>|all]"
    },
    {
    "command": "/help",
    "description": "Show the short help summary"
    },
    {
    "command": "/commands",
    "description": "Show the generated command catalog"
    },
    {
    "command": "/tools",
    "description": "Show what the current agent can use right now",
    "usage_hint": "[compact|verbose]"
    },
    {
    "command": "/agentstatus",
    "description": "Show runtime status, including provider usage/quota when available"
    },
    {
    "command": "/tasks",
    "description": "List active/recent background tasks for the current session"
    },
    {
    "command": "/context",
    "description": "Explain how context is assembled",
    "usage_hint": "[list|detail|json]"
    },
    {
    "command": "/whoami",
    "description": "Show your sender identity"
    },
    {
    "command": "/skill",
    "description": "Run a skill by name",
    "usage_hint": "<name> [input]"
    },
    {
    "command": "/btw",
    "description": "Ask a side question without changing session context",
    "usage_hint": "<question>"
    },
    {
    "command": "/side",
    "description": "Ask a side question without changing session context",
    "usage_hint": "<question>"
    },
    {
    "command": "/usage",
    "description": "Control the usage footer or show cost summary",
    "usage_hint": "off|tokens|full|cost"
    }
    ]
    }
    

    HTTP Request URLs

    Użyj tej samej listy slash_commands co w Socket Mode powyżej i dodaj "url": "https://gateway-host.example.com/slack/events" do każdego wpisu. Przykład:

    {
    "slash_commands": [
    {
    "command": "/new",
    "description": "Start a new session",
    "usage_hint": "[model]",
    "url": "https://gateway-host.example.com/slack/events"
    },
    {
    "command": "/help",
    "description": "Show the short help summary",
    "url": "https://gateway-host.example.com/slack/events"
    }
    ]
    }
    

    Powtórz tę wartość url przy każdym poleceniu na liście.

    Optional authorship scopes (write operations)

    Dodaj zakres bota chat:write.customize, jeśli chcesz, aby wiadomości wychodzące używały tożsamości aktywnego agenta (niestandardowej nazwy użytkownika i ikony) zamiast domyślnej tożsamości aplikacji Slack.

    Jeśli używasz ikony emoji, Slack oczekuje składni :emoji_name:.

    Optional user-token scopes (read operations)

    Jeśli skonfigurujesz 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 polegasz na odczytach wyszukiwania Slack)

    Model tokenów

    • botToken + appToken są wymagane dla Socket Mode.
    • Tryb HTTP wymaga botToken + signingSecret.
    • botToken, appToken, signingSecret i userToken akceptują jawne ciągi znaków albo obiekty SecretRef.
    • Tokeny w konfiguracji zastępują rezerwowe wartości ze zmiennych środowiskowych.
    • Rezerwowe zmienne środowiskowe SLACK_BOT_TOKEN / SLACK_APP_TOKEN mają zastosowanie tylko do konta domyślnego.
    • userToken (xoxp-...) jest dostępny tylko w konfiguracji (bez rezerwowej zmiennej środowiskowej) i domyślnie działa tylko do odczytu (userTokenReadOnly: true).

    Zachowanie migawki statusu:

    • Inspekcja konta Slack śledzi pola *Source i *Status dla poszczególnych poświadczeń (botToken, appToken, signingSecret, userToken).
    • Status to available, configured_unavailable albo missing.
    • configured_unavailable oznacza, że konto jest skonfigurowane przez SecretRef albo inne nieosadzone ź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.

    Akcje i bramki

    Akcje Slack są kontrolowane przez channels.slack.actions.*.

    Dostępne grupy akcji w bieżących narzędziach Slack:

    Grupa Domyślnie
    messages włączone
    reactions włączone
    pins włączone
    memberInfo włączone
    emojiList włączone

    Bieżące akcje wiadomości Slack obejmują send, upload-file, download-file, read, edit, delete, pin, unpin, list-pins, member-info i emoji-list. download-file akceptuje identyfikatory plików Slack widoczne w przychodzących placeholderach plików i zwraca podglądy obrazów dla obrazów albo metadane pliku lokalnego dla innych typów plików.

    Kontrola dostępu i trasowanie

    DM policy

    channels.slack.dmPolicy kontroluje dostęp do DM. channels.slack.allowFrom jest kanoniczną listą dozwolonych nadawców DM.

    • pairing (domyślnie)
    • allowlist
    • open (wymaga, aby channels.slack.allowFrom zawierało "*")
    • disabled

    Flagi DM:

    • dm.enabled (domyślnie true)
    • channels.slack.allowFrom
    • dm.allowFrom (starsze)
    • dm.groupEnabled (grupowe DM domyślnie false)
    • dm.groupChannels (opcjonalna lista dozwolonych MPIM)

    Priorytet 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.

    Starsze channels.slack.dm.policy i channels.slack.dm.allowFrom nadal są odczytywane dla zgodności. openclaw doctor --fix migruje je do dmPolicy i allowFrom, gdy może to zrobić bez zmiany dostępu.

    Parowanie w DM używa openclaw pairing approve slack <code>.

    Channel policy

    channels.slack.groupPolicy kontroluje obsługę kanałów:

    • open
    • allowlist
    • disabled

    Lista dozwolonych kanałów znajduje się pod channels.slack.channels i musi używać stabilnych identyfikatorów kanałów Slack (na przykład C12345678) jako kluczy konfiguracji.

    Uwaga dotycząca środowiska uruchomieniowego: jeśli channels.slack całkowicie brakuje (konfiguracja wyłącznie przez zmienne środowiskowe), środowisko uruchomieniowe wraca do groupPolicy="allowlist" i rejestruje ostrzeżenie (nawet jeśli ustawiono channels.defaults.groupPolicy).

    Rozwiązywanie nazw/identyfikatorów:

    • wpisy listy dozwolonych kanałów i wpisy listy dozwolonych DM są rozwiązywane przy uruchamianiu, gdy pozwala na to dostęp tokena
    • nierozwiązane wpisy nazw kanałów są zachowywane zgodnie z konfiguracją, ale domyślnie ignorowane przy trasowaniu
    • autoryzacja przychodząca i trasowanie kanałów domyślnie najpierw używają identyfikatorów; bezpośrednie dopasowywanie nazwy użytkownika/slug wymaga channels.slack.dangerouslyAllowNameMatching: true

    Mentions and channel users

    Wiadomości w kanałach domyślnie wymagają wzmianki.

    Źródła wzmianek:

    • jawna wzmianka o aplikacji (<@botId>)
    • wzmianka o grupie użytkowników Slack (<!subteam^S...>), gdy użytkownik bota jest członkiem tej grupy użytkowników; wymaga usergroups:read
    • wzorce regex wzmianek (agents.list[].groupChat.mentionPatterns, rezerwowo messages.groupChat.mentionPatterns)
    • niejawne zachowanie odpowiedzi do wątku bota (wyłączone, gdy thread.requireExplicitMention ma wartość true)

    Kontrole per kanał (channels.slack.channels.<id>; nazwy tylko przez rozwiązywanie przy uruchamianiu albo dangerouslyAllowNameMatching):

    • requireMention
    • users (lista dozwolonych)
    • allowBots
    • skills
    • systemPrompt
    • tools, toolsBySender
    • format klucza toolsBySender: id:, e164:, username:, name: albo wildcard "*" (starsze klucze bez prefiksu nadal mapują się tylko do id:)

    allowBots jest konserwatywne dla kanałów i kanałów prywatnych: wiadomości w pokojach autorstwa botów są akceptowane tylko wtedy, gdy wysyłający bot jest jawnie wymieniony na liście dozwolonych users tego pokoju albo gdy co najmniej jeden jawny identyfikator właściciela Slack z channels.slack.allowFrom jest obecnie członkiem pokoju. Wildcardy i wpisy właścicieli oparte na nazwach wyświetlanych nie spełniają warunku obecności właściciela. Obecność właściciela używa Slack conversations.members; upewnij się, że aplikacja ma odpowiedni zakres odczytu dla typu pokoju (channels:read dla kanałów publicznych, groups:read dla kanałów prywatnych). Jeśli wyszukiwanie członków się nie powiedzie, OpenClaw odrzuca wiadomość w pokoju autorstwa bota.

    Wątki, sesje i tagi odpowiedzi

    • DM są trasowane jako direct; kanały jako channel; MPIM jako group.
    • Powiązania tras Slack akceptują surowe identyfikatory partnerów oraz formy docelowe Slack, takie jak channel:C12345678, user:U12345678 i <@U12345678>.
    • Przy domyślnym session.dmScope=main DM Slack są zwijane do głównej sesji agenta.
    • Sesje kanałów: agent:<agentId>:slack:channel:<channelId>.
    • Odpowiedzi w wątkach mogą tworzyć sufiksy sesji wątków (:thread:<threadTs>), gdy ma to zastosowanie.
    • Domyślna wartość channels.slack.thread.historyScope to thread; domyślna wartość thread.inheritParent to false.
    • channels.slack.thread.initialHistoryLimit kontroluje, ile istniejących wiadomości wątku jest pobieranych, gdy rozpoczyna się nowa sesja wątku (domyślnie 20; ustaw 0, aby wyłączyć).
    • channels.slack.thread.requireExplicitMention (domyślnie false): gdy ma wartość true, tłumi niejawne wzmianki w wątku, więc bot odpowiada tylko na jawne wzmianki @bot wewnątrz wątków, nawet gdy bot już uczestniczył w wątku. Bez tego odpowiedzi w wątku z udziałem bota omijają bramkowanie requireMention.

    Kontrole wątkowania odpowiedzi:

    • channels.slack.replyToMode: off|first|all|batched (domyślnie off)
    • channels.slack.replyToModeByChatType: per direct|group|channel
    • starsza wartość rezerwowa dla czatów bezpośrednich: channels.slack.dm.replyToMode

    Obsługiwane są ręczne tagi odpowiedzi:

    • [[reply_to_current]]
    • [[reply_to:<id>]]

    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
    • rezerwowe emoji tożsamości agenta (agents.list[].identity.emoji, w przeciwnym razie "👀")

    Uwagi:

    • Slack oczekuje krótkich kodów (na przykład "eyes").
    • Użyj "", aby wyłączyć reakcję dla konta Slack albo globalnie.

    Strumieniowanie tekstu

    channels.slack.streaming kontroluje zachowanie podglądu na żywo:

    • off: wyłącza strumieniowanie podglądu na żywo.
    • partial (domyślnie): zastępuje tekst podglądu najnowszym częściowym wynikiem.
    • block: dołącza porcjowane aktualizacje podglądu.
    • progress: pokazuje tekst statusu postępu podczas generowania, a następnie wysyła finalny tekst.
    • streaming.preview.toolProgress: gdy aktywny jest podgląd wersji roboczej, kieruje aktualizacje narzędzi/postępu do tej samej edytowanej wiadomości podglądu (domyślnie: true). Ustaw false, aby zachować osobne wiadomości narzędzi/postępu.
    • streaming.preview.commandText / streaming.progress.commandText: ustaw na status, aby zachować zwarte linie postępu narzędzi, ukrywając surowy tekst polecenia/exec (domyślnie: raw).

    Ukryj surowy tekst polecenia/exec, zachowując zwarte linie postępu:

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

    channels.slack.streaming.nativeTransport kontroluje natywne strumieniowanie tekstu Slack, gdy channels.slack.streaming.mode to partial (domyślnie: true).

    • Aby natywne strumieniowanie tekstu i status wątku asystenta Slack były widoczne, musi być dostępny wątek odpowiedzi. Wybór wątku nadal podąża za replyToMode.
    • Kanał, czat grupowy i główne korzenie DM nadal mogą używać zwykłego podglądu wersji roboczej, gdy natywne strumieniowanie jest niedostępne albo nie istnieje wątek odpowiedzi.
    • Główne DM Slack domyślnie pozostają poza wątkiem, więc nie pokazują natywnego podglądu strumienia/statusu Slack w stylu wątku; zamiast tego OpenClaw publikuje i edytuje podgląd wersji roboczej w DM.
    • Media i ładunki nietekstowe wracają do zwykłego dostarczania.
    • Finalne media/błędy anulują oczekujące edycje podglądu; kwalifikujące się finalne teksty/bloki są opróżniane tylko wtedy, gdy mogą edytować podgląd w miejscu.
    • 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 Slack:

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

    Starsze klucze:

    • channels.slack.streamMode (replace | status_final | append) to starszy alias runtime dla channels.slack.streaming.mode.
    • wartość logiczna channels.slack.streaming to starszy alias runtime dla channels.slack.streaming.mode i channels.slack.streaming.nativeTransport.
    • starsze channels.slack.nativeStreaming to alias runtime dla channels.slack.streaming.nativeTransport.
    • Uruchom openclaw doctor --fix, aby przepisać utrwaloną konfigurację strumieniowania Slack do kanonicznych kluczy.

    Awaryjna reakcja pisania

    typingReaction dodaje tymczasową reakcję do przychodzącej wiadomości Slack, gdy OpenClaw przetwarza odpowiedź, a następnie usuwa ją po zakończeniu przebiegu. Jest to najbardziej przydatne poza odpowiedziami w wątkach, które używają domyślnego wskaźnika stanu „is typing...”.

    Kolejność rozstrzygania:

    • channels.slack.accounts.<accountId>.typingReaction
    • channels.slack.typingReaction

    Uwagi:

    • Slack oczekuje krótkich kodów (na przykład "hourglass_flowing_sand").
    • Reakcja działa w trybie best-effort, a czyszczenie jest automatycznie podejmowane po ukończeniu ścieżki odpowiedzi lub niepowodzenia.

    Media, dzielenie na fragmenty i dostarczanie

    Załączniki przychodzące

    Załączniki plików Slack są pobierane z prywatnych adresów URL hostowanych przez Slack (przepływ żądań uwierzytelnianych tokenem) i zapisywane w magazynie mediów, gdy pobieranie się powiedzie i pozwalają na to limity rozmiaru. Symbole zastępcze plików zawierają fileId Slack, aby agenci mogli pobrać oryginalny plik za pomocą download-file.

    Pobieranie używa ograniczonych limitów czasu bezczynności i całkowitego czasu. Jeśli pobieranie pliku Slack zatrzyma się lub nie powiedzie, OpenClaw kontynuuje przetwarzanie wiadomości i wraca do symbolu zastępczego pliku.

    Domyślny limit rozmiaru przychodzących danych runtime to 20MB, chyba że zostanie nadpisany przez channels.slack.mediaMaxMb.

    Tekst i pliki wychodzące
    • fragmenty tekstu używają channels.slack.textChunkLimit (domyślnie 4000)
    • channels.slack.chunkMode="newline" włącza dzielenie z priorytetem akapitów
    • wysyłanie plików używa interfejsów API przesyłania Slack i może obejmować odpowiedzi w wątkach (thread_ts)
    • limit mediów wychodzących podąża za channels.slack.mediaMaxMb, gdy jest skonfigurowany; w przeciwnym razie wysyłki kanałowe używają domyślnych wartości rodzaju MIME z potoku mediów
    Cele dostarczania

    Preferowane jawne cele:

    • user:<id> dla wiadomości DM
    • channel:<id> dla kanałów

    Wiadomości DM Slack zawierające tylko tekst/bloki mogą być publikowane bezpośrednio do identyfikatorów użytkowników; przesyłanie plików i wysyłki w wątkach najpierw otwierają DM przez interfejsy API konwersacji Slack, ponieważ te ścieżki wymagają konkretnego identyfikatora konwersacji.

    Polecenia i zachowanie slash

    Polecenia slash pojawiają się w Slack jako pojedyncze skonfigurowane polecenie albo wiele poleceń natywnych. Skonfiguruj channels.slack.slashCommand, aby zmienić domyślne ustawienia poleceń:

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

    Polecenia natywne wymagają dodatkowych ustawień manifestu w aplikacji Slack i zamiast tego są włączane przez channels.slack.commands.native: true lub commands.native: true w konfiguracjach globalnych.

    • Automatyczny tryb poleceń natywnych jest dla Slack wyłączony, więc commands.native: "auto" nie włącza natywnych poleceń Slack.
    /help
    

    Menu argumentów natywnych używają adaptacyjnej strategii renderowania, która pokazuje modal potwierdzenia przed wysłaniem wybranej wartości opcji:

    • do 5 opcji: bloki przycisków
    • 6-100 opcji: statyczne menu wyboru
    • więcej niż 100 opcji: zewnętrzny wybór z asynchronicznym filtrowaniem opcji, gdy dostępne są procedury obsługi opcji interaktywności
    • przekroczone limity Slack: zakodowane wartości opcji wracają do przycisków
    /think
    

    Sesje slash używają izolowanych kluczy, takich jak agent:<agentId>:slack:slash:<userId>, i nadal kierują wykonania poleceń do docelowej sesji konwersacji za pomocą CommandTargetSessionKey.

    Interaktywne odpowiedzi

    Slack może renderować kontrolki interaktywnych odpowiedzi utworzone 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 Slack:

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

    Te dyrektywy kompilują się do Slack Block Kit i kierują kliknięcia lub wybory z powrotem przez istniejącą ścieżkę zdarzeń interakcji Slack.

    Uwagi:

    • To interfejs użytkownika specyficzny dla Slack. Inne kanały nie tłumaczą dyrektyw Slack Block Kit na własne systemy przycisków.
    • Wartości wywołań zwrotnych interaktywnych 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 bloków.

    Zatwierdzenia exec w Slack

    Slack może działać jako natywny klient zatwierdzania z interaktywnymi przyciskami i interakcjami, zamiast wracać do interfejsu WWW lub terminala.

    • Zatwierdzenia exec używają channels.slack.execApprovals.* do natywnego routingu DM/kanału.
    • Zatwierdzenia Plugin nadal mogą być rozstrzygane przez tę samą natywną powierzchnię przycisków Slack, gdy żądanie już trafia do Slack, a rodzaj identyfikatora zatwierdzenia to plugin:.
    • Autoryzacja zatwierdzających nadal jest wymuszana: tylko użytkownicy zidentyfikowani jako zatwierdzający mogą zatwierdzać lub odrzucać żądania przez Slack.

    Używa to tej samej współdzielonej powierzchni przycisków zatwierdzania co inne kanały. Gdy interactivity jest włączone w ustawieniach aplikacji Slack, monity zatwierdzania renderują się jako przyciski Block Kit bezpośrednio w konwersacji. Gdy te przyciski są obecne, są podstawowym UX zatwierdzania; OpenClaw powinien zawierać ręczne polecenie /approve tylko wtedy, gdy wynik narzędzia mówi, że zatwierdzenia czatu są niedostępne albo ręczne zatwierdzenie jest jedyną ścieżką.

    Ścieżka konfiguracji:

    • channels.slack.execApprovals.enabled
    • channels.slack.execApprovals.approvers (opcjonalne; gdy to możliwe, wraca do 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 uda się rozstrzygnąć co najmniej jednego zatwierdzającego. Ustaw enabled: false, aby jawnie wyłączyć Slack jako natywnego klienta zatwierdzania. Ustaw enabled: true, aby wymusić natywne zatwierdzenia, gdy zatwierdzający zostaną rozstrzygnięci.

    Domyślne zachowanie bez jawnej konfiguracji zatwierdzania exec Slack:

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

    Jawna konfiguracja natywna Slack jest potrzebna tylko wtedy, gdy chcesz nadpisać zatwierdzających, dodać filtry albo włączyć dostarczanie do czatu źródłowego:

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

    Wspólne przekazywanie approvals.exec jest oddzielne. Używaj go tylko wtedy, gdy monity zatwierdzania exec muszą być również kierowane do innych czatów lub jawnych celów poza pasmem. Wspólne przekazywanie approvals.plugin także jest oddzielne; natywne przyciski Slack nadal mogą rozstrzygać zatwierdzenia Plugin, gdy te żądania już trafiają do Slack.

    Same-chat /approve działa również w kanałach Slack i wiadomościach DM, 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 są mapowane na zdarzenia systemowe.
    • Emisje z wątków („Also send to channel” w odpowiedziach w wątkach) są przetwarzane jako zwykłe wiadomości użytkownika.
    • Zdarzenia dodania/usunięcia reakcji są mapowane na zdarzenia systemowe.
    • Dołączenie/opuszczenie przez członka, utworzenie/zmiana nazwy kanału oraz zdarzenia dodania/usunięcia przypięcia są mapowane na zdarzenia systemowe.
    • channel_id_changed może migrować klucze konfiguracji kanału, 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 zasiewanie kontekstu historii wątku są filtrowane według skonfigurowanych list dozwolonych nadawców, gdy ma to zastosowanie.
    • Akcje bloków i interakcje modalne emitują ustrukturyzowane zdarzenia systemowe Slack interaction: ... z bogatymi polami ładunku:
      • akcje bloków: wybrane wartości, etykiety, wartości selektorów i metadane workflow_*
      • zdarzenia modalne view_submission i view_closed z metadanymi kierowanego kanału oraz danymi wejściowymi formularzy

    Odniesienie konfiguracji

    Główne odniesienie: Odniesienie konfiguracji - Slack.

    Pola Slack o wysokiej wartości sygnału
    • tryb/uwierzytelnianie: mode, botToken, appToken, signingSecret, webhookPath, accounts.*
    • dostęp do DM: dm.enabled, dmPolicy, allowFrom (starsze: dm.policy, dm.allowFrom), dm.groupEnabled, dm.groupChannels
    • przełącznik zgodności: dangerouslyAllowNameMatching (awaryjny; pozostaw wyłączone, chyba że jest potrzebne)
    • dostęp do kanału: groupPolicy, channels.*, channels.*.users, channels.*.requireMention
    • wątki/historia: replyToMode, replyToModeByChatType, thread.*, historyLimit, dmHistoryLimit, dms.*.historyLimit
    • dostarczanie: textChunkLimit, chunkMode, mediaMaxMb, streaming, streaming.nativeTransport, streaming.preview.toolProgress
    • operacje/funkcje: configWrites, commands.native, slashCommand.*, actions.*, userToken, userTokenReadOnly

    Rozwiązywanie problemów

    Brak odpowiedzi w kanałach

    Sprawdź w kolejności:

    • groupPolicy
    • lista dozwolonych kanałów (channels.slack.channels) — klucze muszą być identyfikatorami kanałów (C12345678), a nie nazwami (#channel-name). Klucze oparte na nazwach po cichu zawodzą przy groupPolicy: "allowlist", ponieważ routing kanałów jest domyślnie najpierw oparty na ID. Aby znaleźć ID: kliknij prawym przyciskiem kanał w Slack → Copy link — wartość C... na końcu adresu URL to ID kanału.
    • requireMention
    • lista dozwolonych users dla kanału

    Przydatne polecenia:

    openclaw channels status --probe
    openclaw logs --follow
    openclaw doctor
    
    Wiadomości DM ignorowane

    Sprawdź:

    • channels.slack.dm.enabled
    • channels.slack.dmPolicy (lub starsze channels.slack.dm.policy)
    • zatwierdzenia parowania / wpisy na liście dozwolonych
    • zdarzenia DM Slack Assistant: szczegółowe logi wspominające drop message_changed zwykle oznaczają, że Slack wysłał edytowane zdarzenie wątku Assistant bez możliwego do odzyskania ludzkiego nadawcy w metadanych wiadomości
    openclaw pairing list slack
    
    Socket mode się nie łączy

    Zweryfikuj tokeny bota i aplikacji oraz włączenie Socket Mode w ustawieniach aplikacji Slack.

    Jeśli openclaw channels status --probe --json pokazuje botTokenStatus albo appTokenStatus: "configured_unavailable", konto Slack jest skonfigurowane, ale bieżący runtime nie mógł rozstrzygnąć wartości opartej na SecretRef.

    Tryb HTTP nie odbiera zdarzeń

    Zweryfikuj:

    • sekret podpisywania
    • ścieżkę Webhook
    • adresy URL żądań Slack (zdarzenia + interaktywność + polecenia slash)
    • unikalny webhookPath dla każdego konta HTTP

    Jeśli signingSecretStatus: "configured_unavailable" pojawia się w migawkach konta, konto HTTP jest skonfigurowane, ale bieżący runtime nie mógł rozstrzygnąć sekretu podpisywania opartego na SecretRef.

    Polecenia natywne/slash nie uruchamiają się

    Zweryfikuj, co było zamierzone:

    • tryb poleceń natywnych (channels.slack.commands.native: true) z pasującymi poleceniami slash zarejestrowanymi w Slack
    • albo tryb pojedynczego polecenia slash (channels.slack.slashCommand.enabled: true)

    Sprawdź też commands.useAccessGroups oraz listy dozwolonych kanałów/użytkowników.

    Odniesienie wizji załączników

    Slack może dołączać pobrane multimedia do tury agenta, gdy pobieranie plików ze Slack powiedzie się i pozwalają na to limity rozmiaru. Pliki obrazów mogą być przekazywane przez ścieżkę rozumienia multimediów lub bezpośrednio do modelu odpowiedzi obsługującego wizję; inne pliki są zachowywane jako kontekst pliku dostępny do pobrania, a nie traktowane jako dane wejściowe obrazu.

    Obsługiwane typy multimediów

    Typ multimediów Źródło Bieżące zachowanie Uwagi
    Obrazy JPEG / PNG / GIF / WebP URL pliku Slack Pobierane i dołączane do tury w celu obsługi z użyciem modeli obsługujących wizję Limit na plik: channels.slack.mediaMaxMb (domyślnie 20 MB)
    Pliki PDF URL pliku Slack Pobierane i udostępniane jako kontekst pliku dla narzędzi takich jak download-file lub pdf Dane przychodzące ze Slack nie konwertują automatycznie plików PDF na wejście obrazu dla wizji
    Inne pliki URL pliku Slack Pobierane, gdy to możliwe, i udostępniane jako kontekst pliku Pliki binarne nie są traktowane jako dane wejściowe obrazu
    Odpowiedzi w wątku Pliki wiadomości początkowej wątku Pliki wiadomości głównej mogą zostać uzupełnione jako kontekst, gdy odpowiedź nie ma bezpośrednich multimediów Wiadomości początkowe zawierające tylko pliki używają placeholdera załącznika
    Wiadomości z wieloma obrazami Wiele plików Slack Każdy plik jest oceniany niezależnie Przetwarzanie Slack jest ograniczone do ośmiu plików na wiadomość

    Potok przychodzący

    Gdy przychodzi wiadomość Slack z załącznikami plików:

    1. OpenClaw pobiera plik z prywatnego URL Slack przy użyciu tokena bota (xoxb-...).
    2. Po powodzeniu plik jest zapisywany w magazynie multimediów.
    3. Ścieżki pobranych multimediów i typy zawartości są dodawane do kontekstu przychodzącego.
    4. Ścieżki modeli/narzędzi obsługujących obrazy mogą używać załączników obrazów z tego kontekstu.
    5. Pliki niebędące obrazami pozostają dostępne jako metadane pliku lub odwołania do multimediów dla narzędzi, które potrafią je obsłużyć.

    Dziedziczenie załączników z wiadomości głównej wątku

    Gdy wiadomość przychodzi w wątku (ma nadrzędne thread_ts):

    • Jeśli sama odpowiedź nie ma bezpośrednich multimediów, a dołączona wiadomość główna ma pliki, Slack może uzupełnić pliki główne jako kontekst wiadomości początkowej wątku.
    • Bezpośrednie załączniki odpowiedzi mają pierwszeństwo przed załącznikami wiadomości głównej.
    • Wiadomość główna, która ma tylko pliki i nie ma tekstu, jest reprezentowana placeholderem załącznika, aby mechanizm awaryjny nadal mógł uwzględnić jej pliki.

    Obsługa wielu załączników

    Gdy jedna wiadomość Slack zawiera wiele załączników plików:

    • Każdy załącznik jest przetwarzany niezależnie przez potok multimediów.
    • Odwołania do pobranych multimediów są agregowane w kontekście wiadomości.
    • Kolejność przetwarzania odpowiada kolejności plików Slack w ładunku zdarzenia.
    • Niepowodzenie pobierania jednego załącznika nie blokuje pozostałych.

    Limity rozmiaru, pobierania i modelu

    • Limit rozmiaru: Domyślnie 20 MB na plik. Konfigurowalne przez channels.slack.mediaMaxMb.
    • Niepowodzenia pobierania: Pliki, których Slack nie może udostępnić, wygasłe adresy URL, niedostępne pliki, zbyt duże pliki oraz odpowiedzi HTML logowania/autoryzacji Slack są pomijane zamiast zgłaszane jako nieobsługiwane formaty.
    • Model wizyjny: Analiza obrazu używa aktywnego modelu odpowiedzi, gdy obsługuje on wizję, albo modelu obrazu skonfigurowanego w agents.defaults.imageModel.

    Znane ograniczenia

    Scenariusz Bieżące zachowanie Obejście
    Wygasły URL pliku Slack Plik pominięty; brak wyświetlonego błędu Prześlij plik ponownie w Slack
    Model wizyjny nie jest skonfigurowany Załączniki obrazów są przechowywane jako odwołania do multimediów, ale nie są analizowane jako obrazy Skonfiguruj agents.defaults.imageModel albo użyj modelu odpowiedzi obsługującego wizję
    Bardzo duże obrazy (> 20 MB domyślnie) Pomijane zgodnie z limitem rozmiaru Zwiększ channels.slack.mediaMaxMb, jeśli Slack na to pozwala
    Przekazane/udostępnione załączniki Tekst i multimedia obrazów/plików hostowane przez Slack są obsługiwane na zasadzie najlepszej możliwej próby Udostępnij ponownie bezpośrednio w wątku OpenClaw
    Załączniki PDF Przechowywane jako kontekst pliku/multimediów, nie są automatycznie kierowane przez wizję obrazową Użyj download-file dla metadanych pliku albo narzędzia pdf do analizy PDF

    Powiązana dokumentacja

    Powiązane