Developer and self-hosted

Mattermost

Статус: завантажуваний plugin (токен бота + події WebSocket). Підтримуються канали, приватні канали, групові приватні повідомлення та приватні повідомлення. Mattermost — це платформа для командного обміну повідомленнями, яку можна розгорнути самостійно (mattermost.com).

Встановлення

Реєстр npm

bash
openclaw plugins install @openclaw/mattermost

Локальна робоча копія

bash
openclaw plugins install ./path/to/local/mattermost-plugin

Докладніше: Plugins

Швидке налаштування

  • Переконайтеся, що plugin доступний

    Установіть @openclaw/mattermost за допомогою наведеної вище команди, а потім перезапустіть Gateway, якщо він уже працює.

  • Створіть бота Mattermost

    Створіть обліковий запис бота Mattermost, скопіюйте токен бота та додайте бота до команд і каналів, які він має читати.

  • Скопіюйте базову URL-адресу

    Скопіюйте базову URL-адресу Mattermost (наприклад, https://chat.example.com). Кінцевий суфікс /api/v4 видаляється автоматично.

  • Налаштуйте OpenClaw і запустіть Gateway

    Мінімальна конфігурація:

    json5
    {  channels: {    mattermost: {      enabled: true,      botToken: "mm-token",      baseUrl: "https://chat.example.com",      dmPolicy: "pairing",    },  },}

    Неінтерактивний варіант:

    bash
    openclaw channels add --channel mattermost --bot-token <token> --http-url https://chat.example.com
  • Вбудовані команди з косою рискою

    Вбудовані команди з косою рискою потрібно вмикати явно. Коли їх увімкнено, OpenClaw реєструє команди oc_* з косою рискою в кожній команді, учасником якої є бот, і отримує зворотні POST-запити на HTTP-сервері Gateway.

    json5
    {  channels: {    mattermost: {      commands: {        native: true,        nativeSkills: true,        callbackPath: "/api/channels/mattermost/command",        // Використовуйте, коли Mattermost не може звернутися до Gateway безпосередньо (зворотний проксі/загальнодоступна URL-адреса).        callbackUrl: "https://gateway.example.com/api/channels/mattermost/command",      },    },  },}

    Зареєстровані команди: /oc_status, /oc_model, /oc_models, /oc_new, /oc_help, /oc_think, /oc_reasoning, /oc_verbose, /oc_queue. Якщо задано nativeSkills: true, команди Skills також реєструються як /oc_<skill>.

    Примітки щодо поведінки
    • Типове значення native і nativeSkills"auto", яке для Mattermost означає вимкнений стан. Явно встановіть для них значення true.
    • Типове значення callbackPath/api/channels/mattermost/command.
    • Якщо callbackUrl не вказано, OpenClaw формує http://<gateway.customBindHost or localhost>:<gateway.port, default 18789><callbackPath>. Для адрес прив’язки з підстановними знаками (0.0.0.0, ::) використовується резервне значення localhost.
    • У конфігураціях із кількома обліковими записами commands можна задати на верхньому рівні або в channels.mattermost.accounts.<id>.commands (значення облікового запису перевизначають поля верхнього рівня).
    • Наявні команди з косою рискою з таким самим тригером, створені іншими інтеграціями, залишаються без змін (під час реєстрації їх пропускають); команди, створені ботом, оновлюються або створюються повторно, коли змінюється URL-адреса зворотного виклику.
    • Зворотні виклики команд перевіряються за окремими для кожної команди токенами, які повертає Mattermost, коли OpenClaw реєструє команди oc_*.
    • Перед прийняттям кожного зворотного виклику OpenClaw оновлює поточну реєстрацію команд Mattermost, тому застарілі токени видалених або повторно створених команд з косою рискою перестають прийматися без перезапуску Gateway.
    • Перевірка зворотного виклику завершується відмовою, якщо API Mattermost не може підтвердити, що команда досі актуальна; невдалі перевірки ненадовго кешуються, паралельні пошуки об’єднуються, а частота запуску нових пошуків обмежується для кожної команди, щоб стримувати навантаження від повторного відтворення запитів.
    • Зворотні виклики команд з косою рискою завершуються відмовою, якщо реєстрація не вдалася, запуск був частковим або токен зворотного виклику не збігається із зареєстрованим токеном визначеної команди (токен, дійсний для однієї команди, не може пройти подальшу перевірку для іншої команди).
    • Прийняті зворотні виклики підтверджуються ефемерною відповіддю «Обробка...», а фактична відповідь надходить як звичайне повідомлення.
    Вимога щодо доступності

    Кінцева точка зворотного виклику має бути доступною із сервера Mattermost.

    • Не встановлюйте для callbackUrl значення localhost, якщо Mattermost не працює на тому самому хості або в тому самому мережевому просторі імен, що й OpenClaw.
    • Не встановлюйте для callbackUrl базову URL-адресу Mattermost, якщо ця адреса не проксіює /api/channels/mattermost/command до OpenClaw через зворотний проксі.
    • Для швидкої перевірки виконайте curl https://<gateway-host>/api/channels/mattermost/command; GET-запит має повернути від OpenClaw 405 Method Not Allowed, а не 404.
    Список дозволених адрес для вихідних з’єднань Mattermost

    Якщо зворотний виклик спрямовано на приватні адреси, адреси tailnet або внутрішні адреси, налаштуйте ServiceSettings.AllowedUntrustedInternalConnections у Mattermost так, щоб параметр містив хост або домен зворотного виклику.

    Використовуйте записи хостів або доменів, а не повні URL-адреси.

    • Правильно: gateway.tailnet-name.ts.net
    • Неправильно: https://gateway.tailnet-name.ts.net

    Змінні середовища (типовий обліковий запис)

    Якщо ви віддаєте перевагу змінним середовища, задайте їх на хості Gateway:

    • MATTERMOST_BOT_TOKEN=...
    • MATTERMOST_URL=https://chat.example.com

    Режими чату

    Mattermost автоматично відповідає на приватні повідомлення. Поведінка в каналах контролюється параметром chatmode:

    oncall (типово)

    Відповідати в каналах лише після згадки через @.

    onmessage

    Відповідати на кожне повідомлення в каналі.

    onchar

    Відповідати, коли повідомлення починається з префікса-тригера.

    Приклад конфігурації:

    json5
    {  channels: {    mattermost: {      chatmode: "onchar",      oncharPrefixes: [">", "!"], // типово    },  },}

    Примітки:

    • У режимі onchar бот також відповідає на явні згадки через @.
    • Параметр channels.mattermost.requireMention усе ще враховується, але рекомендовано використовувати chatmode. Налаштування groups.<channelId>.requireMention для окремого каналу мають вищий пріоритет за обидва.
    • Після того як бот надсилає видиму відповідь у гілці каналу, на наступні повідомлення в тій самій гілці він відповідає без нової згадки через @ або префікса onchar, завдяки чому багатокрокова розмова в гілці триває без переривань. Участь запам’ятовується протягом 7 днів після останньої відповіді бота в цій гілці та зберігається після перезапусків Gateway. Це не впливає на гілки, які бот лише спостерігав; створіть нове повідомлення верхнього рівня, щоб знову вимагати явну згадку.

    Гілки та сеанси

    Використовуйте channels.mattermost.replyToMode, щоб визначити, чи залишатимуться відповіді в каналах і групах в основному каналі, чи створюватимуть гілку під повідомленням-тригером.

    • off (типово): відповідати в гілці, лише якщо вхідне повідомлення вже належить до неї.
    • first: для повідомлень верхнього рівня в каналі або групі створювати гілку під цим повідомленням і спрямовувати розмову до сеансу, пов’язаного з гілкою.
    • all і batched: наразі в Mattermost працюють так само, як first, оскільки після появи кореневого повідомлення гілки наступні частини відповіді та медіафайли надсилаються в ту саму гілку.
    • Для приватних повідомлень типовим залишається значення off, навіть якщо встановлено replyToMode.

    Використовуйте channels.mattermost.replyToModeByChatType, щоб перевизначити режим для чатів типу direct, group або channel. Задайте значення для direct, щоб увімкнути гілки в приватних повідомленнях:

    • off (типово): приватні повідомлення залишаються без гілок в одному безперервному сеансі.
    • first, all або batched: кожне приватне повідомлення верхнього рівня створює гілку Mattermost з новим незалежним сеансом.
    json5
    {  channels: {    mattermost: {      replyToMode: "all",      replyToModeByChatType: {        direct: "first",      },    },  },}

    Примітки:

    • У сеансах, пов’язаних із гілкою, ідентифікатор повідомлення-тригера використовується як корінь гілки.
    • first і all наразі еквівалентні, оскільки після появи кореневого повідомлення гілки Mattermost наступні частини відповіді та медіафайли надсилаються в ту саму гілку.
    • Перевизначення для окремих типів чатів мають вищий пріоритет за replyToMode. Без перевизначення direct наявні розгортання зберігають плоскі приватні повідомлення без гілок.

    Керування доступом (приватні повідомлення)

    • Типове значення: channels.mattermost.dmPolicy = "pairing" (невідомі відправники отримують код сполучення). Інші значення: allowlist, open, disabled.
    • Схвалення:
      • openclaw pairing list mattermost
      • openclaw pairing approve mattermost &lt;CODE&gt;
    • Загальнодоступні приватні повідомлення: channels.mattermost.dmPolicy="open" разом із channels.mattermost.allowFrom=["*"] (схема конфігурації вимагає підстановний знак).
    • channels.mattermost.allowFrom приймає ідентифікатори користувачів (рекомендовано) та записи accessGroup:<name>. Див. Групи доступу.

    Канали (групи)

    • Типове значення: channels.mattermost.groupPolicy = "allowlist" (потрібна згадка).
    • Додайте відправників до списку дозволених за допомогою channels.mattermost.groupAllowFrom (рекомендовано використовувати ідентифікатори користувачів).
    • channels.mattermost.groupAllowFrom приймає записи accessGroup:<name>. Див. Групи доступу.
    • Перевизначення вимоги згадки для окремих каналів задаються в channels.mattermost.groups.<channelId>.requireMention, а типове значення — у channels.mattermost.groups["*"].requireMention.
    • Зіставлення за @username є змінним і вмикається лише за умови channels.mattermost.dangerouslyAllowNameMatching: true.
    • Відкриті канали: channels.mattermost.groupPolicy="open" (потрібна згадка).
    • Порядок визначення: channels.mattermost.groupPolicy, потім channels.defaults.groupPolicy, потім "allowlist".
    • Примітка щодо середовища виконання: якщо розділ channels.mattermost повністю відсутній, під час перевірок груп середовище виконання завершує перевірку відмовою з groupPolicy="allowlist" (навіть якщо встановлено channels.defaults.groupPolicy) і одноразово записує попередження до журналу.

    Приклад:

    json5
    {  channels: {    mattermost: {      groupPolicy: "open",      groups: {        "*": { requireMention: true },        "team-channel-id": { requireMention: false },      },    },  },}

    Цілі вихідної доставки

    Використовуйте ці формати цілей із openclaw message send або Cron/Webhook:

    Ціль Куди доставляється
    channel:<id> Канал за ідентифікатором
    channel:<name> або #channel-name Канал за назвою; пошук виконується в усіх командах, до яких належить бот
    user:<id> або mattermost:<id> Приватне повідомлення цьому користувачу
    @username Приватне повідомлення (ім’я користувача визначається через API Mattermost)

    Вихідні повідомлення підтримують не більше одного вкладення на повідомлення; надсилайте кілька файлів окремими повідомленнями.

    Повторні спроби для каналу приватних повідомлень

    Коли OpenClaw надсилає повідомлення до цілі приватного повідомлення Mattermost і спочатку має визначити прямий канал, він типово повторює спроби після тимчасових помилок створення прямого каналу.

    Використовуйте channels.mattermost.dmChannelRetry, щоб налаштувати цю поведінку глобально для plugin Mattermost, або channels.mattermost.accounts.<id>.dmChannelRetry для окремого облікового запису. Типові значення:

    json5
    {  channels: {    mattermost: {      dmChannelRetry: {        maxRetries: 3,        initialDelayMs: 1000,        maxDelayMs: 10000,        timeoutMs: 30000,      },    },  },}

    Примітки:

    • Це стосується лише створення каналу особистих повідомлень (/api/v4/channels/direct), а не кожного виклику API Mattermost.
    • Повторні спроби використовують експоненційне збільшення затримки з джитером і застосовуються до тимчасових збоїв, як-от перевищення лімітів частоти запитів, відповіді 5xx, а також помилки мережі чи перевищення часу очікування.
    • Помилки клієнта 4xx, крім 429, вважаються постійними й не спричиняють повторних спроб.

    Потокове попереднє відображення

    Mattermost потоково передає процес міркування, активність інструментів і частковий текст відповіді в чернетку допису попереднього перегляду, яка остаточно оновлюється на місці, коли фінальну відповідь можна безпечно надіслати. У режимі partial попередній перегляд оновлюється в дописі з тим самим ідентифікатором замість засмічення каналу повідомленнями для кожного фрагмента. У режимі block попередній перегляд перемикається між завершеним текстом і блоками активності інструментів, тому попередні блоки залишаються видимими як окремі дописи замість перезапису наступним блоком. Фінальні відповіді з медіафайлами або помилками скасовують очікувані зміни попереднього перегляду й використовують звичайне доставлення замість публікації непотрібного допису попереднього перегляду.

    Потокове попереднє відображення увімкнено за замовчуванням у режимі partial. Налаштуйте його через channels.mattermost.streaming (рядок режиму, логічне значення або об’єкт на кшталт { mode: "progress" }):

    json5
    {  channels: {    mattermost: {      streaming: "partial", // off | partial | block | progress    },  },}
    Режими потокового передавання
    • partial (за замовчуванням): один допис попереднього перегляду, який редагується зі зростанням відповіді, а потім завершується повною відповіддю.
    • block перемикає попередній перегляд між завершеним текстом і блоками активності інструментів, тому кожен блок залишається видимим як окремий допис замість перезапису на місці. Паралельні та послідовні оновлення інструментів використовують спільний поточний допис активності інструментів.
    • progress показує попередній перегляд стану під час генерування та публікує фінальну відповідь лише після завершення.
    • off вимикає потокове попереднє відображення. Якщо blockStreaming: true, завершені блоки асистента все одно доставляються як звичайні блокові відповіді (окремі дописи), а не як один об’єднаний фінальний допис.
    Примітки щодо поведінки потокового передавання
    • Якщо потік неможливо завершити на місці (наприклад, допис видалили під час потокового передавання), OpenClaw натомість надсилає новий фінальний допис, щоб відповідь не була втрачена.
    • Дані, що містять лише міркування, не публікуються в каналі, зокрема текст, який надходить як цитата > Thinking. Установіть /reasoning on, щоб бачити міркування в інших інтерфейсах; фінальний допис Mattermost містить лише відповідь.
    • Матрицю зіставлення каналів див. у розділі Потокове передавання.

    Реакції (інструмент повідомлень)

    • Використовуйте message action=react із channel=mattermost.
    • messageId — це ідентифікатор допису Mattermost.
    • emoji приймає назви на кшталт thumbsup або :+1: (двокрапки необов’язкові).
    • Установіть remove=true (логічне значення), щоб видалити реакцію.
    • Події додавання та видалення реакцій пересилаються як системні події до спрямованого сеансу агента з урахуванням тих самих перевірок політик особистих повідомлень і груп, що й для повідомлень.

    Приклади:

    text
    message action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsupmessage action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsup remove=true

    Конфігурація:

    • channels.mattermost.actions.reactions: увімкнути або вимкнути дії з реакціями (за замовчуванням true).
    • Перевизначення для окремого облікового запису: channels.mattermost.accounts.<id>.actions.reactions.

    Інтерактивні кнопки (інструмент повідомлень)

    Надсилайте повідомлення з кнопками, які можна натискати. Коли користувач натискає кнопку, агент отримує вибір і може відповісти.

    Кнопки надходять із семантичних даних presentation (у звичайних відповідях агента та в message action=send). OpenClaw відображає кнопки зі значеннями як інтерактивні кнопки Mattermost, залишає кнопки з URL видимими в тексті повідомлення та перетворює меню вибору на читабельний текст.

    text
    message action=send channel=mattermost target=channel:<channelId> presentation={"blocks":[{"type":"buttons","buttons":[{"label":"Yes","value":"yes"},{"label":"No","value":"no"}]}]}

    Поля кнопки презентації:

    labelstringrequired

    Відображувана мітка (псевдонім: text).

    valuestring

    Значення, яке надсилається після натискання та використовується як ідентифікатор дії (псевдоніми: callback_data, callbackData). Обов’язкове для кнопки, яку можна натискати, якщо не встановлено url.

    urlstring

    Кнопка-посилання; відображається в тілі повідомлення як текст label: url замість інтерактивної кнопки.

    style"primary" | "secondary" | "success" | "danger"

    Стиль кнопки. Mattermost застосовує стандартне оформлення до значень, які він не підтримує.

    Щоб оголосити підтримку кнопок у системному запиті агента, додайте inlineButtons до можливостей каналу:

    json5
    {  channels: {    mattermost: {      capabilities: ["inlineButtons"],    },  },}

    Коли користувач натискає кнопку:

  • Перевірка доступу

    Користувач, який натиснув кнопку, має пройти ті самі перевірки політик особистих повідомлень і груп, що й відправник повідомлення; у разі неавторизованого натискання відображається тимчасове сповіщення, а натискання ігнорується.

  • Заміна кнопок підтвердженням

    Усі кнопки замінюються рядком підтвердження (наприклад, «✓ Yes вибрано користувачем @user»).

  • Агент отримує вибір

    Агент отримує вибір як вхідне повідомлення (разом із системною подією) і відповідає.

  • Примітки щодо реалізації
    • Зворотні виклики кнопок використовують перевірку HMAC-SHA256 (автоматично, налаштування не потрібне).
    • Після натискання замінюється весь блок вкладення, тому всі кнопки видаляються разом — часткове видалення неможливе.
    • Ідентифікатори дій, що містять дефіси або символи підкреслення, автоматично очищаються (обмеження маршрутизації Mattermost).
    • Натискання, у яких action_id не відповідає дії в початковому дописі, відхиляються з кодом 403 («Unknown action»).
    Конфігурація та доступність
    • channels.mattermost.capabilities: масив рядків можливостей. Додайте "inlineButtons", щоб увімкнути опис інструмента кнопок у системному запиті агента.
    • channels.mattermost.interactions.callbackBaseUrl: необов’язкова зовнішня базова URL-адреса для зворотних викликів кнопок (наприклад, https://gateway.example.com). Використовуйте її, коли Mattermost не може безпосередньо звернутися до Gateway за його адресою прив’язки.
    • У конфігураціях із кількома обліковими записами те саме поле також можна встановити в channels.mattermost.accounts.<id>.interactions.callbackBaseUrl.
    • Якщо interactions.callbackBaseUrl не вказано, OpenClaw формує URL-адресу зворотного виклику з gateway.customBindHost + gateway.port (за замовчуванням 18789), а потім використовує резервну адресу http://localhost:<port>. Шлях зворотного виклику: /mattermost/interactions/<accountId>.
    • Правило доступності: URL-адреса зворотного виклику кнопки має бути доступна із сервера Mattermost. localhost працює лише тоді, коли Mattermost і OpenClaw запущені на одному хості або в одному просторі імен мережі.
    • channels.mattermost.interactions.allowedSourceIps: список дозволених IP-адрес джерел для зворотних викликів кнопок. Без нього приймаються лише джерела local loopback (127.0.0.1, ::1), тому віддалений сервер Mattermost потрібно додати до цього списку, інакше його натискання відхилятимуться з кодом 403. Якщо використовується зворотний проксі, також установіть gateway.trustedProxies, щоб справжня IP-адреса клієнта визначалася з пересланих заголовків.
    • Якщо ціль зворотного виклику приватна, належить до tailnet або є внутрішньою, додайте її хост чи домен до ServiceSettings.AllowedUntrustedInternalConnections у Mattermost.

    Пряма інтеграція з API (зовнішні скрипти)

    Зовнішні скрипти та Webhook можуть публікувати кнопки безпосередньо через REST API Mattermost замість використання інструмента агента message. За можливості використовуйте buildButtonAttachments() із Plugin; якщо публікуєте необроблений JSON, дотримуйтеся таких правил:

    Структура даних:

    json5
    {  channel_id: "<channelId>",  message: "Choose an option:",  props: {    attachments: [      {        actions: [          {            id: "mybutton01", // alphanumeric only - see below            type: "button", // required, or clicks are silently ignored            name: "Approve", // display label            style: "primary", // optional: "default", "primary", "danger"            integration: {              url: "https://gateway.example.com/mattermost/interactions/default",              context: {                action_id: "mybutton01", // must match button id                action: "approve",                // ... any custom fields ...                _token: "<hmac>", // see HMAC section below              },            },          },        ],      },    ],  },}

    Генерування токена HMAC

    Gateway перевіряє натискання кнопок за допомогою HMAC-SHA256. Зовнішні скрипти мають генерувати токени, які відповідають логіці перевірки Gateway:

  • Отримайте секрет із токена бота

    HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken), закодований у шістнадцятковому форматі.

  • Створіть об’єкт контексту

    Створіть об’єкт контексту з усіма полями, крім _token.

  • Серіалізуйте з відсортованими ключами

    Серіалізуйте з рекурсивно відсортованими ключами та без пробілів (Gateway також канонізує вкладені об’єкти й створює компактний JSON).

  • Підпишіть дані

    HMAC-SHA256(key=secret, data=serializedContext)

  • Додайте токен

    Додайте отриманий шістнадцятковий дайджест як _token до контексту.

  • Приклад на Python:

    python
     secret = hmac.new(    b"openclaw-mattermost-interactions",    bot_token.encode(), hashlib.sha256).hexdigest() ctx = {"action_id": "mybutton01", "action": "approve"}payload = json.dumps(ctx, sort_keys=True, separators=(",", ":"))token = hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest() context = {**ctx, "_token": token}
    Поширені помилки HMAC
    • json.dumps у Python за замовчуванням додає пробіли ({"key": "val"}). Використовуйте separators=(",", ":"), щоб результат відповідав компактному виводу JavaScript ({"key":"val"}).
    • Завжди підписуйте всі поля контексту (крім _token). Gateway видаляє _token, а потім підписує все, що залишилося. Підписування лише частини полів призводить до непомітної помилки перевірки.
    • Використовуйте sort_keys=True — Gateway сортує ключі перед підписуванням, а Mattermost може змінити порядок полів контексту під час зберігання даних.
    • Отримуйте секрет із токена бота (детерміновано), а не з випадкових байтів. Секрет має бути однаковим у процесі, що створює кнопки, і в Gateway, який виконує перевірку.

    Адаптер каталогу

    Plugin Mattermost містить адаптер каталогу, який визначає назви каналів і користувачів через API Mattermost. Це дає змогу використовувати цілі #channel-name і @username у openclaw message send, а також у доставленнях Cron і Webhook.

    Налаштування не потрібне — адаптер використовує токен бота з конфігурації облікового запису.

    Кілька облікових записів

    Mattermost підтримує кілька облікових записів у channels.mattermost.accounts:

    json5
    {  channels: {    mattermost: {      accounts: {        default: { name: "Основний", botToken: "mm-token", baseUrl: "https://chat.example.com" },        alerts: { name: "Сповіщення", botToken: "mm-token-2", baseUrl: "https://alerts.example.com" },      },    },  },}

    Значення облікового запису перевизначають поля верхнього рівня; channels.mattermost.defaultAccount визначає, який обліковий запис використовується, якщо його не вказано.

    Усунення несправностей

    Немає відповідей у каналах

    Переконайтеся, що бот перебуває в каналі, і згадайте його (oncall), використайте префікс-тригер (onchar) або встановіть chatmode: "onmessage".

    Помилки автентифікації або кількох облікових записів
    • Перевірте токен бота, базову URL-адресу та чи ввімкнено обліковий запис.
    • Проблеми з кількома обліковими записами: змінні середовища застосовуються лише до облікового запису default.
    • Для приватних/LAN-хостів Mattermost потрібен параметр network.dangerouslyAllowPrivateNetwork: true (захист від SSRF типово блокує приватні IP-адреси).
    Вбудовані слеш-команди не працюють
    • Unauthorized: invalid command token.: OpenClaw не прийняв токен зворотного виклику. Типові причини:
      • реєстрація слеш-команд завершилася помилкою або була виконана лише частково під час запуску
      • зворотний виклик надходить до неправильного Gateway або облікового запису
      • у Mattermost досі є старі команди, що вказують на попередню ціль зворотного виклику
      • Gateway перезапустився без повторної активації слеш-команд
    • Якщо вбудовані слеш-команди припинили працювати, перевірте журнали на наявність mattermost: failed to register slash commands або mattermost: native slash commands enabled but no commands could be registered.
    • Якщо callbackUrl не вказано, а журнали попереджають, що адреса зворотного виклику визначилася як URL-адреса loopback на кшталт http://localhost:18789/..., імовірно, ця адреса доступна лише тоді, коли Mattermost працює на тому самому хості або в тому самому мережевому просторі імен, що й OpenClaw. Натомість явно задайте зовнішньо доступну адресу commands.callbackUrl.
    Проблеми з кнопками
    • Кнопки відображаються як білі прямокутники або не відображаються взагалі: дані кнопок мають неправильний формат. Для кожної презентаційної кнопки потрібні label і value (кнопки, у яких відсутнє будь-яке з цих полів, відкидаються).
    • Кнопки відображаються, але натискання нічого не робить: перевірте, чи Gateway доступний із сервера Mattermost, чи IP-адресу сервера Mattermost додано до channels.mattermost.interactions.allowedSourceIps (без цього приймається лише loopback), а також чи містить ServiceSettings.AllowedUntrustedInternalConnections хост зворотного виклику для приватних цілей.
    • Після натискання кнопки повертають 404: імовірно, id кнопки містить дефіси або символи підкреслення. Маршрутизатор дій Mattermost не працює з ідентифікаторами, що містять неалфавітно-цифрові символи. Використовуйте лише [a-zA-Z0-9].
    • У журналах Gateway з'являється rejected callback source: натискання надійшло з IP-адреси, якої немає в interactions.allowedSourceIps. Додайте сервер Mattermost або вашу точку входу до списку дозволених, а при використанні зворотного проксі налаштуйте gateway.trustedProxies.
    • У журналах Gateway з'являється invalid _token: невідповідність HMAC. Перевірте, що ви підписуєте всі поля контексту (а не лише їхню частину), використовуєте відсортовані ключі та компактний JSON (без пробілів). Дивіться розділ про HMAC вище.
    • У журналах Gateway з'являється missing _token in context: поле _token відсутнє в контексті кнопки. Переконайтеся, що воно включене під час формування корисного навантаження інтеграції.
    • Gateway відхиляє натискання з повідомленням Unknown action: context.action_id не відповідає жодному id дії в дописі. Задайте для обох однакове нормалізоване значення.
    • Агент не пропонує кнопки: додайте capabilities: ["inlineButtons"] до конфігурації каналу Mattermost.

    Пов’язані матеріали

    Was this useful?
    On this page

    On this page