Langsung ke konten utama

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

1

Create Slack app and tokens

Di pengaturan aplikasi Slack:
  • aktifkan Socket Mode
  • buat App Token (xapp-...) dengan connections:write
  • instal aplikasi dan salin Bot Token (xoxb-...)
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

Subscribe app events

Subscribe event bot untuk:
  • app_mention
  • message.channels, message.groups, message.im, message.mpim
  • reaction_added, reaction_removed
  • member_joined_channel, member_left_channel
  • channel_rename
  • pin_added, pin_removed
Aktifkan juga App Home Messages Tab untuk DM.
4

Start gateway

openclaw gateway

Checklist manifest dan scope

Slack app manifest example

{
  "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"
      ]
    }
  }
}
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 wajib untuk Socket Mode.
  • Mode HTTP memerlukan botToken + signingSecret.
  • botToken, appToken, signingSecret, dan userToken menerima string plaintext atau objek SecretRef.
  • Token config menimpa fallback env.
  • Fallback env SLACK_BOT_TOKEN / SLACK_APP_TOKEN hanya berlaku untuk akun default.
  • userToken (xoxp-...) hanya config-only (tanpa fallback env) dan default ke perilaku read-only (userTokenReadOnly: true).
  • Opsional: tambahkan chat:write.customize jika Anda ingin pesan keluar menggunakan identitas agen aktif (username dan ikon kustom). icon_emoji menggunakan sintaks :emoji_name:.
Perilaku snapshot status:
  • Inspeksi akun Slack melacak field *Source dan *Status per kredensial (botToken, appToken, signingSecret, userToken).
  • Status bernilai 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 wajib adalah botTokenStatus + appTokenStatus.
Untuk tindakan/pembacaan direktori, user token dapat diprioritaskan jika dikonfigurasi. Untuk penulisan, bot token tetap diprioritaskan; penulisan dengan user token hanya diizinkan saat userTokenReadOnly: false dan bot token tidak tersedia.

Tindakan dan gate

Tindakan Slack dikendalikan oleh channels.slack.actions.*. Grup tindakan yang tersedia dalam tooling Slack saat ini:
GrupDefault
messagesenabled
reactionsenabled
pinsenabled
memberInfoenabled
emojiListenabled
Tindakan 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 mengendalikan akses DM (legacy: channels.slack.dm.policy):
  • pairing (default)
  • allowlist
  • open (memerlukan channels.slack.allowFrom mencakup "*"; legacy: channels.slack.dm.allowFrom)
  • disabled
Flag DM:
  • dm.enabled (default true)
  • channels.slack.allowFrom (disarankan)
  • dm.allowFrom (legacy)
  • dm.groupEnabled (group DM default false)
  • 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 miliknya sendiri tidak disetel.
  • Akun bernama tidak mewarisi channels.slack.accounts.default.allowFrom.
Pairing di DM menggunakan openclaw pairing approve slack <code>.

Threading, sesi, dan tag balasan

  • DM dirutekan sebagai direct; channel sebagai channel; MPIM sebagai group.
  • 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.historyScope adalah thread; default thread.inheritParent adalah false.
  • channels.slack.thread.initialHistoryLimit mengendalikan berapa banyak pesan thread yang sudah ada diambil saat sesi thread baru dimulai (default 20; set 0 untuk menonaktifkan).
Kontrol reply threading:
  • channels.slack.replyToMode: off|first|all (default off)
  • channels.slack.replyToModeByChatType: per direct|group|channel
  • fallback legacy untuk obrolan langsung: channels.slack.dm.replyToMode
Tag balasan manual didukung:
  • [[reply_to_current]]
  • [[reply_to:<id>]]
Catatan: 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>.ackReaction
  • channels.slack.ackReaction
  • messages.ackReaction
  • fallback emoji identitas agen (agents.list[].identity.emoji, jika tidak ada gunakan ”👀”)
Catatan:
  • 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.
Gunakan pratinjau draf alih-alih streaming teks native Slack:
{
  channels: {
    slack: {
      streaming: "partial",
      nativeStreaming: false,
    },
  },
}
Key legacy:
  • channels.slack.streamMode (replace | status_final | append) dimigrasikan otomatis ke channels.slack.streaming.
  • boolean channels.slack.streaming dimigrasikan otomatis ke channels.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>.typingReaction
  • channels.slack.typingReaction
Catatan:
  • 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

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.
  • 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.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

  • 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 global commands.native: true).
  • Saat perintah native diaktifkan, daftarkan slash command yang sesuai di Slack (nama /<command>), dengan satu pengecualian:
    • daftarkan /agentstatus untuk perintah status (Slack mencadangkan /status)
  • 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.
Pengaturan default slash command:
  • enabled: false
  • name: "openclaw"
  • sessionPrefix: "slack:slash"
  • ephemeral: true
Sesi slash menggunakan key terisolasi:
  • agent:<agentId>:slack:slash:<userId>
dan tetap merutekan eksekusi perintah terhadap sesi percakapan target (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 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 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.
Ini menggunakan surface 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, 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.enabled
  • channels.slack.execApprovals.approvers (opsional; fallback ke commands.ownerAllowFrom jika memungkinkan)
  • channels.slack.execApprovals.target (dm | channel | both, default: dm)
  • agentFilter, sessionFilter
Slack otomatis mengaktifkan persetujuan exec native saat 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:
{
  commands: {
    ownerAllowFrom: ["slack:U12345678"],
  },
}
Config 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",
      },
    },
  },
}
Forwarding bersama 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_changed dapat memigrasikan key config channel saat configWrites diaktifkan.
  • 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_submission dan view_closed dengan metadata channel yang dirutekan dan input formulir

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

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 + 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.
Validasi:
  • signing secret
  • path webhook
  • Slack Request URL (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 sesuai terdaftar di Slack
  • atau mode single slash command (channels.slack.slashCommand.enabled: true)
Periksa juga commands.useAccessGroups dan allowlist channel/pengguna.

Terkait