Mainstream messaging
Slack
Siap produksi untuk DM dan channel melalui integrasi aplikasi Slack. Mode default adalah Socket Mode; HTTP Request URLs juga didukung. Mode relay ditujukan untuk deployment terkelola ketika router tepercaya memiliki ingress Slack.
DM Slack default menggunakan mode pairing.
Perilaku command native dan katalog command.
Diagnostik lintas-channel dan playbook perbaikan.
Memilih Socket Mode atau HTTP Request URLs
Kedua transport siap produksi dan mencapai paritas fitur untuk perpesanan, slash commands, App Home, dan interaktivitas. Pilih berdasarkan bentuk deployment, bukan fitur.
| Hal | Socket Mode (default) | HTTP Request URLs |
|---|---|---|
| URL Gateway publik | Tidak diperlukan | Diperlukan (DNS, TLS, reverse proxy, atau tunnel) |
| Jaringan outbound | WSS outbound ke wss-primary.slack.com harus dapat dijangkau |
Tidak ada WS outbound; hanya HTTPS inbound |
| Token yang dibutuhkan | Bot token + App-Level Token dengan connections:write |
Bot token + Signing Secret |
| Laptop dev / di balik firewall | Berfungsi apa adanya | Membutuhkan tunnel publik (ngrok, Cloudflare Tunnel, Tailscale Funnel) atau Gateway staging |
| Penskalaan horizontal | Satu sesi Socket Mode per aplikasi per host; beberapa Gateway membutuhkan aplikasi Slack terpisah | Handler POST tanpa state; beberapa replika Gateway dapat berbagi satu aplikasi di balik load balancer |
| Multi-akun pada satu Gateway | Didukung; setiap akun membuka WS sendiri | Didukung; setiap akun membutuhkan webhookPath unik (default /slack/events) agar registrasi tidak bertabrakan |
| Transport slash command | Dikirim melalui koneksi WS; slash_commands[].url diabaikan |
Slack mengirim POST ke slash_commands[].url; field diperlukan agar command dikirim |
| Penandatanganan request | Tidak digunakan (auth adalah App-Level Token) | Slack menandatangani setiap request; OpenClaw memverifikasi dengan signingSecret |
| Pemulihan saat koneksi putus | Reconnect otomatis Slack SDK diaktifkan; OpenClaw juga memulai ulang sesi Socket Mode yang gagal dengan backoff terbatas. Tuning transport pong-timeout berlaku. | Tidak ada koneksi persisten yang putus; retry dilakukan per-request dari Slack |
Mode relay
Mode relay memisahkan ingress Slack dari gateway OpenClaw. Router tepercaya memiliki satu koneksi Slack Socket Mode, memilih gateway tujuan, dan meneruskan event bertipe melalui websocket terautentikasi. Gateway tetap menggunakan bot token-nya untuk panggilan Slack Web API outbound.
{ 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 relay harus menggunakan wss:// kecuali menargetkan localhost. Perlakukan bearer token dan
tabel rute router sebagai bagian dari batas otorisasi Slack: event yang dirutekan masuk ke
handler pesan Slack normal sebagai aktivasi terotorisasi. slack_identity yang disediakan router
dalam frame hello websocket dapat menetapkan username dan ikon outbound default; identitas
eksplisit yang diberikan pemanggil tetap menang. Koneksi relay melakukan reconnect dengan
timing backoff terbatas yang sama seperti Socket Mode dan menghapus identitas yang disediakan router setiap kali
terputus.
Instal
Instal Slack sebelum mengonfigurasi channel:
openclaw plugins install @openclaw/slackplugins install mendaftarkan dan mengaktifkan plugin. Plugin tetap tidak melakukan apa pun sampai Anda mengonfigurasi aplikasi Slack dan pengaturan channel di bawah. Lihat Plugins untuk perilaku plugin umum dan aturan instalasi.
Setup cepat
Socket Mode (default)
Create a new Slack app
Buka api.slack.com/apps → Create New App → From a manifest → pilih workspace Anda → tempel salah satu manifest di bawah → 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},"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"]}}}Setelah Slack membuat aplikasi:
- Basic Information -> App-Level Tokens -> Generate Token and Scopes: tambahkan
connections:write, simpan, salin App-Level Token. - Install App -> Install to Workspace: salin Bot User OAuth Token.
Configure OpenClaw
Setup SecretRef yang direkomendasikan:
export SLACK_APP_TOKEN=slack-app-token-exampleexport SLACK_BOT_TOKEN=slack-bot-token-examplecat > 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.json5Fallback env (hanya akun default):
SLACK_APP_TOKEN=slack-app-token-exampleSLACK_BOT_TOKEN=slack-bot-token-exampleStart gateway
openclaw gatewayHTTP Request URLs
Create a new Slack app
Buka api.slack.com/apps → Buat Aplikasi Baru → Dari manifes → pilih workspace Anda → tempel salah satu manifes di bawah → ganti https://gateway-host.example.com/slack/events dengan URL Gateway publik Anda → Berikutnya → Buat.
{"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,"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","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"}}}{"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,"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","assistant_thread_context_changed","assistant_thread_started","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"}}}Setelah Slack membuat aplikasi:
- Informasi Dasar → Kredensial Aplikasi: salin Signing Secret untuk verifikasi permintaan.
- Instal Aplikasi -> Instal ke Workspace: salin Bot User OAuth Token.
Configure OpenClaw
Penyiapan SecretRef yang direkomendasikan:
export SLACK_BOT_TOKEN=slack-bot-token-exampleexport 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.json5Start gateway
openclaw gatewayPenyesuaian transport Mode Socket
OpenClaw menetapkan timeout pong klien Slack SDK ke 15 detik secara default untuk Mode Socket. Timpa pengaturan transport hanya ketika Anda membutuhkan penyesuaian khusus workspace atau host:
{ channels: { slack: { mode: "socket", socketMode: { clientPingTimeout: 20000, serverPingTimeout: 30000, pingPongLoggingEnabled: false, }, }, },}Gunakan ini hanya untuk workspace Mode Socket yang mencatat timeout pong websocket Slack/ping server atau berjalan di 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 event aplikasi tetap menjadi status aplikasi, bukan sinyal keaktifan transport.
Catatan:
socketModediabaikan dalam mode URL Permintaan HTTP.- Pengaturan dasar
channels.slack.socketModeberlaku untuk semua akun Slack kecuali ditimpa. Penimpaan per akun menggunakanchannels.slack.accounts.<accountId>.socketMode; karena ini adalah penimpaan objek, sertakan setiap kolom penyesuaian socket yang Anda inginkan untuk akun tersebut. - Hanya
clientPingTimeoutyang memiliki default OpenClaw (15000).serverPingTimeoutdanpingPongLoggingEnabledditeruskan ke Slack SDK hanya ketika dikonfigurasi. - Backoff restart Mode Socket dimulai sekitar 2 detik dan dibatasi sekitar 30 detik. Kegagalan start, start-wait, dan disconnect yang dapat dipulihkan akan dicoba ulang hingga channel berhenti. Error akun dan kredensial permanen seperti autentikasi tidak valid, token dicabut, atau cakupan hilang akan gagal cepat alih-alih mencoba ulang selamanya.
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 }, "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" ] } }}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", "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" } }}Pengaturan manifes tambahan
Tampilkan berbagai fitur yang memperluas default di atas.
Manifes default mengaktifkan tab Beranda Slack App Home dan berlangganan ke app_home_opened. Saat anggota workspace membuka tab Beranda, OpenClaw menerbitkan tampilan Beranda default yang aman dengan views.publish; tidak ada payload percakapan atau konfigurasi privat yang disertakan. Tab Pesan tetap diaktifkan untuk DM Slack. Manifes juga mengaktifkan utas asisten Slack dengan features.assistant_view, assistant:write, assistant_thread_started, dan assistant_thread_context_changed; utas asisten dirutekan ke sesi utas OpenClaw tersendiri dan menjaga konteks utas yang disediakan Slack tetap tersedia bagi agen.
Optional native slash commands
Beberapa perintah slash native dapat digunakan sebagai pengganti satu perintah yang dikonfigurasi, dengan beberapa nuansa:
- Gunakan
/agentstatussebagai pengganti/statuskarena perintah/statusdicadangkan. - Tidak lebih dari 25 perintah slash dapat tersedia sekaligus.
Ganti bagian features.slash_commands yang ada dengan subset dari perintah yang tersedia:
Socket Mode (default)
{"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": "/approve","description": "Approve or deny pending approval requests","usage_hint": "<id> <decision>"},{"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
Gunakan daftar slash_commands yang sama seperti Socket Mode di atas, dan tambahkan "url": "https://gateway-host.example.com/slack/events" ke setiap entri. Contoh:
{"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"}]}Ulangi nilai url tersebut pada setiap perintah dalam daftar.
Optional authorship scopes (write operations)
Tambahkan cakupan bot chat:write.customize jika Anda ingin pesan keluar menggunakan identitas agen aktif (nama pengguna dan ikon kustom), bukan identitas aplikasi Slack default.
Jika Anda menggunakan ikon emoji, Slack mengharapkan sintaks :emoji_name:.
Optional user-token scopes (read operations)
Jika Anda mengonfigurasi channels.slack.userToken, cakupan 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. - Mode relay memerlukan
botTokensertarelay.url,relay.authToken, danrelay.gatewayId; mode ini tidak menggunakan token aplikasi atau signing secret. botToken,appToken,signingSecret,relay.authToken, danuserTokenmenerima string teks biasa atau objek SecretRef.- Token konfigurasi menimpa fallback env.
- Fallback env
SLACK_BOT_TOKEN/SLACK_APP_TOKENhanya berlaku untuk akun default. userTokenhanya melalui konfigurasi (tanpa fallback env) dan default ke perilaku hanya-baca (userTokenReadOnly: true).
Perilaku snapshot status:
- Inspeksi akun Slack melacak kolom
*Sourcedan*Statusper kredensial (botToken,appToken,signingSecret,userToken). - Status adalah
available,configured_unavailable, ataumissing. configured_unavailableberarti akun dikonfigurasi melalui SecretRef atau sumber rahasia non-inline lainnya, tetapi jalur perintah/runtime saat ini tidak dapat menyelesaikan nilai aktualnya.- Dalam mode HTTP,
signingSecretStatusdisertakan; dalam Socket Mode, pasangan wajibnya adalahbotTokenStatus+appTokenStatus.
Aksi dan gate
Aksi Slack dikendalikan oleh channels.slack.actions.*.
Grup aksi yang tersedia dalam tooling Slack saat ini:
| Grup | Default |
|---|---|
| messages | diaktifkan |
| reactions | diaktifkan |
| pins | diaktifkan |
| memberInfo | diaktifkan |
| emojiList | diaktifkan |
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 dalam placeholder file masuk dan mengembalikan pratinjau gambar untuk gambar atau metadata file lokal untuk jenis file lainnya.
Kontrol akses dan perutean
DM policy
channels.slack.dmPolicy mengontrol akses DM. channels.slack.allowFrom adalah daftar izin DM kanonis.
pairing(default)allowlistopen(mengharuskanchannels.slack.allowFrommenyertakan"*")disabled
Flag DM:
dm.enabled(default true)channels.slack.allowFromdm.allowFrom(lama)dm.groupEnabled(DM grup default false)dm.groupChannels(daftar izin MPIM opsional)
Presedensi multi-akun:
channels.slack.accounts.default.allowFromhanya berlaku untuk akundefault.- Akun bernama mewarisi
channels.slack.allowFromketikaallowFrommiliknya sendiri belum disetel. - Akun bernama tidak mewarisi
channels.slack.accounts.default.allowFrom.
channels.slack.dm.policy dan channels.slack.dm.allowFrom lama masih dibaca untuk kompatibilitas. openclaw doctor --fix memigrasikannya ke dmPolicy dan allowFrom jika dapat melakukannya tanpa mengubah akses.
Pemasangan di DM menggunakan openclaw pairing approve slack <code>.
Channel policy
channels.slack.groupPolicy mengontrol penanganan saluran:
openallowlistdisabled
Daftar izin saluran berada di bawah channels.slack.channels dan harus menggunakan ID saluran Slack yang stabil (misalnya C12345678) sebagai kunci konfigurasi.
Catatan runtime: jika channels.slack sepenuhnya tidak ada (penyiapan hanya env), runtime akan kembali ke groupPolicy="allowlist" dan mencatat peringatan (meskipun channels.defaults.groupPolicy disetel).
Resolusi nama/ID:
- entri daftar izin saluran dan entri daftar izin DM diselesaikan saat startup ketika akses token memungkinkan
- entri nama saluran yang tidak terselesaikan dipertahankan seperti yang dikonfigurasi tetapi diabaikan untuk perutean secara default
- otorisasi masuk dan perutean saluran mengutamakan ID secara default; pencocokan langsung nama pengguna/slug memerlukan
channels.slack.dangerouslyAllowNameMatching: true
Mentions and channel users
Pesan saluran dibatasi oleh penyebutan secara default.
Sumber penyebutan:
- penyebutan aplikasi eksplisit (
<@botId>) - penyebutan grup pengguna Slack (
<!subteam^S...>) ketika pengguna bot adalah anggota grup pengguna tersebut; memerlukanusergroups:read - pola regex penyebutan (
agents.list[].groupChat.mentionPatterns, fallbackmessages.groupChat.mentionPatterns) - perilaku thread balasan-ke-bot implisit (dinonaktifkan ketika
thread.requireExplicitMentionadalahtrue)
Kontrol per saluran (channels.slack.channels.<id>; nama hanya melalui resolusi startup atau dangerouslyAllowNameMatching):
requireMentionusers(daftar izin)allowBotsskillssystemPrompttools,toolsBySender- format kunci
toolsBySender:channel:,id:,e164:,username:,name:, atau wildcard"*"(kunci lama tanpa prefiks masih dipetakan keid:saja)
allowBots bersifat konservatif untuk channel dan channel privat: pesan room yang dibuat bot diterima hanya ketika bot pengirim secara eksplisit tercantum dalam allowlist users room tersebut, atau ketika setidaknya satu ID pemilik Slack eksplisit dari channels.slack.allowFrom saat ini menjadi anggota room. Wildcard dan entri pemilik nama tampilan tidak memenuhi kehadiran pemilik. Kehadiran pemilik menggunakan conversations.members Slack; pastikan aplikasi memiliki cakupan baca yang sesuai untuk jenis room (channels:read untuk channel publik, groups:read untuk channel privat). Jika pencarian anggota gagal, OpenClaw membuang pesan room yang dibuat bot.
Pesan Slack yang dibuat bot dan diterima menggunakan perlindungan loop bot bersama. Konfigurasikan channels.defaults.botLoopProtection untuk anggaran default, lalu timpa dengan channels.slack.botLoopProtection atau channels.slack.channels.<id>.botLoopProtection ketika workspace atau channel membutuhkan batas yang berbeda.
Thread, sesi, dan tag balasan
- DM dirutekan sebagai
direct; channel sebagaichannel; MPIM sebagaigroup. - Pengikatan 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>. - Pesan channel level atas biasa tetap berada di sesi per channel, bahkan ketika
replyToModebukanoff. - Balasan thread Slack menggunakan
thread_tsinduk Slack untuk sufiks sesi (:thread:<threadTs>), bahkan ketika thread balasan keluar dinonaktifkan denganreplyToMode="off". - OpenClaw menanamkan root channel level atas yang memenuhi syarat ke dalam
agent:<agentId>:slack:channel:<channelId>:thread:<rootTs>ketika root tersebut diharapkan memulai thread Slack yang terlihat, sehingga root dan balasan thread berikutnya berbagi satu sesi OpenClaw. Ini berlaku untuk eventapp_mention, kecocokan bot eksplisit atau pola penyebutan terkonfigurasi, dan channelrequireMention: falsedenganreplyToModenon-off. - Default
channels.slack.thread.historyScopeadalahthread; defaultthread.inheritParentadalahfalse. channels.slack.thread.initialHistoryLimitmengontrol berapa banyak pesan thread yang sudah ada yang diambil ketika sesi thread baru dimulai (default20; setel0untuk menonaktifkan).channels.slack.thread.requireExplicitMention(defaultfalse): ketikatrue, menekan penyebutan thread implisit sehingga bot hanya merespons penyebutan@boteksplisit di dalam thread, bahkan ketika bot sudah berpartisipasi dalam thread tersebut. Tanpa ini, balasan dalam thread yang diikuti bot melewati gerbangrequireMention.
Kontrol thread balasan:
channels.slack.replyToMode:off|first|all|batched(defaultoff)channels.slack.replyToModeByChatType: perdirect|group|channel- fallback lama untuk chat langsung:
channels.slack.dm.replyToMode
Tag balasan manual didukung:
[[reply_to_current]][[reply_to:<id>]]
Untuk balasan thread Slack eksplisit dari alat 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 Slack dan hanya didukung untuk pengiriman teks atau Block Kit, bukan unggahan media.
Ketika panggilan alat message berjalan di dalam thread Slack dan menargetkan channel yang sama, OpenClaw biasanya mewarisi thread Slack saat ini sesuai replyToMode. Setel topLevel: true pada action: "send" atau action: "upload-file" untuk memaksa pesan channel induk baru sebagai gantinya. threadId: null diterima sebagai opt-out level atas yang sama.
Reaksi ack
ackReaction mengirim emoji pengakuan saat OpenClaw memproses pesan masuk. ackReactionScope menentukan kapan emoji itu benar-benar dikirim.
Emoji (ackReaction)
Urutan resolusi:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- fallback emoji identitas agen (
agents.list[].identity.emoji, atau"eyes"/ 👀)
Catatan:
- Slack mengharapkan shortcode (misalnya
"eyes"). - Gunakan
""untuk menonaktifkan reaksi untuk akun Slack atau secara global.
Cakupan (messages.ackReactionScope)
Provider Slack membaca cakupan dari messages.ackReactionScope (default "group-mentions"). Saat ini tidak ada penimpaan level akun Slack atau level channel Slack; nilainya bersifat global untuk Gateway.
Nilai:
"all": bereaksi di DM dan grup."direct": bereaksi hanya di DM."group-all": bereaksi pada setiap pesan grup (tanpa DM)."group-mentions"(default): bereaksi di grup, tetapi hanya ketika bot disebut (atau di mentionable grup yang ikut serta). DM dikecualikan."off"/"none": jangan pernah bereaksi.
{ messages: { ackReaction: "eyes", ackReactionScope: "all", // bereaksi di DM dan grup },}Streaming teks
channels.slack.streaming mengontrol perilaku pratinjau langsung:
off: nonaktifkan streaming pratinjau langsung.partial(default): ganti teks pratinjau dengan output parsial terbaru.block: tambahkan pembaruan pratinjau dalam potongan.progress: tampilkan teks status progres saat menghasilkan, lalu kirim teks final.streaming.preview.toolProgress: ketika pratinjau draf aktif, rutekan pembaruan alat/progres ke pesan pratinjau yang sama yang diedit (default:true). Setelfalseuntuk mempertahankan pesan alat/progres terpisah.streaming.preview.commandText/streaming.progress.commandText: setel kestatusuntuk mempertahankan baris progres alat yang ringkas sambil menyembunyikan teks command/exec mentah (default:raw).
Sembunyikan teks command/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).
Kartu tugas progres native Slack bersifat opt-in untuk mode progres. Setel channels.slack.streaming.progress.nativeTaskCards ke true dengan channels.slack.streaming.mode="progress" untuk mengirim kartu rencana/tugas native Slack saat pekerjaan berjalan, lalu memperbarui kartu tugas yang sama saat selesai. Tanpa flag ini, mode progres mempertahankan perilaku pratinjau draf portabel.
- Thread balasan harus tersedia agar streaming teks native dan status thread asisten Slack muncul. Pemilihan thread tetap mengikuti
replyToMode. - Root channel, chat grup, dan DM level atas masih dapat menggunakan pratinjau draf normal ketika streaming native tidak tersedia atau tidak ada thread balasan.
- DM Slack level atas tetap di luar thread secara default, sehingga tidak menampilkan pratinjau stream/status native bergaya thread milik Slack; OpenClaw memposting dan mengedit pratinjau draf di DM sebagai gantinya.
- Media dan payload non-teks fallback ke pengiriman normal.
- Final media/error membatalkan edit pratinjau tertunda; final teks/blok yang memenuhi syarat hanya di-flush ketika dapat mengedit pratinjau di tempat.
- Jika streaming gagal di tengah balasan, OpenClaw fallback ke pengiriman normal untuk payload yang tersisa.
Gunakan pratinjau draf alih-alih streaming teks native Slack:
{ channels: { slack: { streaming: { mode: "partial", nativeTransport: false, }, }, },}Ikut serta dalam kartu tugas progres native Slack:
{ channels: { slack: { streaming: { mode: "progress", progress: { nativeTaskCards: true, render: "rich", }, }, }, },}Kunci lama:
channels.slack.streamMode(replace | status_final | append) adalah alias runtime lama untukchannels.slack.streaming.mode.- boolean
channels.slack.streamingadalah alias runtime lama untukchannels.slack.streaming.modedanchannels.slack.streaming.nativeTransport. channels.slack.nativeStreaminglama adalah alias runtime untukchannels.slack.streaming.nativeTransport.- Jalankan
openclaw doctor --fixuntuk menulis ulang konfigurasi streaming Slack tersimpan ke kunci kanonis.
Fallback reaksi mengetik
typingReaction menambahkan reaksi sementara ke pesan Slack masuk saat OpenClaw memproses balasan, lalu menghapusnya ketika run selesai. Ini paling berguna di luar balasan thread, yang menggunakan indikator status default "sedang mengetik...".
Urutan resolusi:
channels.slack.accounts.<accountId>.typingReactionchannels.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, pemotongan, dan pengiriman
Lampiran masuk
Lampiran file Slack diunduh dari URL privat yang dihosting Slack (alur permintaan terautentikasi token) dan ditulis ke penyimpanan media ketika pengambilan berhasil dan batas ukuran mengizinkan. Placeholder file menyertakan fileId Slack sehingga 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 fallback ke placeholder file.
Batas ukuran runtime masuk default ke 20MB kecuali ditimpa oleh channels.slack.mediaMaxMb.
Teks dan file keluar
- potongan teks menggunakan
channels.slack.textChunkLimit(default 4000) channels.slack.chunkMode="newline"mengaktifkan pemisahan yang mengutamakan paragraf- pengiriman file menggunakan API unggah Slack dan dapat menyertakan balasan thread (
thread_ts) - batas media keluar mengikuti
channels.slack.mediaMaxMbketika dikonfigurasi; jika tidak, pengiriman channel menggunakan default jenis MIME dari pipeline media
Target pengiriman
Target eksplisit yang disukai:
user:<id>untuk DMchannel:<id>untuk channel
DM Slack khusus 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 terkonfigurasi atau beberapa perintah native. Konfigurasikan channels.slack.slashCommand untuk mengubah default perintah:
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
/openclaw /helpPerintah native memerlukan pengaturan manifes 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 nonaktif untuk Slack sehingga
commands.native: "auto"tidak mengaktifkan perintah native Slack.
/helpMenu argumen native menggunakan strategi rendering adaptif yang menampilkan modal konfirmasi sebelum mengirimkan nilai opsi yang dipilih:
- hingga 5 opsi: blok tombol
- 6-100 opsi: menu pilih statis
- lebih dari 100 opsi: pilih eksternal dengan pemfilteran opsi asinkron ketika handler opsi interaktivitas tersedia
- batas Slack terlampaui: nilai opsi yang dikodekan fallback ke tombol
/thinkSesi 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 dibuat agen, tetapi fitur ini dinonaktifkan secara default.
Untuk output agen, CLI, dan Plugin baru, utamakan tombol
presentation bersama atau blok pilihan. Keduanya menggunakan jalur interaksi Slack
yang sama sekaligus menurun fungsinya di saluran lain.
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 masih dapat memancarkan direktif balasan khusus Slack yang tidak digunakan lagi:
[[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 peristiwa interaksi Slack yang sudah ada. Pertahankan untuk prompt lama dan jalan keluar khusus Slack; gunakan presentasi bersama untuk kontrol portabel baru.
API kompilator direktif juga tidak digunakan lagi untuk kode produsen baru:
compileSlackInteractiveReplies(...)parseSlackOptionsLine(...)isSlackInteractiveRepliesEnabled(...)buildSlackInteractiveBlocks(...)
Gunakan payload presentation dan buildSlackPresentationBlocks(...) untuk kontrol
baru yang dirender Slack.
Catatan:
- Ini adalah UI lama khusus Slack. Saluran lain tidak menerjemahkan direktif Slack Block Kit menjadi sistem tombol mereka sendiri.
- Nilai callback interaktif adalah token buram yang dihasilkan OpenClaw, bukan nilai mentah yang dibuat agen.
- Jika blok interaktif yang dihasilkan akan melampaui batas Slack Block Kit, OpenClaw kembali ke balasan teks asli alih-alih mengirim payload blok yang tidak valid.
Pengiriman modal milik Plugin
Plugin Slack yang mendaftarkan handler interaktif juga dapat menerima peristiwa siklus hidup modal
view_submission dan view_closed sebelum OpenClaw memadatkan
payload untuk peristiwa sistem yang terlihat agen. Gunakan salah satu pola perutean
ini saat membuka modal Slack:
- Atur
callback_idkeopenclaw:<namespace>:<payload>. - Atau pertahankan
callback_idyang ada dan letakkanpluginInteractiveData: "<namespace>:<payload>"dalamprivate_metadatamodal.
Handler menerima ctx.interaction.kind sebagai view_submission atau
view_closed, inputs yang dinormalisasi, dan objek mentah penuh stateValues dari
Slack. Perutean hanya callback-id cukup untuk memanggil handler Plugin; sertakan
field perutean pengguna/sesi private_metadata modal yang ada saat
modal juga harus menghasilkan peristiwa sistem yang terlihat agen. Agen menerima
peristiwa sistem Slack interaction: ... yang ringkas dan disunting. Jika handler mengembalikan
systemEvent.summary, systemEvent.reference, atau systemEvent.data, field
tersebut disertakan dalam peristiwa ringkas itu sehingga agen dapat merujuk
penyimpanan milik Plugin tanpa melihat payload formulir lengkap.
Persetujuan native di Slack
Slack dapat bertindak sebagai klien persetujuan native dengan tombol dan interaksi interaktif, alih-alih kembali ke UI Web atau terminal.
- Persetujuan exec dan Plugin dapat dirender sebagai prompt Slack-native Block Kit.
channels.slack.execApprovals.*tetap menjadi konfigurasi pengaktifan klien persetujuan exec native dan perutean DM/saluran.- DM persetujuan exec menggunakan
channels.slack.execApprovals.approversataucommands.ownerAllowFrom. - Persetujuan Plugin menggunakan tombol Slack-native saat Slack diaktifkan sebagai klien persetujuan native untuk sesi asal, atau saat
approvals.pluginmerutekan ke sesi Slack asal atau target Slack. - DM persetujuan Plugin menggunakan pemberi persetujuan Plugin Slack dari
channels.slack.allowFrom,allowFromakun bernama, atau rute default akun. - Otorisasi pemberi persetujuan tetap diberlakukan: pemberi persetujuan khusus exec tidak dapat menyetujui permintaan Plugin kecuali mereka juga merupakan pemberi persetujuan Plugin.
Ini menggunakan permukaan tombol persetujuan bersama yang sama seperti saluran lain. Saat interactivity diaktifkan di pengaturan aplikasi Slack Anda, prompt persetujuan dirender sebagai tombol Block Kit langsung dalam percakapan.
Saat tombol tersebut ada, tombol itu adalah UX persetujuan utama; OpenClaw
sebaiknya hanya menyertakan perintah manual /approve saat hasil alat menyatakan persetujuan chat
tidak tersedia atau persetujuan manual adalah satu-satunya jalur.
Jalur konfigurasi:
channels.slack.execApprovals.enabledchannels.slack.execApprovals.approvers(opsional; kembali kecommands.ownerAllowFrombila memungkinkan)channels.slack.execApprovals.target(dm|channel|both, default:dm)agentFilter,sessionFilter
Slack mengaktifkan otomatis persetujuan exec native saat enabled tidak diatur atau "auto" dan setidaknya satu
pemberi persetujuan exec berhasil di-resolve. Slack juga dapat menangani persetujuan Plugin native melalui jalur klien native
ini saat pemberi persetujuan Plugin Slack berhasil di-resolve dan permintaan cocok dengan filter klien native. Atur
enabled: false untuk menonaktifkan Slack sebagai klien persetujuan native secara eksplisit. Atur enabled: true untuk
memaksa persetujuan native aktif saat pemberi persetujuan berhasil di-resolve. Menonaktifkan persetujuan exec Slack tidak menonaktifkan
pengiriman persetujuan Plugin Slack native yang diaktifkan melalui approvals.plugin; pengiriman persetujuan Plugin
menggunakan pemberi persetujuan Plugin Slack sebagai gantinya.
Perilaku default tanpa konfigurasi persetujuan exec Slack eksplisit:
{ commands: { ownerAllowFrom: ["slack:U12345678"], },}Konfigurasi Slack-native eksplisit hanya diperlukan saat Anda ingin menimpa pemberi persetujuan, menambahkan filter, atau memilih pengiriman ke chat asal:
{ channels: { slack: { execApprovals: { enabled: true, approvers: ["U12345678"], target: "both", }, }, },}Penerusan approvals.exec bersama bersifat 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; pengiriman native Slack menekan fallback itu hanya saat Slack dapat menangani permintaan persetujuan Plugin
secara native.
/approve dalam chat yang sama juga berfungsi di saluran Slack dan DM yang sudah mendukung perintah. Lihat Persetujuan exec untuk model penerusan persetujuan lengkap.
Peristiwa dan perilaku operasional
- Edit/hapus pesan dipetakan ke peristiwa sistem.
- Siaran thread (balasan thread "Juga kirim ke saluran") diproses sebagai pesan pengguna normal.
- Peristiwa tambah/hapus reaksi dipetakan ke peristiwa sistem.
- Peristiwa anggota bergabung/keluar, saluran dibuat/diubah nama, dan tambah/hapus pin dipetakan ke peristiwa sistem.
channel_id_changeddapat memigrasikan kunci konfigurasi saluran saatconfigWritesdiaktifkan.- Metadata topik/tujuan saluran diperlakukan sebagai konteks tidak tepercaya dan dapat disuntikkan ke konteks perutean.
- Pengisian awal konteks pembuka thread dan riwayat thread awal difilter oleh allowlist pengirim yang dikonfigurasi bila berlaku.
- Aksi blok, shortcut, dan interaksi modal memancarkan peristiwa sistem
Slack interaction: ...terstruktur dengan field payload kaya:- aksi blok: nilai yang dipilih, label, nilai pemilih, dan metadata
workflow_* - shortcut global: metadata callback dan aktor, dirutekan ke sesi langsung aktor
- shortcut pesan: konteks callback, aktor, saluran, thread, dan pesan terpilih
- peristiwa modal
view_submissiondanview_closeddengan metadata saluran yang dirutekan dan input formulir
- aksi blok: nilai yang dipilih, label, nilai pemilih, dan metadata
Definisikan shortcut global atau pesan dalam konfigurasi aplikasi Slack Anda dan gunakan ID callback tidak kosong apa pun. OpenClaw mengakui payload shortcut yang cocok, menerapkan kebijakan pengirim DM/saluran yang sama seperti interaksi Slack lain, dan mengantrekan peristiwa yang disanitasi untuk sesi agen yang dirutekan. ID pemicu dan URL respons disunting dari konteks agen.
Referensi konfigurasi
Referensi utama: Referensi konfigurasi - Slack.
Field Slack bernilai tinggi
- mode/auth:
mode,botToken,appToken,signingSecret,webhookPath,accounts.* - akses DM:
dm.enabled,dmPolicy,allowFrom(lama:dm.policy,dm.allowFrom),dm.groupEnabled,dm.groupChannels - toggle kompatibilitas:
dangerouslyAllowNameMatching(break-glass; biarkan nonaktif kecuali diperlukan) - akses saluran:
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(default:false),unfurlMediauntuk kontrol pratinjau tautan/mediachat.postMessage; aturunfurlLinks: trueuntuk memilih kembali ke pratinjau tautan - ops/fitur:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
Pemecahan masalah
Tidak ada balasan di saluran
Periksa, secara berurutan:
groupPolicy- allowlist saluran (
channels.slack.channels) — kunci harus berupa ID saluran (C12345678), bukan nama (#channel-name). Kunci berbasis nama gagal diam-diam di bawahgroupPolicy: "allowlist"karena perutean saluran secara default mengutamakan ID. Untuk menemukan ID: klik kanan saluran di Slack → Copy link — nilaiC...di akhir URL adalah ID saluran. requireMention- allowlist
usersper saluran messages.groupChat.visibleReplies: permintaan grup/saluran normal default ke"automatic". Jika Anda memilih"message_tool"dan log menampilkan teks asisten tanpa panggilanmessage(action=send), model melewatkan jalur alat pesan yang terlihat. Teks akhir tetap privat dalam mode ini; periksa log verbose gateway untuk metadata payload yang ditekan, atau atur ke"automatic"jika Anda ingin setiap balasan akhir asisten normal diposting melalui jalur lama.messages.groupChat.unmentionedInbound: jika nilainya"room_event", percakapan saluran yang diizinkan tanpa mention adalah konteks sekitar dan tetap senyap kecuali agen memanggil alatmessage. Lihat Peristiwa ruang sekitar.
{messages: {groupChat: { visibleReplies: "automatic",},},}Perintah berguna:
openclaw channels status --probeopenclaw logs --followopenclaw doctorPesan DM diabaikan
Periksa:
channels.slack.dm.enabledchannels.slack.dmPolicy(atauchannels.slack.dm.policylama)- persetujuan pairing / entri allowlist (
dmPolicy: "open"tetap memerlukanchannels.slack.allowFrom: ["*"]) - DM grup menggunakan penanganan MPIM; aktifkan
channels.slack.dm.groupEnableddan, jika dikonfigurasi, sertakan MPIM dalamchannels.slack.dm.groupChannels - Peristiwa DM Slack Assistant: log verbose yang menyebutkan
drop message_changedbiasanya berarti Slack mengirim peristiwa thread Assistant yang diedit tanpa pengirim manusia yang dapat dipulihkan dalam metadata pesan
openclaw pairing list slackSocket mode tidak tersambung
Validasi token bot + aplikasi dan pengaktifan Socket Mode di pengaturan aplikasi Slack.
App-Level Token memerlukan connections:write, dan Bot User OAuth Token
bot token harus milik aplikasi/ruang kerja Slack yang sama dengan token aplikasi.
Jika openclaw channels status --probe --json menampilkan botTokenStatus atau
appTokenStatus: "configured_unavailable", akun Slack
telah dikonfigurasi tetapi runtime saat ini tidak dapat me-resolve nilai berbasis SecretRef.
Log seperti slack socket mode failed to start; retry ... adalah kegagalan
mulai yang dapat dipulihkan. Scope yang hilang, token yang dicabut, dan autentikasi tidak valid akan gagal cepat
sebagai gantinya. Log slack token mismatch ... berarti token bot dan token aplikasi
tampaknya milik aplikasi Slack yang berbeda; perbaiki kredensial aplikasi Slack.
HTTP mode not receiving events
Validasi:
- signing secret
- jalur webhook
- URL Permintaan Slack (Events + Interactivity + Slash Commands)
webhookPathunik per akun HTTP- URL publik mengakhiri TLS dan meneruskan permintaan ke jalur Gateway
- jalur
request_urlaplikasi Slack sama persis denganchannels.slack.webhookPath(default/slack/events)
Jika signingSecretStatus: "configured_unavailable" muncul dalam snapshot
akun, akun HTTP sudah dikonfigurasi tetapi runtime saat ini tidak dapat
menyelesaikan signing secret yang didukung SecretRef.
Log berulang slack: webhook path ... already registered berarti dua akun HTTP
menggunakan webhookPath yang sama; berikan setiap akun jalur yang berbeda.
Native/slash commands not firing
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)
Slack tidak membuat atau menghapus perintah slash secara otomatis. commands.native: "auto" tidak mengaktifkan perintah native Slack; gunakan true dan buat perintah yang sesuai di aplikasi Slack. Dalam mode HTTP, setiap perintah slash Slack harus menyertakan URL Gateway. Dalam Socket Mode, payload perintah tiba melalui websocket dan Slack mengabaikan slash_commands[].url.
Periksa juga commands.useAccessGroups, otorisasi DM, allowlist channel,
dan allowlist users per channel. Slack mengembalikan error ephemeral untuk
pengirim perintah slash yang diblokir, termasuk:
This channel is not allowed.You are not authorized to use this command here.
Referensi vision lampiran
Slack dapat melampirkan media yang diunduh ke giliran agen ketika unduhan file Slack berhasil dan batas ukuran mengizinkan. File gambar dapat diteruskan melalui jalur pemahaman media atau langsung ke model balasan yang mendukung vision; file lain dipertahankan sebagai konteks file yang dapat diunduh, bukan diperlakukan sebagai input gambar.
Jenis media yang didukung
| Jenis media | Sumber | Perilaku saat ini | Catatan |
|---|---|---|---|
| Gambar JPEG / PNG / GIF / WebP | URL file Slack | Diunduh dan dilampirkan ke giliran untuk penanganan yang mendukung vision | Batas per file: channels.slack.mediaMaxMb (default 20 MB) |
| File PDF | URL file Slack | Diunduh dan diekspos sebagai konteks file untuk alat seperti download-file atau pdf |
Inbound Slack tidak mengonversi PDF menjadi input image-vision secara otomatis |
| File lain | URL file Slack | Diunduh jika memungkinkan dan diekspos sebagai konteks file | File biner tidak diperlakukan sebagai input gambar |
| Balasan thread | File pemulai thread | File pesan root dapat dihidrasi sebagai konteks ketika balasan tidak memiliki media langsung | Pemulai hanya file menggunakan placeholder lampiran |
| Pesan multi-gambar | Beberapa file Slack | Setiap file dievaluasi secara independen | Pemrosesan Slack dibatasi hingga delapan file per pesan |
Pipeline inbound
Ketika pesan Slack dengan lampiran file tiba:
- OpenClaw mengunduh file dari URL privat Slack menggunakan token bot.
- File ditulis ke penyimpanan media saat berhasil.
- Jalur media yang diunduh dan jenis konten ditambahkan ke konteks inbound.
- Jalur model/alat yang mendukung gambar dapat menggunakan lampiran gambar dari konteks tersebut.
- File non-gambar tetap tersedia sebagai metadata file atau referensi media untuk alat yang dapat menanganinya.
Pewarisan lampiran root thread
Ketika 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 diprioritaskan 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
Ketika 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 event.
- Kegagalan dalam unduhan satu lampiran tidak memblokir lampiran lainnya.
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 Slack, URL kedaluwarsa, file yang tidak dapat diakses, file terlalu besar, dan respons HTML autentikasi/login Slack dilewati alih-alih dilaporkan sebagai format yang tidak didukung.
- Model vision: Analisis gambar menggunakan model balasan aktif ketika model tersebut mendukung vision, atau model gambar yang dikonfigurasi di
agents.defaults.imageModel.
Batasan yang diketahui
| Skenario | Perilaku saat ini | Solusi sementara |
|---|---|---|
| URL file Slack kedaluwarsa | File dilewati; tidak ada error yang ditampilkan | Unggah ulang file di Slack |
| Model vision belum dikonfigurasi | Lampiran gambar disimpan sebagai referensi media, tetapi tidak dianalisis sebagai gambar | Konfigurasikan agents.defaults.imageModel atau gunakan model balasan yang mendukung vision |
| Gambar sangat besar (> 20 MB secara default) | Dilewati sesuai batas ukuran | Tingkatkan channels.slack.mediaMaxMb jika Slack mengizinkan |
| Lampiran yang diteruskan/dibagikan | Teks dan media gambar/file yang dihosting Slack bersifat upaya terbaik | Bagikan ulang langsung di thread OpenClaw |
| Lampiran PDF | Disimpan sebagai konteks file/media, tidak otomatis dirutekan melalui image vision | Gunakan download-file untuk metadata file atau alat pdf untuk analisis PDF |
Dokumentasi terkait
- Pipeline pemahaman media
- Alat PDF
- Epic: #51349 — Pengaktifan vision lampiran Slack
- Uji regresi: #51353
- Verifikasi live: #51354