Langsung ke konten utama

Slack

Status: siap produksi untuk DM + channel melalui integrasi aplikasi Slack. Mode default adalah Socket Mode; URL Permintaan HTTP 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.

Penyiapan cepat

1

Create a new Slack app

Di pengaturan aplikasi Slack, tekan tombol Create New App:
  • pilih from a manifest dan pilih workspace untuk aplikasi Anda
  • tempel contoh manifest di bawah ini lalu lanjutkan untuk membuat
  • buat App-Level Token (xapp-...) dengan connections:write
  • instal aplikasi dan salin Bot Token (xoxb-...) yang ditampilkan
2

Configure OpenClaw

{
  channels: {
    slack: {
      enabled: true,
      mode: "socket",
      appToken: "xapp-...",
      botToken: "xoxb-...",
    },
  },
}
Fallback env (hanya akun default):
SLACK_APP_TOKEN=xapp-...
SLACK_BOT_TOKEN=xoxb-...
3

Start gateway

openclaw gateway

Daftar periksa manifest dan scope

{
  "display_information": {
    "name": "OpenClaw",
    "description": "Slack connector for OpenClaw"
  },
  "features": {
    "bot_user": {
      "display_name": "OpenClaw",
      "always_online": true
    },
    "app_home": {
      "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",
        "users:read"
      ]
    }
  },
  "settings": {
    "socket_mode_enabled": true,
    "event_subscriptions": {
      "bot_events": [
        "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"
      ]
    }
  }
}

Pengaturan manifest tambahan

Tampilkan fitur berbeda yang memperluas default di atas.
Beberapa native slash commands dapat digunakan sebagai pengganti satu perintah terkonfigurasi dengan nuansa tertentu:
  • Gunakan /agentstatus alih-alih /status karena perintah /status dicadangkan.
  • Tidak lebih dari 25 slash command dapat tersedia pada saat yang sama.
Ganti bagian features.slash_commands yang ada dengan subset dari 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": "<off|minimal|low|medium|high|xhigh>"
      },
      {
        "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 or models for a provider",
        "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": "/usage",
        "description": "Control the usage footer or show cost summary",
        "usage_hint": "off|tokens|full|cost"
      }
    ]
Tambahkan bot scope chat:write.customize jika Anda ingin pesan keluar menggunakan identitas agent aktif (username 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, scope 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 menimpa fallback env.
  • Fallback env SLACK_BOT_TOKEN / SLACK_APP_TOKEN hanya berlaku untuk akun default.
  • userToken (xoxp-...) hanya untuk konfigurasi (tanpa fallback env) dan default ke perilaku hanya-baca (userTokenReadOnly: true).
Perilaku snapshot status:
  • Pemeriksaan akun Slack melacak field *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 secret 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 pembacaan actions/directory, user token dapat diprioritaskan saat dikonfigurasi. Untuk operasi tulis, bot token tetap diprioritaskan; operasi tulis user-token hanya diizinkan saat userTokenReadOnly: false dan bot token tidak tersedia.

Actions dan gate

Actions Slack dikendalikan oleh channels.slack.actions.*. Grup action yang tersedia dalam tooling Slack saat ini:
GrupDefault
messagesenabled
reactionsenabled
pinsenabled
memberInfoenabled
emojiListenabled
Action pesan Slack saat ini mencakup send, upload-file, download-file, read, edit, delete, pin, unpin, list-pins, member-info, dan emoji-list.

Kontrol akses dan routing

channels.slack.dmPolicy mengontrol akses DM (legacy: channels.slack.dm.policy):
  • pairing (default)
  • allowlist
  • open (memerlukan channels.slack.allowFrom untuk menyertakan "*"; legacy: channels.slack.dm.allowFrom)
  • disabled
Flag DM:
  • dm.enabled (default true)
  • channels.slack.allowFrom (disarankan)
  • dm.allowFrom (legacy)
  • dm.groupEnabled (default false untuk DM grup)
  • dm.groupChannels (allowlist MPIM opsional)
Prioritas multi-akun:
  • channels.slack.accounts.default.allowFrom hanya berlaku untuk akun default.
  • Akun bernama mewarisi channels.slack.allowFrom saat allowFrom milik mereka sendiri tidak diatur.
  • Akun bernama tidak mewarisi channels.slack.accounts.default.allowFrom.
Pairing di DM menggunakan openclaw pairing approve slack <code>.

Threading, session, dan tag balasan

  • DM dirutekan sebagai direct; channel sebagai channel; MPIM sebagai group.
  • Dengan default session.dmScope=main, DM Slack digabungkan ke session utama agent.
  • Session channel: agent:<agentId>:slack:channel:<channelId>.
  • Balasan thread dapat membuat sufiks session thread (:thread:<threadTs>) jika berlaku.
  • Default channels.slack.thread.historyScope adalah thread; default thread.inheritParent adalah false.
  • channels.slack.thread.initialHistoryLimit mengontrol berapa banyak pesan thread yang sudah ada diambil ketika session thread baru dimulai (default 20; atur 0 untuk menonaktifkan).
  • channels.slack.thread.requireExplicitMention (default false): saat true, menekan mention thread implisit sehingga bot hanya merespons mention @bot eksplisit di dalam thread, bahkan ketika bot sudah berpartisipasi dalam thread tersebut. Tanpa ini, balasan dalam thread yang diikuti bot melewati gate 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>]]
Catatan: replyToMode="off" menonaktifkan semua threading balasan 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 dalam alur chat utama.

Reaksi ack

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

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 yang dipotong per chunk.
  • progress: tampilkan teks status progres saat menghasilkan, lalu kirim teks final.
channels.slack.streaming.nativeTransport mengontrol streaming teks native Slack saat channels.slack.streaming.mode adalah partial (default: true).
  • Thread balasan harus tersedia agar streaming teks native dan status thread asisten Slack dapat muncul. Pemilihan thread tetap mengikuti replyToMode.
  • Root channel dan group chat tetap dapat menggunakan pratinjau draf normal saat streaming native tidak tersedia.
  • DM Slack tingkat atas tetap off-thread secara default, sehingga tidak menampilkan pratinjau bergaya thread; gunakan balasan thread atau typingReaction jika Anda ingin progres terlihat di sana.
  • Payload media dan non-teks akan fallback ke pengiriman normal.
  • Jika streaming gagal di tengah balasan, OpenClaw akan fallback ke pengiriman normal untuk payload yang tersisa.
Gunakan pratinjau draf alih-alih streaming teks native Slack:
{
  channels: {
    slack: {
      streaming: {
        mode: "partial",
        nativeTransport: false,
      },
    },
  },
}
Key legacy:
  • channels.slack.streamMode (replace | status_final | append) dimigrasikan otomatis ke channels.slack.streaming.mode.
  • boolean channels.slack.streaming dimigrasikan otomatis ke channels.slack.streaming.mode dan channels.slack.streaming.nativeTransport.
  • channels.slack.nativeStreaming legacy dimigrasikan otomatis ke channels.slack.streaming.nativeTransport.

Fallback reaksi mengetik

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

Media, chunking, dan pengiriman

Lampiran file Slack diunduh dari URL privat yang di-host Slack (alur permintaan yang diautentikasi token) dan ditulis ke media store ketika pengambilan berhasil dan batas ukuran mengizinkan.Batas ukuran inbound 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 terlebih dahulu
  • pengiriman file menggunakan API upload Slack dan dapat menyertakan balasan thread (thread_ts)
  • batas media outbound mengikuti channels.slack.mediaMaxMb saat dikonfigurasi; jika tidak, pengiriman channel menggunakan default jenis MIME dari pipeline media
Target eksplisit yang disarankan:
  • user:<id> untuk DM
  • channel:<id> untuk channel
DM Slack dibuka melalui API percakapan Slack saat mengirim ke target pengguna.

Perintah dan perilaku slash

Slash command muncul di Slack sebagai satu perintah terkonfigurasi 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 pada aplikasi Slack Anda dan diaktifkan dengan channels.slack.commands.native: true atau commands.native: true pada konfigurasi global.
  • Mode otomatis perintah native adalah off 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: external select dengan pemfilteran opsi async saat handler opsi interaktivitas tersedia
  • batas Slack terlampaui: nilai opsi yang dienkode fallback ke tombol
/think
Session slash menggunakan key terisolasi seperti agent:<agentId>:slack:slash:<userId> dan tetap merutekan eksekusi perintah ke session percakapan target menggunakan CommandTargetSessionKey.

Balasan interaktif

Slack dapat merender kontrol balasan interaktif yang ditulis agent, 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, agent dapat mengeluarkan directive balasan khusus Slack:
  • [[slack_buttons: Approve:approve, Reject:reject]]
  • [[slack_select: Choose a target | Canary:canary, Production:production]]
Directive ini dikompilasi menjadi Slack Block Kit dan merutekan klik atau pilihan kembali melalui jalur event interaksi Slack yang ada. Catatan:
  • 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 dihasilkan OpenClaw, bukan nilai mentah yang ditulis agent.
  • Jika blok interaktif yang dihasilkan melebihi batas Slack Block Kit, OpenClaw akan fallback 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 fallback ke UI Web atau terminal.
  • Persetujuan exec menggunakan channels.slack.execApprovals.* untuk routing DM/channel 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 approver tetap ditegakkan: hanya pengguna yang diidentifikasi sebagai approver yang dapat menyetujui atau menolak permintaan melalui Slack.
Ini menggunakan permukaan tombol persetujuan bersama yang sama seperti channel lain. Saat interactivity diaktifkan di pengaturan aplikasi Slack Anda, prompt persetujuan dirender sebagai tombol Block Kit langsung di percakapan. Saat tombol tersebut ada, tombol itu menjadi UX persetujuan utama; OpenClaw seharusnya hanya menyertakan perintah /approve manual saat hasil tool menyatakan persetujuan chat tidak tersedia atau persetujuan manual adalah satu-satunya jalur. Path konfigurasi:
  • channels.slack.execApprovals.enabled
  • channels.slack.execApprovals.approvers (opsional; fallback ke commands.ownerAllowFrom bila 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 approver berhasil diselesaikan. Atur enabled: false untuk menonaktifkan Slack sebagai klien persetujuan native secara eksplisit. Atur enabled: true untuk memaksa persetujuan native aktif saat approver berhasil diselesaikan. Perilaku default tanpa konfigurasi persetujuan exec Slack yang eksplisit:
{
  commands: {
    ownerAllowFrom: ["slack:U12345678"],
  },
}
Konfigurasi native Slack eksplisit hanya diperlukan saat Anda ingin menimpa approver, menambahkan filter, atau memilih pengiriman ke chat asal:
{
  channels: {
    slack: {
      execApprovals: {
        enabled: true,
        approvers: ["U12345678"],
        target: "both",
      },
    },
  },
}
Penerusan bersama approvals.exec bersifat terpisah. Gunakan itu hanya saat prompt persetujuan exec juga harus dirutekan ke chat lain atau target out-of-band yang eksplisit. Penerusan bersama approvals.plugin juga terpisah; tombol native Slack tetap dapat menyelesaikan persetujuan plugin saat permintaan tersebut sudah masuk ke Slack. /approve di chat yang sama juga berfungsi di channel dan DM Slack yang sudah mendukung perintah. Lihat Exec approvals untuk model penerusan persetujuan lengkap.

Event dan perilaku operasional

  • Edit/hapus pesan/thread broadcast dipetakan ke system event.
  • Event tambah/hapus reaksi dipetakan ke system event.
  • Event anggota masuk/keluar, channel dibuat/diubah namanya, dan tambah/hapus pin dipetakan ke system event.
  • channel_id_changed dapat memigrasikan key konfigurasi channel saat configWrites diaktifkan.
  • Metadata topik/tujuan channel diperlakukan sebagai konteks tidak tepercaya dan dapat disuntikkan ke konteks routing.
  • Pemula thread dan penyemaian konteks riwayat thread awal difilter oleh allowlist pengirim yang dikonfigurasi bila berlaku.
  • Aksi blok dan interaksi modal mengeluarkan system event terstruktur Slack interaction: ... dengan field payload yang kaya:
    • aksi blok: nilai terpilih, label, nilai picker, dan metadata workflow_*
    • event modal view_submission dan view_closed dengan metadata channel yang dirutekan dan input formulir

Pointer 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 nonaktif kecuali diperlukan)
    • akses channel: groupPolicy, channels.*, channels.*.users, channels.*.requireMention
    • threading/riwayat: replyToMode, replyToModeByChatType, thread.*, historyLimit, dmHistoryLimit, dms.*.historyLimit
    • pengiriman: textChunkLimit, chunkMode, mediaMaxMb, streaming, streaming.nativeTransport
    • operasi/fitur: configWrites, commands.native, slashCommand.*, actions.*, userToken, userTokenReadOnly

Pemecahan masalah

Periksa, secara berurutan:
  • groupPolicy
  • allowlist channel (channels.slack.channels)
  • requireMention
  • allowlist users per channel
Perintah yang 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
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 tersebut telah dikonfigurasi tetapi runtime saat ini tidak dapat menyelesaikan nilai yang didukung SecretRef.
Validasi:
  • signing secret
  • path webhook
  • URL Permintaan Slack (Events + Interactivity + Slash Commands)
  • webhookPath unik per akun HTTP
Jika signingSecretStatus: "configured_unavailable" muncul di snapshot akun, akun HTTP telah dikonfigurasi tetapi runtime saat ini tidak dapat menyelesaikan signing secret yang didukung SecretRef.
Verifikasi apakah yang Anda maksud adalah:
  • mode perintah native (channels.slack.commands.native: true) dengan slash command yang cocok terdaftar di Slack
  • atau mode slash command tunggal (channels.slack.slashCommand.enabled: true)
Periksa juga commands.useAccessGroups dan allowlist channel/pengguna.

Terkait