Developer and self-hosted
Mattermost
Estado: plugin descargable (token de bot + eventos WebSocket). Se admiten canales, canales privados, MD grupales y MD. Mattermost es una plataforma de mensajería para equipos que se puede alojar en servidores propios (mattermost.com).
Instalación
registro de npm
openclaw plugins install @openclaw/mattermostCopia de trabajo local
openclaw plugins install ./path/to/local/mattermost-pluginDetalles: Plugins
Configuración rápida
Asegurar que el plugin esté disponible
Instale @openclaw/mattermost con el comando anterior y, si el Gateway ya está en ejecución, reinícielo.
Crear un bot de Mattermost
Cree una cuenta de bot de Mattermost, copie el token del bot y añada el bot a los equipos y canales que deba leer.
Copiar la URL base
Copie la URL base de Mattermost (p. ej., https://chat.example.com). El sufijo /api/v4 se elimina automáticamente.
Configurar OpenClaw e iniciar el Gateway
Configuración mínima:
{ channels: { mattermost: { enabled: true, botToken: "mm-token", baseUrl: "https://chat.example.com", dmPolicy: "pairing", }, },}Alternativa no interactiva:
openclaw channels add --channel mattermost --bot-token <token> --http-url https://chat.example.comComandos de barra nativos
Los comandos de barra nativos son opcionales. Cuando se habilitan, OpenClaw registra comandos de barra oc_* en todos los equipos a los que pertenece el bot y recibe solicitudes POST de devolución de llamada en el servidor HTTP del Gateway.
{ channels: { mattermost: { commands: { native: true, nativeSkills: true, callbackPath: "/api/channels/mattermost/command", // Úselo cuando Mattermost no pueda acceder directamente al Gateway (proxy inverso/URL pública). callbackUrl: "https://gateway.example.com/api/channels/mattermost/command", }, }, },}Comandos registrados: /oc_status, /oc_model, /oc_models, /oc_new, /oc_help, /oc_think, /oc_reasoning, /oc_verbose, /oc_queue. Con nativeSkills: true, los comandos de Skills también se registran como /oc_<skill>.
Notas de comportamiento
- Los valores predeterminados de
nativeynativeSkillsson"auto", que para Mattermost se resuelve como deshabilitado. Establézcalos explícitamente entrue. - El valor predeterminado de
callbackPathes/api/channels/mattermost/command. - Si se omite
callbackUrl, OpenClaw obtienehttp://<gateway.customBindHost or localhost>:<gateway.port, default 18789><callbackPath>. Los hosts de enlace comodín (0.0.0.0,::) recurren alocalhost. - En configuraciones con varias cuentas,
commandspuede establecerse en el nivel superior o enchannels.mattermost.accounts.<id>.commands(los valores de la cuenta prevalecen sobre los campos del nivel superior). - Los comandos de barra existentes con el mismo activador creados por otras integraciones no se modifican (se omiten durante el registro); los comandos creados por el bot se actualizan o se vuelven a crear cuando cambia la URL de devolución de llamada.
- Las devoluciones de llamada de los comandos se validan con los tokens específicos de cada comando que Mattermost devuelve cuando OpenClaw registra los comandos
oc_*. - OpenClaw actualiza el registro actual de comandos de Mattermost antes de aceptar cada devolución de llamada, por lo que los tokens obsoletos de comandos de barra eliminados o regenerados dejan de aceptarse sin necesidad de reiniciar el Gateway.
- La validación de la devolución de llamada falla de forma segura si la API de Mattermost no puede confirmar que el comando sigue vigente; las validaciones fallidas se almacenan brevemente en caché, las consultas simultáneas se agrupan y los inicios de consultas nuevas se limitan por comando para acotar la presión de reproducción.
- Las devoluciones de llamada de comandos de barra fallan de forma segura cuando el registro no se completó, el inicio fue parcial o el token de devolución de llamada no coincide con el token registrado del comando resuelto (un token válido para un comando no puede llegar a la validación ascendente de otro comando).
- Las devoluciones de llamada aceptadas se confirman con una respuesta efímera
"Procesando..."; la respuesta real llega como un mensaje normal.
Requisito de accesibilidad
El servidor de Mattermost debe poder acceder al punto de conexión de devolución de llamada.
- No establezca
callbackUrlenlocalhost, salvo que Mattermost se ejecute en el mismo host o espacio de nombres de red que OpenClaw. - No establezca
callbackUrlen la URL base de Mattermost, salvo que esa URL use un proxy inverso para dirigir/api/channels/mattermost/commanda OpenClaw. - Una comprobación rápida es
curl https://<gateway-host>/api/channels/mattermost/command; una solicitud GET debe devolver405 Method Not Alloweddesde OpenClaw, no404.
Lista de permitidos para el tráfico saliente de Mattermost
Si la devolución de llamada apunta a direcciones privadas, de tailnet o internas, configure ServiceSettings.AllowedUntrustedInternalConnections de Mattermost para incluir el host o dominio de devolución de llamada.
Use entradas de host o dominio, no URL completas.
- Correcto:
gateway.tailnet-name.ts.net - Incorrecto:
https://gateway.tailnet-name.ts.net
Variables de entorno (cuenta predeterminada)
Establézcalas en el host del Gateway si prefiere usar variables de entorno:
MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
Modos de chat
Mattermost responde automáticamente a los MD. El comportamiento en los canales se controla mediante chatmode:
oncall (predeterminado)
Responde solo cuando se menciona al bot con @ en los canales.
onmessage
Responde a todos los mensajes del canal.
onchar
Responde cuando un mensaje comienza con un prefijo activador.
Ejemplo de configuración:
{ channels: { mattermost: { chatmode: "onchar", oncharPrefixes: [">", "!"], // predeterminado }, },}Notas:
onchartambién responde a las menciones explícitas con @.channels.mattermost.requireMentionse sigue respetando, pero se prefierechatmode. La configuracióngroups.<channelId>.requireMentionde cada canal prevalece sobre ambas.- Después de que el bot envíe una respuesta visible en un hilo de un canal, los mensajes posteriores del mismo hilo se responden sin una nueva mención con @ ni un prefijo
onchar, por lo que las conversaciones de varios turnos en el hilo siguen fluyendo. La participación se recuerda durante 7 días desde la última respuesta del bot en ese hilo y persiste tras reiniciar el Gateway. Los hilos que el bot solo haya observado no se ven afectados; inicie un nuevo mensaje de nivel superior para volver a exigir una mención explícita.
Hilos y sesiones
Use channels.mattermost.replyToMode para controlar si las respuestas de canales y grupos permanecen en el canal principal o inician un hilo bajo la publicación que las activó.
off(predeterminado): solo responde en un hilo cuando la publicación entrante ya pertenece a uno.first: para publicaciones de nivel superior de canales o grupos, inicia un hilo bajo esa publicación y dirige la conversación a una sesión limitada al hilo.allybatched: actualmente tienen el mismo comportamiento quefirsten Mattermost, porque, una vez que Mattermost tiene una publicación raíz del hilo, los fragmentos posteriores y el contenido multimedia continúan en ese mismo hilo.- Los mensajes directos usan
offde forma predeterminada, aunque se haya establecidoreplyToMode.
Use channels.mattermost.replyToModeByChatType para anular el modo en los chats direct, group o channel. Establezca direct para habilitar los hilos en los mensajes directos:
off(predeterminado): los mensajes directos permanecen sin hilos en una única sesión continua.first,allobatched: cada mensaje directo de nivel superior inicia un hilo de Mattermost respaldado por una sesión nueva e independiente.
{ channels: { mattermost: { replyToMode: "all", replyToModeByChatType: { direct: "first", }, }, },}Notas:
- Las sesiones limitadas al hilo usan el identificador de la publicación activadora como raíz del hilo.
firstyallson equivalentes actualmente porque, una vez que Mattermost tiene una publicación raíz del hilo, los fragmentos posteriores y el contenido multimedia continúan en ese mismo hilo.- Las anulaciones por tipo de chat prevalecen sobre
replyToMode. Sin una anulación dedirect, las implementaciones existentes mantienen los MD planos y sin hilos.
Control de acceso (MD)
- Valor predeterminado:
channels.mattermost.dmPolicy = "pairing"(los remitentes desconocidos reciben un código de vinculación). Otros valores:allowlist,open,disabled. - Apruebe mediante:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- MD públicos:
channels.mattermost.dmPolicy="open"junto conchannels.mattermost.allowFrom=["*"](el esquema de configuración exige el comodín). channels.mattermost.allowFromacepta identificadores de usuario (recomendado) y entradasaccessGroup:<name>. Consulte Grupos de acceso.
Canales (grupos)
- Valor predeterminado:
channels.mattermost.groupPolicy = "allowlist"(requiere mención). - Incluya remitentes en la lista de permitidos mediante
channels.mattermost.groupAllowFrom(se recomiendan identificadores de usuario). channels.mattermost.groupAllowFromacepta entradasaccessGroup:<name>. Consulte Grupos de acceso.- Las anulaciones de menciones por canal se encuentran en
channels.mattermost.groups.<channelId>.requireMentiono enchannels.mattermost.groups["*"].requireMentioncomo valor predeterminado. - La coincidencia de
@usernamees mutable y solo se habilita cuandochannels.mattermost.dangerouslyAllowNameMatching: true. - Canales abiertos:
channels.mattermost.groupPolicy="open"(requiere mención). - Orden de resolución:
channels.mattermost.groupPolicy, despuéschannels.defaults.groupPolicyy, por último,"allowlist". - Nota de ejecución: si falta por completo la sección
channels.mattermost, durante la ejecución las comprobaciones de grupos fallan de forma segura y usangroupPolicy="allowlist"(aunque se haya establecidochannels.defaults.groupPolicy), y se registra una advertencia una sola vez.
Ejemplo:
{ channels: { mattermost: { groupPolicy: "open", groups: { "*": { requireMention: true }, "team-channel-id": { requireMention: false }, }, }, },}Destinos para entregas salientes
Use estos formatos de destino con openclaw message send o Cron/Webhooks:
| Destino | Entrega en |
|---|---|
channel:<id> |
Canal por identificador |
channel:<name> o #channel-name |
Canal por nombre, buscado en todos los equipos a los que pertenece el bot |
user:<id> o mattermost:<id> |
MD con ese usuario |
@username |
MD (el nombre de usuario se resuelve mediante la API de Mattermost) |
Los envíos salientes admiten como máximo un archivo adjunto por mensaje; divida varios archivos en envíos separados.
Reintentos del canal de MD
Cuando OpenClaw envía a un destino de MD de Mattermost y primero necesita resolver el canal directo, vuelve a intentar de forma predeterminada los fallos transitorios de creación del canal directo.
Use channels.mattermost.dmChannelRetry para ajustar este comportamiento globalmente para el plugin de Mattermost, o channels.mattermost.accounts.<id>.dmChannelRetry para una cuenta. Valores predeterminados:
{ channels: { mattermost: { dmChannelRetry: { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 10000, timeoutMs: 30000, }, }, },}Notas:
- Esto se aplica únicamente a la creación de canales de mensajes directos (
/api/v4/channels/direct), no a todas las llamadas a la API de Mattermost. - Los reintentos usan retroceso exponencial con fluctuación aleatoria y se aplican a fallos transitorios, como límites de frecuencia, respuestas 5xx y errores de red o de tiempo de espera.
- Los errores 4xx del cliente distintos de
429se consideran permanentes y no se reintentan.
Transmisión de vista previa
Mattermost transmite el razonamiento, la actividad de las herramientas y el texto parcial de la respuesta en una publicación de vista previa en borrador, que se finaliza en el mismo lugar cuando es seguro enviar la respuesta definitiva. En el modo partial, la vista previa se actualiza en la publicación con el mismo identificador, en lugar de saturar el canal con un mensaje por fragmento. En el modo block, la vista previa alterna entre bloques de texto completado y de actividad de las herramientas, por lo que los bloques anteriores permanecen visibles como publicaciones independientes en lugar de que el siguiente los sobrescriba. Las respuestas finales con contenido multimedia o errores cancelan las ediciones pendientes de la vista previa y usan la entrega normal, en lugar de publicar una vista previa descartable.
La transmisión de vista previa está activada de forma predeterminada en el modo partial. Configúrela mediante channels.mattermost.streaming (una cadena de modo, un valor booleano o un objeto como { mode: "progress" }):
{ channels: { mattermost: { streaming: "partial", // desactivado | parcial | bloques | progreso }, },}Modos de transmisión
partial(predeterminado): una publicación de vista previa que se edita a medida que crece la respuesta y después se finaliza con la respuesta completa.blockalterna la vista previa entre bloques de texto completado y de actividad de las herramientas, por lo que cada bloque permanece visible como una publicación independiente en lugar de sobrescribirse en el mismo lugar. Las actualizaciones paralelas y consecutivas de herramientas comparten la publicación actual de actividad de las herramientas.progressmuestra una vista previa del estado durante la generación y solo publica la respuesta final al completarse.offdesactiva la transmisión de vista previa. ConblockStreaming: true, los bloques completados del asistente siguen entregándose como respuestas normales en bloques (publicaciones separadas), en lugar de como una única publicación final combinada.
Notas sobre el comportamiento de la transmisión
- Si la transmisión no puede finalizarse en el mismo lugar (por ejemplo, si la publicación se eliminó durante la transmisión), OpenClaw recurre al envío de una nueva publicación final para que la respuesta nunca se pierda.
- Las cargas que solo contienen razonamiento se omiten de las publicaciones del canal, incluido el texto que llega como una cita en bloque
> Thinking. Configure/reasoning onpara ver el razonamiento en otras superficies; la publicación final de Mattermost conserva únicamente la respuesta. - Consulte Transmisión para ver la matriz de correspondencias de canales.
Reacciones (herramienta de mensajes)
- Use
message action=reactconchannel=mattermost. messageIdes el identificador de la publicación de Mattermost.emojiacepta nombres comothumbsupo:+1:(los dos puntos son opcionales).- Establezca
remove=true(booleano) para eliminar una reacción. - Los eventos de adición y eliminación de reacciones se reenvían como eventos del sistema a la sesión del agente enrutada, sujetos a las mismas comprobaciones de políticas de mensajes directos o grupos que los mensajes.
Ejemplos:
message action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsupmessage action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsup remove=trueConfiguración:
channels.mattermost.actions.reactions: activa o desactiva las acciones de reacción (valor predeterminado: verdadero).- Reemplazo por cuenta:
channels.mattermost.accounts.<id>.actions.reactions.
Botones interactivos (herramienta de mensajes)
Envíe mensajes con botones en los que se pueda hacer clic. Cuando un usuario hace clic en un botón, el agente recibe la selección y puede responder.
Los botones proceden de la carga semántica presentation (en las respuestas normales del agente y en message action=send). OpenClaw representa los botones con valor como botones interactivos de Mattermost, mantiene visibles los botones de URL en el texto del mensaje y convierte los menús de selección en texto legible.
message action=send channel=mattermost target=channel:<channelId> presentation={"blocks":[{"type":"buttons","buttons":[{"label":"Yes","value":"yes"},{"label":"No","value":"no"}]}]}Campos de los botones de presentación:
labelstringrequiredEtiqueta visible (alias: text).
valuestringValor devuelto al hacer clic, utilizado como identificador de la acción (alias: callback_data, callbackData). Es obligatorio para un botón en el que se pueda hacer clic, salvo que se establezca url.
urlstringBotón de enlace; se representa como texto label: url en el cuerpo del mensaje, en lugar de como botón interactivo.
style"primary" | "secondary" | "success" | "danger"Estilo del botón. Mattermost aplica el estilo predeterminado a los valores que no admite.
Para indicar la compatibilidad con botones en el mensaje del sistema del agente, añada inlineButtons a las capacidades del canal:
{ channels: { mattermost: { capabilities: ["inlineButtons"], }, },}Cuando un usuario hace clic en un botón:
Comprobación de acceso
Quien hace clic debe superar las mismas comprobaciones de políticas de mensajes directos o grupos que el remitente de un mensaje; los clics no autorizados reciben un aviso efímero y se ignoran.
Sustitución de los botones por una confirmación
Todos los botones se sustituyen por una línea de confirmación (por ejemplo, "✓ Sí seleccionado por @usuario").
El agente recibe la selección
El agente recibe la selección como mensaje entrante (además de un evento del sistema) y responde.
Notas de implementación
- Las devoluciones de llamada de los botones usan verificación HMAC-SHA256 (automática, sin necesidad de configuración).
- Al hacer clic se sustituye todo el bloque adjunto, por lo que todos los botones se eliminan conjuntamente; no es posible eliminarlos de forma parcial.
- Los identificadores de acción que contienen guiones o guiones bajos se depuran automáticamente (limitación del enrutamiento de Mattermost).
- Los clics cuyo
action_idno coincide con ninguna acción de la publicación original se rechazan con403("Acción desconocida").
Configuración y accesibilidad
channels.mattermost.capabilities: matriz de cadenas de capacidades. Añada"inlineButtons"para activar la descripción de la herramienta de botones en el mensaje del sistema del agente.channels.mattermost.interactions.callbackBaseUrl: URL base externa opcional para las devoluciones de llamada de los botones (por ejemplo,https://gateway.example.com). Úsela cuando Mattermost no pueda acceder directamente al Gateway en su host de enlace.- En configuraciones con varias cuentas, también puede establecer el mismo campo en
channels.mattermost.accounts.<id>.interactions.callbackBaseUrl. - Si se omite
interactions.callbackBaseUrl, OpenClaw obtiene la URL de devolución de llamada a partir degateway.customBindHost+gateway.port(valor predeterminado: 18789) y, si no es posible, recurre ahttp://localhost:<port>. La ruta de devolución de llamada es/mattermost/interactions/<accountId>. - Regla de accesibilidad: el servidor de Mattermost debe poder acceder a la URL de devolución de llamada del botón.
localhostsolo funciona cuando Mattermost y OpenClaw se ejecutan en el mismo host o espacio de nombres de red. channels.mattermost.interactions.allowedSourceIps: lista de direcciones IP de origen permitidas para las devoluciones de llamada de los botones. Sin ella, solo se aceptan orígenes local loopback (127.0.0.1,::1), por lo que un servidor remoto de Mattermost debe incluirse aquí en la lista de permitidos o sus clics se rechazarán con403. Si se encuentra detrás de un proxy inverso, configure tambiéngateway.trustedProxiespara obtener la dirección IP real del cliente a partir de los encabezados reenviados.- Si el destino de la devolución de llamada es privado, pertenece a una red de Tailscale o es interno, añada su host o dominio a
ServiceSettings.AllowedUntrustedInternalConnectionsde Mattermost.
Integración directa con la API (scripts externos)
Los scripts y webhooks externos pueden publicar botones directamente mediante la API REST de Mattermost, en lugar de pasar por la herramienta message del agente. Use buildButtonAttachments() del Plugin cuando sea posible; si publica JSON sin procesar, siga estas reglas:
Estructura de la carga:
{ 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 }, }, }, ], }, ], },}Generación del token HMAC
El Gateway verifica los clics de los botones con HMAC-SHA256. Los scripts externos deben generar tokens que coincidan con la lógica de verificación del Gateway:
Obtención del secreto a partir del token del bot
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken), codificado en hexadecimal.
Creación del objeto de contexto
Cree el objeto de contexto con todos los campos excepto _token.
Serialización con claves ordenadas
Serialice con las claves ordenadas recursivamente y sin espacios (el Gateway también normaliza los objetos anidados y genera JSON compacto).
Firma de la carga
HMAC-SHA256(key=secret, data=serializedContext)
Adición del token
Añada el resumen hexadecimal resultante como _token en el contexto.
Ejemplo en 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}Errores comunes con HMAC
json.dumpsde Python añade espacios de forma predeterminada ({"key": "val"}). Useseparators=(",", ":")para que coincida con la salida compacta de JavaScript ({"key":"val"}).- Firme siempre todos los campos de contexto (excepto
_token). El Gateway elimina_tokeny después firma todo lo restante. Firmar un subconjunto provoca un fallo de verificación silencioso. - Use
sort_keys=True: el Gateway ordena las claves antes de firmar, y Mattermost puede reordenar los campos de contexto al almacenar la carga. - Obtenga el secreto a partir del token del bot (de forma determinista), no de bytes aleatorios. El secreto debe ser el mismo en el proceso que crea los botones y en el Gateway que realiza la verificación.
Adaptador de directorio
El Plugin de Mattermost incluye un adaptador de directorio que resuelve nombres de canales y usuarios mediante la API de Mattermost. Esto permite usar destinos #channel-name y @username en openclaw message send y en las entregas mediante Cron o Webhook.
No se necesita configuración; el adaptador usa el token del bot de la configuración de la cuenta.
Varias cuentas
Mattermost admite varias cuentas en channels.mattermost.accounts:
{ channels: { mattermost: { accounts: { default: { name: "Principal", botToken: "mm-token", baseUrl: "https://chat.example.com" }, alerts: { name: "Alertas", botToken: "mm-token-2", baseUrl: "https://alerts.example.com" }, }, }, },}Los valores de la cuenta anulan los campos de nivel superior; channels.mattermost.defaultAccount selecciona qué cuenta se usa cuando no se especifica ninguna.
Solución de problemas
No hay respuestas en los canales
Asegúrate de que el bot esté en el canal y menciónalo (oncall), usa un prefijo de activación (onchar) o establece chatmode: "onmessage".
Errores de autenticación o de varias cuentas
- Comprueba el token del bot, la URL base y si la cuenta está habilitada.
- Problemas con varias cuentas: las variables de entorno solo se aplican a la cuenta
default. - Los hosts privados o de LAN de Mattermost necesitan
network.dangerouslyAllowPrivateNetwork: true(la protección contra SSRF bloquea las IP privadas de forma predeterminada).
Los comandos de barra nativos fallan
Unauthorized: invalid command token.: OpenClaw no aceptó el token de devolución de llamada. Causas habituales:- el registro del comando de barra falló o solo se completó parcialmente durante el inicio
- la devolución de llamada llega al Gateway o a la cuenta incorrectos
- Mattermost aún tiene comandos antiguos que apuntan a un destino de devolución de llamada anterior
- el Gateway se reinició sin volver a activar los comandos de barra
- Si los comandos de barra nativos dejan de funcionar, busca en los registros
mattermost: failed to register slash commandsomattermost: native slash commands enabled but no commands could be registered. - Si se omite
callbackUrly los registros advierten que la devolución de llamada se resolvió en una URL de local loopback comohttp://localhost:18789/..., probablemente esa URL solo sea accesible cuando Mattermost se ejecuta en el mismo host o espacio de nombres de red que OpenClaw. En su lugar, establece uncommands.callbackUrlexplícito y accesible externamente.
Problemas con los botones
- Los botones aparecen como cuadros blancos o no aparecen: los datos del botón tienen un formato incorrecto. Cada botón de presentación necesita un
labely unvalue(se descartan los botones a los que les falte cualquiera de ellos). - Los botones se muestran, pero los clics no hacen nada: comprueba que el Gateway sea accesible desde el servidor de Mattermost, que la IP del servidor de Mattermost esté incluida en
channels.mattermost.interactions.allowedSourceIps(sin esta opción solo se acepta local loopback) y queServiceSettings.AllowedUntrustedInternalConnectionsincluya el host de devolución de llamada para destinos privados. - Los botones devuelven 404 al hacer clic: es probable que el
iddel botón contenga guiones o guiones bajos. El enrutador de acciones de Mattermost falla con identificadores no alfanuméricos. Usa únicamente[a-zA-Z0-9]. - El Gateway registra
rejected callback source: el clic provino de una IP que no está eninteractions.allowedSourceIps. Añade el servidor de Mattermost o tu punto de entrada a la lista de permitidos y configuragateway.trustedProxiessi está detrás de un proxy inverso. - El Gateway registra
invalid _token: discrepancia de HMAC. Comprueba que firmas todos los campos de contexto (no solo un subconjunto), que usas claves ordenadas y JSON compacto (sin espacios). Consulta la sección sobre HMAC anterior. - El Gateway registra
missing _token in context: el campo_tokenno está en el contexto del botón. Asegúrate de incluirlo al crear la carga útil de integración. - El Gateway rechaza el clic con
Unknown action:context.action_idno coincide con ningúnidde acción de la publicación. Establece ambos con el mismo valor saneado. - El agente no ofrece botones: añade
capabilities: ["inlineButtons"]a la configuración del canal de Mattermost.
Temas relacionados
- Enrutamiento de canales - enrutamiento de sesiones para mensajes
- Descripción general de los canales - todos los canales compatibles
- Grupos - comportamiento del chat grupal y control mediante menciones
- Vinculación - autenticación por mensaje directo y flujo de vinculación
- Seguridad - modelo de acceso y refuerzo de seguridad