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環境變數備用方案僅適用於預設帳戶。userToken(xoxp-...)僅限設定(無環境變數備用方案),預設為唯讀行為(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)
- 為 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: falsename: "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預設為thread;thread.inheritParent預設為false。channels.slack.thread.initialHistoryLimit控制新討論串工作階段開始時擷取多少現有討論串訊息(預設20;設定0停用)。
回覆討論串控制:
channels.slack.replyToMode:off|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 scopeassistant:write。 - 當
configWrites啟用時,channel_id_changed可以遷移頻道設定鍵。 - 頻道主題/目的中繼資料被視為不受信任的上下文,可以注入到路由上下文中。
- 區塊操作和模態互動會發出結構化的
Slack interaction: ...系統事件,包含豐富的 payload 欄位:- 區塊操作:選定的值、標籤、選擇器值和
workflow_*中繼資料 - 模態
view_submission和view_closed事件包含路由的頻道中繼資料和表單輸入
- 區塊操作:選定的值、標籤、選擇器值和
確認回應
ackReaction 在 OpenClaw 處理收到的訊息時傳送確認表情符號。
解析順序:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- 代理身份表情符號備用(
agents.list[].identity.emoji,否則 ”👀”)
注意事項:
- Slack 使用短碼(例如
"eyes")。 - 使用
""停用 Slack 帳戶或全域的回應。
輸入中回應備用方案
typingReaction 在 OpenClaw 處理回覆時暫時在收到的 Slack 訊息上新增回應,完成後移除。這在 Slack 原生助手輸入中功能不可用時是有用的備用方案,特別是在 DM 中。
解析順序:
channels.slack.accounts.<accountId>.typingReactionchannels.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),當 streaming 為 partial 時使用(預設:true)。
停用原生 Slack 串流(保留草稿預覽行為):
channels:
slack:
streaming: partial
nativeStreaming: false
舊版鍵:
channels.slack.streamMode(replace | status_final | append)會自動遷移到channels.slack.streaming。- 布林值
channels.slack.streaming會自動遷移到channels.slack.nativeStreaming。
需求
- 在 Slack 應用程式設定中啟用 Agents and AI Apps。
- 確保應用程式具有
assistant:write範圍。 - 該訊息必須有可用的回覆討論串。討論串選擇仍遵循
replyToMode。
行為
- 第一個文字區塊開始串流(
chat.startStream)。 - 後續文字區塊附加到同一串流(
chat.appendStream)。 - 回覆結束時完成串流(
chat.stopStream)。 - 媒體和非文字 payload 回退到正常送達。
- 如果串流在回覆過程中失敗,OpenClaw 對剩餘 payload 回退到正常送達。
設定參考
主要參考:
-
Slack 重要欄位:
- 模式/授權:
mode、botToken、appToken、signingSecret、webhookPath、accounts.* - DM 存取:
dm.enabled、dmPolicy、allowFrom(舊版:dm.policy、dm.allowFrom)、dm.groupEnabled、dm.groupChannels - 相容性開關:
dangerouslyAllowNameMatching(緊急用;除非需要否則保持關閉) - 頻道存取:
groupPolicy、channels.*、channels.*.users、channels.*.requireMention - 討論串/歷史記錄:
replyToMode、replyToModeByChatType、thread.*、historyLimit、dmHistoryLimit、dms.*.historyLimit - 送達:
textChunkLimit、chunkMode、mediaMaxMb、streaming、nativeStreaming - 營運/功能:
configWrites、commands.native、slashCommand.*、actions.*、userToken、userTokenReadOnly
- 模式/授權: