Tlon
Tlon 是构建在 Urbit 之上的去中心化即时通讯工具。OpenClaw 会连接到你的 Urbit 飞船,并响应私信和群组聊天消息。默认情况下,群组回复需要 @ 提及,并在其之上叠加授权规则和所有者审批流程。
状态:捆绑插件。支持私信、群组提及、线程、富文本、图片上传/下载以及所有者审批系统。不支持表情回应和投票。
捆绑插件¶
当前 OpenClaw 版本中,Tlon 以捆绑插件形式提供;打包构建无需单独安装。
在较旧的构建或排除了它的自定义安装中,请从 npm 安装:
使用裸包名可跟踪当前发布标签。仅在需要可复现安装时固定版本(@openclaw/tlon@x.y.z)。
从本地检出安装:
详情:插件
设置¶
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,否则不允许私信):
群组授权默认按频道为 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 设置存储提供的规则。对于此选项,已保存的频道规则仅在其设置布尔值时覆盖文件值;旧版仅访问规则会继承文件值。发送者授权仍然适用,并且此选项不会更改
顶层频道帖子或私信。
所有者与审批系统¶
所有者飞船在所有地方都经过授权:私信邀请始终自动接受,群组邀请始终自动接受,频道消息始终通过授权。所有者无需位于 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 邀请(无论此标志如何,所有者始终自动接受):
自动接受来自允许列表的群组邀请(失败时关闭:当 autoAcceptGroupInvites: true 且 groupInviteAllowlist 为空时,不接受任何非所有者邀请):
通过 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 |
| 投票 | 不支持 |
| 原生命令 | 默认仅限所有者 |
故障排查¶
常见故障:
- 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