配對
Slack 私訊預設使用配對模式。
斜線命令
原生命令行為與命令目錄。
頻道疑難排解
跨頻道診斷與修復操作手冊。
選擇傳輸方式
Socket Mode 與 HTTP Request URLs 在訊息、斜線命令、App Home 和互動功能方面功能相同。請依部署架構而非功能選擇。請為單一閘道主機、開發用筆電,以及能對外連線至
*.slack.com 但無法接受傳入 HTTPS 的內部部署網路選擇 Socket Mode。在負載平衡器後方執行多個閘道複本、對外 WSS 遭封鎖但允許傳入 HTTPS,或已在反向代理終止 Slack 網路鉤子時,請選擇 HTTP Request URLs。轉送模式
轉送模式會將 Slack 輸入流量與 OpenClaw 閘道分離。受信任的路由器管理單一 Slack Socket Mode 連線、選擇目的閘道,並透過經驗證的 websocket 轉送具型別的事件。閘道仍會使用自己的機器人權杖進行對外 Slack Web API 呼叫。wss://。請將持有人權杖與路由器路由表視為 Slack 授權邊界的一部分:路由事件會以已授權啟用項目的身分進入一般 Slack 訊息處理常式。路由器在 websocket hello 框架中提供的 slack_identity 可設定預設的對外使用者名稱與圖示;呼叫者明確提供的身分仍具有優先權。轉送連線會使用與 Socket Mode 相同的受限退避計時重新連線,並在每次中斷連線時清除路由器提供的身分。
Enterprise Grid 全組織安裝
單一 Slack 帳號可接收 Enterprise Grid 全組織安裝所涵蓋之每個工作區的訊息。請選擇直接使用 Socket Mode 或 HTTP Request URLs;企業帳號不支援轉送模式。下方兩個最低權限資訊清單都只會啟用 V1message 與 app_mention 事件路徑、立即回覆,以及由接聽程式管理的狀態反應。
Socket Mode
connections:write 的應用程式層級權杖,然後從組織安裝複製機器人權杖。設定使用組織安裝機器人權杖的帳號:
HTTP Request URLs
當閘道具有公開 HTTPS 端點,且不會開啟 Socket Mode 連線時,請使用 HTTP 模式。將範例 URL 替換成閘道的公開webhookPath URL(預設為 /slack/events):
auth.test 驗證 enterpriseOrgInstall。沒有此旗標的組織安裝權杖,或具有此旗標的工作區權杖,都會導致啟動失敗。哪些工作區已授予安裝權限仍以 Slack 為準;OpenClaw 接著會對每個傳送的事件套用已設定的頻道、使用者、私訊和提及政策。無論 allowBots 為何,Enterprise V1 都會在分派前拒絕所有由機器人建立的 message 與 app_mention 事件,因為組織安裝不會提供穩定且具工作區限定範圍的機器人身分,以防止迴圈。
企業支援刻意限制為直接使用 Socket Mode 或 HTTP 的 message 與 app_mention 事件及其立即回覆。企業帳號無法使用轉送模式、斜線命令、互動、App Home、反應事件接聽程式、釘選、Slack 動作工具、Slack 原生核准、繫結、佇列或排程傳送,以及主動傳送。透過接聽程式管理的 Slack 用戶端支援對外確認、輸入中和狀態反應,且需要 reactions:write;仍無法使用傳入反應通知和反應動作工具。
即時回覆會重用標準的 Slack 傳遞行為,以處理分段、
媒體、中繼資料、身分備援、連結展開及回條,但僅限於
經驗證且由接聽器擁有的用戶端仍處於有效事件處理期間。
記憶體內的傳送佇列與討論串參與記錄會依該事件的工作區分隔;
用戶端本身絕不會序列化或持久化。
頻道政策鍵與 dm.groupChannels 項目必須使用原始且穩定的 Slack 頻道 ID,或
channel:<id> 格式。OpenClaw 會將任一格式正規化為原始頻道 ID,
供執行階段比對;使用 slack:、group: 和 mpim: 前綴會導致啟動失敗。
使用者政策項目必須使用穩定的 Slack 使用者 ID;名稱、slug、顯示名稱
及電子郵件地址都會導致啟動失敗。ID 必須使用 Slack 的標準大寫
前綴與主體(例如 C0123456789 或 U0123456789);小寫及
看似相近的短格式會導致啟動失敗。企業帳號無法啟用
dangerouslyAllowNameMatching。企業帳號可以設定全域
mentionPatterns.mode,但 mentionPatterns.allowIn 和
mentionPatterns.denyIn 會導致啟動失敗,因為單獨的 Slack 頻道 ID 並未
限定工作區,且可能在不同工作區重複使用。工作區安裝
會保留現有的限定範圍提及模式行為。每個獲准的工作區
都會取得各自獨立的路由、工作階段、逐字稿、去重、歷史記錄及快取身分,
即使 Slack ID 重疊也一樣。在 message 串流中,支援一般使用者訊息
及使用者建立的 file_share 事件;其他訊息子類型會在
授權或系統事件處理前遭到拒絕。
企業私訊必須停用(dm.enabled=false 或
dmPolicy="disabled"),或透過 dmPolicy="open" 明確開放,並且
有效帳號的 allowFrom 必須包含常值 "*"。空白的
允許清單,或不含 "*" 的使用者特定 ID,都會導致啟動失敗。配對及
每位使用者的私訊允許清單會遭到拒絕,因為 Slack 使用者 ID 在這些
授權儲存區中未限定工作區。頻道及傳送者政策
仍會套用至頻道訊息。
安裝
plugins install 會註冊並啟用此外掛。在你設定下方的 Slack 應用程式與頻道設定前,它不會執行任何操作。一般外掛安裝規則請參閱外掛。
快速設定
本節中的資訊清單會建立限定於工作區的安裝。若要進行 Enterprise Grid 組織安裝,請改用專用的 全組織資訊清單與工作流程。- Socket 模式(預設)
- HTTP 要求 URL
1
建立新的 Slack 應用程式
開啟 api.slack.com/apps → Create New App → From a manifest → 選取你的工作區 → 貼上下方其中一份資訊清單 → Next → Create。Slack 建立應用程式後:
Recommended 符合 Slack 外掛的完整功能集:App Home、斜線命令、檔案、回應、釘選、群組私訊,以及讀取表情符號/使用者群組。當工作區政策限制範圍時,請選擇 Minimal——它涵蓋私訊、頻道/群組歷史記錄、提及及斜線命令,但不包含檔案、回應、釘選、群組私訊(
mpim:*)、emoji:read 及 usergroups:read。各範圍的理由及額外斜線命令等附加選項,請參閱資訊清單與範圍檢查清單。- Basic Information -> App-Level Tokens -> Generate Token and Scopes:新增
connections:write、儲存,然後複製 App-Level Token。 - Install App -> Install to Workspace:複製 Bot User OAuth Token。
2
設定 OpenClaw
建議的 SecretRef 設定:環境變數備援(僅限預設帳號):
3
啟動閘道
使用者身分(以真人身分發文)
使用者身分可讓 OpenClaw 以授權 Slack 應用程式的人類使用者身分讀取及發文。userToken 是執行操作的身分;搭配的 Slack 應用程式會透過 Socket Mode 或 HTTP Request URL 承載 Events API 流量。搭配的應用程式不需要機器人使用者或機器人權杖。
請依下列方式設定搭配的應用程式:
-
在 OAuth & Permissions -> User Token Scopes 下,新增以下使用者範圍權限:
- 歷史記錄:
channels:history、groups:history、im:history、mpim:history - 對話查詢:
channels:read、groups:read、im:read、mpim:read - 人員:
users:read - 發文:
chat:write(訊息會以授權使用者的身分發文) - 開啟私訊:
im:write、mpim:write
- 歷史記錄:
-
在 Event Subscriptions -> Subscribe to events on behalf of users 下,新增以下使用者事件。請勿只將它們新增至機器人事件清單:
message.channelsmessage.groupsmessage.immessage.mpim
-
選擇一種事件傳輸方式:
- **Socket Mode:**啟用 Socket Mode,並建立具有
connections:write的應用程式層級權杖。將其設定為appToken。 - **HTTP Request URL:**將 Event Subscriptions 指向公開的 OpenClaw Slack 端點,並複製 Basic Information -> App Credentials -> Signing Secret。將其設定為
signingSecret。
- **Socket Mode:**啟用 Socket Mode,並建立具有
-
安裝或重新安裝應用程式,以預定的人類使用者身分授權,並將產生的使用者 OAuth 權杖複製至
userToken。
Socket Mode 傳輸調校
對於 Socket Mode,OpenClaw 預設將 Slack SDK 用戶端的 pong 逾時設為 15 秒。只有需要工作區或主機特定調校時,才覆寫傳輸設定:clientPingTimeout 是 SDK 傳送用戶端 ping 後等待 pong 的時間;serverPingTimeout 是等待 Slack 伺服器 ping 的時間。應用程式訊息和事件仍屬於應用程式狀態,而非傳輸存活訊號。
注意事項:
socketMode在 HTTP Request URL 模式中會被忽略。- 除非遭到覆寫,基礎
channels.slack.socketMode設定會套用至所有 Slack 帳號。每個帳號的覆寫使用channels.slack.accounts.<accountId>.socketMode;由於這是物件覆寫,請包含該帳號所需的每個 Socket 調校欄位。 - 只有
clientPingTimeout具有 OpenClaw 預設值(15000)。serverPingTimeout和pingPongLoggingEnabled僅在設定後才會傳遞給 Slack SDK。 - Socket Mode 重新啟動退避時間從約 2 秒開始,最高約為 30 秒。可復原的啟動、啟動等待及中斷連線失敗會持續重試,直到頻道停止為止。無效驗證、權杖遭撤銷或缺少範圍等永久性帳號與認證資訊錯誤會快速失敗,而不會無限重試。
資訊清單與範圍檢查表
Socket Mode 與 HTTP Request URL 使用相同的基礎 Slack 應用程式資訊清單。只有settings 區塊(以及斜線命令的 url)不同。
基礎資訊清單(Socket Mode 預設):
settings,並在每個斜線命令中新增 url。需要公開 URL:
其他資訊清單設定
呈現可擴充上述預設值的不同功能。 預設資訊清單會啟用 Slack App Home 的 Home 分頁,並訂閱app_home_opened。當工作區成員開啟 Home 分頁時,OpenClaw 會使用 views.publish 發布安全的預設 Home 檢視;其中不包含任何對話承載資料或私人設定。啟用單一斜線命令模式時,命令提示會使用 channels.slack.slashCommand.name;使用原生命令或不使用斜線命令的安裝則會省略該提示。Messages 分頁仍會為 Slack 私訊保持啟用。新應用程式會透過 features.agent_view、assistant:write 和 app_context_changed 使用 Slack Agent View。每個可見的 Agent View 根節點都會路由至各自的 OpenClaw 討論串工作階段,而 Slack 排序後的使用中檢視實體只會以不受信任的上下文傳遞給代理程式。
已使用 features.assistant_view 的現有應用程式可以保留目前的資訊清單。OpenClaw 會繼續為這些安裝處理 assistant_thread_started 和 assistant_thread_context_changed。Slack 不允許撤銷從 Assistant View 到 Agent View 的遷移,且遷移後需要使用者強制重新整理,因此在你打算遷移整個工作區之前,請勿替換現有應用程式上的 assistant_view。
選用的原生斜線命令
選用的原生斜線命令
可以使用多個原生斜線命令,取代單一設定命令,但有以下細節:
- 請使用
/agentstatus,而非/status,因為/status命令已保留。 - 一個 Slack 應用程式一次最多只能註冊 25 個斜線命令(Slack 平台限制)。
/login 新增至資訊清單;下方範例使用它取代選用的 /side 別名,以維持在 25 個命令。/login 可以顯示於任何位置,但只會在私人聊天或 Web UI 中簽發配對碼。請將現有的 features.slash_commands 區段替換為可用命令的子集:- Socket Mode(預設)
- HTTP Request URLs
選用的作者身分範圍(寫入作業)
選用的作者身分範圍(寫入作業)
如果你希望外送訊息使用目前作用中的代理程式身分(自訂使用者名稱與圖示),而非預設的 Slack 應用程式身分,請新增
chat:write.customize 機器人範圍。如果使用表情符號圖示,Slack 會要求採用 :emoji_name: 語法。選用的使用者權杖範圍(讀取作業)
選用的使用者權杖範圍(讀取作業)
如果設定
channels.slack.userToken,常見的讀取範圍如下:channels:history、groups:history、im:history、mpim:historychannels:read、groups:read、im:read、mpim:readusers:readreactions:readpins:reademoji:readsearch:read(如果你依賴 Slack 搜尋讀取)
權杖模型
- 機器人身分(預設)在 Socket Mode 中需要
botToken+appToken,在 HTTP 模式中則需要botToken+signingSecret。 - 使用者身分在 Socket Mode 中需要
userToken+appToken,在 HTTP 模式中則需要userToken+signingSecret。它不使用機器人權杖。 - 轉送模式需要
botToken,以及relay.url、relay.authToken和relay.gatewayId;它不使用應用程式權杖或簽署密鑰。 botToken、appToken、signingSecret、relay.authToken和userToken接受純文字 字串或 SecretRef 物件。- 設定權杖會覆寫環境變數備援值。
SLACK_BOT_TOKEN、SLACK_APP_TOKEN和SLACK_USER_TOKEN的環境變數備援值都只適用於預設帳號。userToken預設為唯讀行為(userTokenReadOnly: true)。
- Slack 帳號檢查會追蹤每組認證資訊的
*Source和*Status欄位(botToken、appToken、signingSecret、userToken)。 - 狀態為
available、configured_unavailable或missing。 configured_unavailable表示帳號是透過 SecretRef 或其他非行內密鑰來源設定,但目前的命令/執行階段路徑 無法解析實際值。- 在 HTTP 模式中,會包含
signingSecretStatus。Socket Mode 對機器人身分使用botTokenStatus+appTokenStatus,對使用者身分則使用userTokenStatus+appTokenStatus。
動作與閘門
Slack 動作由channels.slack.actions.* 控制。
目前 Slack 工具中可用的動作群組:
目前的 Slack 訊息動作包括
send、upload-file、download-file、read、edit、delete、pin、unpin、list-pins、member-info 和 emoji-list。download-file 接受入站檔案預留位置中顯示的 Slack 檔案 ID,並針對圖片傳回圖片預覽,或針對其他檔案類型傳回本機檔案中繼資料。
存取控制與路由
- 私訊政策
- 頻道政策
- 提及與頻道使用者
channels.slack.dmPolicy 控制私訊存取。channels.slack.allowFrom 是正式的私訊允許清單。pairing(預設)allowlistopen(要求channels.slack.allowFrom包含"*")disabled
dm.enabled(預設為 true)channels.slack.allowFromdm.allowFrom(舊版)dm.groupEnabled(群組私訊預設為 false)dm.groupChannels(選用的 MPIM 允許清單)
channels.slack.accounts.default.allowFrom僅適用於default帳號。- 具名帳號在自己的
allowFrom未設定時,會繼承channels.slack.allowFrom。 - 具名帳號不會繼承
channels.slack.accounts.default.allowFrom。
channels.slack.dm.policy 和 channels.slack.dm.allowFrom。如果能在不變更存取權的情況下進行,openclaw doctor --fix 會將它們遷移至 dmPolicy 和 allowFrom。私訊中的配對使用 openclaw pairing approve slack <code>。討論串、工作階段與回覆標籤
- DM 路由為
direct;頻道路由為channel;MPIM 路由為group。 - Slack 路由繫結接受原始對等端 ID,以及
channel:C12345678、user:U12345678和<@U12345678>等 Slack 目標格式。 - 使用預設的
session.dmScope=main時,一般 Slack DM 會合併至代理程式的主要工作階段。Agent View 根節點與既有的 Assistant View 討論串仍會隔離為:thread:<threadTs>工作階段。 - 頻道工作階段:
agent:<agentId>:slack:channel:<channelId>。 - 一般的頂層頻道訊息會留在各頻道的工作階段中,即使
replyToMode不是off也一樣。 - Slack 頻道、MPIM、Agent View 和 Assistant View 的討論串回覆會使用上層 Slack
thread_ts作為工作階段後綴(:thread:<threadTs>)。一般 DM 回覆討論串仍只是基礎 DM 工作階段上的介面功能。 - 當符合條件的頂層頻道根訊息預期會啟動可見的 Slack 討論串時,OpenClaw 會將該根訊息植入
agent:<agentId>:slack:channel:<channelId>:thread:<rootTs>,讓根訊息與之後的討論串回覆共用同一個 OpenClaw 工作階段。這適用於app_mention事件、明確提及機器人或符合已設定提及模式的情況,以及具有非offreplyToMode的requireMention: false頻道。 channels.slack.thread.historyScope的預設值為thread;thread.inheritParent的預設值為false。channels.slack.thread.initialHistoryLimit控制新討論串工作階段啟動時要擷取多少則既有討論串訊息(預設為20;設為0可停用)。channels.slack.implicitMentions.replyToBot控制回覆機器人自己的訊息時,是否略過提及閘門(預設為true)。channels.slack.implicitMentions.threadParticipation控制機器人曾回覆的討論串中的後續訊息是否略過提及閘門(預設為true)。將其設為false,即可要求這些後續訊息再次明確提及機器人。openclaw doctor --fix會將先前的channels.slack.thread.requireExplicitMention索引鍵遷移至此正向標準旗標。- 帳號覆寫位於
channels.slack.accounts.<id>.implicitMentions;共用預設值位於channels.defaults.implicitMentions。
channels.slack.channels.<id>.replyToMode:Slack 頻道/私人頻道訊息的各頻道覆寫channels.slack.replyToMode:off|first|all|batched(預設為off)channels.slack.replyToModeByChatType:每個direct|group|channel- 直接聊天的舊版後援:
channels.slack.dm.replyToMode
[[reply_to_current]][[reply_to:<id>]]
message 工具明確回覆 Slack 討論串,請將 replyBroadcast: true 與 action: "send" 及 threadId 或 replyTo 一併設定,以要求 Slack 同時將討論串回覆廣播至上層頻道。這會對應至 Slack 的 chat.postMessage reply_broadcast 旗標,且僅支援文字或 Block Kit 傳送,不支援媒體上傳。
當 message 工具呼叫在 Slack 討論串中執行並以相同頻道為目標時,OpenClaw 通常會根據有效的帳號、聊天類型或各頻道 replyToMode,沿用目前的 Slack 討論串。自動回覆以及同頻道的 send 或 upload-file 呼叫會使用相同的各頻道覆寫。請在 action: "send" 或 action: "upload-file" 上設定 topLevel: true,以強制建立新的上層頻道訊息。threadId: null 也可作為相同的頂層退出選項。
replyToMode="off" 會停用選用的 Slack 傳出回覆討論串功能,包括明確的 [[reply_to_*]] 標籤。Agent View 與 Assistant View 是由 Slack 管理的討論串體驗,因此無論此設定為何,其回覆與狀態都會留在可見的根訊息上。此設定不會將其他傳入 Slack 討論串工作階段扁平化。這與 Telegram 不同;在 Telegram 的 "off" 模式中,明確標籤仍會生效。Slack 討論串會將訊息從頻道中隱藏,而 Telegram 回覆仍會以行內方式顯示。確認回應
ackReaction 會在 OpenClaw 處理傳入訊息時傳送確認表情符號。ackReactionScope 決定該表情符號實際傳送的_時機_。
預設情況下,確認表情符號會保持不變,而 Slack 原生代理程式/助理討論串狀態則以輪替的載入訊息顯示進度。設定 messages.statusReactions.enabled: true,即可選用排入佇列/思考/工具/完成/錯誤的表情回應生命週期。
表情符號(ackReaction)
解析順序:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- 代理程式身分表情符號後援(
agents.entries.*.identity.emoji,否則為"eyes"/ 👀)
- Slack 預期使用短代碼(例如
"eyes")。 - 使用
""可針對 Slack 帳號或全域停用表情回應。
範圍(messages.ackReactionScope)
Slack 提供者會從 messages.ackReactionScope 讀取範圍(預設為 "group-mentions")。目前沒有 Slack 帳號層級或 Slack 頻道層級的覆寫;此值對閘道是全域設定。
值:
"all":在 DM 和群組中加入表情回應,包括環境聊天室事件。"direct":僅在 DM 中加入表情回應。"group-all":對每則群組訊息加入表情回應,但環境聊天室事件除外(不包括 DM)。"group-mentions"(預設):在群組中加入表情回應,但僅限機器人遭到提及時(或在已選擇加入的群組可提及項目中)。不包括 DM。"off"/"none":永不加入表情回應。
預設範圍(
"group-mentions")不會在直接訊息或環境聊天室事件中觸發確認表情回應。若要在傳入的 Slack DM 與安靜的聊天室事件中看到已設定的 ackReaction(例如 "eyes"),請將 messages.ackReactionScope 設為 "all"。messages.ackReactionScope 會在 Slack 提供者啟動時讀取,因此必須重新啟動閘道,變更才會生效。文字串流
channels.slack.streaming 控制即時預覽行為:
off:停用即時預覽串流。partial(預設):以最新的部分輸出取代預覽文字。block:附加分段的預覽更新。progress:產生內容時顯示進度狀態文字,然後傳送最終文字。streaming.preview.toolProgress:草稿預覽啟用時,將工具/進度更新路由至同一則已編輯的預覽訊息(預設:true)。設定false可保留個別的工具/進度訊息。streaming.preview.commandText/streaming.progress.commandText:設為status,可在隱藏原始命令/執行文字的同時保留精簡的工具進度行(預設:raw)。
channels.slack.streaming.mode 為 partial 時,channels.slack.streaming.nativeTransport 控制 Slack 原生文字串流(預設:true)。
Slack 原生進度工作卡片是進度模式的選用功能。將 channels.slack.streaming.progress.nativeTaskCards 設為 true 並搭配 channels.slack.streaming.mode="progress",即可在工作執行期間傳送 Slack 原生計畫/工作卡片,並在完成時更新同一張工作卡片。若未設定此旗標,進度模式會保留可攜式草稿預覽行為。
- 必須有回覆討論串,才能顯示原生文字串流和 Slack 助理討論串狀態。討論串選擇仍遵循
replyToMode。 - 當原生串流無法使用或不存在回覆討論串時,頻道、群組聊天和頂層私訊根訊息仍可使用一般草稿預覽。
- 頂層 Slack 私訊預設不使用討論串,因此不會顯示 Slack 討論串樣式的原生串流/狀態預覽;OpenClaw 會改為在私訊中發布並編輯草稿預覽。
- 媒體和非文字承載內容會退回一般傳送方式。
- 媒體/錯誤的最終內容會取消待處理的預覽編輯;符合條件的文字/區塊最終內容,只有在可就地編輯預覽時才會送出。
- 如果串流在回覆途中失敗,OpenClaw 會針對剩餘承載內容退回一般傳送方式。
channels.slack.streamMode(replace | status_final | append)是channels.slack.streaming.mode的舊版別名。- 布林值
channels.slack.streaming是channels.slack.streaming.mode和channels.slack.streaming.nativeTransport的舊版別名。 - 頂層
channels.slack.chunkMode和channels.slack.nativeStreaming是channels.slack.streaming.chunkMode和channels.slack.streaming.nativeTransport的舊版別名。 - 執行階段不會讀取舊版別名;請執行
openclaw doctor --fix,將已儲存的 Slack 串流設定重寫為標準鍵。
輸入中反應後備機制
typingReaction 會在 OpenClaw 處理回覆時,暫時對收到的 Slack 訊息新增反應,並在執行完成後移除。這最適合用於討論串回覆以外的情況,因為討論串回覆會使用預設的「正在輸入⋯⋯」狀態指示器。
解析順序:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
- Slack 預期使用短代碼(例如
"hourglass_flowing_sand")。 - 反應採盡力而為方式處理,並會在回覆或失敗路徑完成後自動嘗試清理。
語音輸入
目前若要在 Slack 中對 OpenClaw 說話,請將 Slack 音訊短片傳送給 OpenClaw 應用程式。Slackbot 的聽寫麥克風是由 Slack 擁有的獨立功能,並非應用程式 API。- Slackbot 語音聽寫 位於使用者與 Slackbot 的私人對話中。Slack 會將錄音轉換為 Slackbot 提示,但不會透過 Events API 向第三方 Slack 應用程式發出音訊檔案、聽寫事件、提示或輸入來源標記。OpenClaw Slack 外掛無法啟用或接收此功能。
- Slack 音訊短片 是儲存於 Slack 的檔案,可發布到 OpenClaw 私訊、頻道或討論串。OpenClaw 會使用機器人權杖下載可存取的短片、正規化 Slack 的短片 MIME 中繼資料,並將其傳送至共用的音訊轉錄流水線。建議的應用程式資訊清單包含必要的
files:read範圍。
requireMention: true 的頻道中,沒有說明文字的音訊短片可透過說出已設定的提及模式(agents.entries.*.groupChat.mentionPatterns,若未設定則退回 messages.groupChat.mentionPatterns)來通過閘門。OpenClaw 會先授權傳送者,再下載或轉錄短片,且只有在轉錄內容相符時才會允許其進入。失敗或不相符的推測性轉錄內容會連同已下載的短片一併捨棄,不會保留在頻道歷史記錄中。無法從語音推斷原生 Slack @bot 身分,因此請設定口述名稱模式,或加入文字提及。如果啟用了轉錄內容回顯,只有在允許進入後才會傳送回顯。
媒體、分段與傳送
傳入附件
傳入附件
Slack 檔案附件會從 Slack 託管的私人 URL 下載(使用權杖驗證的要求流程),並在擷取成功且大小限制允許時寫入媒體儲存區。檔案預留位置包含 Slack
fileId,讓代理程式可使用 download-file 擷取原始檔案。下載會使用有界限的閒置逾時和總逾時。如果 Slack 檔案擷取停滯或失敗,OpenClaw 會繼續處理訊息,並退回使用檔案預留位置。執行階段傳入大小上限預設為 20MB,除非由 channels.slack.mediaMaxMb 覆寫。傳出文字與檔案
傳出文字與檔案
- 文字分段使用
channels.slack.textChunkLimit(預設為8000,上限為 Slack 本身的訊息長度限制) channels.slack.streaming.chunkMode="newline"會啟用段落優先分割- 檔案傳送使用 Slack 上傳 API,並可包含討論串回覆(
thread_ts) - 較長的檔案說明文字會使用第一個符合 Slack 安全限制的文字分段作為上傳留言,並將其餘分段作為後續訊息傳送
- 若已設定
channels.slack.mediaMaxMb,傳出媒體上限會遵循其設定;否則,頻道傳送會使用媒體流水線中的 MIME 類型預設值
傳送目標
傳送目標
建議使用明確目標:
user:<id>用於私訊channel:<id>用於頻道
命令與斜線行為
斜線命令在 Slack 中會顯示為單一已設定命令或多個原生命令。設定channels.slack.slashCommand 可變更命令預設值:
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
channels.slack.commands.native: true 或 commands.native: true 啟用。
- Slack 的原生命令自動模式為關閉,因此
commands.native: "auto"不會啟用 Slack 原生命令。
- 3-5 個長度足夠短的選項:更多選項(「…」)選單
- 超過 100 個選項,且可使用非同步選項篩選:外部選取器
- 1-2 個選項,或任何編碼值過長而無法用於選取器的選項:按鈕區塊
- 其他情況(6-100 個選項,或超過 100 個選項但無法非同步篩選):靜態選取選單,每個選單最多分為 100 個選項
agent:<agentId>:slack:slash:<userId> 的隔離鍵,並仍使用 CommandTargetSessionKey 將命令執行路由至目標對話工作階段。
原生圖表
Slack 的公開data_visualization Block Kit 區塊
可在訊息中呈現折線圖、長條圖、面積圖和圓餅圖。OpenClaw 會將可攜式
presentation chart 區塊對應至該原生形狀;除了一般
chat:write 訊息存取權限外,不需要額外的 OAuth 範圍、
檔案上傳、影像算繪器或 Slack 設定。
- 標題和選用的軸標籤:50 個字元
- 圓餅圖:1-12 個正值區段
- 折線圖/長條圖/面積圖:1-12 個名稱唯一的數列,以及 1-20 個共用類別
- 區段、類別和數列標籤:20 個字元
- 每個數列都必須針對每個類別包含一個有限值;非圓餅圖的值 可以是負數
invalid_blocks 拒絕圖表,
OpenClaw 會移除被拒絕的原生資料區塊、保留任何同層控制項,並將完整的
圖表表示形式以可見文字傳送。
Slack 目前每則訊息最多接受兩個 data_visualization 區塊。當呈現內容
包含超過兩個有效圖表時,OpenClaw 會維持其順序,並在後續訊息中繼續
原生算繪,每則訊息最多包含兩個圖表。
Slack 的開發者發布公告
將該區塊記載為面向應用程式的 Block Kit 功能,且未公布任何付費
方案限制。Business+/Enterprise 的資格說明適用於 Slackbot 的自動 AI
圖表產生功能,這與應用程式傳送已結構化的 Block Kit 圖表不同。圖表是
僅限訊息使用的區塊,不適用於 App Home、強制回應視窗或 Canvas 內容。
原生表格
Slack 目前的data_table Block Kit 區塊
可在訊息中呈現結構化的資料列和資料行。OpenClaw 會將明確的可攜式
presentation table 區塊對應至 data_table;不會使用 Slack 的
舊版 table 區塊。
除了一般 chat:write 訊息存取權限外,不需要額外的 OAuth 範圍
或 Slack 設定。
raw_text 儲存格。數值儲存格
會對應至 raw_number,並保留有限數值,以供原生排序和
篩選使用。若有 rowHeaderColumnIndex,則會將該以零為起始索引的
資料行標記為 Slack 資料列標頭。
原生算繪前會強制執行 Slack 公布的 data_table 限制:
- 1-20 個資料行
- 1-100 個資料列,另加標頭列
- 每一列的儲存格數量必須相同
- 單一訊息中所有表格儲存格的字元總數最多為 10,000
<@U123> 這類儲存格資料不會變成 Slack 提及。
如果 Slack 以 invalid_blocks 拒絕原生圖表或表格區塊,OpenClaw
會在單一有限的復原步驟中移除所有原生資料區塊,保留按鈕和選取器
等有效的同層區塊,並在停用 Slack 格式的情況下傳送完整可見的圖表
與表格文字。斜線命令傳遞會在整個命令期間追蹤 Slack 的五次呼叫
response_url 預算。在每一批回覆前,它會選取符合剩餘呼叫次數
的完整計畫,否則會在發布該批次前失敗。
只有明確的 presentation 表格區塊會提升為原生表格。
Markdown 管線表格仍是編寫的文字;OpenClaw 不會猜測表格
結構或儲存格類型。現有受信任的 Slack 原生內容產生器可以繼續
透過 channelData.slack.blocks 傳遞原始區塊;OpenClaw 會從有效的原始
data_table 儲存格衍生後備文字,而格式錯誤的自訂區塊可能
降級為其說明文字或一般 Block Kit 後備內容。可攜式代理程式、命令列介面
和外掛輸出應使用 presentation。
互動式回覆
Slack 可以呈現由代理程式編寫的互動式回覆控制項,但此功能預設為停用。 對於新的代理程式、命令列介面和外掛輸出,請優先使用共用的presentation 按鈕或選取區塊。它們使用相同的 Slack 互動
路徑,同時也能在其他頻道上降級處理。
全域啟用:
[[slack_buttons: Approve:approve, Reject:reject]][[slack_select: Choose a target | Canary:canary, Production:production]]
compileSlackInteractiveReplies(...)parseSlackOptionsLine(...)isSlackInteractiveRepliesEnabled(...)buildSlackInteractiveBlocks(...)
presentation 承載資料和
buildSlackPresentationBlocks(...)。
注意事項:
- 這是 Slack 專用的舊版 UI。其他頻道不會將 Slack Block Kit 指令轉換為各自的按鈕系統。
- 互動式回呼值是由 OpenClaw 產生的不透明權杖,而不是代理程式編寫的原始值。
- 如果產生的互動式區塊會超過 Slack Block Kit 限制,OpenClaw 會改用原始文字回覆,而不會傳送無效的區塊承載資料。
外掛擁有的互動視窗提交
註冊互動處理常式的 Slack 外掛,也能在 OpenClaw 為代理程式可見的 系統事件壓縮承載資料前,接收互動視窗view_submission 和
view_closed 生命週期事件。開啟 Slack 互動視窗時,請使用
下列其中一種路由模式:
- 將
callback_id設為openclaw:<namespace>:<payload>。 - 或保留現有的
callback_id,並在互動視窗private_metadata中放入pluginInteractiveData: "<namespace>:<payload>"。
view_submission 或
view_closed 的 ctx.interaction.kind、正規化的 inputs,
以及來自 Slack 的完整原始 stateValues 物件。僅以回呼 ID
路由就足以叫用外掛處理常式;如果互動視窗也應產生代理程式可見的
系統事件,請包含現有互動視窗的 private_metadata 使用者/工作階段
路由欄位。代理程式會收到精簡且已遮蔽的 Slack interaction: ... 系統事件。
如果處理常式傳回 systemEvent.summary、systemEvent.reference 或
systemEvent.data,這些欄位會包含在該精簡事件中,讓代理程式能引用
外掛擁有的儲存空間,而不會看到完整的表單承載資料。
Slack 中的原生核准
Slack 可以充當具有互動式按鈕與互動操作的原生核准用戶端,而不必後備至 Web UI 或終端機。- 執行與外掛核准可以呈現為 Slack 原生 Block Kit 提示。
channels.slack.execApprovals.*仍是啟用原生執行核准用戶端及設定私訊/頻道路由的組態。- 執行核准私訊使用
channels.slack.execApprovals.approvers或commands.ownerAllowFrom。 - 當 Slack 已針對來源工作階段啟用為原生核准用戶端,或
approvals.plugin路由至來源 Slack 工作階段或 Slack 目標時,外掛核准會使用 Slack 原生按鈕。 - 外掛核准私訊使用來自
channels.slack.allowFrom的 Slack 外掛核准者、具名帳號的allowFrom,或帳號預設路由。 - 仍會強制執行核准者授權:僅具執行核准權限的核准者,除非同時也是外掛核准者,否則無法核准外掛請求。
interactivity 時,核准提示會直接在對話中呈現為 Block Kit 按鈕。
當這些按鈕存在時,它們是主要的核准使用者體驗;只有在工具結果指出
聊天核准不可用,或手動核准是唯一途徑時,OpenClaw 才應包含手動
/approve 命令。
組態路徑:
channels.slack.execApprovals.enabledchannels.slack.execApprovals.approvers(選用;可行時後備至commands.ownerAllowFrom)channels.slack.execApprovals.target(dm|channel|both,預設:dm)agentFilter、sessionFilter
enabled 未設定或為 "auto",且至少能解析出一位
執行核准者時,Slack 會自動啟用原生執行核准。當能解析出 Slack 外掛核准者,
且請求符合原生用戶端篩選條件時,Slack 也能透過此原生用戶端路徑處理原生
外掛核准。將 enabled: false 設為明確停用 Slack 作為原生核准用戶端。
將 enabled: true 設為在能解析出核准者時強制啟用原生核准。停用 Slack
執行核准不會停用透過 approvals.plugin 啟用的原生 Slack 外掛核准傳遞;
外掛核准傳遞會改用 Slack 外掛核准者。
未設定明確 Slack 執行核准組態時的預設行為:
approvals.exec 轉送是獨立功能。只有在執行核准提示還必須
路由至其他聊天或明確的頻外目標時才使用。共用 approvals.plugin 轉送
也是獨立功能;只有當 Slack 能以原生方式處理外掛核准請求時,Slack 原生
傳遞才會抑制該後備機制。
同一聊天中的 /approve 也能在已支援命令的 Slack 頻道和私訊中運作。完整的核准轉送模型請參閱執行核准。
事件與作業行為
- 訊息編輯/刪除會對應為系統事件。
- 討論串廣播(「Also send to channel」討論串回覆)會視為一般使用者訊息處理。
- 新增/移除回應事件會對應為系統事件。
- 成員加入/離開、頻道建立/重新命名,以及釘選新增/移除事件會對應為系統事件。
- 選用的上線狀態輪詢,可以將觀察到的人類參與者從
away到active的轉換,對應至該參與者最近活躍且符合資格的 Slack 工作階段。預設為停用。 - 啟用
configWrites時,channel_id_changed可以遷移頻道組態鍵。 - 頻道主題/用途中繼資料會視為不受信任的上下文,並可注入路由上下文。
- Agent View
app_context實體會依 Slack 相關性順序驗證,且只會作為結構化的不受信任上下文公開;省略的上下文會清除該回合,而不是重複使用過時實體。 - 適用時,討論串起始訊息與初始討論串歷史上下文植入會依設定的傳送者允許清單篩選。
- 區塊動作、捷徑和互動視窗互動會發出結構化的
Slack interaction: ...系統事件,並包含豐富的承載資料欄位:- 區塊動作:選取值、標籤、選擇器值,以及
workflow_*中繼資料 - 全域捷徑:回呼與動作者中繼資料,路由至動作者的直接工作階段
- 訊息捷徑:回呼、動作者、頻道、討論串,以及所選訊息的上下文
- 互動視窗
view_submission與view_closed事件,包含已路由的頻道中繼資料與表單輸入
- 區塊動作:選取值、標籤、選擇器值,以及
上線狀態事件
Slack 不會透過 Events API 或 Socket Mode 傳送上線狀態變更。OpenClaw 可以改為針對訊息已通過一般 Slack 存取與路由檢查的人類參與者,輪詢users.getPresence。
off(預設):不啟動上線狀態計時器,也不呼叫 Slack API。auto:監控過去 24 小時內活躍的私訊、MPIM 和 Slack 討論串,最多觀察 8 位人類參與者。不包含頂層頻道工作階段。on:監控相同的對話,不設參與者上限,並包含頂層頻道工作階段。使用各頻道覆寫來強制監控或排除特定頻道。
away 到 active 的轉換時喚醒。每個 Slack 帳號與使用者都會套用持久的 8 小時冷卻期,即使該人參與多個討論串亦然。事件只會路由至該人最近活躍且符合資格的對話,並指示代理程式在決定是否傳送一句簡短問候前,先查閱記憶/Wiki 和已知時區上下文。代理程式可以保持沉默。
機器人權杖需要 users:read,建議的資訊清單中已包含此項。Enterprise Grid 全組織安裝無法使用上線狀態事件。
組態參考
主要參考:組態參考 - Slack。高訊號 Slack 欄位
高訊號 Slack 欄位
- 模式/驗證:
identity、mode、enterpriseOrgInstall、botToken、appToken、userToken、signingSecret、webhookPath、accounts.* - 私訊存取:
dm.enabled、dmPolicy、allowFrom(舊版:dm.policy、dm.allowFrom)、dm.groupEnabled、dm.groupChannels - 相容性切換:
dangerouslyAllowNameMatching(緊急備援;除非必要,否則請保持關閉) - 頻道存取:
groupPolicy、channels.*、channels.*.users、channels.*.requireMention、implicitMentions.* - 討論串/歷史記錄:
replyToMode、replyToModeByChatType、thread.*、historyLimit、dmHistoryLimit、dms.*.historyLimit - 在場狀態喚醒:
presenceEvents.mode、channels.*.presenceEvents.mode(off|auto|on;預設值為off) - 傳送:
textChunkLimit、streaming.chunkMode、mediaMaxMb、streaming、streaming.nativeTransport、streaming.preview.toolProgress - 展開預覽:
unfurlLinks(預設值:false)、用於控制chat.postMessage連結/媒體預覽的unfurlMedia;將unfurlLinks: true設為選擇重新啟用連結預覽 - 操作/功能:
configWrites、commands.native、slashCommand.*、actions.*、userToken、userTokenReadOnly
疑難排解
頻道中沒有回覆
頻道中沒有回覆
依序檢查:實用命令:
groupPolicy- 頻道允許清單(
channels.slack.channels)— 索引鍵必須是頻道 ID(C12345678),而不是名稱(#channel-name)。在groupPolicy: "allowlist"下,使用名稱的索引鍵會無聲失敗,因為頻道路由預設優先使用 ID。若要尋找 ID:在 Slack 中以滑鼠右鍵按一下頻道 → Copy link — URL 結尾的C...值即為頻道 ID。 requireMention- 各頻道的
users允許清單 messages.groupChat.visibleReplies:一般群組/頻道要求預設為"automatic"。如果你選擇啟用"message_tool",且記錄顯示助理文字但沒有message(action=send)呼叫,表示模型遺漏了可見的訊息工具路徑。在此模式下,最終文字會保持私密;請檢查閘道詳細記錄中的已抑制承載資料中繼資料,或者如果你希望每則一般助理最終回覆都透過舊版路徑發布,請將其設為"automatic"。messages.groupChat.unmentionedInbound:若為"room_event",未提及助理的允許頻道交談會作為環境脈絡,且除非代理程式呼叫message工具,否則會保持靜默。請參閱環境聊天室事件。
私訊訊息遭忽略
私訊訊息遭忽略
檢查:
channels.slack.dm.enabledchannels.slack.dmPolicy(或舊版channels.slack.dm.policy)- 配對核准/允許清單項目(
dmPolicy: "open"仍需要channels.slack.allowFrom: ["*"]) - 群組私訊使用 MPIM 處理;啟用
channels.slack.dm.groupEnabled,若已設定,請將 MPIM 納入channels.slack.dm.groupChannels - Slack Assistant 私訊事件:詳細記錄中提及
drop message_changed, 通常表示 Slack 傳送了已編輯的 Assistant 討論串事件,但訊息中繼資料中 沒有可復原的人類傳送者
Socket 模式無法連線
Socket 模式無法連線
請在 Slack 應用程式設定中驗證機器人與應用程式權杖,以及 Socket Mode 是否已啟用。
App-Level Token 需要
connections:write,而 Bot User OAuth Token
機器人權杖必須與應用程式權杖屬於相同的 Slack 應用程式/工作區。如果 openclaw channels status --probe --json 顯示 botTokenStatus 或
appTokenStatus: "configured_unavailable",表示 Slack 帳號已設定,
但目前執行階段無法解析由 SecretRef 支援的值。slack socket mode failed to start; retry ... 之類的記錄是可復原的
啟動失敗。缺少範圍、權杖遭撤銷及驗證無效則會立即失敗。
slack token mismatch ... 記錄表示機器人權杖與應用程式權杖
似乎屬於不同的 Slack 應用程式;請修正 Slack 應用程式認證資訊。HTTP 模式未收到事件
HTTP 模式未收到事件
驗證:
- 簽署密鑰
- 網路鉤子路徑
- Slack Request URLs(Events + Interactivity + Slash Commands)
- 每個 HTTP 帳號的
webhookPath均不重複 - 公開 URL 會終止 TLS 並將要求轉送至閘道路徑
- Slack 應用程式的
request_url路徑與channels.slack.webhookPath完全相符(預設值為/slack/events)
signingSecretStatus: "configured_unavailable",
表示 HTTP 帳號已設定,但目前執行階段無法
解析由 SecretRef 支援的簽署密鑰。重複出現 slack: webhook path ... already registered 記錄表示兩個 HTTP
帳號正在使用相同的 webhookPath;請為每個帳號指定不同的路徑。原生/斜線命令未觸發
原生/斜線命令未觸發
確認你原本要使用的是:
- 原生命令模式(
channels.slack.commands.native: true),並在 Slack 中註冊相符的斜線命令 - 或單一斜線命令模式(
channels.slack.slashCommand.enabled: true)
commands.native: "auto" 不會啟用 Slack 原生命令;請使用 true,並在 Slack 應用程式中建立相符的命令。在 HTTP 模式下,每個 Slack 斜線命令都必須包含閘道 URL。在 Socket Mode 下,命令承載資料會透過 WebSocket 抵達,而 Slack 會忽略 slash_commands[].url。也請檢查 commands.useAccessGroups、私訊授權、頻道允許清單,
以及各頻道的 users 允許清單。對於遭封鎖的斜線命令傳送者,Slack 會傳回僅自己可見的錯誤,包括:This channel is not allowed.You are not authorized to use this command here.
附件媒體參考
當 Slack 檔案下載成功且大小限制允許時,Slack 可以將下載的媒體附加至代理程式回合。音訊片段可以轉錄,圖片檔案可以透過媒體理解路徑或直接傳遞給支援視覺的回覆模型,而其他檔案仍可作為可下載的檔案脈絡使用。支援的媒體類型
輸入管線
當含有檔案附件的 Slack 訊息抵達時:- OpenClaw 使用機器人權杖,從 Slack 的私人 URL 下載檔案。
- 下載成功後,檔案會寫入媒體儲存區。
- 下載的媒體路徑與內容類型會加入輸入脈絡。
- 音訊片段會路由至共用轉錄管線;支援圖片的模型/工具路徑可以使用相同脈絡中的圖片附件。
- 其他檔案仍會以檔案中繼資料或媒體參照的形式提供給能夠處理它們的工具。
繼承討論串根訊息附件
當訊息抵達討論串中(具有thread_ts 父項)時:
- 如果回覆本身沒有直接媒體,而所包含的根訊息有檔案,Slack 可以將根訊息檔案載入為討論串起始脈絡。
- 只有在建立新的或重設後的討論串工作階段時,才會載入根訊息檔案。後續僅含文字的回覆會重複使用現有工作階段脈絡,不會將根訊息檔案重新附加為新媒體。
- 直接回覆附件的優先順序高於根訊息附件。
- 僅含檔案而沒有文字的根訊息會以附件預留位置表示,使備援仍可包含其檔案。
多附件處理
當單一 Slack 訊息包含多個檔案附件時:- 每個附件都會透過媒體管線獨立處理。
- 下載的媒體參照會彙整至訊息脈絡中。
- 處理順序遵循事件承載資料中的 Slack 檔案順序。
- 單一附件下載失敗不會阻擋其他附件。
大小、下載及模型限制
- 大小上限:每個檔案預設為 20 MB。可透過
channels.slack.mediaMaxMb設定。 - 音訊轉錄上限:將下載的檔案傳送給轉錄提供者或命令列介面時,所選且支援音訊的
tools.media.models[]項目之maxBytes也會套用。 - 下載失敗:Slack 無法提供的檔案、過期的 URL、無法存取的檔案、超過大小限制的檔案,以及 Slack 驗證/登入 HTML 回應,都會略過,而不會回報為不支援的格式。
- 視覺模型:當使用中的回覆模型支援視覺時,圖片分析會使用該模型;否則使用在
agents.defaults.imageModel設定的圖片模型。
已知限制
相關文件
相關內容
配對
將 Slack 使用者與閘道配對。
群組
頻道與群組私訊行為。
頻道路由
將傳入訊息路由至代理程式。
安全性
威脅模型與強化。
設定
設定配置與優先順序。
斜線命令
命令目錄與行為。