Status: 可下载插件(机器人 token + WebSocket 事件)。支持渠道、群组和私信。Mattermost 是一个可自托管的团队消息平台;产品详情和下载请参阅官方网站 mattermost.com。Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
安装
配置渠道前,请先安装 Mattermost:- npm registry
- Local checkout
快速设置
原生斜杠命令
原生斜杠命令需要选择启用。启用后,OpenClaw 会通过 Mattermost API 注册oc_* 斜杠命令,并在 Gateway 网关 HTTP 服务器上接收回调 POST。
Behavior notes
Behavior notes
native: "auto"对 Mattermost 默认禁用。设置native: true以启用。- 如果省略
callbackUrl,OpenClaw 会根据 Gateway 网关主机/端口 +callbackPath推导出一个。 - 对于多账号设置,
commands可以在顶层设置,也可以在channels.mattermost.accounts.<id>.commands下设置(账号值会覆盖顶层字段)。 - 命令回调会使用 OpenClaw 注册
oc_*命令时 Mattermost 返回的每命令 token 进行验证。 - OpenClaw 会在接受每个回调前刷新当前 Mattermost 命令注册,因此已删除或重新生成的斜杠命令中的过期 token 无需重启 Gateway 网关也会停止被接受。
- 如果 Mattermost API 无法确认该命令仍为当前命令,回调验证会失败并关闭;失败的验证会被短暂缓存,并发查找会被合并,新的查找启动会按命令限速,以限制重放压力。
- 当注册失败、启动不完整,或回调 token 与解析出的命令已注册 token 不匹配时,斜杠回调会失败并关闭(对一个命令有效的 token 不能访问另一个命令的上游验证)。
Reachability requirement
Reachability requirement
回调端点必须能从 Mattermost 服务器访问。
- 除非 Mattermost 与 OpenClaw 运行在同一主机/网络命名空间中,否则不要将
callbackUrl设置为localhost。 - 除非你的 Mattermost base URL 会将
/api/channels/mattermost/command反向代理到 OpenClaw,否则不要将callbackUrl设置为你的 Mattermost base URL。 - 一个快速检查是
curl https://<gateway-host>/api/channels/mattermost/command;GET 应返回来自 OpenClaw 的405 Method Not Allowed,而不是404。
Mattermost egress allowlist
Mattermost egress allowlist
如果你的回调目标是私有/tailnet/内部地址,请将 Mattermost
ServiceSettings.AllowedUntrustedInternalConnections 设置为包含回调主机/域名。使用主机/域名条目,而不是完整 URL。- 正确:
gateway.tailnet-name.ts.net - 错误:
https://gateway.tailnet-name.ts.net
环境变量(默认账号)
如果你更喜欢环境变量,请在 Gateway 网关主机上设置这些变量:MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
环境变量仅适用于默认账号(
default)。其他账号必须使用配置值。MATTERMOST_URL 不能从工作区 .env 设置;请参阅工作区 .env 文件。聊天模式
Mattermost 会自动响应私信。渠道行为由chatmode 控制:
- oncall (default)
- onmessage
- onchar
仅在渠道中被 @提及时响应。
onchar仍会响应显式 @提及。- 旧配置仍会遵循
channels.mattermost.requireMention,但首选chatmode。
线程和会话
使用channels.mattermost.replyToMode 控制渠道和群组回复是留在主渠道中,还是在触发帖下开启一个线程。
off(默认):仅当入站帖已经在线程中时,才在线程中回复。first:对于顶层渠道/群组帖,在该帖下开启一个线程,并将对话路由到线程作用域的会话。all:目前在 Mattermost 中行为与first相同。- 私信会忽略此设置,并保持非线程化。
- 线程作用域的会话使用触发帖 id 作为线程根。
first和all目前等价,因为一旦 Mattermost 有了线程根,后续分块和媒体都会继续留在同一线程中。
访问控制(私信)
- 默认:
channels.mattermost.dmPolicy = "pairing"(未知发送者会获得配对码)。 - 通过以下方式批准:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- 公开私信:
channels.mattermost.dmPolicy="open"加channels.mattermost.allowFrom=["*"]。
渠道(群组)
- 默认:
channels.mattermost.groupPolicy = "allowlist"(由提及门控)。 - 使用
channels.mattermost.groupAllowFrom将发送者加入允许列表(建议使用用户 ID)。 - 每渠道提及覆盖位于
channels.mattermost.groups.<channelId>.requireMention下,或使用channels.mattermost.groups["*"].requireMention作为默认值。 @username匹配是可变的,并且仅在channels.mattermost.dangerouslyAllowNameMatching: true时启用。- 开放渠道:
channels.mattermost.groupPolicy="open"(由提及门控)。 - 运行时注意事项:如果完全缺少
channels.mattermost,运行时会回退到groupPolicy="allowlist"来执行群组检查(即使已设置channels.defaults.groupPolicy)。
出站投递目标
将这些目标格式用于openclaw message send 或 cron/webhooks:
channel:<id>表示渠道user:<id>表示私信@username表示私信(通过 Mattermost API 解析)
私信渠道重试
当 OpenClaw 发送到 Mattermost 私信目标并且需要先解析直接渠道时,它默认会重试瞬时的直接渠道创建失败。 使用channels.mattermost.dmChannelRetry 为 Mattermost 插件全局调节该行为,或使用 channels.mattermost.accounts.<id>.dmChannelRetry 为单个账号调节。
- 这仅适用于私信渠道创建(
/api/v4/channels/direct),不适用于每个 Mattermost API 调用。 - 重试适用于瞬时失败,例如速率限制、5xx 响应,以及网络或超时错误。
- 除
429外的 4xx 客户端错误会被视为永久错误,不会重试。
预览流式传输
Mattermost 会将思考、工具活动和部分回复文本流式传输到单个草稿预览帖中,并在最终答案可以安全发送时就地完成。预览会在同一帖 id 上更新,而不是用逐分块消息刷屏。媒体/错误最终结果会取消待处理的预览编辑,并使用正常投递,而不是刷新一个一次性的预览帖。 通过channels.mattermost.streaming 启用:
Streaming modes
Streaming modes
partial是通常的选择:一个预览帖会随着回复增长而被编辑,然后以完整答案完成。block在预览帖内使用追加式草稿分块。progress在生成时显示状态预览,并且只在完成时发布最终答案。off禁用预览流式传输。
Streaming behavior notes
Streaming behavior notes
- 如果流无法就地完成(例如帖子在流式传输中途被删除),OpenClaw 会回退为发送一个新的最终帖,因此回复永远不会丢失。
- 仅推理的载荷会从渠道帖子中抑制,包括作为
> Reasoning:块引用到达的文本。设置/reasoning on可在其他界面查看思考;Mattermost 最终帖只保留答案。 - 请参阅流式传输了解渠道映射矩阵。
表情反应(消息工具)
- 将
message action=react与channel=mattermost一起使用。 messageId是 Mattermost 帖子 id。emoji接受类似thumbsup或:+1:的名称(冒号可选)。- 设置
remove=true(布尔值)以移除表情反应。 - 表情反应添加/移除事件会作为系统事件转发到被路由的智能体会话。
channels.mattermost.actions.reactions:启用/禁用表情反应操作(默认 true)。- 每账号覆盖:
channels.mattermost.accounts.<id>.actions.reactions。
交互式按钮(消息工具)
发送带可点击按钮的消息。当用户点击按钮时,智能体会收到所选内容并可以响应。 通过向渠道能力添加inlineButtons 来启用按钮:
buttons 参数的 message action=send。按钮是二维数组(按钮行):
显示标签。
点击时发回的值(用作操作 ID)。
按钮样式。
实现说明
实现说明
- 按钮回调使用 HMAC-SHA256 验证(自动完成,无需配置)。
- Mattermost 会从其 API 响应中去除回调数据(安全功能),因此点击后会移除所有按钮,无法部分移除。
- 包含连字符或下划线的操作 ID 会自动清理(Mattermost 路由限制)。
配置和可达性
配置和可达性
直接 API 集成(外部脚本)
外部脚本和 Webhook 可以通过 Mattermost REST API 直接发布按钮,而不是经过智能体的message 工具。尽可能使用插件中的 buildButtonAttachments();如果发布原始 JSON,请遵循以下规则:
载荷结构:
Python 示例:
常见 HMAC 陷阱
常见 HMAC 陷阱
- Python 的
json.dumps默认会添加空格({"key": "val"})。使用separators=(",", ":")以匹配 JavaScript 的紧凑输出({"key":"val"})。 - 始终签名所有上下文字段(减去
_token)。Gateway 网关会移除_token,然后对剩余的所有内容签名。签名子集会导致静默验证失败。 - 使用
sort_keys=True;Gateway 网关会在签名前对键排序,而 Mattermost 在存储载荷时可能会重新排列上下文字段。 - 从机器人令牌派生密钥(确定性),不要使用随机字节。创建按钮的进程和验证按钮的 Gateway 网关必须使用相同密钥。
目录适配器
Mattermost 插件包含一个目录适配器,可通过 Mattermost API 解析渠道和用户名。这会在openclaw message send 以及 cron/webhook 投递中启用 #channel-name 和 @username 目标。
无需配置;适配器使用账号配置中的机器人令牌。
多账号
Mattermost 支持在channels.mattermost.accounts 下配置多个账号:
故障排除
渠道中没有回复
渠道中没有回复
确保机器人在渠道中并提及它(oncall),使用触发前缀(onchar),或设置
chatmode: "onmessage"。认证或多账号错误
认证或多账号错误
- 检查机器人令牌、基准 URL,以及账号是否已启用。
- 多账号问题:环境变量只适用于
default账号。
原生斜杠命令失败
原生斜杠命令失败
按钮问题
按钮问题