Slack

狀態:透過 Slack 應用程式整合,支援 DM + 頻道,已可用於正式環境。預設模式為 Socket Mode;也支援 HTTP Events API 模式。

快速設定

Socket Mode(預設)

  ### 步驟 1:建立 Slack 應用程式和 Token
    在 Slack 應用程式設定中:

    - 啟用 **Socket Mode**
    - 建立 **App Token**(`xapp-...`),需具有 `connections:write` 權限
    - 安裝應用程式並複製 **Bot Token**(`xoxb-...`)


  ### 步驟 2:設定 OpenClaw
{
  channels: {
    slack: {
      enabled: true,
      mode: "socket",
      appToken: "xapp-...",
      botToken: "xoxb-...",
    },
  },
}
    環境變數備用方案(僅預設帳戶):
SLACK_APP_TOKEN=xapp-...
SLACK_BOT_TOKEN=xoxb-...
  ### 步驟 3:訂閱應用程式事件
    訂閱以下 bot 事件:

    - `app_mention`
    - `message.channels`、`message.groups`、`message.im`、`message.mpim`
    - `reaction_added`、`reaction_removed`
    - `member_joined_channel`、`member_left_channel`
    - `channel_rename`
    - `pin_added`、`pin_removed`

    同時啟用 App Home **Messages Tab** 以支援 DM。


  ### 步驟 4:啟動閘道
openclaw gateway

HTTP Events API 模式

  ### 步驟 1:為 HTTP 設定 Slack 應用程式

    - 將模式設為 HTTP(`channels.slack.mode="http"`)
    - 複製 Slack **Signing Secret**
    - 將 Event Subscriptions + Interactivity + Slash command 的 Request URL 設為相同的 webhook 路徑(預設 `/slack/events`)



  ### 步驟 2:設定 OpenClaw HTTP 模式
{
  channels: {
    slack: {
      enabled: true,
      mode: "http",
      botToken: "xoxb-...",
      signingSecret: "your-signing-secret",
      webhookPath: "/slack/events",
    },
  },
}
  ### 步驟 3:多帳戶 HTTP 使用不同的 webhook 路徑
    支援每帳戶 HTTP 模式。

    為每個帳戶指定不同的 `webhookPath` 以避免註冊衝突。

Token 模型

  • Socket Mode 需要 botToken + appToken
  • HTTP 模式需要 botToken + signingSecret
  • 設定中的 token 覆寫環境變數備用方案。
  • SLACK_BOT_TOKEN / SLACK_APP_TOKEN 環境變數備用方案僅適用於預設帳戶。
  • userTokenxoxp-...)僅限設定(無環境變數備用方案),預設為唯讀行為(userTokenReadOnly: true)。
  • 選填:新增 chat:write.customize 讓傳出訊息使用活動中代理的身份(自訂 username 和圖示)。icon_emoji 使用 :emoji_name: 語法。

提示: 對於操作/目錄讀取,設定後會優先使用 user token。對於寫入,bot token 仍然優先;只有在 userTokenReadOnly: false 且 bot token 不可用時才允許 user-token 寫入。

存取控制與路由

DM 政策

`channels.slack.dmPolicy` 控制 DM 存取(舊版:`channels.slack.dm.policy`):

- `pairing`(預設)
- `allowlist`
- `open`(需要 `channels.slack.allowFrom` 包含 `"*"`;舊版:`channels.slack.dm.allowFrom`)
- `disabled`

DM 旗標:

- `dm.enabled`(預設 true)
- `channels.slack.allowFrom`(建議)
- `dm.allowFrom`(舊版)
- `dm.groupEnabled`(群組 DM 預設 false)
- `dm.groupChannels`(選填 MPIM 允許名單)

多帳戶優先順序:

- `channels.slack.accounts.default.allowFrom` 僅適用於 `default` 帳戶。
- 具名帳戶在自身 `allowFrom` 未設定時繼承 `channels.slack.allowFrom`。
- 具名帳戶不會繼承 `channels.slack.accounts.default.allowFrom`。

DM 中的配對使用 `openclaw pairing approve slack <code>`。

頻道政策

`channels.slack.groupPolicy` 控制頻道處理:

- `open`
- `allowlist`
- `disabled`

頻道允許名單位於 `channels.slack.channels` 下,應使用穩定的頻道 ID。

執行時注意:如果 `channels.slack` 完全不存在(僅環境變數設定),執行時會回退到 `groupPolicy="allowlist"` 並記錄警告(即使已設定 `channels.defaults.groupPolicy`)。

名稱/ID 解析:

- 頻道允許名單項目和 DM 允許名單項目會在啟動時解析(當 token 存取允許時)
- 未解析的頻道名稱項目保持原樣但預設不用於路由
- 收到訊息的授權和頻道路由預設以 ID 優先;直接使用者名稱/slug 匹配需要 `channels.slack.dangerouslyAllowNameMatching: true`

提及與頻道使用者

頻道訊息預設需要提及才會回應。

提及來源:

- 明確的應用程式提及(`<@botId>`)
- 提及正規表示式模式(`agents.list[].groupChat.mentionPatterns`,備用 `messages.groupChat.mentionPatterns`)
- 隱式的回覆機器人討論串行為

每頻道控制(`channels.slack.channels.<id>`;名稱僅透過啟動解析或 `dangerouslyAllowNameMatching`):

- `requireMention`
- `users`(允許名單)
- `allowBots`
- `skills`
- `systemPrompt`
- `tools`、`toolsBySender`
- `toolsBySender` 鍵格式:`id:`、`e164:`、`username:`、`name:` 或 `"*"` 萬用字元
  (舊版無前綴鍵仍僅對應到 `id:`)

指令與斜線行為

  • Slack 的原生指令自動模式為關閉commands.native: "auto" 不會啟用 Slack 原生指令)。
  • 使用 channels.slack.commands.native: true(或全域 commands.native: true)啟用原生 Slack 指令處理程式。
  • 當原生指令啟用時,在 Slack 中註冊相符的斜線指令(/<command> 名稱),有一個例外:
    • 為 status 指令註冊 /agentstatus(Slack 保留了 /status
  • 如果未啟用原生指令,你可以透過 channels.slack.slashCommand 執行單一設定的斜線指令。
  • 原生引數選單現在會調整其呈現策略:
    • 最多 5 個選項:按鈕區塊
    • 6-100 個選項:靜態選擇選單
    • 超過 100 個選項:在可用互動選項處理程式時使用外部選擇搭配非同步選項過濾
    • 如果編碼的選項值超過 Slack 限制,流程會回退到按鈕
  • 對於長選項 payload,斜線指令引數選單在分發選定值之前會使用確認對話框。

互動式回覆

Slack 可以呈現代理編寫的互動式回覆控制項,但此功能預設停用。

全域啟用:

{
  channels: {
    slack: {
      capabilities: {
        interactiveReplies: true,
      },
    },
  },
}

或僅為一個 Slack 帳戶啟用:

{
  channels: {
    slack: {
      accounts: {
        ops: {
          capabilities: {
            interactiveReplies: true,
          },
        },
      },
    },
  },
}

啟用後,代理可以發出 Slack 專屬的回覆指示:

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

這些指示會編譯為 Slack Block Kit,並透過現有的 Slack 互動事件路徑路由點擊或選擇。

注意事項:

  • 這是 Slack 專屬的 UI。其他頻道不會將 Slack Block Kit 指示轉換為自己的按鈕系統。
  • 互動回呼值是 OpenClaw 產生的不透明 token,而非代理編寫的原始值。
  • 如果產生的互動區塊會超過 Slack Block Kit 限制,OpenClaw 會回退到原始文字回覆,而非傳送無效的區塊 payload。

預設斜線指令設定:

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

斜線工作階段使用隔離的 key:

  • agent:<agentId>:slack:slash:<userId>

並仍將指令執行路由到目標對話工作階段(CommandTargetSessionKey)。

討論串、工作階段與回覆標籤

  • DM 路由為 direct;頻道為 channel;MPIM 為 group
  • 在預設 session.dmScope=main 下,Slack DM 會合併到代理主工作階段。
  • 頻道工作階段:agent:<agentId>:slack:channel:<channelId>
  • 討論串回覆可在適用時建立討論串工作階段後綴(:thread:<threadTs>)。
  • channels.slack.thread.historyScope 預設為 threadthread.inheritParent 預設為 false
  • channels.slack.thread.initialHistoryLimit 控制新討論串工作階段開始時擷取多少現有討論串訊息(預設 20;設定 0 停用)。

回覆討論串控制:

  • channels.slack.replyToModeoff|first|all(預設 off
  • channels.slack.replyToModeByChatType:按 direct|group|channel 設定
  • 直接聊天的舊版備用:channels.slack.dm.replyToMode

支援手動回覆標籤:

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

注意:replyToMode="off" 會停用 Slack 中的所有回覆討論串,包括明確的 [[reply_to_*]] 標籤。這與 Telegram 不同,後者在 "off" 模式下仍會執行明確標籤。此差異反映了平台討論串模型的不同:Slack 討論串會隱藏頻道中的訊息,而 Telegram 的回覆在主聊天流中仍然可見。

媒體、分段與送達

收到的附件
Slack 檔案附件從 Slack 托管的私有 URL 下載(使用 token 驗證的請求流程),在擷取成功且大小限制允許時寫入媒體儲存。

執行時收到的大小上限預設為 `20MB`,除非透過 `channels.slack.mediaMaxMb` 覆寫。
傳出文字與檔案
- 文字分段使用 `channels.slack.textChunkLimit`(預設 4000)
- `channels.slack.chunkMode="newline"` 啟用段落優先分割
- 檔案傳送使用 Slack 上傳 API,可包含討論串回覆(`thread_ts`)
- 傳出媒體上限在設定 `channels.slack.mediaMaxMb` 時使用該值;否則頻道傳送使用媒體管線的 MIME 類型預設值
送達目標
建議使用明確目標:

- `user:<id>` 用於 DM
- `channel:<id>` 用於頻道

傳送到使用者目標時,Slack DM 透過 Slack 對話 API 開啟。

操作與控制

Slack 操作由 channels.slack.actions.* 控制。

目前 Slack 工具中可用的操作群組:

群組預設
messages已啟用
reactions已啟用
pins已啟用
memberInfo已啟用
emojiList已啟用

事件與營運行為

  • 訊息編輯/刪除/討論串廣播會對應為系統事件。
  • 回應新增/移除事件會對應為系統事件。
  • 成員加入/離開、頻道建立/重新命名和釘選新增/移除事件會對應為系統事件。
  • 助手討論串狀態更新(用於討論串中的「輸入中…」指示器)使用 assistant.threads.setStatus,需要 bot scope assistant:write
  • configWrites 啟用時,channel_id_changed 可以遷移頻道設定鍵。
  • 頻道主題/目的中繼資料被視為不受信任的上下文,可以注入到路由上下文中。
  • 區塊操作和模態互動會發出結構化的 Slack interaction: ... 系統事件,包含豐富的 payload 欄位:
    • 區塊操作:選定的值、標籤、選擇器值和 workflow_* 中繼資料
    • 模態 view_submissionview_closed 事件包含路由的頻道中繼資料和表單輸入

確認回應

ackReaction 在 OpenClaw 處理收到的訊息時傳送確認表情符號。

解析順序:

  • channels.slack.accounts.<accountId>.ackReaction
  • channels.slack.ackReaction
  • messages.ackReaction
  • 代理身份表情符號備用(agents.list[].identity.emoji,否則 ”👀”)

注意事項:

  • Slack 使用短碼(例如 "eyes")。
  • 使用 "" 停用 Slack 帳戶或全域的回應。

輸入中回應備用方案

typingReaction 在 OpenClaw 處理回覆時暫時在收到的 Slack 訊息上新增回應,完成後移除。這在 Slack 原生助手輸入中功能不可用時是有用的備用方案,特別是在 DM 中。

解析順序:

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

注意事項:

  • Slack 使用短碼(例如 "hourglass_flowing_sand")。
  • 回應是盡力而為的,在回覆或失敗路徑完成後會自動嘗試清除。

Manifest 和範圍檢查清單

Slack 應用程式 manifest 範例
{
  "display_information": {
    "name": "OpenClaw",
    "description": "Slack connector for OpenClaw"
  },
  "features": {
    "bot_user": {
      "display_name": "OpenClaw",
      "always_online": false
    },
    "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": [
        "chat:write",
        "channels:history",
        "channels:read",
        "groups:history",
        "im:history",
        "im:read",
        "im:write",
        "mpim:history",
        "mpim:read",
        "mpim:write",
        "users:read",
        "app_mentions:read",
        "assistant:write",
        "reactions:read",
        "reactions:write",
        "pins:read",
        "pins:write",
        "emoji:read",
        "commands",
        "files:read",
        "files:write"
      ]
    }
  },
  "settings": {
    "socket_mode_enabled": true,
    "event_subscriptions": {
      "bot_events": [
        "app_mention",
        "message.channels",
        "message.groups",
        "message.im",
        "message.mpim",
        "reaction_added",
        "reaction_removed",
        "member_joined_channel",
        "member_left_channel",
        "channel_rename",
        "pin_added",
        "pin_removed"
      ]
    }
  }
}
選填的 user-token 範圍(讀取操作)
如果你設定了 `channels.slack.userToken`,一般讀取範圍為:

- `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`(如果你依賴 Slack 搜尋讀取)

疑難排解

頻道中沒有回覆
依序檢查:

- `groupPolicy`
- 頻道允許名單(`channels.slack.channels`)
- `requireMention`
- 每頻道 `users` 允許名單

有用的指令:
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
DM 訊息被忽略
檢查:

- `channels.slack.dm.enabled`
- `channels.slack.dmPolicy`(或舊版 `channels.slack.dm.policy`)
- 配對核准/允許名單項目
openclaw pairing list slack
Socket Mode 無法連線
驗證 bot + app token 以及 Slack 應用程式設定中的 Socket Mode 啟用狀態。
HTTP 模式未收到事件
驗證:

- signing secret
- webhook 路徑
- Slack Request URL(Events + Interactivity + Slash Commands)
- 每個 HTTP 帳戶的唯一 `webhookPath`
原生/斜線指令未觸發
確認你的意圖:

- 原生指令模式(`channels.slack.commands.native: true`)搭配在 Slack 中已註冊的相符斜線指令
- 或單一斜線指令模式(`channels.slack.slashCommand.enabled: true`)

也檢查 `commands.useAccessGroups` 和頻道/使用者允許名單。

文字串流

OpenClaw 透過 Agents and AI Apps API 支援 Slack 原生文字串流。

channels.slack.streaming 控制即時預覽行為:

  • off:停用即時預覽串流。
  • partial(預設):以最新的部分輸出取代預覽文字。
  • block:附加分段的預覽更新。
  • progress:在產生時顯示進度狀態文字,然後傳送最終文字。

channels.slack.nativeStreaming 控制 Slack 的原生串流 API(chat.startStream / chat.appendStream / chat.stopStream),當 streamingpartial 時使用(預設:true)。

停用原生 Slack 串流(保留草稿預覽行為):

channels:
  slack:
    streaming: partial
    nativeStreaming: false

舊版鍵:

  • channels.slack.streamModereplace | status_final | append)會自動遷移到 channels.slack.streaming
  • 布林值 channels.slack.streaming 會自動遷移到 channels.slack.nativeStreaming

需求

  1. 在 Slack 應用程式設定中啟用 Agents and AI Apps
  2. 確保應用程式具有 assistant:write 範圍。
  3. 該訊息必須有可用的回覆討論串。討論串選擇仍遵循 replyToMode

行為

  • 第一個文字區塊開始串流(chat.startStream)。
  • 後續文字區塊附加到同一串流(chat.appendStream)。
  • 回覆結束時完成串流(chat.stopStream)。
  • 媒體和非文字 payload 回退到正常送達。
  • 如果串流在回覆過程中失敗,OpenClaw 對剩餘 payload 回退到正常送達。

設定參考

主要參考:

  • 設定參考 - Slack

    Slack 重要欄位:

    • 模式/授權:modebotTokenappTokensigningSecretwebhookPathaccounts.*
    • DM 存取:dm.enableddmPolicyallowFrom(舊版:dm.policydm.allowFrom)、dm.groupEnableddm.groupChannels
    • 相容性開關:dangerouslyAllowNameMatching(緊急用;除非需要否則保持關閉)
    • 頻道存取:groupPolicychannels.*channels.*.userschannels.*.requireMention
    • 討論串/歷史記錄:replyToModereplyToModeByChatTypethread.*historyLimitdmHistoryLimitdms.*.historyLimit
    • 送達:textChunkLimitchunkModemediaMaxMbstreamingnativeStreaming
    • 營運/功能:configWritescommands.nativeslashCommand.*actions.*userTokenuserTokenReadOnly

相關