对等组
**对等组(peer group)**声明了代理在某个通道上接受来自哪些方的入站消息,以及它可以在该通道上与哪些其他代理交换消息。它是聊天通道的入站网关,也是跨代理分发的路由原语。在配置中,它位于 [peer_groups.<name>]。关于对等组如何融入代理的连接配置,请参阅 Agents。
入站发送方会根据为绑定 agent 解析出的 peer set 进行门控,该集合取自该 agent 所属的每个 [peer_groups.<name>] 块。匹配时会去除开头的 @,并以不区分大小写的方式与通道的原生发送方标识符进行比对。空集合会拒绝所有人;包含 "*" 的集合会接受任何人;否则仅接受所列出的 external_peers(及 peer agent)。这与网关配对([gateway] require_pairing)相互独立,后者验证的是 HTTP/WebSocket 客户端,而非聊天通道的发送方。
字段
[peer_groups.<name>] 块包含:
| 字段 | 含义 |
|---|---|
channel | 频道类型("telegram",应用于该类型的每个别名)或带点的别名("telegram.work",仅作用于该单个实例)。 |
agents | 按别名划分的成员代理。只有当两个代理同时出现在同一组中时,它们才互为对等代理;成员关系是相互的。 |
external_peers | 按渠道的原生用户名/ID 列出的非客服成员。["*"] 表示接受任何人;为空则不接受任何人。 |
ignore | 按组的阻止列表;从解析的对等节点集合中减去。 |
output_modality | 群组的首选回复方式:mirror(由输入驱动,默认值)、voice(在支持音频的频道上始终以 TTS 语音形式回复并主动推送消息)或 text(始终使用文本)。 |
admin_for_agent_scope | 当为 true 时,组的 external_peers 被授权在绑定的代理上发出 /model --agent <model>。默认 false(默认拒绝)。请参阅 Admin agent-scope authorization。 |
分辨率
对于给定的代理,运行时会遍历该代理所在的每个组,将其他成员的别名(作为代理对等方)与该组通道上的 external_peers 取并集,然后减去 ignore 列表。代理自身的别名会被防御性地移除,以避免自循环。不属于任何对等组的代理将独立运行,不进行跨代理调度。
每个通道用于匹配的发送者标识符因平台而异(Telegram 用户 ID、Matrix @user:server、E.164 号码、UUID……)。每个通道页面都会说明它所期望的标识符格式。
示例
一个名为例如 my_discord_group 的 discord 对等组设置 channel = "discord",在 external_peers 中允许 111111111111111111,将对等代理命名为 researcher、summariser,并通过 ignore 屏蔽 222222222222222222。可通过网关仪表板、zerocode 或 zeroclaw config set 进行设置。
每个通道页面都会展示带有该通道发送方标识符形态的指令形式。
管理员代理范围授权
admin_for_agent_scope = true 扩展了组的权限边界:除了作为可路由对等端之外,每个 external_peers 成员还被允许在已绑定的 agent 上发出 /model --agent <model>,也就是将该 agent 的 binding 切换到默认值以外的模型。该标志默认是拒绝的:每个未显式设置为 true 的组都会拒绝此能力,包括 external_peers 非空的组。/model --user <model>(仅会话覆盖,不重新绑定 agent)不受此标志限制,对每个被接受的对等端都可用。
协调器会直接从 Config::channel_agent_scope_admins 实时解析已授权的管理员集合,但派发门控读取的是运行时启动时所使用的配置快照。因此,对 admin_for_agent_scope(或某个组的 external_peers / channel / agents)所做的操作员修改,只会在下一次守护进程重启时生效,而不会影响正在运行的进程。仅在运行中的守护进程上切换该标志,本身不会在当前会话中授权任何新的发送方。
这是有意为之:授权是针对启动时不可变的配置计算的,因此在运行过程中被_添加_到管理员组的对等方,无法在当前进程生命周期内提升权限。该集合只有在完整配置重新加载时才会重新解析,而这本身就是一种重启路径。如果一次 /model --agent 调用对你预期应在范围内的发送方报告“not authorized”,请在编辑 admin_for_agent_scope 后重启守护进程,并在新的客户端会话中重新发出该命令,然后再得出进一步结论。