Mainstream messaging
Slack
DM とチャンネル向けに Slack アプリ連携で本番運用可能です。デフォルトのモードは Socket Mode です。HTTP Request URLs もサポートされています。
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 トークン(xoxb-...)+ connections:write 付き App-Level Token(xapp-...) |
Bot トークン(xoxb-...)+ Signing Secret |
| 開発用ノート PC / ファイアウォール内 | そのまま動作します | 公開トンネル(ngrok、Cloudflare Tunnel、Tailscale Funnel)またはステージング Gateway が必要 |
| 水平スケーリング | アプリごと、ホストごとに Socket Mode セッションは 1 つ。複数の 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 が自動再接続します。Gateway の pong-timeout トランスポート調整が適用されます | 切断される永続接続はありません。リトライは Slack からのリクエスト単位です |
クイックセットアップ
Socket Mode(デフォルト)
新しい Slack アプリを作成
api.slack.com/apps を開く → Create New App → From a manifest → ワークスペースを選択 → 下のいずれかのマニフェストを貼り付け → Next → Create。
{"display_information": {"name": "OpenClaw","description": "Slack connector for OpenClaw"},"features": {"bot_user": { "display_name": "OpenClaw", "always_online": true },"app_home": {"home_tab_enabled": true,"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": ["app_mentions:read","assistant:write","channels:history","channels:read","chat:write","commands","emoji:read","files:read","files:write","groups:history","groups:read","im:history","im:read","im:write","mpim:history","mpim:read","mpim:write","pins:read","pins:write","reactions:read","reactions:write","usergroups:read","users:read"]}},"settings": {"socket_mode_enabled": true,"event_subscriptions": {"bot_events": ["app_home_opened","app_mention","channel_rename","member_joined_channel","member_left_channel","message.channels","message.groups","message.im","message.mpim","pin_added","pin_removed","reaction_added","reaction_removed"]}}}{"display_information": {"name": "OpenClaw","description": "Slack connector for OpenClaw"},"features": {"bot_user": { "display_name": "OpenClaw", "always_online": true },"app_home": {"home_tab_enabled": true,"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": ["app_mentions:read","assistant:write","channels:history","channels:read","chat:write","commands","groups:history","groups:read","im:history","im:read","im:write","users:read"]}},"settings": {"socket_mode_enabled": true,"event_subscriptions": {"bot_events": ["app_home_opened","app_mention","message.channels","message.groups","message.im"]}}}Slack がアプリを作成した後:
- Basic Information → App-Level Tokens → Generate Token and Scopes:
connections:writeを追加し、保存して、xapp-...値をコピーします。 - Install App → Install to Workspace:
xoxb-...Bot User OAuth Token をコピーします。
OpenClaw を設定
推奨される SecretRef セットアップ:
export SLACK_APP_TOKEN=xapp-...export SLACK_BOT_TOKEN=xoxb-...cat > slack.socket.patch.json5 <<'JSON5'{channels: {slack: {enabled: true,mode: "socket",appToken: { source: "env", provider: "default", id: "SLACK_APP_TOKEN" },botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" },},},}JSON5openclaw config patch --file ./slack.socket.patch.json5 --dry-runopenclaw config patch --file ./slack.socket.patch.json5env フォールバック(デフォルトアカウントのみ):
SLACK_APP_TOKEN=xapp-...SLACK_BOT_TOKEN=xoxb-...Gateway を起動
openclaw gatewayHTTP Request URLs
新しい Slack アプリを作成
api.slack.com/apps を開く → Create New App → From a manifest → ワークスペースを選択 → 下のいずれかのマニフェストを貼り付け → https://gateway-host.example.com/slack/events を公開 Gateway URL に置き換え → Next → Create。
{"display_information": {"name": "OpenClaw","description": "Slack connector for OpenClaw"},"features": {"bot_user": { "display_name": "OpenClaw", "always_online": true },"app_home": {"home_tab_enabled": true,"messages_tab_enabled": true,"messages_tab_read_only_enabled": false},"slash_commands": [{"command": "/openclaw","description": "Send a message to OpenClaw","should_escape": false,"url": "https://gateway-host.example.com/slack/events"}]},"oauth_config": {"scopes": {"bot": ["app_mentions:read","assistant:write","channels:history","channels:read","chat:write","commands","emoji:read","files:read","files:write","groups:history","groups:read","im:history","im:read","im:write","mpim:history","mpim:read","mpim:write","pins:read","pins:write","reactions:read","reactions:write","usergroups:read","users:read"]}},"settings": {"event_subscriptions": {"request_url": "https://gateway-host.example.com/slack/events","bot_events": ["app_home_opened","app_mention","channel_rename","member_joined_channel","member_left_channel","message.channels","message.groups","message.im","message.mpim","pin_added","pin_removed","reaction_added","reaction_removed"]},"interactivity": {"is_enabled": true,"request_url": "https://gateway-host.example.com/slack/events","message_menu_options_url": "https://gateway-host.example.com/slack/events"}}}{"display_information": {"name": "OpenClaw","description": "Slack connector for OpenClaw"},"features": {"bot_user": { "display_name": "OpenClaw", "always_online": true },"app_home": {"home_tab_enabled": true,"messages_tab_enabled": true,"messages_tab_read_only_enabled": false},"slash_commands": [{"command": "/openclaw","description": "Send a message to OpenClaw","should_escape": false,"url": "https://gateway-host.example.com/slack/events"}]},"oauth_config": {"scopes": {"bot": ["app_mentions:read","assistant:write","channels:history","channels:read","chat:write","commands","groups:history","groups:read","im:history","im:read","im:write","users:read"]}},"settings": {"event_subscriptions": {"request_url": "https://gateway-host.example.com/slack/events","bot_events": ["app_home_opened","app_mention","message.channels","message.groups","message.im"]},"interactivity": {"is_enabled": true,"request_url": "https://gateway-host.example.com/slack/events","message_menu_options_url": "https://gateway-host.example.com/slack/events"}}}Slack がアプリを作成した後:
- Basic Information → App Credentials: リクエスト検証用の Signing Secret をコピーします。
- Install App → Install to Workspace:
xoxb-...Bot User OAuth Token をコピーします。
OpenClaw を設定する
推奨 SecretRef 設定:
export SLACK_BOT_TOKEN=xoxb-...export SLACK_SIGNING_SECRET=...cat > slack.http.patch.json5 <<'JSON5'{channels: {slack: {enabled: true,mode: "http",botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" },signingSecret: { source: "env", provider: "default", id: "SLACK_SIGNING_SECRET" },webhookPath: "/slack/events",},},}JSON5openclaw config patch --file ./slack.http.patch.json5 --dry-runopenclaw config patch --file ./slack.http.patch.json5Gateway を起動する
openclaw gatewaySocket Mode トランスポート調整
OpenClaw は、Socket Mode ではデフォルトで Slack SDK クライアントの pong タイムアウトを 15 秒に設定します。ワークスペースまたはホスト固有の調整が必要な場合にのみ、トランスポート設定を上書きしてください。
{ channels: { slack: { mode: "socket", socketMode: { clientPingTimeout: 20000, serverPingTimeout: 30000, pingPongLoggingEnabled: false, }, }, },}これは、Slack websocket の pong/server-ping タイムアウトをログに記録する Socket Mode ワークスペース、またはイベントループの枯渇が既知のホストでのみ使用してください。clientPingTimeout は SDK がクライアント ping を送信した後の pong 待機時間です。serverPingTimeout は Slack サーバー ping の待機時間です。アプリのメッセージとイベントはアプリケーション状態であり、トランスポートの生存性シグナルではありません。
マニフェストとスコープのチェックリスト
基本の Slack アプリマニフェストは、Socket Mode と HTTP Request URLs で同じです。異なるのは settings ブロック (およびスラッシュコマンドの url) だけです。
基本マニフェスト (Socket Mode のデフォルト):
{ "display_information": { "name": "OpenClaw", "description": "Slack connector for OpenClaw" }, "features": { "bot_user": { "display_name": "OpenClaw", "always_online": true }, "app_home": { "home_tab_enabled": true, "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": [ "app_mentions:read", "assistant:write", "channels:history", "channels:read", "chat:write", "commands", "emoji:read", "files:read", "files:write", "groups:history", "groups:read", "im:history", "im:read", "im:write", "mpim:history", "mpim:read", "mpim:write", "pins:read", "pins:write", "reactions:read", "reactions:write", "usergroups:read", "users:read" ] } }, "settings": { "socket_mode_enabled": true, "event_subscriptions": { "bot_events": [ "app_home_opened", "app_mention", "channel_rename", "member_joined_channel", "member_left_channel", "message.channels", "message.groups", "message.im", "message.mpim", "pin_added", "pin_removed", "reaction_added", "reaction_removed" ] } }}HTTP Request URLs モード の場合は、settings を HTTP 版に置き換え、各スラッシュコマンドに url を追加します。公開 URL が必要です。
{ "features": { "slash_commands": [ { "command": "/openclaw", "description": "Send a message to OpenClaw", "should_escape": false, "url": "https://gateway-host.example.com/slack/events" } ] }, "settings": { "event_subscriptions": { "request_url": "https://gateway-host.example.com/slack/events", "bot_events": [ "app_home_opened", "app_mention", "channel_rename", "member_joined_channel", "member_left_channel", "message.channels", "message.groups", "message.im", "message.mpim", "pin_added", "pin_removed", "reaction_added", "reaction_removed" ] }, "interactivity": { "is_enabled": true, "request_url": "https://gateway-host.example.com/slack/events", "message_menu_options_url": "https://gateway-host.example.com/slack/events" } }}追加のマニフェスト設定
上記のデフォルトを拡張する別の機能を示します。
デフォルトのマニフェストは、Slack App Home の Home タブを有効化し、app_home_opened を購読します。ワークスペースメンバーが Home タブを開くと、OpenClaw は views.publish で安全なデフォルトの Home ビューを公開します。会話ペイロードや非公開設定は含まれません。Messages タブは Slack DM 用に引き続き有効です。
任意のネイティブスラッシュコマンド
単一の設定済みコマンドの代わりに、複数の ネイティブスラッシュコマンド を細かく使い分けられます。
/statusコマンドは予約済みのため、/statusではなく/agentstatusを使用します。- 一度に利用可能にできるスラッシュコマンドは 25 個までです。
既存の features.slash_commands セクションを、利用可能なコマンド のサブセットに置き換えます。
Socket Mode (デフォルト)
{"slash_commands": [{"command": "/new","description": "Start a new session","usage_hint": "[model]"},{"command": "/reset","description": "Reset the current session"},{"command": "/compact","description": "Compact the session context","usage_hint": "[instructions]"},{"command": "/stop","description": "Stop the current run"},{"command": "/session","description": "Manage thread-binding expiry","usage_hint": "idle <duration|off> or max-age <duration|off>"},{"command": "/think","description": "Set the thinking level","usage_hint": "<level>"},{"command": "/verbose","description": "Toggle verbose output","usage_hint": "on|off|full"},{"command": "/fast","description": "Show or set fast mode","usage_hint": "[status|on|off]"},{"command": "/reasoning","description": "Toggle reasoning visibility","usage_hint": "[on|off|stream]"},{"command": "/elevated","description": "Toggle elevated mode","usage_hint": "[on|off|ask|full]"},{"command": "/exec","description": "Show or set exec defaults","usage_hint": "host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>"},{"command": "/model","description": "Show or set the model","usage_hint": "[name|#|status]"},{"command": "/models","description": "List providers/models","usage_hint": "[provider] [page] [limit=<n>|size=<n>|all]"},{"command": "/help","description": "Show the short help summary"},{"command": "/commands","description": "Show the generated command catalog"},{"command": "/tools","description": "Show what the current agent can use right now","usage_hint": "[compact|verbose]"},{"command": "/agentstatus","description": "Show runtime status, including provider usage/quota when available"},{"command": "/tasks","description": "List active/recent background tasks for the current session"},{"command": "/context","description": "Explain how context is assembled","usage_hint": "[list|detail|json]"},{"command": "/whoami","description": "Show your sender identity"},{"command": "/skill","description": "Run a skill by name","usage_hint": "<name> [input]"},{"command": "/btw","description": "Ask a side question without changing session context","usage_hint": "<question>"},{"command": "/side","description": "Ask a side question without changing session context","usage_hint": "<question>"},{"command": "/usage","description": "Control the usage footer or show cost summary","usage_hint": "off|tokens|full|cost"}]}HTTP Request URLs
上記の Socket Mode と同じ slash_commands リストを使用し、すべてのエントリに "url": "https://gateway-host.example.com/slack/events" を追加します。例:
{"slash_commands": [{"command": "/new","description": "Start a new session","usage_hint": "[model]","url": "https://gateway-host.example.com/slack/events"},{"command": "/help","description": "Show the short help summary","url": "https://gateway-host.example.com/slack/events"}]}リスト内のすべてのコマンドで、その url 値を繰り返します。
任意の authorship スコープ(書き込み操作)
送信メッセージでデフォルトの Slack アプリ ID ではなく、アクティブなエージェント ID(カスタムユーザー名とアイコン)を使用したい場合は、chat:write.customize bot スコープを追加します。
絵文字アイコンを使う場合、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、appToken、signingSecret、userTokenはプレーンテキスト 文字列または SecretRef オブジェクトを受け付けます。- 設定トークンは env フォールバックを上書きします。
SLACK_BOT_TOKEN/SLACK_APP_TOKENenv フォールバックはデフォルトアカウントにのみ適用されます。userToken(xoxp-...)は設定専用(env フォールバックなし)で、デフォルトは読み取り専用動作(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 | 有効 |
現在の 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 フラグ:
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> を使用します。
チャンネルポリシー
channels.slack.groupPolicy はチャンネル処理を制御します。
openallowlistdisabled
チャンネル許可リストは channels.slack.channels 配下にあり、設定キーとして 安定した Slack チャンネル ID(例: C12345678)を使用する必要があります。
ランタイムの注意: channels.slack が完全に欠落している場合(env のみのセットアップ)、ランタイムは groupPolicy="allowlist" にフォールバックし、警告をログに記録します(channels.defaults.groupPolicy が設定されている場合でも)。
名前/ID 解決:
- チャンネル許可リストエントリと DM 許可リストエントリは、トークンアクセスで可能な場合に起動時に解決されます
- 解決できなかったチャンネル名エントリは設定どおり保持されますが、デフォルトではルーティングで無視されます
- 受信認可とチャンネルルーティングはデフォルトで ID 優先です。直接的なユーザー名/slug マッチングには
channels.slack.dangerouslyAllowNameMatching: trueが必要です
メンションとチャンネルユーザー
チャンネルメッセージはデフォルトでメンションゲートされます。
メンションソース:
- 明示的なアプリメンション(
<@botId>) - Slack ユーザーグループメンション(
<!subteam^S...>)。bot ユーザーがそのユーザーグループのメンバーである場合。usergroups:readが必要です - メンション正規表現パターン(
agents.list[].groupChat.mentionPatterns、フォールバックmessages.groupChat.mentionPatterns) - bot への暗黙的な返信スレッド動作(
thread.requireExplicitMentionがtrueの場合は無効)
チャンネルごとの制御(channels.slack.channels.<id>。名前は起動時解決または dangerouslyAllowNameMatching 経由のみ):
requireMentionusers(許可リスト)allowBotsskillssystemPrompttools,toolsBySendertoolsBySenderキー形式:channel:、id:、e164:、username:、name:、または"*"ワイルドカード (レガシーの接頭辞なしキーは引き続きid:のみにマップされます)
allowBots はチャンネルとプライベートチャンネルに対して保守的です。bot 作成のルームメッセージは、送信 bot がそのルームの users 許可リストに明示的に含まれている場合、または channels.slack.allowFrom からの明示的な Slack オーナー ID の少なくとも 1 つが現在ルームメンバーである場合にのみ受け付けられます。ワイルドカードと表示名のオーナーエントリは、オーナー存在の条件を満たしません。オーナー存在は Slack conversations.members を使用します。アプリにルームタイプに対応する読み取りスコープ(パブリックチャンネルでは channels:read、プライベートチャンネルでは groups:read)があることを確認してください。メンバー検索に失敗した場合、OpenClaw は bot 作成のルームメッセージをドロップします。
スレッド、セッション、返信タグ
- DM は
directとして、チャンネルはchannelとして、MPIM はgroupとしてルーティングされます。 - Slack ルートバインディングは、raw ピア ID に加えて、
channel:C12345678、user:U12345678、<@U12345678>などの Slack ターゲット形式を受け付けます。 - デフォルトの
session.dmScope=mainでは、Slack DM はエージェントのメインセッションに集約されます。 - チャンネルセッション:
agent:<agentId>:slack:channel:<channelId>。 - スレッド返信は、該当する場合にスレッドセッションサフィックス(
:thread:<threadTs>)を作成できます。 - OpenClaw が明示的なメンションを要求せずにトップレベルメッセージを処理するチャンネルでは、
off以外のreplyToModeにより、処理された各 root がagent:<agentId>:slack:channel:<channelId>:thread:<rootTs>にルーティングされるため、表示される Slack スレッドは最初のターンから 1 つの OpenClaw セッションに対応します。 channels.slack.thread.historyScopeのデフォルトはthreadです。thread.inheritParentのデフォルトはfalseです。channels.slack.thread.initialHistoryLimitは、新しいスレッドセッション開始時に取得される既存スレッドメッセージ数を制御します(デフォルト20。無効にするには0を設定)。channels.slack.thread.requireExplicitMention(デフォルトfalse):trueの場合、暗黙的なスレッドメンションを抑制し、bot がすでにスレッドに参加している場合でも、スレッド内の明示的な@botメンションにのみ応答します。これがない場合、bot 参加済みスレッド内の返信はrequireMentionゲートをバイパスします。
返信スレッド制御:
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 スレッドを継承します。代わりに新しい親チャンネルメッセージを強制するには、action: "send" または action: "upload-file" に topLevel: true を設定します。threadId: null も同じトップレベルのオプトアウトとして受け付けられます。
Ack リアクション
ackReaction は、OpenClaw が受信メッセージを処理している間に確認応答の絵文字を送信します。
解決順序:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- エージェント ID の絵文字フォールバック(
agents.list[].identity.emoji、それ以外は "👀")
注意:
- Slack はショートコード(例:
"eyes")を想定します。 - Slack アカウントまたはグローバルでリアクションを無効にするには
""を使用します。
テキストストリーミング
channels.slack.streaming はライブプレビュー動作を制御します。
off: ライブプレビューストリーミングを無効にします。partial(デフォルト): プレビューテキストを最新の部分出力で置き換えます。block: チャンク化されたプレビュー更新を追加します。progress: 生成中に進行状況テキストを表示し、その後最終テキストを送信します。streaming.preview.toolProgress: ドラフトプレビューが有効な場合、ツール/進行状況更新を同じ編集済みプレビューメッセージにルーティングします(デフォルト:true)。別々のツール/進行状況メッセージを維持するにはfalseを設定します。streaming.preview.commandText/streaming.progress.commandText: raw command/exec テキストを隠しながらコンパクトなツール進行状況行を維持するにはstatusに設定します(デフォルト:raw)。
raw command/exec テキストを隠しながら、コンパクトな進行状況行を維持します。
{ "channels": { "slack": { "streaming": { "mode": "progress", "progress": { "toolProgress": true, "commandText": "status" } } } }}channels.slack.streaming.nativeTransport は、channels.slack.streaming.mode が partial の場合に Slack ネイティブテキストストリーミングを制御します(デフォルト: true)。
- ネイティブテキストストリーミングと Slack アシスタントのスレッドステータスを表示するには、返信スレッドが利用可能である必要があります。スレッド選択は引き続き
replyToModeに従います。 - チャンネル、グループチャット、トップレベルの DM ルートでは、ネイティブストリーミングが利用できない場合や返信スレッドが存在しない場合でも、通常の下書きプレビューを使用できます。
- トップレベルの Slack DM はデフォルトでスレッド外のままなので、Slack のスレッド形式のネイティブストリーム/ステータスプレビューは表示されません。代わりに OpenClaw が DM 内で下書きプレビューを投稿および編集します。
- メディアと非テキストペイロードは通常の配信にフォールバックします。
- メディア/エラーの最終結果は保留中のプレビュー編集をキャンセルします。対象となるテキスト/ブロックの最終結果は、プレビューをその場で編集できる場合にのみフラッシュされます。
- 返信の途中でストリーミングが失敗した場合、OpenClaw は残りのペイロードを通常配信にフォールバックします。
Slack ネイティブテキストストリーミングの代わりに下書きプレビューを使用します。
{ channels: { slack: { streaming: { mode: "partial", nativeTransport: false, }, }, },}レガシーキー:
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.nativeStreamingは、channels.slack.streaming.nativeTransportのランタイムエイリアスです。 openclaw doctor --fixを実行して、永続化された Slack ストリーミング設定を正規キーに書き換えます。
入力中リアクションのフォールバック
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を使用します (デフォルト 4000) channels.slack.chunkMode="newline"は段落優先の分割を有効にします- ファイル送信は Slack アップロード API を使用し、スレッド返信 (
thread_ts) を含められます - 送信メディア上限は、設定されている場合は
channels.slack.mediaMaxMbに従います。それ以外の場合、チャンネル送信はメディアパイプラインの MIME 種別デフォルトを使用します
配信先
推奨される明示的なターゲット:
- DM は
user:<id> - チャンネルは
channel:<id>
テキスト/ブロックのみの Slack DM はユーザー ID に直接投稿できます。ファイルアップロードとスレッド送信では、具体的な会話 ID が必要なため、まず Slack 会話 API 経由で DM を開きます。
コマンドとスラッシュ動作
スラッシュコマンドは、Slack では単一の設定済みコマンドまたは複数のネイティブコマンドとして表示されます。コマンドのデフォルトを変更するには channels.slack.slashCommand を設定します。
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
/openclaw /helpネイティブコマンドには、Slack アプリで 追加のマニフェスト設定 が必要で、代わりに channels.slack.commands.native: true またはグローバル設定の commands.native: true で有効化します。
- Slack ではネイティブコマンドの自動モードが オフ のため、
commands.native: "auto"では Slack ネイティブコマンドは有効になりません。
/helpネイティブ引数メニューは、選択されたオプション値をディスパッチする前に確認モーダルを表示する適応型レンダリング戦略を使用します。
- 最大 5 個のオプション: ボタンブロック
- 6〜100 個のオプション: 静的選択メニュー
- 100 個を超えるオプション: インタラクティビティオプションハンドラーが利用可能な場合、非同期オプションフィルタリング付き外部選択
- Slack 制限を超過: エンコードされたオプション値はボタンにフォールバックします
/thinkスラッシュセッションは agent:<agentId>:slack:slash:<userId> のような分離キーを使用し、コマンド実行は引き続き CommandTargetSessionKey を使用してターゲット会話セッションへルーティングされます。
インタラクティブ返信
Slack はエージェントが作成したインタラクティブ返信コントロールをレンダリングできますが、この機能はデフォルトで無効です。
グローバルに有効化します。
{ channels: { slack: { capabilities: { interactiveReplies: true, }, }, },}または、1 つの 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 が生成した不透明トークンです。
- 生成されたインタラクティブブロックが Slack Block Kit の制限を超える場合、OpenClaw は無効なブロックペイロードを送信する代わりに、元のテキスト返信にフォールバックします。
Slack での実行承認
Slack は Web UI やターミナルにフォールバックする代わりに、インタラクティブボタンとインタラクションを備えたネイティブ承認クライアントとして動作できます。
- 実行承認はネイティブ DM/チャンネルルーティングに
channels.slack.execApprovals.*を使用します。 - Plugin 承認は、リクエストがすでに Slack に届いていて、承認 ID 種別が
plugin:の場合、同じ Slack ネイティブボタンサーフェス経由で引き続き解決できます。 - 承認者の認可は引き続き強制されます。承認者として識別されたユーザーだけが Slack 経由でリクエストを承認または拒否できます。
これは他のチャンネルと同じ共有承認ボタンサーフェスを使用します。Slack アプリ設定で 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
Slack は、enabled が未設定または "auto" で、少なくとも 1 人の承認者が解決される場合、ネイティブ実行承認を自動的に有効化します。Slack をネイティブ承認クライアントとして明示的に無効化するには enabled: false を設定します。
承認者が解決される場合にネイティブ承認を強制的にオンにするには enabled: true を設定します。
明示的な Slack 実行承認設定がない場合のデフォルト動作:
{ commands: { ownerAllowFrom: ["slack:U12345678"], },}明示的な Slack ネイティブ設定が必要なのは、承認者を上書きしたい、フィルターを追加したい、または送信元チャット配信にオプトインしたい場合だけです。
{ channels: { slack: { execApprovals: { enabled: true, approvers: ["U12345678"], target: "both", }, }, },}共有 approvals.exec 転送は別物です。実行承認プロンプトを他のチャットまたは明示的な帯域外ターゲットにもルーティングする必要がある場合にのみ使用します。共有 approvals.plugin 転送も別物です。Slack ネイティブボタンは、それらのリクエストがすでに Slack に届いている場合、Plugin 承認を引き続き解決できます。
同一チャットの /approve は、すでにコマンドをサポートしている Slack チャンネルと DM でも機能します。完全な承認転送モデルについては、実行承認 を参照してください。
イベントと運用動作
- メッセージ編集/削除はシステムイベントにマッピングされます。
- スレッドブロードキャスト (「Also send to channel」のスレッド返信) は通常のユーザーメッセージとして処理されます。
- リアクション追加/削除イベントはシステムイベントにマッピングされます。
- メンバー参加/退出、チャンネル作成/名前変更、ピン追加/削除イベントはシステムイベントにマッピングされます。
channel_id_changedは、configWritesが有効な場合にチャンネル設定キーを移行できます。- チャンネルトピック/目的メタデータは信頼できないコンテキストとして扱われ、ルーティングコンテキストに注入される可能性があります。
- スレッド開始者と初期スレッド履歴コンテキストのシードは、該当する場合、設定された送信者許可リストでフィルタリングされます。
- ブロックアクションとモーダルインタラクションは、リッチなペイロードフィールドを持つ構造化された
Slack interaction: ...システムイベントを出力します。- ブロックアクション: 選択値、ラベル、ピッカー値、および
workflow_*メタデータ - モーダル
view_submissionとview_closedイベント。ルーティングされたチャンネルメタデータとフォーム入力を含みます
- ブロックアクション: 選択値、ラベル、ピッカー値、および
設定リファレンス
主要リファレンス: 設定リファレンス - 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,chunkMode,mediaMaxMb,streaming,streaming.nativeTransport,streaming.preview.toolProgress - 展開プレビュー:
chat.postMessageのリンク/メディアプレビュー制御用unfurlLinks,unfurlMedia - 運用/機能:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
トラブルシューティング
チャンネルで返信がない
次の順に確認します。
groupPolicy- チャンネル許可リスト (
channels.slack.channels) — キーはチャンネル ID (C12345678) である必要があり、名前 (#channel-name) ではありません。groupPolicy: "allowlist"では、チャンネルルーティングがデフォルトで ID 優先のため、名前ベースのキーは暗黙に失敗します。ID を見つけるには、Slack でチャンネルを右クリック → リンクをコピー — URL 末尾のC...値がチャンネル ID です。 requireMention- チャンネルごとの
users許可リスト
有用なコマンド:
openclaw channels status --probeopenclaw logs --followopenclaw doctorDM メッセージが無視される
確認項目:
channels.slack.dm.enabledchannels.slack.dmPolicy(またはレガシーchannels.slack.dm.policy)- ペアリング承認 / 許可リストエントリ
- Slack アシスタント DM イベント:
drop message_changedに言及する詳細ログは、通常、Slack がメッセージメタデータ内に復元可能な人間の送信者を持たない編集済みアシスタントスレッドイベントを送信したことを意味します
openclaw pairing list slackSocket mode が接続しない
Slack アプリ設定で bot + app トークンと Socket Mode の有効化を検証します。
openclaw channels status --probe --json が botTokenStatus または
appTokenStatus: "configured_unavailable" を表示する場合、その Slack アカウントは
設定されていますが、現在のランタイムが SecretRef ベースの値を解決できなかったことを示します。
HTTP モードでイベントを受信しない
確認事項:
- 署名シークレット
- Webhook パス
- Slack リクエスト URL(イベント + インタラクティビティ + スラッシュコマンド)
- HTTP アカウントごとに一意の
webhookPath
アカウントスナップショットに signingSecretStatus: "configured_unavailable" が表示される場合、
HTTP アカウントは設定済みですが、現在のランタイムは SecretRef によって裏付けられた署名シークレットを
解決できませんでした。
ネイティブ/スラッシュコマンドが実行されない
意図していたものが次のどちらかを確認してください:
- Slack に登録された一致するスラッシュコマンドを使うネイティブコマンドモード(
channels.slack.commands.native: true) - または単一スラッシュコマンドモード(
channels.slack.slashCommand.enabled: true)
commands.useAccessGroups とチャンネル/ユーザーの許可リストも確認してください。
添付ファイルビジョンリファレンス
Slack ファイルのダウンロードが成功し、サイズ制限が許す場合、Slack はダウンロードしたメディアをエージェントターンに添付できます。画像ファイルはメディア理解パスを通すか、ビジョン対応の返信モデルに直接渡すことができます。その他のファイルは、画像入力として扱われるのではなく、ダウンロード可能なファイルコンテキストとして保持されます。
サポートされるメディアタイプ
| メディアタイプ | ソース | 現在の動作 | 注記 |
|---|---|---|---|
| JPEG / PNG / GIF / WebP 画像 | Slack ファイル URL | ダウンロードされ、ビジョン対応処理のためにターンへ添付される | ファイルごとの上限: channels.slack.mediaMaxMb(デフォルト 20 MB) |
| PDF ファイル | Slack ファイル URL | ダウンロードされ、download-file や pdf などのツール向けのファイルコンテキストとして公開される |
Slack の受信処理は PDF を画像ビジョン入力に自動変換しない |
| その他のファイル | Slack ファイル URL | 可能な場合はダウンロードされ、ファイルコンテキストとして公開される | バイナリファイルは画像入力として扱われない |
| スレッド返信 | スレッド開始メッセージのファイル | 返信に直接メディアがない場合、ルートメッセージのファイルをコンテキストとしてハイドレートできる | ファイルのみの開始メッセージは添付ファイルプレースホルダーを使用する |
| 複数画像メッセージ | 複数の Slack ファイル | 各ファイルは個別に評価される | Slack 処理はメッセージごとに 8 ファイルに制限される |
受信パイプライン
ファイル添付を含む Slack メッセージが到着すると:
- OpenClaw はボットトークン(
xoxb-...)を使用して、Slack のプライベート URL からファイルをダウンロードします。 - 成功すると、ファイルはメディアストアに書き込まれます。
- ダウンロードされたメディアパスとコンテンツタイプが受信コンテキストに追加されます。
- 画像対応のモデル/ツールパスは、そのコンテキストの画像添付を使用できます。
- 非画像ファイルは、それらを処理できるツール向けのファイルメタデータまたはメディア参照として引き続き利用できます。
スレッドルート添付ファイルの継承
メッセージがスレッド内に到着する場合(親 thread_ts を持つ):
- 返信自体に直接メディアがなく、含まれるルートメッセージにファイルがある場合、Slack はルートファイルをスレッド開始コンテキストとしてハイドレートできます。
- 直接返信の添付ファイルは、ルートメッセージの添付ファイルより優先されます。
- ファイルのみでテキストがないルートメッセージは添付ファイルプレースホルダーで表されるため、フォールバックはそのファイルを引き続き含められます。
複数添付ファイルの処理
1 件の Slack メッセージに複数のファイル添付が含まれる場合:
- 各添付ファイルはメディアパイプラインを通じて個別に処理されます。
- ダウンロードされたメディア参照はメッセージコンテキストに集約されます。
- 処理順序はイベントペイロード内の Slack のファイル順序に従います。
- 1 つの添付ファイルのダウンロード失敗が他の添付ファイルをブロックすることはありません。
サイズ、ダウンロード、モデルの制限
- サイズ上限: ファイルごとにデフォルト 20 MB。
channels.slack.mediaMaxMbで設定可能です。 - ダウンロード失敗: Slack が提供できないファイル、期限切れの URL、アクセスできないファイル、サイズ超過ファイル、Slack 認証/ログイン HTML レスポンスは、非サポート形式として報告されるのではなくスキップされます。
- ビジョンモデル: 画像分析では、ビジョンをサポートしている場合はアクティブな返信モデルを使用し、そうでない場合は
agents.defaults.imageModelに設定された画像モデルを使用します。
既知の制限
| シナリオ | 現在の動作 | 回避策 |
|---|---|---|
| 期限切れの Slack ファイル URL | ファイルはスキップされ、エラーは表示されない | Slack にファイルを再アップロードする |
| ビジョンモデル未設定 | 画像添付はメディア参照として保存されるが、画像としては分析されない | agents.defaults.imageModel を設定するか、ビジョン対応の返信モデルを使用する |
| 非常に大きい画像(デフォルトでは > 20 MB) | サイズ上限に従ってスキップされる | Slack が許可する場合は channels.slack.mediaMaxMb を増やす |
| 転送/共有された添付ファイル | テキストと Slack ホストの画像/ファイルメディアはベストエフォート | OpenClaw スレッドで直接再共有する |
| PDF 添付ファイル | ファイル/メディアコンテキストとして保存され、画像ビジョン経由に自動ルーティングされない | ファイルメタデータには download-file を使用し、PDF 分析には pdf ツールを使用する |
関連ドキュメント
- メディア理解パイプライン
- PDF ツール
- エピック: #51349 — Slack 添付ファイルビジョンの有効化
- 回帰テスト: #51353
- ライブ検証: #51354