Стан: готовий до production через WhatsApp Web (Baileys). Gateway керує прив’язаними сеансами.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.
Встановлення (на вимогу)
- Onboarding (
openclaw onboard) іopenclaw channels add --channel whatsappпропонують встановити WhatsApp plugin під час першого вибору. openclaw channels login --channel whatsappтакож пропонує процес встановлення, коли plugin ще відсутній.- Dev-канал + git checkout: за замовчуванням використовує локальний шлях plugin.
- Stable/Beta: використовує npm-пакет
@openclaw/whatsappна поточному офіційному тегу релізу.
PATH під час npm install, оскільки
одна з його залежностей Baileys/libsignal завантажується з git URL. Встановіть
Git for Windows, потім перезапустіть оболонку й повторіть встановлення:
bin є в PATH.
Pairing
Channel troubleshooting
Gateway configuration
Швидке налаштування
Link WhatsApp (QR)
Шаблони розгортання
Dedicated number (recommended)
Dedicated number (recommended)
- окрема ідентичність WhatsApp для OpenClaw
- зрозуміліші allowlist-и DM і межі маршрутизації
- менша ймовірність плутанини із чатом із самим собою
Personal-number fallback
Personal-number fallback
dmPolicy: "allowlist"allowFromмістить ваш особистий номерselfChatMode: true
allowFrom.WhatsApp Web-only channel scope
WhatsApp Web-only channel scope
Baileys) у поточній архітектурі каналів OpenClaw.У вбудованому реєстрі чат-каналів немає окремого каналу повідомлень Twilio WhatsApp.Модель виконання
- Gateway керує сокетом WhatsApp і циклом повторного підключення.
- Watchdog повторного підключення використовує активність транспорту WhatsApp Web, а не лише обсяг вхідних повідомлень застосунку, тому тихий сеанс прив’язаного пристрою не перезапускається лише через те, що останнім часом ніхто не надсилав повідомлень. Довший ліміт тиші застосунку все одно примусово виконує повторне підключення, якщо транспортні кадри продовжують надходити, але жодні повідомлення застосунку не обробляються протягом вікна watchdog; після тимчасового повторного підключення для нещодавно активного сеансу ця перевірка тиші застосунку використовує звичайний таймаут повідомлень для першого вікна відновлення.
- Таймінги сокета Baileys явно задаються в
web.whatsapp.*:keepAliveIntervalMsкерує ping-ами застосунку WhatsApp Web,connectTimeoutMsкерує таймаутом початкового handshake, аdefaultQueryTimeoutMsкерує таймаутами запитів Baileys. - Вихідні надсилання потребують активного слухача WhatsApp для цільового облікового запису.
- Групові надсилання додають нативні метадані згадок для токенів
@+<digits>і@<digits>у тексті та підписах медіа, коли токен збігається з поточними метаданими учасників WhatsApp, включно з групами на базі LID. - Чати статусів і трансляцій ігноруються (
@status,@broadcast). - Watchdog повторного підключення відстежує активність транспорту WhatsApp Web, а не лише обсяг вхідних повідомлень застосунку: тихі сеанси прив’язаного пристрою залишаються активними, доки транспортні кадри продовжують надходити, але зупинка транспорту примусово викликає повторне підключення задовго до пізнішого шляху віддаленого відключення.
- Прямі чати використовують правила DM-сеансів (
session.dmScope; типове значенняmainзгортає DM-и до головного сеансу агента). - Групові сеанси ізольовані (
agent:<agentId>:whatsapp:group:<jid>). - WhatsApp Channels/Newsletters можуть бути явними вихідними цілями з їхнім нативним JID
@newsletter. Вихідні надсилання до newsletter використовують метадані сеансу каналу (agent:<agentId>:whatsapp:channel:<jid>), а не семантику DM-сеансу. - Транспорт WhatsApp Web враховує стандартні змінні середовища proxy на хості gateway (
HTTPS_PROXY,HTTP_PROXY,NO_PROXY/ варіанти в нижньому регістрі). Надавайте перевагу конфігурації proxy на рівні хоста замість налаштувань proxy WhatsApp, специфічних для каналу. - Коли
messages.removeAckAfterReplyувімкнено, OpenClaw очищає ack-реакцію WhatsApp після доставки видимої відповіді.
Хуки Plugin і приватність
Вхідні повідомлення WhatsApp можуть містити особистий вміст повідомлень, телефонні номери, ідентифікатори груп, імена відправників і поля кореляції сеансу. З цієї причини WhatsApp не транслює вхідні payload-и хукуmessage_received до plugins,
якщо ви явно не погодитеся:
Контроль доступу та активація
- DM policy
- Group policy + allowlists
- Mentions + /activation
channels.whatsapp.dmPolicy керує доступом до прямих чатів:pairing(типово)allowlistopen(потребує, щобallowFromмістив"*")disabled
allowFrom приймає номери у стилі E.164 (нормалізуються внутрішньо).allowFrom — це список контролю доступу для відправників DM. Він не обмежує явні вихідні надсилання до JID груп WhatsApp або JID каналів @newsletter.Перевизначення для кількох облікових записів: channels.whatsapp.accounts.<id>.dmPolicy (і allowFrom) мають пріоритет над типовими значеннями рівня каналу для цього облікового запису.Подробиці поведінки під час виконання:- pairings зберігаються в allow-store каналу та об’єднуються з налаштованим
allowFrom - запланована автоматизація та fallback для отримувачів Heartbeat використовують явні цілі доставки або налаштований
allowFrom; схвалення DM pairing не є неявними отримувачами Cron чи Heartbeat - якщо allowlist не налаштовано, прив’язаний власний номер дозволено за замовчуванням
- OpenClaw ніколи автоматично не виконує pairing для вихідних DM
fromMe(повідомлень, які ви надсилаєте собі з прив’язаного пристрою)
Особистий номер і поведінка чату із самим собою
Коли прив’язаний власний номер також присутній вallowFrom, активуються захисти чату WhatsApp із самим собою:
- пропускати підтвердження прочитання для ходів чату із самим собою
- ігнорувати поведінку автоматичного запуску mention-JID, яка інакше ping-ала б вас самих
- якщо
messages.responsePrefixне задано, відповіді в чаті із самим собою за замовчуванням мають префікс[{identity.name}]або[openclaw]
Нормалізація повідомлень і контекст
Inbound envelope + reply context
Inbound envelope + reply context
ReplyToId, ReplyToBody, ReplyToSender, JID/E.164 відправника).
Коли ціллю цитованої відповіді є медіа, яке можна завантажити, OpenClaw зберігає його через
звичайне сховище вхідних медіа й надає його як MediaPath/MediaType, щоб
агент міг оглянути згадане зображення, а не бачив лише
<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>, тож вимовлена згадка бота в голосовій нотатці може
запустити відповідь. Якщо транскрипт усе одно не згадує бота, він
зберігається в очікуваній історії групи замість сирого placeholder-а.Тіла локацій використовують стислий текст координат. Мітки/коментарі локацій і деталі контактів/vCard рендеряться як fenced недовірені метадані, а не як inline-текст prompt.Pending group history injection
Pending group history injection
- ліміт за замовчуванням:
50 - конфігурація:
channels.whatsapp.historyLimit - резервне значення:
messages.groupChat.historyLimit 0вимикає
[Chat messages since your last reply - for context][Current message - respond to this]
Read receipts
Read receipts
Доставка, розбиття на фрагменти та медіа
Text chunking
Text chunking
- ліміт фрагмента за замовчуванням:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"- режим
newlineвіддає перевагу межам абзаців (порожнім рядкам), а потім повертається до безпечного за довжиною розбиття
Outbound media behavior
Outbound media behavior
- підтримує зображення, відео, аудіо (голосову нотатку PTT) і документні payload-и
- аудіомедіа надсилається через payload Baileys
audioзptt: true, тому клієнти WhatsApp відтворюють його як голосову нотатку push-to-talk - payload-и відповідей зберігають
audioAsVoice; вивід голосової нотатки TTS для WhatsApp залишається на цьому шляху PTT, навіть коли провайдер повертає MP3 або WebM - нативне аудіо Ogg/Opus надсилається як
audio/ogg; codecs=opusдля сумісності з голосовими нотатками - аудіо не в Ogg, зокрема вивід Microsoft Edge TTS MP3/WebM, транскодується за допомогою
ffmpegу 48 кГц моно Ogg/Opus перед доставкою PTT /tts latestнадсилає останню відповідь асистента як одну голосову нотатку та пригнічує повторні надсилання для тієї самої відповіді;/tts chat on|off|defaultкерує автоматичним TTS для поточного чату WhatsApp- відтворення анімованих GIF підтримується через
gifPlayback: trueпід час надсилання відео - підписи застосовуються до першого медіаелемента під час надсилання payload-ів відповіді з кількома медіа, крім голосових нотаток PTT: вони надсилають аудіо першим, а видимий текст окремо, оскільки клієнти WhatsApp не відображають підписи до голосових нотаток послідовно
- джерелом медіа може бути HTTP(S),
file://або локальні шляхи
Media size limits and fallback behavior
Media size limits and fallback behavior
- обмеження збереження вхідних медіа:
channels.whatsapp.mediaMaxMb(за замовчуванням50) - обмеження надсилання вихідних медіа:
channels.whatsapp.mediaMaxMb(за замовчуванням50) - перевизначення для окремого облікового запису використовують
channels.whatsapp.accounts.<accountId>.mediaMaxMb - зображення автоматично оптимізуються (зміна розміру/добір якості), щоб вкладатися в обмеження
- у разі помилки надсилання медіа резервна поведінка для першого елемента надсилає текстове попередження замість мовчазного відкидання відповіді
Цитування відповідей
WhatsApp підтримує нативне цитування відповідей, коли вихідні відповіді видимо цитують вхідне повідомлення. Керуйте цим за допомогоюchannels.whatsapp.replyToMode.
| Значення | Поведінка |
|---|---|
"off" | Ніколи не цитувати; надсилати як звичайне повідомлення |
"first" | Цитувати лише перший фрагмент вихідної відповіді |
"all" | Цитувати кожен фрагмент вихідної відповіді |
"batched" | Цитувати поставлені в чергу пакетні відповіді, залишаючи негайні відповіді без цитування |
"off". Перевизначення для окремого облікового запису використовують channels.whatsapp.accounts.<id>.replyToMode.
Рівень реакцій
channels.whatsapp.reactionLevel керує тим, наскільки широко агент використовує emoji-реакції у WhatsApp:
| Рівень | Реакції підтвердження | Реакції, ініційовані агентом | Опис |
|---|---|---|---|
"off" | Ні | Ні | Жодних реакцій |
"ack" | Так | Ні | Лише реакції підтвердження (сповіщення перед відповіддю) |
"minimal" | Так | Так (обережно) | Підтвердження + реакції агента з обережними вказівками |
"extensive" | Так | Так (заохочується) | Підтвердження + реакції агента із заохочувальними вказівками |
"minimal".
Перевизначення для окремого облікового запису використовують channels.whatsapp.accounts.<id>.reactionLevel.
Реакції підтвердження
WhatsApp підтримує негайні реакції підтвердження на вхідне отримання черезchannels.whatsapp.ackReaction.
Реакції підтвердження обмежуються reactionLevel — вони пригнічуються, коли reactionLevel дорівнює "off".
- надсилаються негайно після прийняття вхідного повідомлення (до відповіді)
- помилки журналюються, але не блокують звичайну доставку відповіді
- режим групи
mentionsреагує на ходи, запущені згадкою; активація групиalwaysдіє як обхід цієї перевірки - WhatsApp використовує
channels.whatsapp.ackReaction(застарілеmessages.ackReactionтут не використовується)
Кілька облікових записів і облікові дані
Account selection and defaults
Account selection and defaults
- ідентифікатори облікових записів беруться з
channels.whatsapp.accounts - вибір облікового запису за замовчуванням:
default, якщо він є, інакше перший налаштований ідентифікатор облікового запису (відсортований) - ідентифікатори облікових записів нормалізуються внутрішньо для пошуку
Credential paths and legacy compatibility
Credential paths and legacy compatibility
- поточний шлях автентифікації:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - файл резервної копії:
creds.json.bak - застаріла автентифікація за замовчуванням у
~/.openclaw/credentials/усе ще розпізнається/мігрується для потоків облікового запису за замовчуванням
Logout behavior
Logout behavior
openclaw channels logout --channel whatsapp [--account <id>] очищає стан автентифікації WhatsApp для цього облікового запису.Коли Gateway доступний, вихід спочатку зупиняє активний слухач WhatsApp для вибраного облікового запису, щоб повʼязана сесія не продовжувала отримувати повідомлення до наступного перезапуску. openclaw channels remove --channel whatsapp також зупиняє активний слухач перед вимкненням або видаленням конфігурації облікового запису.У застарілих каталогах автентифікації oauth.json зберігається, тоді як файли автентифікації Baileys видаляються.Інструменти, дії та записи конфігурації
- Підтримка інструментів агента включає дію реакції WhatsApp (
react). - Обмеження дій:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- Записи конфігурації, ініційовані каналом, увімкнені за замовчуванням (вимикаються через
channels.whatsapp.configWrites=false).
Усунення несправностей
Not linked (QR required)
Not linked (QR required)
Linked but disconnected / reconnect loop
Linked but disconnected / reconnect loop
status=408 Request Time-out Connection was lost, налаштуйте
таймінги socket Baileys у web.whatsapp. Почніть зі скорочення
keepAliveIntervalMs нижче тайм-ауту простою вашої мережі та збільшення
connectTimeoutMs на повільних або ненадійних зʼєднаннях:~/.openclaw/logs/whatsapp-health.log містить Gateway inactive, але
openclaw gateway status і openclaw channels status --probe показують, що
Gateway і WhatsApp справні, запустіть openclaw doctor. У Linux doctor
попереджає про застарілі записи crontab, які все ще викликають
~/.openclaw/bin/ensure-whatsapp.sh; видаліть ці застарілі записи за допомогою
crontab -e, оскільки cron може не мати середовища systemd user-bus і
змушувати цей старий скрипт неправильно повідомляти про стан Gateway.За потреби повторно повʼяжіть через channels login.QR login times out behind a proxy
QR login times out behind a proxy
openclaw channels login --channel whatsapp завершується помилкою до показу придатного QR-коду з status=408 Request Time-out або розривом TLS socket.Вхід у WhatsApp Web використовує стандартне proxy-середовище хоста Gateway (HTTPS_PROXY, HTTP_PROXY, варіанти нижнім регістром і NO_PROXY). Перевірте, що процес Gateway успадковує proxy env і що NO_PROXY не відповідає mmg.whatsapp.net.No active listener when sending
No active listener when sending
Reply appears in transcript but not in WhatsApp
Reply appears in transcript but not in WhatsApp
Group messages unexpectedly ignored
Group messages unexpectedly ignored
groupPolicygroupAllowFrom/allowFrom- записи allowlist
groups - обмеження за згадками (
requireMention+ шаблони згадок) - дублікати ключів у
openclaw.json(JSON5): пізніші записи перевизначають раніші, тому залишайте одинgroupPolicyдля кожної області
Bun runtime warning
Bun runtime warning
Системні prompts
WhatsApp підтримує системні prompts у стилі Telegram для груп і прямих чатів через мапиgroups і direct.
Ієрархія вирішення для групових повідомлень:
Ефективна мапа groups визначається першою: якщо обліковий запис визначає власну groups, вона повністю замінює кореневу мапу groups (без глибокого злиття). Пошук prompt потім виконується в отриманій єдиній мапі:
- Системний prompt для конкретної групи (
groups["<groupId>"].systemPrompt): використовується, коли конкретний запис групи існує в мапі і його ключsystemPromptвизначений. ЯкщоsystemPromptє порожнім рядком (""), wildcard пригнічується, і системний prompt не застосовується. - Wildcard системного prompt групи (
groups["*"].systemPrompt): використовується, коли конкретний запис групи повністю відсутній у мапі або коли він існує, але не визначає ключsystemPrompt.
direct визначається першою: якщо обліковий запис визначає власну direct, вона повністю замінює кореневу мапу direct (без глибокого злиття). Пошук prompt потім виконується в отриманій єдиній мапі:
- Системний промпт для конкретного direct (
direct["<peerId>"].systemPrompt): використовується, коли конкретний запис peer існує в мапі і його ключsystemPromptвизначено. ЯкщоsystemPromptє порожнім рядком (""), wildcard пригнічується, і системний промпт не застосовується. - Wildcard системного промпту direct (
direct["*"].systemPrompt): використовується, коли конкретний запис peer повністю відсутній у мапі або коли він існує, але не визначає ключsystemPrompt.
dms залишається легким bucket для перевизначення історії на рівні окремого DM (dms.<id>.historyLimit). Перевизначення промптів живуть у direct.groups навмисно пригнічується для всіх облікових записів у конфігурації з кількома обліковими записами — навіть для тих, що не визначають власних groups — щоб бот не отримував групові повідомлення для груп, до яких він не належить. WhatsApp не застосовує цей захист: кореневі groups і кореневий direct завжди успадковуються обліковими записами, які не визначають перевизначення на рівні облікового запису, незалежно від кількості налаштованих облікових записів. У конфігурації WhatsApp з кількома обліковими записами, якщо вам потрібні групові або direct-промпти для кожного облікового запису окремо, визначайте повну мапу явно в кожному обліковому записі, а не покладайтеся на кореневі значення за замовчуванням.
Важлива поведінка:
channels.whatsapp.groupsє одночасно мапою конфігурації для окремих груп і allowlist груп на рівні чату. На кореневому рівні або в scope облікового записуgroups["*"]означає “допущено всі групи” для цього scope.- Додавайте wildcard групового
systemPromptлише тоді, коли ви вже хочете, щоб цей scope допускав усі групи. Якщо ви все ще хочете, щоб придатним був лише фіксований набір ID груп, не використовуйтеgroups["*"]як значення промпту за замовчуванням. Натомість повторіть промпт у кожному явно внесеному до allowlist записі групи. - Допуск групи й авторизація відправника є окремими перевірками.
groups["*"]розширює набір груп, які можуть досягати обробки груп, але сам по собі не авторизує кожного відправника в цих групах. Доступ відправника все ще окремо контролюєтьсяchannels.whatsapp.groupPolicyіchannels.whatsapp.groupAllowFrom. channels.whatsapp.directне має такого самого побічного ефекту для DM.direct["*"]лише надає конфігурацію direct-чату за замовчуванням після того, як DM уже допущено черезdmPolicyплюсallowFromабо правила pairing-store.
Вказівники довідника конфігурації
Основний довідник: Найважливіші поля WhatsApp:- доступ:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - доставка:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - кілька облікових записів:
accounts.<id>.enabled,accounts.<id>.authDir, перевизначення на рівні облікового запису - операції:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.*,web.whatsapp.* - поведінка сеансу:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit - промпти:
groups.<id>.systemPrompt,groups["*"].systemPrompt,direct.<id>.systemPrompt,direct["*"].systemPrompt