Gateway
Konfigurasi — saluran
Kunci konfigurasi per kanal di bawah channels.*: akses DM dan grup, penyiapan multiakun, pembatasan berdasarkan penyebutan, serta kunci per kanal untuk Slack, Discord, Telegram, WhatsApp, Matrix, iMessage, dan Plugin kanal lainnya.
Untuk agen, alat, runtime gateway, dan kunci tingkat teratas lainnya, lihat Referensi konfigurasi.
Kanal
Setiap kanal dimulai secara otomatis saat bagian konfigurasinya tersedia (kecuali enabled: false). Telegram dan iMessage disertakan dalam paket inti openclaw. Kanal resmi lainnya (Discord, Slack, WhatsApp, Matrix, Microsoft Teams, IRC, Google Chat, Signal, Mattermost, dan lainnya) dipasang sebagai Plugin terpisah dengan openclaw plugins install <spec>; lihat Kanal untuk daftar lengkap dan spesifikasi pemasangan.
Akses DM dan grup
Semua kanal mendukung kebijakan DM dan kebijakan grup:
| Kebijakan DM | Perilaku |
|---|---|
pairing (bawaan) |
Pengirim tak dikenal menerima kode pemasangan satu kali; pemilik harus menyetujuinya |
allowlist |
Hanya pengirim dalam allowFrom (atau penyimpanan izin yang telah dipasangkan) |
open |
Izinkan semua DM masuk (memerlukan allowFrom: ["*"]) |
disabled |
Abaikan semua DM masuk |
| Kebijakan grup | Perilaku |
|---|---|
allowlist (bawaan) |
Hanya grup yang cocok dengan daftar izin yang dikonfigurasi |
open |
Lewati daftar izin grup (pembatasan berdasarkan penyebutan tetap berlaku) |
disabled |
Blokir semua pesan grup/ruang |
Penggantian model kanal
Gunakan channels.modelByChannel untuk menetapkan ID kanal tertentu atau rekan pesan langsung ke suatu model. Nilai menerima provider/model atau alias model yang dikonfigurasi. Pemetaan kanal hanya berlaku saat sesi belum memiliki penggantian model aktif (misalnya, yang ditetapkan melalui /model).
Untuk percakapan grup/utas, kuncinya berupa ID grup, ID topik, atau nama kanal yang spesifik untuk kanal tersebut. Untuk percakapan pesan langsung (DM), kuncinya berupa pengidentifikasi rekan yang berasal dari identitas pengirim kanal (nativeDirectUserId, origin.from, origin.to, OriginatingTo, From, atau SenderId). Bentuk kunci yang tepat bergantung pada kanal:
| Kanal | Bentuk kunci DM | Contoh |
|---|---|---|
| Discord | ID pengguna mentah | 987654321 |
| Feishu | feishu:ou_... |
feishu:ou_a8b6cab7e945387de5f253775d9b4d85 |
| Matrix | ID pengguna Matrix | @user:matrix.org |
| Slack | user:U... |
user:U12345 |
| Telegram | ID pengguna mentah | 123456789 |
| nomor telepon atau JID | 15551234567 |
{ channels: { modelByChannel: { discord: { "123456789012345678": "anthropic/claude-opus-4-6", }, slack: { C1234567890: "openai/gpt-5.6-sol", "user:U12345": "openai/gpt-5.4-mini", }, telegram: { "-1001234567890": "openai/gpt-5.4-mini", "-1001234567890:topic:99": "anthropic/claude-sonnet-4-6", "123456789": "openai/gpt-4.1", }, }, },}Kunci khusus DM hanya cocok dalam percakapan pesan langsung; kunci tersebut tidak memengaruhi perutean grup/utas.
Nilai bawaan kanal dan heartbeat
Gunakan channels.defaults untuk perilaku kebijakan grup, penyebutan implisit, dan heartbeat bersama di seluruh penyedia:
{ channels: { defaults: { groupPolicy: "allowlist", // open | allowlist | disabled contextVisibility: "all", // all | allowlist | allowlist_quote implicitMentions: { replyToBot: true, quotedBot: true, threadParticipation: true, }, heartbeat: { showOk: false, showAlerts: true, useIndicator: true, }, }, },}channels.defaults.groupPolicy: kebijakan grup cadangan saatgroupPolicytingkat penyedia belum ditetapkan.channels.defaults.contextVisibility: mode visibilitas konteks tambahan bawaan untuk semua kanal. Nilai:all(bawaan, sertakan semua konteks kutipan/utas/riwayat),allowlist(hanya sertakan konteks dari pengirim dalam daftar izin),allowlist_quote(sama seperti daftar izin, tetapi pertahankan konteks kutipan/balasan eksplisit). Penggantian per kanal:channels.<channel>.contextVisibility.channels.defaults.implicitMentions: mengontrol fakta masuk yang didukung dan dianggap sebagai penyebutan.replyToBot,quotedBot, danthreadParticipationmasing-masing memiliki nilai bawaantrue, sehingga mempertahankan perilaku saat ini. Ganti per kanal denganchannels.<channel>.implicitMentionsatau per akun denganchannels.<channel>.accounts.<id>.implicitMentions; setiap tanda diselesaikan secara independen dalam urutan akun -> kanal -> nilai bawaan. Namanya bersifat positif: tetapkan tanda kefalseagar fakta tersebut tidak lagi melewati pembatasan berdasarkan penyebutan. Penyebutan eksplisit native selalu diizinkan, dan suatu tanda tidak berpengaruh jika kanal tidak menghasilkan fakta tersebut. Lihat Pembatasan berdasarkan penyebutan untuk matriks penghasil saat ini. Pengaturan ini tidak mengubah mode balasan/utas keluar atau penanganan perintah yang diotorisasi.channels.defaults.heartbeat.showOk: sertakan status kanal yang sehat dalam keluaran heartbeat (bawaanfalse).channels.defaults.heartbeat.showAlerts: sertakan status terdegradasi/kesalahan dalam keluaran heartbeat (bawaantrue).channels.defaults.heartbeat.useIndicator: render keluaran heartbeat ringkas bergaya indikator (bawaantrue).
WhatsApp berjalan melalui kanal web gateway (Baileys Web). Kanal ini dimulai secara otomatis saat tersedia sesi tertaut.
{ web: { enabled: true, }, channels: { whatsapp: { dmPolicy: "pairing", // pairing | allowlist | open | disabled allowFrom: ["+15555550123", "+447700900123"], textChunkLimit: 4000, streaming: { chunkMode: "length" }, // length | newline mediaMaxMb: 50, sendReadReceipts: true, // centang biru (false dalam mode obrolan mandiri) groups: { "*": { requireMention: true }, }, groupPolicy: "allowlist", groupAllowFrom: ["+15551234567"], }, },}- Entri
bindings[]tingkat teratas dengantype: "acp"mengonfigurasi pengikatan ACP persisten untuk DM dan grup WhatsApp. Gunakan nomor langsung E.164 atau JID grup WhatsApp dalammatch.peer.id. Semantik bidang digunakan bersama dalam Agen ACP.
WhatsApp multiakun
{channels: { whatsapp: { accounts: { default: {}, personal: {}, biz: { // authDir: "~/.openclaw/credentials/whatsapp/biz", }, }, },},}- Perintah keluar menggunakan akun
defaultsecara bawaan jika tersedia; jika tidak, ID akun pertama yang dikonfigurasi (diurutkan). channels.whatsapp.defaultAccountopsional mengganti pemilihan akun bawaan cadangan tersebut jika cocok dengan ID akun yang dikonfigurasi.- Direktori autentikasi Baileys satu akun lama dimigrasikan oleh
openclaw doctorkewhatsapp/default. - Penggantian per akun:
channels.whatsapp.accounts.<id>.sendReadReceipts,channels.whatsapp.accounts.<id>.dmPolicy,channels.whatsapp.accounts.<id>.allowFrom.
Telegram
{ channels: { telegram: { enabled: true, botToken: "your-bot-token", dmPolicy: "pairing", allowFrom: ["tg:123456789"], groups: { "*": { requireMention: true }, "-1001234567890": { allowFrom: ["@admin"], systemPrompt: "Keep answers brief.", topics: { "99": { requireMention: false, skills: ["search"], systemPrompt: "Stay on topic.", }, }, }, }, customCommands: [ { command: "backup", description: "Git backup" }, { command: "generate", description: "Create an image" }, ], historyLimit: 50, replyToMode: "first", // off | first | all | batched linkPreview: true, streaming: { mode: "partial" }, // off | partial | block | progress (default: partial) actions: { reactions: true, sendMessage: true }, reactionNotifications: "own", // off | own | all mediaMaxMb: 100, retry: { attempts: 3, minDelayMs: 400, maxDelayMs: 30000, jitter: 0.1, }, network: { autoSelectFamily: true, dnsResultOrder: "ipv4first", }, apiRoot: "https://api.telegram.org", trustedLocalFileRoots: ["/srv/telegram-bot-api-data"], proxy: "socks5://localhost:9050", webhookUrl: "https://example.com/telegram-webhook", webhookSecret: "secret", webhookPath: "/telegram-webhook", }, },}- Token bot:
channels.telegram.botTokenatauchannels.telegram.tokenFile(hanya berkas biasa; symlink ditolak), denganTELEGRAM_BOT_TOKENsebagai cadangan untuk akun bawaan. apiRoothanya merupakan root Telegram Bot API. Gunakanhttps://api.telegram.orgatau root yang dihosting sendiri/proksi Anda, bukanhttps://api.telegram.org/bot<TOKEN>;openclaw doctor --fixmenghapus akhiran/bot<TOKEN>yang ditambahkan tanpa sengaja.- Untuk server Bot API yang dihosting sendiri dalam mode
--local,trustedLocalFileRootsmencantumkan jalur host yang boleh dibaca OpenClaw. Kaitkan volume data server pada host OpenClaw dan konfigurasikan root datanya atau direktori per token; jalur kontainer di bawah/var/lib/telegram-bot-apidipetakan ke root tersebut. Jalur absolut lainnya tetap ditolak. channels.telegram.defaultAccountopsional mengganti pemilihan akun bawaan jika cocok dengan ID akun yang dikonfigurasi.- Dalam penyiapan multiakun (2+ ID akun), tetapkan akun bawaan eksplisit (
channels.telegram.defaultAccountatauchannels.telegram.accounts.default) untuk menghindari perutean cadangan;openclaw doctormemberikan peringatan jika nilai ini tidak ada atau tidak valid. configWrites: falsememblokir penulisan konfigurasi yang dimulai oleh Telegram (migrasi ID supergrup,/config set|unset).- Entri
bindings[]tingkat teratas dengantype: "acp"mengonfigurasi pengikatan ACP persisten untuk topik forum (gunakanchatId:topic:topicIdkanonis dalammatch.peer.id). Semantik bidang digunakan bersama dalam Agen ACP. - Pratinjau streaming Telegram menggunakan
sendMessage+editMessageText(berfungsi dalam obrolan langsung dan grup). network.dnsResultOrdermemiliki nilai bawaan"ipv4first"untuk menghindari kegagalan pengambilan IPv6 yang umum.- Kebijakan percobaan ulang: lihat Kebijakan percobaan ulang.
Discord
{ channels: { discord: { enabled: true, token: "your-bot-token", mediaMaxMb: 100, allowBots: false, actions: { reactions: true, stickers: true, polls: true, permissions: true, messages: true, threads: true, pins: true, search: true, memberInfo: true, roleInfo: true, roles: false, channelInfo: true, voiceStatus: true, events: true, moderation: false, }, replyToMode: "off", // off | first | all | batched dmPolicy: "pairing", allowFrom: ["1234567890", "123456789012345678"], dm: { enabled: true, groupEnabled: false, groupChannels: ["openclaw-dm"] }, guilds: { "123456789012345678": { slug: "friends-of-openclaw", requireMention: false, ignoreOtherMentions: true, reactionNotifications: "own", users: ["987654321098765432"], channels: { general: { allow: true }, help: { allow: true, requireMention: true, users: ["987654321098765432"], skills: ["docs"], systemPrompt: "Short answers only.", }, }, }, }, historyLimit: 20, textChunkLimit: 2000, suppressEmbeds: true, streaming: { mode: "progress", // off | partial | block | progress (Discord default: progress) chunkMode: "length", // length | newline progress: { label: "auto", maxLines: 8, maxLineChars: 120, toolProgress: true, }, }, maxLinesPerMessage: 17, ui: { components: { accentColor: "#5865F2", }, }, threadBindings: { enabled: true, idleHours: 24, maxAgeHours: 0, spawnSessions: true, defaultSpawnContext: "fork", }, voice: { enabled: true, autoJoin: [ { guildId: "123456789012345678", channelId: "234567890123456789", }, ], daveEncryption: true, decryptionFailureTolerance: 24, connectTimeoutMs: 30000, reconnectGraceMs: 15000, tts: { provider: "openai", openai: { voice: "alloy" }, }, }, execApprovals: { enabled: "auto", // true | false | "auto" approvers: ["987654321098765432"], agentFilter: ["default"], sessionFilter: ["discord:"], target: "dm", // dm | channel | both cleanupAfterResolve: false, }, retry: { attempts: 3, minDelayMs: 500, maxDelayMs: 30000, jitter: 0.1, }, }, },}- Token:
channels.discord.token, denganDISCORD_BOT_TOKENsebagai cadangan untuk akun default. - Panggilan keluar langsung yang menyediakan
tokenDiscord secara eksplisit menggunakan token tersebut untuk panggilan; pengaturan percobaan ulang/kebijakan akun tetap berasal dari akun yang dipilih dalam snapshot runtime aktif. channels.discord.defaultAccountopsional mengganti pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi.- Gunakan
user:<id>(DM) atauchannel:<id>(kanal guild) untuk target pengiriman; ID numerik tanpa awalan ditolak. - Slug guild menggunakan huruf kecil dengan spasi diganti oleh
-; kunci kanal menggunakan nama yang dijadikan slug (tanpa#). Utamakan ID guild. - Pesan yang dibuat bot diabaikan secara default.
allowBots: truemengaktifkannya; gunakanallowBots: "mentions"agar hanya menerima pesan bot yang menyebut bot tersebut (pesan sendiri tetap difilter). - Kanal yang mendukung pesan masuk buatan bot dapat menggunakan perlindungan loop bot bersama. Tetapkan
channels.defaults.botLoopProtectionuntuk anggaran pasangan dasar, lalu ganti pada kanal atau akun hanya ketika satu permukaan memerlukan batas yang berbeda. channels.discord.guilds.<id>.ignoreOtherMentions(dan penggantian pada kanal) membuang pesan yang menyebut pengguna atau peran lain tetapi tidak menyebut bot (kecuali @everyone/@here).channels.discord.mentionAliasesmemetakan teks@handlekeluar yang stabil ke ID pengguna Discord sebelum dikirim, sehingga rekan tim yang dikenal dapat disebut secara deterministik bahkan saat cache direktori sementara kosong. Penggantian per akun berada di bawahchannels.discord.accounts.<accountId>.mentionAliases.maxLinesPerMessage(default17) membagi pesan yang tinggi meskipun panjangnya di bawah 2000 karakter.channels.discord.suppressEmbedssecara default bernilaitrue, sehingga URL keluar tidak diperluas menjadi pratinjau tautan Discord kecuali dinonaktifkan. Payloadembedseksplisit tetap dikirim seperti biasa; panggilan alat per pesan dapat menggantinya dengansuppressEmbeds.channels.discord.threadBindingsmengontrol perutean Discord yang terikat ke utas:enabled: penggantian Discord untuk fitur sesi yang terikat ke utas (/focus,/unfocus,/agents,/session idle,/session max-age, serta pengiriman/perutean terikat)idleHours: penggantian Discord untuk pelepasan fokus otomatis akibat ketidakaktifan dalam jam (0menonaktifkan)maxAgeHours: penggantian Discord untuk usia maksimum absolut dalam jam (0menonaktifkan)spawnSessions: sakelar untuk pembuatan/pengikatan utas otomatis olehsessions_spawn({ thread: true })dan pemunculan utas ACP (default:true)defaultSpawnContext: konteks subagen native untuk pemunculan yang terikat ke utas (default"fork")
- Entri
bindings[]tingkat teratas dengantype: "acp"mengonfigurasi pengikatan ACP persisten untuk kanal dan utas (gunakan ID kanal/utas dalammatch.peer.id). Semantik bidang digunakan bersama dalam Agen ACP. channels.discord.ui.components.accentColormenetapkan warna aksen untuk kontainer komponen Discord v2.channels.discord.agentComponents.ttlMsmengontrol berapa lama callback komponen Discord yang dikirim tetap terdaftar. Default1800000(30 menit), maksimum86400000(24 jam). Penggantian per akun berada di bawahchannels.discord.accounts.<accountId>.agentComponents.ttlMs. Utamakan TTL terpendek yang sesuai dengan alur kerja.channels.discord.voicemengaktifkan percakapan kanal suara Discord serta penggantian opsional untuk bergabung otomatis + LLM + TTS. Konfigurasi Discord khusus teks menonaktifkan suara secara default; tetapkanchannels.discord.voice.enabled=trueuntuk mengaktifkannya.channels.discord.voice.modelsecara opsional mengganti model LLM yang digunakan untuk respons kanal suara Discord.channels.discord.voice.daveEncryption(defaulttrue) danchannels.discord.voice.decryptionFailureTolerance(default24) diteruskan ke opsi DAVE@discordjs/voice.channels.discord.voice.connectTimeoutMsmengontrol waktu tunggu Ready@discordjs/voiceawal untuk/vc joindan upaya bergabung otomatis (default30000).channels.discord.voice.reconnectGraceMsmengontrol berapa lama sesi suara yang terputus boleh memerlukan waktu untuk memasuki pensinyalan penyambungan ulang sebelum OpenClaw menghancurkannya (default15000).- Pemutaran suara Discord tidak dihentikan oleh peristiwa mulai berbicara pengguna lain. Untuk menghindari loop umpan balik, OpenClaw mengabaikan tangkapan suara baru saat TTS sedang diputar.
- OpenClaw juga mencoba memulihkan penerimaan suara dengan keluar dari lalu bergabung kembali ke sesi suara setelah kegagalan dekripsi berulang.
channels.discord.streamingadalah kunci mode streaming kanonis. Discord secara default menggunakanstreaming.mode: "progress"agar progres alat/pekerjaan muncul dalam satu pesan pratinjau yang diedit; tetapkanstreaming.mode: "off"untuk menonaktifkannya. Kunci datar lama (streamMode,chunkMode,blockStreaming,draftChunk,blockStreamingCoalesce) tidak lagi dibaca saat runtime; jalankanopenclaw doctor --fixuntuk memigrasikan konfigurasi persisten.channels.discord.autoPresencememetakan ketersediaan runtime ke kehadiran bot (sehat => online, terdegradasi => idle, habis => dnd) dan memungkinkan penggantian teks status opsional.channels.discord.guilds.<id>.presenceEventsmerutekan kedatangan ketersediaan manusia ke satu kanal Discord yang dikonfigurasi sebagai peristiwa sistem agen. Anggota yang memenuhi syarat harus dapat melihatchannelId; utas publik mewarisi visibilitas induk, sedangkan utas privat juga memerlukan keanggotaan atau Manage Threads.usersdapat semakin mempersempit audiens tersebut. Fitur ini mengisi anggota yang sedang online dari snapshotGUILD_CREATElengkap, merutekan transisi offline-ke-online yang teramati, dan memperlakukan sinyal online pertama yang muncul kemudian bagi anggota yang belum pernah terlihat sebagai baru tersedia tanpa menyatakan apakah mereka menjadi online atau bergabung setelah snapshot. Guild yang melampaui batas snapshot Discord sebesar 75.000 anggota memerlukan pembaruan offline eksplisit terlebih dahulu. Pengaturan pembatasan:reconnectSuppressSeconds(jendela hening setelah sesi Gateway baru saat status kehadiran guild dibangun ulang, default 300,0menonaktifkan) danburstLimit/burstWindowSeconds(batas laju per guild untuk peristiwa yang berhasil dimasukkan ke antrean, default 8 peristiwa per jendela geser 60 detik). Sesi yang dilanjutkan tidak memulai jendela penekanan penyambungan ulang. Masa jeda penyambutan ulang per pengguna yang ada tetap delapan jam. Fitur ini memerlukanchannels.discord.intents.presence=true, Presence Intent dengan hak istimewa di Developer Portal Discord, serta Heartbeat agen yang diaktifkan.channels.discord.dangerouslyAllowNameMatchingmengaktifkan kembali pencocokan nama/tag yang dapat berubah (mode kompatibilitas darurat).channels.discord.execApprovals: pengiriman persetujuan eksekusi native Discord dan otorisasi pemberi persetujuan.enabled:true,false, atau"auto"(default). Dalam mode otomatis, persetujuan eksekusi aktif ketika pemberi persetujuan dapat ditentukan dariapproversataucommands.ownerAllowFrom.approvers: ID pengguna Discord yang diizinkan menyetujui permintaan eksekusi. Menggunakancommands.ownerAllowFromsebagai cadangan jika dihilangkan.agentFilter: daftar izin ID agen opsional. Hilangkan untuk meneruskan persetujuan bagi semua agen.sessionFilter: pola kunci sesi opsional (substring atau regex).target: tempat mengirim prompt persetujuan."dm"(default) mengirim ke DM pemberi persetujuan,"channel"mengirim ke kanal asal,"both"mengirim ke keduanya. Ketika target mencakup"channel", tombol hanya dapat digunakan oleh pemberi persetujuan yang telah ditentukan.cleanupAfterResolve: ketikatrue, menghapus DM persetujuan setelah disetujui, ditolak, atau waktu habis.
Mode notifikasi reaksi: off (tidak ada), own (pesan bot, default), all (semua pesan), allowlist (dari guilds.<id>.users pada semua pesan).
Google Chat
{ channels: { googlechat: { enabled: true, serviceAccountFile: "/path/to/service-account.json", audienceType: "app-url", // app-url | project-number audience: "https://gateway.example.com/googlechat", webhookPath: "/googlechat", botUser: "users/1234567890", dm: { enabled: true, policy: "pairing", allowFrom: ["users/1234567890"], }, groupPolicy: "allowlist", groups: { "spaces/AAAA": { allow: true, requireMention: true }, }, actions: { reactions: true }, typingIndicator: "message", mediaMaxMb: 20, }, },}- JSON akun layanan: inline (
serviceAccount) atau berbasis berkas (serviceAccountFile). - SecretRef akun layanan juga didukung (
serviceAccountRef). - Cadangan variabel lingkungan:
GOOGLE_CHAT_SERVICE_ACCOUNTatauGOOGLE_CHAT_SERVICE_ACCOUNT_FILE(khusus akun default). - Gunakan
spaces/<spaceId>atauusers/<userId>untuk target pengiriman. channels.googlechat.dangerouslyAllowNameMatchingmengaktifkan kembali pencocokan prinsipal email yang dapat berubah (mode kompatibilitas darurat).
Slack
{ channels: { slack: { enabled: true, botToken: "xoxb-...", appToken: "xapp-...", socketMode: { clientPingTimeout: 15000, serverPingTimeout: 30000, pingPongLoggingEnabled: false, }, dmPolicy: "pairing", allowFrom: ["U123", "U456", "*"], dm: { enabled: true, groupEnabled: false, groupChannels: ["G123"] }, channels: { C123: { enabled: true, requireMention: true, allowBots: false }, "#general": { enabled: true, requireMention: true, allowBots: false, users: ["U123"], skills: ["docs"], systemPrompt: "Hanya jawaban singkat.", }, }, historyLimit: 50, allowBots: false, reactionNotifications: "own", reactionAllowlist: ["U123"], replyToMode: "off", // nonaktif | pertama | semua | dikelompokkan thread: { historyScope: "thread", // utas | kanal inheritParent: false, initialHistoryLimit: 20, }, actions: { reactions: true, messages: true, pins: true, memberInfo: true, emojiList: true, }, slashCommand: { enabled: true, name: "openclaw", sessionPrefix: "slack:slash", ephemeral: true, }, typingReaction: "hourglass_flowing_sand", unfurlLinks: false, unfurlMedia: false, textChunkLimit: 4000, streaming: { mode: "partial", // nonaktif | sebagian | blok | progres chunkMode: "length", // panjang | baris baru nativeTransport: true, // gunakan API streaming native Slack saat mode=partial }, mediaMaxMb: 20, execApprovals: { enabled: "auto", // true | false | "auto" approvers: ["U123"], agentFilter: ["default"], sessionFilter: ["slack:"], target: "dm", // dm | kanal | keduanya }, }, },}- Mode Socket memerlukan
botTokendanappToken(SLACK_BOT_TOKEN+SLACK_APP_TOKENuntuk fallback lingkungan akun default). - Mode HTTP memerlukan
botTokensertasigningSecret(di tingkat root atau per akun). - Identitas pengguna (
identity: "user") mengirim dan membaca sebagai manusia yang memberikan otorisasi. Ini memerlukanuserTokensertaappTokendalam Mode Socket, atauuserTokensertasigningSecretdalam mode HTTP. Token bot atau pengguna bot tidak diperlukan. Lihat Identitas pengguna untuk cakupan pengguna dan langganan peristiwa. enterpriseOrgInstall: truemengikutsertakan akun ke jalur peristiwa tingkat organisasi Slack Enterprise Grid. Saat dimulai, token bot diverifikasi denganauth.testdan proses gagal ketika mode yang dikonfigurasi tidak cocok dengan identitas instalasi Slack. DM Enterprise harus dinonaktifkan atau menggunakandmPolicy: "open"denganallowFrom: ["*"]yang efektif. Kebijakan kanal dan pengguna harus menggunakan ID Slack yang stabil; nama yang dapat berubah dan prefiks kanal yang tidak didukung akan menggagalkan proses awal. V1 hanya menangani peristiwa Mode Socket langsung atau HTTPmessagedanapp_mentiondengan balasan langsung; relai, perintah, interaksi, App Home, listener peristiwa reaksi, pin, alat tindakan, persetujuan native, pengikatan, pengiriman tertunda, dan pengiriman proaktif tidak tersedia. Pengakuan, indikator pengetikan, dan reaksi status yang dimiliki listener tetap tersedia denganreactions:write; notifikasi reaksi masuk dan alat tindakan reaksi tidak tersedia. Lihat Instalasi tingkat organisasi Enterprise Grid untuk manifes dengan hak akses paling rendah, alur kerja penyiapan, dan batasan lengkap.socketModemeneruskan penyetelan transportasi Mode Socket SDK Slack ke API receiver Bolt publik. Gunakan hanya saat menyelidiki batas waktu ping/pong atau perilaku websocket yang kedaluwarsa.clientPingTimeoutsecara default menggunakan15000;serverPingTimeoutdanpingPongLoggingEnabledhanya diteruskan saat dikonfigurasi.botToken,appToken,signingSecret, danuserTokenmenerima string teks biasa atau objek SecretRef.- Snapshot akun Slack menampilkan bidang sumber/status per kredensial seperti
botTokenSource,botTokenStatus,userTokenSource,userTokenStatus,appTokenStatus, dan, dalam mode HTTP,signingSecretStatus.configured_unavailableberarti akun tersebut dikonfigurasi melalui SecretRef, tetapi jalur perintah/runtime saat ini tidak dapat memperoleh nilai rahasia. configWrites: falsememblokir penulisan konfigurasi yang dimulai oleh Slack.channels.slack.defaultAccountopsional mengganti pemilihan akun default ketika cocok dengan ID akun yang dikonfigurasi.channels.slack.streaming.modeadalah kunci mode streaming Slack kanonis (default"partial").channels.slack.streaming.nativeTransportmengontrol transportasi streaming native Slack (defaulttrue). Nilai lamastreamMode, booleanstreaming,chunkMode,blockStreaming,blockStreamingCoalesce, dannativeStreamingtidak lagi dibaca saat runtime; jalankanopenclaw doctor --fixuntuk memigrasikan konfigurasi tersimpan kestreaming.{mode,chunkMode,block.enabled,block.coalesce,nativeTransport}.unfurlLinksdanunfurlMediameneruskan boolean penguraian pratinjau tautan dan mediachat.postMessagemilik Slack untuk balasan bot.unfurlLinkssecara default menggunakanfalseagar tautan bot keluar tidak diperluas secara inline kecuali diaktifkan;unfurlMediadihilangkan kecuali dikonfigurasi. Tetapkan salah satu nilai padachannels.slack.accounts.<accountId>untuk mengganti nilai tingkat atas bagi satu akun.- Gunakan
user:<id>(DM) atauchannel:<id>untuk target pengiriman.
Mode notifikasi reaksi: off, own (default), all, allowlist (dari reactionAllowlist).
Isolasi sesi utas: thread.historyScope bersifat per utas (default) atau dibagikan di seluruh kanal. thread.inheritParent menyalin transkrip kanal induk ke utas baru. thread.initialHistoryLimit (default 20) membatasi jumlah pesan utas yang sudah ada yang diambil saat sesi utas baru dimulai; 0 menonaktifkan pengambilan riwayat utas.
- Streaming native Slack serta status utas bergaya asisten Slack "sedang mengetik..." memerlukan target utas balasan. DM tingkat atas secara default tetap berada di luar utas, sehingga masih dapat melakukan streaming melalui pratinjau draf kirim-dan-edit Slack alih-alih menampilkan pratinjau streaming/status native bergaya utas.
typingReactionmenambahkan reaksi sementara ke pesan Slack masuk selama balasan diproses, lalu menghapusnya setelah selesai. Gunakan kode pendek emoji Slack seperti"hourglass_flowing_sand".channels.slack.execApprovals: pengiriman klien persetujuan native Slack dan otorisasi pemberi persetujuan eksekusi. Skemanya sama seperti Discord:enabled(true/false/"auto"),approvers(ID pengguna Slack),agentFilter,sessionFilter, dantarget("dm","channel", atau"both"). Persetujuan Plugin dapat menggunakan jalur klien native ini untuk permintaan yang berasal dari Slack ketika pemberi persetujuan Plugin Slack berhasil ditentukan; pengiriman persetujuan Plugin native Slack juga dapat diaktifkan melaluiapprovals.pluginuntuk sesi yang berasal dari Slack atau target Slack. Persetujuan Plugin menggunakan pemberi persetujuan Plugin Slack dariallowFromdan perutean default, bukan pemberi persetujuan eksekusi.
| Grup tindakan | Default | Catatan |
|---|---|---|
| reactions | diaktifkan | Bereaksi + mencantumkan reaksi |
| messages | diaktifkan | Membaca/mengirim/mengedit/menghapus |
| pins | diaktifkan | Menyematkan/melepas sematan/mencantumkan |
| memberInfo | diaktifkan | Informasi anggota |
| emojiList | diaktifkan | Daftar emoji khusus |
Mattermost
Mattermost diinstal sebagai Plugin terpisah, dengan cara yang sama seperti Discord, Slack, dan WhatsApp:
openclaw plugins install @openclaw/mattermostPeriksa npmjs.com/package/@openclaw/mattermost untuk dist-tag saat ini sebelum menetapkan versi tertentu.
{ channels: { mattermost: { enabled: true, botToken: "mm-token", baseUrl: "https://chat.example.com", dmPolicy: "pairing", chatmode: "oncall", // saat dipanggil | setiap pesan | berdasarkan karakter oncharPrefixes: [">", "!"], groups: { "*": { requireMention: true }, "team-channel-id": { requireMention: false }, }, commands: { native: true, // harus diaktifkan secara eksplisit nativeSkills: true, callbackPath: "/api/channels/mattermost/command", // URL eksplisit opsional untuk deployment reverse-proxy/publik callbackUrl: "https://gateway.example.com/api/channels/mattermost/command", }, textChunkLimit: 4000, streaming: { chunkMode: "length" }, }, },}Mode obrolan: oncall (merespons saat @-mention, default), onmessage (setiap pesan), onchar (pesan yang diawali prefiks pemicu).
Saat perintah native Mattermost diaktifkan:
commands.callbackPathharus berupa jalur (misalnya/api/channels/mattermost/command), bukan URL lengkap.commands.callbackUrlharus mengarah ke endpoint Gateway OpenClaw dan dapat dijangkau dari server Mattermost.- Callback slash native diautentikasi dengan token per perintah yang dikembalikan
oleh Mattermost saat pendaftaran perintah slash. Jika pendaftaran gagal atau tidak ada
perintah yang diaktifkan, OpenClaw menolak callback dengan
Unauthorized: invalid command token. - Untuk host callback privat/tailnet/internal, Mattermost mungkin mengharuskan
ServiceSettings.AllowedUntrustedInternalConnectionsmenyertakan host/domain callback. Gunakan nilai host/domain, bukan URL lengkap. channels.mattermost.configWrites: izinkan atau tolak penulisan konfigurasi yang dimulai oleh Mattermost.channels.mattermost.requireMention: wajibkan@mentionsebelum membalas di kanal.channels.mattermost.groups.<channelId>.requireMention: penggantian persyaratan mention per kanal ("*"untuk default).channels.mattermost.defaultAccountopsional mengganti pemilihan akun default ketika cocok dengan ID akun yang dikonfigurasi.
Signal
{ channels: { signal: { enabled: true, account: "+15555550123", // pengikatan akun opsional dmPolicy: "pairing", allowFrom: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"], configWrites: true, reactionNotifications: "own", // nonaktif | milik sendiri | semua | daftar izin reactionAllowlist: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"], historyLimit: 50, }, },}Mode notifikasi reaksi: off, own (default), all, allowlist (dari reactionAllowlist).
channels.signal.account: tetapkan proses awal kanal ke identitas akun Signal tertentu.channels.signal.configWrites: izinkan atau tolak penulisan konfigurasi yang dimulai oleh Signal.channels.signal.defaultAccountopsional mengganti pemilihan akun default ketika cocok dengan ID akun yang dikonfigurasi.
iMessage
OpenClaw menjalankan imsg rpc (JSON-RPC melalui stdio). Tidak memerlukan daemon atau port. Ini adalah jalur yang disarankan untuk penyiapan baru OpenClaw iMessage ketika host dapat memberikan izin basis data Messages dan Automation.
Dukungan BlueBubbles telah dihapus. channels.bluebubbles bukan permukaan konfigurasi runtime yang didukung pada OpenClaw saat ini. Migrasikan konfigurasi lama ke channels.imessage; gunakan Penghapusan BlueBubbles dan jalur imsg iMessage untuk versi singkat dan Beralih dari BlueBubbles untuk tabel terjemahan lengkap.
Jika Gateway tidak berjalan di Mac Messages yang sedang masuk, pertahankan channels.imessage.enabled=true dan tetapkan channels.imessage.cliPath ke wrapper SSH yang menjalankan imsg "$@" di Mac tersebut. Jalur lokal default imsg hanya tersedia di macOS.
Sebelum mengandalkan wrapper SSH untuk pengiriman produksi, verifikasi imsg send keluar melalui wrapper yang persis sama. Beberapa status TCC macOS menetapkan Automasi Messages ke /usr/libexec/sshd-keygen-wrapper, yang dapat membuat pembacaan dan pemeriksaan berfungsi sementara pengiriman gagal dengan AppleEvents -1743; lihat bagian pemecahan masalah wrapper SSH di iMessage.
{ channels: { imessage: { enabled: true, cliPath: "imsg", dbPath: "~/Library/Messages/chat.db", remoteHost: "user@gateway-host", dmPolicy: "pairing", allowFrom: ["+15555550123", "user@example.com", "chat_id:123"], historyLimit: 50, includeAttachments: false, attachmentRoots: ["/Users/*/Library/Messages/Attachments"], remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"], mediaMaxMb: 16, service: "auto", sendTransport: "auto", region: "US", actions: { reactions: true, edit: true, unsend: true, reply: true, sendWithEffect: true, sendAttachment: true, }, }, },}channels.imessage.defaultAccountopsional menggantikan pemilihan akun bawaan jika cocok dengan id akun yang dikonfigurasi.- Memerlukan Akses Disk Penuh ke DB Messages.
- Utamakan target
chat_id:<id>. Gunakanimsg chats --limit 20untuk mencantumkan obrolan. cliPathdapat mengarah ke wrapper SSH; aturremoteHost(hostatauuser@host) untuk mengambil lampiran melalui SCP.attachmentRootsdanremoteAttachmentRootsmembatasi jalur lampiran masuk (bawaan:/Users/*/Library/Messages/Attachments).- SCP menggunakan pemeriksaan ketat kunci host, jadi pastikan kunci host relai sudah ada di
~/.ssh/known_hosts. channels.imessage.configWrites: izinkan atau tolak penulisan konfigurasi yang dimulai dari iMessage.channels.imessage.sendTransport: transportasi pengiriman RPCimsgyang diutamakan untuk balasan keluar normal.auto(bawaan) menggunakan jembatan IMCore untuk obrolan yang sudah ada ketika jembatan berjalan, lalu beralih ke AppleScript sebagai cadangan;bridgememerlukan pengiriman melalui API privat;applescriptmemaksa jalur automasi Messages publik.channels.imessage.actions.*: aktifkan tindakan API privat yang juga dibatasi olehimsg status/openclaw channels status --probe.channels.imessage.includeAttachmentsdinonaktifkan secara bawaan; atur ketruesebelum mengharapkan media masuk dalam giliran agen.- Pemulihan pesan masuk setelah jembatan/gateway dimulai ulang berlangsung otomatis (deduplikasi GUID ditambah batas usia backlog lama). Konfigurasi
channels.imessage.catchup.enabled: trueyang sudah ada masih dihormati sebagai profil kompatibilitas yang tidak digunakan lagi;catchupdinonaktifkan secara bawaan. channels.imessage.groups: registri grup dan pengaturan per grup. DengangroupPolicy: "allowlist", konfigurasikan kuncichat_ideksplisit atau entri wildcard"*"agar pesan grup dapat melewati gerbang registri.- Entri
bindings[]tingkat atas dengantype: "acp"dapat mengikat percakapan iMessage ke sesi ACP persisten. Gunakan handle yang dinormalisasi atau target obrolan eksplisit (chat_id:*,chat_guid:*,chat_identifier:*) dimatch.peer.id. Semantik bidang bersama: Agen ACP.
Contoh wrapper SSH iMessage
#!/usr/bin/env bashexec ssh -T gateway-host imsg "$@"Matrix
Matrix didukung oleh plugin dan dikonfigurasi di bawah channels.matrix.
{ channels: { matrix: { enabled: true, homeserver: "https://matrix.example.org", accessToken: "syt_bot_xxx", proxy: "http://127.0.0.1:7890", encryption: true, initialSyncLimit: 20, defaultAccount: "ops", accounts: { ops: { name: "Ops", userId: "@ops:example.org", accessToken: "syt_ops_xxx", }, alerts: { userId: "@alerts:example.org", password: "secret", proxy: "http://127.0.0.1:7891", }, }, }, },}- Autentikasi token menggunakan
accessToken; autentikasi kata sandi menggunakanuserId+password. channels.matrix.proxymerutekan lalu lintas HTTP Matrix melalui proksi HTTP(S) eksplisit. Akun bernama dapat menggantikannya denganchannels.matrix.accounts.<id>.proxy.channels.matrix.network.dangerouslyAllowPrivateNetworkmengizinkan homeserver privat/internal.proxydan persetujuan jaringan ini merupakan kontrol yang independen.channels.matrix.defaultAccountmemilih akun yang diutamakan dalam penyiapan multi-akun.channels.matrix.autoJoinsecara bawaan bernilai"off", sehingga ruang yang mengundang dan undangan baru bergaya DM diabaikan sampai Anda mengaturautoJoin: "allowlist"denganautoJoinAllowlistatauautoJoin: "always".channels.matrix.execApprovals: pengiriman persetujuan eksekusi native Matrix dan otorisasi pemberi persetujuan.enabled:true,false, atau"auto"(bawaan). Dalam mode otomatis, persetujuan eksekusi diaktifkan ketika pemberi persetujuan dapat ditentukan dariapproversataucommands.ownerAllowFrom.approvers: ID pengguna Matrix (misalnya@owner:example.org) yang diizinkan menyetujui permintaan eksekusi.agentFilter: daftar izin ID agen opsional. Hilangkan untuk meneruskan persetujuan bagi semua agen.sessionFilter: pola kunci sesi opsional (substring atau regex).target: tujuan pengiriman permintaan persetujuan."dm"(bawaan),"channel"(ruang asal), atau"both".- Penggantian per akun:
channels.matrix.accounts.<id>.execApprovals.
channels.matrix.dm.sessionScopemengontrol cara DM Matrix dikelompokkan ke dalam sesi:per-user(bawaan) berbagi berdasarkan rekan yang dirutekan, sedangkanper-roommengisolasi setiap ruang DM.- Pemeriksaan status Matrix dan pencarian direktori langsung menggunakan kebijakan proksi yang sama dengan lalu lintas runtime.
- Konfigurasi Matrix lengkap, aturan penargetan, dan contoh penyiapan didokumentasikan di Matrix.
Microsoft Teams
Microsoft Teams didukung oleh plugin dan dikonfigurasi di bawah channels.msteams.
{ channels: { msteams: { enabled: true, configWrites: true, // appId, appPassword, tenantId, webhook, kebijakan tim/saluran: // lihat /channels/msteams }, },}- Jalur kunci inti yang dibahas di sini:
channels.msteams,channels.msteams.configWrites. - Konfigurasi Teams lengkap (kredensial, webhook, kebijakan DM/grup, penggantian per tim/per saluran) didokumentasikan di Microsoft Teams.
IRC
IRC didukung oleh plugin dan dikonfigurasi di bawah channels.irc.
{ channels: { irc: { enabled: true, dmPolicy: "pairing", configWrites: true, nickserv: { enabled: true, service: "NickServ", password: "${IRC_NICKSERV_PASSWORD}", register: false, registerEmail: "bot@example.com", }, }, },}- Jalur kunci inti yang dibahas di sini:
channels.irc,channels.irc.dmPolicy,channels.irc.configWrites,channels.irc.nickserv.*. channels.irc.defaultAccountopsional menggantikan pemilihan akun bawaan jika cocok dengan id akun yang dikonfigurasi.- Konfigurasi saluran IRC lengkap (host/port/TLS/saluran/daftar izin/pembatasan penyebutan) didokumentasikan di IRC.
Multi-akun (semua saluran)
Jalankan beberapa akun per saluran (masing-masing dengan accountId sendiri):
{ channels: { telegram: { accounts: { default: { name: "Primary bot", botToken: "123456:ABC...", }, alerts: { name: "Alerts bot", botToken: "987654:XYZ...", }, }, }, },}defaultdigunakan ketikaaccountIddihilangkan (CLI + perutean).- Token lingkungan hanya berlaku untuk akun bawaan.
- Pengaturan saluran dasar berlaku untuk semua akun kecuali diganti per akun.
- Gunakan
bindings[].match.accountIduntuk merutekan setiap akun ke agen yang berbeda. - Jika Anda menambahkan akun nonbawaan melalui
openclaw channels add(atau orientasi saluran) saat masih menggunakan konfigurasi saluran tingkat atas akun tunggal, OpenClaw terlebih dahulu mempromosikan nilai akun tunggal tingkat atas yang tercakup pada akun ke dalam peta akun saluran agar akun asli tetap berfungsi. Sebagian besar saluran memindahkannya kechannels.<channel>.accounts.default; Matrix dapat mempertahankan target bernama/bawaan yang sudah ada dan cocok. - Pengikatan khusus saluran yang sudah ada (tanpa
accountId) tetap cocok dengan akun bawaan; pengikatan yang tercakup pada akun tetap opsional. openclaw doctor --fixjuga memperbaiki bentuk campuran dengan memindahkan nilai akun tunggal tingkat atas yang tercakup pada akun ke akun yang dipromosikan dan dipilih untuk saluran tersebut. Sebagian besar saluran menggunakanaccounts.default; Matrix dapat mempertahankan target bernama/bawaan yang sudah ada dan cocok.
Saluran plugin lainnya
Banyak saluran plugin dikonfigurasi sebagai channels.<id> dan didokumentasikan pada halaman saluran khusus masing-masing (misalnya Feishu, LINE, Nextcloud Talk, Nostr, QQ Bot, Synology Chat, Twitch, dan Zalo).
Lihat indeks saluran lengkap: Saluran.
Pembatasan penyebutan dalam obrolan grup
Pesan grup secara bawaan memerlukan penyebutan (penyebutan metadata atau pola regex aman). Berlaku untuk obrolan grup WhatsApp, Telegram, Discord, Google Chat, dan iMessage.
Balasan yang terlihat dikontrol secara terpisah. Permintaan langsung grup, saluran, dan WebChat internal normal secara bawaan mengirimkan hasil akhir secara otomatis: teks akhir asisten dikirim melalui jalur balasan terlihat lama. Aktifkan messages.visibleReplies: "message_tool" atau messages.groupChat.visibleReplies: "message_tool" ketika balasan sumber yang ditulis model hanya boleh dikirim setelah agen memanggil message(action=send). Jika model mengembalikan jawaban akhir substantif tanpa memanggil alat pesan dalam mode khusus alat yang telah diaktifkan, teks akhir tersebut tetap privat, log verbose gateway mencatat metadata payload yang ditekan, dan OpenClaw mengantrekan satu percobaan ulang pemulihan yang meminta model mengirimkan balasan yang sama melalui message(action=send).
Kebijakan khusus alat mengatur balasan sumber asisten dan media alat generik. Kebijakan ini tidak menekan keluaran terminal milik runtime seperti respons perintah yang diotorisasi, pemberitahuan penyelesaian persisten, atau artefak native penyedia yang secara eksplisit diklasifikasikan sebagai milik host oleh harness pemiliknya. Artefak milik host dikirim melalui jalur pengiriman saluran normal dan tetap mematuhi penolakan sendPolicy keluar. Giliran room_event ambien tetap senyap kecuali berupa perintah eksplisit, bahkan ketika keluaran runtime ditandai sebagai milik host.
Balasan terlihat khusus alat memerlukan model/runtime yang dapat memanggil alat secara andal, dan direkomendasikan untuk ruang ambien bersama pada model generasi terbaru seperti GPT-5.6 Sol. Beberapa model yang lebih lemah dapat menjawab dengan teks akhir, tetapi gagal memahami bahwa keluaran yang terlihat oleh sumber harus dikirim dengan message(action=send). OpenClaw secara bawaan memulihkan kasus umum jawaban akhir yang tertahan hanya jika jawaban akhir tersebut substantif, giliran sumber bukan peristiwa ruang, kebijakan pengiriman tidak menolak pengiriman, dan belum ada balasan sumber yang dikirim. Pemulihan dibatasi pada satu percobaan ulang; pemulihan ini menekan persistensi untuk permintaan percobaan ulang sintetis dan mengecualikan percobaan ulang tersebut dari pengelompokan pengumpulan agar tidak dapat digabungkan dengan permintaan antrean lain yang tidak terkait. Jika percobaan ulang juga tertahan atau tidak dapat dimasukkan ke antrean, OpenClaw hanya mengirimkan diagnostik yang telah disanitasi seperti "Saya menghasilkan balasan, tetapi tidak dapat mengirimkannya ke obrolan ini. Silakan coba lagi." Teks akhir privat yang asli tidak pernah ditandai untuk pengiriman otomatis ke sumber. Untuk model yang berulang kali menahan balasan, gunakan "automatic" agar giliran akhir asisten menjadi jalur balasan terlihat, beralihlah ke model pemanggil alat yang lebih kuat, periksa log verbose gateway untuk ringkasan payload yang ditekan, atau atur messages.groupChat.visibleReplies: "automatic" agar menggunakan balasan akhir terlihat untuk setiap permintaan grup/saluran.
Jika alat pesan tidak tersedia berdasarkan kebijakan alat yang aktif, OpenClaw beralih ke balasan terlihat otomatis alih-alih menyembunyikan respons secara diam-diam. openclaw doctor memperingatkan tentang ketidaksesuaian ini.
Aturan ini berlaku untuk teks akhir agen normal. Pengikatan percakapan milik Plugin menggunakan balasan yang dikembalikan Plugin pemilik sebagai respons terlihat untuk giliran utas terikat yang diklaim; Plugin tidak perlu memanggil message(action=send) untuk balasan pengikatan tersebut.
Pemecahan masalah: @mention grup memicu indikator mengetik lalu hening (tanpa kesalahan)
Gejala: @mention grup/saluran menampilkan indikator mengetik dan log Gateway melaporkan dispatch complete (queuedFinal=false, replies=0), tetapi tidak ada pesan yang masuk ke ruang. DM kepada agen yang sama dibalas secara normal.
Penyebab: mode balasan terlihat grup/saluran diselesaikan menjadi "message_tool", sehingga OpenClaw menjalankan giliran tetapi menyembunyikan teks akhir asisten kecuali agen memanggil message(action=send). Tidak ada kontrak NO_REPLY dalam mode ini; tanpa panggilan alat pesan, teks akhir asli bersifat privat. Untuk giliran sumber yang substantif, OpenClaw kini mencoba satu percobaan ulang pemulihan yang dilindungi; catatan singkat, keheningan eksplisit, peristiwa ruang, giliran yang ditolak oleh kebijakan pengiriman, dan giliran yang sudah terkirim tidak dicoba ulang. Giliran grup dan saluran normal secara default menggunakan "automatic", sehingga gejala ini hanya muncul ketika messages.groupChat.visibleReplies (atau messages.visibleReplies global) secara eksplisit ditetapkan ke "message_tool". defaultVisibleReplies harness tidak berlaku di sini — resolver grup/saluran mengabaikannya; pengaturan ini hanya memengaruhi obrolan langsung/sumber (harness Codex menyembunyikan hasil akhir obrolan langsung dengan cara tersebut).
Perbaikan: pilih model pemanggil alat yang lebih kuat, hapus penggantian eksplisit "message_tool" agar kembali ke default "automatic", atau tetapkan messages.groupChat.visibleReplies: "automatic" untuk memaksakan balasan terlihat bagi setiap permintaan grup/saluran. Hasil akhir substantif yang terdampar seharusnya tidak lagi berakhir sebagai keberhasilan tanpa keluaran; hasil tersebut harus dipulihkan melalui satu percobaan ulang message(action=send) atau menampilkan diagnostik kegagalan pengiriman yang telah disanitasi. Gateway memuat ulang konfigurasi messages secara langsung setelah berkas disimpan; mulai ulang Gateway hanya ketika pemantauan berkas atau pemuatan ulang konfigurasi dinonaktifkan dalam deployment.
Jenis sebutan:
- Sebutan metadata: @mention native platform. Diabaikan dalam mode obrolan mandiri WhatsApp.
- Pola teks: Pola regex aman dalam
agents.list[].groupChat.mentionPatterns. Pola yang tidak valid dan pengulangan bertingkat yang tidak aman diabaikan. - Pembatasan sebutan hanya diberlakukan ketika deteksi dimungkinkan (sebutan native atau setidaknya satu pola).
{ messages: { visibleReplies: "automatic", // paksa balasan akhir otomatis lama untuk obrolan langsung/sumber groupChat: { historyLimit: 50, unmentionedInbound: "room_event", // percakapan ruang tanpa sebutan yang selalu aktif menjadi konteks senyap visibleReplies: "message_tool", // ikut serta; wajibkan message(action=send) untuk balasan ruang yang terlihat }, }, agents: { list: [{ id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"] } }], },}messages.groupChat.historyLimit menetapkan default global. Saluran dapat menggantinya dengan channels.<channel>.historyLimit (atau per akun). Tetapkan 0 untuk menonaktifkannya.
messages.groupChat.unmentionedInbound: "room_event" mengirimkan pesan grup/saluran tanpa sebutan yang selalu aktif sebagai konteks ruang senyap pada saluran yang didukung. Pesan yang menyebut, perintah, dan pesan langsung tetap menjadi permintaan pengguna. Lihat Peristiwa ruang ambien untuk contoh lengkap Discord, Slack, dan Telegram.
messages.visibleReplies adalah default peristiwa sumber global; messages.groupChat.visibleReplies menggantikannya untuk peristiwa sumber grup/saluran. Ketika messages.visibleReplies tidak ditetapkan, obrolan langsung/sumber menggunakan default runtime atau harness yang dipilih, tetapi giliran langsung WebChat internal menggunakan pengiriman akhir otomatis untuk paritas prompt Pi/Codex. Tetapkan messages.visibleReplies: "message_tool" untuk secara sengaja mewajibkan message(action=send) bagi keluaran terlihat. Daftar izin saluran dan pembatasan sebutan tetap menentukan apakah suatu peristiwa diproses.
Batas riwayat DM
{ channels: { telegram: { dmHistoryLimit: 30, dms: { "123456789": { historyLimit: 50 }, }, }, },}Resolusi: penggantian per DM → default penyedia → tanpa batas (semuanya dipertahankan).
Resolver ini membaca channels.<provider>.dmHistoryLimit dan channels.<provider>.dms.<id>.historyLimit untuk setiap saluran yang kunci sesinya mengikuti bentuk standar provider:direct:<id> (atau bentuk lama provider:dm:<id>), sehingga resolver ini berfungsi pada saluran bawaan maupun saluran Plugin, bukan hanya daftar tetap.
Mode obrolan mandiri
Sertakan nomor Anda sendiri dalam allowFrom untuk mengaktifkan mode obrolan mandiri (mengabaikan @mention native, hanya merespons pola teks):
{ channels: { whatsapp: { allowFrom: ["+15555550123"], groups: { "*": { requireMention: true } }, }, }, agents: { list: [ { id: "main", groupChat: { mentionPatterns: ["reisponde", "@openclaw"] }, }, ], },}Perintah (penanganan perintah obrolan)
{ commands: { native: "auto", // daftarkan perintah native jika didukung nativeSkills: "auto", // daftarkan perintah skill native jika didukung text: true, // uraikan /commands dalam pesan obrolan bash: false, // izinkan ! (alias: /bash) bashForegroundMs: 2000, config: false, // izinkan /config mcp: false, // izinkan /mcp plugins: false, // izinkan /plugins debug: false, // izinkan /debug restart: true, // izinkan /restart + permintaan mulai ulang SIGUSR1 eksternal ownerAllowFrom: ["discord:123456789012345678"], ownerDisplay: "raw", // raw | hash ownerDisplaySecret: "${OWNER_ID_HASH_SECRET}", allowFrom: { "*": ["user1"], discord: ["user:123"], }, useAccessGroups: true, },}Detail perintah
- Blok ini mengonfigurasi permukaan perintah. Untuk katalog perintah bawaan + terbundel saat ini, lihat Perintah Slash.
- Halaman ini adalah referensi kunci konfigurasi, bukan katalog perintah lengkap. Perintah milik saluran/Plugin seperti QQ Bot
/bot-ping/bot-help/bot-logs, LINE/card, pemasangan perangkat/pair, memori/dreaming, kontrol telepon/phone, dan Talk/voicedidokumentasikan dalam halaman saluran/Plugin masing-masing serta Perintah Slash. - Perintah teks harus berupa pesan mandiri dengan
/di awal. native: "auto"mengaktifkan perintah native untuk Discord/Telegram dan membiarkannya nonaktif untuk Slack.nativeSkills: "auto"mengaktifkan perintah Skills native untuk Discord/Telegram dan membiarkannya nonaktif untuk Slack.- Ganti per saluran:
channels.discord.commands.native(boolean atau"auto"). Untuk Discord,falsemelewati pendaftaran dan pembersihan perintah native selama startup. - Ganti pendaftaran Skills native per saluran dengan
channels.<provider>.commands.nativeSkills. channels.telegram.customCommandsmenambahkan entri menu bot Telegram tambahan.bash: truemengaktifkan! <cmd>untuk shell host. Memerlukantools.elevated.enableddan pengirim dalamtools.elevated.allowFrom.<channel>.config: truemengaktifkan/config(membaca/menulisopenclaw.json). Untuk klienchat.sendGateway, penulisan persisten/config set|unsetjuga memerlukanoperator.admin;/config showhanya-baca tetap tersedia bagi klien operator normal dengan cakupan tulis.mcp: truemengaktifkan/mcpuntuk konfigurasi server MCP yang dikelola OpenClaw di bawahmcp.servers.plugins: truemengaktifkan/pluginsuntuk penemuan, instalasi, serta kontrol aktif/nonaktif Plugin.channels.<provider>.configWritesmembatasi mutasi konfigurasi per saluran (default: true).- Untuk saluran multiakun,
channels.<provider>.accounts.<id>.configWritesjuga membatasi penulisan yang menargetkan akun tersebut (misalnya/allowlist --config --account <id>atau/config set channels.<provider>.accounts.<id>...). restart: falsemenonaktifkan/restartdan permintaan mulai ulangSIGUSR1eksternal. Default:true.ownerAllowFromadalah daftar izin pemilik eksplisit untuk perintah khusus pemilik dan tindakan saluran yang dibatasi untuk pemilik. Daftar ini terpisah dariallowFrom.ownerDisplay: "hash"meng-hash ID pemilik dalam prompt sistem. TetapkanownerDisplaySecretuntuk mengontrol hashing.allowFromberlaku per penyedia. Ketika ditetapkan, nilai ini menjadi satu-satunya sumber otorisasi (daftar izin/pemasangan saluran danuseAccessGroupsdiabaikan).useAccessGroups: falsememungkinkan perintah melewati kebijakan grup akses ketikaallowFromtidak ditetapkan.- Peta dokumentasi perintah:
- katalog bawaan + terbundel: Perintah Slash
- permukaan perintah khusus saluran: Saluran
- perintah QQ Bot: QQ Bot
- perintah pemasangan: Pemasangan
- perintah kartu LINE: LINE
- Dreaming memori: Dreaming
Terkait
- Referensi konfigurasi — kunci tingkat atas
- Konfigurasi — agen
- Ikhtisar saluran