Matrix (插件)
Matrix 是 OpenClaw 的 Matrix 渠道插件。 它使用官方matrix-js-sdk,并支持私信、房间、话题、媒体、回应、投票、位置和 E2EE。
所需插件
Matrix 是一个插件,未随 OpenClaw 核心打包。 从 npm 安装:设置
- 安装该插件。
- 在您的家庭服务器上创建一个 Matrix 账户。
- 配置
channels.matrix,使用以下任一方式:homeserver+accessToken,或homeserver+userId+password。
- 重启网关。
- 开始与机器人私信,或将其邀请到房间。
- 家庭服务器 URL
- 认证方式:访问令牌或密码
- 用户 ID(仅在选择密码认证时)
- 可选设备名称
- 是否启用 E2EE
- 是否现在配置 Matrix 房间访问权限
- 如果所选账户的 Matrix 认证环境变量已存在,且该账户尚未在配置中保存认证信息,向导将提供环境变量快捷方式,并仅为该账户写入
enabled: true。 - 当您以交互方式添加另一个 Matrix 账户时,输入的账户名称将被规范化为配置和环境变量中使用的账户 ID。例如,
Ops Bot会变成ops-bot。 - 私信允许列表提示会立即接受完整的
@user:server值。显示名称仅在实时目录查找找到一个精确匹配时有效;否则,向导会要求您使用完整的 Matrix ID 重试。 - 房间允许列表提示直接接受房间 ID 和别名。它们也可以实时解析已加入房间的名称,但未解析的名称仅在设置期间按输入保留,并在稍后被运行时允许列表解析忽略。建议使用
!room:server或#alias:server。 - 运行时的房间/会话身份使用稳定的 Matrix 房间 ID。房间声明的别名仅用作查找输入,不作为长期会话密钥或稳定的群组身份。
- 若要在保存房间名称之前解析它们,请使用
openclaw channels resolve --channel matrix "Project Room"。
~/.openclaw/credentials/matrix/ 中。
默认账户使用 credentials.json;命名账户使用 credentials-<account>.json。
等效的环境变量(在未设置配置键时使用):
MATRIX_HOMESERVERMATRIX_ACCESS_TOKENMATRIX_USER_IDMATRIX_PASSWORDMATRIX_DEVICE_IDMATRIX_DEVICE_NAME
MATRIX_<ACCOUNT_ID>_HOMESERVERMATRIX_<ACCOUNT_ID>_ACCESS_TOKENMATRIX_<ACCOUNT_ID>_USER_IDMATRIX_<ACCOUNT_ID>_PASSWORDMATRIX_<ACCOUNT_ID>_DEVICE_IDMATRIX_<ACCOUNT_ID>_DEVICE_NAME
ops 的示例:
MATRIX_OPS_HOMESERVERMATRIX_OPS_ACCESS_TOKEN
ops-bot,请使用:
MATRIX_OPS_BOT_HOMESERVERMATRIX_OPS_BOT_ACCESS_TOKEN
配置示例
这是一个包含私信配对、房间允许列表并启用了 E2EE 的实用基准配置:E2EE 设置
Bot 到 bot 房间
默认情况下,来自其他已配置 Matrix OpenClaw 账户的 Matrix 消息将被忽略。 当您有意需要代理间的 Matrix 流量时,请使用allowBots:
allowBots: true接受来自允许的房间和私信中其他已配置 Matrix bot 账户的消息。allowBots: "mentions"仅当这些消息在房间中明确提及此 bot 时才接受它们。私信仍然是被允许的。groups.<room>.allowBots会覆盖单个房间的账户级设置。- OpenClaw 仍会忽略来自同一 Matrix 用户 ID 的消息,以避免自回复循环。
- Matrix 在此处不暴露原生的机器人标记;OpenClaw 将“机器人撰写”视为“在此 OpenClaw 网关上由另一个配置的 Matrix 账户发送”。
channels.matrix.accounts 配合每个账户的凭据和可选的 name。有关共享模式,请参阅配置参考。
详细引导诊断:
verify 命令都是简洁的(包括安静的内部 SDK 日志记录),仅在使用 --verbose 时才显示详细的诊断信息。
在编写脚本时,请使用 --json 获取完整的机器可读输出。
在多账户设置中,Matrix CLI 命令使用隐式的 Matrix 默认账户,除非您传递 --account <id>。
如果您配置了多个命名账户,请先设置 channels.matrix.defaultAccount,否则那些隐式 CLI 操作将停止并要求您明确选择一个账户。
每当您希望验证或设备操作明确针对命名账户时,请使用 --account:
channels.matrix.accounts.assistant.encryption。
“已验证”的含义
只有当此 Matrix 设备经过您自己的交叉签名身份验证时,OpenClaw 才将其视为已验证。 实际上,openclaw matrix verify status --verbose 暴露了三种信任信号:
Locally trusted:此设备仅受当前客户端信任Cross-signing verified:SDK 通过交叉签名报告该设备已验证Signed by owner:该设备由您自己的自签名密钥签名
Verified by owner 才会变为 yes。
仅靠本地信任不足以让 OpenClaw 将该设备视为完全已验证。
Bootstrap 的作用
openclaw matrix verify bootstrap 是用于加密 Matrix 账户的修复和设置命令。
它按顺序执行以下所有操作:
- 引导密钥存储,尽可能重用现有的恢复密钥
- 引导交叉签名并上传缺失的公共交叉签名密钥
- 尝试标记并对当前设备进行交叉签名
- 如果尚不存在,则创建新的服务器端房间密钥备份
m.login.dummy,再在配置了 channels.matrix.password 时使用 m.login.password。
仅当您有意放弃当前的交叉签名身份并创建新身份时,才使用 --force-reset-cross-signing。
如果您有意放弃当前的房间密钥备份并为将来的消息启动新的备份基线,请使用 openclaw matrix verify backup reset --yes。
仅当您接受无法恢复的旧加密历史记录将保持不可用时,才执行此操作。
全新的备份基线
如果您想保持未来的加密消息正常工作并接受丢失无法恢复的旧历史记录,请按顺序运行以下命令:--account <id> 添加到每个命令中。
启动行为
当encryption: true 时,Matrix 默认将 startupVerification 设置为 "if-unverified"。
启动时,如果此设备仍未验证,Matrix 将在另一个 Matrix 客户端中请求自验证,
当已有请求待处理时跳过重复请求,并在重启后重试前应用本地冷却。
默认情况下,失败的请求尝试比成功创建请求的重试频率更高。
设置 startupVerification: "off" 以禁用自动启动请求,或调整 startupVerificationCooldownHours
如果您希望缩短或延长重试窗口。
启动时还会自动执行保守的加密引导程序。
该过程首先尝试重用当前的密钥存储和交叉签名身份,并避免重置交叉签名,除非您运行显式的引导程序修复流程。
如果启动时发现引导程序状态损坏并配置了 channels.matrix.password,OpenClaw 可以尝试更严格的修复路径。
如果当前设备已由所有者签名,OpenClaw 将保留该身份而不是自动重置它。
从以前的公共 Matrix 插件升级:
- OpenClaw 会尽可能自动重复使用相同的 Matrix 账户、访问令牌和设备身份。
- 在运行任何可操作的 Matrix 迁移更改之前,OpenClaw 会在
~/Backups/openclaw-migrations/下创建或重复使用恢复快照。 - 如果您使用多个 Matrix 账户,请在从旧的扁平存储布局升级之前设置
channels.matrix.defaultAccount,以便 OpenClaw 知道哪个帐户应该接收该共享的旧版状态。 - 如果以前的插件在本地存储了 Matrix 房间密钥备份解密密钥,启动或
openclaw doctor --fix将自动将其导入到新的恢复密钥流程中。 - 如果在准备迁移后 Matrix 访问令牌发生了更改,启动现在会扫描同级令牌哈希存储根目录以查找待处理的旧版恢复状态,然后再放弃自动备份恢复。
- 如果对于同一帐户、主服务器和用户,Matrix 访问令牌稍后发生变化,OpenClaw 现在倾向于重复使用最完整的现有令牌哈希存储根目录,而不是从空的 Matrix 状态目录开始。
- 在下一次网关启动时,备份的房间密钥将自动恢复到新的加密存储中。
- 如果旧插件有从未备份的仅本地房间密钥,OpenClaw 将明确发出警告。由于这些密钥无法从先前的 rust crypto 存储自动导出,因此一些旧的加密历史记录可能需要手动恢复后才能查看。
- 有关完整的升级流程、限制、恢复命令和常见迁移信息,请参阅 Matrix 迁移。
~/.openclaw/matrix/accounts/<account>/<homeserver>__<user>/<token-hash>/ 中。
当启用这些功能时,该目录包含同步存储(bot-storage.json)、加密存储(crypto/)、
恢复密钥文件(recovery-key.json)、IndexedDB 快照(crypto-idb-snapshot.json)、
线程绑定(thread-bindings.json)和启动验证状态(startup-verification.json)。
当令牌更改但账号身份保持不变时,OpenClaw 会为该账号/主服务器/用户组合重用最佳的现有
根目录,以便先前的同步状态、加密状态、线程绑定
和启动验证状态保持可见。
Node 加密存储模型
此插件中的 Matrix E2EE 使用官方matrix-js-sdk Node 中的 Rust 加密路径。
当您希望加密状态在重启后依然存在时,该路径需要基于 IndexedDB 的持久化支持。
OpenClaw 目前在 Node 中通过以下方式实现这一点:
- 使用
fake-indexeddb作为 SDK 预期的 IndexedDB API 适配层 - 在
initRustCrypto之前,从crypto-idb-snapshot.json恢复 Rust 加密 IndexedDB 内容 - 在初始化后和运行期间,将更新的 IndexedDB 内容持久化回
crypto-idb-snapshot.json
- 添加 SecretRef 支持以持久化 Matrix 密钥材料,以便可以从 OpenClaw 密钥提供程序获取恢复密钥和相关的存储加密密钥,而不仅仅是从本地文件获取。
自动验证通知
Matrix 现在将验证生命周期通知直接作为m.notice 消息发布到严格的私信验证房间中。
包括:
- 验证请求通知
- 验证就绪通知(包含明确的“通过表情符号验证”指引)
- 验证开始和完成通知
- SAS 详细信息(表情符号和十进制),如果有
NO_REPLY。
设备卫生
旧的由 OpenClaw 管理的 Matrix 设备可能会在帐户上累积,从而使得加密房间的信任更难以推断。 使用以下命令列出它们:直接房间修复
如果私信状态不同步,OpenClaw 可能最终会得到陈旧的m.direct 映射,这些映射指向旧的独立房间而不是当前的私信。使用以下命令检查对等方的当前映射:
- 它更倾向于
m.direct中已映射的严格 1:1 私信 - 否则,它会回退到与该用户加入的任何当前严格的 1:1 私信
- 如果不存在健康的私信,它会创建一个新的直接房间并重写
m.direct以指向该房间
线程
Matrix 支持用于自动回复和消息工具发送的原生 Matrix 线程。threadReplies: "off"将回复保持在顶层。threadReplies: "inbound"仅在入站消息已位于该线程中时才在线程内回复。threadReplies: "always"将房间回复保持在以触发消息为根的线程中。- 入站线程消息包含线程根消息作为额外的代理上下文。
- 当目标是同一房间或同一私信用户目标时,消息工具发送现在会自动继承当前的 Matrix 线程,除非提供了显式的
threadId。 - Matrix 支持运行时线程绑定。
/focus、/unfocus、/agents、/session idle、/session max-age和线程绑定的/acp spawn现在可在 Matrix 房间和私信中工作。 - 顶层 Matrix 房间/私信
/focus在threadBindings.spawnSubagentSessions=true时会创建一个新的 Matrix 线程并将其绑定到目标会话。 - 在现有 Matrix 线程内运行
/focus或/acp spawn --thread here会改为绑定该当前线程。
线程绑定配置
Matrix 继承session.threadBindings 的全局默认值,并且还支持每个渠道的覆盖设置:
threadBindings.enabledthreadBindings.idleHoursthreadBindings.maxAgeHoursthreadBindings.spawnSubagentSessionsthreadBindings.spawnAcpSessions
- 设置
threadBindings.spawnSubagentSessions: true以允许顶层/focus创建并绑定新的 Matrix 线程。 - 设置
threadBindings.spawnAcpSessions: true以允许/acp spawn --thread auto|here将 ACP 会话绑定到 Matrix 线程。
反应
Matrix 支持出站反应操作、入站反应通知和入站确认反应。- 出站表情回应工具由
channels["matrix"].actions.reactions控制。 react向特定的 Matrix 事件添加表情回应。reactions列出特定 Matrix 事件的当前表情回应摘要。emoji=""移除机器人账户在该事件上的所有表情回应。remove: true仅从机器人账户中移除指定的表情回应。
channels["matrix"].accounts.<accountId>.ackReactionchannels["matrix"].ackReactionmessages.ackReaction- 代理身份表情回退
channels["matrix"].accounts.<accountId>.ackReactionScopechannels["matrix"].ackReactionScopemessages.ackReactionScope
channels["matrix"].accounts.<accountId>.reactionNotificationschannels["matrix"].reactionNotifications- 默认值:
own
reactionNotifications: "own"转发新增的m.reaction事件,当它们针对机器人发送的 Matrix 消息时。reactionNotifications: "off"禁用表情回应系统事件。- 表情回应移除仍未被合成为系统事件,因为 Matrix 将其展示为撤销,而非独立的
m.reaction移除。
私信和房间策略示例
多账户示例
channels.matrix 值作为命名账户的默认值,除非某个账户覆盖了它们。
当您希望 OpenClaw 为隐式路由、探测和 Matrix 操作优先使用某个命名 CLI 账户时,请设置 defaultAccount。
如果您配置了多个命名账户,请为依赖隐式账户选择的 CLI 命令设置 defaultAccount 或传递 --account <id>。
当您想为单个命令覆盖该隐式选择时,请将 --account <id> 传递给 openclaw matrix verify ... 和 openclaw matrix devices ...。
私有/LAN 主服务器
默认情况下,为了防止 SSRF 攻击,OpenClaw 会阻止私有/内部 Matrix 主服务器,除非您 针对每个账户明确选择加入。 如果您的主服务器运行在 localhost、LAN/Tailscale IP 或内部主机名上,请为该 Matrix 账户启用allowPrivateNetwork:
http://matrix.example.org:8008)仍然被阻止。请尽可能优先使用 https://。
目标解析
当 Matrix 要求您在任何地方提供房间或用户目标时,OpenClaw 接受这些目标形式:- 用户:
@user:server、user:@user:server或matrix:user:@user:server - 房间:
!room:server、room:!room:server或matrix:room:!room:server - 别名:
#alias:server、channel:#alias:server或matrix:channel:#alias:server
- 用户查找会查询该主服务器上的 Matrix 用户目录。
- 房间查找直接接受显式的房间 ID 和别名,然后回退到搜索该账户已加入的房间名称。
- 已加入房间名称的查找是尽力而为的。如果房间名称无法解析为 ID 或别名,它将在运行时允许列表解析中被忽略。
配置参考
enabled:启用或禁用渠道。name:账户的可选标签。defaultAccount:当配置了多个 Matrix 账户时首选的账户 ID。homeserver:主服务器 URL,例如https://matrix.example.org。allowPrivateNetwork:允许此 Matrix 账户连接到私有/内部主服务器。当主服务器解析为localhost、LAN/Tailscale IP 或内部主机(如matrix-synapse)时,请启用此选项。userId:完整的 Matrix 用户 ID,例如@bot:example.org。accessToken:基于令牌的身份验证的访问令牌。password:基于密码登录的密码。deviceId:显式 Matrix 设备 ID。deviceName:密码登录的设备显示名称。avatarUrl:存储的个人头像 URL,用于个人资料同步和set-profile更新。initialSyncLimit:启动同步事件限制。encryption:启用 E2EE。allowlistOnly:对私信和房间强制执行仅限允许列表的行为。groupPolicy:open、allowlist或disabled。groupAllowFrom:用于房间流量的用户 ID 允许列表。groupAllowFrom条目应为完整的 Matrix 用户 ID。未解析的名称在运行时将被忽略。replyToMode:off、first或all。threadReplies:off、inbound或always。threadBindings:用于线程绑定会话路由和生命周期的渠道覆盖设置。startupVerification:启动时的自动自我验证请求模式(if-unverified、off)。startupVerificationCooldownHours:重试自动启动验证请求之前的冷却时间。textChunkLimit:出站消息块大小。chunkMode:length或newline。responsePrefix: 出站回复的可选消息前缀。ackReaction: 此渠道/账号的可选确认反应覆盖。ackReactionScope: 可选的确认反应范围覆盖 (group-mentions,group-all,direct,all,none,off)。reactionNotifications: 入站反应通知模式 (own,off)。mediaMaxMb: 出站媒体大小上限(MB)。autoJoin: 邀请自动加入策略 (always,allowlist,off)。默认值:off。autoJoinAllowlist: 当autoJoin为allowlist时允许的房间/别名。别名条目会在邀请处理期间解析为房间 ID;OpenClaw 不信任被邀请房间声明的别名状态。dm: 私信策略块 (enabled,policy,allowFrom)。dm.allowFrom条目应为完整的 Matrix 用户 ID,除非您已通过实时目录查找对其进行了解析。accounts: 命名的按账号覆盖。顶级channels.matrix值作为这些条目的默认值。groups: 按房间策略映射。优先使用房间 ID 或别名;未解析的房间名在运行时会被忽略。会话/组标识在解析后使用稳定的房间 ID,而人类可读的标签仍来自房间名。rooms:groups的旧版别名。actions:针对每个动作的工具门控(messages、reactions、pins、profile、memberInfo、channelInfo、verification)。
本页面源自 openclaw/openclaw,由 BeaversLab 翻译,遵循 MIT 协议 发布。