Instalacja (na żądanie)
- Onboarding (
openclaw onboard) orazopenclaw channels add --channel whatsappproszą o instalację Pluginu WhatsApp przy pierwszym wyborze. openclaw channels login --channel whatsapptakże oferuje przepływ instalacji, gdy Plugin nie jest jeszcze obecny.- Kanał deweloperski + checkout z git: domyślnie używa lokalnej ścieżki Pluginu.
- Stable/Beta: najpierw instaluje oficjalny Plugin
@openclaw/whatsappz ClawHub, z npm jako rozwiązaniem awaryjnym. - Runtime WhatsApp jest dystrybuowany poza głównym pakietem npm OpenClaw, aby zależności runtime specyficzne dla WhatsApp pozostały w zewnętrznym Pluginie.
@openclaw/whatsapp) tylko wtedy, gdy potrzebujesz
awaryjnego użycia rejestru. Przypinaj dokładną wersję tylko wtedy, gdy potrzebujesz powtarzalnej instalacji.
Parowanie
Rozwiązywanie problemów z kanałem
Konfiguracja Gateway
Szybka konfiguracja
Połącz WhatsApp (QR)
Zadzwoń do bieżącego nadawcy za pomocą MeowCaller (eksperymentalne)
Plugin WhatsApp może udostępniaćwhatsapp_call w turach agenta pochodzących z WhatsApp. Narzędzie
używa MeowCaller, aby wykonać połączenie głosowe WhatsApp do
bieżącego autoryzowanego nadawcy i odtworzyć komunikat OpenClaw TTS po odebraniu. Narzędzie
nie przyjmuje numeru docelowego, więc prompt nie może przekierować połączenia do strony trzeciej.
Ta eksperymentalna funkcja jest domyślnie wyłączona.
Włącz eksperymentalne połączenia
actions.calls: true do kanału WhatsApp w openclaw.json:false, OpenClaw nie udostępnia agentowi narzędzia whatsapp_call.Zainstaluj przejrzany CLI MeowCaller
meowcaller na PATH hosta gateway.
Do czasu scalenia MeowCaller PR #7 zbuduj
przejrzaną gałąź na commicie 752050471fc2bf7a8cdfbf7dbd3cd4e865d85d3f:$HOME/.local/bin jest także na PATH usługi gateway. Ta rewizja zapewnia
jawne polecenia pair oraz notify tylko do wysyłania. notify nie otwiera mikrofonu, głośnika,
urządzenia wideo, ujścia dźwięku przychodzącego ani przechwytywania diagnostycznego. Nie zastępuj go przykładowym
poleceniem CLI play.Sparuj połączone urządzenie MeowCaller
whatsapp_call zgłasza
katalog stanu specyficzny dla konta oraz polecenie parowania. Dla konta domyślnego:MeowCaller linked device ready. Następnie polecenie kończy działanie. Zachowaj wa-voip.db
jako prywatne; to sesja połączonego urządzenia MeowCaller. Akcja statusu whatsapp_call
zwraca polecenie i powłokę specyficzne dla konta, gdy używasz konta innego niż domyślne. W
Windows uruchom jego polecenie PowerShell; MeowCaller tworzy katalog magazynu.Skonfiguruj TTS i zadzwoń z WhatsApp
Call me and say the build finished. Narzędzie ustala nadawcę
z zaufanego kontekstu przychodzącego, syntetyzuje tymczasowy prywatny plik WAV, uruchamia MeowCaller na
ograniczone okno połączenia i usuwa plik audio po zakończeniu. OpenClaw jawnie przekazuje magazyn
konta, czeka na zerowy kod wyjścia po odebraniu, odtworzeniu i rozłączeniu, oraz traktuje
timeout lub niezerowy kod wyjścia jako nieudane wywołanie narzędzia.- tylko wychodzące połączenia audio jeden do jednego
- brak dowolnych numerów docelowych
- brak współdzielonego uwierzytelniania z połączeniem czatu
- brak połączeń do samego siebie w trybie numeru osobistego/czatu z samym sobą
- zsyntetyzowany dźwięk jest ograniczony do 60 sekund
- brak potwierdzenia słyszalności po stronie telefonu poza zakończeniem odebrania/odtwarzania/rozłączenia przez MeowCaller
- OpenClaw zatrzymuje proces towarzyszący po ograniczonym oknie 115–175 sekund, obejmującym fazy połączenia, odebrania, odtwarzania i zamknięcia MeowCaller
Wzorce wdrożenia
Dedykowany numer (zalecane)
Dedykowany numer (zalecane)
- osobna tożsamość WhatsApp dla OpenClaw
- czytelniejsze listy dozwolonych DM i granice routingu
- mniejsze ryzyko pomyłek związanych z czatem z samym sobą
Awaryjny tryb numeru osobistego
Awaryjny tryb numeru osobistego
dmPolicy: "allowlist"allowFromzawiera Twój numer osobistyselfChatMode: true
allowFrom.Zakres kanału tylko WhatsApp Web
Zakres kanału tylko WhatsApp Web
Baileys).W wbudowanym rejestrze kanałów czatu nie ma osobnego kanału komunikacyjnego Twilio WhatsApp.Model runtime
- Gateway zarządza gniazdem WhatsApp i pętlą ponownego łączenia.
- Watchdog ponownego łączenia używa aktywności transportu WhatsApp Web, a nie tylko wolumenu przychodzących wiadomości aplikacji, więc cicha sesja połączonego urządzenia nie jest restartowana wyłącznie dlatego, że nikt ostatnio nie wysłał wiadomości. Dłuższy limit ciszy aplikacji nadal wymusza ponowne połączenie, jeśli ramki transportu dalej przychodzą, ale w oknie watchdoga nie są obsługiwane żadne wiadomości aplikacji; po przejściowym ponownym połączeniu dla ostatnio aktywnej sesji ten test ciszy aplikacji używa normalnego timeoutu wiadomości dla pierwszego okna odzyskiwania.
- Czasy gniazda Baileys są jawne pod
web.whatsapp.*:keepAliveIntervalMskontroluje pingi aplikacji WhatsApp Web,connectTimeoutMskontroluje timeout początkowego uzgadniania połączenia, adefaultQueryTimeoutMskontroluje oczekiwania zapytań Baileys oraz lokalne limity operacji wysyłki wychodzącej/obecności i potwierdzeń odczytu przychodzącego w OpenClaw. - Wysyłki wychodzące wymagają aktywnego listenera WhatsApp dla konta docelowego.
- Wysyłki grupowe dołączają natywne metadane wzmianek dla tokenów
@+<digits>i@<digits>w tekście i podpisach mediów, gdy token pasuje do bieżących metadanych uczestnika WhatsApp, w tym grup opartych na LID. - Czaty statusowe i broadcast są ignorowane (
@status,@broadcast). - Watchdog ponownego łączenia podąża za aktywnością transportu WhatsApp Web, a nie tylko wolumenem przychodzących wiadomości aplikacji: ciche sesje połączonych urządzeń pozostają aktywne, dopóki ramki transportu nadal przychodzą, ale zatrzymanie transportu wymusza ponowne połączenie dużo wcześniej niż późniejsza ścieżka zdalnego rozłączenia.
- Czaty bezpośrednie używają reguł sesji DM (
session.dmScope; domyślnemainzwija DM do głównej sesji agenta). - Sesje grupowe są izolowane (
agent:<agentId>:whatsapp:group:<jid>). - Kanały/Newslettery WhatsApp mogą być jawnymi celami wychodzącymi z natywnym JID
@newsletter. Wysyłki wychodzące do newsletterów używają metadanych sesji kanału (agent:<agentId>:whatsapp:channel:<jid>) zamiast semantyki sesji DM. - Transport WhatsApp Web respektuje standardowe zmienne środowiskowe proxy na hoście gateway (
HTTPS_PROXY,HTTP_PROXY,NO_PROXY/ warianty małymi literami). Preferuj konfigurację proxy na poziomie hosta zamiast ustawień proxy specyficznych dla kanału WhatsApp. - Gdy
messages.removeAckAfterReplyjest włączone, OpenClaw czyści reakcję potwierdzenia WhatsApp po dostarczeniu widocznej odpowiedzi.
Prompty zatwierdzania
WhatsApp może renderować prompty zatwierdzania exec i Pluginu z reakcjami👍 / 👎. Dostarczaniem
steruje najwyższego poziomu konfiguracja przekazywania zatwierdzeń:
approvals.exec i approvals.plugin są niezależne. Włączenie WhatsApp jako kanału tylko łączy
transport; nie wysyła promptów zatwierdzania, chyba że odpowiednia rodzina zatwierdzeń jest włączona
i kieruje do WhatsApp. Tryb sesji dostarcza natywne zatwierdzenia emoji tylko dla zatwierdzeń, które
pochodzą z WhatsApp. Tryb celu używa współdzielonego potoku przekazywania dla jawnych celów WhatsApp
i nie tworzy osobnego rozsyłania do DM zatwierdzających.
Reakcje zatwierdzania WhatsApp wymagają jawnych zatwierdzających WhatsApp z allowFrom lub "*".
defaultTo kontroluje zwykłe domyślne cele wiadomości; nie jest zatwierdzającym zatwierdzeń. Ręczne
polecenia /approve nadal przechodzą przez normalną ścieżkę autoryzacji nadawcy WhatsApp przed
rozstrzygnięciem zatwierdzenia.
Hooki Pluginu i prywatność
Wiadomości przychodzące WhatsApp mogą zawierać osobistą treść wiadomości, numery telefonów, identyfikatory grup, nazwy nadawców i pola korelacji sesji. Z tego powodu WhatsApp nie rozsyła przychodzących ładunków hakamessage_received do pluginów,
chyba że jawnie wyrazisz na to zgodę:
Kontrola dostępu i aktywacja
- DM policy
- Group policy + allowlists
- Mentions + /activation
channels.whatsapp.dmPolicy kontroluje dostęp do czatów bezpośrednich:pairing(domyślnie)allowlistopen(wymaga, abyallowFromzawierało"*")disabled
allowFrom akceptuje numery w stylu E.164 (normalizowane wewnętrznie).allowFrom to lista kontroli dostępu nadawców wiadomości prywatnych. Nie ogranicza jawnych wysyłek wychodzących do JID grup WhatsApp ani JID kanałów @newsletter.Nadpisanie dla wielu kont: channels.whatsapp.accounts.<id>.dmPolicy (oraz allowFrom) mają pierwszeństwo przed domyślnymi ustawieniami na poziomie kanału dla tego konta.Szczegóły zachowania w czasie działania:- parowania są utrwalane w magazynie zezwoleń kanału i scalane ze skonfigurowanym
allowFrom - zaplanowana automatyzacja i awaryjny wybór odbiorcy Heartbeat używają jawnych celów dostarczania albo skonfigurowanego
allowFrom; zatwierdzenia parowania wiadomości prywatnych nie są domyślnymi odbiorcami Cron ani Heartbeat - jeśli nie skonfigurowano listy dozwolonych, połączony własny numer jest domyślnie dozwolony
- OpenClaw nigdy automatycznie nie paruje wychodzących wiadomości prywatnych
fromMe(wiadomości wysyłanych do siebie z połączonego urządzenia)
Skonfigurowane powiązania ACP
WhatsApp obsługuje trwałe powiązania ACP przez wpisy najwyższego poziomubindings[]:
- Czaty bezpośrednie pasują do numerów E.164, takich jak
+15555550123. - Grupy pasują do JID grup WhatsApp, takich jak
120363424282127706@g.us. - Listy dozwolonych grup, polityka nadawców oraz bramkowanie wzmianką lub aktywacją działają, zanim OpenClaw upewni się, że skonfigurowana sesja ACP istnieje.
- Dopasowane skonfigurowane powiązanie ACP przejmuje trasę. Grupy rozgłoszeniowe WhatsApp nie rozsyłają tej tury do zwykłych sesji WhatsApp.
Zachowanie numeru osobistego i czatu z samym sobą
Gdy połączony własny numer jest także obecny wallowFrom, aktywują się zabezpieczenia czatu WhatsApp z samym sobą:
- pomijanie potwierdzeń odczytu dla tur czatu z samym sobą
- ignorowanie automatycznego wyzwalania przez JID wzmianki, które w przeciwnym razie powiadomiłoby ciebie samego
- jeśli
messages.responsePrefixnie jest ustawione, odpowiedzi w czacie z samym sobą domyślnie używają[{identity.name}]albo[openclaw]
Normalizacja wiadomości i kontekst
Inbound envelope + reply context
Inbound envelope + reply context
ReplyToId, ReplyToBody, ReplyToSender, JID/E.164 nadawcy).
Gdy cytowany cel odpowiedzi jest możliwym do pobrania medium, OpenClaw zapisuje go przez
zwykły magazyn mediów przychodzących i udostępnia jako MediaPath/MediaType, aby
agent mógł sprawdzić wskazany obraz zamiast widzieć tylko
<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>, więc wypowiedzenie wzmianki o bocie w notatce głosowej może
wyzwolić odpowiedź. Jeśli transkrypcja nadal nie wspomina bota,
transkrypcja jest zachowywana w oczekującej historii grupy zamiast surowego symbolu zastępczego.Treści lokalizacji używają zwięzłego tekstu współrzędnych. Etykiety/komentarze lokalizacji oraz szczegóły kontaktu/vCard są renderowane jako ogrodzone niezaufane metadane, a nie jako wbudowany tekst promptu.Pending group history injection
Pending group history injection
- domyślny limit:
50 - konfiguracja:
channels.whatsapp.historyLimit - awaryjnie:
messages.groupChat.historyLimit 0wyłącza
[Chat messages since your last reply - for context][Current message - respond to this]
Read receipts
Read receipts
Dostarczanie, dzielenie na fragmenty i media
Text chunking
Text chunking
- domyślny limit fragmentu:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"- tryb
newlinepreferuje granice akapitów (puste wiersze), a następnie awaryjnie używa dzielenia bezpiecznego pod względem długości
Outbound media behavior
Outbound media behavior
- obsługuje ładunki obrazu, wideo, audio (notatka głosowa PTT) i dokumentu
- media audio są wysyłane przez ładunek Baileys
audiozptt: true, więc klienci WhatsApp renderują je jako notatkę głosową push-to-talk - ładunki odpowiedzi zachowują
audioAsVoice; wyjście notatki głosowej TTS dla WhatsApp pozostaje na tej ścieżce PTT, nawet gdy dostawca zwraca MP3 lub WebM - natywne audio Ogg/Opus jest wysyłane jako
audio/ogg; codecs=opusdla zgodności z notatkami głosowymi - audio inne niż Ogg, w tym wyjście MP3/WebM z Microsoft Edge TTS, jest transkodowane za pomocą
ffmpegdo mono Ogg/Opus 48 kHz przed dostarczeniem PTT /tts latestwysyła najnowszą odpowiedź asystenta jako jedną notatkę głosową i tłumi ponowne wysyłki dla tej samej odpowiedzi;/tts chat on|off|defaultkontroluje automatyczne TTS dla bieżącego czatu WhatsApp- odtwarzanie animowanych GIF-ów jest obsługiwane przez
gifPlayback: trueprzy wysyłaniu wideo forceDocument/asDocumentwysyła wychodzące obrazy, GIF-y i filmy przez ładunek dokumentu Baileys, aby uniknąć kompresji mediów WhatsApp, zachowując rozwiązaną nazwę pliku i typ MIME- podpisy są stosowane do pierwszego elementu multimedialnego przy wysyłaniu ładunków odpowiedzi z wieloma mediami, z wyjątkiem notatek głosowych PTT, które wysyłają najpierw audio, a widoczny tekst osobno, ponieważ klienci WhatsApp nie renderują konsekwentnie podpisów notatek głosowych
- źródłem mediów może być HTTP(S),
file://albo ścieżki lokalne
Media size limits and fallback behavior
Media size limits and fallback behavior
- limit zapisu mediów przychodzących:
channels.whatsapp.mediaMaxMb(domyślnie50) - limit wysyłania mediów wychodzących:
channels.whatsapp.mediaMaxMb(domyślnie50) - nadpisania dla kont używają
channels.whatsapp.accounts.<accountId>.mediaMaxMb - obrazy są automatycznie optymalizowane (przeskalowanie/przegląd jakości), aby zmieścić się w limitach, chyba że
forceDocument/asDocumentżąda dostarczenia jako dokumentu - w razie niepowodzenia wysłania mediów awaryjne zachowanie dla pierwszego elementu wysyła ostrzeżenie tekstowe zamiast po cichu porzucać odpowiedź
Cytowanie odpowiedzi
WhatsApp obsługuje natywne cytowanie odpowiedzi, w którym odpowiedzi wychodzące widocznie cytują wiadomość przychodzącą. Kontroluj to za pomocąchannels.whatsapp.replyToMode.
| Wartość | Zachowanie |
|---|---|
"off" | Nigdy nie cytuj; wysyłaj jako zwykłą wiadomość |
"first" | Cytuj tylko pierwszy fragment odpowiedzi wychodzącej |
"all" | Cytuj każdy fragment odpowiedzi wychodzącej |
"batched" | Cytuj zakolejkowane odpowiedzi wsadowe, pozostawiając natychmiastowe odpowiedzi bez cytatu |
"off". Nadpisania dla kont używają channels.whatsapp.accounts.<id>.replyToMode.
Poziom reakcji
channels.whatsapp.reactionLevel kontroluje, jak szeroko agent używa reakcji emoji w WhatsApp:
| Poziom | Reakcje potwierdzenia | Reakcje inicjowane przez agenta | Opis |
|---|---|---|---|
"off" | Nie | Nie | Brak jakichkolwiek reakcji |
"ack" | Tak | Nie | Tylko reakcje potwierdzenia (potwierdzenie przed odpowiedzią) |
"minimal" | Tak | Tak (ostrożnie) | Potwierdzenia + reakcje agenta z ostrożnymi wytycznymi |
"extensive" | Tak | Tak (zalecane) | Potwierdzenia + reakcje agenta z zalecanymi wytycznymi |
"minimal".
Nadpisania dla kont używają channels.whatsapp.accounts.<id>.reactionLevel.
Reakcje potwierdzenia
WhatsApp obsługuje natychmiastowe reakcje potwierdzenia przy odebraniu wiadomości przychodzącej przezchannels.whatsapp.ackReaction.
Reakcje potwierdzenia są bramkowane przez reactionLevel — są tłumione, gdy reactionLevel ma wartość "off".
- wysyłane natychmiast po zaakceptowaniu wiadomości przychodzącej (przed odpowiedzią)
- jeśli
ackReactionwystępuje bezemoji, WhatsApp używa emoji tożsamości kierowanego agenta, z wycofaniem do ”👀”; pomińackReactionalbo ustawemoji: "", aby nie wysyłać reakcji potwierdzenia - błędy są logowane, ale nie blokują normalnego dostarczenia odpowiedzi
- tryb grupy
mentionsreaguje na tury wyzwolone wzmianką; aktywacja grupyalwaysdziała jako obejście tego sprawdzenia - WhatsApp używa
channels.whatsapp.ackReaction(starszemessages.ackReactionnie jest tutaj używane)
Reakcje statusu cyklu życia
Ustawmessages.statusReactions.enabled: true, aby WhatsApp zastępował reakcję potwierdzenia podczas tury zamiast pozostawiać statyczne emoji potwierdzenia odbioru. Gdy ta opcja jest włączona, OpenClaw używa tego samego miejsca reakcji na wiadomość przychodzącą dla stanów cyklu życia, takich jak w kolejce, myślenie, aktywność narzędzi, Compaction, gotowe i błąd.
channels.whatsapp.ackReactionnadal kontroluje, czy reakcje statusu kwalifikują się dla wiadomości bezpośrednich i grup.- Reakcja statusu w kolejce używa tego samego efektywnego emoji potwierdzenia co zwykłe reakcje potwierdzenia.
- WhatsApp ma jedno miejsce reakcji bota na wiadomość, więc aktualizacje cyklu życia zastępują bieżącą reakcję w miejscu.
messages.removeAckAfterReply: trueczyści końcową reakcję statusu po skonfigurowanym czasie podtrzymania stanu gotowe/błąd.- Kategorie emoji narzędzi obejmują
tool,coding,web,deploy,buildiconcierge.
Wiele kont i poświadczenia
Wybór konta i wartości domyślne
Wybór konta i wartości domyślne
- identyfikatory kont pochodzą z
channels.whatsapp.accounts - domyślny wybór konta:
default, jeśli istnieje, w przeciwnym razie pierwszy skonfigurowany identyfikator konta (posortowany) - identyfikatory kont są wewnętrznie normalizowane do wyszukiwania
Ścieżki poświadczeń i zgodność ze starszymi wersjami
Ścieżki poświadczeń i zgodność ze starszymi wersjami
- bieżąca ścieżka uwierzytelniania:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - plik kopii zapasowej:
creds.json.bak - starsze domyślne uwierzytelnianie w
~/.openclaw/credentials/jest nadal rozpoznawane/migrowane dla przepływów konta domyślnego
Zachowanie wylogowania
Zachowanie wylogowania
openclaw channels logout --channel whatsapp [--account <id>] czyści stan uwierzytelniania WhatsApp dla tego konta.Gdy Gateway jest osiągalny, wylogowanie najpierw zatrzymuje aktywny nasłuchiwacz WhatsApp dla wybranego konta, aby połączona sesja nie odbierała dalej wiadomości aż do następnego restartu. openclaw channels remove --channel whatsapp również zatrzymuje aktywny nasłuchiwacz przed wyłączeniem lub usunięciem konfiguracji konta.W starszych katalogach uwierzytelniania oauth.json jest zachowywany, natomiast pliki uwierzytelniania Baileys są usuwane.Narzędzia, akcje i zapisy konfiguracji
- Obsługa narzędzi agenta obejmuje akcję reakcji WhatsApp (
react). - Bramki akcji:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- Zapisy konfiguracji inicjowane przez kanał są domyślnie włączone (wyłącz przez
channels.whatsapp.configWrites=false).
Rozwiązywanie problemów
Nie połączono (wymagany QR)
Nie połączono (wymagany QR)
Połączono, ale rozłączone / pętla ponownego łączenia
Połączono, ale rozłączone / pętla ponownego łączenia
status=408 Request Time-out Connection was lost, dostrój
czasy gniazda Baileys w web.whatsapp. Zacznij od skrócenia
keepAliveIntervalMs poniżej limitu bezczynności swojej sieci i zwiększenia
connectTimeoutMs na wolnych lub stratnych łączach:~/.openclaw/logs/whatsapp-health.log mówi Gateway inactive, ale
openclaw gateway status i openclaw channels status --probe pokazują, że
gateway i WhatsApp są zdrowe, uruchom openclaw doctor. W systemie Linux doctor
ostrzega o starszych wpisach crontab, które nadal wywołują
~/.openclaw/bin/ensure-whatsapp.sh; usuń te nieaktualne wpisy za pomocą
crontab -e, ponieważ cron może nie mieć środowiska magistrali użytkownika systemd i
sprawiać, że ten stary skrypt błędnie raportuje zdrowie gateway.W razie potrzeby ponownie połącz przez channels login.Logowanie QR przekracza limit czasu za proxy
Logowanie QR przekracza limit czasu za proxy
openclaw channels login --channel whatsapp kończy się niepowodzeniem przed pokazaniem używalnego kodu QR z status=408 Request Time-out albo rozłączeniem gniazda TLS.Logowanie WhatsApp Web używa standardowego środowiska proxy hosta gateway (HTTPS_PROXY, HTTP_PROXY, warianty małymi literami i NO_PROXY). Sprawdź, czy proces gateway dziedziczy środowisko proxy i czy NO_PROXY nie pasuje do mmg.whatsapp.net.Brak aktywnego nasłuchiwacza podczas wysyłania
Brak aktywnego nasłuchiwacza podczas wysyłania
Odpowiedź pojawia się w transkrypcie, ale nie w WhatsApp
Odpowiedź pojawia się w transkrypcie, ale nie w WhatsApp
auto-reply delivery failed albo auto-reply was not accepted by WhatsApp provider.Wiadomości grupowe są nieoczekiwanie ignorowane
Wiadomości grupowe są nieoczekiwanie ignorowane
groupPolicygroupAllowFrom/allowFrom- wpisy listy dozwolonych
groups - bramkowanie wzmianką (
requireMention+ wzorce wzmianki) - zduplikowane klucze w
openclaw.json(JSON5): późniejsze wpisy nadpisują wcześniejsze, więc zachowaj jedengroupPolicyna zakres
channels.whatsapp.groups istnieje, WhatsApp nadal może obserwować wiadomości z innych grup, ale OpenClaw odrzuca je przed trasowaniem sesji. Dodaj JID grupy do channels.whatsapp.groups albo dodaj groups["*"], aby dopuścić wszystkie grupy, zachowując autoryzację nadawcy w groupPolicy i groupAllowFrom.Ostrzeżenie środowiska uruchomieniowego Bun
Ostrzeżenie środowiska uruchomieniowego Bun
Prompty systemowe
WhatsApp obsługuje prompty systemowe w stylu Telegram dla grup i czatów bezpośrednich przez mapygroups i direct.
Hierarchia rozstrzygania dla wiadomości grupowych:
Efektywna mapa groups jest ustalana najpierw: jeśli konto definiuje własne groups, w pełni zastępuje główną mapę groups (bez głębokiego scalania). Wyszukiwanie promptu działa potem na wynikowej pojedynczej mapie:
- Prompt systemowy specyficzny dla grupy (
groups["<groupId>"].systemPrompt): używany, gdy konkretny wpis grupy istnieje w mapie i jego kluczsystemPromptjest zdefiniowany. JeślisystemPromptjest pustym ciągiem (""), wildcard jest tłumiony i żaden prompt systemowy nie jest stosowany. - Prompt systemowy wildcard grupy (
groups["*"].systemPrompt): używany, gdy konkretny wpis grupy jest całkowicie nieobecny w mapie albo gdy istnieje, ale nie definiuje kluczasystemPrompt.
direct jest ustalana najpierw: jeśli konto definiuje własne direct, w pełni zastępuje główną mapę direct (bez głębokiego scalania). Wyszukiwanie promptu działa potem na wynikowej pojedynczej mapie:
- Prompt systemowy specyficzny dla czatu bezpośredniego (
direct["<peerId>"].systemPrompt): używany, gdy konkretny wpis rozmówcy istnieje w mapie i jego kluczsystemPromptjest zdefiniowany. JeślisystemPromptjest pustym ciągiem (""), wildcard jest tłumiony i żaden prompt systemowy nie jest stosowany. - Prompt systemowy wildcard czatu bezpośredniego (
direct["*"].systemPrompt): używany, gdy konkretny wpis rozmówcy jest całkowicie nieobecny w mapie albo gdy istnieje, ale nie definiuje kluczasystemPrompt.
dms pozostaje lekkim zasobnikiem nadpisania historii per DM (dms.<id>.historyLimit). Nadpisania promptów znajdują się w direct.groups jest celowo tłumione dla wszystkich kont w konfiguracji wielokontowej — nawet kont, które nie definiują własnego groups — aby zapobiec odbieraniu przez bota wiadomości grupowych z grup, do których nie należy. WhatsApp nie stosuje tej ochrony: główne groups i główne direct są zawsze dziedziczone przez konta, które nie definiują nadpisania na poziomie konta, niezależnie od liczby skonfigurowanych kont. W konfiguracji WhatsApp z wieloma kontami, jeśli chcesz promptów grupowych lub bezpośrednich per konto, zdefiniuj pełną mapę jawnie pod każdym kontem zamiast polegać na domyślnych ustawieniach poziomu głównego.
Ważne zachowanie:
channels.whatsapp.groupsjest zarówno mapą konfiguracji per grupa, jak i listą dozwolonych grup na poziomie czatu. W zakresie głównym lub kontagroups["*"]oznacza „wszystkie grupy są dopuszczone” dla tego zakresu.- Dodawaj wildcard grupy
systemPrompttylko wtedy, gdy już chcesz, aby ten zakres dopuszczał wszystkie grupy. Jeśli nadal chcesz, aby kwalifikował się tylko stały zestaw identyfikatorów grup, nie używajgroups["*"]jako domyślnego promptu. Zamiast tego powtórz prompt przy każdym jawnie dozwolonym wpisie grupy. - Dopuszczenie grupy i autoryzacja nadawcy są osobnymi sprawdzeniami.
groups["*"]poszerza zestaw grup, które mogą dotrzeć do obsługi grup, ale samo w sobie nie autoryzuje każdego nadawcy w tych grupach. Dostęp nadawcy jest nadal kontrolowany oddzielnie przezchannels.whatsapp.groupPolicyichannels.whatsapp.groupAllowFrom. channels.whatsapp.directnie ma tego samego efektu ubocznego dla DM.direct["*"]zapewnia tylko domyślną konfigurację czatu bezpośredniego po tym, jak DM zostanie już dopuszczony przezdmPolicyorazallowFromalbo reguły magazynu parowania.
Wskaźniki dokumentacji konfiguracji
Podstawowa dokumentacja: Najważniejsze pola WhatsApp:- dostęp:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - dostarczanie:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - wiele kont:
accounts.<id>.enabled,accounts.<id>.authDir, nadpisania na poziomie konta - operacje:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.*,web.whatsapp.* - zachowanie sesji:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit - prompty:
groups.<id>.systemPrompt,groups["*"].systemPrompt,direct.<id>.systemPrompt,direct["*"].systemPrompt