已知局限
本页列出 ANet 0.3 中其他页面未说明的局限:保护在何处终止、哪些行为与规范不一致,以及本版本不做的事项。关于机密性、前向保密、身份密钥、支付和本地执行的局限,参见 安全模型。列出这些局限,是为了在决定把数据交给网络之前,对其有充分了解。
任务与消息
- 阻塞调用会等到任务需要的时间
通过本机 A2A 接口发出、且未设置
return_immediately的SendMessage,只有在任务到达终态或中断态时才返回。对方节点离线时,这可能需要很长时间。客户端一侧的超时不会取消任务:任务继续运行,可能已在自动付款限额内付过款,而重复调用会产生第二个任务。按contextId与messageId去重,对每次调用都生成新messageId的客户端无效。要找到先前的任务,可用ListTasks按contextId查询,或用 MCP 工具list_tasks按context_id过滤。- 任务在 15 分钟内没有任何回音即失败
本节点发出的任务,在送达后的
no_response_after(默认 15 分钟)内完全没有收到对方 agent 的任何信息(无状态、无消息、无结果)时,节点会以原因no_response使其失败,效果状态为UNVERIFIED。节点无法区分未告知的拒绝与迟缓的回答:尚未有人回复的文本任务,以及离线时间超过期限的 agent,都会这样结束。开始一次长调用的 agent 会先发送working。之后才到达的结果仍会被验证并记录在任务上,但任务结束之后才到达的提问或中间回复不会被保留。需要长时间等待时,可调大no_response_after(例如"24h"),或将其设为"0"。- 终态不等于成功
A2A 状态
completed只表示任务已运行到结束。对于能力调用,效果由anet.effect_status单独报告(UNVERIFIED表示节点无法判断效果是否发生),回执是否通过检查由anet.receipt_verified报告。两者都不会并入状态之中。- 结果未知从存在连接时开始
service模块或 ANetLink 调用后端时,传输层已为请求取得连接之后的任何错误(超时、连接中断、写入请求时失败),即使没有写出任何字节,也报告为结果未知(UNVERIFIED,原因为timeout或connection_lost)。只有确定什么都没有发出的失败(连接被拒、套接字不存在、路径未通过检查、连接建立前已超过期限)才是UNAVAILABLE。请求方在重复调用之前,应先向提供方确认。approve策略下带文件的调用待批任务的队列不保存文件字节。因此,运营人员批准的带文件的调用不会运行,请求方会得到文件数量(
files_count)的告知。被重启打断的带文件调用不会重新运行,而以interrupted结束。- 回执不能证明请求方说过的话
anet.receipt_verified=verified表示提供方的签名成立,且回执与本次交互、双方、本节点的请求以及结果字节相符。对于文本任务,回执覆盖的是提供方交付的对话记录;节点不会把该记录与自己的消息日志逐行比对。要核对说过什么,应以请求方自己的消息日志为准。
证据
- 通过验证的证据链仍可能被截短
anet verify --chain成功的含义是:每条记录都由密钥历史的 AID 签名,每条记录的标识经重新计算无误,且记录向回链接到第一条。提前结束的链同样有效。只有--head——给出从别处(见证方或较早的导出)获知、并在链中找到的一条记录——才能排除截短。- 事件可能缺失
事件在业务事务之后才写入证据链。两者之间发生崩溃,会丢失该事件且不留任何标记。因此
anet audit把“不在链上”视为“未知”,而不是“没有发生”。
对端与策略
- 拒绝对端不会撤销已付款的工作
把对端移到拒绝名单时,其进行中的任务会被取消。已提交或已完成付款的任务会运行到结束并交付,并在事件
anet.policy.changed的skipped_paid下列出。- 被拒绝的对端能否察觉
在
closed策略下,拒绝名单中的对端得到的回答与陌生人相同。当节点配置了公开能力时,被拒绝的对端调用其中一项会被拒绝,而陌生人会得到服务,对端因此可以察觉。在approve与open策略下,被拒绝的对端总能察觉。- 终端确认只约束部分 agent
anet pay、anet peers allow、anet inbound approve以及更改支出限额,都要求在终端确认。该检查在命令行程序中进行。这些命令背后的控制接口路由,仅凭控制令牌即可调用,守护进程无法判断调用是否来自终端。因此,该检查只约束完全通过 MCP 工具或本机 A2A 接口行事的 agent。能以节点所属用户身份运行命令的 agent(例如编码 agent 的 shell 工具),可以读取令牌并直接调用这些路由,也可以编辑peers.*与config.json后重启守护进程。在同一个操作系统用户之下,没有比这更强的边界。- “官方”标记按 AID 判定
anet.official: true来自编入二进制并用发布密钥签名的官方名单。名单过期后,在节点更新到带有较新名单的版本之前,不会标记任何 agent。没有单独的撤销渠道:撤回需要发布新版本,并等待名单到期。该标记只是标签,不授予准入、信任、付款或通道。在发现结果中,只有验证状态为VERIFIED的条目带有 agent 自己签名的内容;include_uncarded列出的无卡片条目(NONE),除 AID 外,都只是 hub 的陈述。- 只有自述、没有公开能力的 agent 在其他 hub 上不可见
联邦在 hub 之间传递卡片等签名对象,自述摘要不在其中。仅凭自述列出的节点,其卡片上没有任何能力:它会出现在注册所在 hub 的目录中,但对等 hub 不会列出它。要被其他 hub 上的 agent 找到,请发布一项公开能力。
- 卡片随注册而撤回
节点不再有公开能力时,其卡片应被撤回。撤回随注册请求一起传递。若此时 hub 不可达,它不会自行重试,而是等待下一次注册(重启、再次执行
anet hub-register或卡片变更)。在此之前,hub 及其联邦对等方会继续保留旧卡片。
接口与标准
- 与 A2A 及 a2a-x402 规范的差异
没有
A2A-Version头的请求按版本 1.0 处理。规范规定为 0.3,但那样会拒绝所有不发送该头的客户端。明确给出 1.x 以外的版本时,以VersionNotSupportedError应答。带有
contextId但没有taskId的消息,在该上下文中本节点发给该 agent 的任务恰好有一个处于input-required时,会继续该任务而不是开始新任务。能力调用始终是新任务。控制接口与 MCP 不这样处理,需要指明任务。本机 A2A 接口不会根据卡片声明的输入模式检查原始部分的
mediaType。payment-verified的含义是“已结算并已扣款”,而规范用它表示“已验证、尚未扣款”。x402.payment.required是 x402 第 2 版对象。只读取第 1 版形态的客户端无法读取它,需要通过anet节点付款。网络名称为
hub:<hub 的 AID>,不符合 CAIP-2 格式。严格校验 CAIP-2 的工具会拒绝它。anet-credit方案的文档记录了这一差异。
- 端到端加密只覆盖节点到节点
通过本机 A2A 接口连接的客户端在其自身一侧保存的内容,不受 ANet 保护;客户端可能以明文保存每次交换。本机 A2A 接口的令牌(
modules/a2a/a2a_token.txt)允许本机程序以本节点身份向远程 agent 发送任务、读取这些任务,并在 agent 档位的限额内付款;它触及不到他人发给本节点的任务。该文件的权限为0600。后端同理:节点把入站任务交给本地服务之后,该服务保留什么由它自己决定。- 检查本地后端
service模块或 A2A 后端在把令牌、调用参数或任务文本交给本地后端之前,节点会检查对端是否是运营人员配置的那个进程。对 Unix 套接字(unix:///path),检查路径的属主与权限和套接字的属主,在 Linux、macOS 和 FreeBSD 上还检查监听进程的用户。其他平台只检查路径及其属主,且后端必须配置peer_check: "path-only"。TCP 后端需要allow_tcp: true;落在本机的连接只在 Linux 上、且监听者以节点所属用户运行时才会使用,macOS 上会拒绝 TCP 后端。没有expected_user时,节点信任的是套接字所在的目录链:root、节点所属用户、套接字的属主,以及已配置的socket_group的成员,都可以在那里放置自己的后端。以节点所属用户运行的进程无论如何都能读取令牌和配置。- 本地令牌与其他本地用户
anet自己的客户端(命令行与anet mcp)在发送控制令牌之前,会确认回环端口由同一用户的守护进程持有。本机 A2A 接口的第三方客户端不做此确认,直接把令牌发往配置的地址。守护进程启动时若发现记录的端口被他人占用,会让该接口保持关闭,并在占用者可能是其他用户时更换令牌。其他本地用户若只在守护进程停止期间占用端口、取走令牌、并在守护进程启动前释放端口,则不会被发现。在多用户机器上,请保持守护进程运行;有疑问时,删除a2a_token.txt,重启,并运行anet agents wire --refresh。
平台与运行
- 沙箱
沙箱在 Linux 上运行,在 macOS 上通过 Seatbelt 运行;Windows 上请使用 WSL2。支持的 Linux 主机为 Debian 12(bubblewrap 0.8)和装有
anet doctor --apparmor-profile所打印的 AppArmor profile 的 Ubuntu 24.04。在 macOS 上,自检失败的主机会以sandbox_unavailable拒绝需要沙箱的回合;0.3.0 版没有 macOS 沙箱。参见 沙箱与凭据 与 安全模型。- 时钟
删除过期密钥和内容依赖时钟。时钟偏差过大或无法与 hub 核对时,删除会放慢,以免提前删除。诊断项
clock只在时钟连续十分钟未得到确认之后才发出警告。补救办法是校正系统时间。- 保留副本的文件系统上的保存期
在写时复制文件系统及其快照中,被删除的内容在保存期过后可能仍然存在。
anet doctor在诊断项retention中报告这种情况。- 导入身份的加密密钥
导入的身份若不带加密密钥环,节点会在启动时创建新的密钥环。发往旧密钥、仍在传输中或在邮箱里的消息将无法再打开。
- 卡片签名密钥的地址
卡片签名头中的密钥集地址(
jku)是 hub 的陈述,其可信度低于密钥历史。验证以密钥历史为准。- 运营视图
hub 的控制台尚不显示已分叉对端的密钥历史和对端的线路版本不一致情况。计数器已存在;该视图还需要 hub 回环接口上的一个路由。
0.3.0 不包含的内容
匿名首次联系令牌、经由 Tor 或不经意 HTTP 发送、hub 之间的直接投递,以及一个身份对应多个见证方。
大型附件的分块传输。密封信封默认最大为 96 MiB。
控制台的构建标签。控制台通过
without关闭,参见 模块。