メインコンテンツへスキップ
Slack サポートは Slack アプリ連携を介して DM とチャンネルに対応します。デフォルトのトランスポートは Socket Mode です。HTTP Request URLs もサポートされています。リレーモードは、信頼済みルーターが Slack イングレスを所有するマネージドデプロイ向けです。

ペアリング

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 TokenBot 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 は 1 つのアプリに対して複数の Socket Mode 接続を維持でき、各ペイロードを任意の接続に配信する場合があります。そのため、Slack アプリを共有する別々の OpenClaw gateway には同等のルーティングと認可設定が必要です。そうでない場合は、gateway ごとに別々の Slack アプリ、単一のリレーイングレス、またはロードバランサー背後の HTTP Request URLs を使用してください。Using Socket Mode を参照してください。

リレーモード

リレーモードは Slack イングレスを OpenClaw gateway から分離します。信頼済みルーターが単一の Slack Socket Mode 接続を所有し、宛先 gateway を選択して、認証済み websocket 経由で型付きイベントを転送します。gateway はアウトバウンドの Slack Web API 呼び出しに引き続き独自の bot token を使用します。
{
  channels: {
    slack: {
      mode: "relay",
      botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" },
      relay: {
        url: "wss://router.example.com/gateway/ws",
        authToken: { source: "env", provider: "default", id: "SLACK_RELAY_AUTH_TOKEN" },
        gatewayId: "team-gateway",
      },
    },
  },
}
リレー URL は localhost を対象とする場合を除き、wss:// を使用する必要があります。bearer token とルーターのルートテーブルは Slack 認可境界の一部として扱ってください。ルーティングされたイベントは認可済みアクティベーションとして通常の Slack メッセージハンドラーに入ります。websocket hello フレーム内のルーター提供の slack_identity は、デフォルトのアウトバウンドユーザー名とアイコンを設定できます。呼び出し元が明示的に指定した identity がある場合は、それが引き続き優先されます。リレー接続は Socket Mode と同じ制限付きバックオフタイミングで再接続し、切断時にはルーター提供の identity をクリアします。

インストール

openclaw plugins install @openclaw/slack
plugins install は Plugin を登録して有効化します。以下の Slack アプリとチャンネル設定を構成するまでは何もしません。一般的な Plugin インストールルールについては Plugins を参照してください。

クイックセットアップ

1

新しい Slack アプリを作成する

api.slack.com/apps を開く → Create New AppFrom a manifest → ワークスペースを選択 → 以下のいずれかのマニフェストを貼り付け → NextCreate
{
  "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
    },
    "assistant_view": {
      "assistant_description": "OpenClaw connects Slack assistant threads to OpenClaw agents.",
      "suggested_prompts": [
        { "title": "What can you do?", "message": "What can you help me with?" },
        {
          "title": "Summarize this channel",
          "message": "Summarize the recent activity in this channel."
        },
        { "title": "Draft a reply", "message": "Help me draft a reply." }
      ]
    },
    "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",
        "assistant_thread_context_changed",
        "assistant_thread_started",
        "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
    },
    "assistant_view": {
      "assistant_description": "OpenClaw connects Slack assistant threads to OpenClaw agents.",
      "suggested_prompts": [
        { "title": "What can you do?", "message": "What can you help me with?" },
        {
          "title": "Summarize this channel",
          "message": "Summarize the recent activity in this channel."
        },
        { "title": "Draft a reply", "message": "Help me draft a reply." }
      ]
    },
    "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",
        "assistant_thread_context_changed",
        "assistant_thread_started",
        "message.channels",
        "message.groups",
        "message.im"
      ]
    }
  }
}
Recommended は Slack Plugin の全機能セットに対応します: App Home、スラッシュコマンド、ファイル、リアクション、ピン、グループ DM、絵文字/ユーザーグループ読み取り。ワークスペースポリシーでスコープが制限される場合は Minimal を選択してください。これは DM、チャンネル/グループ履歴、メンション、スラッシュコマンドをカバーしますが、ファイル、リアクション、ピン、グループ DM (mpim:*)、emoji:readusergroups:read は除外します。スコープごとの理由と追加スラッシュコマンドなどの追加オプションについては、マニフェストとスコープのチェックリスト を参照してください。
Slack がアプリを作成した後:
  • 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 セットアップ:
export SLACK_APP_TOKEN=slack-app-token-example
export SLACK_BOT_TOKEN=slack-bot-token-example
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" },
    },
  },
}
JSON5
openclaw config patch --file ./slack.socket.patch.json5 --dry-run
openclaw config patch --file ./slack.socket.patch.json5
環境変数フォールバック(デフォルトアカウントのみ):
SLACK_APP_TOKEN=slack-app-token-example
SLACK_BOT_TOKEN=slack-bot-token-example
3

Start gateway

openclaw gateway

Socket 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 の待機時間です。アプリメッセージとイベントはアプリケーション状態のままであり、トランスポートの生存性シグナルではありません。 注:
  • socketMode は HTTP Request URL モードでは無視されます。
  • 基本の channels.slack.socketMode 設定は、上書きされない限りすべての Slack アカウントに適用されます。アカウントごとの上書きは channels.slack.accounts.<accountId>.socketMode を使用します。これはオブジェクト上書きであるため、そのアカウントに必要なすべてのソケット調整フィールドを含めてください。
  • OpenClaw のデフォルトがあるのは clientPingTimeout15000)のみです。serverPingTimeoutpingPongLoggingEnabled は、設定された場合にのみ Slack SDK に渡されます。
  • Socket Mode の再起動バックオフは約 2 秒から始まり、約 30 秒で上限に達します。回復可能な起動、起動待機、切断の失敗は、チャンネルが停止するまで再試行されます。無効な認証、取り消されたトークン、スコープ不足などの恒久的なアカウントおよび認証情報エラーは、永久に再試行せず、すぐに失敗します。

マニフェストとスコープのチェックリスト

基本の Slack アプリマニフェストは、Socket Mode と HTTP Request URL で同じです。異なるのは 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
    },
    "assistant_view": {
      "assistant_description": "OpenClaw connects Slack assistant threads to OpenClaw agents.",
      "suggested_prompts": [
        { "title": "What can you do?", "message": "What can you help me with?" },
        {
          "title": "Summarize this channel",
          "message": "Summarize the recent activity in this channel."
        },
        { "title": "Draft a reply", "message": "Help me draft a reply." }
      ]
    },
    "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",
        "assistant_thread_context_changed",
        "assistant_thread_started",
        "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": "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",
        "assistant_thread_context_changed",
        "assistant_thread_started",
        "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 向けに有効なままです。マニフェストでは、features.assistant_viewassistant:writeassistant_thread_startedassistant_thread_context_changed による Slack アシスタントスレッドも有効にします。アシスタントスレッドは専用の OpenClaw スレッドセッションにルーティングされ、Slack から提供されるスレッドコンテキストをエージェントで利用できる状態に保ちます。
単一の設定済みコマンドの代わりに、複数のネイティブスラッシュコマンドを細かく使い分けられます。
  • /status コマンドは予約されているため、/status の代わりに /agentstatus を使用します。
  • Slack アプリには一度に 25 個を超えるスラッシュコマンドを登録できません(Slack プラットフォームの制限)。
既存の features.slash_commands セクションを、利用可能なコマンドのサブセットに置き換えます。
{
  "slash_commands": [
    {
      "command": "/new",
      "description": "新しいセッションを開始",
      "usage_hint": "[model]"
    },
    {
      "command": "/reset",
      "description": "現在のセッションをリセット"
    },
    {
      "command": "/compact",
      "description": "セッションコンテキストを圧縮",
      "usage_hint": "[instructions]"
    },
    {
      "command": "/stop",
      "description": "現在の実行を停止"
    },
    {
      "command": "/session",
      "description": "スレッドバインディングの有効期限を管理",
      "usage_hint": "idle <duration|off> または max-age <duration|off>"
    },
    {
      "command": "/think",
      "description": "思考レベルを設定",
      "usage_hint": "<level>"
    },
    {
      "command": "/verbose",
      "description": "詳細出力を切り替え",
      "usage_hint": "on|off|full"
    },
    {
      "command": "/fast",
      "description": "高速モードを表示または設定",
      "usage_hint": "[status|on|off]"
    },
    {
      "command": "/reasoning",
      "description": "推論の可視性を切り替え",
      "usage_hint": "[on|off|stream]"
    },
    {
      "command": "/elevated",
      "description": "昇格モードを切り替え",
      "usage_hint": "[on|off|ask|full]"
    },
    {
      "command": "/exec",
      "description": "exec のデフォルトを表示または設定",
      "usage_hint": "host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>"
    },
    {
      "command": "/approve",
      "description": "保留中の承認リクエストを承認または拒否",
      "usage_hint": "<id> <decision>"
    },
    {
      "command": "/model",
      "description": "モデルを表示または設定",
      "usage_hint": "[name|#|status]"
    },
    {
      "command": "/models",
      "description": "プロバイダー/モデルを一覧表示",
      "usage_hint": "[provider] [page] [limit=<n>|size=<n>|all]"
    },
    {
      "command": "/help",
      "description": "短いヘルプ概要を表示"
    },
    {
      "command": "/commands",
      "description": "生成されたコマンドカタログを表示"
    },
    {
      "command": "/tools",
      "description": "現在のエージェントが今すぐ使用できるものを表示",
      "usage_hint": "[compact|verbose]"
    },
    {
      "command": "/agentstatus",
      "description": "利用可能な場合はプロバイダー使用状況/クォータを含むランタイム状態を表示"
    },
    {
      "command": "/tasks",
      "description": "現在のセッションのアクティブ/最近のバックグラウンドタスクを一覧表示"
    },
    {
      "command": "/context",
      "description": "コンテキストの組み立て方法を説明",
      "usage_hint": "[list|detail|json]"
    },
    {
      "command": "/whoami",
      "description": "送信者 ID を表示"
    },
    {
      "command": "/skill",
      "description": "名前で Skills を実行",
      "usage_hint": "<name> [input]"
    },
    {
      "command": "/btw",
      "description": "セッションコンテキストを変更せずに補足の質問をする",
      "usage_hint": "<question>"
    },
    {
      "command": "/side",
      "description": "セッションコンテキストを変更せずに補足の質問をする",
      "usage_hint": "<question>"
    },
    {
      "command": "/usage",
      "description": "使用量フッターを制御するか、コスト概要を表示",
      "usage_hint": "off|tokens|full|cost"
    }
  ]
}
送信メッセージでデフォルトの Slack アプリ ID の代わりに、アクティブなエージェント ID(カスタムユーザー名とアイコン)を使用したい場合は、chat:write.customize ボットスコープを追加します。絵文字アイコンを使用する場合、Slack は :emoji_name: 構文を想定します。
channels.slack.userToken を設定する場合、一般的な読み取りスコープは次のとおりです。
  • channels:history, groups:history, im:history, mpim:history
  • channels:read, groups:read, im:read, mpim:read
  • users:read
  • reactions:read
  • pins:read
  • emoji:read
  • search:read(Slack 検索の読み取りに依存する場合)

トークンモデル

  • Socket Mode には botToken + appToken が必要です。
  • HTTP モードには botToken + signingSecret が必要です。
  • リレーモードには botToken に加えて relay.urlrelay.authTokenrelay.gatewayId が必要です。アプリトークンや署名シークレットは使用しません。
  • botTokenappTokensigningSecretrelay.authTokenuserToken はプレーンテキスト文字列または SecretRef オブジェクトを受け入れます。
  • 設定トークンは env フォールバックを上書きします。
  • SLACK_BOT_TOKENSLACK_APP_TOKENSLACK_USER_TOKEN の env フォールバックは、それぞれデフォルトアカウントにのみ適用されます。
  • userToken はデフォルトで読み取り専用の動作(userTokenReadOnly: true)になります。
状態スナップショットの動作:
  • Slack アカウント検査は、認証情報ごとの *Source フィールドと *Status フィールド(botTokenappTokensigningSecretuserToken)を追跡します。
  • 状態は availableconfigured_unavailable、または missing です。
  • configured_unavailable は、アカウントが SecretRef または別の非インラインシークレットソースを通じて設定されているが、現在のコマンド/ランタイムパスで 実際の値を解決できなかったことを意味します。
  • HTTP モードでは signingSecretStatus が含まれます。Socket Mode では、 必須ペアは botTokenStatus + appTokenStatus です。
アクション/ディレクトリ読み取りでは、設定されている場合にユーザートークンを優先できます。書き込みでは、ボットトークンが引き続き優先されます。ユーザートークンによる書き込みは、userTokenReadOnly: false で、かつボットトークンが利用できない場合にのみ許可されます。

アクションとゲート

Slack アクションは channels.slack.actions.* で制御されます。 現在の Slack ツールで利用可能なアクショングループ:
グループデフォルト
messages有効
reactions有効
pins有効
memberInfo有効
emojiList有効
現在の Slack メッセージアクションには、sendupload-filedownload-filereadeditdeletepinunpinlist-pinsmember-infoemoji-list が含まれます。download-file は受信ファイルプレースホルダーに表示される Slack ファイル ID を受け取り、画像の場合は画像プレビューを、それ以外のファイルタイプの場合はローカルファイルメタデータを返します。

アクセス制御とルーティング

channels.slack.dmPolicy は DM アクセスを制御します。channels.slack.allowFrom は正規の DM 許可リストです。
  • pairing(デフォルト)
  • allowlist
  • openchannels.slack.allowFrom"*" を含める必要があります)
  • disabled
DM フラグ:
  • dm.enabled(デフォルト true)
  • channels.slack.allowFrom
  • dm.allowFrom(レガシー)
  • dm.groupEnabled(グループ DM のデフォルトは false)
  • dm.groupChannels(任意の MPIM 許可リスト)
マルチアカウントの優先順位:
  • channels.slack.accounts.default.allowFromdefault アカウントにのみ適用されます。
  • 名前付きアカウントは、自身の allowFrom が未設定の場合に channels.slack.allowFrom を継承します。
  • 名前付きアカウントは channels.slack.accounts.default.allowFrom を継承しません。
レガシーの channels.slack.dm.policychannels.slack.dm.allowFrom は互換性のために引き続き読み取られます。openclaw doctor --fix は、アクセスを変更せずに実行できる場合、それらを dmPolicyallowFrom に移行します。DM でのペアリングには openclaw pairing approve slack <code> を使用します。

スレッド、セッション、返信タグ

  • DM は direct として、チャンネルは channel として、MPIM は group としてルーティングされます。
  • Slack ルートバインディングは、生のピア ID に加えて、channel:C12345678user:U12345678<@U12345678> などの Slack ターゲット形式を受け入れます。
  • デフォルトの session.dmScope=main では、Slack DM はエージェントのメインセッションに集約されます。
  • チャンネルセッション: agent:<agentId>:slack:channel:<channelId>
  • 通常のトップレベルのチャンネルメッセージは、replyToModeoff 以外の場合でも、チャンネルごとのセッションに残ります。
  • Slack スレッド返信では、replyToMode="off" でアウトバウンド返信スレッド化が無効な場合でも、親 Slack thread_ts がセッションサフィックス (:thread:<threadTs>) に使われます。
  • OpenClaw は、対象のトップレベルチャンネルルートが表示される Slack スレッドを開始すると予想される場合、そのルートを agent:<agentId>:slack:channel:<channelId>:thread:<rootTs> にシードします。これにより、ルートと後続のスレッド返信が 1 つの OpenClaw セッションを共有します。これは、app_mention イベント、明示的なボットメンションまたは設定済みメンションパターン一致、および replyToModeoff 以外の requireMention: false チャンネルに適用されます。
  • channels.slack.thread.historyScope のデフォルトは threadthread.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.postMessagereply_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>.ackReaction
  • channels.slack.ackReaction
  • messages.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 の再起動が必要です。
{
  messages: {
    ackReaction: "eyes",
    ackReactionScope: "all", // react in DMs and groups
  },
}

テキストストリーミング

channels.slack.streaming はライブプレビュー動作を制御します:
  • off: ライブプレビューストリーミングを無効にします。
  • partial (デフォルト): プレビューテキストを最新の部分出力で置き換えます。
  • block: チャンク化されたプレビュー更新を追加します。
  • progress: 生成中は進捗ステータステキストを表示し、その後最終テキストを送信します。
  • streaming.preview.toolProgress: ドラフトプレビューが有効な場合、ツール/進捗更新を同じ編集済みプレビューメッセージにルーティングします (デフォルト: true)。個別のツール/進捗メッセージを維持するには false を設定します。
  • streaming.preview.commandText / streaming.progress.commandText: 生のコマンド/実行テキストを隠しつつコンパクトなツール進捗行を維持するには、status に設定します (デフォルト: raw)。
コンパクトな進捗行を維持しつつ、生のコマンド/実行テキストを隠す:
{
  "channels": {
    "slack": {
      "streaming": {
        "mode": "progress",
        "progress": {
          "toolProgress": true,
          "commandText": "status"
        }
      }
    }
  }
}
channels.slack.streaming.nativeTransport は、channels.slack.streaming.modepartial の場合に Slack ネイティブテキストストリーミングを制御します (デフォルト: true)。 Slack ネイティブ進捗タスクカードは、進捗モードでオプトインです。作業中に Slack ネイティブの計画/タスクカードを送信し、完了時に同じタスクカードを更新するには、channels.slack.streaming.mode="progress" とともに channels.slack.streaming.progress.nativeTaskCardstrue に設定します。このフラグがない場合、進捗モードはポータブルなドラフトプレビュー動作を維持します。
  • ネイティブテキストストリーミングと Slack アシスタントスレッドステータスを表示するには、返信スレッドが利用可能である必要があります。スレッド選択は引き続き replyToMode に従います。
  • チャンネル、グループチャット、トップレベル DM ルートは、ネイティブストリーミングが利用できない場合や返信スレッドが存在しない場合でも、通常のドラフトプレビューを使用できます。
  • トップレベル Slack DM はデフォルトでスレッド外のままなので、Slack のスレッド形式のネイティブストリーム/ステータスプレビューは表示されません。代わりに OpenClaw は DM にドラフトプレビューを投稿して編集します。
  • メディアと非テキストペイロードは通常配信にフォールバックします。
  • メディア/エラーの最終結果は保留中のプレビュー編集をキャンセルします。対象となるテキスト/ブロックの最終結果は、プレビューをその場で編集できる場合にのみフラッシュされます。
  • ストリーミングが返信の途中で失敗した場合、OpenClaw は残りのペイロードを通常配信にフォールバックします。
Slack ネイティブテキストストリーミングの代わりにドラフトプレビューを使用する:
{
  channels: {
    slack: {
      streaming: {
        mode: "partial",
        nativeTransport: false,
      },
    },
  },
}
Slack ネイティブ進捗タスクカードにオプトインする:
{
  channels: {
    slack: {
      streaming: {
        mode: "progress",
        progress: {
          nativeTaskCards: true,
          render: "rich",
        },
      },
    },
  },
}
従来キー:
  • channels.slack.streamMode (replace | status_final | append) は、channels.slack.streaming.mode の従来ランタイムエイリアスです。
  • boolean channels.slack.streaming は、channels.slack.streaming.modechannels.slack.streaming.nativeTransport の従来ランタイムエイリアスです。
  • トップレベルの channels.slack.chunkModechannels.slack.nativeStreaming は、channels.slack.streaming.chunkModechannels.slack.streaming.nativeTransport の従来ランタイムエイリアスです。
  • 永続化された Slack ストリーミング設定を正規キーに書き換えるには、openclaw doctor --fix を実行します。

入力中リアクションフォールバック

typingReaction は、OpenClaw が返信を処理している間、インバウンド Slack メッセージに一時的なリアクションを追加し、実行完了時に削除します。これは、デフォルトの “is typing…” ステータスインジケーターを使うスレッド返信の外で最も便利です。 解決順序:
  • channels.slack.accounts.<accountId>.typingReaction
  • channels.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 DM はユーザー ID に直接投稿できます。ファイルアップロードとスレッド送信では具体的な会話 ID が必要なため、先に Slack conversation API で DM を開きます。

コマンドとスラッシュの動作

スラッシュコマンドは、単一の設定済みコマンドまたは複数のネイティブコマンドとして Slack に表示されます。コマンドの既定値を変更するには channels.slack.slashCommand を設定します。
  • enabled: false
  • name: "openclaw"
  • sessionPrefix: "slack:slash"
  • ephemeral: true
/openclaw /help
ネイティブコマンドには、Slack アプリ内の追加のマニフェスト設定が必要です。代わりに、グローバル設定で channels.slack.commands.native: true または commands.native: true を指定すると有効になります。
  • Slack ではネイティブコマンドの自動モードはオフであるため、commands.native: "auto" は Slack ネイティブコマンドを有効にしません。
/help
ネイティブ引数メニューは、優先順に次のいずれかとしてレンダリングされます。
  • 3〜5 個の十分に短いオプション: オーバーフロー(”…”)メニュー
  • 100 個を超えるオプションで、非同期オプションフィルタリングが利用可能: 外部選択
  • 1〜2 個のオプション、またはエンコードされた値が選択には長すぎるオプション: ボタンブロック
  • それ以外(6〜100 個のオプション、または非同期フィルタリングなしで 100 個を超える場合): 静的選択メニュー。メニューごとに 100 オプションで分割
/think
スラッシュセッションは agent:<agentId>:slack:slash:<userId> のような分離キーを使用し、コマンド実行は引き続き CommandTargetSessionKey を使ってターゲット会話セッションへルーティングされます。

インタラクティブ返信

Slack は、エージェント作成のインタラクティブ返信コントロールをレンダリングできますが、この機能は既定では無効です。 新しいエージェント、CLI、Plugin の出力では、共有の presentation ボタンまたは選択ブロックを優先してください。これらは同じ 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 固有のエスケープハッチには残し、新しい ポータブルコントロールには共有 presentation を使用してください。 ディレクティブコンパイラ API も、新しい生成側コードでは非推奨です。
  • compileSlackInteractiveReplies(...)
  • parseSlackOptionsLine(...)
  • isSlackInteractiveRepliesEnabled(...)
  • buildSlackInteractiveBlocks(...)
新しい Slack レンダリングのコントロールには、presentation ペイロードと buildSlackPresentationBlocks(...) を使用してください。 メモ:
  • これは Slack 固有のレガシー UI です。他のチャンネルは Slack Block Kit ディレクティブを独自のボタンシステムへ変換しません。
  • インタラクティブコールバック値は OpenClaw が生成した不透明トークンであり、エージェントが作成した生の値ではありません。
  • 生成されたインタラクティブブロックが Slack Block Kit の制限を超える場合、OpenClaw は無効なブロックペイロードを送信する代わりに元のテキスト返信へフォールバックします。

Plugin 所有のモーダル送信

インタラクティブハンドラーを登録する Slack Plugin は、OpenClaw が エージェントに見えるシステムイベント向けにペイロードを圧縮する前に、モーダルの view_submissionview_closed ライフサイクルイベントも受信できます。Slack モーダルを開くときは、次のルーティング パターンのいずれかを使用します。
  • callback_idopenclaw:<namespace>:<payload> に設定します。
  • または、既存の callback_id を維持し、モーダルの private_metadatapluginInteractiveData: "<namespace>:<payload>" を入れます。
ハンドラーは ctx.interaction.kindview_submission または view_closed として受け取り、正規化された inputs と Slack からの完全な生の stateValues オブジェクトを受け取ります。 コールバック ID のみのルーティングで Plugin ハンドラーの呼び出しには十分です。 モーダルでエージェントに見えるシステムイベントも生成する必要がある場合は、既存のモーダル private_metadata のユーザー/セッションルーティングフィールドを含めます。エージェントは、 コンパクトで編集済みの Slack interaction: ... システムイベントを受け取ります。ハンドラーが systemEvent.summarysystemEvent.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 リクエストを承認できません。
これは他のチャンネルと同じ共有承認ボタン表面を使用します。Slack アプリ設定で interactivity が有効な場合、承認プロンプトは会話内で直接 Block Kit ボタンとしてレンダリングされます。 これらのボタンが存在する場合、それらが主要な承認 UX です。OpenClaw は、ツール結果がチャット承認を利用できない、または手動承認が唯一の経路であると示す場合にのみ、手動の /approve コマンドを含めるべきです。 設定パス:
  • channels.slack.execApprovals.enabled
  • channels.slack.execApprovals.approvers(任意。可能な場合は commands.ownerAllowFrom にフォールバック)
  • channels.slack.execApprovals.targetdm | channel | both、既定値: dm
  • agentFilter, sessionFilter
Slack は、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 承認設定がない場合の既定の動作:
{
  commands: {
    ownerAllowFrom: ["slack:U12345678"],
  },
}
明示的な Slack ネイティブ設定が必要なのは、承認者を上書きする、フィルターを追加する、または 発生元チャット配信を有効にする場合のみです。
{
  channels: {
    slack: {
      execApprovals: {
        enabled: true,
        approvers: ["U12345678"],
        target: "both",
      },
    },
  },
}
共有 approvals.exec 転送は別物です。exec 承認プロンプトを他のチャットや明示的な帯域外ターゲットにも ルーティングする必要がある場合にのみ使用してください。共有 approvals.plugin 転送も 別物です。Slack ネイティブ配信は、Slack が Plugin 承認リクエストをネイティブに処理できる場合にのみ、そのフォールバックを抑制します。 同一チャットの /approve も、すでにコマンドをサポートしている Slack チャンネルと DM で機能します。完全な承認転送モデルについては Exec 承認 を参照してください。

イベントと運用時の動作

  • メッセージ編集/削除はシステムイベントにマッピングされます。
  • スレッドブロードキャスト(「Also send to channel」スレッド返信)は通常のユーザーメッセージとして処理されます。
  • リアクション追加/削除イベントはシステムイベントにマッピングされます。
  • メンバー参加/退出、チャンネル作成/名前変更、ピン追加/削除イベントはシステムイベントにマッピングされます。
  • channel_id_changed は、configWrites が有効な場合にチャンネル設定キーを移行できます。
  • チャンネルトピック/目的メタデータは信頼できないコンテキストとして扱われ、ルーティングコンテキストに注入される場合があります。
  • スレッド開始者と初期スレッド履歴コンテキストのシードは、該当する場合、設定済み送信者許可リストでフィルタリングされます。
  • ブロックアクション、ショートカット、モーダルインタラクションは、豊富なペイロードフィールドを持つ構造化された Slack interaction: ... システムイベントを発行します。
    • ブロックアクション: 選択値、ラベル、ピッカー値、workflow_* メタデータ
    • グローバルショートカット: コールバックとアクターのメタデータ。アクターの直接セッションへルーティング
    • メッセージショートカット: コールバック、アクター、チャンネル、スレッド、選択されたメッセージのコンテキスト
    • ルーティングされたチャンネルメタデータとフォーム入力を含むモーダル view_submissionview_closed イベント
Slack アプリ設定でグローバルまたはメッセージショートカットを定義し、空でない任意のコールバック ID を使用してください。OpenClaw は一致するショートカットペイロードを確認応答し、他の Slack インタラクションと同じ DM/チャンネル送信者ポリシーを適用し、サニタイズ済みイベントをルーティング先のエージェントセッションにキューします。トリガー ID とレスポンス URL はエージェントコンテキストから編集されます。

設定リファレンス

主要リファレンス: 設定リファレンス - 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)ではなく、チャンネル IDC12345678)である必要があります。チャンネルルーティングはデフォルトで ID 優先のため、groupPolicy: "allowlist" では名前ベースのキーは静かに失敗します。ID を見つけるには、Slack でチャンネルを右クリック → リンクをコピー — URL 末尾の C... 値がチャンネル ID です。
  • requireMention
  • チャンネルごとの users allowlist
  • messages.groupChat.visibleReplies: 通常のグループ/チャンネルリクエストはデフォルトで "automatic" です。"message_tool" を選択していて、ログに message(action=send) 呼び出しなしでアシスタントのテキストが表示される場合、モデルが表示可能な message-tool パスを見逃しています。このモードでは最終テキストは非公開のままです。抑制されたペイロードメタデータは Gateway の詳細ログで確認するか、通常のアシスタント最終返信をすべてレガシーパス経由で投稿したい場合は "automatic" に設定してください。
  • messages.groupChat.unmentionedInbound: "room_event" の場合、メンションされていない許可済みチャンネルの会話は環境コンテキストになり、エージェントが message ツールを呼び出さない限り沈黙したままです。環境ルームイベントを参照してください。
{
  messages: {
    groupChat: {
      visibleReplies: "automatic",
    },
  },
}
便利なコマンド:
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
確認項目:
  • channels.slack.dm.enabled
  • channels.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 スレッドイベントを送信したことを意味します
openclaw pairing list slack
Slack アプリ設定で bot + app トークンと Socket Mode の有効化を検証してください。 App-Level Token には connections:write が必要で、Bot User OAuth Token の bot トークンは app トークンと同じ Slack アプリ/ワークスペースに属している必要があります。openclaw channels status --probe --jsonbotTokenStatus または appTokenStatus: "configured_unavailable" が表示される場合、Slack アカウントは 設定されていますが、現在のランタイムが SecretRef に基づく値を解決できていません。slack socket mode failed to start; retry ... のようなログは復旧可能な 起動失敗です。スコープ不足、取り消されたトークン、無効な認証は代わりに 即座に失敗します。slack token mismatch ... ログは、bot トークンと app トークンが 異なる Slack アプリに属しているように見えることを意味します。Slack アプリの認証情報を修正してください。
検証項目:
  • 署名シークレット
  • 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 を使用しています。各アカウントに別々のパスを指定してください。
意図しているものを確認してください:
  • Slack に登録された一致するスラッシュコマンドを使用するネイティブコマンドモード(channels.slack.commands.native: true
  • または単一スラッシュコマンドモード(channels.slack.slashCommand.enabled: true
Slack はスラッシュコマンドを自動的に作成または削除しません。commands.native: "auto" は Slack ネイティブコマンドを有効にしません。true を使用し、Slack アプリで一致するコマンドを作成してください。HTTP mode では、すべての Slack スラッシュコマンドに Gateway URL を含める必要があります。Socket Mode では、コマンドペイロードは websocket 経由で到着し、Slack は slash_commands[].url を無視します。commands.useAccessGroups、DM 認可、チャンネル allowlist、 チャンネルごとの users allowlist も確認してください。Slack は ブロックされたスラッシュコマンド送信者に対して、次のような一時的なエラーを返します:
  • This channel is not allowed.
  • You are not authorized to use this command here.

添付ファイルの vision リファレンス

Slack のファイルダウンロードが成功し、サイズ制限が許す場合、Slack はダウンロードしたメディアをエージェントターンに添付できます。画像ファイルはメディア理解パスを通すか、vision 対応の返信モデルに直接渡すことができます。その他のファイルは画像入力として扱われるのではなく、ダウンロード可能なファイルコンテキストとして保持されます。

対応メディアタイプ

メディアタイプソース現在の動作備考
JPEG / PNG / GIF / WebP 画像Slack ファイル URLvision 対応処理のためにダウンロードされ、ターンに添付されますファイルごとの上限: channels.slack.mediaMaxMb(デフォルト 20 MB)
PDF ファイルSlack ファイル URLダウンロードされ、download-filepdf などのツール向けファイルコンテキストとして公開されますSlack inbound は PDF を画像 vision 入力へ自動変換しません
その他のファイルSlack ファイル URL可能な場合はダウンロードされ、ファイルコンテキストとして公開されますバイナリファイルは画像入力として扱われません
スレッド返信スレッド開始メッセージのファイル返信に直接メディアがない場合、ルートメッセージのファイルをコンテキストとしてハイドレートできますファイルのみの開始メッセージでは添付ファイルプレースホルダーを使用します
複数画像メッセージ複数の Slack ファイル各ファイルが個別に評価されますSlack の処理はメッセージあたり 8 ファイルまでに制限されます

Inbound パイプライン

ファイル添付付きの Slack メッセージが届いた場合:
  1. OpenClaw は bot トークンを使用して Slack のプライベート URL からファイルをダウンロードします。
  2. 成功すると、ファイルはメディアストアに書き込まれます。
  3. ダウンロードされたメディアパスとコンテンツタイプが inbound コンテキストに追加されます。
  4. 画像対応のモデル/ツールパスは、そのコンテキストの画像添付を使用できます。
  5. 画像以外のファイルは、それらを処理できるツール向けにファイルメタデータまたはメディア参照として利用可能なままです。

スレッドルート添付ファイルの継承

メッセージがスレッド内に届いた場合(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 メッセージをエージェントにルーティングします。

セキュリティ

脅威モデルと強化。

設定

設定レイアウトと優先順位。

スラッシュコマンド

コマンドカタログと動作。