chore(i18n): refresh uk translations
This commit is contained in:
parent
6dd293a6c5
commit
4818cf65ef
@ -1,28 +1,28 @@
|
||||
---
|
||||
read_when:
|
||||
- Робота з поведінкою каналу WhatsApp/вебканалу або маршрутизацією вхідної скриньки
|
||||
summary: Підтримка каналу WhatsApp, засоби контролю доступу, поведінка доставки та експлуатація
|
||||
- Робота над поведінкою WhatsApp/веб-каналу або маршрутизацією вхідних повідомлень
|
||||
summary: Підтримка каналу WhatsApp, засоби керування доступом, поведінка доставки та операції
|
||||
title: WhatsApp
|
||||
x-i18n:
|
||||
generated_at: "2026-05-03T05:39:59Z"
|
||||
generated_at: "2026-05-05T04:18:40Z"
|
||||
model: gpt-5.5
|
||||
provider: openai
|
||||
source_hash: 2f12709fc8ecb45e1b060647daf9a4624485d52b7b6436c3d07f171e6807babf
|
||||
source_hash: 52a81fc323568e06d11606931e34465fe5a823a0699d8e0638195b8667c3ebee
|
||||
source_path: channels/whatsapp.md
|
||||
workflow: 16
|
||||
---
|
||||
|
||||
Стан: готовий до production через WhatsApp Web (Baileys). Gateway володіє пов’язаними сеансами.
|
||||
Стан: готовий до production через WhatsApp Web (Baileys). Gateway керує прив’язаними сеансами.
|
||||
|
||||
## Встановлення (на вимогу)
|
||||
|
||||
- Onboarding (`openclaw onboard`) і `openclaw channels add --channel whatsapp`
|
||||
пропонують установити WhatsApp plugin під час першого вибору.
|
||||
- `openclaw channels login --channel whatsapp` також пропонує потік установлення, коли
|
||||
пропонують встановити WhatsApp plugin під час першого вибору.
|
||||
- `openclaw channels login --channel whatsapp` також пропонує процес встановлення, коли
|
||||
plugin ще відсутній.
|
||||
- Dev-канал + git checkout: стандартно використовує локальний шлях plugin.
|
||||
- Dev-канал + git checkout: за замовчуванням використовує локальний шлях plugin.
|
||||
- Stable/Beta: використовує npm-пакет `@openclaw/whatsapp` на поточному офіційному
|
||||
тезі релізу.
|
||||
тегу релізу.
|
||||
|
||||
Ручне встановлення залишається доступним:
|
||||
|
||||
@ -30,18 +30,28 @@ x-i18n:
|
||||
openclaw plugins install @openclaw/whatsapp
|
||||
```
|
||||
|
||||
Використовуйте пакет без версії, щоб слідувати за поточним офіційним тегом релізу. Закріплюйте точну
|
||||
Використовуйте пакет без версії, щоб стежити за поточним офіційним тегом релізу. Закріплюйте точну
|
||||
версію лише тоді, коли потрібне відтворюване встановлення.
|
||||
|
||||
У Windows WhatsApp plugin потребує Git у `PATH` під час npm install, оскільки
|
||||
одна з його залежностей Baileys/libsignal завантажується з git URL. Встановіть
|
||||
Git for Windows, потім перезапустіть оболонку й повторіть встановлення:
|
||||
|
||||
```powershell
|
||||
winget install --id Git.Git -e
|
||||
```
|
||||
|
||||
Portable Git також працює, якщо його каталог `bin` є в `PATH`.
|
||||
|
||||
<CardGroup cols={3}>
|
||||
<Card title="Pairing" icon="link" href="/uk/channels/pairing">
|
||||
Типова політика DM — pairing для невідомих відправників.
|
||||
</Card>
|
||||
<Card title="Channel troubleshooting" icon="wrench" href="/uk/channels/troubleshooting">
|
||||
Діагностика між каналами та playbook-и відновлення.
|
||||
Міжканальна діагностика та playbook-и виправлення.
|
||||
</Card>
|
||||
<Card title="Gateway configuration" icon="settings" href="/uk/gateway/configuration">
|
||||
Повні шаблони та приклади конфігурації каналів.
|
||||
Повні шаблони й приклади конфігурації каналів.
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
@ -77,7 +87,7 @@ openclaw channels login --channel whatsapp
|
||||
openclaw channels login --channel whatsapp --account work
|
||||
```
|
||||
|
||||
Щоб під’єднати наявний/власний каталог автентифікації WhatsApp Web перед входом:
|
||||
Щоб під’єднати наявний/користувацький каталог автентифікації WhatsApp Web перед входом:
|
||||
|
||||
```bash
|
||||
openclaw channels add --channel whatsapp --account work --auth-dir /path/to/wa-auth
|
||||
@ -101,13 +111,13 @@ openclaw pairing list whatsapp
|
||||
openclaw pairing approve whatsapp <CODE>
|
||||
```
|
||||
|
||||
Запити pairing спливають через 1 годину. Очікувані запити обмежені 3 на канал.
|
||||
Запити pairing спливають через 1 годину. Кількість очікуваних запитів обмежена 3 на канал.
|
||||
|
||||
</Step>
|
||||
</Steps>
|
||||
|
||||
<Note>
|
||||
OpenClaw рекомендує за можливості запускати WhatsApp на окремому номері. (Метадані каналу та потік налаштування оптимізовані для такого налаштування, але налаштування з особистим номером також підтримуються.)
|
||||
OpenClaw рекомендує за можливості запускати WhatsApp на окремому номері. (Метадані каналу та процес налаштування оптимізовані для такого варіанту, але налаштування з особистим номером також підтримуються.)
|
||||
</Note>
|
||||
|
||||
## Шаблони розгортання
|
||||
@ -117,8 +127,8 @@ OpenClaw рекомендує за можливості запускати Whats
|
||||
Це найчистіший операційний режим:
|
||||
|
||||
- окрема ідентичність WhatsApp для OpenClaw
|
||||
- чіткіші allowlist-и DM і межі маршрутизації
|
||||
- менша ймовірність плутанини із self-chat
|
||||
- зрозуміліші allowlist-и DM і межі маршрутизації
|
||||
- менша ймовірність плутанини із чатом із самим собою
|
||||
|
||||
Мінімальний шаблон політики:
|
||||
|
||||
@ -136,44 +146,44 @@ OpenClaw рекомендує за можливості запускати Whats
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Personal-number fallback">
|
||||
Onboarding підтримує режим особистого номера і записує базовий варіант, зручний для self-chat:
|
||||
Onboarding підтримує режим особистого номера й записує базову конфігурацію, зручну для чату із самим собою:
|
||||
|
||||
- `dmPolicy: "allowlist"`
|
||||
- `allowFrom` містить ваш особистий номер
|
||||
- `selfChatMode: true`
|
||||
|
||||
Під час runtime захисти self-chat спираються на пов’язаний власний номер і `allowFrom`.
|
||||
Під час виконання захисти чату із самим собою спираються на прив’язаний власний номер і `allowFrom`.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="WhatsApp Web-only channel scope">
|
||||
Канал платформи повідомлень у поточній архітектурі каналів OpenClaw базується на WhatsApp Web (`Baileys`).
|
||||
Канал платформи обміну повідомленнями базується на WhatsApp Web (`Baileys`) у поточній архітектурі каналів OpenClaw.
|
||||
|
||||
У вбудованому реєстрі чат-каналів немає окремого каналу обміну повідомленнями Twilio WhatsApp.
|
||||
У вбудованому реєстрі чат-каналів немає окремого каналу повідомлень Twilio WhatsApp.
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Модель runtime
|
||||
## Модель виконання
|
||||
|
||||
- Gateway володіє сокетом WhatsApp і циклом повторного підключення.
|
||||
- Watchdog повторного підключення використовує активність транспорту WhatsApp Web, а не лише обсяг вхідних app-message, тому тихий сеанс пов’язаного пристрою не перезапускається тільки через те, що останнім часом ніхто не надсилав повідомлень. Довший ліміт тиші застосунку все ще примусово запускає повторне підключення, якщо транспортні кадри продовжують надходити, але протягом вікна watchdog не обробляються повідомлення застосунку; після тимчасового повторного підключення для нещодавно активного сеансу ця перевірка тиші застосунку використовує звичайний таймаут повідомлень для першого вікна відновлення.
|
||||
- Таймінги сокета Baileys явно задані в `web.whatsapp.*`: `keepAliveIntervalMs` керує application ping-ами WhatsApp Web, `connectTimeoutMs` керує таймаутом початкового handshake, а `defaultQueryTimeoutMs` керує таймаутами запитів Baileys.
|
||||
- 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, а не лише за обсягом вхідних app-message: тихі сеанси пов’язаного пристрою залишаються активними, доки транспортні кадри продовжують надходити, але зупинка транспорту примусово запускає повторне підключення задовго до пізнішого шляху віддаленого від’єднання.
|
||||
- Прямі чати використовують правила сеансу DM (`session.dmScope`; стандартне `main` згортає DM до головного сеансу агента).
|
||||
- Групові надсилання додають нативні метадані згадок для токенів `@+<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 поважає стандартні змінні середовища проксі на хості Gateway (`HTTPS_PROXY`, `HTTP_PROXY`, `NO_PROXY` / варіанти в нижньому регістрі). Надавайте перевагу проксі-конфігурації на рівні хоста, а не специфічним для каналу налаштуванням проксі WhatsApp.
|
||||
- Коли `messages.removeAckAfterReply` увімкнено, OpenClaw очищає реакцію ack WhatsApp після доставлення видимої відповіді.
|
||||
- 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-и hook `message_received` до plugins,
|
||||
ідентифікатори груп, імена відправників і поля кореляції сеансу. З цієї причини
|
||||
WhatsApp не транслює вхідні payload-и хуку `message_received` до plugins,
|
||||
якщо ви явно не погодитеся:
|
||||
|
||||
```json5
|
||||
@ -206,10 +216,10 @@ WhatsApp не транслює вхідні payload-и hook `message_received`
|
||||
}
|
||||
```
|
||||
|
||||
Умикайте це лише для plugins, яким ви довіряєте отримувати вміст і
|
||||
ідентифікатори вхідних повідомлень WhatsApp.
|
||||
Умикайте це лише для plugins, яким ви довіряєте отримувати вхідний вміст повідомлень
|
||||
WhatsApp та ідентифікатори.
|
||||
|
||||
## Контроль доступу й активація
|
||||
## Контроль доступу та активація
|
||||
|
||||
<Tabs>
|
||||
<Tab title="DM policy">
|
||||
@ -222,16 +232,16 @@ WhatsApp не транслює вхідні payload-и hook `message_received`
|
||||
|
||||
`allowFrom` приймає номери у стилі E.164 (нормалізуються внутрішньо).
|
||||
|
||||
`allowFrom` — це список контролю доступу відправників DM. Він не блокує явні вихідні надсилання до JID груп WhatsApp або JID каналів `@newsletter`.
|
||||
`allowFrom` — це список контролю доступу для відправників DM. Він не обмежує явні вихідні надсилання до JID груп WhatsApp або JID каналів `@newsletter`.
|
||||
|
||||
Перевизначення для кількох облікових записів: `channels.whatsapp.accounts.<id>.dmPolicy` (і `allowFrom`) мають пріоритет над типовими значеннями рівня каналу для цього облікового запису.
|
||||
|
||||
Деталі поведінки runtime:
|
||||
Подробиці поведінки під час виконання:
|
||||
|
||||
- pairings зберігаються в allow-store каналу та об’єднуються з налаштованим `allowFrom`
|
||||
- запланована автоматизація та резервні отримувачі Heartbeat використовують явні цілі доставлення або налаштований `allowFrom`; схвалення DM pairing не є неявними отримувачами Cron чи Heartbeat
|
||||
- якщо allowlist не налаштовано, пов’язаний власний номер дозволено типово
|
||||
- OpenClaw ніколи автоматично не pairing-ить вихідні DM `fromMe` (повідомлення, які ви надсилаєте собі з пов’язаного пристрою)
|
||||
- запланована автоматизація та fallback для отримувачів Heartbeat використовують явні цілі доставки або налаштований `allowFrom`; схвалення DM pairing не є неявними отримувачами Cron чи Heartbeat
|
||||
- якщо allowlist не налаштовано, прив’язаний власний номер дозволено за замовчуванням
|
||||
- OpenClaw ніколи автоматично не виконує pairing для вихідних DM `fromMe` (повідомлень, які ви надсилаєте собі з прив’язаного пристрою)
|
||||
|
||||
</Tab>
|
||||
|
||||
@ -242,58 +252,58 @@ WhatsApp не транслює вхідні payload-и hook `message_received`
|
||||
- якщо `groups` пропущено, усі групи придатні
|
||||
- якщо `groups` присутній, він діє як allowlist груп (`"*"` дозволено)
|
||||
|
||||
2. **Політика відправника групи** (`channels.whatsapp.groupPolicy` + `groupAllowFrom`)
|
||||
2. **Політика відправників групи** (`channels.whatsapp.groupPolicy` + `groupAllowFrom`)
|
||||
- `open`: allowlist відправників обходиться
|
||||
- `allowlist`: відправник має відповідати `groupAllowFrom` (або `*`)
|
||||
- `disabled`: блокує всі групові вхідні повідомлення
|
||||
- `allowlist`: відправник має збігатися з `groupAllowFrom` (або `*`)
|
||||
- `disabled`: блокує всі вхідні групові повідомлення
|
||||
|
||||
Резервна логіка allowlist відправників:
|
||||
Fallback allowlist відправників:
|
||||
|
||||
- якщо `groupAllowFrom` не задано, runtime повертається до `allowFrom`, коли він доступний
|
||||
- якщо `groupAllowFrom` не задано, під час виконання використовується fallback до `allowFrom`, коли він доступний
|
||||
- allowlist-и відправників оцінюються перед активацією згадкою/відповіддю
|
||||
|
||||
Примітка: якщо блок `channels.whatsapp` взагалі відсутній, runtime fallback групової політики — `allowlist` (із попереджувальним логом), навіть якщо `channels.defaults.groupPolicy` задано.
|
||||
Примітка: якщо блока `channels.whatsapp` взагалі немає, fallback політики груп під час виконання — `allowlist` (із попереджувальним логом), навіть якщо задано `channels.defaults.groupPolicy`.
|
||||
|
||||
</Tab>
|
||||
|
||||
<Tab title="Mentions + /activation">
|
||||
Групові відповіді типово потребують згадки.
|
||||
Групові відповіді за замовчуванням потребують згадки.
|
||||
|
||||
Виявлення згадок включає:
|
||||
Виявлення згадок охоплює:
|
||||
|
||||
- явні згадки WhatsApp ідентичності бота
|
||||
- налаштовані regex-шаблони згадок (`agents.list[].groupChat.mentionPatterns`, fallback `messages.groupChat.mentionPatterns`)
|
||||
- транскрипти вхідних voice-note для авторизованих групових повідомлень
|
||||
- неявне виявлення reply-to-bot (відправник відповіді відповідає ідентичності бота)
|
||||
- налаштовані шаблони regex згадок (`agents.list[].groupChat.mentionPatterns`, fallback `messages.groupChat.mentionPatterns`)
|
||||
- транскрипти вхідних голосових нотаток для авторизованих групових повідомлень
|
||||
- неявне виявлення відповіді боту (відправник відповіді збігається з ідентичністю бота)
|
||||
|
||||
Примітка щодо безпеки:
|
||||
|
||||
- цитата/відповідь лише задовольняє mention gating; вона **не** надає авторизацію відправнику
|
||||
- з `groupPolicy: "allowlist"` відправники поза allowlist усе одно блокуються, навіть якщо відповідають на повідомлення користувача з allowlist
|
||||
- цитата/відповідь лише задовольняє перевірку згадки; вона **не** надає авторизацію відправника
|
||||
- із `groupPolicy: "allowlist"` відправники не з allowlist все одно блокуються, навіть якщо вони відповідають на повідомлення користувача з allowlist
|
||||
|
||||
Команда активації на рівні сеансу:
|
||||
|
||||
- `/activation mention`
|
||||
- `/activation always`
|
||||
|
||||
`activation` оновлює стан сеансу (не глобальну конфігурацію). Вона owner-gated.
|
||||
`activation` оновлює стан сеансу (не глобальну конфігурацію). Вона обмежена власником.
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Поведінка особистого номера та self-chat
|
||||
## Особистий номер і поведінка чату із самим собою
|
||||
|
||||
Коли пов’язаний власний номер також присутній в `allowFrom`, активуються запобіжники WhatsApp self-chat:
|
||||
Коли прив’язаний власний номер також присутній в `allowFrom`, активуються захисти чату WhatsApp із самим собою:
|
||||
|
||||
- пропускати read receipts для ходів self-chat
|
||||
- ігнорувати поведінку auto-trigger за mention-JID, яка інакше ping-ила б вас
|
||||
- якщо `messages.responsePrefix` не задано, відповіді self-chat типово мають префікс `[{identity.name}]` або `[openclaw]`
|
||||
- пропускати підтвердження прочитання для ходів чату із самим собою
|
||||
- ігнорувати поведінку автоматичного запуску mention-JID, яка інакше ping-ала б вас самих
|
||||
- якщо `messages.responsePrefix` не задано, відповіді в чаті із самим собою за замовчуванням мають префікс `[{identity.name}]` або `[openclaw]`
|
||||
|
||||
## Нормалізація повідомлень і контекст
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Inbound envelope + reply context">
|
||||
Вхідні повідомлення WhatsApp загортаються у спільний вхідний envelope.
|
||||
Вхідні повідомлення WhatsApp обгортаються у спільний вхідний envelope.
|
||||
|
||||
Якщо існує цитована відповідь, контекст додається в такій формі:
|
||||
|
||||
@ -304,15 +314,15 @@ WhatsApp не транслює вхідні payload-и hook `message_received`
|
||||
```
|
||||
|
||||
Поля метаданих відповіді також заповнюються, коли доступні (`ReplyToId`, `ReplyToBody`, `ReplyToSender`, JID/E.164 відправника).
|
||||
Коли ціль цитованої відповіді є медіа, яке можна завантажити, OpenClaw зберігає його через
|
||||
звичайне сховище вхідних медіа й показує як `MediaPath`/`MediaType`, щоб
|
||||
агент міг оглянути згадане зображення, а не бачити лише
|
||||
Коли ціллю цитованої відповіді є медіа, яке можна завантажити, OpenClaw зберігає його через
|
||||
звичайне сховище вхідних медіа й надає його як `MediaPath`/`MediaType`, щоб
|
||||
агент міг оглянути згадане зображення, а не бачив лише
|
||||
`<media:image>`.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Media placeholders and location/contact extraction">
|
||||
Вхідні повідомлення лише з медіа нормалізуються з placeholder-ами, такими як:
|
||||
Вхідні повідомлення лише з медіа нормалізуються із placeholder-ами, такими як:
|
||||
|
||||
- `<media:image>`
|
||||
- `<media:video>`
|
||||
@ -320,24 +330,24 @@ WhatsApp не транслює вхідні payload-и hook `message_received`
|
||||
- `<media:document>`
|
||||
- `<media:sticker>`
|
||||
|
||||
Авторизовані групові voice notes транскрибуються перед mention gating, коли
|
||||
тіло містить лише `<media:audio>`, тож вимовлена згадка бота у voice note може
|
||||
запустити відповідь. Якщо транскрипт усе ще не згадує бота, його
|
||||
зберігають в очікуваній груповій історії замість сирого placeholder-а.
|
||||
Авторизовані групові голосові нотатки транскрибуються перед перевіркою згадки, коли
|
||||
тіло містить лише `<media:audio>`, тож вимовлена згадка бота в голосовій нотатці може
|
||||
запустити відповідь. Якщо транскрипт усе одно не згадує бота, він
|
||||
зберігається в очікуваній історії групи замість сирого placeholder-а.
|
||||
|
||||
Тіла локацій використовують стислий текст координат. Мітки/коментарі локацій і дані contact/vCard рендеряться як fenced недовірені метадані, а не inline-текст prompt.
|
||||
Тіла локацій використовують стислий текст координат. Мітки/коментарі локацій і деталі контактів/vCard рендеряться як fenced недовірені метадані, а не як inline-текст prompt.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Pending group history injection">
|
||||
Для груп необроблені повідомлення можуть буферизуватися й додаватися як контекст, коли бота нарешті активовано.
|
||||
Для груп необроблені повідомлення можуть буферизуватися й додаватися як контекст, коли бот нарешті спрацює.
|
||||
|
||||
- типовий ліміт: `50`
|
||||
- ліміт за замовчуванням: `50`
|
||||
- конфігурація: `channels.whatsapp.historyLimit`
|
||||
- fallback: `messages.groupChat.historyLimit`
|
||||
- резервне значення: `messages.groupChat.historyLimit`
|
||||
- `0` вимикає
|
||||
|
||||
Маркери ін’єкції:
|
||||
Маркери інʼєкції:
|
||||
|
||||
- `[Chat messages since your last reply - for context]`
|
||||
- `[Current message - respond to this]`
|
||||
@ -345,7 +355,7 @@ WhatsApp не транслює вхідні payload-и hook `message_received`
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Read receipts">
|
||||
Read receipts типово ввімкнені для прийнятих вхідних повідомлень WhatsApp.
|
||||
Сповіщення про прочитання ввімкнені за замовчуванням для прийнятих вхідних повідомлень WhatsApp.
|
||||
|
||||
Вимкнути глобально:
|
||||
|
||||
@ -359,7 +369,7 @@ WhatsApp не транслює вхідні payload-и hook `message_received`
|
||||
}
|
||||
```
|
||||
|
||||
Перевизначення для облікового запису:
|
||||
Перевизначення для окремого облікового запису:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -383,37 +393,37 @@ WhatsApp не транслює вхідні payload-и hook `message_received`
|
||||
## Доставка, розбиття на фрагменти та медіа
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Розбиття тексту на фрагменти">
|
||||
- типовий ліміт фрагмента: `channels.whatsapp.textChunkLimit = 4000`
|
||||
<Accordion title="Text chunking">
|
||||
- ліміт фрагмента за замовчуванням: `channels.whatsapp.textChunkLimit = 4000`
|
||||
- `channels.whatsapp.chunkMode = "length" | "newline"`
|
||||
- режим `newline` віддає перевагу межам абзаців (порожнім рядкам), а потім переходить до безпечного за довжиною розбиття на фрагменти
|
||||
- режим `newline` віддає перевагу межам абзаців (порожнім рядкам), а потім повертається до безпечного за довжиною розбиття
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Поведінка вихідних медіа">
|
||||
- підтримує зображення, відео, аудіо (голосову нотатку PTT) і документні payloads
|
||||
- аудіомедіа надсилаються через payload Baileys `audio` з `ptt: true`, тому клієнти WhatsApp відображають їх як голосову нотатку push-to-talk
|
||||
- payloads відповідей зберігають `audioAsVoice`; вивід голосової нотатки TTS для WhatsApp залишається на цьому шляху PTT, навіть коли провайдер повертає MP3 або WebM
|
||||
<Accordion title="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` у моно Ogg/Opus 48 кГц перед доставкою PTT
|
||||
- `/tts latest` надсилає останню відповідь асистента як одну голосову нотатку та приглушує повторні надсилання тієї самої відповіді; `/tts chat on|off|default` керує автоматичним TTS для поточного чату WhatsApp
|
||||
- аудіо не в Ogg, зокрема вивід Microsoft Edge TTS MP3/WebM, транскодується за допомогою `ffmpeg` у 48 кГц моно Ogg/Opus перед доставкою PTT
|
||||
- `/tts latest` надсилає останню відповідь асистента як одну голосову нотатку та пригнічує повторні надсилання для тієї самої відповіді; `/tts chat on|off|default` керує автоматичним TTS для поточного чату WhatsApp
|
||||
- відтворення анімованих GIF підтримується через `gifPlayback: true` під час надсилання відео
|
||||
- підписи застосовуються до першого медіаелемента під час надсилання payloads відповідей із кількома медіа, окрім голосових нотаток PTT: вони надсилають аудіо першим, а видимий текст окремо, оскільки клієнти WhatsApp не відображають підписи до голосових нотаток послідовно
|
||||
- підписи застосовуються до першого медіаелемента під час надсилання payload-ів відповіді з кількома медіа, крім голосових нотаток PTT: вони надсилають аудіо першим, а видимий текст окремо, оскільки клієнти WhatsApp не відображають підписи до голосових нотаток послідовно
|
||||
- джерелом медіа може бути HTTP(S), `file://` або локальні шляхи
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Обмеження розміру медіа та резервна поведінка">
|
||||
- ліміт збереження вхідних медіа: `channels.whatsapp.mediaMaxMb` (типово `50`)
|
||||
- ліміт надсилання вихідних медіа: `channels.whatsapp.mediaMaxMb` (типово `50`)
|
||||
- перевизначення для облікового запису використовують `channels.whatsapp.accounts.<accountId>.mediaMaxMb`
|
||||
- зображення автоматично оптимізуються (зміна розміру/перебір якості), щоб відповідати лімітам
|
||||
- у разі помилки надсилання медіа резервний варіант для першого елемента надсилає текстове попередження замість тихого відкидання відповіді
|
||||
<Accordion title="Media size limits and fallback behavior">
|
||||
- обмеження збереження вхідних медіа: `channels.whatsapp.mediaMaxMb` (за замовчуванням `50`)
|
||||
- обмеження надсилання вихідних медіа: `channels.whatsapp.mediaMaxMb` (за замовчуванням `50`)
|
||||
- перевизначення для окремого облікового запису використовують `channels.whatsapp.accounts.<accountId>.mediaMaxMb`
|
||||
- зображення автоматично оптимізуються (зміна розміру/добір якості), щоб вкладатися в обмеження
|
||||
- у разі помилки надсилання медіа резервна поведінка для першого елемента надсилає текстове попередження замість мовчазного відкидання відповіді
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Цитування відповіді
|
||||
## Цитування відповідей
|
||||
|
||||
WhatsApp підтримує нативне цитування відповідей, коли вихідні відповіді видимо цитують вхідне повідомлення. Керуйте цим за допомогою `channels.whatsapp.replyToMode`.
|
||||
|
||||
@ -424,7 +434,7 @@ WhatsApp підтримує нативне цитування відповіде
|
||||
| `"all"` | Цитувати кожен фрагмент вихідної відповіді |
|
||||
| `"batched"` | Цитувати поставлені в чергу пакетні відповіді, залишаючи негайні відповіді без цитування |
|
||||
|
||||
Типово: `"off"`. Перевизначення для облікового запису використовують `channels.whatsapp.accounts.<id>.replyToMode`.
|
||||
За замовчуванням: `"off"`. Перевизначення для окремого облікового запису використовують `channels.whatsapp.accounts.<id>.replyToMode`.
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -438,18 +448,18 @@ WhatsApp підтримує нативне цитування відповіде
|
||||
|
||||
## Рівень реакцій
|
||||
|
||||
`channels.whatsapp.reactionLevel` керує тим, наскільки широко агент використовує емодзі-реакції у WhatsApp:
|
||||
`channels.whatsapp.reactionLevel` керує тим, наскільки широко агент використовує emoji-реакції у WhatsApp:
|
||||
|
||||
| Рівень | Реакції підтвердження | Реакції, ініційовані агентом | Опис |
|
||||
| ------------- | --------------------- | ---------------------------- | ------------------------------------------------ |
|
||||
| `"off"` | Ні | Ні | Жодних реакцій |
|
||||
| `"ack"` | Так | Ні | Лише реакції підтвердження (отримання перед відповіддю) |
|
||||
| `"minimal"` | Так | Так (обережно) | Підтвердження + реакції агента з обережними вказівками |
|
||||
| `"extensive"` | Так | Так (заохочується) | Підтвердження + реакції агента із заохочувальними вказівками |
|
||||
| Рівень | Реакції підтвердження | Реакції, ініційовані агентом | Опис |
|
||||
| ------------- | ------------- | ------------------------- | ------------------------------------------------ |
|
||||
| `"off"` | Ні | Ні | Жодних реакцій |
|
||||
| `"ack"` | Так | Ні | Лише реакції підтвердження (сповіщення перед відповіддю) |
|
||||
| `"minimal"` | Так | Так (обережно) | Підтвердження + реакції агента з обережними вказівками |
|
||||
| `"extensive"` | Так | Так (заохочується) | Підтвердження + реакції агента із заохочувальними вказівками |
|
||||
|
||||
Типово: `"minimal"`.
|
||||
За замовчуванням: `"minimal"`.
|
||||
|
||||
Перевизначення для облікового запису використовують `channels.whatsapp.accounts.<id>.reactionLevel`.
|
||||
Перевизначення для окремого облікового запису використовують `channels.whatsapp.accounts.<id>.reactionLevel`.
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -463,8 +473,8 @@ WhatsApp підтримує нативне цитування відповіде
|
||||
|
||||
## Реакції підтвердження
|
||||
|
||||
WhatsApp підтримує негайні реакції підтвердження на отримання вхідного повідомлення через `channels.whatsapp.ackReaction`.
|
||||
Реакції підтвердження обмежуються `reactionLevel` — вони приглушуються, коли `reactionLevel` дорівнює `"off"`.
|
||||
WhatsApp підтримує негайні реакції підтвердження на вхідне отримання через `channels.whatsapp.ackReaction`.
|
||||
Реакції підтвердження обмежуються `reactionLevel` — вони пригнічуються, коли `reactionLevel` дорівнює `"off"`.
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -482,34 +492,34 @@ WhatsApp підтримує негайні реакції підтверджен
|
||||
|
||||
Примітки щодо поведінки:
|
||||
|
||||
- надсилається негайно після прийняття вхідного повідомлення (перед відповіддю)
|
||||
- помилки записуються в журнал, але не блокують нормальну доставку відповіді
|
||||
- груповий режим `mentions` реагує на ходи, запущені згадкою; групова активація `always` діє як обхід цієї перевірки
|
||||
- WhatsApp використовує `channels.whatsapp.ackReaction` (застарілий `messages.ackReaction` тут не використовується)
|
||||
- надсилаються негайно після прийняття вхідного повідомлення (до відповіді)
|
||||
- помилки журналюються, але не блокують звичайну доставку відповіді
|
||||
- режим групи `mentions` реагує на ходи, запущені згадкою; активація групи `always` діє як обхід цієї перевірки
|
||||
- WhatsApp використовує `channels.whatsapp.ackReaction` (застаріле `messages.ackReaction` тут не використовується)
|
||||
|
||||
## Кілька облікових записів і облікові дані
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Вибір облікового запису та типові значення">
|
||||
- ідентифікатори облікових записів надходять із `channels.whatsapp.accounts`
|
||||
- типовий вибір облікового запису: `default`, якщо він наявний, інакше перший налаштований ідентифікатор облікового запису (відсортований)
|
||||
- ідентифікатори облікових записів внутрішньо нормалізуються для пошуку
|
||||
<Accordion title="Account selection and defaults">
|
||||
- ідентифікатори облікових записів беруться з `channels.whatsapp.accounts`
|
||||
- вибір облікового запису за замовчуванням: `default`, якщо він є, інакше перший налаштований ідентифікатор облікового запису (відсортований)
|
||||
- ідентифікатори облікових записів нормалізуються внутрішньо для пошуку
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Шляхи до облікових даних і сумісність із застарілим форматом">
|
||||
<Accordion title="Credential paths and legacy compatibility">
|
||||
- поточний шлях автентифікації: `~/.openclaw/credentials/whatsapp/<accountId>/creds.json`
|
||||
- файл резервної копії: `creds.json.bak`
|
||||
- застаріла типова автентифікація в `~/.openclaw/credentials/` усе ще розпізнається/мігрується для потоків типового облікового запису
|
||||
- застаріла автентифікація за замовчуванням у `~/.openclaw/credentials/` усе ще розпізнається/мігрується для потоків облікового запису за замовчуванням
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Поведінка виходу з облікового запису">
|
||||
`openclaw channels logout --channel whatsapp [--account <id>]` очищує стан автентифікації WhatsApp для цього облікового запису.
|
||||
<Accordion title="Logout behavior">
|
||||
`openclaw channels logout --channel whatsapp [--account <id>]` очищає стан автентифікації WhatsApp для цього облікового запису.
|
||||
|
||||
Коли Gateway доступний, вихід спершу зупиняє активний слухач WhatsApp для вибраного облікового запису, щоб пов’язана сесія не продовжувала отримувати повідомлення до наступного перезапуску. `openclaw channels remove --channel whatsapp` також зупиняє активний слухач перед вимкненням або видаленням конфігурації облікового запису.
|
||||
Коли Gateway доступний, вихід спочатку зупиняє активний слухач WhatsApp для вибраного облікового запису, щоб повʼязана сесія не продовжувала отримувати повідомлення до наступного перезапуску. `openclaw channels remove --channel whatsapp` також зупиняє активний слухач перед вимкненням або видаленням конфігурації облікового запису.
|
||||
|
||||
У застарілих каталогах автентифікації `oauth.json` зберігається, а файли автентифікації Baileys видаляються.
|
||||
У застарілих каталогах автентифікації `oauth.json` зберігається, тоді як файли автентифікації Baileys видаляються.
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
@ -517,16 +527,16 @@ WhatsApp підтримує негайні реакції підтверджен
|
||||
## Інструменти, дії та записи конфігурації
|
||||
|
||||
- Підтримка інструментів агента включає дію реакції WhatsApp (`react`).
|
||||
- Обмежувачі дій:
|
||||
- Обмеження дій:
|
||||
- `channels.whatsapp.actions.reactions`
|
||||
- `channels.whatsapp.actions.polls`
|
||||
- Записи конфігурації, ініційовані каналом, увімкнені типово (вимкнути через `channels.whatsapp.configWrites=false`).
|
||||
- Записи конфігурації, ініційовані каналом, увімкнені за замовчуванням (вимикаються через `channels.whatsapp.configWrites=false`).
|
||||
|
||||
## Усунення несправностей
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Не пов’язано (потрібен QR)">
|
||||
Симптом: статус каналу повідомляє, що він не пов’язаний.
|
||||
<Accordion title="Not linked (QR required)">
|
||||
Симптом: стан каналу повідомляє, що його не повʼязано.
|
||||
|
||||
Виправлення:
|
||||
|
||||
@ -537,17 +547,17 @@ WhatsApp підтримує негайні реакції підтверджен
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Пов’язано, але від’єднано / цикл повторного підключення">
|
||||
Симптом: пов’язаний обліковий запис із повторними від’єднаннями або спробами повторного підключення.
|
||||
<Accordion title="Linked but disconnected / reconnect loop">
|
||||
Симптом: повʼязаний обліковий запис із повторними розривами зʼєднання або спробами повторного підключення.
|
||||
|
||||
Тихі облікові записи можуть залишатися підключеними після звичайного тайм-ауту повідомлення; сторожовий механізм
|
||||
перезапускається, коли транспортна активність WhatsApp Web припиняється, сокет закривається або
|
||||
активність на рівні застосунку залишається беззвучною довше за довше захисне вікно.
|
||||
Тихі облікові записи можуть залишатися підключеними після звичайного тайм-ауту повідомлень; watchdog
|
||||
перезапускається, коли транспортна активність WhatsApp Web зупиняється, socket закривається або
|
||||
активність на рівні застосунку залишається тихою довше за довше захисне вікно.
|
||||
|
||||
Якщо журнали показують повторюване `status=408 Request Time-out Connection was lost`, налаштуйте
|
||||
таймінги сокета Baileys у `web.whatsapp`. Почніть зі скорочення
|
||||
таймінги socket Baileys у `web.whatsapp`. Почніть зі скорочення
|
||||
`keepAliveIntervalMs` нижче тайм-ауту простою вашої мережі та збільшення
|
||||
`connectTimeoutMs` для повільних або нестабільних з’єднань:
|
||||
`connectTimeoutMs` на повільних або ненадійних зʼєднаннях:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -568,54 +578,54 @@ WhatsApp підтримує негайні реакції підтверджен
|
||||
openclaw logs --follow
|
||||
```
|
||||
|
||||
Якщо `~/.openclaw/logs/whatsapp-health.log` каже `Gateway inactive`, але
|
||||
Якщо `~/.openclaw/logs/whatsapp-health.log` містить `Gateway inactive`, але
|
||||
`openclaw gateway status` і `openclaw channels status --probe` показують, що
|
||||
Gateway і WhatsApp справні, запустіть `openclaw doctor`. У Linux doctor
|
||||
попереджає про застарілі записи crontab, які досі викликають
|
||||
попереджає про застарілі записи crontab, які все ще викликають
|
||||
`~/.openclaw/bin/ensure-whatsapp.sh`; видаліть ці застарілі записи за допомогою
|
||||
`crontab -e`, оскільки cron може не мати середовища user-bus systemd і
|
||||
змусити старий скрипт неправильно повідомляти про справність Gateway.
|
||||
`crontab -e`, оскільки cron може не мати середовища systemd user-bus і
|
||||
змушувати цей старий скрипт неправильно повідомляти про стан Gateway.
|
||||
|
||||
За потреби повторно пов’яжіть через `channels login`.
|
||||
За потреби повторно повʼяжіть через `channels login`.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Вхід за QR завершується тайм-аутом за проксі">
|
||||
Симптом: `openclaw channels login --channel whatsapp` завершується помилкою до показу придатного QR-коду з `status=408 Request Time-out` або від’єднанням TLS-сокета.
|
||||
<Accordion title="QR login times out behind a proxy">
|
||||
Симптом: `openclaw channels login --channel whatsapp` завершується помилкою до показу придатного QR-коду з `status=408 Request Time-out` або розривом TLS socket.
|
||||
|
||||
Вхід у WhatsApp Web використовує стандартне проксі-середовище хоста Gateway (`HTTPS_PROXY`, `HTTP_PROXY`, варіанти в нижньому регістрі та `NO_PROXY`). Перевірте, що процес Gateway успадковує змінні середовища проксі та що `NO_PROXY` не збігається з `mmg.whatsapp.net`.
|
||||
Вхід у WhatsApp Web використовує стандартне proxy-середовище хоста Gateway (`HTTPS_PROXY`, `HTTP_PROXY`, варіанти нижнім регістром і `NO_PROXY`). Перевірте, що процес Gateway успадковує proxy env і що `NO_PROXY` не відповідає `mmg.whatsapp.net`.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Немає активного слухача під час надсилання">
|
||||
<Accordion title="No active listener when sending">
|
||||
Вихідні надсилання швидко завершуються помилкою, коли для цільового облікового запису немає активного слухача Gateway.
|
||||
|
||||
Переконайтеся, що Gateway запущений і обліковий запис пов’язаний.
|
||||
Переконайтеся, що Gateway запущений, а обліковий запис повʼязано.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Відповідь з’являється в transcript, але не в WhatsApp">
|
||||
Рядки transcript записують те, що згенерував агент. Доставка WhatsApp перевіряється окремо: OpenClaw вважає автоматичну відповідь надісланою лише після того, як Baileys повертає ідентифікатор вихідного повідомлення хоча б для одного видимого текстового або медіанадсилання.
|
||||
<Accordion title="Reply appears in transcript but not in WhatsApp">
|
||||
Рядки transcript фіксують те, що згенерував агент. Доставка WhatsApp перевіряється окремо: OpenClaw вважає автоматичну відповідь надісланою лише після того, як Baileys повертає ідентифікатор вихідного повідомлення щонайменше для одного видимого текстового або медіа-надсилання.
|
||||
|
||||
Реакції підтвердження є незалежними отриманнями перед відповіддю. Успішна реакція не доводить, що пізнішу текстову або медіавідповідь прийняв WhatsApp.
|
||||
Реакції підтвердження є незалежними сповіщеннями перед відповіддю. Успішна реакція не доводить, що пізнішу текстову або медіа-відповідь було прийнято WhatsApp.
|
||||
|
||||
Перевірте журнали Gateway на `auto-reply delivery failed` або `auto-reply was not accepted by WhatsApp provider`.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Групові повідомлення неочікувано ігноруються">
|
||||
Перевіряйте в такому порядку:
|
||||
<Accordion title="Group messages unexpectedly ignored">
|
||||
Перевірте в такому порядку:
|
||||
|
||||
- `groupPolicy`
|
||||
- `groupAllowFrom` / `allowFrom`
|
||||
- записи allowlist у `groups`
|
||||
- обмеження згадками (`requireMention` + шаблони згадок)
|
||||
- дублікати ключів у `openclaw.json` (JSON5): пізніші записи перевизначають попередні, тому тримайте один `groupPolicy` для кожної області
|
||||
- записи allowlist `groups`
|
||||
- обмеження за згадками (`requireMention` + шаблони згадок)
|
||||
- дублікати ключів у `openclaw.json` (JSON5): пізніші записи перевизначають раніші, тому залишайте один `groupPolicy` для кожної області
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Попередження середовища виконання Bun">
|
||||
Середовище виконання Gateway для WhatsApp має використовувати Node. Bun позначено як несумісний для стабільної роботи Gateway WhatsApp/Telegram.
|
||||
<Accordion title="Bun runtime warning">
|
||||
Середовище виконання Gateway для WhatsApp має використовувати Node. Bun позначено як несумісний зі стабільною роботою Gateway для WhatsApp/Telegram.
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
@ -623,32 +633,32 @@ WhatsApp підтримує негайні реакції підтверджен
|
||||
|
||||
WhatsApp підтримує системні prompts у стилі Telegram для груп і прямих чатів через мапи `groups` і `direct`.
|
||||
|
||||
Ієрархія розв’язання для групових повідомлень:
|
||||
Ієрархія вирішення для групових повідомлень:
|
||||
|
||||
Ефективна мапа `groups` визначається першою: якщо обліковий запис визначає власну `groups`, вона повністю замінює кореневу мапу `groups` (без глибокого злиття). Потім пошук prompt виконується на отриманій єдиній мапі:
|
||||
Ефективна мапа `groups` визначається першою: якщо обліковий запис визначає власну `groups`, вона повністю замінює кореневу мапу `groups` (без глибокого злиття). Пошук prompt потім виконується в отриманій єдиній мапі:
|
||||
|
||||
1. **Системний prompt для конкретної групи** (`groups["<groupId>"].systemPrompt`): використовується, коли конкретний запис групи існує в мапі **і** його ключ `systemPrompt` визначений. Якщо `systemPrompt` є порожнім рядком (`""`), wildcard приглушується і системний prompt не застосовується.
|
||||
2. **Системний prompt wildcard для групи** (`groups["*"].systemPrompt`): використовується, коли конкретний запис групи повністю відсутній у мапі або коли він існує, але не визначає ключ `systemPrompt`.
|
||||
1. **Системний prompt для конкретної групи** (`groups["<groupId>"].systemPrompt`): використовується, коли конкретний запис групи існує в мапі **і** його ключ `systemPrompt` визначений. Якщо `systemPrompt` є порожнім рядком (`""`), wildcard пригнічується, і системний prompt не застосовується.
|
||||
2. **Wildcard системного prompt групи** (`groups["*"].systemPrompt`): використовується, коли конкретний запис групи повністю відсутній у мапі або коли він існує, але не визначає ключ `systemPrompt`.
|
||||
|
||||
Ієрархія розв’язання для прямих повідомлень:
|
||||
Ієрархія вирішення для прямих повідомлень:
|
||||
|
||||
Ефективна мапа `direct` визначається першою: якщо обліковий запис визначає власну `direct`, вона повністю замінює кореневу мапу `direct` (без глибокого злиття). Потім пошук prompt виконується на отриманій єдиній мапі:
|
||||
Ефективна мапа `direct` визначається першою: якщо обліковий запис визначає власну `direct`, вона повністю замінює кореневу мапу `direct` (без глибокого злиття). Пошук prompt потім виконується в отриманій єдиній мапі:
|
||||
|
||||
1. **Системний prompt для конкретного direct** (`direct["<peerId>"].systemPrompt`): використовується, коли конкретний запис співрозмовника існує в мапі **і** його ключ `systemPrompt` визначений. Якщо `systemPrompt` є порожнім рядком (`""`), wildcard приглушується і системний prompt не застосовується.
|
||||
2. **Системний prompt wildcard для direct** (`direct["*"].systemPrompt`): використовується, коли конкретний запис співрозмовника повністю відсутній у мапі або коли він існує, але не визначає ключ `systemPrompt`.
|
||||
1. **Системний промпт для конкретного direct** (`direct["<peerId>"].systemPrompt`): використовується, коли конкретний запис peer існує в мапі **і** його ключ `systemPrompt` визначено. Якщо `systemPrompt` є порожнім рядком (`""`), wildcard пригнічується, і системний промпт не застосовується.
|
||||
2. **Wildcard системного промпту direct** (`direct["*"].systemPrompt`): використовується, коли конкретний запис peer повністю відсутній у мапі або коли він існує, але не визначає ключ `systemPrompt`.
|
||||
|
||||
<Note>
|
||||
`dms` залишається легким контейнером перевизначень історії для окремих DM (`dms.<id>.historyLimit`). Перевизначення prompt розміщуються в `direct`.
|
||||
`dms` залишається легким bucket для перевизначення історії на рівні окремого DM (`dms.<id>.historyLimit`). Перевизначення промптів живуть у `direct`.
|
||||
</Note>
|
||||
|
||||
**Відмінність від поведінки мультиакаунтів Telegram:** У Telegram кореневий `groups` навмисно пригнічується для всіх акаунтів у налаштуванні з кількома акаунтами — навіть для акаунтів, які не визначають власних `groups`, — щоб бот не отримував групові повідомлення з груп, до яких він не належить. WhatsApp не застосовує цей захист: кореневі `groups` і кореневий `direct` завжди успадковуються акаунтами, які не визначають перевизначення на рівні акаунта, незалежно від кількості налаштованих акаунтів. У налаштуванні WhatsApp із кількома акаунтами, якщо вам потрібні окремі групові або прямі промпти для кожного акаунта, явно визначте повну мапу для кожного акаунта замість того, щоб покладатися на стандартні значення кореневого рівня.
|
||||
**Відмінність від поведінки Telegram з кількома обліковими записами:** У Telegram кореневий `groups` навмисно пригнічується для всіх облікових записів у конфігурації з кількома обліковими записами — навіть для тих, що не визначають власних `groups` — щоб бот не отримував групові повідомлення для груп, до яких він не належить. WhatsApp не застосовує цей захист: кореневі `groups` і кореневий `direct` завжди успадковуються обліковими записами, які не визначають перевизначення на рівні облікового запису, незалежно від кількості налаштованих облікових записів. У конфігурації WhatsApp з кількома обліковими записами, якщо вам потрібні групові або direct-промпти для кожного облікового запису окремо, визначайте повну мапу явно в кожному обліковому записі, а не покладайтеся на кореневі значення за замовчуванням.
|
||||
|
||||
Важлива поведінка:
|
||||
|
||||
- `channels.whatsapp.groups` є і мапою конфігурації для окремих груп, і allowlist груп на рівні чату. На кореневому рівні або в межах акаунта `groups["*"]` означає «допущено всі групи» для цієї області.
|
||||
- Додавайте wildcard-групу `systemPrompt` лише тоді, коли ви вже хочете, щоб ця область допускала всі групи. Якщо ви все ще хочете, щоб придатним був лише фіксований набір ID груп, не використовуйте `groups["*"]` для стандартного промпта. Натомість повторіть промпт у кожному явно дозволеному записі групи.
|
||||
- Допуск групи та авторизація відправника є окремими перевірками. `groups["*"]` розширює набір груп, які можуть потрапити в обробку груп, але сам по собі не авторизує кожного відправника в цих групах. Доступ відправників і далі окремо контролюється через `channels.whatsapp.groupPolicy` і `channels.whatsapp.groupAllowFrom`.
|
||||
- `channels.whatsapp.direct` не має такого самого побічного ефекту для DM. `direct["*"]` лише надає стандартну конфігурацію прямого чату після того, як DM уже допущено через `dmPolicy` разом з `allowFrom` або правилами pairing-store.
|
||||
- `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.
|
||||
|
||||
Приклад:
|
||||
|
||||
@ -690,24 +700,24 @@ WhatsApp підтримує системні prompts у стилі Telegram дл
|
||||
}
|
||||
```
|
||||
|
||||
## Вказівники до довідника конфігурації
|
||||
## Вказівники довідника конфігурації
|
||||
|
||||
Основна довідка:
|
||||
Основний довідник:
|
||||
|
||||
- [Довідник конфігурації - WhatsApp](/uk/gateway/config-channels#whatsapp)
|
||||
|
||||
Ключові поля WhatsApp:
|
||||
Найважливіші поля WhatsApp:
|
||||
|
||||
- доступ: `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups`
|
||||
- доставка: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `sendReadReceipts`, `ackReaction`, `reactionLevel`
|
||||
- мультиакаунт: `accounts.<id>.enabled`, `accounts.<id>.authDir`, перевизначення на рівні акаунта
|
||||
- кілька облікових записів: `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`
|
||||
|
||||
## Пов’язане
|
||||
|
||||
- [Pairing](/uk/channels/pairing)
|
||||
- [Сполучення](/uk/channels/pairing)
|
||||
- [Групи](/uk/channels/groups)
|
||||
- [Безпека](/uk/gateway/security)
|
||||
- [Маршрутизація каналів](/uk/channels/channel-routing)
|
||||
|
||||
@ -1,30 +1,40 @@
|
||||
---
|
||||
read_when:
|
||||
- Ви встановлюєте, налаштовуєте або проводите аудит WhatsApp Plugin
|
||||
- Ви встановлюєте, налаштовуєте або виконуєте аудит Plugin для WhatsApp
|
||||
summary: Додає інтерфейс каналу WhatsApp для надсилання й отримання повідомлень OpenClaw.
|
||||
title: Plugin WhatsApp
|
||||
title: WhatsApp Plugin
|
||||
x-i18n:
|
||||
generated_at: "2026-05-03T02:50:46Z"
|
||||
generated_at: "2026-05-05T04:18:47Z"
|
||||
model: gpt-5.5
|
||||
provider: openai
|
||||
source_hash: 3ff038ce3afd0285e5cfca9ca1b0e89deed582cff4f2e9c257f29a4848f397fa
|
||||
source_hash: a0fa274f7e937894a070abd9307aa12eed17b27275bc7e5cfc432f8a41373c54
|
||||
source_path: plugins/reference/whatsapp.md
|
||||
workflow: 16
|
||||
---
|
||||
|
||||
# Plugin WhatsApp
|
||||
# WhatsApp Plugin
|
||||
|
||||
Додає інтерфейс каналу WhatsApp для надсилання й отримання повідомлень OpenClaw.
|
||||
Додає поверхню каналу WhatsApp для надсилання й отримання повідомлень OpenClaw.
|
||||
|
||||
## Поширення
|
||||
## Розповсюдження
|
||||
|
||||
- Пакет: `@openclaw/whatsapp`
|
||||
- Спосіб встановлення: npm; ClawHub
|
||||
- Package: `@openclaw/whatsapp`
|
||||
- Маршрут встановлення: npm; ClawHub
|
||||
|
||||
## Інтерфейс
|
||||
## Поверхня
|
||||
|
||||
channels: whatsapp
|
||||
|
||||
## Примітка щодо встановлення у Windows
|
||||
|
||||
У Windows Plugin WhatsApp потребує Git у `PATH` під час встановлення через npm, оскільки одну з його залежностей Baileys/libsignal отримують із git URL. Встановіть Git for Windows, потім перезапустіть оболонку й повторно запустіть встановлення:
|
||||
|
||||
```powershell
|
||||
winget install --id Git.Git -e
|
||||
```
|
||||
|
||||
Portable Git також працює, якщо його каталог `bin` є в `PATH`.
|
||||
|
||||
## Пов’язані документи
|
||||
|
||||
- [whatsapp](/uk/channels/whatsapp)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user