Instalacja
Zainstaluj Mattermost przed skonfigurowaniem kanału:- rejestr npm
- Lokalny checkout
Szybka konfiguracja
Upewnij się, że Plugin jest dostępny
Zainstaluj
@openclaw/mattermost za pomocą powyższego polecenia, a następnie uruchom ponownie Gateway, jeśli już działa.Natywne polecenia slash
Natywne polecenia slash są opcjonalne. Po włączeniu OpenClaw rejestruje polecenia slashoc_* przez API Mattermost i odbiera zwrotne żądania POST na serwerze HTTP Gateway.
Uwagi dotyczące zachowania
Uwagi dotyczące zachowania
native: "auto"jest domyślnie wyłączone dla Mattermost. Ustawnative: true, aby włączyć.- Jeśli
callbackUrlzostanie pominięty, OpenClaw wyprowadzi go z hosta/portu Gateway +callbackPath. - W konfiguracjach z wieloma kontami
commandsmożna ustawić na najwyższym poziomie albo wchannels.mattermost.accounts.<id>.commands(wartości konta nadpisują pola najwyższego poziomu). - Wywołania zwrotne poleceń są weryfikowane za pomocą tokenów poszczególnych poleceń zwracanych przez Mattermost, gdy OpenClaw rejestruje polecenia
oc_*. - OpenClaw odświeża bieżącą rejestrację poleceń Mattermost przed zaakceptowaniem każdego wywołania zwrotnego, dzięki czemu nieaktualne tokeny z usuniętych lub ponownie wygenerowanych poleceń slash przestają być akceptowane bez restartu Gateway.
- Walidacja wywołania zwrotnego kończy się zamknięciem dostępu, jeśli API Mattermost nie może potwierdzić, że polecenie jest nadal aktualne; nieudane walidacje są krótko buforowane, równoczesne wyszukiwania są scalane, a rozpoczęcia świeżych wyszukiwań są limitowane na polecenie, aby ograniczyć presję powtórek.
- Wywołania zwrotne slash kończą się zamknięciem dostępu, gdy rejestracja się nie powiodła, uruchomienie było częściowe albo token wywołania zwrotnego nie pasuje do zarejestrowanego tokenu rozwiązanego polecenia (token ważny dla jednego polecenia nie może przejść do walidacji upstream dla innego polecenia).
Wymóg osiągalności
Wymóg osiągalności
Punkt końcowy wywołania zwrotnego musi być osiągalny z serwera Mattermost.
- Nie ustawiaj
callbackUrlnalocalhost, chyba że Mattermost działa na tym samym hoście/przestrzeni nazw sieci co OpenClaw. - Nie ustawiaj
callbackUrlna bazowy URL Mattermost, chyba że ten URL odwrotnie proxyuje/api/channels/mattermost/commanddo OpenClaw. - Szybki test to
curl https://<gateway-host>/api/channels/mattermost/command; żądanie GET powinno zwrócić z OpenClaw405 Method Not Allowed, a nie404.
Lista dozwolonych wyjść Mattermost
Lista dozwolonych wyjść Mattermost
Jeśli wywołanie zwrotne wskazuje prywatne/tailnet/wewnętrzne adresy, ustaw Mattermost
ServiceSettings.AllowedUntrustedInternalConnections tak, aby obejmowało host/domenę wywołania zwrotnego.Używaj wpisów hosta/domeny, nie pełnych URL-i.- Dobrze:
gateway.tailnet-name.ts.net - Źle:
https://gateway.tailnet-name.ts.net
Zmienne środowiskowe (konto domyślne)
Ustaw je na hoście Gateway, jeśli wolisz zmienne środowiskowe:MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
Zmienne środowiskowe dotyczą tylko konta domyślnego (
default). Inne konta muszą używać wartości konfiguracyjnych.MATTERMOST_URL nie można ustawić z pliku .env obszaru roboczego; zobacz Pliki .env obszaru roboczego.Tryby czatu
Mattermost automatycznie odpowiada na wiadomości DM. Zachowanie w kanale jest kontrolowane przezchatmode:
- oncall (domyślnie)
- onmessage
- onchar
Odpowiadaj tylko po @wzmiance w kanałach.
oncharnadal odpowiada na wyraźne @wzmianki.channels.mattermost.requireMentionjest respektowane dla starszych konfiguracji, ale preferowane jestchatmode.- Po tym, jak bot wyśle widoczną odpowiedź w wątku kanału, późniejsze wiadomości w tym samym wątku są obsługiwane bez nowej @wzmianki lub prefiksu
onchar, dzięki czemu wieloturowe rozmowy w wątku płyną dalej. Uczestnictwo jest zapamiętywane przez 7 dni nieaktywności wątku (odświeżane przy każdej odpowiedzi) i utrzymuje się po restartach Gateway. Wątki, które bot tylko obserwował, pozostają bez zmian; rozpocznij nową wiadomość najwyższego poziomu, aby ponownie wymagać jawnej wzmianki.
Wątki i sesje
Użyjchannels.mattermost.replyToMode, aby kontrolować, czy odpowiedzi w kanałach i grupach pozostają w głównym kanale, czy rozpoczynają wątek pod postem wyzwalającym.
off(domyślnie): odpowiadaj w wątku tylko wtedy, gdy post przychodzący już jest w wątku.first: dla postów najwyższego poziomu w kanale/grupie rozpocznij wątek pod tym postem i skieruj rozmowę do sesji o zakresie wątku.all: obecnie takie samo zachowanie jakfirstdla Mattermost.- Wiadomości bezpośrednie ignorują to ustawienie i pozostają bez wątków.
- Sesje o zakresie wątku używają identyfikatora posta wyzwalającego jako korzenia wątku.
firstiallsą obecnie równoważne, ponieważ gdy Mattermost ma korzeń wątku, kolejne fragmenty i media są kontynuowane w tym samym wątku.
Kontrola dostępu (DM)
- Domyślnie:
channels.mattermost.dmPolicy = "pairing"(nieznani nadawcy otrzymują kod parowania). - Zatwierdź przez:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- Publiczne DM:
channels.mattermost.dmPolicy="open"pluschannels.mattermost.allowFrom=["*"]. channels.mattermost.allowFromakceptuje wpisyaccessGroup:<name>. Zobacz Grupy dostępu.
Kanały (grupy)
- Domyślnie:
channels.mattermost.groupPolicy = "allowlist"(bramka przez wzmiankę). - Dodaj nadawców do listy dozwolonych za pomocą
channels.mattermost.groupAllowFrom(zalecane identyfikatory użytkowników). channels.mattermost.groupAllowFromakceptuje wpisyaccessGroup:<name>. Zobacz Grupy dostępu.- Nadpisania wzmianek per kanał znajdują się w
channels.mattermost.groups.<channelId>.requireMentionalbo wchannels.mattermost.groups["*"].requireMentionjako ustawienie domyślne. - Dopasowanie
@usernamejest zmienne i włączane tylko wtedy, gdychannels.mattermost.dangerouslyAllowNameMatching: true. - Otwarte kanały:
channels.mattermost.groupPolicy="open"(bramka przez wzmiankę). - Uwaga dotycząca czasu wykonywania: jeśli
channels.mattermostcałkowicie brakuje, runtime wraca dogroupPolicy="allowlist"dla kontroli grup (nawet jeśli ustawionochannels.defaults.groupPolicy).
Cele dostarczania wychodzącego
Używaj tych formatów celów zopenclaw message send albo cron/webhooks:
channel:<id>dla kanałuuser:<id>dla DM@usernamedla DM (rozwiązywane przez API Mattermost)
Ponawianie kanału DM
Gdy OpenClaw wysyła do celu DM w Mattermost i musi najpierw rozwiązać kanał bezpośredni, domyślnie ponawia przejściowe błędy tworzenia kanału bezpośredniego. Użyjchannels.mattermost.dmChannelRetry, aby dostroić to zachowanie globalnie dla Plugin Mattermost, albo channels.mattermost.accounts.<id>.dmChannelRetry dla jednego konta.
- Dotyczy to tylko tworzenia kanału DM (
/api/v4/channels/direct), nie każdego wywołania API Mattermost. - Ponowienia dotyczą błędów przejściowych, takich jak limity szybkości, odpowiedzi 5xx oraz błędy sieci lub przekroczenia limitu czasu.
- Błędy klienta 4xx inne niż
429są traktowane jako trwałe i nie są ponawiane.
Strumieniowanie podglądu
Mattermost strumieniuje myślenie, aktywność narzędzi i częściowy tekst odpowiedzi do jednego posta podglądu wersji roboczej, który jest finalizowany w miejscu, gdy ostateczna odpowiedź jest bezpieczna do wysłania. Podgląd aktualizuje ten sam identyfikator posta zamiast zasypywać kanał wiadomościami dla każdego fragmentu. Finalne media/błędy anulują oczekujące edycje podglądu i używają normalnego dostarczania zamiast opróżniania jednorazowego posta podglądu. Włącz przezchannels.mattermost.streaming:
Tryby strumieniowania
Tryby strumieniowania
partialto zwykle wybierana opcja: jeden post podglądu, który jest edytowany w miarę rozrastania się odpowiedzi, a następnie finalizowany kompletną odpowiedzią.blockużywa fragmentów wersji roboczej dodawanych w stylu append wewnątrz posta podglądu.progresspokazuje podgląd statusu podczas generowania i publikuje ostateczną odpowiedź dopiero po ukończeniu.offwyłącza strumieniowanie podglądu.
Uwagi dotyczące zachowania strumieniowania
Uwagi dotyczące zachowania strumieniowania
- Jeśli strumienia nie można sfinalizować w miejscu (na przykład post został usunięty w trakcie strumienia), OpenClaw wraca do wysłania świeżego posta końcowego, aby odpowiedź nigdy nie została utracona.
- Ładunki zawierające tylko myślenie są pomijane w postach kanału, w tym tekst, który przychodzi jako cytat blokowy
> Thinking. Ustaw/reasoning on, aby widzieć myślenie w innych powierzchniach; końcowy post Mattermost zachowuje tylko odpowiedź. - Zobacz Strumieniowanie, aby uzyskać macierz mapowania kanałów.
Reakcje (narzędzie wiadomości)
- Użyj
message action=reactzchannel=mattermost. messageIdto identyfikator posta Mattermost.emojiakceptuje nazwy takie jakthumbsuplub:+1:(dwukropki są opcjonalne).- Ustaw
remove=true(boolean), aby usunąć reakcję. - Zdarzenia dodania/usunięcia reakcji są przekazywane jako zdarzenia systemowe do skierowanej sesji agenta.
channels.mattermost.actions.reactions: włącz/wyłącz akcje reakcji (domyślnie true).- Nadpisanie per konto:
channels.mattermost.accounts.<id>.actions.reactions.
Interaktywne przyciski (narzędzie wiadomości)
Wysyłaj wiadomości z klikalnymi przyciskami. Gdy użytkownik kliknie przycisk, agent otrzymuje wybór i może odpowiedzieć. Zwykłe odpowiedzi agenta mogą też zawierać semantyczne ładunkipresentation. OpenClaw renderuje przyciski wartości jako interaktywne przyciski Mattermost, pozostawia przyciski URL widoczne w tekście wiadomości i obniża menu wyboru do czytelnego tekstu.
Włącz przyciski, dodając inlineButtons do możliwości kanału:
message action=send z parametrem buttons. Przyciski są tablicą 2D (wiersze przycisków):
Etykieta wyświetlana.
Wartość odsyłana po kliknięciu (używana jako identyfikator akcji).
Styl przycisku.
Buttons replaced with confirmation
Wszystkie przyciski są zastępowane wierszem potwierdzenia (np. „✓ Yes wybrane przez @user”).
Implementation notes
Implementation notes
- Wywołania zwrotne przycisków używają weryfikacji HMAC-SHA256 (automatycznie, bez konfiguracji).
- Mattermost usuwa dane wywołania zwrotnego ze swoich odpowiedzi API (funkcja bezpieczeństwa), więc po kliknięciu usuwane są wszystkie przyciski - częściowe usunięcie nie jest możliwe.
- Identyfikatory akcji zawierające łączniki lub podkreślenia są automatycznie oczyszczane (ograniczenie routingu Mattermost).
Config and reachability
Config and reachability
channels.mattermost.capabilities: tablica ciągów możliwości. Dodaj"inlineButtons", aby włączyć opis narzędzia przycisków w systemowym prompcie agenta.channels.mattermost.interactions.callbackBaseUrl: opcjonalny zewnętrzny bazowy URL dla wywołań zwrotnych przycisków (na przykładhttps://gateway.example.com). Użyj tego, gdy Mattermost nie może bezpośrednio dotrzeć do Gateway pod jego hostem powiązania.- W konfiguracjach z wieloma kontami możesz także ustawić to samo pole pod
channels.mattermost.accounts.<id>.interactions.callbackBaseUrl. - Jeśli
interactions.callbackBaseUrlzostanie pominięte, OpenClaw wyprowadzi URL wywołania zwrotnego zgateway.customBindHost+gateway.port, a następnie użyje awaryjniehttp://localhost:<port>. - Reguła osiągalności: URL wywołania zwrotnego przycisku musi być osiągalny z serwera Mattermost.
localhostdziała tylko wtedy, gdy Mattermost i OpenClaw działają na tym samym hoście/przestrzeni nazw sieci. - Jeśli cel wywołania zwrotnego jest prywatny/tailnet/wewnętrzny, dodaj jego host/domenę do
ServiceSettings.AllowedUntrustedInternalConnectionsw Mattermost.
Bezpośrednia integracja API (zewnętrzne skrypty)
Zewnętrzne skrypty i Webhook mogą publikować przyciski bezpośrednio przez REST API Mattermost zamiast przechodzić przez narzędziemessage agenta. Używaj buildButtonAttachments() z pluginu, gdy to możliwe; jeśli publikujesz surowy JSON, stosuj te reguły:
Struktura ładunku:
Derive the secret from the bot token
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken)Serialize with sorted keys
Serializuj z posortowanymi kluczami i bez spacji (Gateway używa
JSON.stringify z posortowanymi kluczami, co daje kompaktowy wynik).Common HMAC pitfalls
Common HMAC pitfalls
json.dumpsw Pythonie domyślnie dodaje spacje ({"key": "val"}). Użyjseparators=(",", ":"), aby dopasować kompaktowy wynik JavaScriptu ({"key":"val"}).- Zawsze podpisuj wszystkie pola kontekstu (bez
_token). Gateway usuwa_token, a następnie podpisuje wszystko, co pozostaje. Podpisanie podzbioru powoduje cichą porażkę weryfikacji. - Użyj
sort_keys=True- Gateway sortuje klucze przed podpisaniem, a Mattermost może zmienić kolejność pól kontekstu podczas przechowywania ładunku. - Wyprowadź sekret z tokenu bota (deterministycznie), a nie z losowych bajtów. Sekret musi być taki sam w procesie tworzącym przyciski i w Gateway, który je weryfikuje.
Adapter katalogu
Plugin Mattermost zawiera adapter katalogu, który rozwiązuje nazwy kanałów i użytkowników przez API Mattermost. Umożliwia to cele#channel-name i @username w openclaw message send oraz dostarczeniach Cron/Webhook.
Konfiguracja nie jest potrzebna - adapter używa tokenu bota z konfiguracji konta.
Wiele kont
Mattermost obsługuje wiele kont podchannels.mattermost.accounts:
Rozwiązywanie problemów
No replies in channels
No replies in channels
Upewnij się, że bot jest w kanale, i wspomnij o nim (oncall), użyj prefiksu wyzwalacza (onchar) albo ustaw
chatmode: "onmessage".Auth or multi-account errors
Auth or multi-account errors
- Sprawdź token bota, bazowy URL oraz czy konto jest włączone.
- Problemy z wieloma kontami: zmienne środowiskowe dotyczą tylko konta
default.
Native slash commands fail
Native slash commands fail
Unauthorized: invalid command token.: OpenClaw nie zaakceptował tokenu wywołania zwrotnego. Typowe przyczyny:- rejestracja polecenia slash nie powiodła się lub została ukończona tylko częściowo podczas uruchamiania
- wywołanie zwrotne trafia do niewłaściwego Gateway/konta
- Mattermost nadal ma stare polecenia wskazujące na poprzedni cel wywołania zwrotnego
- Gateway został ponownie uruchomiony bez ponownej aktywacji poleceń slash
- Jeśli natywne polecenia slash przestają działać, sprawdź logi pod kątem
mattermost: failed to register slash commandslubmattermost: native slash commands enabled but no commands could be registered. - Jeśli
callbackUrlzostanie pominięte, a logi ostrzegają, że wywołanie zwrotne rozwiązało się dohttp://127.0.0.1:18789/..., ten URL prawdopodobnie jest osiągalny tylko wtedy, gdy Mattermost działa na tym samym hoście/przestrzeni nazw sieci co OpenClaw. Zamiast tego ustaw jawne, zewnętrznie osiągalnecommands.callbackUrl.
Powiązane
- Routing kanałów - routing sesji dla wiadomości
- Przegląd kanałów - wszystkie obsługiwane kanały
- Grupy - zachowanie czatu grupowego i bramkowanie wzmianek
- Parowanie - uwierzytelnianie DM i przepływ parowania
- Bezpieczeństwo - model dostępu i wzmacnianie zabezpieczeń