Status: siap produksi melalui WhatsApp Web (Baileys). Gateway memiliki sesi tertaut.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Instal (sesuai kebutuhan)
- Onboarding (
openclaw onboard) danopenclaw channels add --channel whatsappmeminta untuk memasang Plugin WhatsApp saat pertama kali Anda memilihnya. openclaw channels login --channel whatsappjuga menawarkan alur instal saat Plugin belum tersedia.- Kanal dev + checkout git: default ke jalur Plugin lokal.
- Stabil/Beta: menggunakan paket npm
@openclaw/whatsapppada tag rilis resmi saat ini.
PATH selama instal npm karena
salah satu dependensi Baileys/libsignal diambil dari URL git. Instal
Git for Windows, lalu mulai ulang shell dan jalankan ulang instal:
bin-nya ada di PATH.
Pairing
Channel troubleshooting
Gateway configuration
Penyiapan cepat
Link WhatsApp (QR)
Pola deployment
Dedicated number (recommended)
Dedicated number (recommended)
- identitas WhatsApp terpisah untuk OpenClaw
- allowlist DM dan batas routing yang lebih jelas
- peluang kebingungan self-chat lebih rendah
Personal-number fallback
Personal-number fallback
dmPolicy: "allowlist"allowFrommenyertakan nomor pribadi AndaselfChatMode: true
allowFrom.WhatsApp Web-only channel scope
WhatsApp Web-only channel scope
Baileys) dalam arsitektur kanal OpenClaw saat ini.Tidak ada kanal pesan Twilio WhatsApp terpisah dalam registry kanal chat bawaan.Model runtime
- Gateway memiliki socket WhatsApp dan loop sambung ulang.
- Watchdog sambung ulang menggunakan aktivitas transport WhatsApp Web, bukan hanya volume pesan aplikasi masuk, sehingga sesi perangkat tertaut yang sepi tidak dimulai ulang hanya karena belum ada yang mengirim pesan baru-baru ini. Batas kesunyian aplikasi yang lebih panjang tetap memaksa sambung ulang jika frame transport terus datang tetapi tidak ada pesan aplikasi yang ditangani selama jendela watchdog; setelah sambung ulang sementara untuk sesi yang baru aktif, pemeriksaan kesunyian aplikasi tersebut menggunakan timeout pesan normal untuk jendela pemulihan pertama.
- Timing socket Baileys eksplisit di bawah
web.whatsapp.*:keepAliveIntervalMsmengontrol ping aplikasi WhatsApp Web,connectTimeoutMsmengontrol timeout handshake pembuka, dandefaultQueryTimeoutMsmengontrol timeout kueri Baileys. - Pengiriman keluar membutuhkan listener WhatsApp aktif untuk akun target.
- Pengiriman grup melampirkan metadata mention native untuk token
@+<digits>dan@<digits>dalam teks dan caption media saat token cocok dengan metadata peserta WhatsApp saat ini, termasuk grup berbasis LID. - Chat status dan broadcast diabaikan (
@status,@broadcast). - Watchdog sambung ulang mengikuti aktivitas transport WhatsApp Web, bukan hanya volume pesan aplikasi masuk: sesi perangkat tertaut yang sepi tetap aktif selama frame transport berlanjut, tetapi transport yang macet memaksa sambung ulang jauh sebelum jalur pemutusan jarak jauh yang lebih lambat.
- Chat langsung menggunakan aturan sesi DM (
session.dmScope; defaultmainmenggabungkan DM ke sesi utama agen). - Sesi grup diisolasi (
agent:<agentId>:whatsapp:group:<jid>). - WhatsApp Channels/Newsletters dapat menjadi target keluar eksplisit dengan JID native
@newsletter. Pengiriman newsletter keluar menggunakan metadata sesi kanal (agent:<agentId>:whatsapp:channel:<jid>) alih-alih semantik sesi DM. - Transport WhatsApp Web menghormati variabel lingkungan proxy standar pada host gateway (
HTTPS_PROXY,HTTP_PROXY,NO_PROXY/ varian huruf kecil). Lebih baik gunakan konfigurasi proxy tingkat host daripada pengaturan proxy WhatsApp khusus kanal. - Saat
messages.removeAckAfterReplydiaktifkan, OpenClaw menghapus reaksi ack WhatsApp setelah balasan yang terlihat terkirim.
Hook Plugin dan privasi
Pesan masuk WhatsApp dapat berisi konten pesan pribadi, nomor telepon, pengidentifikasi grup, nama pengirim, dan kolom korelasi sesi. Karena itu, WhatsApp tidak menyiarkan payload hookmessage_received masuk ke Plugin
kecuali Anda secara eksplisit memilih ikut:
Kontrol akses dan aktivasi
- DM policy
- Group policy + allowlists
- Mentions + /activation
channels.whatsapp.dmPolicy mengontrol akses chat langsung:pairing(default)allowlistopen(membutuhkanallowFromuntuk menyertakan"*")disabled
allowFrom menerima nomor bergaya E.164 (dinormalisasi secara internal).allowFrom adalah daftar kontrol akses pengirim DM. Ini tidak membatasi pengiriman keluar eksplisit ke JID grup WhatsApp atau JID kanal @newsletter.Override multi-akun: channels.whatsapp.accounts.<id>.dmPolicy (dan allowFrom) lebih diprioritaskan daripada default tingkat kanal untuk akun tersebut.Detail perilaku runtime:- pairing dipersistenkan dalam allow-store kanal dan digabungkan dengan
allowFromyang dikonfigurasi - otomatisasi terjadwal dan fallback penerima Heartbeat menggunakan target pengiriman eksplisit atau
allowFromyang dikonfigurasi; persetujuan pairing DM bukan penerima Cron atau Heartbeat implisit - jika tidak ada allowlist yang dikonfigurasi, nomor diri tertaut diizinkan secara default
- OpenClaw tidak pernah melakukan auto-pair DM
fromMekeluar (pesan yang Anda kirim kepada diri sendiri dari perangkat tertaut)
Perilaku nomor pribadi dan self-chat
Saat nomor diri tertaut juga ada diallowFrom, pengaman self-chat WhatsApp aktif:
- lewati tanda terima baca untuk giliran self-chat
- abaikan perilaku pemicu otomatis mention-JID yang jika tidak akan melakukan ping ke diri sendiri
- jika
messages.responsePrefixtidak disetel, balasan self-chat default ke[{identity.name}]atau[openclaw]
Normalisasi pesan dan konteks
Inbound envelope + reply context
Inbound envelope + reply context
ReplyToId, ReplyToBody, ReplyToSender, JID/E.164 pengirim).
Saat target balasan yang dikutip adalah media yang dapat diunduh, OpenClaw menyimpannya melalui
penyimpanan media masuk normal dan mengeksposnya sebagai MediaPath/MediaType sehingga
agen dapat memeriksa gambar yang dirujuk alih-alih hanya melihat
<media:image>.Media placeholders and location/contact extraction
Media placeholders and location/contact extraction
<media:image><media:video><media:audio><media:document><media:sticker>
<media:audio>, sehingga menyebut mention bot dalam voice note dapat
memicu balasan. Jika transkrip masih tidak menyebut bot, transkrip
disimpan dalam riwayat grup tertunda alih-alih placeholder mentah.Isi lokasi menggunakan teks koordinat ringkas. Label/komentar lokasi dan detail kontak/vCard dirender sebagai metadata tidak tepercaya berpagar, bukan teks prompt inline.Pending group history injection
Pending group history injection
- batas default:
50 - config:
channels.whatsapp.historyLimit - fallback:
messages.groupChat.historyLimit 0menonaktifkan
[Pesan chat sejak balasan terakhir Anda - untuk konteks][Pesan saat ini - tanggapi ini]
Tanda dibaca
Tanda dibaca
Pengiriman, pemotongan, dan media
Pemotongan teks
Pemotongan teks
- batas potongan default:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"- mode
newlinemengutamakan batas paragraf (baris kosong), lalu fallback ke pemotongan aman berdasarkan panjang
Perilaku media keluar
Perilaku media keluar
- mendukung payload gambar, video, audio (catatan suara PTT), dan dokumen
- media audio dikirim melalui payload
audioBaileys denganptt: true, sehingga klien WhatsApp merendernya sebagai catatan suara push-to-talk - payload balasan mempertahankan
audioAsVoice; output catatan suara TTS untuk WhatsApp tetap menggunakan jalur PTT ini meskipun provider mengembalikan MP3 atau WebM - audio Ogg/Opus native dikirim sebagai
audio/ogg; codecs=opusuntuk kompatibilitas catatan suara - audio non-Ogg, termasuk output TTS MP3/WebM Microsoft Edge, ditranskode dengan
ffmpegke Ogg/Opus mono 48 kHz sebelum pengiriman PTT /tts latestmengirim balasan asisten terbaru sebagai satu catatan suara dan menekan pengiriman berulang untuk balasan yang sama;/tts chat on|off|defaultmengontrol TTS otomatis untuk chat WhatsApp saat ini- pemutaran GIF animasi didukung melalui
gifPlayback: truepada pengiriman video - caption diterapkan ke item media pertama saat mengirim payload balasan multi-media, kecuali catatan suara PTT mengirim audio terlebih dahulu dan teks yang terlihat secara terpisah karena klien WhatsApp tidak merender caption catatan suara secara konsisten
- sumber media dapat berupa HTTP(S),
file://, atau path lokal
Batas ukuran media dan perilaku fallback
Batas ukuran media dan perilaku fallback
- batas simpan media masuk:
channels.whatsapp.mediaMaxMb(default50) - batas kirim media keluar:
channels.whatsapp.mediaMaxMb(default50) - override per akun menggunakan
channels.whatsapp.accounts.<accountId>.mediaMaxMb - gambar dioptimalkan otomatis (resize/penyesuaian kualitas) agar sesuai batas
- saat pengiriman media gagal, fallback item pertama mengirim peringatan teks alih-alih membuang respons secara diam-diam
Kutipan balasan
WhatsApp mendukung kutipan balasan native, di mana balasan keluar menampilkan kutipan pesan masuk. Kontrol denganchannels.whatsapp.replyToMode.
| Nilai | Perilaku |
|---|---|
"off" | Jangan pernah mengutip; kirim sebagai pesan biasa |
"first" | Kutip hanya potongan balasan keluar pertama |
"all" | Kutip setiap potongan balasan keluar |
"batched" | Kutip balasan antrean berbentuk batch sambil membiarkan balasan langsung tanpa kutipan |
"off". Override per akun menggunakan channels.whatsapp.accounts.<id>.replyToMode.
Level reaksi
channels.whatsapp.reactionLevel mengontrol seberapa luas agen menggunakan reaksi emoji di WhatsApp:
| Level | Reaksi ack | Reaksi yang dimulai agen | Deskripsi |
|---|---|---|---|
"off" | Tidak | Tidak | Tidak ada reaksi sama sekali |
"ack" | Ya | Tidak | Hanya reaksi ack (tanda terima pra-balasan) |
"minimal" | Ya | Ya (konservatif) | Ack + reaksi agen dengan panduan konservatif |
"extensive" | Ya | Ya (dianjurkan) | Ack + reaksi agen dengan panduan yang dianjurkan |
"minimal".
Override per akun menggunakan channels.whatsapp.accounts.<id>.reactionLevel.
Reaksi pengakuan
WhatsApp mendukung reaksi ack langsung pada tanda terima masuk melaluichannels.whatsapp.ackReaction.
Reaksi ack dibatasi oleh reactionLevel — reaksi ditekan saat reactionLevel adalah "off".
- dikirim segera setelah pesan masuk diterima (pra-balasan)
- kegagalan dicatat di log tetapi tidak memblokir pengiriman balasan normal
- mode grup
mentionsbereaksi pada giliran yang dipicu mention; aktivasi grupalwaysbertindak sebagai bypass untuk pemeriksaan ini - WhatsApp menggunakan
channels.whatsapp.ackReaction(messages.ackReactionlegacy tidak digunakan di sini)
Multi-akun dan kredensial
Pemilihan akun dan default
Pemilihan akun dan default
- id akun berasal dari
channels.whatsapp.accounts - pemilihan akun default:
defaultjika ada, jika tidak id akun pertama yang dikonfigurasi (diurutkan) - id akun dinormalisasi secara internal untuk pencarian
Path kredensial dan kompatibilitas legacy
Path kredensial dan kompatibilitas legacy
- path auth saat ini:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - file cadangan:
creds.json.bak - auth default legacy di
~/.openclaw/credentials/masih dikenali/dimigrasikan untuk alur akun default
Perilaku logout
Perilaku logout
openclaw channels logout --channel whatsapp [--account <id>] menghapus status auth WhatsApp untuk akun tersebut.Saat Gateway dapat dijangkau, logout terlebih dahulu menghentikan listener WhatsApp live untuk akun yang dipilih sehingga sesi tertaut tidak terus menerima pesan hingga restart berikutnya. openclaw channels remove --channel whatsapp juga menghentikan listener live sebelum menonaktifkan atau menghapus config akun.Di direktori auth legacy, oauth.json dipertahankan sementara file auth Baileys dihapus.Tool, tindakan, dan penulisan config
- Dukungan tool agen mencakup tindakan reaksi WhatsApp (
react). - Gerbang tindakan:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- Penulisan config yang dimulai channel diaktifkan secara default (nonaktifkan melalui
channels.whatsapp.configWrites=false).
Pemecahan masalah
Tidak tertaut (QR diperlukan)
Tidak tertaut (QR diperlukan)
Tertaut tetapi terputus / loop sambung ulang
Tertaut tetapi terputus / loop sambung ulang
status=408 Request Time-out Connection was lost berulang, sesuaikan
timing socket Baileys di bawah web.whatsapp. Mulailah dengan memendekkan
keepAliveIntervalMs di bawah timeout idle jaringan Anda dan meningkatkan
connectTimeoutMs pada koneksi yang lambat atau sering kehilangan paket:~/.openclaw/logs/whatsapp-health.log mengatakan Gateway inactive tetapi
openclaw gateway status dan openclaw channels status --probe menunjukkan bahwa
gateway dan WhatsApp sehat, jalankan openclaw doctor. Di Linux, doctor
memperingatkan tentang entri crontab legacy yang masih memanggil
~/.openclaw/bin/ensure-whatsapp.sh; hapus entri usang tersebut dengan
crontab -e karena cron dapat tidak memiliki lingkungan user-bus systemd dan
membuat skrip lama itu salah melaporkan kesehatan gateway.Jika diperlukan, tautkan ulang dengan channels login.Login QR timeout di balik proxy
Login QR timeout di balik proxy
openclaw channels login --channel whatsapp gagal sebelum menampilkan kode QR yang dapat digunakan dengan status=408 Request Time-out atau pemutusan socket TLS.Login WhatsApp Web menggunakan lingkungan proxy standar host gateway (HTTPS_PROXY, HTTP_PROXY, varian huruf kecil, dan NO_PROXY). Verifikasi bahwa proses gateway mewarisi env proxy dan NO_PROXY tidak cocok dengan mmg.whatsapp.net.Tidak ada listener aktif saat mengirim
Tidak ada listener aktif saat mengirim
Balasan muncul di transkrip tetapi tidak di WhatsApp
Balasan muncul di transkrip tetapi tidak di WhatsApp
auto-reply delivery failed atau auto-reply was not accepted by WhatsApp provider.Pesan grup diabaikan secara tidak terduga
Pesan grup diabaikan secara tidak terduga
groupPolicygroupAllowFrom/allowFrom- entri allowlist
groups - gating mention (
requireMention+ pola mention) - kunci duplikat di
openclaw.json(JSON5): entri yang lebih baru menimpa entri sebelumnya, jadi pertahankan satugroupPolicyper cakupan
Peringatan runtime Bun
Peringatan runtime Bun
Prompt sistem
WhatsApp mendukung prompt sistem bergaya Telegram untuk grup dan chat langsung melalui mapgroups dan direct.
Hierarki resolusi untuk pesan grup:
Map groups efektif ditentukan terlebih dahulu: jika akun mendefinisikan groups sendiri, map tersebut sepenuhnya menggantikan map groups root (tanpa deep merge). Pencarian prompt kemudian berjalan pada satu map yang dihasilkan:
- Prompt sistem khusus grup (
groups["<groupId>"].systemPrompt): digunakan saat entri grup spesifik ada di map dan kuncisystemPrompt-nya didefinisikan. JikasystemPromptadalah string kosong (""), wildcard ditekan dan tidak ada prompt sistem yang diterapkan. - Prompt sistem wildcard grup (
groups["*"].systemPrompt): digunakan saat entri grup spesifik sama sekali tidak ada dari map, atau saat entri tersebut ada tetapi tidak mendefinisikan kuncisystemPrompt.
direct efektif ditentukan terlebih dahulu: jika akun mendefinisikan direct sendiri, map tersebut sepenuhnya menggantikan map direct root (tanpa deep merge). Pencarian prompt kemudian berjalan pada satu map yang dihasilkan:
- Prompt sistem khusus direct (
direct["<peerId>"].systemPrompt): digunakan ketika entri peer tertentu ada di map dan kuncisystemPrompt-nya didefinisikan. JikasystemPromptberupa string kosong (""), wildcard ditekan dan tidak ada prompt sistem yang diterapkan. - Prompt sistem wildcard direct (
direct["*"].systemPrompt): digunakan ketika entri peer tertentu sama sekali tidak ada di map, atau ketika entri itu ada tetapi tidak mendefinisikan kuncisystemPrompt.
dms tetap menjadi wadah override riwayat per-DM yang ringan (dms.<id>.historyLimit). Override prompt berada di bawah direct.groups sengaja ditekan untuk semua akun dalam penyiapan multi-akun — bahkan akun yang tidak mendefinisikan groups sendiri — untuk mencegah bot menerima pesan grup untuk grup yang tidak diikutinya. WhatsApp tidak menerapkan pelindung ini: root groups dan root direct selalu diwarisi oleh akun yang tidak mendefinisikan override tingkat akun, terlepas dari berapa banyak akun yang dikonfigurasi. Dalam penyiapan WhatsApp multi-akun, jika Anda menginginkan prompt grup atau direct per akun, definisikan map lengkap di bawah setiap akun secara eksplisit alih-alih mengandalkan default tingkat root.
Perilaku penting:
channels.whatsapp.groupsadalah map konfigurasi per grup sekaligus allowlist grup tingkat chat. Pada cakupan root maupun akun,groups["*"]berarti “semua grup diterima” untuk cakupan tersebut.- Tambahkan wildcard grup
systemPrompthanya ketika Anda memang ingin cakupan tersebut menerima semua grup. Jika Anda masih ingin hanya sekumpulan ID grup tetap yang memenuhi syarat, jangan gunakangroups["*"]untuk default prompt. Sebagai gantinya, ulangi prompt pada setiap entri grup yang di-allowlist secara eksplisit. - Penerimaan grup dan otorisasi pengirim adalah pemeriksaan terpisah.
groups["*"]memperluas kumpulan grup yang dapat mencapai penanganan grup, tetapi itu sendiri tidak mengotorisasi setiap pengirim di grup tersebut. Akses pengirim tetap dikendalikan secara terpisah olehchannels.whatsapp.groupPolicydanchannels.whatsapp.groupAllowFrom. channels.whatsapp.directtidak memiliki efek samping yang sama untuk DM.direct["*"]hanya menyediakan konfigurasi chat direct default setelah DM sudah diterima olehdmPolicyplusallowFromatau aturan pairing-store.
Penunjuk referensi konfigurasi
Referensi utama: Field WhatsApp bernilai tinggi:- akses:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - pengiriman:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - multi-akun:
accounts.<id>.enabled,accounts.<id>.authDir, override tingkat akun - operasi:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.*,web.whatsapp.* - perilaku sesi:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit - prompt:
groups.<id>.systemPrompt,groups["*"].systemPrompt,direct.<id>.systemPrompt,direct["*"].systemPrompt