Mattermost
Статус: вбудований плагін (токен бота + події WebSocket). Підтримуються канали, групи та DM. Mattermost — це self-hosted платформа командного обміну повідомленнями; відомості про продукт і завантаження див. на офіційному сайті mattermost.com.Вбудований плагін
Mattermost постачається як вбудований плагін у поточних релізах OpenClaw, тому звичайні зібрані збірки не потребують окремого встановлення. Якщо ви використовуєте старішу збірку або спеціальне встановлення без Mattermost, встановіть його вручну: Встановлення через CLI (реєстр npm):Швидке налаштування
- Переконайтеся, що плагін Mattermost доступний.
- Поточні зібрані релізи OpenClaw уже містять його в комплекті.
- У старіших/спеціальних інсталяціях його можна додати вручну наведеними вище командами.
- Створіть обліковий запис бота Mattermost і скопіюйте токен бота.
- Скопіюйте базову URL-адресу Mattermost (наприклад,
https://chat.example.com). - Налаштуйте OpenClaw і запустіть gateway.
Власні slash-команди
Власні slash-команди вмикаються лише за бажанням. Коли їх увімкнено, OpenClaw реєструє slash-командиoc_* через
Mattermost API і отримує callback POST-запити на HTTP-сервер gateway.
native: "auto"типово вимкнено для Mattermost. Задайтеnative: true, щоб увімкнути.- Якщо
callbackUrlне вказано, OpenClaw виводить його з host/port gateway +callbackPath. - Для конфігурацій із кількома обліковими записами
commandsможна задати на верхньому рівні або вchannels.mattermost.accounts.<id>.commands(значення облікового запису перевизначають поля верхнього рівня). - Callback-и команд перевіряються за допомогою токенів для кожної команди, які
Mattermost повертає, коли OpenClaw реєструє команди
oc_*. - Callback-и slash-команд працюють у режимі fail closed, якщо реєстрація не вдалася, запуск був частковим або токен callback-а не збігається з жодною із зареєстрованих команд.
- Вимога до доступності: кінцева точка callback має бути доступною із сервера Mattermost.
- Не задавайте
callbackUrlякlocalhost, якщо Mattermost не працює на тому самому хості/у тому самому просторі мережевих імен, що й OpenClaw. - Не задавайте
callbackUrlяк базову URL-адресу Mattermost, якщо ця адреса не проксіює/api/channels/mattermost/commandдо OpenClaw у зворотному напрямку. - Швидка перевірка:
curl https://<gateway-host>/api/channels/mattermost/command; GET має повертати405 Method Not Allowedвід OpenClaw, а не404.
- Не задавайте
- Вимога до allowlist вихідних з’єднань Mattermost:
- Якщо ваш callback спрямовано на приватні/tailnet/внутрішні адреси, налаштуйте
ServiceSettings.AllowedUntrustedInternalConnectionsу Mattermost так, щоб він містив host/domain callback-а. - Використовуйте записи host/domain, а не повні URL.
- Правильно:
gateway.tailnet-name.ts.net - Неправильно:
https://gateway.tailnet-name.ts.net
- Правильно:
- Якщо ваш callback спрямовано на приватні/tailnet/внутрішні адреси, налаштуйте
Змінні середовища (типовий обліковий запис)
Задайте їх на хості gateway, якщо ви надаєте перевагу змінним середовища:MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
default). Інші облікові записи мають використовувати значення з конфігурації.
Режими чату
Mattermost автоматично відповідає на DM. Поведінка в каналах керуєтьсяchatmode:
oncall(типово): відповідати в каналах лише за @-згадки.onmessage: відповідати на кожне повідомлення в каналі.onchar: відповідати, коли повідомлення починається з префікса-тригера.
oncharусе ще відповідає на явні @-згадки.channels.mattermost.requireMentionвраховується для застарілих конфігурацій, але перевага надаєтьсяchatmode.
Треди та сесії
Використовуйтеchannels.mattermost.replyToMode, щоб керувати тим, чи відповіді в каналах і групах лишатимуться в
основному каналі, чи запускатимуть тред під повідомленням-тригером.
off(типово): відповідати в треді лише тоді, коли вхідний допис уже в ньому.first: для повідомлень верхнього рівня в каналі/групі запускати тред під цим дописом і маршрутизувати розмову до сесії, прив’язаної до треду.all: наразі в Mattermost поводиться так само, якfirst.- Особисті повідомлення ігнорують це налаштування й залишаються поза тредами.
- Сесії, прив’язані до треду, використовують id повідомлення-тригера як корінь треду.
firstіallнаразі еквівалентні, оскільки щойно Mattermost має корінь треду, подальші фрагменти й медіа продовжують іти в тому самому треді.
Керування доступом (DM)
- Типово:
channels.mattermost.dmPolicy = "pairing"(невідомі відправники отримують код pairing). - Підтвердження через:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- Публічні DM:
channels.mattermost.dmPolicy="open"плюсchannels.mattermost.allowFrom=["*"].
Канали (групи)
- Типово:
channels.mattermost.groupPolicy = "allowlist"(із gating за згадкою). - Додавайте відправників до allowlist через
channels.mattermost.groupAllowFrom(рекомендовано ідентифікатори користувачів). - Перевизначення згадок для окремих каналів містяться в
channels.mattermost.groups.<channelId>.requireMentionабо вchannels.mattermost.groups["*"].requireMentionяк типове значення. - Зіставлення
@usernameє змінним і вмикається лише тоді, колиchannels.mattermost.dangerouslyAllowNameMatching: true. - Відкриті канали:
channels.mattermost.groupPolicy="open"(із gating за згадкою). - Примітка щодо runtime: якщо
channels.mattermostповністю відсутній, runtime резервно використовуєgroupPolicy="allowlist"для перевірок груп (навіть якщо заданоchannels.defaults.groupPolicy).
Цілі для вихідної доставки
Використовуйте ці формати цілей зopenclaw message send або cron/webhooks:
channel:<id>для каналуuser:<id>для DM@usernameдля DM (визначається через Mattermost API)
64ifufp...) у Mattermost неоднозначні (ID користувача чи ID каналу).
OpenClaw визначає їх за правилом спочатку користувач:
- Якщо ID існує як користувач (
GET /api/v4/users/<id>виконується успішно), OpenClaw надсилає DM, визначаючи direct-канал через/api/v4/channels/direct. - Інакше ID вважається ID каналу.
user:<id> / channel:<id>).
Повторні спроби для DM-каналу
Коли OpenClaw надсилає до цілі DM у Mattermost і спершу має визначити direct-канал, він типово повторює спроби в разі тимчасових збоїв створення direct-каналу. Використовуйтеchannels.mattermost.dmChannelRetry, щоб налаштувати цю поведінку глобально для плагіна Mattermost,
або channels.mattermost.accounts.<id>.dmChannelRetry для одного облікового запису.
- Це застосовується лише до створення DM-каналу (
/api/v4/channels/direct), а не до кожного виклику Mattermost API. - Повторні спроби застосовуються до тимчасових збоїв, як-от ліміти частоти, відповіді 5xx, а також помилки мережі чи тайм-аута.
- Помилки клієнта 4xx, окрім
429, вважаються постійними й повторно не виконуються.
Реакції (інструмент message)
- Використовуйте
message action=reactізchannel=mattermost. messageId— це id допису Mattermost.emojiприймає назви на кшталтthumbsupабо:+1:(двокрапки необов’язкові).- Задайте
remove=true(булеве значення), щоб прибрати реакцію. - Події додавання/видалення реакцій пересилаються як системні події до сесії агента, визначеної маршрутизацією.
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", щоб увімкнути опис інструмента кнопок у системному промпті агента.channels.mattermost.interactions.callbackBaseUrl: необов’язкова зовнішня базова URL-адреса для callback-ів кнопок (наприкладhttps://gateway.example.com). Використовуйте це, коли Mattermost не може напряму дістатися до gateway за його bind host.- У конфігураціях із кількома обліковими записами це саме поле також можна задавати в
channels.mattermost.accounts.<id>.interactions.callbackBaseUrl. - Якщо
interactions.callbackBaseUrlне вказано, OpenClaw виводить URL callback-а зgateway.customBindHost+gateway.port, а потім резервно використовуєhttp://localhost:<port>. - Правило доступності: URL callback-а кнопки має бути доступним із сервера Mattermost.
localhostпрацює лише тоді, коли Mattermost і OpenClaw працюють на тому самому хості/у тому самому просторі мережевих імен. - Якщо ціль callback-а є приватною/tailnet/внутрішньою, додайте її host/domain до
ServiceSettings.AllowedUntrustedInternalConnectionsу Mattermost.
Пряма інтеграція з API (зовнішні скрипти)
Зовнішні скрипти та вебхуки можуть публікувати кнопки безпосередньо через Mattermost REST API, а не через інструментmessage агента. Використовуйте buildButtonAttachments() із
розширення, коли це можливо; якщо надсилаєте сирий JSON, дотримуйтеся таких правил:
Структура payload:
- Attachments розміщуються в
props.attachments, а не в top-levelattachments(інакше вони тихо ігноруються). - Кожна дія повинна мати
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) - Побудуйте об’єкт контексту з усіма полями крім
_token. - Серіалізуйте з відсортованими ключами і без пробілів (gateway використовує
JSON.stringifyіз відсортованими ключами, що дає компактний вивід). - Підпишіть:
HMAC-SHA256(key=secret, data=serializedContext) - Додайте отриманий hex-digest як
_tokenу контекст.
json.dumpsу Python типово додає пробіли ({"key": "val"}). Використовуйтеseparators=(",", ":"), щоб відповідати компактному виводу JavaScript ({"key":"val"}).- Завжди підписуйте всі поля контексту (крім
_token). Gateway прибирає_token, а потім підписує все, що залишилося. Підпис лише підмножини полів спричиняє тихий збій перевірки. - Використовуйте
sort_keys=True— gateway сортує ключі перед підписуванням, а Mattermost може змінювати порядок полів контексту під час збереження payload. - Виводьте секрет із токена бота (детерміновано), а не з випадкових байтів. Секрет має бути однаковим і для процесу, що створює кнопки, і для gateway, який їх перевіряє.
Адаптер каталогу
Плагін Mattermost містить адаптер каталогу, який визначає назви каналів і користувачів через Mattermost API. Це дає змогу використовувати цілі#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-а. Типові причини:- реєстрація 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/..., ця адреса, імовірно, доступна лише тоді, коли Mattermost працює на тому самому хості/у тому самому просторі мережевих імен, що й OpenClaw. Натомість задайте явний зовнішньо доступнийcommands.callbackUrl. - Кнопки відображаються як білі прямокутники: агент може надсилати некоректні дані кнопок. Переконайтеся, що кожна кнопка має поля
textіcallback_data. - Кнопки відображаються, але натискання нічого не робить: перевірте, що
AllowedUntrustedInternalConnectionsу конфігурації сервера Mattermost містить127.0.0.1 localhost, аEnablePostActionIntegrationмає значенняtrueу ServiceSettings. - Під час натискання кнопки повертається 404: імовірно,
idкнопки містить дефіси або символи підкреслення. Маршрутизатор дій Mattermost ламається на небуквено-цифрових ID. Використовуйте лише[a-zA-Z0-9]. - У журналах gateway є
invalid _token: невідповідність HMAC. Перевірте, що ви підписуєте всі поля контексту (а не лише підмножину), використовуєте відсортовані ключі й компактний JSON (без пробілів). Див. розділ HMAC вище. - У журналах gateway є
missing _token in context: поле_tokenвідсутнє в контексті кнопки. Переконайтеся, що воно включене під час побудови payload інтеграції. - У підтвердженні показується сирий ID замість назви кнопки:
context.action_idне збігається зidкнопки. Задайте однакове санітизоване значення для обох. - Агент не знає про кнопки: додайте
capabilities: ["inlineButtons"]до конфігурації каналу Mattermost.
Пов’язане
- Огляд каналів — усі підтримувані канали
- Pairing — автентифікація DM і потік pairing
- Групи — поведінка групових чатів і gating за згадкою
- Маршрутизація каналів — маршрутизація сесій для повідомлень
- Безпека — модель доступу та посилення захисту