Mattermost
Status: plugin dołączony do pakietu (token bota + zdarzenia WebSocket). Obsługiwane są kanały, grupy i DM. Mattermost to samohostowalna platforma do komunikacji zespołowej; szczegóły produktu i pliki do pobrania znajdziesz na oficjalnej stronie mattermost.com.Plugin dołączony do pakietu
Mattermost jest dostarczany jako plugin dołączony do pakietu w bieżących wydaniach OpenClaw, więc standardowe spakowane kompilacje nie wymagają osobnej instalacji. Jeśli używasz starszej kompilacji lub niestandardowej instalacji, która nie zawiera Mattermost, zainstaluj go ręcznie: Instalacja przez CLI (rejestr npm):Szybka konfiguracja
- Upewnij się, że plugin Mattermost jest dostępny.
- Bieżące spakowane wydania OpenClaw już go zawierają.
- Starsze/niestandardowe instalacje mogą dodać go ręcznie za pomocą powyższych poleceń.
- Utwórz konto bota Mattermost i skopiuj token bota.
- Skopiuj bazowy URL Mattermost (na przykład
https://chat.example.com). - Skonfiguruj OpenClaw i uruchom Gateway.
Natywne polecenia slash
Natywne polecenia slash są opcjonalne. Po włączeniu OpenClaw rejestruje polecenia slashoc_* przez
API Mattermost i odbiera callbacki POST na serwerze HTTP Gateway.
native: "auto"domyślnie jest wyłączone dla Mattermost. Ustawnative: true, aby włączyć.- Jeśli
callbackUrlzostanie pominięty, OpenClaw wyprowadzi go z hosta/portu Gateway +callbackPath. - W konfiguracjach wielokontowych
commandsmożna ustawić na najwyższym poziomie albo wchannels.mattermost.accounts.<id>.commands(wartości konta nadpisują pola najwyższego poziomu). - Callbacki poleceń są weryfikowane za pomocą tokenów per polecenie zwracanych przez
Mattermost, gdy OpenClaw rejestruje polecenia
oc_*. - Callbacki slash domyślnie kończą się błędem, gdy rejestracja się nie powiodła, uruchomienie było częściowe lub token callbacku nie pasuje do żadnego z zarejestrowanych poleceń.
- Wymóg osiągalności: endpoint callbacku musi być osiągalny z serwera Mattermost.
- Nie ustawiaj
callbackUrlnalocalhost, chyba że Mattermost działa na tym samym hoście/w tej samej przestrzeni nazw sieci co OpenClaw. - Nie ustawiaj
callbackUrlna bazowy URL Mattermost, chyba że ten URL przez reverse proxy przekierowuje/api/channels/mattermost/commanddo OpenClaw. - Szybka kontrola to
curl https://<gateway-host>/api/channels/mattermost/command; żądanie GET powinno zwrócić z OpenClaw405 Method Not Allowed, a nie404.
- Nie ustawiaj
- Wymóg allowlisty ruchu wychodzącego Mattermost:
- Jeśli callback wskazuje na adresy prywatne/tailnet/wewnętrzne, ustaw w Mattermost
ServiceSettings.AllowedUntrustedInternalConnections, aby zawierało host/domenę callbacku. - Używaj wpisów hosta/domeny, a nie pełnych URL-i.
- Dobrze:
gateway.tailnet-name.ts.net - Źle:
https://gateway.tailnet-name.ts.net
- Dobrze:
- Jeśli callback wskazuje na adresy prywatne/tailnet/wewnętrzne, ustaw w Mattermost
Zmienne środowiskowe (konto domyślne)
Ustaw je na hoście Gateway, jeśli wolisz używać zmiennych środowiskowych:MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
default). Inne konta muszą używać wartości z konfiguracji.
Tryby czatu
Mattermost odpowiada na DM automatycznie. Zachowanie na kanałach kontrolujechatmode:
oncall(domyślnie): odpowiada tylko po wzmiance @ na kanałach.onmessage: odpowiada na każdą wiadomość na kanale.onchar: odpowiada, gdy wiadomość zaczyna się od prefiksu wyzwalającego.
oncharnadal odpowiada na jawne wzmianki @.channels.mattermost.requireMentionjest respektowane dla starszych konfiguracji, ale preferowane jestchatmode.
Wątki i sesje
Użyjchannels.mattermost.replyToMode, aby określić, czy odpowiedzi na kanałach i w grupach mają pozostać w
głównym kanale, czy uruchamiać wątek pod postem wyzwalającym.
off(domyślnie): odpowiada w wątku tylko wtedy, gdy przychodzący post już się w nim znajduje.first: dla postów najwyższego poziomu na kanałach/w grupach uruchamia wątek pod tym postem i kieruje rozmowę do sesji ograniczonej do wątku.all: dziś w Mattermost działa tak samo jakfirst.- Wiadomości bezpośrednie ignorują to ustawienie i pozostają bez wątków.
- Sesje ograniczone do wątku używają id posta wyzwalającego jako korzenia wątku.
firstiallsą obecnie równoważne, ponieważ gdy Mattermost ma już korzeń wątku, kolejne fragmenty i multimedia pozostają w tym samym wątku.
Kontrola dostępu (DM)
- Domyślnie:
channels.mattermost.dmPolicy = "pairing"(nieznani nadawcy otrzymują kod parowania). - Zatwierdzanie przez:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- Publiczne DM:
channels.mattermost.dmPolicy="open"pluschannels.mattermost.allowFrom=["*"].
Kanały (grupy)
- Domyślnie:
channels.mattermost.groupPolicy = "allowlist"(bramka oparta na wzmiankach). - Dodawaj nadawców do allowlisty przez
channels.mattermost.groupAllowFrom(zalecane są ID użytkowników). - Nadpisania wzmianki per kanał znajdują się w
channels.mattermost.groups.<channelId>.requireMentionalbo wchannels.mattermost.groups["*"].requireMentionjako wartość domyślna. - Dopasowywanie
@usernamejest zmienne i włączane tylko wtedy, gdychannels.mattermost.dangerouslyAllowNameMatching: true. - Otwarte kanały:
channels.mattermost.groupPolicy="open"(bramka oparta na wzmiankach). - Uwaga środowiska uruchomieniowego: jeśli
channels.mattermostjest całkowicie pominięte, środowisko wykonawcze przechodzi nagroupPolicy="allowlist"przy sprawdzaniu grup (nawet jeśli ustawionochannels.defaults.groupPolicy).
Cele dla dostarczania wychodzącego
Używaj tych formatów celu zopenclaw message send lub Cron/Webhookami:
channel:<id>dla kanałuuser:<id>dla DM@usernamedla DM (rozwiązywane przez API Mattermost)
64ifufp...) są w Mattermost niejednoznaczne (ID użytkownika vs ID kanału).
OpenClaw rozwiązuje je najpierw jako użytkownika:
- Jeśli ID istnieje jako użytkownik (
GET /api/v4/users/<id>powiedzie się), OpenClaw wysyła DM, rozwiązując kanał bezpośredni przez/api/v4/channels/direct. - W przeciwnym razie ID jest traktowane jako ID kanału.
user:<id> / channel:<id>).
Ponawianie DM channel
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 pluginu Mattermost,
lub channels.mattermost.accounts.<id>.dmChannelRetry dla jednego konta.
- Dotyczy to tylko tworzenia kanału DM (
/api/v4/channels/direct), a nie każdego wywołania API Mattermost. - Ponowienia dotyczą przejściowych błędów, takich jak limity szybkości, odpowiedzi 5xx oraz błędy sieci lub timeouty.
- Błędy klienta 4xx inne niż
429są traktowane jako trwałe i nie są ponawiane.
Podgląd streamingu
Mattermost streamuje tok rozumowania, aktywność narzędzi i częściowy tekst odpowiedzi do jednego posta roboczego podglądu, który jest finalizowany w miejscu, gdy końcowa odpowiedź nadaje się do wysłania. Podgląd aktualizuje się na tym samym id posta zamiast zaśmiecać kanał wiadomościami per fragment. Finalne multimedia/błędy anulują oczekujące edycje podglądu i używają zwykłego dostarczenia zamiast opróżniania jednorazowego posta podglądu. Włącz przezchannels.mattermost.streaming:
partialto zwykle najlepszy wybór: jeden post podglądu, który jest edytowany wraz z rozwojem odpowiedzi, a następnie finalizowany pełną odpowiedzią.blockużywa fragmentów roboczych w stylu dopisywania w poście podglądu.progresspokazuje podgląd statusu podczas generowania i publikuje końcową odpowiedź dopiero po zakończeniu.offwyłącza podgląd streamingu.- Jeśli streamu nie da się sfinalizować w miejscu (na przykład post został usunięty w trakcie streamu), OpenClaw przechodzi do wysłania nowego posta końcowego, aby odpowiedź nigdy nie została utracona.
- Zobacz Streaming, aby poznać macierz mapowania kanałów.
Reakcje (narzędzie wiadomości)
- Użyj
message action=reactzchannel=mattermost. messageIdto id posta Mattermost.emojiprzyjmuje 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łącza/wyłącza 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 otrzyma wybór i będzie mógł odpowiedzieć. Włącz przyciski, dodającinlineButtons do możliwości kanału:
message action=send z parametrem buttons. Przyciski są tablicą 2D (wiersze przycisków):
text(wymagane): etykieta wyświetlana.callback_data(wymagane): wartość odsyłana po kliknięciu (używana jako ID akcji).style(opcjonalne):"default","primary"lub"danger".
- Wszystkie przyciski są zastępowane linią potwierdzenia (na przykład ”✓ Yes selected by @user”).
- Agent otrzymuje wybór jako wiadomość przychodzącą i odpowiada.
- Callbacki przycisków używają weryfikacji HMAC-SHA256 (automatycznie, bez dodatkowej konfiguracji).
- Mattermost usuwa callback data ze swoich odpowiedzi API (funkcja bezpieczeństwa), więc wszystkie przyciski są usuwane po kliknięciu — częściowe usunięcie nie jest możliwe.
- ID akcji zawierające łączniki lub podkreślenia są automatycznie sanityzowane (ograniczenie routingu Mattermost).
channels.mattermost.capabilities: tablica ciągów możliwości. Dodaj"inlineButtons", aby włączyć opis narzędzia przycisków w promptcie systemowym agenta.channels.mattermost.interactions.callbackBaseUrl: opcjonalny zewnętrzny bazowy URL dla callbacków przycisków (na przykładhttps://gateway.example.com). Użyj tego, gdy Mattermost nie może bezpośrednio połączyć się z Gateway na jego hoście powiązania.- W konfiguracjach wielokontowych możesz też ustawić to samo pole w
channels.mattermost.accounts.<id>.interactions.callbackBaseUrl. - Jeśli
interactions.callbackBaseUrlzostanie pominięty, OpenClaw wyprowadzi URL callbacku zgateway.customBindHost+gateway.port, a następnie przejdzie dohttp://localhost:<port>. - Zasada osiągalności: URL callbacku przycisku musi być osiągalny z serwera Mattermost.
localhostdziała tylko wtedy, gdy Mattermost i OpenClaw działają na tym samym hoście/w tej samej przestrzeni nazw sieci. - Jeśli cel callbacku jest prywatny/tailnet/wewnętrzny, dodaj jego host/domenę do ustawienia Mattermost
ServiceSettings.AllowedUntrustedInternalConnections.
Bezpośrednia integracja API (zewnętrzne skrypty)
Zewnętrzne skrypty i Webhooki mogą publikować przyciski bezpośrednio przez REST API Mattermost zamiast przez narzędziemessage agenta. Używaj buildButtonAttachments() z
rozszerzenia, gdy to możliwe; jeśli publikujesz surowy JSON, stosuj te zasady:
Struktura ładunku:
- Załączniki trafiają do
props.attachments, a nie do najwyższego poziomuattachments(są po cichu ignorowane). - Każda akcja potrzebuje
type: "button"— bez tego kliknięcia są po cichu pochłaniane. - Każda akcja potrzebuje pola
id— Mattermost ignoruje akcje bez ID. idakcji musi być wyłącznie alfanumeryczne ([a-zA-Z0-9]). Łączniki i podkreślenia psują routowanie akcji po stronie serwera Mattermost (zwraca 404). Usuń je przed użyciem.context.action_idmusi odpowiadaćidprzycisku, aby komunikat potwierdzenia pokazywał nazwę przycisku (na przykład “Approve”), a nie surowe ID.context.action_idjest wymagane — handler interakcji zwraca 400 bez niego.
- Wyprowadź sekret z tokenu bota:
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken) - Zbuduj obiekt context ze wszystkimi polami poza
_token. - Serializuj z posortowanymi kluczami i bez spacji (Gateway używa
JSON.stringifyz posortowanymi kluczami, co daje zwarty wynik). - Podpisz:
HMAC-SHA256(key=secret, data=serializedContext) - Dodaj wynikowy skrót hex jako
_tokenw context.
json.dumpsw Pythonie domyślnie dodaje spacje ({"key": "val"}). Użyjseparators=(",", ":"), aby dopasować zwarty wynik JavaScript ({"key":"val"}).- Zawsze podpisuj wszystkie pola context (bez
_token). Gateway usuwa_token, a potem podpisuje wszystko, co pozostało. Podpisanie tylko podzbioru powoduje cichą porażkę weryfikacji. - Użyj
sort_keys=True— Gateway sortuje klucze przed podpisaniem, a Mattermost może zmieniać kolejność pól context przy przechowywaniu ładunku. - Wyprowadzaj 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 używanie celów#channel-name i @username w
openclaw message send oraz dostarczaniu przez Cron/Webhooki.
Nie jest potrzebna żadna konfiguracja — adapter używa tokenu bota z konfiguracji konta.
Wiele kont
Mattermost obsługuje wiele kont wchannels.mattermost.accounts:
Rozwiązywanie problemów
- Brak odpowiedzi na kanałach: upewnij się, że bot jest na kanale i wzmiankujesz go (oncall), użyj prefiksu wyzwalającego (onchar) albo ustaw
chatmode: "onmessage". - Błędy uwierzytelniania: sprawdź token bota, bazowy URL i czy konto jest włączone.
- Problemy z wieloma kontami: zmienne środowiskowe dotyczą tylko konta
default. - Natywne polecenia slash zwracają
Unauthorized: invalid command token.: OpenClaw nie zaakceptował tokenu callbacku. Typowe przyczyny:- rejestracja polecenia slash nie powiodła się albo ukończyła się tylko częściowo przy uruchamianiu
- callback trafia do niewłaściwego Gateway/konta
- Mattermost nadal ma stare polecenia wskazujące poprzedni cel callbacku
- Gateway uruchomił się ponownie bez ponownej aktywacji natywnych poleceń slash
- Jeśli natywne polecenia slash przestaną 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ęty, a logi ostrzegają, że callback rozwiązał się dohttp://127.0.0.1:18789/..., ten URL prawdopodobnie jest osiągalny tylko wtedy, gdy Mattermost działa na tym samym hoście/w tej samej przestrzeni nazw sieci co OpenClaw. Ustaw jawny, zewnętrznie osiągalnycommands.callbackUrl. - Przyciski pojawiają się jako białe pola: agent może wysyłać nieprawidłowe dane przycisków. Sprawdź, czy każdy przycisk ma pola
texticallback_data. - Przyciski renderują się, ale kliknięcia nic nie robią: sprawdź, czy
AllowedUntrustedInternalConnectionsw konfiguracji serwera Mattermost zawiera127.0.0.1 localhost, oraz czyEnablePostActionIntegrationma wartośćtruewServiceSettings. - Przyciski zwracają 404 po kliknięciu:
idprzycisku prawdopodobnie zawiera łączniki lub podkreślenia. Router akcji Mattermost nie działa z niealfanumerycznymi ID. Używaj wyłącznie[a-zA-Z0-9]. - Logi Gateway pokazują
invalid _token: niezgodność HMAC. Sprawdź, czy podpisujesz wszystkie pola context (a nie tylko podzbiór), używasz posortowanych kluczy i zwartego JSON-a (bez spacji). Zobacz sekcję HMAC powyżej. - Logi Gateway pokazują
missing _token in context: pole_tokennie znajduje się w context przycisku. Upewnij się, że jest dołączone przy budowaniu ładunku integracji. - Potwierdzenie pokazuje surowe ID zamiast nazwy przycisku:
context.action_idnie odpowiadaidprzycisku. Ustaw oba na tę samą zsanityzowaną wartość. - Agent nie wie o przyciskach: dodaj
capabilities: ["inlineButtons"]do konfiguracji kanału Mattermost.
Powiązane
- Przegląd kanałów — wszystkie obsługiwane kanały
- Parowanie — uwierzytelnianie DM i przepływ parowania
- Grupy — zachowanie czatu grupowego i bramka oparta na wzmiankach
- Routing kanałów — routing sesji dla wiadomości
- Bezpieczeństwo — model dostępu i utwardzanie