ペアリング
Slack DM のデフォルトはペアリングモードです。
スラッシュコマンド
ネイティブコマンドの動作とコマンドカタログ。
チャンネルのトラブルシューティング
チャンネル横断の診断と修復手順。
トランスポートの選択
Socket Mode と HTTP Request URL は、メッセージング、スラッシュコマンド、App Home、インタラクティブ機能について同等の機能を提供します。機能ではなく、デプロイ構成に応じて選択してください。外向きの
*.slack.com に到達できる一方で受信 HTTPS を受け付けられない、単一 Gateway のホスト、開発用ノート PC、オンプレミスネットワークでは、Socket Mode を選択してください。ロードバランサーの背後で複数の Gateway レプリカを実行する場合、外向き WSS がブロックされている一方で受信 HTTPS が許可されている場合、またはリバースプロキシですでに Slack Webhook を終端している場合は、HTTP Request URL を選択してください。リレーモード
リレーモードは、Slack の受信を OpenClaw Gateway から分離します。信頼できるルーターが単一の Slack Socket Mode 接続を管理し、宛先 Gateway を選択して、認証済み WebSocket 経由で型付きイベントを転送します。Gateway は、Slack Web API の外向き呼び出しに引き続き独自の bot token を使用します。wss:// を使用する必要があります。Bearer Token とルーターのルートテーブルは Slack の認可境界の一部として扱ってください。ルーティングされたイベントは、認可済みのアクティベーションとして通常の Slack メッセージハンドラーに入ります。WebSocket の hello フレーム内でルーターが提供する slack_identity により、デフォルトの外向きユーザー名とアイコンを設定できますが、呼び出し元が明示的に指定したアイデンティティが引き続き優先されます。リレー接続は Socket Mode と同じ上限付きバックオフのタイミングで再接続し、切断するたびにルーターが提供したアイデンティティをクリアします。
Enterprise Grid の組織全体へのインストール
1 つの Slack アカウントで、Enterprise Grid の組織全体へのインストールの対象となるすべてのワークスペースからメッセージを受信できます。直接の Socket Mode または HTTP Request URL を選択してください。リレーモードは Enterprise アカウントではサポートされません。以下の最小権限マニフェストはいずれも、V1 のmessage および app_mention イベントパス、即時返信、リスナーが管理するステータスリアクションのみを有効にします。
Socket Mode
connections:write を持つ App-Level Token を生成し、組織インストールから bot token をコピーします。組織インストール済みの bot token を使用するアカウントを設定します。
HTTP Request URL
Gateway に公開 HTTPS エンドポイントがあり、Socket Mode 接続を開かない場合は HTTP モードを使用します。例の URL を Gateway の公開webhookPath URL(デフォルト /slack/events)に置き換えてください。
auth.test を使用して enterpriseOrgInstall を検証します。フラグのない組織インストール済みトークン、またはフラグのあるワークスペーストークンでは、起動に失敗します。どのワークスペースがインストールを許可したかについては、Slack が引き続き信頼できる唯一の情報源です。その後、OpenClaw は配信された各イベントに、設定済みのチャンネル、ユーザー、DM、メンションのポリシーを適用します。Enterprise V1 は、組織インストールではループ防止用の安定したワークスペース修飾付き Bot アイデンティティが提供されないため、allowBots に関係なく、Bot が生成したすべての message および app_mention イベントをディスパッチ前に拒否します。
Enterprise サポートは、直接の Socket Mode または HTTP の message および app_mention イベントと、それらへの即時返信に意図的に限定されています。Enterprise アカウントでは、リレーモード、スラッシュコマンド、インタラクション、App Home、リアクションイベントリスナー、ピン、Slack アクションツール、Slack ネイティブ承認、バインディング、キューまたはスケジュールによる配信、プロアクティブ送信は利用できません。外向きの確認応答、入力中、ステータスのリアクションは、リスナーが管理する Slack クライアントを通じてサポートされ、reactions:write が必要です。受信リアクション通知とリアクションアクションツールは引き続き利用できません。
即時返信では、チャンク、メディア、メタデータ、ID のフォールバック、リンク展開、配信確認について標準の Slack 配信動作を再利用します。ただし、検証済みのリスナー所有クライアントがアクティブなイベントターン内にある間に限ります。メモリ内の送信キューとスレッド参加レコードは、そのイベントのワークスペースごとに分割されます。クライアント自体がシリアライズまたは永続化されることはありません。
チャンネルポリシーキーと dm.groupChannels エントリには、加工されていない安定した Slack チャンネル ID、または channel:<id> 形式を使用する必要があります。OpenClaw は、どちらの形式も実行時の照合用に加工されていないチャンネル ID へ正規化します。slack:、group:、mpim: のプレフィックスを使用すると起動に失敗します。
ユーザーポリシーエントリには、安定した Slack ユーザー ID を使用する必要があります。名前、スラッグ、表示名、メールアドレスを使用すると起動に失敗します。ID には、Slack の正規の大文字プレフィックスと本体(例: C0123456789 または U0123456789)を使用する必要があります。小文字や短い類似文字列を使用すると起動に失敗します。Enterprise アカウントでは dangerouslyAllowNameMatching を有効にできません。Enterprise アカウントではグローバルな mentionPatterns.mode を設定できますが、mentionPatterns.allowIn と mentionPatterns.denyIn は起動に失敗します。これは、単独の Slack チャンネル ID がワークスペースで修飾されておらず、複数のワークスペースで再利用される可能性があるためです。ワークスペースへのインストールでは、既存のスコープ付きメンションパターン動作が維持されます。受け入れられた各ワークスペースには、Slack ID が重複している場合でも、個別のルーティング、セッション、トランスクリプト、重複排除、履歴、キャッシュ ID が割り当てられます。message ストリーム内では、通常のユーザーメッセージとユーザーが作成した file_share イベントがサポートされます。それ以外のメッセージサブタイプは、認可またはシステムイベント処理の前に拒否されます。
Enterprise の DM は、無効にする(dm.enabled=false または dmPolicy="disabled")か、dmPolicy="open" で明示的に開放し、有効なアカウントの allowFrom にリテラルの "*" を含める必要があります。空の許可リスト、または "*" を含まないユーザー固有 ID を設定すると起動に失敗します。ペアリングとユーザーごとの DM 許可リストは拒否されます。これは、それらの認可ストア内で Slack ユーザー ID がワークスペースによって修飾されていないためです。チャンネルメッセージには、引き続きチャンネルポリシーと送信者ポリシーが適用されます。
インストール
plugins install は Plugin を登録して有効にします。以下で Slack アプリとチャンネル設定を構成するまでは何も行いません。Plugin の一般的なインストール規則については、Pluginを参照してください。
クイックセットアップ
このセクションのマニフェストは、ワークスペースをスコープとするインストールを作成します。Enterprise Grid の組織インストールでは、代わりに専用の組織全体向けマニフェストとワークフローを使用してください。- Socket Mode(デフォルト)
- HTTP リクエスト URL
1
新しい Slack アプリを作成
api.slack.com/apps を開き、→ Create New App → From a manifest → ワークスペースを選択 → 以下のいずれかのマニフェストを貼り付け → Next → Create の順に進みます。Slack がアプリを作成した後:
推奨は、App Home、スラッシュコマンド、ファイル、リアクション、ピン、グループ DM、絵文字とユーザーグループの読み取りを含む、Slack Plugin の完全な機能セットに対応します。ワークスペースのポリシーでスコープが制限されている場合は、最小構成を選択してください。これは 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 をコピーします。
2
OpenClaw を構成
推奨される SecretRef 設定:環境変数によるフォールバック(デフォルトアカウントのみ):
3
Gateway を起動
ユーザー ID(実在の人物として投稿)
ユーザー ID を使用すると、OpenClaw は Slack アプリを認可した人間として読み取りと投稿を行えます。userToken が動作主体の ID であり、付随する 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(メッセージは認可したユーザーとして投稿されます) - DM の開始:
im:write、mpim:write
- 履歴:
-
Event Subscriptions -> Subscribe to events on behalf of users で、次のユーザーイベントを追加します。ボットイベントのリストだけには追加しないでください:
message.channelsmessage.groupsmessage.immessage.mpim
-
イベント伝送方式を 1 つ選択します:
- **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 の伝送設定
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を使用します。これはオブジェクトの上書きであるため、そのアカウントで使用するすべての Socket 調整フィールドを含めてください。 - OpenClaw のデフォルト(
15000)があるのはclientPingTimeoutのみです。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 ビューを公開します。会話ペイロードや非公開設定は含まれません。単一スラッシュコマンドモードが有効な場合、コマンドのヒントには channels.slack.slashCommand.name が使用されます。ネイティブコマンドを使用するインストール、またはスラッシュコマンドを使用しないインストールでは、このヒントは省略されます。Slack DM 用の Messages タブは引き続き有効です。新しいアプリでは、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 を置き換えないでください。
オプションのネイティブスラッシュコマンド
オプションのネイティブスラッシュコマンド
単一の設定済みコマンドの代わりに、複数のネイティブスラッシュコマンドを使用できますが、次の点に注意してください。
/statusコマンドは予約されているため、/statusではなく/agentstatusを使用してください。- 1 つの Slack アプリに一度に登録できるスラッシュコマンドは最大 25 個です(Slack プラットフォームの制限)。
/login をマニフェストに手動で追加してください。以下の例では、コマンド数を 25 個に収めるため、オプションの /side エイリアスの代わりにこれを含めています。/login はどこにでも表示できますが、ペアリングコードを発行するのはプライベートチャットまたは Web UI のみです。既存の 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 検索の読み取りに依存する場合)
トークンモデル
- ボット ID(デフォルト)には、Socket Mode の場合は
botToken+appToken、HTTP モードの場合はbotToken+signingSecretが必要です。 - ユーザー ID には、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 では、 ボット ID にbotTokenStatus+appTokenStatus、 ユーザー ID に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 を受け入れ、画像の場合は画像プレビューを、それ以外のファイルタイプの場合はローカルファイルのメタデータを返します。
アクセス制御とルーティング
- DM ポリシー
- チャンネルポリシー
- メンションとチャンネルユーザー
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 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 セッション上の UI 機能として残ります。 - OpenClaw は、表示される Slack スレッドを開始すると見込まれる対象のトップレベルチャンネルルートを
agent:<agentId>:slack:channel:<channelId>:thread:<rootTs>にシードし、ルートとその後のスレッド返信が同じ OpenClaw セッションを共有するようにします。これは、app_mentionイベント、明示的なボットメンションまたは設定済みメンションパターンとの一致、およびreplyToModeがoff以外に設定された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 スレッドへ明示的に返信する場合、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 返信スレッド化を無効にします。Agent View と Assistant View は Slack が管理するスレッド型のエクスペリエンスであるため、この設定にかかわらず、返信とステータスは表示されるルートに残ります。その他の受信 Slack スレッドセッションをフラット化することはありません。これは、"off" モードでも明示的なタグが引き続き適用される Telegram とは異なります。Slack スレッドではメッセージがチャンネルから非表示になりますが、Telegram の返信はインラインで表示されたままです。確認リアクション
ackReaction は、OpenClaw が受信メッセージを処理している間、確認用の絵文字を送信します。ackReactionScope は、その絵文字を実際に送信するタイミングを決定します。
デフォルトでは、Slack ネイティブのエージェント/アシスタントスレッドステータスがローテーションする読み込みメッセージで進捗を示す間、確認リアクションは固定されたままです。キュー待ち/思考中/ツール/完了/エラーのリアクションライフサイクルを有効にするには、messages.statusReactions.enabled: true を設定します。
絵文字(ackReaction)
解決順序:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- エージェント ID の絵文字フォールバック(
agents.entries.*.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")では、ダイレクトメッセージまたはアンビエントなルームイベントで確認リアクションは実行されません。受信 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のレガシーエイリアスです。- ブール値
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 に話しかけるには、OpenClaw アプリに Slack オーディオクリップを送信します。Slackbot の音声入力マイクは Slack が所有する別機能であり、アプリ API ではありません。- **Slackbot の音声入力**は、ユーザーの非公開 Slackbot 会話内で動作します。Slack は録音を Slackbot のプロンプトに変換しますが、Events API を通じてサードパーティの Slack アプリにオーディオファイル、音声入力イベント、プロンプト、入力ソースマーカーを送出することはありません。OpenClaw Slack plugin はこれを有効化したり受信したりできません。
- **Slack オーディオクリップ**は、OpenClaw の DM、チャンネル、またはスレッドに投稿できる Slack の保存済みファイルです。OpenClaw はアクセス可能なクリップをボットトークンでダウンロードし、Slack のクリップ MIME メタデータを正規化して、共有の音声文字起こしパイプラインに送信します。推奨アプリマニフェストには、必要な
files:readスコープが含まれています。
requireMention: true が設定されたチャンネルでは、キャプションのないオーディオクリップでも、設定済みのメンションパターン(agents.entries.*.groupChat.mentionPatterns、フォールバックは messages.groupChat.mentionPatterns)を発話することでゲートを満たせます。OpenClaw はクリップをダウンロードまたは文字起こしする前に送信者を認可し、文字起こしが一致した場合にのみ受け入れます。失敗した、または一致しなかった推測的な文字起こしは、ダウンロードしたクリップとともに破棄され、チャンネル履歴には保持されません。Slack ネイティブの @bot ID は音声から推測できないため、発話名のパターンを設定するか、入力したメンションを含めてください。文字起こしのエコーが有効な場合、エコーは受け入れ後にのみ送信されます。
メディア、分割、および配信
受信添付ファイル
受信添付ファイル
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)を含めることができます - 長いファイルキャプションでは、Slack に安全な最初のテキストチャンクをアップロードコメントとして使用し、残りのチャンクを後続メッセージとして送信します
- 送信メディアの上限は、設定されている場合は
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 の公開data_visualization Block Kit ブロックは、
メッセージ内に折れ線、棒、面、および円グラフをレンダリングします。OpenClaw は移植可能な
presentation chart ブロックをそのネイティブ形式にマッピングします。通常の
chat:write メッセージアクセス以外に、追加の OAuth スコープ、
ファイルアップロード、画像レンダラー、Slack 設定は必要ありません。
- タイトルおよび任意の軸ラベル:50 文字
- 円グラフ:1~12 個の正のセグメント
- 折れ線/棒/面グラフ:一意の名前を持つ 1~12 個の系列と、共有される 1~20 個のカテゴリ
- セグメント、カテゴリ、および系列のラベル:20 文字
- すべての系列には、各カテゴリに対して 1 つの有限値が必要です。円グラフ以外の値は 負でもかまいません
invalid_blocks でチャートを拒否した場合、OpenClaw は拒否されたネイティブデータブロックを
削除し、同階層のコントロールを保持したうえで、完全なチャート表現を表示テキストとして送信します。
Slack は現在、メッセージごとに最大 2 個の data_visualization ブロックを受け付けます。
プレゼンテーションに 2 個を超える有効なチャートが含まれる場合、OpenClaw はその順序を維持し、
後続メッセージでネイティブレンダリングを続行します。各メッセージに含まれるチャートは
2 個以下です。
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 データ行、およびヘッダー行
- すべての行でセル数が同一
- 1 つのメッセージ内の全テーブルセルを合計して最大 10,000 文字
<@U123> のようなセルデータが Slack のメンションになることはありません。
Slack が invalid_blocks でネイティブのチャートまたはテーブルブロックを拒否した場合、OpenClaw は範囲を限定した1回の復旧ステップですべてのネイティブデータブロックを削除し、ボタンや選択メニューなどの有効な兄弟ブロックを保持したうえで、Slack の書式設定を無効にして、完全に表示可能なチャートとテーブルのテキストを送信します。スラッシュコマンドの配信では、コマンド全体を通して Slack の5回の呼び出しという response_url 予算を追跡します。各返信バッチの前に、残りの呼び出し回数に収まる完全なプランを選択し、収まらない場合はそのバッチを投稿する前に失敗します。
ネイティブテーブルに昇格されるのは、明示的な presentation テーブルブロックだけです。
Markdown のパイプテーブルは作成時のテキストのまま保持され、OpenClaw がテーブル構造やセル型を推測することはありません。既存の信頼済み Slack ネイティブ生成元は、引き続き生のブロックを channelData.slack.blocks 経由で渡せます。OpenClaw は有効な生の data_table セルからフォールバックテキストを生成しますが、不正なカスタムブロックはキャプションまたは一般的な Block Kit フォールバックに縮退する場合があります。ポータブルなエージェント、CLI、および Plugin の出力では presentation を使用してください。
インタラクティブな返信
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>"を配置します。
view_submission または
view_closed としての ctx.interaction.kind、正規化された inputs、および Slack からの完全な生の stateValues オブジェクトを受信します。Plugin ハンドラーの呼び出しにはコールバック ID のみのルーティングで十分です。モーダルからエージェントに表示されるシステムイベントも生成する場合は、既存のモーダルの private_metadata ユーザー/セッションルーティングフィールドを含めてください。エージェントは、圧縮および秘匿化された Slack interaction: ... システムイベントを受信します。ハンドラーが
systemEvent.summary、systemEvent.reference、または systemEvent.data を返す場合、それらのフィールドが圧縮イベントに含まれるため、エージェントは完全なフォームペイロードを見ることなく、Plugin が所有するストレージを参照できます。
Slack のネイティブ承認
Slack は Web UI やターミナルへのフォールバックではなく、インタラクティブなボタンとインタラクションを備えたネイティブ承認クライアントとして機能できます。- 実行および Plugin の承認は、Slack ネイティブの Block Kit プロンプトとしてレンダリングできます。
channels.slack.execApprovals.*は引き続き、ネイティブ実行承認クライアントの有効化と DM/チャンネルルーティングの設定です。- 実行承認の DM は
channels.slack.execApprovals.approversまたはcommands.ownerAllowFromを使用します。 - 発生元セッションで Slack がネイティブ承認クライアントとして有効になっている場合、または
approvals.pluginが発生元の Slack セッションか Slack ターゲットへルーティングする場合、Plugin の承認には Slack ネイティブボタンが使用されます。 - Plugin 承認の DM には、
channels.slack.allowFrom、名前付きアカウントのallowFrom、またはアカウントのデフォルトルートから取得した Slack Plugin 承認者が使用されます。 - 承認者の認可は引き続き適用されます。実行専用の承認者は、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人の実行承認者を解決できる場合、Slack はネイティブ実行承認を自動的に有効にします。Slack Plugin 承認者を解決でき、リクエストがネイティブクライアントのフィルターに一致する場合、Slack はこのネイティブクライアント経路を通じてネイティブ Plugin 承認も処理できます。Slack をネイティブ承認クライアントとして明示的に無効にするには、enabled: false を設定します。承認者を解決できる場合にネイティブ承認を強制的に有効にするには、enabled: true を設定します。Slack の実行承認を無効にしても、approvals.plugin を通じて有効になっているネイティブ Slack Plugin 承認の配信は無効になりません。Plugin 承認の配信では、代わりに Slack Plugin 承認者が使用されます。
Slack の実行承認を明示的に設定していない場合のデフォルト動作:
approvals.exec 転送は別の機能です。実行承認プロンプトを他のチャットや明示的な帯域外ターゲットにもルーティングする必要がある場合にのみ使用してください。共有の approvals.plugin 転送も別の機能です。Slack が Plugin 承認リクエストをネイティブに処理できる場合にのみ、Slack ネイティブ配信はそのフォールバックを抑制します。
同一チャットの /approve は、すでにコマンドをサポートしている Slack チャンネルと DM でも機能します。承認転送モデル全体については、実行承認を参照してください。
イベントと運用動作
- メッセージの編集/削除はシステムイベントにマッピングされます。
- スレッドブロードキャスト(「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時間以内にアクティブで、観測された人間の参加者が最大8人の DM、MPIM、および Slack スレッドを監視します。トップレベルのチャンネルセッションは除外されます。on: 参加者数の上限なしで同じ会話を監視し、トップレベルのチャンネルセッションも含めます。チャンネルごとの上書きを使用して、特定のチャンネルを強制的に有効または無効にできます。
away から active への遷移時にのみ起動します。Slack アカウントとユーザーの組み合わせごとに永続的な8時間のクールダウンが適用され、その人物が複数のスレッドに参加していても変わりません。イベントは、その人物が最後にアクティブだった適格な会話だけにルーティングされ、短い挨拶を1件送るかどうかを判断する前に、メモリ/Wiki と既知のタイムゾーンコンテキストを参照するようエージェントに指示します。エージェントは何も送信しないこともできます。
ボットトークンには users:read が必要です。これは推奨マニフェストにすでに含まれています。Enterprise Grid の組織全体インストールではプレゼンスイベントを利用できません。
設定リファレンス
主要なリファレンス: 設定リファレンス - Slack。重要な Slack フィールド
重要な Slack フィールド
- モード/認証:
identity,mode,enterpriseOrgInstall,botToken,appToken,userToken,signingSecret,webhookPath,accounts.* - DM アクセス:
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)— キーにはチャンネル名(#channel-name)ではなく、チャンネル ID(C12345678)を使用する必要があります。チャンネルルーティングはデフォルトで ID を優先するため、groupPolicy: "allowlist"では名前ベースのキーは何の通知もなく失敗します。ID を確認するには、Slack でチャンネルを右クリック → Copy link — URL の末尾にあるC...の値がチャンネル ID です。 requireMention- チャンネルごとの
users許可リスト messages.groupChat.visibleReplies: 通常のグループ/チャンネルリクエストのデフォルトは"automatic"です。"message_tool"を有効にしており、ログにはアシスタントのテキストが表示されるもののmessage(action=send)呼び出しがない場合、モデルは表示されているメッセージツールの経路を使用しませんでした。このモードでは最終テキストは非公開のままです。抑制されたペイロードのメタデータを Gateway の詳細ログで確認するか、通常のアシスタントの最終返信をすべてレガシー経路から投稿する場合は"automatic"に設定してください。messages.groupChat.unmentionedInbound:"room_event"の場合、メンションされていない許可済みチャンネルの会話は周辺コンテキストとなり、エージェントがmessageツールを呼び出さない限り応答しません。ルームの周辺イベントを参照してください。
DM メッセージが無視される
DM メッセージが無視される
確認事項:
channels.slack.dm.enabledchannels.slack.dmPolicy(またはレガシーのchannels.slack.dm.policy)- ペアリングの承認/許可リストのエントリ(
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 モードが接続されない
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 モードでイベントを受信しない
次を検証します:
- 署名シークレット
- Webhook パス
- Slack Request URLs(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 を使用しています。各アカウントに異なるパスを指定してください。ネイティブ/スラッシュコマンドが実行されない
ネイティブ/スラッシュコマンドが実行されない
意図していたモードを確認します:
- Slack に登録された対応するスラッシュコマンドを使用するネイティブコマンドモード(
channels.slack.commands.native: true) - または単一スラッシュコマンドモード(
channels.slack.slashCommand.enabled: true)
commands.native: "auto" では Slack のネイティブコマンドは有効になりません。true を使用し、対応するコマンドを Slack アプリで作成してください。HTTP モードでは、すべての Slack スラッシュコマンドに Gateway URL を含める必要があります。Socket Mode では、コマンドペイロードは websocket 経由で届き、Slack は slash_commands[].url を無視します。commands.useAccessGroups、DM の認可、チャンネル許可リスト、
チャンネルごとの 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 はルートファイルをスレッド開始時のコンテキストとして取り込めます。
- ルートファイルが取り込まれるのは、新規またはリセットされたスレッドセッションを初期化するときだけです。それ以降のテキストのみの返信では既存のセッションコンテキストが再利用され、ルートファイルが新しいメディアとして再添付されることはありません。
- 返信に直接添付されたファイルは、ルートメッセージの添付ファイルより優先されます。
- ファイルのみでテキストがないルートメッセージは添付プレースホルダーで表されるため、フォールバックでもそのファイルを含めることができます。
複数添付ファイルの処理
1 件の Slack メッセージに複数のファイルが添付されている場合:- 各添付ファイルは、メディアパイプラインで個別に処理されます。
- ダウンロードされたメディア参照はメッセージコンテキストに集約されます。
- 処理順序は、イベントペイロード内の Slack のファイル順に従います。
- 1 つの添付ファイルのダウンロードに失敗しても、他のファイルはブロックされません。
サイズ、ダウンロード、モデルの制限
- サイズ上限: デフォルトはファイルごとに 20 MB。
channels.slack.mediaMaxMbで設定できます。 - 音声文字起こしの上限: ダウンロードされたファイルが文字起こしプロバイダーまたは CLI に送信される場合、選択された音声対応
tools.media.models[]エントリのmaxBytesも適用されます。 - ダウンロード失敗: Slack が提供できないファイル、期限切れの URL、アクセスできないファイル、サイズ上限を超えたファイル、Slack の認証/ログイン HTML 応答は、未対応形式として報告されるのではなくスキップされます。
- ビジョンモデル: 画像分析では、ビジョンに対応している場合は有効な返信モデルを使用し、それ以外の場合は
agents.defaults.imageModelで設定された画像モデルを使用します。
既知の制限
関連ドキュメント
関連項目
ペアリング
Slack ユーザーを Gateway とペアリングします。
グループ
チャンネルとグループ DM の動作。
チャンネルルーティング
受信メッセージをエージェントにルーティングします。
セキュリティ
脅威モデルと堅牢化。
設定
設定のレイアウトと優先順位。
スラッシュコマンド
コマンドカタログと動作。