安装
- npm registry
- Local checkout
快速设置
位于私有/LAN/tailnet 地址上的自托管 Mattermost:出站 Mattermost API 请求会通过 SSRF 防护,默认阻止私有和内部 IP。使用
channels.mattermost.network.dangerouslyAllowPrivateNetwork: true 选择启用(按账号:channels.mattermost.accounts.<id>.network.dangerouslyAllowPrivateNetwork)。原生斜杠命令
原生斜杠命令需要选择启用。启用后,OpenClaw 会在 Bot 所属的每个团队中注册oc_* 斜杠命令,并在 Gateway 网关 HTTP 服务器上接收回调 POST。
/oc_status、/oc_model、/oc_models、/oc_new、/oc_help、/oc_think、/oc_reasoning、/oc_verbose、/oc_queue。使用 nativeSkills: true 时,技能命令也会注册为 /oc_<skill>。
Behavior notes
Behavior notes
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下(账号值会覆盖顶层字段)。 - 其他集成创建的同触发器现有斜杠命令会保持不变(注册会跳过它们);Bot 创建的命令会在回调 URL 偏移时更新或重新创建。
- 命令回调会使用 Mattermost 在 OpenClaw 注册
oc_*命令时返回的每命令令牌进行验证。 - OpenClaw 会在接受每个回调前刷新当前 Mattermost 命令注册,因此来自已删除或重新生成的斜杠命令的过期令牌会在无需重启 Gateway 网关的情况下停止被接受。
- 如果 Mattermost API 无法确认命令仍是当前命令,回调验证会失败并关闭;失败的验证会短暂缓存,并发查找会合并,并且新的查找启动会按命令限速,以限制重放压力。
- 当注册失败、启动不完整,或回调令牌与解析出的命令注册令牌不匹配时,斜杠回调会失败并关闭(对一个命令有效的令牌无法对另一个命令进入上游验证)。
- 已接受的回调会用一条临时的 “Processing…” 回复确认;真正的答案会作为普通消息到达。
Reachability requirement
Reachability requirement
回调端点必须可从 Mattermost 服务器访问。
- 不要将
callbackUrl设置为localhost,除非 Mattermost 与 OpenClaw 运行在同一主机/网络命名空间中。 - 不要将
callbackUrl设置为你的 Mattermost 基础 URL,除非该 URL 将/api/channels/mattermost/command反向代理到 OpenClaw。 - 快速检查是
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。按频道设置的groups.<channelId>.requireMention会优先于两者。- Bot 在频道线程中发送可见回复后,同一线程中的后续消息会在没有新的 @提及或
onchar前缀的情况下得到回答,因此多轮线程对话会持续流转。参与状态会在 Bot 最后一次回复该线程后保留 7 天,并且在 Gateway 网关重启后仍会保留。Bot 仅观察过的线程不受影响;发送新的顶层消息会再次要求显式提及。
线程和会话
使用channels.mattermost.replyToMode 控制频道和群组回复是留在主频道中,还是在触发帖下开启线程。
off(默认):仅当入站帖子已经在线程中时,才在线程中回复。first:对于顶层频道/群组帖子,在该帖子下开启线程,并将对话路由到线程范围的会话。all和batched:目前在 Mattermost 中与first行为相同,因为一旦 Mattermost 有了线程根,后续分块和媒体会继续留在同一线程中。- 私信会忽略此设置,并保持非线程化。
访问控制(私信)
- 默认:
channels.mattermost.dmPolicy = "pairing"(未知发送者会获得配对码)。其他值:allowlist、open、disabled。 - 通过以下方式批准:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- 公开私信:
channels.mattermost.dmPolicy="open"加channels.mattermost.allowFrom=["*"](配置 schema 会强制通配符)。 channels.mattermost.allowFrom接受用户 ID(推荐)和accessGroup:<name>条目。请参阅访问组。
频道(群组)
- 默认:
channels.mattermost.groupPolicy = "allowlist"(需要提及)。 - 使用
channels.mattermost.groupAllowFrom设置发送者允许列表(推荐用户 ID)。 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),并记录一次性警告。
出站投递目标
将这些目标格式与openclaw message send 或 cron/webhooks 搭配使用:
| 目标 | 投递到 |
|---|---|
channel:<id> | 按 ID 指定的频道 |
channel:<name> 或 #channel-name | 按名称指定的频道,会在 Bot 所属的团队中搜索 |
user:<id> 或 mattermost:<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,而不是用逐块消息刷屏频道。媒体/错误终稿会取消待处理的预览编辑,并改用普通投递,而不是刷新一个一次性预览帖子。 预览流式传输在partial 模式下默认开启。通过 channels.mattermost.streaming 配置(模式字符串、布尔值,或类似 { mode: "progress" } 的对象):
流式传输模式
流式传输模式
partial(默认):一个预览帖子会随着回复增长而被编辑,然后以完整答案定稿。block在预览帖子内使用追加式草稿块。progress在生成期间显示状态预览,并且只在完成时发布最终答案。off禁用预览流式传输。
流式传输行为说明
流式传输行为说明
- 如果流无法就地定稿(例如帖子在流式传输中途被删除),OpenClaw 会回退为发送新的最终帖子,确保回复不会丢失。
- 仅思考的载荷会从频道帖子中抑制,包括作为
> Thinking块引用到达的文本。设置/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。
交互式按钮(消息工具)
发送带可点击按钮的消息。当用户点击按钮时,智能体会收到该选择并可以响应。 按钮来自语义化presentation 载荷(在普通智能体回复和 message action=send 中)。OpenClaw 会将值按钮渲染为 Mattermost 交互式按钮,在消息文本中保持 URL 按钮可见,并将选择菜单降级为可读文本。
显示标签(别名:
text)。点击时发回的值,用作操作 ID(别名:
callback_data、callbackData)。除非设置了 url,否则可点击按钮必须提供该字段。链接按钮;在消息正文中渲染为
label: url 文本,而不是交互式按钮。按钮样式。Mattermost 会对不支持的值应用默认样式。
inlineButtons 添加到频道能力:
实现说明
实现说明
- 按钮回调使用 HMAC-SHA256 验证(自动完成,无需配置)。
- 点击后会替换整个附件块,因此所有按钮会一起移除,无法部分移除。
- 包含连字符或下划线的操作 ID 会自动清理(Mattermost 路由限制)。
- 如果点击的
action_id与原始帖子上的操作不匹配,会以403(“Unknown action”)拒绝。
直接 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 在存储载荷时也可能重排上下文字段。 - 从 bot 令牌派生密钥(确定性),不要使用随机字节。创建按钮的进程和验证按钮的 Gateway 网关必须使用相同密钥。
目录适配器
Mattermost 插件包含一个目录适配器,可通过 Mattermost API 解析频道和用户名。这会在openclaw message send 以及 cron/webhook 投递中启用 #channel-name 和 @username 目标。
无需配置;该适配器会使用账号配置中的 bot 令牌。
多账号
Mattermost 支持在channels.mattermost.accounts 下配置多个账号:
channels.mattermost.defaultAccount 选择未指定账号时使用哪个账号。
故障排查
频道中没有回复
频道中没有回复
确保 bot 在频道中并提及它(oncall),使用触发前缀(onchar),或设置
chatmode: "onmessage"。认证或多账号错误
认证或多账号错误
- 检查 bot 令牌、基础 URL,以及账号是否已启用。
- 多账号问题:环境变量只应用于
default账号。 - 私有/LAN Mattermost 主机需要
network.dangerouslyAllowPrivateNetwork: true(SSRF 防护默认会阻止私有 IP)。