状态:可下载插件(bot token + WebSocket events)。支持频道、群组和私信。Mattermost 是一个可自托管的团队消息平台;有关产品详情和下载,请参见官方网站 mattermost.com。Documentation Index
Fetch the complete documentation index at: https://openclaw.zhcndoc.com/llms.txt
Use this file to discover all available pages before exploring further.
安装
在配置频道之前先安装 Mattermost:- npm registry
- Local checkout
快速设置
原生斜杠命令
原生斜杠命令是可选启用的。启用后,OpenClaw 会通过 Mattermost API 注册oc_* 斜杠命令,并在网关 HTTP 服务器上接收回调 POST 请求。
行为说明
行为说明
native: "auto"对 Mattermost 默认是禁用的。设置native: true以启用。- 如果省略
callbackUrl,OpenClaw 会根据网关主机/端口 +callbackPath推导出一个。 - 对于多账号设置,
commands可以设在顶层,或设在channels.mattermost.accounts.<id>.commands下(账号级配置会覆盖顶层字段)。 - OpenClaw 注册
oc_*命令时,Mattermost 会返回每个命令的 token;回调会使用这些 token 进行验证。 - OpenClaw 在接受每个回调之前都会刷新当前的 Mattermost 命令注册状态,因此已删除或重新生成的斜杠命令所对应的旧 token 将不再被接受,而无需重启网关。
- 如果 Mattermost API 无法确认该命令仍是当前版本,回调验证会失败并关闭;失败的验证会短暂缓存,并发查找会合并,新的查找会按每个命令进行速率限制,以控制重放压力。
- 当注册失败、启动未完全完成,或者回调 token 与解析出的命令已注册 token 不匹配时,斜杠回调会失败并关闭(某个命令有效的 token 不能通过上游验证去访问另一个命令)。
可达性要求
可达性要求
回调端点必须能够被 Mattermost 服务器访问。
- 不要将
callbackUrl设置为localhost,除非 Mattermost 与 OpenClaw 运行在同一主机/网络命名空间中。 - 不要将
callbackUrl设置为你的 Mattermost base URL,除非该 URL 会通过反向代理将/api/channels/mattermost/command转发到 OpenClaw。 - 一个快速检查方式是执行
curl https://<gateway-host>/api/channels/mattermost/command;GET 请求应返回来自 OpenClaw 的405 Method Not Allowed,而不是404。
Mattermost 出站允许列表
Mattermost 出站允许列表
如果你的回调目标指向私有/tailnet/内部地址,请将 Mattermost 的
ServiceSettings.AllowedUntrustedInternalConnections 设置为包含回调主机/域名。请使用主机/域名条目,不要使用完整 URL。- 正确:
gateway.tailnet-name.ts.net - 错误:
https://gateway.tailnet-name.ts.net
环境变量(默认账号)
如果你更喜欢使用环境变量,请在网关主机上设置这些值:MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
环境变量只适用于默认账号(
default)。其他账号必须使用配置值。MATTERMOST_URL 不能从 workspace .env 中设置;参见 Workspace .env files。聊天模式
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/webhook 中使用以下目标格式:
channel:<id>表示频道user:<id>表示私信@username表示私信(通过 Mattermost API 解析)
私信频道重试
当 OpenClaw 向 Mattermost 私信目标发送消息并需要先解析直接频道时,默认会重试瞬时的直接频道创建失败。 使用channels.mattermost.dmChannelRetry 可全局调整 Mattermost 插件的该行为,或使用 channels.mattermost.accounts.<id>.dmChannelRetry 为单个账号配置。
- 这只适用于 DM 频道创建(
/api/v4/channels/direct),不适用于每一次 Mattermost API 调用。 - 重试适用于瞬时失败,例如限流、5xx 响应以及网络或超时错误。
- 除了
429之外的 4xx 客户端错误都被视为永久性错误,不会重试。
预览流式输出
Mattermost 会将思考、工具活动和部分回复文本流式汇入单个草稿预览消息中,并在最终答案安全可发送时就地完成。预览会在同一个消息 id 上更新,而不是通过每个分块消息刷屏频道。媒体/错误的最终结果会取消待处理的预览编辑,并使用正常投递,而不是刷新一个会被丢弃的预览消息。 通过channels.mattermost.streaming 启用:
流式模式
流式模式
partial是常见选择:先发送一条预览消息,随着回复增长不断编辑,最后用完整答案完成提交。block在预览消息内使用追加式草稿分块。progress在生成过程中显示状态预览,并且只在完成时发送最终答案。off会禁用预览流式输出。
流式行为说明
流式行为说明
- 如果流无法就地完成(例如消息在流式过程中被删除),OpenClaw 会回退为发送一条新的最终消息,以确保回复不会丢失。
- 仅推理内容的载荷不会显示在频道消息中,包括以
> Reasoning:引用块形式到达的文本。设置/reasoning on可在其他界面查看思考过程;Mattermost 最终消息只保留答案。 - 参见 Streaming 了解频道映射矩阵。
反应(message 工具)
- 使用
message action=react并设置channel=mattermost。 messageId是 Mattermost 帖子的 id。emoji接受诸如thumbsup或:+1:之类的名称(冒号可选)。- 设置
remove=true(布尔值)以移除反应。 - 反应的添加/移除事件会作为系统事件转发到路由后的 agent 会话。
channels.mattermost.actions.reactions:启用/禁用反应动作(默认 true)。- 按账号覆盖:
channels.mattermost.accounts.<id>.actions.reactions。
交互式按钮(message 工具)
发送带有可点击按钮的消息。当用户点击按钮时,agent 会收到所选内容并可以响应。 通过向 channel capabilities 中添加inlineButtons 来启用按钮:
buttons 参数的 message action=send。按钮是一个二维数组(按钮行):
显示标签。
点击后返回的值(用作 action ID)。
按钮样式。
实现说明
实现说明
- 按钮回调使用 HMAC-SHA256 验证(自动完成,无需配置)。
- Mattermost 会从其 API 响应中剥离 callback data(安全特性),因此点击后所有按钮都会被移除——无法部分移除。
- 包含连字符或下划线的 action ID 会被自动清理(Mattermost 路由限制)。
配置与可达性
配置与可达性
直接 API 集成(外部脚本)
外部脚本和 webhook 可以直接通过 Mattermost REST API 发布按钮,而不是通过 agent 的message 工具。尽可能使用插件中的 buildButtonAttachments();如果直接发布原始 JSON,请遵循以下规则:
负载结构:
Python 示例:
常见 HMAC 陷阱
常见 HMAC 陷阱
- Python 的
json.dumps默认会添加空格({"key": "val"})。请使用separators=(",", ":")以匹配 JavaScript 的紧凑输出({"key":"val"})。 - 始终签名所有上下文字段(减去
_token)。gateway 会先去掉_token,然后对剩余全部内容签名。只签名子集会导致静默验证失败。 - 使用
sort_keys=True— gateway 会在签名前对键排序,而 Mattermost 在存储负载时可能会重新排列上下文字段。 - 从 bot token 派生密钥(确定性),而不是随机字节。创建按钮的进程与验证的 gateway 必须使用相同的密钥。
目录适配器
Mattermost 插件包含一个目录适配器,可通过 Mattermost API 解析频道和用户名称。这使得openclaw message send 以及 cron/webhook 投递可以使用 #channel-name 和 @username 目标。
无需配置——适配器使用账号配置中的 bot token。
多账号
Mattermost 支持在channels.mattermost.accounts 下配置多个账号:
故障排查
频道中没有回复
频道中没有回复
确保 bot 在该频道中,并对其进行 mention(oncall),使用触发前缀(onchar),或设置
chatmode: "onmessage"。认证或多账号错误
认证或多账号错误
- 检查 bot token、base URL,以及账号是否已启用。
- 多账号问题:环境变量仅适用于
default账号。
原生 slash 命令失败
原生 slash 命令失败
Unauthorized: invalid command token.:OpenClaw 未接受回调 token。典型原因:- slash 命令注册在启动时失败或只部分完成
- 回调命中了错误的 gateway/账号
- Mattermost 仍保留指向先前回调目标的旧命令
- gateway 重启后未重新激活 slash 命令
- 如果原生 slash 命令停止工作,请检查日志中是否有
mattermost: failed to register slash commands或mattermost: native slash commands enabled but no commands could be registered。 - 如果省略了
callbackUrl,且日志警告回调解析为http://127.0.0.1:18789/...,那么该 URL 可能只在 Mattermost 与 OpenClaw 运行在同一主机/网络命名空间时可访问。请改为显式设置一个外部可达的commands.callbackUrl。
按钮问题
按钮问题