Slack
Status: siap produksi untuk DM + channel melalui integrasi aplikasi Slack. Mode default adalah Socket Mode; mode HTTP Events API juga didukung.Pairing
DM Slack secara default menggunakan mode pairing.
Slash commands
Perilaku perintah native dan katalog perintah.
Channel troubleshooting
Diagnostik lintas channel dan playbook perbaikan.
Setup cepat
- Socket Mode (default)
- HTTP Events API mode
Create Slack app and tokens
Di pengaturan aplikasi Slack:
- aktifkan Socket Mode
- buat App Token (
xapp-...) denganconnections:write - instal aplikasi dan salin Bot Token (
xoxb-...)
Subscribe app events
Subscribe event bot untuk:
app_mentionmessage.channels,message.groups,message.im,message.mpimreaction_added,reaction_removedmember_joined_channel,member_left_channelchannel_renamepin_added,pin_removed
Checklist manifest dan scope
Slack app manifest example
Slack app manifest example
Optional user-token scopes (read operations)
Optional user-token scopes (read operations)
Jika Anda mengonfigurasi
channels.slack.userToken, scope baca yang umum adalah:channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read(jika Anda bergantung pada pembacaan pencarian Slack)
Model token
botToken+appTokenwajib untuk Socket Mode.- Mode HTTP memerlukan
botToken+signingSecret. botToken,appToken,signingSecret, danuserTokenmenerima string plaintext atau objek SecretRef.- Token config menimpa fallback env.
- Fallback env
SLACK_BOT_TOKEN/SLACK_APP_TOKENhanya berlaku untuk akun default. userToken(xoxp-...) hanya config-only (tanpa fallback env) dan default ke perilaku read-only (userTokenReadOnly: true).- Opsional: tambahkan
chat:write.customizejika Anda ingin pesan keluar menggunakan identitas agen aktif (usernamedan ikon kustom).icon_emojimenggunakan sintaks:emoji_name:.
- Inspeksi akun Slack melacak field
*Sourcedan*Statusper kredensial (botToken,appToken,signingSecret,userToken). - Status bernilai
available,configured_unavailable, ataumissing. configured_unavailableberarti akun dikonfigurasi melalui SecretRef atau sumber secret non-inline lain, tetapi jalur perintah/runtime saat ini tidak dapat menyelesaikan nilai sebenarnya.- Dalam mode HTTP,
signingSecretStatusdisertakan; dalam Socket Mode, pasangan yang wajib adalahbotTokenStatus+appTokenStatus.
Tindakan dan gate
Tindakan Slack dikendalikan olehchannels.slack.actions.*.
Grup tindakan yang tersedia dalam tooling Slack saat ini:
| Grup | Default |
|---|---|
| messages | enabled |
| reactions | enabled |
| pins | enabled |
| memberInfo | enabled |
| emojiList | enabled |
send, upload-file, download-file, read, edit, delete, pin, unpin, list-pins, member-info, dan emoji-list.
Kontrol akses dan routing
- DM policy
- Channel policy
- Mentions and channel users
channels.slack.dmPolicy mengendalikan akses DM (legacy: channels.slack.dm.policy):pairing(default)allowlistopen(memerlukanchannels.slack.allowFrommencakup"*"; legacy:channels.slack.dm.allowFrom)disabled
dm.enabled(default true)channels.slack.allowFrom(disarankan)dm.allowFrom(legacy)dm.groupEnabled(group DM default false)dm.groupChannels(allowlist MPIM opsional)
channels.slack.accounts.default.allowFromhanya berlaku untuk akundefault.- Akun bernama mewarisi
channels.slack.allowFromsaatallowFrommiliknya sendiri tidak disetel. - Akun bernama tidak mewarisi
channels.slack.accounts.default.allowFrom.
openclaw pairing approve slack <code>.Threading, sesi, dan tag balasan
- DM dirutekan sebagai
direct; channel sebagaichannel; MPIM sebagaigroup. - Dengan default
session.dmScope=main, DM Slack digabungkan ke sesi utama agen. - Sesi channel:
agent:<agentId>:slack:channel:<channelId>. - Balasan thread dapat membuat sufiks sesi thread (
:thread:<threadTs>) jika berlaku. - Default
channels.slack.thread.historyScopeadalahthread; defaultthread.inheritParentadalahfalse. channels.slack.thread.initialHistoryLimitmengendalikan berapa banyak pesan thread yang sudah ada diambil saat sesi thread baru dimulai (default20; set0untuk menonaktifkan).
channels.slack.replyToMode:off|first|all(defaultoff)channels.slack.replyToModeByChatType: perdirect|group|channel- fallback legacy untuk obrolan langsung:
channels.slack.dm.replyToMode
[[reply_to_current]][[reply_to:<id>]]
replyToMode="off" menonaktifkan semua reply threading di Slack, termasuk tag [[reply_to_*]] yang eksplisit. Ini berbeda dari Telegram, di mana tag eksplisit tetap dihormati dalam mode "off". Perbedaan ini mencerminkan model threading platform: thread Slack menyembunyikan pesan dari channel, sedangkan balasan Telegram tetap terlihat di alur chat utama.
Reaksi ack
ackReaction mengirim emoji tanda terima saat OpenClaw sedang memproses pesan masuk.
Urutan resolusi:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- fallback emoji identitas agen (
agents.list[].identity.emoji, jika tidak ada gunakan ”👀”)
- Slack mengharapkan shortcode (misalnya
"eyes"). - Gunakan
""untuk menonaktifkan reaksi untuk akun Slack atau secara global.
Streaming teks
channels.slack.streaming mengendalikan perilaku pratinjau live:
off: nonaktifkan streaming pratinjau live.partial(default): ganti teks pratinjau dengan output parsial terbaru.block: tambahkan pembaruan pratinjau bertahap.progress: tampilkan teks status progres saat menghasilkan, lalu kirim teks akhir.
channels.slack.nativeStreaming mengendalikan streaming teks native Slack saat streaming adalah partial (default: true).
- Thread balasan harus tersedia agar streaming teks native muncul. Pemilihan thread tetap mengikuti
replyToMode. Tanpanya, pratinjau draf normal akan digunakan. - Media dan payload non-teks akan fallback ke pengiriman normal.
- Jika streaming gagal di tengah balasan, OpenClaw akan fallback ke pengiriman normal untuk payload yang tersisa.
channels.slack.streamMode(replace | status_final | append) dimigrasikan otomatis kechannels.slack.streaming.- boolean
channels.slack.streamingdimigrasikan otomatis kechannels.slack.nativeStreaming.
Fallback reaksi mengetik
typingReaction menambahkan reaksi sementara ke pesan Slack masuk saat OpenClaw sedang memproses balasan, lalu menghapusnya saat eksekusi selesai. Ini paling berguna di luar balasan thread, yang menggunakan indikator status default “is typing…”.
Urutan resolusi:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
- Slack mengharapkan shortcode (misalnya
"hourglass_flowing_sand"). - Reaksi ini bersifat best-effort dan pembersihannya dicoba secara otomatis setelah jalur balasan atau kegagalan selesai.
Media, chunking, dan pengiriman
Inbound attachments
Inbound attachments
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.Batas ukuran masuk runtime default adalah
20MB kecuali ditimpa oleh channels.slack.mediaMaxMb.Outbound text and files
Outbound text and files
- potongan teks menggunakan
channels.slack.textChunkLimit(default 4000) channels.slack.chunkMode="newline"mengaktifkan pemisahan dengan prioritas paragraf- pengiriman file menggunakan API upload Slack dan dapat menyertakan balasan thread (
thread_ts) - batas media keluar mengikuti
channels.slack.mediaMaxMbsaat dikonfigurasi; jika tidak, pengiriman channel menggunakan default jenis MIME dari pipeline media
Delivery targets
Delivery targets
Target eksplisit yang disarankan:
user:<id>untuk DMchannel:<id>untuk channel
Perintah dan perilaku slash
- Auto-mode perintah native adalah off untuk Slack (
commands.native: "auto"tidak mengaktifkan perintah native Slack). - Aktifkan handler perintah Slack native dengan
channels.slack.commands.native: true(atau globalcommands.native: true). - Saat perintah native diaktifkan, daftarkan slash command yang sesuai di Slack (nama
/<command>), dengan satu pengecualian:- daftarkan
/agentstatusuntuk perintah status (Slack mencadangkan/status)
- daftarkan
- Jika perintah native tidak diaktifkan, Anda dapat menjalankan satu slash command yang dikonfigurasi melalui
channels.slack.slashCommand. - Menu argumen native kini menyesuaikan strategi rendering-nya:
- hingga 5 opsi: blok tombol
- 6-100 opsi: menu select statis
- lebih dari 100 opsi: external select dengan penyaringan opsi async saat handler opsi interaktivitas tersedia
- jika nilai opsi yang dikodekan melebihi batas Slack, alur akan fallback ke tombol
- Untuk payload opsi yang panjang, menu argumen Slash command menggunakan dialog konfirmasi sebelum mengirim nilai yang dipilih.
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
agent:<agentId>:slack:slash:<userId>
CommandTargetSessionKey).
Balasan interaktif
Slack dapat merender kontrol balasan interaktif yang ditulis agen, tetapi fitur ini dinonaktifkan secara default. Aktifkan secara global:[[slack_buttons: Approve:approve, Reject:reject]][[slack_select: Choose a target | Canary:canary, Production:production]]
- Ini adalah UI khusus Slack. Channel lain tidak menerjemahkan directive Slack Block Kit ke sistem tombol mereka sendiri.
- Nilai callback interaktif adalah token opak yang dibuat OpenClaw, bukan nilai mentah yang ditulis agen.
- Jika blok interaktif yang dihasilkan melebihi batas Slack Block Kit, OpenClaw akan fallback ke balasan teks asli alih-alih mengirim payload blocks yang tidak valid.
Persetujuan exec di Slack
Slack dapat bertindak sebagai klien persetujuan native dengan tombol interaktif dan interaksi, alih-alih fallback ke UI Web atau terminal.- Persetujuan exec menggunakan
channels.slack.execApprovals.*untuk routing DM/channel native. - Persetujuan plugin tetap dapat diselesaikan melalui surface tombol native Slack yang sama saat permintaan sudah sampai di Slack dan jenis approval id adalah
plugin:. - Otorisasi approver tetap diberlakukan: hanya pengguna yang diidentifikasi sebagai approver yang dapat menyetujui atau menolak permintaan melalui Slack.
interactivity diaktifkan di pengaturan aplikasi Slack Anda, prompt persetujuan dirender sebagai tombol Block Kit langsung di percakapan.
Saat tombol tersebut ada, itu menjadi UX persetujuan utama; OpenClaw
hanya boleh menyertakan perintah manual /approve saat hasil tool menyatakan persetujuan chat
tidak tersedia atau persetujuan manual adalah satu-satunya jalur.
Path config:
channels.slack.execApprovals.enabledchannels.slack.execApprovals.approvers(opsional; fallback kecommands.ownerAllowFromjika memungkinkan)channels.slack.execApprovals.target(dm|channel|both, default:dm)agentFilter,sessionFilter
enabled tidak disetel atau "auto" dan setidaknya satu
approver berhasil diselesaikan. Set enabled: false untuk menonaktifkan Slack sebagai klien persetujuan native secara eksplisit.
Set enabled: true untuk memaksa persetujuan native aktif saat approver berhasil diselesaikan.
Perilaku default tanpa config persetujuan exec Slack eksplisit:
approvals.exec bersifat terpisah. Gunakan hanya saat prompt persetujuan exec juga harus
dirutekan ke chat lain atau target out-of-band eksplisit. Forwarding bersama approvals.plugin juga
terpisah; tombol native Slack tetap dapat menyelesaikan persetujuan plugin saat permintaan tersebut sudah sampai
di Slack.
/approve pada chat yang sama juga berfungsi di channel dan DM Slack yang sudah mendukung perintah. Lihat Exec approvals untuk model forwarding persetujuan lengkap.
Event dan perilaku operasional
- Edit/hapus pesan/thread broadcast dipetakan ke peristiwa sistem.
- Event tambah/hapus reaksi dipetakan ke peristiwa sistem.
- Event anggota masuk/keluar, channel dibuat/diubah namanya, dan tambah/hapus pin dipetakan ke peristiwa sistem.
channel_id_changeddapat memigrasikan key config channel saatconfigWritesdiaktifkan.- Metadata topik/tujuan channel diperlakukan sebagai konteks yang tidak tepercaya dan dapat disuntikkan ke konteks routing.
- Konteks awal thread starter dan riwayat thread awal difilter oleh allowlist pengirim yang dikonfigurasi jika berlaku.
- Tindakan blok dan interaksi modal menghasilkan peristiwa sistem terstruktur
Slack interaction: ...dengan field payload kaya:- block actions: nilai terpilih, label, nilai picker, dan metadata
workflow_* - event modal
view_submissiondanview_closeddengan metadata channel yang dirutekan dan input formulir
- block actions: nilai terpilih, label, nilai picker, dan metadata
Petunjuk referensi konfigurasi
Referensi utama:-
Referensi konfigurasi - Slack
Field Slack dengan sinyal tinggi:
- mode/auth:
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; biarkan off kecuali diperlukan) - akses channel:
groupPolicy,channels.*,channels.*.users,channels.*.requireMention - threading/history:
replyToMode,replyToModeByChatType,thread.*,historyLimit,dmHistoryLimit,dms.*.historyLimit - pengiriman:
textChunkLimit,chunkMode,mediaMaxMb,streaming,nativeStreaming - ops/fitur:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
- mode/auth:
Pemecahan masalah
No replies in channels
No replies in channels
Periksa, secara berurutan:
groupPolicy- allowlist channel (
channels.slack.channels) requireMention- allowlist
usersper channel
DM messages ignored
DM messages ignored
Periksa:
channels.slack.dm.enabledchannels.slack.dmPolicy(atau legacychannels.slack.dm.policy)- persetujuan pairing / entri allowlist
Socket mode not connecting
Socket mode not connecting
Validasi token bot + aplikasi dan pengaktifan Socket Mode di pengaturan aplikasi Slack.Jika
openclaw channels status --probe --json menampilkan botTokenStatus atau
appTokenStatus: "configured_unavailable", akun Slack
telah dikonfigurasi tetapi runtime saat ini tidak dapat menyelesaikan nilai
yang didukung SecretRef.HTTP mode not receiving events
HTTP mode not receiving events
Validasi:
- signing secret
- path webhook
- Slack Request URL (Events + Interactivity + Slash Commands)
webhookPathunik per akun HTTP
signingSecretStatus: "configured_unavailable" muncul di snapshot akun,
akun HTTP telah dikonfigurasi tetapi runtime saat ini tidak dapat
menyelesaikan signing secret yang didukung SecretRef.Native/slash commands not firing
Native/slash commands not firing
Verifikasi apakah yang Anda maksud adalah:
- mode perintah native (
channels.slack.commands.native: true) dengan slash command yang sesuai terdaftar di Slack - atau mode single slash command (
channels.slack.slashCommand.enabled: true)
commands.useAccessGroups dan allowlist channel/pengguna.