ペアリング
Slack DM はデフォルトでペアリングモードになります。
スラッシュコマンド
ネイティブコマンドの動作とコマンドカタログ。
チャンネルのトラブルシューティング
チャンネル横断の診断と修復プレイブック。
トランスポートの選択
Socket Mode と HTTP Request URLs は、メッセージング、スラッシュコマンド、App Home、インタラクティブ機能で機能面は同等です。機能ではなく、デプロイ形態に応じて選択してください。| 関心事 | Socket Mode (デフォルト) | HTTP Request URLs |
|---|---|---|
| 公開 Gateway URL | 不要 | 必須 (DNS、TLS、リバースプロキシまたはトンネル) |
| アウトバウンドネットワーク | wss-primary.slack.com へのアウトバウンド WSS に到達できる必要があります | アウトバウンド WS なし。インバウンド HTTPS のみ |
| 必要なトークン | Bot token + connections:write を持つ App-Level Token | Bot token + Signing Secret |
| 開発用ノート PC / ファイアウォール内 | そのまま動作します | 公開トンネル (ngrok、Cloudflare Tunnel、Tailscale Funnel) またはステージング Gateway が必要 |
| 水平スケーリング | アプリごと、ホストごとに 1 つの Socket Mode セッション。複数の Gateway には別々の Slack アプリが必要 | ステートレスな POST ハンドラー。複数の Gateway レプリカがロードバランサー背後で 1 つのアプリを共有できます |
| 1 つの Gateway 上の複数アカウント | サポートされています。各アカウントが独自の WS を開きます | サポートされています。登録が衝突しないよう、各アカウントには一意の webhookPath (デフォルト /slack/events) が必要です |
| スラッシュコマンドのトランスポート | WS 接続経由で配信されます。slash_commands[].url は無視されます | Slack は slash_commands[].url に POST します。コマンドをディスパッチするにはこのフィールドが必須です |
| リクエスト署名 | 使用されません (認証は App-Level Token です) | Slack はすべてのリクエストに署名します。OpenClaw は signingSecret で検証します |
| 接続断からの復旧 | Slack SDK の自動再接続が有効です。OpenClaw も失敗した Socket Mode セッションを制限付きバックオフで再起動します。Pong タイムアウトのトランスポート調整が適用されます。 | ドロップする永続接続はありません。再試行は Slack からのリクエスト単位です |
単一 Gateway ホスト、開発用ノート PC、
*.slack.com へのアウトバウンド到達は可能だがインバウンド HTTPS を受け付けられないオンプレミスネットワークでは、Socket Mode を選択してください。ロードバランサー背後で複数の Gateway レプリカを実行する場合、アウトバウンド WSS はブロックされているがインバウンド HTTPS は許可されている場合、または Slack Webhook をすでにリバースプロキシで終端している場合は、HTTP Request URLs を選択してください。リレーモード
リレーモードは Slack イングレスを OpenClaw gateway から分離します。信頼済みルーターが単一の Slack Socket Mode 接続を所有し、宛先 gateway を選択して、認証済み websocket 経由で型付きイベントを転送します。gateway はアウトバウンドの Slack Web API 呼び出しに引き続き独自の bot token を使用します。wss:// を使用する必要があります。bearer token とルーターのルートテーブルは Slack 認可境界の一部として扱ってください。ルーティングされたイベントは認可済みアクティベーションとして通常の Slack メッセージハンドラーに入ります。websocket hello フレーム内のルーター提供の slack_identity は、デフォルトのアウトバウンドユーザー名とアイコンを設定できます。呼び出し元が明示的に指定した identity がある場合は、それが引き続き優先されます。リレー接続は Socket Mode と同じ制限付きバックオフタイミングで再接続し、切断時にはルーター提供の identity をクリアします。
インストール
plugins install は Plugin を登録して有効化します。以下の Slack アプリとチャンネル設定を構成するまでは何もしません。一般的な Plugin インストールルールについては Plugins を参照してください。
クイックセットアップ
- Socket Mode (デフォルト)
- HTTP Request URLs
新しい Slack アプリを作成する
api.slack.com/apps を開く → Create New App → From a manifest → ワークスペースを選択 → 以下のいずれかのマニフェストを貼り付け → Next → Create。Slack がアプリを作成した後:
Recommended は Slack Plugin の全機能セットに対応します: App Home、スラッシュコマンド、ファイル、リアクション、ピン、グループ DM、絵文字/ユーザーグループ読み取り。ワークスペースポリシーでスコープが制限される場合は Minimal を選択してください。これは DM、チャンネル/グループ履歴、メンション、スラッシュコマンドをカバーしますが、ファイル、リアクション、ピン、グループ DM (
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 をコピーします。
Socket Mode トランスポート調整
OpenClaw は、Socket Mode では Slack SDK クライアントの pong タイムアウトをデフォルトで 15 秒に設定します。ワークスペースまたはホスト固有の調整が必要な場合にのみ、トランスポート設定を上書きしてください:clientPingTimeout は SDK がクライアント ping を送信した後の pong 待機時間です。serverPingTimeout は Slack サーバー ping の待機時間です。アプリメッセージとイベントはアプリケーション状態のままであり、トランスポートの生存性シグナルではありません。
注:
socketModeは HTTP Request URL モードでは無視されます。- 基本の
channels.slack.socketMode設定は、上書きされない限りすべての Slack アカウントに適用されます。アカウントごとの上書きはchannels.slack.accounts.<accountId>.socketModeを使用します。これはオブジェクト上書きであるため、そのアカウントに必要なすべてのソケット調整フィールドを含めてください。 - OpenClaw のデフォルトがあるのは
clientPingTimeout(15000)のみです。serverPingTimeoutとpingPongLoggingEnabledは、設定された場合にのみ Slack SDK に渡されます。 - Socket Mode の再起動バックオフは約 2 秒から始まり、約 30 秒で上限に達します。回復可能な起動、起動待機、切断の失敗は、チャンネルが停止するまで再試行されます。無効な認証、取り消されたトークン、スコープ不足などの恒久的なアカウントおよび認証情報エラーは、永久に再試行せず、すぐに失敗します。
マニフェストとスコープのチェックリスト
基本の Slack アプリマニフェストは、Socket Mode と HTTP Request URL で同じです。異なるのはsettings ブロック(およびスラッシュコマンドの url)のみです。
基本マニフェスト(Socket Mode デフォルト):
settings を HTTP バリアントに置き換え、各スラッシュコマンドに url を追加します。公開 URL が必要です:
追加のマニフェスト設定
上記のデフォルトを拡張するさまざまな機能を公開します。 デフォルトのマニフェストでは、Slack App Home の Home タブを有効にし、app_home_opened を購読します。ワークスペースメンバーが Home タブを開くと、OpenClaw は views.publish で安全なデフォルトの Home ビューを公開します。会話ペイロードや非公開設定は含まれません。Messages タブは Slack DM 向けに有効なままです。マニフェストでは、features.assistant_view、assistant:write、assistant_thread_started、assistant_thread_context_changed による Slack アシスタントスレッドも有効にします。アシスタントスレッドは専用の OpenClaw スレッドセッションにルーティングされ、Slack から提供されるスレッドコンテキストをエージェントで利用できる状態に保ちます。
任意のネイティブスラッシュコマンド
任意のネイティブスラッシュコマンド
単一の設定済みコマンドの代わりに、複数のネイティブスラッシュコマンドを細かく使い分けられます。
/statusコマンドは予約されているため、/statusの代わりに/agentstatusを使用します。- Slack アプリには一度に 25 個を超えるスラッシュコマンドを登録できません(Slack プラットフォームの制限)。
features.slash_commands セクションを、利用可能なコマンドのサブセットに置き換えます。- Socket Mode(デフォルト)
- HTTP リクエスト URL
任意の作成者スコープ(書き込み操作)
任意の作成者スコープ(書き込み操作)
送信メッセージでデフォルトの Slack アプリ ID の代わりに、アクティブなエージェント ID(カスタムユーザー名とアイコン)を使用したい場合は、
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が必要です。 - リレーモードには
botTokenに加えてrelay.url、relay.authToken、relay.gatewayIdが必要です。アプリトークンや署名シークレットは使用しません。 botToken、appToken、signingSecret、relay.authToken、userTokenはプレーンテキスト文字列または SecretRef オブジェクトを受け入れます。- 設定トークンは env フォールバックを上書きします。
SLACK_BOT_TOKEN、SLACK_APP_TOKEN、SLACK_USER_TOKENの env フォールバックは、それぞれデフォルトアカウントにのみ適用されます。userTokenはデフォルトで読み取り専用の動作(userTokenReadOnly: true)になります。
- Slack アカウント検査は、認証情報ごとの
*Sourceフィールドと*Statusフィールド(botToken、appToken、signingSecret、userToken)を追跡します。 - 状態は
available、configured_unavailable、またはmissingです。 configured_unavailableは、アカウントが SecretRef または別の非インラインシークレットソースを通じて設定されているが、現在のコマンド/ランタイムパスで 実際の値を解決できなかったことを意味します。- HTTP モードでは
signingSecretStatusが含まれます。Socket Mode では、 必須ペアはbotTokenStatus+appTokenStatusです。
アクションとゲート
Slack アクションはchannels.slack.actions.* で制御されます。
現在の Slack ツールで利用可能なアクショングループ:
| グループ | デフォルト |
|---|---|
| messages | 有効 |
| reactions | 有効 |
| pins | 有効 |
| memberInfo | 有効 |
| emojiList | 有効 |
send、upload-file、download-file、read、edit、delete、pin、unpin、list-pins、member-info、emoji-list が含まれます。download-file は受信ファイルプレースホルダーに表示される Slack ファイル ID を受け取り、画像の場合は画像プレビューを、それ以外のファイルタイプの場合はローカルファイルメタデータを返します。
アクセス制御とルーティング
- DM ポリシー
- チャンネルポリシー
- Mentions and channel users
channels.slack.dmPolicy は DM アクセスを制御します。channels.slack.allowFrom は正規の DM 許可リストです。pairing(デフォルト)allowlistopen(channels.slack.allowFromに"*"を含める必要があります)disabled
dm.enabled(デフォルト true)channels.slack.allowFromdm.allowFrom(レガシー)dm.groupEnabled(グループ DM のデフォルトは 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 に移行します。DM でのペアリングには openclaw pairing approve slack <code> を使用します。スレッド、セッション、返信タグ
- DM は
directとして、チャンネルはchannelとして、MPIM はgroupとしてルーティングされます。 - Slack ルートバインディングは、生のピア ID に加えて、
channel:C12345678、user:U12345678、<@U12345678>などの Slack ターゲット形式を受け入れます。 - デフォルトの
session.dmScope=mainでは、Slack DM はエージェントのメインセッションに集約されます。 - チャンネルセッション:
agent:<agentId>:slack:channel:<channelId>。 - 通常のトップレベルのチャンネルメッセージは、
replyToModeがoff以外の場合でも、チャンネルごとのセッションに残ります。 - Slack スレッド返信では、
replyToMode="off"でアウトバウンド返信スレッド化が無効な場合でも、親 Slackthread_tsがセッションサフィックス (:thread:<threadTs>) に使われます。 - OpenClaw は、対象のトップレベルチャンネルルートが表示される Slack スレッドを開始すると予想される場合、そのルートを
agent:<agentId>:slack:channel:<channelId>:thread:<rootTs>にシードします。これにより、ルートと後続のスレッド返信が 1 つの OpenClaw セッションを共有します。これは、app_mentionイベント、明示的なボットメンションまたは設定済みメンションパターン一致、およびreplyToModeがoff以外のrequireMention: falseチャンネルに適用されます。 channels.slack.thread.historyScopeのデフォルトはthread、thread.inheritParentのデフォルトはfalseです。channels.slack.thread.initialHistoryLimitは、新しいスレッドセッションが開始するときに取得する既存スレッドメッセージ数を制御します (デフォルト20。無効にするには0を設定)。channels.slack.thread.requireExplicitMention(デフォルトfalse):trueの場合、暗黙的なスレッドメンションを抑制し、ボットがすでにスレッドに参加している場合でも、スレッド内の明示的な@botメンションにのみボットが応答します。これがない場合、ボット参加済みスレッド内の返信はrequireMentionゲートを迂回します。
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 スレッド返信を行う場合、action: "send" と threadId または replyTo に加えて replyBroadcast: true を設定すると、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" は、明示的な [[reply_to_*]] タグを含むアウトバウンド Slack 返信スレッド化を無効にします。これはインバウンド Slack スレッドセッションをフラット化しません。Slack スレッド内にすでに投稿されたメッセージは、引き続き :thread:<threadTs> セッションにルーティングされます。これは Telegram と異なります。Telegram では "off" モードでも明示的なタグが引き続き尊重されます。Slack スレッドはメッセージをチャンネルから隠しますが、Telegram の返信はインラインで表示されたままです。Ack リアクション
ackReaction は、OpenClaw がインバウンドメッセージを処理している間に確認絵文字を送信します。ackReactionScope は、その絵文字が実際に送信される_タイミング_を決定します。
デフォルトでは、Slack のネイティブアシスタントスレッドステータスが回転する読み込みメッセージで進捗を表示している間、確認は静的なままです。代わりに queued/thinking/tool/done/error のリアクションライフサイクルを使うには、messages.statusReactions.enabled: true を設定します。
絵文字 (ackReaction)
解決順序:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- エージェント ID の絵文字フォールバック (
agents.list[].identity.emoji、なければ"eyes"/ 👀)
- Slack はショートコードを想定しています (たとえば
"eyes")。 - Slack アカウントまたはグローバルでリアクションを無効にするには
""を使用します。
スコープ (messages.ackReactionScope)
Slack プロバイダーは messages.ackReactionScope (デフォルト "group-mentions") からスコープを読み取ります。現在、Slack アカウントまたは Slack チャンネルレベルの上書きはありません。この値は Gateway 全体でグローバルです。
値:
"all": DM とグループでリアクションします。周辺的なルームイベントも含みます。"direct": DM のみでリアクションします。"group-all": 周辺的なルームイベントを除くすべてのグループメッセージでリアクションします (DM なし)。"group-mentions"(デフォルト): グループでリアクションしますが、ボットがメンションされた場合のみです (またはオプトインしたグループメンション可能対象内)。DM は除外されます。"off"/"none": リアクションしません。
デフォルトスコープ (
"group-mentions") は、直接メッセージまたは周辺的なルームイベントでは ack リアクションを発火しません。インバウンド Slack DM と静かなルームイベントで設定済みの ackReaction (たとえば "eyes") を表示するには、messages.ackReactionScope を "all" に設定します。messages.ackReactionScope は Slack プロバイダー起動時に読み取られるため、変更を有効にするには Gateway の再起動が必要です。テキストストリーミング
channels.slack.streaming はライブプレビュー動作を制御します:
off: ライブプレビューストリーミングを無効にします。partial(デフォルト): プレビューテキストを最新の部分出力で置き換えます。block: チャンク化されたプレビュー更新を追加します。progress: 生成中は進捗ステータステキストを表示し、その後最終テキストを送信します。streaming.preview.toolProgress: ドラフトプレビューが有効な場合、ツール/進捗更新を同じ編集済みプレビューメッセージにルーティングします (デフォルト:true)。個別のツール/進捗メッセージを維持するにはfalseを設定します。streaming.preview.commandText/streaming.progress.commandText: 生のコマンド/実行テキストを隠しつつコンパクトなツール進捗行を維持するには、statusに設定します (デフォルト:raw)。
channels.slack.streaming.nativeTransport は、channels.slack.streaming.mode が partial の場合に Slack ネイティブテキストストリーミングを制御します (デフォルト: true)。
Slack ネイティブ進捗タスクカードは、進捗モードでオプトインです。作業中に Slack ネイティブの計画/タスクカードを送信し、完了時に同じタスクカードを更新するには、channels.slack.streaming.mode="progress" とともに channels.slack.streaming.progress.nativeTaskCards を true に設定します。このフラグがない場合、進捗モードはポータブルなドラフトプレビュー動作を維持します。
- ネイティブテキストストリーミングと Slack アシスタントスレッドステータスを表示するには、返信スレッドが利用可能である必要があります。スレッド選択は引き続き
replyToModeに従います。 - チャンネル、グループチャット、トップレベル DM ルートは、ネイティブストリーミングが利用できない場合や返信スレッドが存在しない場合でも、通常のドラフトプレビューを使用できます。
- トップレベル Slack DM はデフォルトでスレッド外のままなので、Slack のスレッド形式のネイティブストリーム/ステータスプレビューは表示されません。代わりに OpenClaw は DM にドラフトプレビューを投稿して編集します。
- メディアと非テキストペイロードは通常配信にフォールバックします。
- メディア/エラーの最終結果は保留中のプレビュー編集をキャンセルします。対象となるテキスト/ブロックの最終結果は、プレビューをその場で編集できる場合にのみフラッシュされます。
- ストリーミングが返信の途中で失敗した場合、OpenClaw は残りのペイロードを通常配信にフォールバックします。
channels.slack.streamMode(replace | status_final | append) は、channels.slack.streaming.modeの従来ランタイムエイリアスです。- boolean
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の従来ランタイムエイリアスです。 - 永続化された Slack ストリーミング設定を正規キーに書き換えるには、
openclaw doctor --fixを実行します。
入力中リアクションフォールバック
typingReaction は、OpenClaw が返信を処理している間、インバウンド Slack メッセージに一時的なリアクションを追加し、実行完了時に削除します。これは、デフォルトの “is typing…” ステータスインジケーターを使うスレッド返信の外で最も便利です。
解決順序:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
- Slack はショートコードを想定しています (たとえば
"hourglass_flowing_sand")。 - リアクションはベストエフォートであり、返信または失敗パスが完了した後にクリーンアップが自動的に試行されます。
メディア、チャンク化、配信
受信添付ファイル
受信添付ファイル
Slack のファイル添付は Slack がホストするプライベート URL(トークン認証付きリクエストフロー)からダウンロードされ、取得が成功してサイズ制限が許す場合にメディアストアへ書き込まれます。ファイルプレースホルダーには Slack の
fileId が含まれるため、エージェントは download-file で元のファイルを取得できます。ダウンロードには、制限付きのアイドルタイムアウトと合計タイムアウトが使われます。Slack ファイルの取得が停止または失敗した場合、OpenClaw はメッセージ処理を続行し、ファイルプレースホルダーへフォールバックします。ランタイムの受信サイズ上限は、channels.slack.mediaMaxMb で上書きされない限り、既定で 20MB です。送信テキストとファイル
送信テキストとファイル
- テキストチャンクは
channels.slack.textChunkLimit(既定値8000、Slack 独自のメッセージ長制限が上限)を使用します channels.slack.streaming.chunkMode="newline"は段落優先の分割を有効にします- ファイル送信は Slack アップロード API を使用し、スレッド返信(
thread_ts)を含めることができます - 送信メディア上限は、設定されている場合は
channels.slack.mediaMaxMbに従います。それ以外の場合、チャンネル送信はメディアパイプラインの MIME 種別既定値を使用します
配信ターゲット
配信ターゲット
推奨される明示的ターゲット:
- DM には
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 は、エージェント作成のインタラクティブ返信コントロールをレンダリングできますが、この機能は既定では無効です。 新しいエージェント、CLI、Plugin の出力では、共有の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 は無効なブロックペイロードを送信する代わりに元のテキスト返信へフォールバックします。
Plugin 所有のモーダル送信
インタラクティブハンドラーを登録する Slack Plugin は、OpenClaw が エージェントに見えるシステムイベント向けにペイロードを圧縮する前に、モーダルのview_submission と view_closed ライフサイクルイベントも受信できます。Slack モーダルを開くときは、次のルーティング
パターンのいずれかを使用します。
callback_idをopenclaw:<namespace>:<payload>に設定します。- または、既存の
callback_idを維持し、モーダルのprivate_metadataにpluginInteractiveData: "<namespace>:<payload>"を入れます。
ctx.interaction.kind を view_submission または
view_closed として受け取り、正規化された inputs と Slack からの完全な生の stateValues オブジェクトを受け取ります。
コールバック ID のみのルーティングで Plugin ハンドラーの呼び出しには十分です。
モーダルでエージェントに見えるシステムイベントも生成する必要がある場合は、既存のモーダル private_metadata のユーザー/セッションルーティングフィールドを含めます。エージェントは、
コンパクトで編集済みの Slack interaction: ... システムイベントを受け取ります。ハンドラーが
systemEvent.summary、systemEvent.reference、または systemEvent.data を返す場合、これらのフィールドはそのコンパクトなイベントに含まれるため、エージェントは完全なフォームペイロードを見ずに
Plugin 所有ストレージを参照できます。
Slack のネイティブ承認
Slack は、Web UI やターミナルへフォールバックする代わりに、インタラクティブボタンとインタラクションを備えたネイティブ承認クライアントとして動作できます。- Exec と Plugin の承認は Slack ネイティブの Block Kit プロンプトとしてレンダリングできます。
channels.slack.execApprovals.*は、ネイティブ exec 承認クライアントの有効化と DM/チャンネルのルーティング設定として残ります。- Exec 承認 DM は
channels.slack.execApprovals.approversまたはcommands.ownerAllowFromを使用します。 - Plugin 承認は、Slack が発生元セッションのネイティブ承認クライアントとして有効な場合、または
approvals.pluginが発生元の Slack セッションまたは Slack ターゲットへルーティングする場合に、Slack ネイティブボタンを使用します。 - Plugin 承認 DM は、
channels.slack.allowFrom、名前付きアカウントのallowFrom、またはアカウントの既定ルートからの Slack Plugin 承認者を使用します。 - 承認者の認可は引き続き適用されます。exec 専用承認者は、Plugin 承認者でもない限り、Plugin リクエストを承認できません。
interactivity が有効な場合、承認プロンプトは会話内で直接 Block Kit ボタンとしてレンダリングされます。
これらのボタンが存在する場合、それらが主要な承認 UX です。OpenClaw は、ツール結果がチャット承認を利用できない、または手動承認が唯一の経路であると示す場合にのみ、手動の /approve コマンドを含めるべきです。
設定パス:
channels.slack.execApprovals.enabledchannels.slack.execApprovals.approvers(任意。可能な場合はcommands.ownerAllowFromにフォールバック)channels.slack.execApprovals.target(dm|channel|both、既定値:dm)agentFilter,sessionFilter
enabled が未設定または "auto" で、少なくとも 1 人の
exec 承認者が解決される場合に、ネイティブ exec 承認を自動的に有効化します。Slack は、このネイティブクライアント
パスを通じて、Slack Plugin 承認者が解決され、リクエストがネイティブクライアントフィルターに一致する場合、ネイティブ Plugin 承認も処理できます。
Slack をネイティブ承認クライアントとして明示的に無効にするには enabled: false を設定します。承認者が解決される場合にネイティブ承認を強制的にオンにするには enabled: true を設定します。Slack exec 承認を無効にしても、
approvals.plugin を通じて有効化されたネイティブ Slack Plugin 承認配信は無効になりません。Plugin 承認
配信は代わりに Slack Plugin 承認者を使用します。
明示的な Slack exec 承認設定がない場合の既定の動作:
approvals.exec 転送は別物です。exec 承認プロンプトを他のチャットや明示的な帯域外ターゲットにも
ルーティングする必要がある場合にのみ使用してください。共有 approvals.plugin 転送も
別物です。Slack ネイティブ配信は、Slack が Plugin
承認リクエストをネイティブに処理できる場合にのみ、そのフォールバックを抑制します。
同一チャットの /approve も、すでにコマンドをサポートしている Slack チャンネルと DM で機能します。完全な承認転送モデルについては Exec 承認 を参照してください。
イベントと運用時の動作
- メッセージ編集/削除はシステムイベントにマッピングされます。
- スレッドブロードキャスト(「Also send to channel」スレッド返信)は通常のユーザーメッセージとして処理されます。
- リアクション追加/削除イベントはシステムイベントにマッピングされます。
- メンバー参加/退出、チャンネル作成/名前変更、ピン追加/削除イベントはシステムイベントにマッピングされます。
channel_id_changedは、configWritesが有効な場合にチャンネル設定キーを移行できます。- チャンネルトピック/目的メタデータは信頼できないコンテキストとして扱われ、ルーティングコンテキストに注入される場合があります。
- スレッド開始者と初期スレッド履歴コンテキストのシードは、該当する場合、設定済み送信者許可リストでフィルタリングされます。
- ブロックアクション、ショートカット、モーダルインタラクションは、豊富なペイロードフィールドを持つ構造化された
Slack interaction: ...システムイベントを発行します。- ブロックアクション: 選択値、ラベル、ピッカー値、
workflow_*メタデータ - グローバルショートカット: コールバックとアクターのメタデータ。アクターの直接セッションへルーティング
- メッセージショートカット: コールバック、アクター、チャンネル、スレッド、選択されたメッセージのコンテキスト
- ルーティングされたチャンネルメタデータとフォーム入力を含むモーダル
view_submissionとview_closedイベント
- ブロックアクション: 選択値、ラベル、ピッカー値、
設定リファレンス
主要リファレンス: 設定リファレンス - Slack。高シグナルの Slack フィールド
高シグナルの 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,streaming.chunkMode,mediaMaxMb,streaming,streaming.nativeTransport,streaming.preview.toolProgress - アンファール:
unfurlLinks(既定値:false)、chat.postMessageのリンク/メディアプレビュー制御用のunfurlMedia。リンクプレビューを再度有効にするにはunfurlLinks: trueを設定します - 運用/機能:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
トラブルシューティング
チャンネルに返信がない
チャンネルに返信がない
次の順に確認してください:便利なコマンド:
groupPolicy- channel allowlist (
channels.slack.channels) — キーはチャンネル名(#channel-name)ではなく、チャンネル ID(C12345678)である必要があります。チャンネルルーティングはデフォルトで ID 優先のため、groupPolicy: "allowlist"では名前ベースのキーは静かに失敗します。ID を見つけるには、Slack でチャンネルを右クリック → リンクをコピー — URL 末尾のC...値がチャンネル ID です。 requireMention- チャンネルごとの
usersallowlist messages.groupChat.visibleReplies: 通常のグループ/チャンネルリクエストはデフォルトで"automatic"です。"message_tool"を選択していて、ログにmessage(action=send)呼び出しなしでアシスタントのテキストが表示される場合、モデルが表示可能な message-tool パスを見逃しています。このモードでは最終テキストは非公開のままです。抑制されたペイロードメタデータは Gateway の詳細ログで確認するか、通常のアシスタント最終返信をすべてレガシーパス経由で投稿したい場合は"automatic"に設定してください。messages.groupChat.unmentionedInbound:"room_event"の場合、メンションされていない許可済みチャンネルの会話は環境コンテキストになり、エージェントがmessageツールを呼び出さない限り沈黙したままです。環境ルームイベントを参照してください。
DM メッセージが無視される
DM メッセージが無視される
確認項目:
channels.slack.dm.enabledchannels.slack.dmPolicy(またはレガシーのchannels.slack.dm.policy)- ペアリング承認 / allowlist エントリ(
dmPolicy: "open"でもchannels.slack.allowFrom: ["*"]が必要です) - グループ DM は MPIM 処理を使用します。
channels.slack.dm.groupEnabledを有効にし、設定している場合は MPIM をchannels.slack.dm.groupChannelsに含めてください - Slack Assistant DM イベント:
drop message_changedに言及する詳細ログは、 通常、Slack がメッセージメタデータ内に復元可能な人間の送信者を含まない 編集済み Assistant スレッドイベントを送信したことを意味します
Socket mode が接続されない
Socket mode が接続されない
Slack アプリ設定で bot + app トークンと Socket Mode の有効化を検証してください。
App-Level Token には
connections:write が必要で、Bot User OAuth Token
の bot トークンは app トークンと同じ Slack アプリ/ワークスペースに属している必要があります。openclaw channels status --probe --json に botTokenStatus または
appTokenStatus: "configured_unavailable" が表示される場合、Slack アカウントは
設定されていますが、現在のランタイムが SecretRef に基づく値を解決できていません。slack socket mode failed to start; retry ... のようなログは復旧可能な
起動失敗です。スコープ不足、取り消されたトークン、無効な認証は代わりに
即座に失敗します。slack token mismatch ... ログは、bot トークンと app トークンが
異なる Slack アプリに属しているように見えることを意味します。Slack アプリの認証情報を修正してください。HTTP mode がイベントを受信しない
HTTP mode がイベントを受信しない
検証項目:
- 署名シークレット
- webhook パス
- Slack Request URL(Events + Interactivity + Slash Commands)
- HTTP アカウントごとに一意の
webhookPath - 公開 URL が TLS を終端し、リクエストを Gateway パスに転送していること
- Slack アプリの
request_urlパスがchannels.slack.webhookPath(デフォルト/slack/events)と完全に一致していること
signingSecretStatus: "configured_unavailable" が
表示される場合、HTTP アカウントは設定されていますが、現在のランタイムが
SecretRef に基づく署名シークレットを解決できていません。slack: webhook path ... already registered ログが繰り返される場合、2 つの HTTP
アカウントが同じ webhookPath を使用しています。各アカウントに別々のパスを指定してください。添付ファイルの vision リファレンス
Slack のファイルダウンロードが成功し、サイズ制限が許す場合、Slack はダウンロードしたメディアをエージェントターンに添付できます。画像ファイルはメディア理解パスを通すか、vision 対応の返信モデルに直接渡すことができます。その他のファイルは画像入力として扱われるのではなく、ダウンロード可能なファイルコンテキストとして保持されます。対応メディアタイプ
| メディアタイプ | ソース | 現在の動作 | 備考 |
|---|---|---|---|
| JPEG / PNG / GIF / WebP 画像 | Slack ファイル URL | vision 対応処理のためにダウンロードされ、ターンに添付されます | ファイルごとの上限: channels.slack.mediaMaxMb(デフォルト 20 MB) |
| PDF ファイル | Slack ファイル URL | ダウンロードされ、download-file や pdf などのツール向けファイルコンテキストとして公開されます | Slack inbound は PDF を画像 vision 入力へ自動変換しません |
| その他のファイル | Slack ファイル URL | 可能な場合はダウンロードされ、ファイルコンテキストとして公開されます | バイナリファイルは画像入力として扱われません |
| スレッド返信 | スレッド開始メッセージのファイル | 返信に直接メディアがない場合、ルートメッセージのファイルをコンテキストとしてハイドレートできます | ファイルのみの開始メッセージでは添付ファイルプレースホルダーを使用します |
| 複数画像メッセージ | 複数の Slack ファイル | 各ファイルが個別に評価されます | Slack の処理はメッセージあたり 8 ファイルまでに制限されます |
Inbound パイプライン
ファイル添付付きの Slack メッセージが届いた場合:- OpenClaw は bot トークンを使用して Slack のプライベート URL からファイルをダウンロードします。
- 成功すると、ファイルはメディアストアに書き込まれます。
- ダウンロードされたメディアパスとコンテンツタイプが inbound コンテキストに追加されます。
- 画像対応のモデル/ツールパスは、そのコンテキストの画像添付を使用できます。
- 画像以外のファイルは、それらを処理できるツール向けにファイルメタデータまたはメディア参照として利用可能なままです。
スレッドルート添付ファイルの継承
メッセージがスレッド内に届いた場合(thread_ts 親を持つ場合):
- 返信自体に直接メディアがなく、含まれているルートメッセージにファイルがある場合、Slack はルートファイルをスレッド開始コンテキストとしてハイドレートできます。
- ルートファイルは、新規またはリセットされたスレッドセッションをシードしている間だけハイドレートされます。以降のテキストのみの返信は既存のセッションコンテキストを再利用し、ルートファイルを新しいメディアとして再添付しません。
- 直接返信の添付ファイルはルートメッセージの添付ファイルより優先されます。
- ファイルのみでテキストがないルートメッセージは、フォールバックがそのファイルを引き続き含められるように、添付ファイルプレースホルダーで表現されます。
複数添付ファイルの処理
1 つの Slack メッセージに複数のファイル添付が含まれている場合:- 各添付ファイルはメディアパイプラインを通じて個別に処理されます。
- ダウンロードされたメディア参照はメッセージコンテキストに集約されます。
- 処理順序はイベントペイロード内の Slack のファイル順に従います。
- 1 つの添付ファイルのダウンロード失敗が他の添付ファイルをブロックすることはありません。
サイズ、ダウンロード、モデルの制限
- サイズ上限: デフォルトはファイルあたり 20 MB です。
channels.slack.mediaMaxMbで設定できます。 - ダウンロード失敗: Slack が提供できないファイル、期限切れ URL、アクセスできないファイル、サイズ超過ファイル、Slack 認証/ログイン HTML レスポンスは、未対応形式として報告されるのではなくスキップされます。
- Vision モデル: 画像分析は、vision に対応している場合は有効な返信モデルを使用し、そうでない場合は
agents.defaults.imageModelに設定された画像モデルを使用します。
既知の制限
| シナリオ | 現在の動作 | 回避策 |
|---|---|---|
| 期限切れ Slack ファイル URL | ファイルはスキップされ、エラーは表示されません | Slack にファイルを再アップロードしてください |
| Vision モデルが設定されていない | 画像添付はメディア参照として保存されますが、画像として分析されません | agents.defaults.imageModel を設定するか、vision 対応の返信モデルを使用してください |
| 非常に大きい画像(デフォルトで 20 MB 超) | サイズ上限によりスキップされます | Slack が許可する場合は channels.slack.mediaMaxMb を増やしてください |
| 転送/共有された添付ファイル | テキストと Slack ホストの画像/ファイルメディアはベストエフォートです | OpenClaw スレッド内で直接再共有してください |
| PDF 添付ファイル | ファイル/メディアコンテキストとして保存され、画像 vision を通じて自動ルーティングされません | ファイルメタデータには download-file、PDF 分析には pdf ツールを使用してください |
関連ドキュメント
関連
ペアリング
Slack ユーザーを Gateway にペアリングします。
グループ
チャンネルとグループ DM の動作。
チャンネルルーティング
Inbound メッセージをエージェントにルーティングします。
セキュリティ
脅威モデルと強化。
設定
設定レイアウトと優先順位。
スラッシュコマンド
コマンドカタログと動作。