Langsung ke konten utama

Documentation Index

Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt

Use this file to discover all available pages before exploring further.

Siap produksi untuk DM dan kanal melalui integrasi aplikasi Slack. Mode default adalah Socket Mode; HTTP Request URLs juga didukung.

Pemasangan

DM Slack secara default menggunakan mode pemasangan.

Perintah slash

Perilaku perintah native dan katalog perintah.

Pemecahan masalah kanal

Diagnostik lintas kanal dan playbook perbaikan.

Memilih Socket Mode atau HTTP Request URLs

Kedua transport siap produksi dan mencapai paritas fitur untuk perpesanan, perintah slash, App Home, dan interaktivitas. Pilih berdasarkan bentuk deployment, bukan fitur.
PertimbanganSocket Mode (default)HTTP Request URLs
URL Gateway publikTidak diperlukanDiperlukan (DNS, TLS, reverse proxy atau tunnel)
Jaringan keluarWSS keluar ke wss-primary.slack.com harus dapat dijangkauTidak ada WS keluar; hanya HTTPS masuk
Token yang diperlukanToken bot (xoxb-...) + App-Level Token (xapp-...) dengan connections:writeToken bot (xoxb-...) + Signing Secret
Laptop dev / di balik firewallBerfungsi apa adanyaMemerlukan tunnel publik (ngrok, Cloudflare Tunnel, Tailscale Funnel) atau Gateway staging
Penskalaan horizontalSatu sesi Socket Mode per aplikasi per host; beberapa Gateway memerlukan aplikasi Slack terpisahHandler POST stateless; beberapa replika Gateway dapat berbagi satu aplikasi di balik load balancer
Multi-akun pada satu GatewayDidukung; setiap akun membuka WS-nya sendiriDidukung; setiap akun memerlukan webhookPath unik (default /slack/events) agar registrasi tidak bertabrakan
Transport perintah slashDikirim melalui koneksi WS; slash_commands[].url diabaikanSlack mengirim POST ke slash_commands[].url; field ini diperlukan agar perintah dikirim
Penandatanganan requestTidak digunakan (auth adalah App-Level Token)Slack menandatangani setiap request; OpenClaw memverifikasi dengan signingSecret
Pemulihan saat koneksi terputusSlack SDK otomatis menyambung ulang; tuning transport pong-timeout gateway berlakuTidak ada koneksi persisten yang dapat terputus; retry dilakukan per request dari Slack
Pilih Socket Mode untuk host Gateway tunggal, laptop dev, dan jaringan on-prem yang dapat menjangkau *.slack.com keluar tetapi tidak dapat menerima HTTPS masuk.Pilih HTTP Request URLs saat menjalankan beberapa replika Gateway di balik load balancer, ketika WSS keluar diblokir tetapi HTTPS masuk diizinkan, atau ketika Anda sudah menghentikan webhook Slack di reverse proxy.

Penyiapan cepat

1

Buat aplikasi Slack baru

Buka api.slack.com/appsCreate New AppFrom a manifest → pilih workspace Anda → tempel salah satu manifest di bawah → 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
    },
    "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"
      ]
    }
  }
}
Recommended cocok dengan rangkaian fitur lengkap Plugin Slack bawaan: App Home, perintah slash, file, reaction, pin, DM grup, dan pembacaan emoji/usergroup. Pilih Minimal ketika kebijakan workspace membatasi scope — ini mencakup DM, riwayat kanal/grup, mention, dan perintah slash tetapi menghapus file, reaction, pin, DM grup (mpim:*), emoji:read, dan usergroups:read. Lihat Checklist manifest dan scope untuk alasan per scope dan opsi aditif seperti perintah slash tambahan.
Setelah Slack membuat aplikasi:
  • Basic Information → App-Level Tokens → Generate Token and Scopes: tambahkan connections:write, simpan, salin nilai xapp-....
  • Install App → Install to Workspace: salin xoxb-... Bot User OAuth Token.
2

Konfigurasi OpenClaw

Penyiapan SecretRef yang direkomendasikan:
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" },
    },
  },
}
JSON5
openclaw config patch --file ./slack.socket.patch.json5 --dry-run
openclaw config patch --file ./slack.socket.patch.json5
Fallback env (hanya akun default):
SLACK_APP_TOKEN=xapp-...
SLACK_BOT_TOKEN=xoxb-...
3

Mulai gateway

openclaw gateway

Penyetelan transport Mode Socket

OpenClaw mengatur batas waktu pong klien SDK Slack menjadi 15 detik secara default untuk Mode Socket. Timpa pengaturan transport hanya saat Anda membutuhkan penyetelan khusus workspace atau host:
{
  channels: {
    slack: {
      mode: "socket",
      socketMode: {
        clientPingTimeout: 20000,
        serverPingTimeout: 30000,
        pingPongLoggingEnabled: false,
      },
    },
  },
}
Gunakan ini hanya untuk workspace Mode Socket yang mencatat batas waktu pong websocket Slack/server-ping atau berjalan pada host dengan kelaparan event-loop yang diketahui. clientPingTimeout adalah waktu tunggu pong setelah SDK mengirim ping klien; serverPingTimeout adalah waktu tunggu untuk ping server Slack. Pesan dan peristiwa aplikasi tetap merupakan status aplikasi, bukan sinyal keaktifan transport.

Daftar periksa manifes dan cakupan

Manifes aplikasi Slack dasar sama untuk Mode Socket dan URL Permintaan HTTP. Hanya blok settings (dan url perintah slash) yang berbeda. Manifes dasar (default Mode Socket):
{
  "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"
      ]
    }
  }
}
Untuk mode URL Permintaan HTTP, ganti settings dengan varian HTTP dan tambahkan url ke setiap perintah slash. URL publik wajib:
{
  "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"
    }
  }
}

Pengaturan manifes tambahan

Munculkan fitur berbeda yang memperluas default di atas. Manifes default mengaktifkan tab Home Slack App Home dan berlangganan app_home_opened. Saat anggota workspace membuka tab Home, OpenClaw menerbitkan tampilan Home default yang aman dengan views.publish; tidak ada payload percakapan atau konfigurasi privat yang disertakan. Tab Messages tetap diaktifkan untuk DM Slack.
Beberapa perintah slash native dapat digunakan alih-alih satu perintah yang dikonfigurasi dengan nuansa:
  • Gunakan /agentstatus alih-alih /status karena perintah /status dicadangkan.
  • Tidak lebih dari 25 perintah slash dapat disediakan sekaligus.
Ganti bagian features.slash_commands yang ada dengan subset perintah yang tersedia:
{
  "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"
    }
  ]
}
Tambahkan cakupan bot chat:write.customize jika Anda ingin pesan keluar menggunakan identitas agen aktif (nama pengguna dan ikon kustom) alih-alih identitas aplikasi Slack default.Jika Anda menggunakan ikon emoji, Slack mengharapkan sintaks :emoji_name:.
Jika Anda mengonfigurasi channels.slack.userToken, cakupan baca yang umum adalah:
  • 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 (jika Anda bergantung pada pembacaan pencarian Slack)

Model token

  • botToken + appToken diperlukan untuk Socket Mode.
  • Mode HTTP memerlukan botToken + signingSecret.
  • botToken, appToken, signingSecret, dan userToken menerima string plaintext atau objek SecretRef.
  • Token konfigurasi mengesampingkan fallback env.
  • Fallback env SLACK_BOT_TOKEN / SLACK_APP_TOKEN hanya berlaku untuk akun default.
  • userToken (xoxp-...) hanya konfigurasi (tanpa fallback env) dan default-nya adalah perilaku baca saja (userTokenReadOnly: true).
Perilaku snapshot status:
  • Inspeksi akun Slack melacak kolom *Source dan *Status per kredensial (botToken, appToken, signingSecret, userToken).
  • Status adalah available, configured_unavailable, atau missing.
  • configured_unavailable berarti akun dikonfigurasi melalui SecretRef atau sumber rahasia non-inline lain, tetapi jalur perintah/runtime saat ini tidak dapat menyelesaikan nilai sebenarnya.
  • Dalam mode HTTP, signingSecretStatus disertakan; dalam Socket Mode, pasangan yang diperlukan adalah botTokenStatus + appTokenStatus.
Untuk aksi/pembacaan direktori, token pengguna dapat diprioritaskan saat dikonfigurasi. Untuk penulisan, token bot tetap diprioritaskan; penulisan token pengguna hanya diizinkan ketika userTokenReadOnly: false dan token bot tidak tersedia.

Aksi dan gerbang

Aksi Slack dikontrol oleh channels.slack.actions.*. Grup aksi yang tersedia di tooling Slack saat ini:
GrupDefault
messagesaktif
reactionsaktif
pinsaktif
memberInfoaktif
emojiListaktif
Aksi pesan Slack saat ini mencakup send, upload-file, download-file, read, edit, delete, pin, unpin, list-pins, member-info, dan emoji-list. download-file menerima ID file Slack yang ditampilkan di placeholder file masuk dan mengembalikan pratinjau gambar untuk gambar atau metadata file lokal untuk jenis file lain.

Kontrol akses dan routing

channels.slack.dmPolicy mengontrol akses DM. channels.slack.allowFrom adalah allowlist DM kanonis.
  • pairing (default)
  • allowlist
  • open (memerlukan channels.slack.allowFrom untuk menyertakan "*")
  • disabled
Flag DM:
  • dm.enabled (default true)
  • channels.slack.allowFrom
  • dm.allowFrom (legacy)
  • dm.groupEnabled (DM grup default false)
  • dm.groupChannels (allowlist MPIM opsional)
Presedensi multi-akun:
  • channels.slack.accounts.default.allowFrom hanya berlaku untuk akun default.
  • Akun bernama mewarisi channels.slack.allowFrom ketika allowFrom miliknya sendiri tidak disetel.
  • Akun bernama tidak mewarisi channels.slack.accounts.default.allowFrom.
Legacy channels.slack.dm.policy dan channels.slack.dm.allowFrom masih dibaca untuk kompatibilitas. openclaw doctor --fix memigrasikannya ke dmPolicy dan allowFrom ketika dapat melakukannya tanpa mengubah akses.Pairing di DM menggunakan openclaw pairing approve slack <code>.

Thread, sesi, dan tag balasan

  • DM dirutekan sebagai direct; channel sebagai channel; MPIM sebagai group.
  • Binding rute Slack menerima ID peer mentah plus bentuk target Slack seperti channel:C12345678, user:U12345678, dan <@U12345678>.
  • Dengan default session.dmScope=main, DM Slack diciutkan ke sesi utama agen.
  • Sesi channel: agent:<agentId>:slack:channel:<channelId>.
  • Balasan thread dapat membuat suffix sesi thread (:thread:<threadTs>) jika berlaku.
  • Di channel tempat OpenClaw menangani pesan tingkat atas tanpa memerlukan mention eksplisit, replyToMode non-off merutekan setiap root yang ditangani ke agent:<agentId>:slack:channel:<channelId>:thread:<rootTs> sehingga thread Slack yang terlihat dipetakan ke satu sesi OpenClaw sejak giliran pertama.
  • Default channels.slack.thread.historyScope adalah thread; default thread.inheritParent adalah false.
  • channels.slack.thread.initialHistoryLimit mengontrol berapa banyak pesan thread yang sudah ada yang diambil ketika sesi thread baru dimulai (default 20; setel 0 untuk menonaktifkan).
  • channels.slack.thread.requireExplicitMention (default false): ketika true, menekan mention thread implisit sehingga bot hanya merespons mention @bot eksplisit di dalam thread, bahkan ketika bot sudah berpartisipasi dalam thread. Tanpa ini, balasan dalam thread yang diikuti bot melewati gating requireMention.
Kontrol threading balasan:
  • channels.slack.replyToMode: off|first|all|batched (default off)
  • channels.slack.replyToModeByChatType: per direct|group|channel
  • fallback legacy untuk chat langsung: channels.slack.dm.replyToMode
Tag balasan manual didukung:
  • [[reply_to_current]]
  • [[reply_to:<id>]]
Untuk balasan thread Slack eksplisit dari tool message, setel replyBroadcast: true dengan action: "send" dan threadId atau replyTo untuk meminta Slack juga menyiarkan balasan thread ke channel induk. Ini dipetakan ke flag reply_broadcast chat.postMessage milik Slack dan hanya didukung untuk pengiriman teks atau Block Kit, bukan upload media. Ketika panggilan tool message berjalan di dalam thread Slack dan menargetkan channel yang sama, OpenClaw biasanya mewarisi thread Slack saat ini sesuai dengan replyToMode. Setel topLevel: true pada action: "send" atau action: "upload-file" untuk memaksa pesan channel induk baru. threadId: null diterima sebagai opt-out tingkat atas yang sama.
replyToMode="off" menonaktifkan semua threading balasan di Slack, termasuk tag [[reply_to_*]] eksplisit. Ini berbeda dari Telegram, tempat tag eksplisit tetap dihormati dalam mode "off". Thread Slack menyembunyikan pesan dari channel sementara balasan Telegram tetap terlihat inline.

Reaksi ack

ackReaction mengirim emoji pengakuan saat OpenClaw memproses pesan masuk. Urutan resolusi:
  • channels.slack.accounts.<accountId>.ackReaction
  • channels.slack.ackReaction
  • messages.ackReaction
  • fallback emoji identitas agen (agents.list[].identity.emoji, jika tidak ada ”👀”)
Catatan:
  • Slack mengharapkan shortcode (misalnya "eyes").
  • Gunakan "" untuk menonaktifkan reaksi bagi akun Slack atau secara global.

Streaming teks

channels.slack.streaming mengontrol perilaku pratinjau live:
  • off: nonaktifkan streaming pratinjau live.
  • partial (default): ganti teks pratinjau dengan output parsial terbaru.
  • block: tambahkan pembaruan pratinjau yang dipecah menjadi chunk.
  • progress: tampilkan teks status progres saat menghasilkan, lalu kirim teks final.
  • streaming.preview.toolProgress: ketika pratinjau draf aktif, rutekan pembaruan tool/progres ke pesan pratinjau yang diedit yang sama (default: true). Setel false untuk mempertahankan pesan tool/progres terpisah.
  • streaming.preview.commandText / streaming.progress.commandText: setel ke status untuk mempertahankan baris progres tool yang ringkas sambil menyembunyikan teks perintah/exec mentah (default: raw).
Sembunyikan teks perintah/exec mentah sambil mempertahankan baris progres ringkas:
{
  "channels": {
    "slack": {
      "streaming": {
        "mode": "progress",
        "progress": {
          "toolProgress": true,
          "commandText": "status"
        }
      }
    }
  }
}
channels.slack.streaming.nativeTransport mengontrol streaming teks native Slack ketika channels.slack.streaming.mode adalah partial (default: true).
  • Thread balasan harus tersedia agar streaming teks native dan status thread asisten Slack muncul. Pemilihan thread tetap mengikuti replyToMode.
  • Root kanal, obrolan grup, dan DM tingkat atas tetap dapat menggunakan pratinjau draf normal saat streaming native tidak tersedia atau tidak ada thread balasan.
  • DM Slack tingkat atas tetap di luar thread secara default, sehingga tidak menampilkan pratinjau stream/status native bergaya thread Slack; OpenClaw memposting dan mengedit pratinjau draf di DM sebagai gantinya.
  • Media dan payload non-teks kembali ke pengiriman normal.
  • Final media/error membatalkan pengeditan pratinjau tertunda; final teks/blok yang memenuhi syarat hanya di-flush saat dapat mengedit pratinjau di tempat.
  • Jika streaming gagal di tengah balasan, OpenClaw kembali ke pengiriman normal untuk payload yang tersisa.
Gunakan pratinjau draf sebagai pengganti streaming teks native Slack:
{
  channels: {
    slack: {
      streaming: {
        mode: "partial",
        nativeTransport: false,
      },
    },
  },
}
Kunci legacy:
  • channels.slack.streamMode (replace | status_final | append) adalah alias runtime legacy untuk channels.slack.streaming.mode.
  • boolean channels.slack.streaming adalah alias runtime legacy untuk channels.slack.streaming.mode dan channels.slack.streaming.nativeTransport.
  • channels.slack.nativeStreaming legacy adalah alias runtime untuk channels.slack.streaming.nativeTransport.
  • Jalankan openclaw doctor --fix untuk menulis ulang konfigurasi streaming Slack yang tersimpan ke kunci kanonis.

Fallback reaksi mengetik

typingReaction menambahkan reaksi sementara ke pesan Slack masuk saat OpenClaw sedang memproses balasan, lalu menghapusnya saat run selesai. Ini paling berguna di luar balasan thread, yang menggunakan indikator status default “sedang mengetik…”. Urutan resolusi:
  • channels.slack.accounts.<accountId>.typingReaction
  • channels.slack.typingReaction
Catatan:
  • Slack mengharapkan shortcode (misalnya "hourglass_flowing_sand").
  • Reaksi bersifat best-effort dan pembersihan dicoba secara otomatis setelah jalur balasan atau kegagalan selesai.

Media, chunking, dan pengiriman

Lampiran file Slack diunduh dari URL privat yang di-host Slack (alur permintaan terautentikasi token) dan ditulis ke penyimpanan media saat pengambilan berhasil dan batas ukuran mengizinkan. Placeholder file menyertakan fileId Slack agar agen dapat mengambil file asli dengan download-file.Unduhan menggunakan timeout idle dan total yang dibatasi. Jika pengambilan file Slack macet atau gagal, OpenClaw tetap memproses pesan dan kembali ke placeholder file.Batas ukuran masuk runtime default adalah 20MB kecuali ditimpa oleh channels.slack.mediaMaxMb.
  • chunk teks menggunakan channels.slack.textChunkLimit (default 4000)
  • channels.slack.chunkMode="newline" mengaktifkan pemisahan dengan paragraf sebagai prioritas
  • pengiriman file menggunakan API unggah Slack dan dapat menyertakan balasan thread (thread_ts)
  • batas media keluar mengikuti channels.slack.mediaMaxMb saat dikonfigurasi; jika tidak, pengiriman kanal menggunakan default jenis MIME dari pipeline media
Target eksplisit yang direkomendasikan:
  • user:<id> untuk DM
  • channel:<id> untuk kanal
DM Slack yang hanya berisi teks/blok dapat memposting langsung ke ID pengguna; unggahan file dan pengiriman ber-thread membuka DM melalui API percakapan Slack terlebih dahulu karena jalur tersebut memerlukan ID percakapan konkret.

Perintah dan perilaku slash

Perintah slash muncul di Slack sebagai satu perintah yang dikonfigurasi atau beberapa perintah native. Konfigurasikan channels.slack.slashCommand untuk mengubah default perintah:
  • enabled: false
  • name: "openclaw"
  • sessionPrefix: "slack:slash"
  • ephemeral: true
/openclaw /help
Perintah native memerlukan pengaturan manifest tambahan di aplikasi Slack Anda dan diaktifkan dengan channels.slack.commands.native: true atau commands.native: true di konfigurasi global sebagai gantinya.
  • Mode otomatis perintah native mati untuk Slack sehingga commands.native: "auto" tidak mengaktifkan perintah native Slack.
/help
Menu argumen native menggunakan strategi rendering adaptif yang menampilkan modal konfirmasi sebelum mengirim nilai opsi yang dipilih:
  • hingga 5 opsi: blok tombol
  • 6-100 opsi: menu pilih statis
  • lebih dari 100 opsi: pilih eksternal dengan pemfilteran opsi async saat handler opsi interaktivitas tersedia
  • batas Slack terlampaui: nilai opsi yang dienkode kembali ke tombol
/think
Sesi slash menggunakan kunci terisolasi seperti agent:<agentId>:slack:slash:<userId> dan tetap merutekan eksekusi perintah ke sesi percakapan target menggunakan CommandTargetSessionKey.

Balasan interaktif

Slack dapat merender kontrol balasan interaktif yang ditulis agen, tetapi fitur ini dinonaktifkan secara default. Aktifkan secara global:
{
  channels: {
    slack: {
      capabilities: {
        interactiveReplies: true,
      },
    },
  },
}
Atau aktifkan hanya untuk satu akun Slack:
{
  channels: {
    slack: {
      accounts: {
        ops: {
          capabilities: {
            interactiveReplies: true,
          },
        },
      },
    },
  },
}
Saat diaktifkan, agen dapat memancarkan direktif balasan khusus Slack:
  • [[slack_buttons: Approve:approve, Reject:reject]]
  • [[slack_select: Choose a target | Canary:canary, Production:production]]
Direktif ini dikompilasi menjadi Slack Block Kit dan merutekan klik atau pilihan kembali melalui jalur event interaksi Slack yang sudah ada. Catatan:
  • Ini adalah UI khusus Slack. Kanal lain tidak menerjemahkan direktif Slack Block Kit ke sistem tombol mereka sendiri.
  • Nilai callback interaktif adalah token buram yang dibuat OpenClaw, bukan nilai mentah yang ditulis agen.
  • Jika blok interaktif yang dibuat akan melampaui batas Slack Block Kit, OpenClaw kembali ke balasan teks asli alih-alih mengirim payload blok yang tidak valid.

Persetujuan exec di Slack

Slack dapat bertindak sebagai klien persetujuan native dengan tombol dan interaksi interaktif, alih-alih kembali ke UI Web atau terminal.
  • Persetujuan exec menggunakan channels.slack.execApprovals.* untuk perutean DM/kanal native.
  • Persetujuan Plugin tetap dapat diselesaikan melalui permukaan tombol native Slack yang sama saat permintaan sudah masuk ke Slack dan jenis id persetujuan adalah plugin:.
  • Otorisasi pemberi persetujuan tetap diberlakukan: hanya pengguna yang diidentifikasi sebagai pemberi persetujuan yang dapat menyetujui atau menolak permintaan melalui Slack.
Ini menggunakan permukaan tombol persetujuan bersama yang sama seperti kanal lain. Saat interactivity diaktifkan di pengaturan aplikasi Slack Anda, prompt persetujuan dirender sebagai tombol Block Kit langsung di percakapan. Saat tombol tersebut tersedia, tombol itu adalah UX persetujuan utama; OpenClaw hanya boleh menyertakan perintah /approve manual saat hasil alat mengatakan persetujuan chat tidak tersedia atau persetujuan manual adalah satu-satunya jalur. Path konfigurasi:
  • channels.slack.execApprovals.enabled
  • channels.slack.execApprovals.approvers (opsional; kembali ke commands.ownerAllowFrom saat memungkinkan)
  • channels.slack.execApprovals.target (dm | channel | both, default: dm)
  • agentFilter, sessionFilter
Slack secara otomatis mengaktifkan persetujuan exec native saat enabled tidak disetel atau "auto" dan setidaknya satu pemberi persetujuan berhasil di-resolve. Setel enabled: false untuk menonaktifkan Slack sebagai klien persetujuan native secara eksplisit. Setel enabled: true untuk memaksa persetujuan native aktif saat pemberi persetujuan berhasil di-resolve. Perilaku default tanpa konfigurasi persetujuan exec Slack eksplisit:
{
  commands: {
    ownerAllowFrom: ["slack:U12345678"],
  },
}
Konfigurasi native Slack eksplisit hanya diperlukan saat Anda ingin menimpa pemberi persetujuan, menambahkan filter, atau ikut menggunakan pengiriman chat asal:
{
  channels: {
    slack: {
      execApprovals: {
        enabled: true,
        approvers: ["U12345678"],
        target: "both",
      },
    },
  },
}
Penerusan approvals.exec bersama terpisah. Gunakan hanya saat prompt persetujuan exec juga harus dirutekan ke chat lain atau target out-of-band eksplisit. Penerusan approvals.plugin bersama juga terpisah; tombol native Slack tetap dapat menyelesaikan persetujuan Plugin saat permintaan tersebut sudah masuk ke Slack. /approve dalam chat yang sama juga berfungsi di kanal Slack dan DM yang sudah mendukung perintah. Lihat Persetujuan exec untuk model penerusan persetujuan lengkap.

Event dan perilaku operasional

  • Pengeditan/penghapusan pesan dipetakan menjadi event sistem.
  • Siaran thread (balasan thread “Kirim juga ke kanal”) diproses sebagai pesan pengguna normal.
  • Event tambah/hapus reaksi dipetakan menjadi event sistem.
  • Event anggota bergabung/keluar, kanal dibuat/diganti nama, dan pin ditambah/dihapus dipetakan menjadi event sistem.
  • channel_id_changed dapat memigrasikan kunci konfigurasi kanal saat configWrites diaktifkan.
  • Metadata topik/tujuan kanal diperlakukan sebagai konteks tidak tepercaya dan dapat disuntikkan ke konteks perutean.
  • Starter thread dan seeding konteks riwayat thread awal difilter oleh allowlist pengirim yang dikonfigurasi saat berlaku.
  • Tindakan blok dan interaksi modal memancarkan event sistem Slack interaction: ... terstruktur dengan field payload kaya:
    • tindakan blok: nilai yang dipilih, label, nilai picker, dan metadata workflow_*
    • event modal view_submission dan view_closed dengan metadata kanal yang dirutekan dan input formulir

Referensi konfigurasi

Referensi utama: Referensi konfigurasi - Slack.
  • mode/autentikasi: mode, botToken, appToken, signingSecret, webhookPath, accounts.*
  • akses DM: dm.enabled, dmPolicy, allowFrom (legacy: dm.policy, dm.allowFrom), dm.groupEnabled, dm.groupChannels
  • toggle kompatibilitas: dangerouslyAllowNameMatching (break-glass; tetap nonaktif kecuali diperlukan)
  • akses kanal: groupPolicy, channels.*, channels.*.users, channels.*.requireMention
  • threading/riwayat: replyToMode, replyToModeByChatType, thread.*, historyLimit, dmHistoryLimit, dms.*.historyLimit
  • pengiriman: textChunkLimit, chunkMode, mediaMaxMb, streaming, streaming.nativeTransport, streaming.preview.toolProgress
  • unfurl: unfurlLinks, unfurlMedia untuk kontrol pratinjau tautan/media chat.postMessage
  • ops/fitur: configWrites, commands.native, slashCommand.*, actions.*, userToken, userTokenReadOnly

Pemecahan masalah

Periksa, secara berurutan:
  • groupPolicy
  • allowlist kanal (channels.slack.channels) — kunci harus berupa ID kanal (C12345678), bukan nama (#channel-name). Kunci berbasis nama gagal diam-diam di bawah groupPolicy: "allowlist" karena perutean kanal secara default mengutamakan ID. Untuk menemukan ID: klik kanan kanal di Slack → Salin tautan — nilai C... di akhir URL adalah ID kanal.
  • requireMention
  • allowlist users per kanal
Perintah berguna:
openclaw channels status --probe
openclaw logs --follow
openclaw doctor
Periksa:
  • channels.slack.dm.enabled
  • channels.slack.dmPolicy (atau legacy channels.slack.dm.policy)
  • persetujuan pairing / entri allowlist
  • Event DM Slack Assistant: log verbose yang menyebut drop message_changed biasanya berarti Slack mengirim event thread Assistant yang diedit tanpa pengirim manusia yang dapat dipulihkan dalam metadata pesan
openclaw pairing list slack
Validasi token bot + app dan pengaktifan Socket Mode di pengaturan aplikasi Slack.Jika openclaw channels status --probe --json menampilkan botTokenStatus atau appTokenStatus: "configured_unavailable", akun Slack sudah dikonfigurasi tetapi runtime saat ini tidak dapat me-resolve nilai yang didukung SecretRef.
Validasi:
  • rahasia penandatanganan
  • jalur webhook
  • URL Permintaan Slack (Peristiwa + Interaktivitas + Perintah Slash)
  • webhookPath unik per akun HTTP
Jika signingSecretStatus: "configured_unavailable" muncul di snapshot akun, akun HTTP sudah dikonfigurasi tetapi runtime saat ini tidak dapat menyelesaikan rahasia penandatanganan yang didukung SecretRef.
Verifikasi apakah yang Anda maksud adalah:
  • mode perintah native (channels.slack.commands.native: true) dengan perintah slash yang sesuai terdaftar di Slack
  • atau mode perintah slash tunggal (channels.slack.slashCommand.enabled: true)
Periksa juga commands.useAccessGroups serta daftar izin channel/pengguna.

Referensi visi lampiran

Slack dapat melampirkan media yang diunduh ke giliran agen saat unduhan file Slack berhasil dan batas ukuran mengizinkan. File gambar dapat diteruskan melalui jalur pemahaman media atau langsung ke model balasan yang mendukung visi; file lain dipertahankan sebagai konteks file yang dapat diunduh, bukan diperlakukan sebagai input gambar.

Jenis media yang didukung

Jenis mediaSumberPerilaku saat iniCatatan
Gambar JPEG / PNG / GIF / WebPURL file SlackDiunduh dan dilampirkan ke giliran untuk penanganan yang mendukung visiBatas per file: channels.slack.mediaMaxMb (default 20 MB)
File PDFURL file SlackDiunduh dan diekspos sebagai konteks file untuk alat seperti download-file atau pdfInbound Slack tidak mengonversi PDF menjadi input visi gambar secara otomatis
File lainURL file SlackDiunduh jika memungkinkan dan diekspos sebagai konteks fileFile biner tidak diperlakukan sebagai input gambar
Balasan threadFile pemulai threadFile pesan root dapat dihidrasi sebagai konteks saat balasan tidak memiliki media langsungPemulai yang hanya berisi file menggunakan placeholder lampiran
Pesan multi-gambarBeberapa file SlackSetiap file dievaluasi secara independenPemrosesan Slack dibatasi hingga delapan file per pesan

Pipeline inbound

Saat pesan Slack dengan lampiran file tiba:
  1. OpenClaw mengunduh file dari URL privat Slack menggunakan token bot (xoxb-...).
  2. File ditulis ke penyimpanan media jika berhasil.
  3. Jalur media yang diunduh dan jenis konten ditambahkan ke konteks inbound.
  4. Jalur model/alat yang mendukung gambar dapat menggunakan lampiran gambar dari konteks tersebut.
  5. File non-gambar tetap tersedia sebagai metadata file atau referensi media untuk alat yang dapat menanganinya.

Pewarisan lampiran root thread

Saat pesan tiba dalam thread (memiliki induk thread_ts):
  • Jika balasan itu sendiri tidak memiliki media langsung dan pesan root yang disertakan memiliki file, Slack dapat menghidrasi file root sebagai konteks pemulai thread.
  • Lampiran balasan langsung lebih diutamakan daripada lampiran pesan root.
  • Pesan root yang hanya memiliki file dan tanpa teks direpresentasikan dengan placeholder lampiran sehingga fallback tetap dapat menyertakan filenya.

Penanganan multi-lampiran

Saat satu pesan Slack berisi beberapa lampiran file:
  • Setiap lampiran diproses secara independen melalui pipeline media.
  • Referensi media yang diunduh digabungkan ke dalam konteks pesan.
  • Urutan pemrosesan mengikuti urutan file Slack dalam payload peristiwa.
  • Kegagalan unduhan satu lampiran tidak memblokir lampiran lain.

Batas ukuran, unduhan, dan model

  • Batas ukuran: Default 20 MB per file. Dapat dikonfigurasi melalui channels.slack.mediaMaxMb.
  • Kegagalan unduhan: File yang tidak dapat disajikan oleh Slack, URL kedaluwarsa, file yang tidak dapat diakses, file yang terlalu besar, dan respons HTML auth/login Slack dilewati alih-alih dilaporkan sebagai format yang tidak didukung.
  • Model visi: Analisis gambar menggunakan model balasan aktif saat model tersebut mendukung visi, atau model gambar yang dikonfigurasi di agents.defaults.imageModel.

Batasan yang diketahui

SkenarioPerilaku saat iniSolusi sementara
URL file Slack kedaluwarsaFile dilewati; tidak ada kesalahan yang ditampilkanUnggah ulang file di Slack
Model visi tidak dikonfigurasiLampiran gambar disimpan sebagai referensi media, tetapi tidak dianalisis sebagai gambarKonfigurasikan agents.defaults.imageModel atau gunakan model balasan yang mendukung visi
Gambar sangat besar (> 20 MB secara default)Dilewati sesuai batas ukuranTingkatkan channels.slack.mediaMaxMb jika Slack mengizinkan
Lampiran yang diteruskan/dibagikanTeks dan media gambar/file yang dihosting Slack bersifat upaya terbaikBagikan ulang langsung di thread OpenClaw
Lampiran PDFDisimpan sebagai konteks file/media, tidak otomatis dirutekan melalui visi gambarGunakan download-file untuk metadata file atau alat pdf untuk analisis PDF

Dokumentasi terkait

Terkait

Pemasangan

Pasangkan pengguna Slack ke gateway.

Grup

Perilaku channel dan DM grup.

Perutean channel

Rutekan pesan inbound ke agen.

Keamanan

Model ancaman dan hardening.

Konfigurasi

Tata letak dan presedensi konfigurasi.

Perintah slash

Katalog dan perilaku perintah.