跳转至

Tlon

Tlon 是构建在 Urbit 之上的去中心化即时通讯工具。OpenClaw 会连接到你的 Urbit 飞船,并响应私信和群组聊天消息。默认情况下,群组回复需要 @ 提及,并在其之上叠加授权规则和所有者审批流程。

状态:捆绑插件。支持私信、群组提及、线程、富文本、图片上传/下载以及所有者审批系统。不支持表情回应和投票。

捆绑插件

当前 OpenClaw 版本中,Tlon 以捆绑插件形式提供;打包构建无需单独安装。

在较旧的构建或排除了它的自定义安装中,请从 npm 安装:

openclaw plugins install @openclaw/tlon

使用裸包名可跟踪当前发布标签。仅在需要可复现安装时固定版本(@openclaw/tlon@x.y.z)。

从本地检出安装:

openclaw plugins install ./path/to/local/tlon-plugin

详情:插件

设置

openclaw channels add --channel tlon --ship ~sampel-palnet --url https://your-ship-host --code lidlut-tabwed-pillex-ridrup

或直接编辑配置:

{
  channels: {
    tlon: {
      enabled: true,
      ship: "~sampel-palnet",
      url: "https://your-ship-host",
      code: "lidlut-tabwed-pillex-ridrup",
      ownerShip: "~your-main-ship", // recommended: your ship, always authorized
    },
  },
}

登录码是你飞船的 Web 登录码:在飞船的 dojo 中运行 +code 可打印当前登录码。它会轮换,因此每当认证开始失败时,请重新读取它。

飞船 URL 支持方括号中的 IPv6 字面量,例如 http://[::1]:8080。 回环和私有 IPv6 地址需要启用下文中的私有网络选项。

配置更改遵循热重载。检查 openclaw channels status --probe,如果 Gateway 处于离线状态,请启动它。然后 向机器人发送私信,或在群组频道中 @ 提及它。

入站持久性

OpenClaw 会在代理分发之前持久化已接受的 Tlon 私信和群组聊天事件。待处理或可重试的轮次在 Gateway 重启后仍会保留,并且工作按群组频道或直连对端保持串行化。稳定的 Urbit 消息 ID 还会在其队列记录或保留的完成记录存在期间抑制重复投递的事件。

在队列到代理的边界上,投递至少一次:交接期间崩溃可能会重放一个轮次。因此,产生外部副作用的代理操作在可行时应保持幂等。

私有/LAN 飞船

默认情况下,OpenClaw 会阻止私有/内部主机名和 IP 范围,以防止 SSRF。如果你的 飞船运行在私有网络(localhost、LAN IP、内部主机名)上,请显式启用:

{
  channels: {
    tlon: {
      url: "http://localhost:8080",
      network: {
        dangerouslyAllowPrivateNetwork: true,
      },
    },
  },
}

适用于类似 http://localhost:8080、http://192.168.x.x:8080 和 http://my-ship.local:8080 的目标。仅对你信任的飞船 URL 启用此选项;它会禁用该账户 HTTP 请求的 SSRF 保护。

Note

channels.tlon.allowPrivateNetwork(扁平键)已弃用。openclaw doctor --fix 会自动将其迁移到 channels.tlon.network.dangerouslyAllowPrivateNetwork。

群组频道

手动固定频道,或启用自动发现:

{
  channels: {
    tlon: {
      groupChannels: ["chat/~host-ship/general", "chat/~host-ship/support"],
      autoDiscoverChannels: true,
    },
  },
}

如果配置中未设置,autoDiscoverChannels 默认为 false;设置向导将提示默认设为“是”,并显式写入 true。启用后,OpenClaw 会在启动时探查已加入的群组, 随着群组邀请被接受而监视新频道,并每 2 分钟重新检查一次。

访问控制

私信允许列表(为空 = 除非发送者是 ownerShip,否则不允许私信):

{
  channels: {
    tlon: {
      dmAllowlist: ["~zod", "~nec"],
    },
  },
}

群组授权默认按频道为 restricted。设置 defaultAuthorizedShips 作为基线,并按频道嵌套路径覆盖:

{
  channels: {
    tlon: {
      defaultAuthorizedShips: ["~zod"],
      authorization: {
        channelRules: {
          "chat/~host-ship/general": {
            mode: "restricted",
            allowedShips: ["~zod", "~nec"],
          },
          "chat/~host-ship/announcements": {
            mode: "open",
          },
        },
      },
    },
  },
}

一旦机器人在某个线程中回复过,它就会继续响应该线程中的后续消息,而无需再次提及。

设置 channels.tlon.implicitMentions.threadParticipation: false 可要求对这些后续消息进行新的显式提及。账户覆盖使用 channels.tlon.accounts.<id>.implicitMentions。Tlon 目前不会生成 replyToBot 或 quotedBot 事实,因此这些标志在此处没有效果。

设置 channels.tlon.requireMentionInBotThreads: false 可在本账户的飞船创建了线程根消息时接受未提及的回复,包括第一条回复。将其设置为 true 时,即使机器人已经参与,这些线程也需要新的提及。省略该选项可保留现有的参与策略。根消息作者从已认证的飞船 API 读取; 不可用或非本账户的根消息会保留正常的提及策略。

命名账户可使用 accounts.<id>.requireMentionInBotThreads 覆盖它。按频道的 authorization.channelRules.<nest>.requireMentionInBotThreads 会覆盖账户默认值, 包括通过 Urbit 设置存储提供的规则。对于此选项,已保存的频道规则仅在其设置布尔值时覆盖文件值;旧版仅访问规则会继承文件值。发送者授权仍然适用,并且此选项不会更改 顶层频道帖子或私信。

所有者与审批系统

{
  channels: {
    tlon: {
      ownerShip: "~your-main-ship",
    },
  },
}

所有者飞船在所有地方都经过授权:私信邀请始终自动接受,群组邀请始终自动接受,频道消息始终通过授权。所有者无需位于 dmAllowlist、defaultAuthorizedShips 或 groupInviteAllowlist 中。

当设置 ownerShip 时,未授权请求不会仅仅被丢弃——它们会排队一个待处理审批,并向所有者发送 DM:

  • 来自不在 dmAllowlist 中的飞船的 DM 请求
  • 在频道中,发送者未通过授权时的提及
  • 来自不在 groupInviteAllowlist 中的飞船的群组邀请(当自动接受关闭时,或开启但邀请者不在允许列表中时)

所有者在 DM 中回复以处理请求:

所有者回复 效果
approve / deny / block 处理最近一个待处理审批
approve <id> / deny <id> 按 id 处理特定审批
block 同时在原生层面阻止该飞船,使其无法重新连接
unblock ~ship 撤销原生阻止
blocked 列出当前被阻止的飞船
pending 列出待处理审批请求

未配置 ownerShip 时,未授权的 DM 和频道提及只会被丢弃并记录日志;没有审批提示。

监控器最多接纳 100 个新的待处理审批。来自旧版本的现有审批会被保留,以便升级后所有者的回复仍指向同一请求。当队列已满时,监控器向所有者发送一条饱和通知,并且不再接纳更多唯一请求,直到待处理项被解决。通知投递失败会在每个队列已满事件期间最多重试三次。容量可用后接纳新请求会开始新的事件,因此再次填满队列可能在同一次监控器运行中发送另一条通知。被拒绝的请求方必须在容量可用后重试;待处理的 DM 和群组邀请快照保持可重试,而不是被确认。

自动接受设置

自动接受来自已在 dmAllowlist 中的飞船的 DM 邀请(无论此标志如何,所有者始终自动接受):

{
  channels: {
    tlon: {
      autoAcceptDmInvites: true,
    },
  },
}

自动接受来自允许列表的群组邀请(失败时关闭:当 autoAcceptGroupInvites: true 且 groupInviteAllowlist 为空时,不接受任何非所有者邀请):

{
  channels: {
    tlon: {
      autoAcceptGroupInvites: true,
      groupInviteAllowlist: ["~zod"],
    },
  },
}

通过 Urbit 设置存储热重载

上述大多数设置(dmAllowlist、groupInviteAllowlist、groupChannels、defaultAuthorizedShips、autoDiscoverChannels、autoAcceptDmInvites、autoAcceptGroupInvites、ownerShip、showModelSignature)会在首次运行时镜像到飞船的 %settings agent(desk moltbot,bucket tlon),然后从那里实时读取,因此通过 Landscape 客户端或捆绑 skill 的设置命令所做的更改无需重启 gateway 即可生效。channelRules 和待处理审批也会以 JSON 形式持久化在那里。文件配置仍然是从未写入设置存储的值的真实来源。

投递目标(CLI/cron)

与 openclaw message send 或 cron 投递一起使用:

  • DM:~sampel-palnet 或 dm/~sampel-palnet
  • 群组:chat/~host-ship/channel 或 group:~host-ship/channel

捆绑 skill

插件捆绑了 @tloncorp/tlon-skill,一个用于直接 Urbit 操作的 CLI,安装插件后可自动使用:

  • 活动:提及、回复、未读
  • 频道:列表、创建、重命名
  • 联系人:列表/获取/更新资料
  • 群组:创建、加入、邀请/请求流程、角色
  • 钩子:管理频道钩子
  • 消息:历史记录、搜索
  • DM:发送、反应、接受/拒绝
  • 帖子:反应、删除
  • 笔记本:发布到日记频道
  • 设置:通过上述设置存储热重载插件配置

功能

channels.tlon.mediaMaxMb 以 MiB 为单位限制每个入站图像下载和出站图像加载。命名账户可以使用 accounts.<id>.mediaMaxMb 覆盖它;否则依次应用频道根和 agents.defaults.mediaMaxMb。现有的 6 MiB 上限适用于图像下载和上传。配置了上限后,大小检查或下载失败会导致发送失败,而不是嵌入未经检查的 URL。在成功完成有界下载后的上传失败仍可使用原始 URL。未配置上限时,即使图像无法在该上限内下载,现有的链接回退仍然可用。

功能 状态
直接消息 支持
群组/频道 支持(默认由提及门控)
线程 支持(加入后持续回复)
富文本 Markdown 转换为 Tlon 的原生格式
图像 入站下载,出站上传
反应 仅通过 捆绑 skill
投票 不支持
原生命令 默认仅限所有者

故障排查

openclaw status
openclaw gateway status
openclaw logs --follow
openclaw doctor

常见故障:

  • DM 被忽略:发送者不在 dmAllowlist 中,且未配置 ownerShip 用于审批流程。
  • 群组消息被忽略:频道未被发现/固定,或发送者未通过授权且没有 ownerShip 来排队审批。
  • 连接错误:检查飞船 URL 是否可达;为本地飞船设置 network.dangerouslyAllowPrivateNetwork。
  • 认证错误:登录码会轮换——从你的飞船复制当前登录码。

配置参考

完整配置:配置

| 键 | 含义 |

键 含义
------------------------------------------------------ ----------------------------------------------------------------------------------------------------------------------------
channels.tlon.enabled 启用/禁用频道启动。
channels.tlon.ship 机器人的 Urbit 飞船名称(例如 ~sampel-palnet)。
channels.tlon.url 飞船 URL(例如 https://sampel-palnet.tlon.network)。
channels.tlon.code 飞船登录代码。
channels.tlon.network.dangerouslyAllowPrivateNetwork 允许 localhost/LAN 飞船 URL(SSRF 显式选择加入)。
channels.tlon.ownerShip 所有者飞船:始终已授权,并接收审批请求。
channels.tlon.dmAllowlist 允许发送私信的飞船(为空 = 除所有者外无其他飞船)。
channels.tlon.autoAcceptDmInvites 自动接受来自 dmAllowlist 中飞船的私信。
channels.tlon.autoAcceptGroupInvites 自动接受来自 groupInviteAllowlist 的群组邀请。
channels.tlon.groupInviteAllowlist 其群组邀请会被自动接受的飞船。
channels.tlon.autoDiscoverChannels 自动发现已加入的群组频道(默认:false)。
channels.tlon.implicitMentions.threadParticipation 允许已参与线程中的后续消息绕过提及门控。
channels.tlon.requireMentionInBotThreads 仅在本账户飞船创建的根消息所在的线程中覆盖提及门控;省略时保留现有行为。
channels.tlon.groupChannels 手动固定的频道嵌套。
channels.tlon.defaultAuthorizedShips 所有频道中已授权的飞船(在没有规则匹配时使用)。
channels.tlon.authorization.channelRules 每个频道嵌套的授权模式、允许列表,以及可选的 requireMentionInBotThreads 覆盖。
channels.tlon.showModelSignature 在回复末尾追加 _[Generated by <model>]_。
channels.tlon.responsePrefix 自动回复前缀:字面量、"auto",或模板(例如 "[{model}]");账户覆盖优先,"" 表示禁用。
channels.tlon.accounts.<id> 额外的命名账户(多飞船配置)。

备注

  • 群组回复需要 @ 提及(例如 ~your-bot-ship),除非线程参与或机器人拥有的线程策略允许。
  • 线程回复会落在线程内;机器人还会为代理前置线程上下文的最后 10 条消息。
  • 富文本(粗体、斜体、代码、标题、列表)会转换为 Tlon 的原生格式。
  • 发送一条要求频道摘要的入站消息(例如“总结这个频道”)会触发内置的历史摘要,而不是正常回复流程。
  • Channels Overview — 所有受支持的频道
  • Pairing — 为声明了该功能的频道提供私信身份验证;Tlon 不属于此类,而是使用上述 dmAllowlist 加 ownerShip 审批流程
  • Groups — 群组聊天行为和提及门控
  • Channel routing — 消息的会话路由
  • Security — 访问模型和加固

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw