W tej lekcji7 sekcji
Lekcja 2212 min czytania

Konfiguracja kanałów: allowlisty, dmPolicy i wzmianki

Najczęstszy incydent z agentem w firmie nie polega na tym, że model coś zmyślił. Polega na tym, że odpowiedział komuś, kto nigdy nie powinien był dostać odpowiedzi — albo milczy wobec kogoś, kto miał prawo pytać.

Trzy kanały siedzą w rdzeniu, reszta to pluginy

Kto ma prawo rozmawiać z agentem i kto pilnuje listy — to lekcja trzynasta. Tutaj: w którym kluczu to zapisać i dlaczego „open” bez gwiazdki nic nie robi. Zaczynamy od tego, co w ogóle masz pod ręką. iMessage, Telegram i interfejs WebChat są częścią podstawowej instalacji OpenClaw i nie instalujesz do nich niczego. Każdy inny komunikator to osobny plugin, ładowany dopiero wtedy, gdy kanał jest faktycznie aktywny.

Pluginy dokładasz na trzy sposoby prowadzące do tego samego miejsca: komendą openclaw plugins install z identyfikatorem paczki, kreatorem openclaw onboard przy pierwszej konfiguracji albo komendą openclaw channels add, gdy Gateway już chodzi. Kreator prowadzi przez token, konto i politykę dostępu, więc przy pierwszym kanale jest wygodniejszy niż ręczna edycja pliku.

Po każdej instalacji pluginu Gateway trzeba zrestartować. To jedna z niewielu zmian, których nie łapie hot reload — obok portu i ustawień uwierzytelniania. Pominięcie restartu daje kanał, który widnieje w konfiguracji i nie odpowiada, co potrafi wyglądać jak problem z tokenem.

Podział na rdzeń i pluginy ma praktyczny skutek przy diagnozie. Jeśli Telegram milczy, plugin nie jest podejrzanym, bo go nie ma. Zostają token, polityka dostępu i tryb privacy bota ustawiany po stronie BotFathera — trzy miejsca zamiast czterech, a przy szukaniu w piątek po południu to realna różnica.

Instalacja pluginu kanału, kreator dokładający kanał do działającego Gateway i restart, bez którego nowy plugin nie wstanie.
openclaw plugins install @openclaw/slack
openclaw channels add
openclaw gateway restart

dmPolicy i groupPolicy: dwie polityki, które rozstrzygają wszystko

Model kontroli dostępu jest wspólny dla wszystkich kanałów i stoi na dwóch kluczach. dmPolicy przyjmuje wartości pairing, allowlist, open i disabled, z domyślnym pairing. groupPolicy przyjmuje open, allowlist i disabled, z domyślnym allowlist. Wszystko inne — listy nadawców, rejestr grup, wymóg wzmianki — jest doprecyzowaniem tych dwóch decyzji.

Domyślne pairing działa tak: nieznany nadawca dostaje kod parowania ważny godzinę, a agent ignoruje go do momentu zatwierdzenia. W WhatsAppie oczekujące żądania są limitowane do trzech na konto, więc gdy ktoś próbuje po raz trzeci i nic się nie dzieje, kolejka parowania jest pierwszym miejscem do sprawdzenia.

Zatwierdzasz z linii poleceń. openclaw pairing list wypisuje oczekujące żądania, openclaw pairing approve przepuszcza konkretny kod, a flaga --notify odsyła potwierdzenie do proszącego. Czego tu nie ma: dokumentacja nie opisuje komendy trwale blokującej nadawcę, a przycisk Dismiss w Control UI usuwa bieżące żądanie i nic poza tym.

Moja ocena po kilkunastu konfiguracjach: firmy uciekają od pairingu za wcześnie i niepotrzebnie. Allowlista pisana ręcznie z pamięci ma literówki w identyfikatorach i nikt tego nie zauważa, bo błąd objawia się ciszą. Kod parowania literówek nie ma.

Podgląd oczekujących żądań w formacie maszynowym i zatwierdzenie konkretnego kodu z powiadomieniem nadawcy.
openclaw pairing list <kanał> --json
openclaw pairing approve <kanał> <CODE> --notify

Dlaczego „open” bez gwiazdki nie robi nic

Ustawienie dmPolicy na open nie otwiera kanału samo z siebie. Wymaga jawnego wpisu „*” na allowliście kanału. Bez niego wiadomości dalej są odrzucane, a w logach zobaczysz wpis allowlist — nie awarię, nie błąd tokenu, po prostu decyzję polityki.

To myli, bo słowo open sugeruje, że lista przestaje mieć znaczenie. Jest odwrotnie. Polityka mówi, jak lista ma być interpretowana, a lista dalej musi istnieć. Ten sam wymóg wraca w Slacku na Enterprise Grid: DM-y z kontami enterprise działają wyłącznie przy dmPolicy ustawionym na open i allowFrom zawierającym „*”.

Dokumentacja nazywa dmPolicy „open” i groupPolicy „open” ustawieniami ostatniej szansy i radzi trzymać się parowania oraz allowlist, dopóki nie ufasz każdej osobie w pokoju. Przeczytaj to zdanie dwa razy, zanim ktoś w firmie otworzy kanał „na chwilę, do testów”.

Bo właśnie tak wygląda najczęstsza wersja incydentu z tytułu tej lekcji. Nic nie wybucha. Nie ma alertu, nie ma czerwonej lampki. Po prostu przez trzy tygodnie każdy, kto zna numer albo trafi na bota, rozmawia z agentem mającym dostęp do Waszych dokumentów i skrzynki.

Dwa odczyty, które trzeba zrobić razem. Sama polityka nic nie mówi, dopóki nie zobaczysz listy, do której się odnosi.
openclaw config get channels.telegram.dmPolicy
openclaw config get channels.telegram.allowFrom

allowFrom kontra groupAllowFrom: dwa różne klucze

allowFrom rządzi wyłącznie wiadomościami prywatnymi. W grupach obowiązuje groupAllowFrom, a allowFrom bywa tam jedynie zapasowym źródłem listy. Pomylenie tych dwóch kluczy daje agenta, który w DM-ach zachowuje się wzorowo, a w grupie odpowiada komuś, kogo nigdy nie zamierzałeś wpuścić.

Zatwierdzone parowanie też nie przenosi się na grupy. Kod parowania odblokowuje rozmowy prywatne i tyle — dostęp grupowy wymaga wpisu w konfiguracji. Odpowiedź na wiadomość bota nie omija groupAllowFrom, więc sztuczka z cytowaniem nie zadziała ani przypadkiem, ani celowo.

Przy kilku kontach w jednym kanale pierwszeństwo mają ustawienia z gałęzi channels.<kanał>.accounts.<accountId>. Jeśli zmieniasz politykę na poziomie kanału i nic się nie dzieje, sprawdź, czy nie nadpisuje jej wpis konkretnego konta. Ta warstwa jest łatwa do przeoczenia, bo w pliku konfiguracyjnym leży niżej niż to, co edytujesz.

Osobną warstwą jest contextVisibility, które nie decyduje o tym, kto może zawołać agenta, tylko o tym, co model w ogóle zobaczy. Przyjmuje „all”, „allowlist” i „allowlist_quote”, gdzie ostatnia wartość dopuszcza jedną zacytowaną wypowiedź spoza listy. To ustawienie ratuje kanały, w których agent ma odpowiadać wybranym osobom, a nie czytać całej rozmowy zespołu.

requireMention i rejestr groups: w jakiej kolejności to jest sprawdzane

Kolejność jest trzystopniowa i bez niej diagnoza sprowadza się do zgadywania. Najpierw sprawdzana jest groupPolicy. Potem allowlisty grup, czyli rejestr groups i groupAllowFrom. Na końcu bramka wzmianki — requireMention oraz komendy aktywacji.

requireMention domyślnie stoi na true w każdej grupie, dopóki nie nadpiszesz tego dla konkretnego pokoju. Poza natywnymi wzmiankami platformy działają wzorce regex z mentionPatterns, przydatne wtedy, gdy zespół woła agenta imieniem zamiast małpą. Zasięg zawężają allowIn i denyIn.

W rejestrze groups klucz „*” dopuszcza wszystkie grupy, zachowując domyślne zachowanie wzmianki. To rozsądny punkt startowy dla WhatsAppa i Signala: parowanie dla DM-ów, wszystkie grupy formalnie dopuszczone, ale agent odzywa się dopiero po zawołaniu. Ryzyko jest niskie, bo bez wzmianki i tak nic nie przechodzi.

W logach ta bramka wygląda jednoznacznie. Wpis „drop guild message (mention required)” znaczy, że wiadomość grupowa czeka na wzmiankę. Szukanie przyczyny w konfiguracji modelu ani w tokenie nic tu nie da.

Gateway tylko lokalnie, uwierzytelnianie tokenem, parowanie dla wiadomości prywatnych i wszystkie grupy z wymogiem wzmianki — układ na start.
// bezpieczna baza z dokumentacji
{
  gateway: { bind: "loopback", auth: { mode: "token" } },
  channels: {
    whatsapp: {
      dmPolicy: "pairing",
      groups: { "*": { requireMention: true } }
    }
  }
}

Slack: identyfikatory C12345678 i wielosobowe DM-y

Slack ma pułapkę, która potrafi zjeść pół dnia. Allowlisty kanałów muszą używać stabilnych identyfikatorów w formacie C12345678. Klucze oparte na nazwie z hashem przy groupPolicy ustawionym na allowlist po prostu nie pasują — nic się nie wywala, wiadomości po cichu nie przechodzą, a Ty sprawdzasz scope'y i token.

Ustawienia dla pojedynczego kanału siedzą pod channels.slack.channels.<channelId>. Znajdziesz tam requireMention, domyślnie true dla kanałów, listę users z osobami dopuszczonymi akurat w tym pokoju oraz allowBots, które jest domyślnie ostrożne: wiadomości od botów przechodzą tylko wtedy, gdy nadawca figuruje na liście users albo obecny jest właściciel.

Wielosobowe DM-y, czyli MPIM, włącza się osobno kluczem channels.slack.dm.groupEnabled, domyślnie ustawionym na false. Zawężasz je opcjonalną listą channels.slack.dm.groupChannels. Obie rzeczy tylko filtrują to, co Slack już dostarczył — nie dodadzą agenta do istniejącej grupy. Sama polityka grup tu nie wystarczy i to bodaj najczęstsze nieporozumienie przy tym kanale.

Dwa drobiazgi na koniec. Gdy konfiguracja Slacka pochodzi wyłącznie ze zmiennych środowiskowych, system wraca do groupPolicy ustawionego na allowlist i zapisuje ostrzeżenie w logu — czyli dostajesz kanał, który domyślnie nic nie wpuszcza. Na Enterprise Grid przy instalacjach org-wide nie ma trybu relay, a na kontach enterprise nie działają slash commands, interakcje ani App Home. Te ograniczenia wynikają z platformy Slacka, nie z Twojej konfiguracji — szczegóły opisuje dokumentacja kanału Slack.

Polityka grup i przełącznik wielosobowych DM-ów. Drugi klucz odpowiada za większość zgłoszeń „agent nie widzi rozmowy w trójkę”.
openclaw config get channels.slack.groupPolicy
openclaw config get channels.slack.dm.groupEnabled

Zły allowlist to najczęstszy incydent — dlaczego akurat ten

Błąd w allowliście ma dwa oblicza i tylko jedno jest niegroźne. Lista za wąska daje agenta, który milczy: irytujące, kosztuje kwadrans, nikt nie ucierpiał. Lista za szeroka daje agenta odpowiadającego osobom spoza firmy, z pełnym dostępem do tego, co ma w kontekście.

Za szeroką listę produkuje się zwykle w jeden z czterech sposobów, a każdy widać w wyniku openclaw config get channels. Wpis „*” zostawiony po testach siedzi w allowFrom albo w rejestrze groups i rzuca się w oczy od razu — pod warunkiem, że ktoś tam zagląda. Kanał współdzielony z klientem wygląda w konfiguracji jak każdy inny identyfikator, więc rozpoznasz go tylko po tym, że go rozpoznajesz. Konto osoby, która odeszła, zostaje w groupAllowFrom jako identyfikator bez twarzy. Konfiguracja skopiowana z innego kanału przynosi ze sobą nadpisania z channels.<kanał>.accounts.<accountId>, które leżą niżej w pliku i wygrywają z tym, co edytujesz na górze.

Kanał współdzielony jest najgorszy, bo nie wygląda podejrzanie. Jeśli allowlista opiera się na obecności w pokoju zamiast na wymienionych identyfikatorach, agent odpowie tam wszystkim — łącznie z pytaniem o marżę albo warunki innego kontrahenta.

Kto ma być na której liście i kto ją czyści przy odejściu z firmy — to ustalenie organizacyjne z lekcji trzynastej; tutaj interesuje nas wyłącznie, w którym kluczu je zapisać.

Pełny zrzut polityk i osobno ustawienia pojedynczych kanałów Slacka — dwa miejsca, w których widać wpisy dodane kiedyś do testów.
openclaw config get channels
openclaw config get channels.slack.channels

Co warto zapamiętać

  • W rdzeniu instalacji siedzą trzy kanały: WebChat, Telegram i iMessage — do żadnego z nich niczego nie instalujesz. Reszta komunikatorów to pluginy wymagające restartu Gateway po instalacji.
  • dmPolicy przyjmuje pairing (domyślnie), allowlist, open i disabled; groupPolicy przyjmuje open, allowlist (domyślnie) i disabled. Tryb open wymaga jawnego wpisu „*” na allowliście, inaczej wiadomości dalej są blokowane.
  • W grupach obowiązuje groupAllowFrom, allowFrom dotyczy wyłącznie DM-ów. Zatwierdzone parowanie nie daje dostępu do grup, a odpowiedź na wiadomość bota nie omija groupAllowFrom.
  • Kolejność sprawdzania jest trzystopniowa: groupPolicy, potem allowlisty grup (groups i groupAllowFrom), na końcu bramka wzmianki z requireMention domyślnie ustawionym na true.
  • Allowlisty kanałów Slacka muszą używać identyfikatorów w formacie C12345678 — klucze po nazwie przy groupPolicy allowlist milczą zamiast błędu. Wielosobowe DM-y włącza osobno channels.slack.dm.groupEnabled, domyślnie false.
  • Kody parowania są ważne godzinę, a w WhatsAppie oczekujące żądania są limitowane do trzech na konto. Zatwierdzasz je komendą openclaw pairing approve, opcjonalnie z flagą --notify.

Częste pytania

Ustawiłem dmPolicy na open, a agent dalej nie odpowiada nieznanym osobom. Dlaczego?+

Bo tryb open wymaga jawnego wpisu „*” na allowliście kanału. Sama polityka mówi tylko, jak lista ma być interpretowana — lista nadal musi istnieć i zawierać gwiazdkę. W logach zobaczysz wtedy wpis allowlist, który wygląda niewinnie i bywa mylony z problemem tokenu. Zanim to ustawisz, sprawdź, czy naprawdę tego chcesz: dokumentacja traktuje open jako ustawienie ostatniej szansy i poleca parowanie z allowlistą.

Agent odpowiada w prywatnych wiadomościach, ale w grupie na Slacku milczy. Od czego zacząć?+

Od trzech rzeczy w tej kolejności. Po pierwsze groupPolicy — domyślnie stoi na allowlist, więc pokój musi być wymieniony. Po drugie format kluczy: Slack wymaga identyfikatorów w postaci C12345678, a klucze po nazwie kanału po cichu nie pasują. Po trzecie requireMention, które domyślnie jest włączone i wymaga zawołania agenta. W logach szukaj wpisu „drop guild message (mention required)”.

Czy zatwierdzenie parowania wystarczy, żeby agent działał też w grupach?+

Nie. Kod parowania odblokowuje wyłącznie rozmowy prywatne. Dostęp grupowy wymaga osobnych wpisów w konfiguracji — rejestru groups i listy groupAllowFrom. Odpowiedź na wiadomość bota również nie omija groupAllowFrom, więc nie da się obejść tego cytowaniem. To celowy podział: zgoda na rozmowę z Tobą to nie to samo co prawo wstępu do pokoju z trzydziestoma osobami.

Jak włączyć rozmowy w trójkę na Slacku?+

Kluczem channels.slack.dm.groupEnabled, który domyślnie stoi na false. Opcjonalnie zawężasz je listą channels.slack.dm.groupChannels. Obie opcje tylko filtrują to, co Slack już dostarczył — nie dodadzą agenta do istniejącej rozmowy grupowej, do której nie należy. Sama polityka grup tego nie załatwi, bo MPIM jest w Slacku osobnym typem konwersacji.

Źródła danych z tej lekcji

Krok 2Ćwiczenie do wykonaniaTeoria bez ćwiczenia zostaje wiedzą, której nie używasz.

Chcesz to przećwiczyć na żywo?

Uruchom własnego agenta i wypróbuj to, o czym przed chwilą przeczytałeś. Pierwsza subskrypcja pakietu Premium ma 5 dni za darmo, a kurs czytasz dalej niezależnie od tego.

Zobacz plany