Build a Mattermost AI Agent with nanobot: WebSocket + REST Integration Guide

Build a Mattermost AI Agent with nanobot: WebSocket + REST Integration Guide Build a Mattermost AI Agent with nanobot: WebSocket REST Integration Guide【免费下载链接】nanobotUltra-lightweight, open-source, self-hosted personal AI agent framework in Python with WebUI, tools, memory, MCP, multi-agent workflows, automation, and chat apps项目地址: https://gitcode.com/gh_mirrors/nanob/nanobot本指南以 nanobot 内置的 Mattermost 频道为核心完整演示如何创建机器人账号、获取令牌、配置channels.mattermost配置块并通过 WebSocket 事件与 Mattermost REST API 将 nanobot 接入自托管 Mattermost 服务器。读完本文你将掌握从零启用频道、配置群组与私聊访问策略mention / open / allowlist、完成 pairing 配对审批、排查连接问题的完整实战链路并理解其底层实现原理。本指南将完成什么按照本文操作你将依次构建出一个 Mattermost 机器人账号或访问令牌bot token 或 personal access tokennanobot 中启用mattermost频道首次部署使用仅 提及mention-only的群组行为一次通过 pairing 审批的 DM 或 提及测试。前置条件nanobot 本地回复链路可用先验证 CLI 能正常对话nanobot agent -m Hello!如果这一步失败请先修复安装、配置、Provider 或模型设置可参考 quick-start.md、providers.md 与 troubleshooting.md。一个可访问的 Mattermost 服务器 URL例如https://mattermost.example.com。该机器人账号的 bot token 或 personal access token。运行 Mattermost 频道需要nanobot gateway进程保持运行且 Mattermost 频道依赖的可选包需要被安装见下文。安装 nanobotpython -m pip install nanobot-ai nanobot onboard --wizard如果 Mattermost 频道依赖未随安装包默认附带可在同一 Python 环境中启用频道插件让 nanobot 安装其清单声明的依赖nanobot plugins enable mattermost之后如需关闭频道运行nanobot plugins disable mattermostnanobot 会保留已保存的设置但重启后不再加载该频道。此机制对所有聊天频道统一生效参见 chat-apps.md。创建 Mattermost 机器人账号与令牌在 Mattermost 服务器侧完成以下准备具体入口随服务器版本略有差异在 Mattermost 管理后台创建 Bot 账号Bot Accounts或使用个人账号并生成 Personal Access Token为机器人开通消息读写所需的权限将机器人加入目标团队Team及需要对话的频道复制机器人令牌作为后续配置中的token。nanobot 侧启动时会调用 Mattermost REST API 的GET /api/v4/users/me来识别机器人自身身份用户名与 ID因此令牌必须具有读取自身信息的权限。启用 Mattermost 频道把下面的配置片段合并进~/.nanobot/config.json以 JSON 合并方式而不是整体覆盖整个文件{ channels: { mattermost: { enabled: true, serverUrl: https://mattermost.example.com, token: YOUR_MATTERMOST_TOKEN, teamId: YOUR_TEAM_ID, groupPolicy: mention, groupPolicyInThread: open, replyInThread: true, dm: { policy: allowlist } } } }teamId将频道作用域限定到某个 Mattermost 团队来自其他团队的消息会被忽略DM 除外。首次测试时请将groupPolicy保持为mention避免机器人在繁忙频道中回复所有消息。频道配置项完整说明以下是 Mattermost 频道支持的全部配置项字段名均为 camelCase。从源码结构看配置模型定义于 nanobot/channels/mattermost/runtime.py 的MattermostConfig其默认值与类型在 nanobot/channels/mattermost/manifest.py 的SETUP_SPEC中对外暴露配置项类型默认值说明enabledboolfalse是否启用 Mattermost 频道serverUrlstring必填Mattermost 服务器地址如https://mattermost.example.comtokenstring必填bot token 或 personal access tokenteamIdstring团队 ID限定频道只处理该团队的消息DM 不受此限制allowFromlist[]外层访问控制名单省略时使用 pairing-only 模式[*]表示允许所有人allowFromMatchModeenumid匹配方式id用户 ID、username用户名或email邮箱groupPolicyenummention群组频道策略mention仅被 提及时回复、open回复所有消息、allowlist仅限groupAllowFrom中的频道groupPolicyInThreadenum继承groupPolicy线程内回复策略取值同上省略时自动继承groupPolicygroupAllowFromlist[]当groupPolicy/groupPolicyInThread为allowlist时允许回复的频道 ID 名单replyInThreadbooltrue在频道顶层消息触发时是否以线程回复includeThreadContextbooltrue线程内触发时是否把线程历史拼入上下文threadContextLimitint20拉取线程历史的最大条数streamingbooltrue是否流式发送回复reactEmojistringeyes收到消息后添加的“处理中”表情doneEmojistringwhite_check_mark回复完成时替换的“完成”表情设为空字符串可禁用sendProgressbooltrue是否发送处理中状态反馈sendToolHintsbooltrue是否在回复中附带工具调用提示dm.enabledbooltrue是否启用私聊dm.policyenumopen私聊策略open默认直接回复或allowlist仅限dm.allowFrom且未批准用户收到配对码dm.allowFromlist[]私聊允许名单关于groupPolicyInThread的继承行为groupPolicyInThread可以取mention、open或allowlist用于控制线程内消息的回复条件。如果省略该字段它会继承groupPolicy的值从而保持既有配置的行为不变。这一点在源码中有明确的模型校验器实现runtime.py 中的_inherit_thread_policy只有当配置中显式出现groupPolicyInThread/group_policy_in_thread时才保留用户指定值否则用groupPolicy填充。对应测试test_thread_policy_inherits_group_policy_when_omitted见 nanobot/channels/mattermost/tests/test_mattermost_channel.py验证了“省略即继承”与“显式指定即覆盖”两种路径。当线程内的后续追问不应再次要求 提及机器人时请显式设为open。allowlist 策略的边界规则当groupPolicy为allowlist时groupAllowFrom是外层频道边界既约束根帖root post也约束线程回复——线程策略不能打开一个不在该 allowlist 上的频道。换言之线程策略只能在groupAllowFrom已放行的频道集合内“收紧或放宽”不能越界放行。Mattermost 私聊与 pairing 配对Mattermost 的私聊DM默认是开放的只要dm.policy为默认的open任何能向机器人发起 DM 的用户都会直接获得回复。将dm.policy设为allowlist且不配置dm.allowFrom条目时新的 DM 发送者会收到一个配对码pairing code在你批准该配对码之前机器人不会正常回应该用户。这一设计避免了你手动收集每个用户的 ID。关于 pairing 的通用机制可参考 configuration.md 的 Pairing 章节配对只适用于 DM 场景未批准用户在群聊中会被静默忽略。运行 nanobot gateway配置完成后先确认 nanobot 能看到并启用了该频道nanobot channels status如果nanobot channels status中没有显示 Mattermost 已启用说明配置片段放错了位置、频道名拼写有误或者你编辑的 config 文件不是 nanobot 实际读取的那个。随后启动 gateway 并保持终端运行nanobot gateway若频道已启用但消息不进来请改用nanobot gateway --verbose查看详细日志并对照平台侧的凭证、事件权限与 allowlist。测试一条消息向机器人账号发起一条 DM。由于dm.policy为allowlist且无allowFrom条目机器人会返回一个配对码形如ABCD-EFGH。从可信的本地界面批准该配对码nanobot agent -m /pairing approve ABCD-EFGH/pairing是 nanobot 的内置命令支持list、approve code、deny code、revoke user_id等子命令见 nanobot/command/builtin.py 中/pairing的命令定义。再次向机器人发 DM或者在机器人有访问权的频道中 提及它nanobot Hello from Mattermost配对流程的底层逻辑配对状态的判定发生在 runtime.py 的_is_allowed方法中对于 DM 频道先检查dm.enabled若发送者已被批准is_approved则直接放行否则在dm.policy allowlist时检查dm.allowFrom。当未批准用户发来 DM 时频道会生成配对码并通过format_pairing_reply回复给用户同时把配对码写入消息元数据这就是“首次 DM 收到配对码”这一行为的实现来源。频道底层工作原理双通道架构WebSocket REST API从源码看runtime.py 顶部注释即为Mattermost channel implementation using WebSocket REST APIMattermost 频道同时使用两种通道WebSocketnanobot 将serverUrl自动转换为 WebSocket 地址https://→wss://、http://→ws://并拼接/api/v4/websocket路径建立长连接接收实时事件。启动时先调用GET /api/v4/users/me识别机器人自身 ID 与用户名然后进入_ws_listen_loop监听循环连接断开时按 1 秒起、指数退避至最多 30 秒的策略自动重连。REST API发送消息POST /api/v4/posts、上传/下载文件POST /api/v4/files、GET /api/v4/files/{id}、操作表情POST /api/v4/reactions等全部走 REST 接口HTTP 客户端使用Authorization: Bearer token头鉴权。处理的事件类型_handle_ws_message分派三类事件WebSocket 事件处理逻辑posted新消息解析帖子、过滤系统消息type以system_开头如加入/离开频道的系统帖、过滤机器人自己的消息、按团队与策略判定是否响应action交互式按钮/下拉动作把context.selected_option作为消息内容送入 agent 流程post_deleted清理与已删除帖子相关的流式回复缓存状态频道类型通过_CHANNEL_TYPES映射O→公开频道、P→私密频道、D→DM、G→群组。团队过滤与频道类型解析配置了teamId后posted/action事件都会做团队校验优先使用 WebSocket broadcast 中的team_id缺失时调用GET /api/v4/channels/{channel_id}解析该频道所属团队非 DM 消息若团队不匹配则直接丢弃。DM 始终绕过团队过滤测试test_team_filtering_dm_bypass验证了这一点。回复策略与 提及剥离_should_respond_in_channel根据消息是否在线程内root_id是否为空分别选择groupPolicyInThread或groupPolicyopen全部回复mention通过正则(?![\w])bot_username(?![\w])判断是否被 提及allowlist频道 ID 必须在groupAllowFrom中。判定通过后消息中的bot_username前缀会被剥离只把剩余文本交给 agent对应测试test_strip_bot_mention_from_incoming。会话隔离与线程上下文会话键的构造规则为mattermost:channel_id:thread_ts线程内消息使用root_id作为thread_ts同一线程内的多轮对话共享一个会话配置了replyInThread: true时顶层 提及消息会以该消息的post_id作为thread_ts机器人回复进入新线程测试test_top_level_mention_uses_thread_session_key验证了这一行为。当includeThreadContext为true时线程内触发的消息会调用GET /api/v4/posts/{root_id}/thread?perPagelimit拉取线程历史拼接为Mattermost thread context before this mention: ...的上下文文本每条消息截断到 500 字符再与当前消息一并交给 agent。发送、流式回复与表情反馈发送时先上传媒体文件获取file_ids再POST /api/v4/posts创建帖子长文本按MATTERMOST_MAX_MESSAGE_LEN 16383字符分块发送。收到消息后先给原帖添加reactEmoji默认eyes表示“处理中”回复完成后移除并添加doneEmoji默认white_check_mark。流式模式下send_delta在内存中累积增量内容结束时一次性落帖post_deleted事件会清理对应的流式缓存发送失败则保留缓冲区以便重试。安全注意事项令牌管理对部署环境将 Mattermost token 存放在环境变量中而不是直接写死在配置文件里配置中的token字段被清单标记为secret。私聊策略需要基于配对码审批时保持dm.policy为allowlist若某天你看到allowFrom: [*]这意味着任何能触达该频道的用户都能与机器人对话请仅在明确有意的场景或私有沙箱临时测试中使用。群组策略在把机器人开放到繁忙频道之前先使用 mention-only 行为降低误触发与刷屏风险。工具权限在邀请机器人进入广泛频道之前审查其文件与 Shell 工具能力可以参考 configuration.md 的 Security 章节 中关于tools.restrictToWorkspace、tools.exec.sandbox、tools.ssrfWhitelist与channels.*.allowFrom的说明。补充建议allowFromMatchMode可切换为username或email匹配用户名/邮箱解析结果会缓存在内存中见_usernames、_user_emails字典降低重复 API 调用。故障排查启动日志报serverUrl and token must be configured检查配置键是否为 camelCaseserverUrl、token确认这两个必填项非空。manifest.py的requiredrequired_fields(serverUrl, token)明确标记了二者为必填字段。DM 被忽略检查dm策略open/allowlist以及 pairing 审批状态用/pairing list查看待处理请求。频道消息被忽略确认消息中 提及了机器人且机器人属于该团队/频道检查teamId是否与机器人实际所在团队一致。线程回复行为异常检查groupPolicyInThread、replyInThread与includeThreadContext三个配置项的组合。WebSocket 频繁掉线nanobot 内置指数退避重连1 秒起、上限 30 秒若长期连不上用nanobot gateway --verbose查看鉴权与网络层面的详细错误。nanobot channels status未显示频道确认配置片段放入了 nanobot 实际读取的 config 文件、频道名拼写无误。后续扩展完整的频道体系与各平台对照表Chat Apps reference配对Pairing机制详解configuration.md#pairing长时间运行的 AI Agent 部署Long-running AI Agent生产环境部署方案deployment.mdMattermost 频道的实现源码与测试runtime.py、manifest.py、test_mattermost_channel.py【免费下载链接】nanobotUltra-lightweight, open-source, self-hosted personal AI agent framework in Python with WebUI, tools, memory, MCP, multi-agent workflows, automation, and chat apps项目地址: https://gitcode.com/gh_mirrors/nanob/nanobot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考