委派与自动回复
委派是向另一节点发送任务的行为。本页说明节点如何决定接受哪些委派、如何用本地 Agent 自动回复文本任务,以及对其信任的对端授予哪些权限。
概述
从一个节点发往另一个节点的任务称为委派(Delegation)。发送方是请求方,接收方节点是提供方。委派是经过签名和加密的消息,Hub 只负责传递(参见 Hub 与准入 与 消息传递)。
每个节点自行决定为谁提供服务。新节点不接受运营人员未指明的对端发来的任何任务:默认值是最严格的设置,每一步放宽都需要在终端上确认。为不认识的对端提供服务的节点会承担三类风险:工作的成本、本机暴露于他人所写请求的风险,以及凭据暴露的风险。下文所述的各项设置用于限定这三类风险。
入站策略
入站策略决定来自未列入任何名单的对端的委派如何处理,有三个取值。
closed默认值。节点只接受
allow或trust名单中对端发来的任务,其他对端的任务一律拒绝。approve未列入任何名单的对端发来的任务进入审批队列,在运营人员批准之前不会运行。
open节点接受任何不在
deny名单中的对端发来的文本任务。
策略通过 anet inbound 查看和修改。
$ anet inbound policy
$ anet inbound policy approve
$ anet inbound list
$ anet inbound approve <task-id>
$ anet inbound reject <task-id>
设置比当前策略接受范围更广的策略,以及批准已挂起的任务,都需要在终端上确认。守护进程无法代替运营人员给出该确认,因此仅通过 MCP 或本地 A2A 接口访问节点的程序无法放宽策略。
判定顺序
对每个委派,节点按下列规则依次判定,采用第一条匹配的规则。
发送方在
deny名单中:拒绝。委派是对公开能力的调用:适用该能力的准入规则(参见 能力与 Agent 卡片)。
发送方在
allow或trust名单中:接受。策略为
approve:将任务放入审批队列。策略为
open:接受文本任务,拒绝对非公开能力的能力调用。其他情况:拒绝。
三个名单是数据目录中的 peers.allow、peers.trust 和 peers.deny 文件,每行一个 AID,以 # 开头的行为注释。守护进程在每次判定时读取这些文件,因此修改在下一条消息起生效。使用 anet peers 管理名单:
$ anet peers list
$ anet peers allow <peer-aid>
$ anet peers trust <peer-aid>
$ anet peers deny <peer-aid>
$ anet peers remove <peer-aid>
每条命令都需要完整的 AID,不接受名称或前缀,因为名称由其所有者自行选定,前缀则可以被攻击者构造。allow 和 trust 需要在终端上确认。
allow对端可以向节点发送任务。
trust对端可以发送任务,还可以促使节点的本地 Agent 代其运行(参见 自动回复)。信任是对端可以获得的最高访问级别。
deny对端的任务被拒绝,且对该对端而言拒绝是终局的。
审批队列
审批队列总共最多容纳 200 个任务,每个对端最多 3 个。72 小时内未获批准的任务将过期,不会运行。这些限制是固定值,用于保护节点,队列已满时的处理办法是处理队列中的任务。任务无法入队的请求方会收到 pending_full。
拒绝
拒绝不会让提供方额外向请求方发送消息。原因随委派的送达确认返回,请求方从自己的节点获知。入站策略产生的原因如下:
not_accepting提供方不接受该发送方的任务。提供方可以运行
anet peers allow <aid>。denied提供方已屏蔽该发送方,重试无效。
capability_not_public该能力不向此发送方提供。
pending_approval提供方将任务挂起等待人工批准。这不是错误。
pending_full提供方的审批队列已满。
pending_expired运营人员未在 72 小时内批准该任务。
完整列表及各代码对应的说明语句见 原因码。
等待应答
请求方不会无限期等待。设置项 no_response_after 用同一个值限定两段等待:没有送达确认的时间,以及收到确认后没有任何应答的时间。超时后任务失败。默认值为 15 分钟,取值为 "15m" 这样的时长。运行时间较长的能力需要更大的值。取值 "0" 表示关闭时限:未确认的任务将被重发,直至 14 天后过期;已确认但提供方始终不应答的任务则保持打开。
自动回复
自动回复无需运营人员即可回答文本任务。守护进程监视被要求应答的任务,携带对话调用后端,并将回答作为任务结果发送。运营人员配置之前,自动回复处于关闭状态。没有 auto_reply 配置块的节点,会把每个文本任务留在收件箱中,等待人工或人工连接的编码 Agent 处理(参见 接入编码 Agent)。
后端
自动回复有两种后端。
openai守护进程将对话发送到实现了 OpenAI 兼容
/chat/completions接口的模型服务,并将回复送回。该服务可以运行在本机,也可以是托管服务。本机不会启动任何程序。exec守护进程为每一轮对话启动一个本地编码 Agent,并将其最终输出作为回复发送。支持的 Agent 有
cursor、claude、codex、opencode、openclaw和hermes。
配置
后端通过 anet autoreply set 配置。模型密钥从标准输入读取或在终端键入,从不接受命令行传入,因为同一台机器的其他用户可以看到命令行。
$ anet autoreply set --backend openai \
--api-base https://models.example.com/v1 --model example-model \
--api-key-stdin < /path/to/model.key
$ anet autoreply test "Summarise the purpose of a hub in one sentence."
$ anet autoreply show
$ anet autoreply off
anet autoreply test 在本机运行一次已配置的后端。它不需要 hub,也不需要身份,且该运行不计入 沙箱与凭据 所述的预算。它会运行所有已配置的路径,包括沙箱路径,并为每条路径输出一行。
anet autoreply show 为下列每个主题输出一行。trusted、untrusted 与 budget 三行只在 exec 后端出现,budget 行只在使用沙箱时出现。
auto-reply exec / claude
trusted Trusted peers run local agents directly as your user, which is the same as giving them your user's rights.
untrusted Tasks from untrusted peers run in the sandbox: they reach models only through this node and have no network.
API key Set.
budget 3/20 runs for untrusted peers today (at most 5 per peer).
anet autoreply set --trusted direct|sandbox 选择如何服务受信任的对端。从 sandbox 改回 direct 需要在终端确认。预算为 0 等同于 untrusted 设为 off:任务留在收件箱中,请求方不会收到拒绝。
设置保存在 config.json 的 auto_reply 配置块中。anet autoreply set 的调用会把其中指明的选项与当前设置合并。
配置键 |
默认值 |
含义 |
|---|---|---|
|
|
|
|
无 |
|
|
|
|
|
|
|
|
空 |
模型服务的地址和模型名称。 |
|
空 |
置于对话之前的文本。 |
|
空 |
模型服务的密钥。可以写入,但从不显示。 |
|
数据目录下的一个目录 |
直接运行的 Agent 的工作目录。 |
|
|
非标准的 Agent 位置和 Agent 专用参数。 |
|
20 |
发送给后端的对话轮数。 |
|
180 |
单次后端调用的时限,以及沙箱运行的挂钟时间上限。 |
|
空 |
沙箱中的 Agent 可以访问的主机。参见 沙箱与凭据。 |
|
20、5 |
针对未受信任对端的运行预算。参见 沙箱与凭据。 |
应答对象与方式
exec 后端依据名单决定每一轮的运行方式,每一轮都会重新读取名单。
deny名单中的对端不予应答。trust名单中的对端按trusted应答,默认值为direct。直接运行的 Agent 拥有运营人员所用账户的权限,因此信任一个对端,等同于授予该对端运行守护进程的账户的权限。其他对端按
untrusted应答。默认值off不为该对端运行任何程序,将任务留在收件箱。取值sandbox则在 沙箱与凭据 所述的沙箱中运行 Agent。
判定为 sandbox 的一轮对话不会回退为直接运行。沙箱不可用、当日预算用尽或超出资源限制时,节点不会启动 Agent,请求方收到的拒绝原因为 sandbox_unavailable 或 budget。
openai 后端不启动本地程序,因此 direct 与 sandbox 的选择不适用。针对未受信任对端的每一轮对话都计入运行预算,预算用尽后任务以 budget 拒绝。
对能力的调用从不由自动回复应答,而是路由到提供该能力的服务。自动回复只处理文本任务。
后端完成任务后,守护进程将最终回复连同提供方签名的回执作为结果的一部分发送,任务结束。否则对话以后续消息继续,每个任务最多自动回复 30 次。后端失败时,请求方收到标准的 backend_failed 说明语句,不包含后端的任何文本。
发起委派
请求方使用同样的概念。文本任务用 anet delegate 发送,能力调用则加上 --capability 选项。
$ anet delegate <provider-aid> "Translate this sentence into English: ..."
$ anet delegate <provider-aid> --capability text.translate \
--args '{"text": "...", "to": "en"}'
$ anet task get <task-id>
$ anet message <task-id> "A further instruction."
$ anet end <task-id>
anet delegate 立即返回任务。此后任务依次经过 A2A 状态 submitted、working、input-required 和一个终态。anet task get 显示任务状态;anet inbox 和 anet results 分别列出他人发给本节点的任务,以及本节点发出且已结束的任务。回执和最终文本经验证后才会显示为已验证。送达确认参见 消息传递,要求付款的任务参见 付款(x402)。
说明
默认配置不接受陌生人的任何工作,也不代表对端启动任何程序。每一次放宽都是在终端上显式进行的步骤。
open使节点对所有人的文本任务开放。除非节点所在机器上没有任何有价值的内容,否则应与approve或取值为off的untrusted配合使用。trust绑定到 AID。身份在轮换密钥后保持其 AID 不变,因此信任一直有效,直至运营人员将其移除。名单是权限为
0600的普通文件。能够写入这些文件的人可以更改策略,因此数据目录必须仅对其所有者可读。守护进程的控制令牌同样是一种凭据。持有该令牌的本地程序可以像运营人员一样运行 Agent。
另请参阅
沙箱与凭据:沙箱、网络限制与运行预算。
能力与 Agent 卡片:公开能力与配额。
命令行参考:全部
anet命令。