Mattermost
Статус: вбудований Plugin (токен бота + події WebSocket). Підтримуються канали, групи та приватні повідомлення. Mattermost — це команда платформа обміну повідомленнями, яку можна самостійно розгорнути; докладніше про продукт і завантаження дивіться на офіційному сайті mattermost.com.Вбудований Plugin
Mattermost постачається як вбудований Plugin у поточних релізах OpenClaw, тому звичайним пакетним збіркам не потрібне окреме встановлення. Якщо ви використовуєте старішу збірку або спеціальне встановлення без Mattermost, встановіть його вручну: Встановлення через CLI (реєстр npm):Швидке налаштування
- Переконайтеся, що Plugin Mattermost доступний.
- У поточних пакетних релізах OpenClaw він уже вбудований.
- У старіших/спеціальних встановленнях його можна додати вручну командами вище.
- Створіть обліковий запис бота Mattermost і скопіюйте токен бота.
- Скопіюйте базову URL-адресу Mattermost (наприклад,
https://chat.example.com). - Налаштуйте OpenClaw і запустіть Gateway.
Власні slash-команди
Власні slash-команди є необов’язковими. Коли їх увімкнено, OpenClaw реєструє slash-командиoc_* через
API Mattermost і отримує callback POST-запити на HTTP-сервері Gateway.
native: "auto"типово вимкнено для Mattermost. Установітьnative: true, щоб увімкнути.- Якщо
callbackUrlне вказано, OpenClaw формує його на основі host/port Gateway +callbackPath. - Для багатoоблікових конфігурацій
commandsможна задати на верхньому рівні або вchannels.mattermost.accounts.<id>.commands(значення облікового запису мають пріоритет над полями верхнього рівня). - Command callback-и перевіряються за допомогою токенів для кожної команди, які
Mattermost повертає, коли OpenClaw реєструє команди
oc_*. - Callback-и slash-команд закриваються з відмовою, якщо реєстрація не вдалася, запуск був частковим або callback token не збігається з одним із зареєстрованих команд.
- Вимога доступності: endpoint callback-ів має бути доступним із сервера Mattermost.
- Не вказуйте
callbackUrlякlocalhost, якщо Mattermost не працює на тому ж host/namespace мережі, що й OpenClaw. - Не вказуйте
callbackUrlяк базову URL-адресу Mattermost, якщо ця URL-адреса не reverse-proxy-ює/api/channels/mattermost/commandдо OpenClaw. - Швидка перевірка:
curl https://<gateway-host>/api/channels/mattermost/command; GET має повертати405 Method Not Allowedвід OpenClaw, а не404.
- Не вказуйте
- Вимога allowlist вихідних підключень Mattermost:
- Якщо ваш callback спрямовано на private/tailnet/internal-адреси, налаштуйте в Mattermost
ServiceSettings.AllowedUntrustedInternalConnections, щоб включити host/domain callback-а. - Використовуйте записи host/domain, а не повні URL-адреси.
- Правильно:
gateway.tailnet-name.ts.net - Неправильно:
https://gateway.tailnet-name.ts.net
- Правильно:
- Якщо ваш callback спрямовано на private/tailnet/internal-адреси, налаштуйте в Mattermost
Змінні середовища (обліковий запис за замовчуванням)
Установіть їх на host Gateway, якщо віддаєте перевагу змінним середовища:MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
default). Для інших облікових записів потрібно використовувати значення з конфігурації.
Режими чату
Mattermost автоматично відповідає на приватні повідомлення. Поведінка в каналах керується параметромchatmode:
oncall(типово): відповідати в каналах лише за @згадки.onmessage: відповідати на кожне повідомлення в каналі.onchar: відповідати, коли повідомлення починається з префікса-тригера.
oncharусе одно відповідає на явні @згадки.channels.mattermost.requireMentionвраховується для застарілих конфігурацій, але рекомендованоchatmode.
Гілки та сесії
Використовуйтеchannels.mattermost.replyToMode, щоб керувати тим, чи відповіді в каналах і групах залишаються в
основному каналі, чи запускають гілку під повідомленням, яке їх спричинило.
off(типово): відповідати в гілці лише тоді, коли вхідне повідомлення вже в ній.first: для повідомлень верхнього рівня в каналі/групі запускати гілку під цим повідомленням і спрямовувати розмову до сесії, прив’язаної до гілки.all: наразі для Mattermost поводиться так само, якfirst.- Для прямих повідомлень цей параметр ігнорується, і вони залишаються поза гілками.
- Сесії, прив’язані до гілки, використовують id повідомлення-тригера як корінь гілки.
firstіallзараз еквівалентні, тому що щойно в Mattermost з’являється корінь гілки, подальші фрагменти та медіа продовжуються в тій самій гілці.
Керування доступом (приватні повідомлення)
- Типово:
channels.mattermost.dmPolicy = "pairing"(невідомі відправники отримують код pairing). - Схвалення через:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- Публічні приватні повідомлення:
channels.mattermost.dmPolicy="open"плюсchannels.mattermost.allowFrom=["*"].
Канали (групи)
- Типово:
channels.mattermost.groupPolicy = "allowlist"(із вимогою згадки). - Додавайте відправників до allowlist через
channels.mattermost.groupAllowFrom(рекомендовано ID користувачів). - Перевизначення згадок для окремих каналів розміщуються в
channels.mattermost.groups.<channelId>.requireMentionабо вchannels.mattermost.groups["*"].requireMentionяк типове значення. - Відповідність
@usernameє змінною та вмикається лише заchannels.mattermost.dangerouslyAllowNameMatching: true. - Відкриті канали:
channels.mattermost.groupPolicy="open"(із вимогою згадки). - Примітка щодо runtime: якщо
channels.mattermostповністю відсутній, runtime повертається доgroupPolicy="allowlist"для перевірок груп (навіть якщо встановленоchannels.defaults.groupPolicy).
Цілі для вихідної доставки
Використовуйте ці формати цілей ізopenclaw message send або cron/webhooks:
channel:<id>для каналуuser:<id>для приватного повідомлення@usernameдля приватного повідомлення (визначається через API Mattermost)
64ifufp...) у Mattermost неоднозначні (ID користувача чи ID каналу).
OpenClaw визначає їх у порядку спочатку користувач:
- Якщо ID існує як користувач (
GET /api/v4/users/<id>виконується успішно), OpenClaw надсилає приватне повідомлення, визначаючи прямий канал через/api/v4/channels/direct. - Інакше ID трактується як ID каналу.
user:<id> / channel:<id>).
Повторні спроби для DM-каналу
Коли OpenClaw надсилає повідомлення до цілі Mattermost DM і спочатку має визначити прямий канал, типово він повторює спроби у разі тимчасових збоїв створення прямого каналу. Використовуйтеchannels.mattermost.dmChannelRetry, щоб налаштувати цю поведінку глобально для Plugin Mattermost,
або channels.mattermost.accounts.<id>.dmChannelRetry для окремого облікового запису.
- Це стосується лише створення DM-каналу (
/api/v4/channels/direct), а не кожного виклику API Mattermost. - Повторні спроби застосовуються до тимчасових збоїв, як-от обмеження частоти, відповіді 5xx та помилки мережі або тайм-аути.
- Клієнтські помилки 4xx, окрім
429, вважаються постійними й не повторюються.
Потокове попереднє відображення
Mattermost передає thinking, активність інструментів і частковий текст відповіді в одному чернетковому повідомленні попереднього перегляду, яке фіналізується на місці, коли остаточну відповідь безпечно надсилати. Попередній перегляд оновлюється в межах того самого id повідомлення, замість того щоб засмічувати канал повідомленнями на кожен фрагмент. Остаточні повідомлення з медіа/помилками скасовують відкладені редагування попереднього перегляду й використовують звичайну доставку замість публікації одноразового повідомлення попереднього перегляду. Увімкніть черезchannels.mattermost.streaming:
partial— звичний вибір: одне повідомлення попереднього перегляду, яке редагується в міру зростання відповіді, а потім фіналізується повною відповіддю.blockвикористовує чернеткові фрагменти у стилі додавання в межах повідомлення попереднього перегляду.progressпоказує статусне попереднє повідомлення під час генерації й публікує остаточну відповідь лише після завершення.offвимикає потокове попереднє відображення.- Якщо потік неможливо фіналізувати на місці (наприклад, якщо повідомлення було видалено посеред потоку), OpenClaw повертається до надсилання нового остаточного повідомлення, щоб відповідь ніколи не була втрачена.
- Див. Streaming для матриці відповідності каналів.
Реакції (інструмент message)
- Використовуйте
message action=reactзchannel=mattermost. messageId— це id повідомлення Mattermost.emojiприймає назви на кшталтthumbsupабо:+1:(двокрапки необов’язкові).- Установіть
remove=true(boolean), щоб видалити реакцію. - Події додавання/видалення реакцій пересилаються як системні події до сесії агента за маршрутом.
channels.mattermost.actions.reactions: увімкнення/вимкнення дій із реакціями (типово true).- Перевизначення для окремого облікового запису:
channels.mattermost.accounts.<id>.actions.reactions.
Інтерактивні кнопки (інструмент message)
Надсилайте повідомлення з кнопками, на які можна натискати. Коли користувач натискає кнопку, агент отримує вибір і може відповісти. Увімкніть кнопки, додавшиinlineButtons до можливостей каналу:
message action=send із параметром buttons. Кнопки — це двовимірний масив (ряди кнопок):
text(обов’язково): мітка для відображення.callback_data(обов’язково): значення, яке надсилається назад при натисканні (використовується як ID дії).style(необов’язково):"default","primary"або"danger".
- Усі кнопки замінюються рядком підтвердження (наприклад, ”✓ Yes selected by @user”).
- Агент отримує вибір як вхідне повідомлення й відповідає.
- Callback-и кнопок використовують перевірку HMAC-SHA256 (автоматично, конфігурація не потрібна).
- Mattermost прибирає callback data зі своїх відповідей API (функція безпеки), тому всі кнопки видаляються після натискання — часткове видалення неможливе.
- ID дій, що містять дефіси або підкреслення, автоматично санітизуються (обмеження маршрутизації Mattermost).
channels.mattermost.capabilities: масив рядків можливостей. Додайте"inlineButtons", щоб увімкнути опис інструмента кнопок у системному prompt агента.channels.mattermost.interactions.callbackBaseUrl: необов’язкова зовнішня базова URL-адреса для callback-ів кнопок (наприклад,https://gateway.example.com). Використовуйте це, коли Mattermost не може напряму дістатися до Gateway за його bind host.- У багатoоблікових конфігураціях те саме поле також можна вказати в
channels.mattermost.accounts.<id>.interactions.callbackBaseUrl. - Якщо
interactions.callbackBaseUrlне вказано, OpenClaw формує callback URL на основіgateway.customBindHost+gateway.port, а потім повертається доhttp://localhost:<port>. - Правило доступності: URL callback-ів кнопок має бути доступним із сервера Mattermost.
localhostпрацює лише тоді, коли Mattermost і OpenClaw працюють на одному host/namespace мережі. - Якщо ваша ціль callback-а є private/tailnet/internal, додайте її host/domain до Mattermost
ServiceSettings.AllowedUntrustedInternalConnections.
Пряма інтеграція з API (зовнішні скрипти)
Зовнішні скрипти та Webhook-и можуть публікувати кнопки безпосередньо через REST API Mattermost замість використання інструментаmessage агента. За можливості використовуйте buildButtonAttachments() з
розширення; якщо публікуєте сирий JSON, дотримуйтеся таких правил:
Структура payload:
- Attachments мають бути в
props.attachments, а не у верхньорівневомуattachments(інакше їх буде мовчки проігноровано). - Кожна дія потребує
type: "button"— без цього натискання будуть мовчки проковтнуті. - Кожна дія потребує поля
id— Mattermost ігнорує дії без ID. idдії має бути лише буквено-цифровим ([a-zA-Z0-9]). Дефіси та підкреслення ламають серверну маршрутизацію дій у Mattermost (повертається 404). Видаляйте їх перед використанням.context.action_idмає збігатися зidкнопки, щоб у повідомленні підтвердження показувалася назва кнопки (наприклад, “Approve”), а не сирий ID.context.action_idє обов’язковим — без нього обробник взаємодій повертає 400.
- Виведіть секрет із токена бота:
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken) - Побудуйте об’єкт context з усіма полями крім
_token. - Серіалізуйте його з відсортованими ключами і без пробілів (Gateway використовує
JSON.stringifyз відсортованими ключами, що дає компактний вивід). - Підпишіть:
HMAC-SHA256(key=secret, data=serializedContext) - Додайте отриманий hex-digest як
_tokenу context.
json.dumpsу Python типово додає пробіли ({"key": "val"}). Використовуйтеseparators=(",", ":"), щоб відповідати компактному виводу JavaScript ({"key":"val"}).- Завжди підписуйте всі поля context (без
_token). Gateway прибирає_token, а потім підписує все, що залишилося. Підписування підмножини спричиняє мовчазний збій перевірки. - Використовуйте
sort_keys=True— Gateway сортує ключі перед підписуванням, а Mattermost може змінювати порядок полів context під час збереження payload. - Виводьте секрет із токена бота (детерміновано), а не з випадкових байтів. Секрет має бути однаковим у процесі, що створює кнопки, і в Gateway, який їх перевіряє.
Адаптер каталогу
Plugin Mattermost містить адаптер каталогу, який визначає назви каналів і користувачів через API Mattermost. Це дає змогу використовувати цілі#channel-name і @username у
openclaw message send та доставках cron/Webhook.
Конфігурація не потрібна — адаптер використовує токен бота з конфігурації облікового запису.
Кілька облікових записів
Mattermost підтримує кілька облікових записів уchannels.mattermost.accounts:
Усунення несправностей
- Немає відповідей у каналах: переконайтеся, що бот є в каналі, і згадайте його (oncall), використайте префікс-тригер (onchar) або встановіть
chatmode: "onmessage". - Помилки автентифікації: перевірте токен бота, базову URL-адресу та чи ввімкнено обліковий запис.
- Проблеми з кількома обліковими записами: змінні середовища застосовуються лише до облікового запису
default. - Власні slash-команди повертають
Unauthorized: invalid command token.: OpenClaw не прийняв callback token. Типові причини:- реєстрація slash-команд не вдалася або була завершена лише частково під час запуску
- callback надходить до неправильного Gateway/облікового запису
- Mattermost досі має старі команди, що вказують на попередню ціль callback-а
- Gateway перезапустився без повторної активації slash-команд
- Якщо власні slash-команди перестали працювати, перевірте логи на наявність
mattermost: failed to register slash commandsабоmattermost: native slash commands enabled but no commands could be registered. - Якщо
callbackUrlне вказано і в логах є попередження, що callback визначився якhttp://127.0.0.1:18789/..., ця URL-адреса, ймовірно, доступна лише тоді, коли Mattermost працює на тому самому host/namespace мережі, що й OpenClaw. Установіть явний зовнішньо доступнийcommands.callbackUrl. - Кнопки відображаються як білі прямокутники: агент може надсилати некоректні дані кнопок. Переконайтеся, що кожна кнопка має поля
textіcallback_data. - Кнопки відображаються, але натискання нічого не робить: перевірте, що
AllowedUntrustedInternalConnectionsу конфігурації сервера Mattermost містить127.0.0.1 localhost, аEnablePostActionIntegrationу ServiceSettings має значенняtrue. - Кнопки повертають 404 при натисканні:
idкнопки, імовірно, містить дефіси або підкреслення. Маршрутизатор дій Mattermost ламається на небуквено-цифрових ID. Використовуйте лише[a-zA-Z0-9]. - У логах Gateway є
invalid _token: невідповідність HMAC. Переконайтеся, що ви підписуєте всі поля context (а не підмножину), використовуєте відсортовані ключі та компактний JSON (без пробілів). Див. розділ HMAC вище. - У логах Gateway є
missing _token in context: поле_tokenвідсутнє в context кнопки. Переконайтеся, що його включено під час побудови payload інтеграції. - У підтвердженні показується сирий ID замість назви кнопки:
context.action_idне збігається зidкнопки. Установіть для обох однакове санітизоване значення. - Агент не знає про кнопки: додайте
capabilities: ["inlineButtons"]до конфігурації каналу Mattermost.
Пов’язане
- Channels Overview — усі підтримувані канали
- Pairing — автентифікація приватних повідомлень і потік pairing
- Groups — поведінка групового чату та вимога згадки
- Channel Routing — маршрутизація сесій для повідомлень
- Security — модель доступу та посилення захисту