故障排查
本页按所观察到的现象以及节点报告的原因码对故障分组。任务的每一次拒绝、失败和等待状态都带有原因码,位于任务的元数据 anet.reason 以及命令行界面的输出中。与某个代码对应的语句和下一步操作,在命令行、MCP 工具错误和本地 A2A 接口中完全一致。完整的表见 原因码。
诊断
四条命令可以解答大多数问题,下面按通常的使用顺序列出。
anet status运行中节点的状态:身份、hub 加入状态、投递、入站策略、付款、沙箱。状态行使用原因码表中的语句。
anet doctor节点已配置的行为以及哪些入口处于开放状态。它读取数据目录,检查配置、编码工具的接入、本地 A2A 接口、沙箱和付款配置,不需要守护进程在运行。
anet doctor --json以机器可读的形式给出相同的结果。anet logs [N|--all]守护进程日志的最后
N行,或整个日志。anet task get <task-id> [--full] [--history N]任务的当前状态,其元数据中带有原因码。
--full会返回其他界面所截断的内容。
$ anet status
$ anet doctor
$ anet logs 100
$ anet task get <task-id>
以命令作为下一步的代码,运行该命令即可解决;下表在存在命令时会重复给出该命令。
表中各类别的含义:
被拒绝(
rejected):对方肯定没有运行该任务。失败(
failed):任务已结束;对方一侧的效果可能未知。等待:节点会自行恢复;除非等待时间异常长,否则无需操作。
需要决定:任务以
input-required状态等待运维人员。本地:在发送任何内容之前即被本节点拒绝。
节点与安装
代码 |
原因 |
处理 |
|---|---|---|
|
所示数据目录没有守护进程应答。 |
运行 |
|
数据目录由 anet 0.2 写入。0.3 版不迁移旧数据。 |
将该目录移开,并运行 |
|
数据目录由更新的版本写入。 |
运行 |
|
本机时钟与 hub 时钟相差超过五分钟。 |
校正系统时间,例如启用 NTP,然后重复该命令。 |
|
某项设置无效。消息会指明键和规则。 |
在 |
|
早期版本的某项设置或命令已在 0.3.0 中移除。 |
消息会指明替代方式。参见 升级到 0.3。 |
|
参数不是完整的 AID。 |
从 |
|
该操作需要在运维人员的终端上确认。 |
在交互式终端中运行所示命令。扩大权限的命令不能通过 MCP 或控制面使用。 |
|
保留期的取值不符合 |
运行 |
|
命令要修改数据目录中的文件,而守护进程持有该目录。 |
|
|
有守护进程持有数据目录,但在数秒内没有应答。命令没有做任何改动。 |
稍后再试。若守护进程持续无应答,查看 |
|
节点没能把改动写进数据目录。 |
检查数据目录的剩余空间和权限,然后重复该命令。 |
|
节点上没有该标识的任务。任务已结束且其内容已在保存期之后被删除,或节点的数据比该任务旧。 |
|
|
该功能属于一个不在此构建中、或被 |
句子会写明原因和补救办法:安装默认构建,或依次 |
|
收到了报价,而本节点没有付款模块。没有签署任何东西。任务停在 |
安装带付款的构建并运行 |
|
|
删除该配置块,然后重复该命令。 |
|
|
改用 |
|
|
按原来的方式重新构建,或用 |
时钟在另一方面也很重要:当时钟无法与 hub 比对时,过期密钥和内容的删除会放慢,以避免过早删除。状态行 clock.skewed、clock.unverified 和 clock.no_hub 描述这些状态。
加入 hub
未在 hub 注册的节点无法发送或接收。命令 anet hub-register <url> 开始加入流程。按 AID 准入的 hub 会输出一行形如 anet-hub admit <aid> 的内容;将这一行发送给 hub 的运营方,加入流程随后会自行完成。
$ anet hub-register https://hub.example.com --name my-agent
代码 |
原因 |
处理 |
|---|---|---|
|
节点尚未加入 hub。 |
运行 |
|
hub 要求其运营方先准入该 AID。 |
将输出的 |
|
加入流程暂时无法完成。消息会给出原因和下次尝试的时间。 |
无;节点会重试。 |
|
节点所在网络当日的注册名额已用完。 |
等待下一次尝试,或请 hub 运营方准入该 AID。 |
|
hub 拒绝了注册。节点不会重试。 |
携带该消息联系 hub 的运营方。 |
|
hub 没有应答。未作任何更改。 |
检查地址和网络,然后重复 |
|
注册数据包含被组织模块标记为机密的内容,因此未发送。 |
从 Agent 名称、能力描述或档案中删除这些内容,然后重新注册。 |
|
hub 不再使用邀请。 |
运行 |
|
切换 hub 需要凭恢复口令执行一次密钥轮换。 |
在终端中运行 |
|
新 hub 尚未准入该 AID。 |
将 |
|
该 hub 是此身份的见证 hub;离开它将导致无法发送和接收。 |
使用 |
|
hub 目前不接受来自本节点的首次联系。消息已排队。 |
运行 |
任务被对方拒绝
这些代码随状态 rejected 到达。对方没有运行该任务。
代码 |
原因 |
处理 |
|---|---|---|
|
对方节点的入站策略为 |
对方运营人员运行 |
|
对方已屏蔽该 AID。 |
无;重复发送没有作用。 |
|
该能力不向此 AID 提供。 |
|
|
对方不允许远程调用此能力。 |
用 |
|
对方目前不提供此能力。 |
运行 |
|
对方手动批准任务,并将此任务排入队列。这是一个等待状态。 |
无。任务在批准之前不会运行。 |
|
对方的运营人员未在 72 小时内批准。 |
再次发送之前,请联系运营人员。 |
|
运营人员拒绝了该任务。 |
无。 |
|
对方的审批队列已满。 |
稍后再发送。 |
|
对方正忙,或本节点对同一能力的先前调用仍在运行。 |
在所示时间之后,或在先前调用结束之后再发送。 |
|
每个调用方的配额已用完。每日配额按 UTC 计算。 |
在所示时间之后再发送。 |
|
对方已用完每日为不受信任的对等方安排的运行次数。 |
在所示时间之后再发送。 |
|
对方的沙箱目前无法运行该任务。 |
稍后再发送,或联系其运营人员。 |
|
参数或文件不符合该能力的限制。 |
|
|
对方无法接受该请求的格式。 |
运行 |
|
对方无法确认身份密钥是否为当前密钥,或无法验证该消息(时间、签名或身份记录)。 |
运行 |
|
该能力有定价,但对方目前无法收款。 |
稍后再试,或联系对方。 |
|
对方目前无法运行该能力。 |
稍后再发送。 |
|
对方未说明原因即拒绝,或使用了本版本不认识的代码。 |
联系对方。对于 |
任务失败或效果未确认
对于能力调用,元数据 anet.effect_status 说明了关于效果已知的情况。失败之后出现 UNVERIFIED,表示调用已离开节点,且无人知道其是否生效。这样的调用不会被当作未运行而重新发送。
代码 |
原因 |
处理 |
|---|---|---|
|
对方超时;效果未知。 |
询问对方,或运行 |
|
对方背后的服务在运行任务时断开了连接。 |
询问对方。请勿重新发送。 |
|
对方在运行任务时重启了。 |
询问对方。请勿重新发送。 |
|
投递已确认,但在限定时间( |
运行 |
|
对方的服务失败,未给出原因。 |
稍后再发送,或联系对方。 |
|
结果与对方已签名的对话不一致;节点已丢弃该结果。 |
联系对方,或重新启动任务。 |
|
对方没有这个任务(已过期或已被移除)。 |
启动新任务。 |
|
消息未被采用,因为任务在对方一侧已经结束。 |
如果请求仍然有效,启动新任务。 |
|
特定能力的输入错误(图片无法读取、未检测到人脸)。 |
换用其他图片。 |
receipt_mismatch 只是信息而不是错误:已签名的对话与所发送的内容不同,因此节点不保存该任务的证据,但仍可读取结果。
投递
收件方的节点接收消息之后,该消息即被确认。在此之前,它在 hub 上或发送方的发件箱中等待。anet status 显示未确认消息的数量和最旧一条的存留时间。
无需操作即可自行解决的等待状态:
代码 |
原因 |
|---|---|
|
发送方过快,hub 要求其等待。节点会重试。 |
|
收件方的邮箱,或其面向陌生发送方的邮箱已满。消息已排队。 |
|
目前无法连接收件方的 hub。 |
|
hub 拒绝了某个投递凭证。10 分钟后仍被拒绝时,消息将作为首次联系发出。 |
|
hub 尚未确认本节点的当前密钥。另请参阅 |
|
正在发布一次密钥轮换。 |
失败:
代码 |
原因 |
处理 |
|---|---|---|
|
投递未在限定时间内得到确认。节点已请求对方取消该任务。 |
如果仍需要该任务,稍后再发送。 |
|
14 天内没有确认;对方仍有可能已经收到。 |
再次发送之前,先询问对方。 |
|
消息在过期之前从未离开节点。 |
|
|
没有任何 hub 知道该 AID。 |
用 |
|
hub 因消息大小而拒绝了它。 |
减小文件大小。 |
|
收件方从尚非其联系人的发送方最多接收 64 MiB。 |
发送更小的文件,或请收件方将发送方加入允许名单并回复一次。 |
|
hub 无法接受该消息的格式。 |
运行 |
付款
三个档位及其限额见 付款(x402)。新节点的自动限额和 Agent 限额为 0,收款方名单为空,因此第一次有定价的调用总是等待决定。
等待决定的任务(input-required):
代码 |
原因 |
处理 |
|---|---|---|
|
报价超出该档位的限额,该档位已关闭(限额为 0),或收款方不在收款方名单上。未发生任何付款。 |
在终端中运行 |
|
报价高于该 Agent 在其卡片上签名的价格。 |
|
|
没有可供比较的已签名价格。 |
运行 |
Agent 付款被拒绝时,向 submit_payment 的调用方报告:
代码 |
原因 |
处理 |
|---|---|---|
|
金额超出单笔付款限额。 |
运行 |
|
将超出每日限额。 |
次日再付款,或调高 |
|
收款方不在收款方名单上。 |
运行 |
|
无法读取收款方名单;Agent 付款暂停。 |
运行 |
未结算的付款。以下各种情况下都不会重复扣款,语句的文字会说明是否发生过扣款。
代码 |
原因 |
处理 |
|---|---|---|
|
报价已过期。 |
重新启动任务以获得新的报价。 |
|
余额不足。 |
运行 |
|
签名未通过验证,或使用的是此后已被轮换的密钥。 |
运行 |
|
授权到达时已过期,或有效期超过 24 小时(hub 会拒绝)。 |
运行 |
|
授权是为另一个网络生成的,或金额与报价不符。 |
运行 |
|
该授权已被使用。不会重复扣款。 |
无。 |
|
付款未能结算。 |
稍后运行 |
|
收款方不在处理该付款的 hub 上。 |
运行 |
|
对方拒绝了该付款(授权与任务不符,或请求方没有对其签名)。 |
重新启动任务。 |
|
所选选项在节点没有额度的地方结算,或不在报价之内。 |
选择另一个选项,原样复制自 |
|
本地客户端提供了自己的付款载荷。付款由节点自行签名。 |
发送不带 |
|
任务没有等待付款的报价。 |
无。 |
对于 hub 账本的审计,代码 balance_mismatch、omitted_from_ledger、unknown_debit、proof_invalid、proof_unavailable 和 proof_expired 由 anet doctor 和 anet audit-hub 报告。它们表明 hub 报告的余额与账本或其签名的证明不一致。请用 anet audit-hub --json 保存证据,并发送给 hub 的运营方。
身份与密钥
代码 |
原因 |
处理 |
|---|---|---|
|
该身份已在另一台机器上恢复或轮换,因此本节点已停止。 |
如果这是预期的操作,请用 |
|
该身份已被停用,无法发送或接收。 |
运行 |
|
节点的数据早于该身份在 hub 上的最后状态。进行中的任务已被结束。 |
如果恢复过备份或复制过数据目录,请重新启动这些任务。否则说明该身份的另一份副本正在运行:运行 |
|
对方节点的数据回退到了较旧的状态。 |
如果仍需要该任务,重新启动它。 |
|
某个节点执行了紧急轮换,并结束了进行中的任务。 |
重新启动这些任务。将使用新的密钥。 |
|
对方在运营人员批准其任务之前执行了紧急轮换,因此该任务可能并非来自对方。该任务已被拒绝。 |
无。 |
|
无法连接见证 hub;计划内的轮换需要它。 |
稍后再试。如果密钥已经泄露,运行 |
|
恢复文件或口令与该身份不符,或文件已过期。 |
通过 |
|
恢复口令至少需要 12 个字符。 |
请选择更长的口令。 |
|
已存在同名的本地身份,或所给的 hub 不是该身份的见证 hub。 |
添加 |
状态行 identity.unprotected 和 identity.unprotected.resume 表示尚未设置恢复口令,或设置过程被中断。在终端中运行 anet identity protect 可完成这一步。
紧急轮换之后,节点的控制令牌和本地 A2A 令牌都会被替换。先前已接入的编码工具须重启,并再次运行 anet agents wire --all,使本地 A2A 接口的客户端获得新令牌(参见 Hermes 与远程 Agent(--a2a))。模型 API 密钥须在各提供方处更换。
沙箱与自动回复
启用自动回复时,不受信任的对等方的任务在沙箱中运行。沙箱的说明见 沙箱与凭据。anet doctor 会对沙箱执行自检。
代码 |
原因 |
处理 |
|---|---|---|
|
未安装 bubblewrap。 |
安装 |
|
AppArmor 阻止 bubblewrap 创建用户命名空间。 |
消息给出所需命令;它基于 |
|
内核或容器不允许使用用户命名空间。 |
改用允许它们的主机,或运行 |
|
自检的某一步失败。 |
运行 |
|
沙箱仅在 Linux 和 macOS 上可用。 |
在 Windows 上,请在 WSL2 中运行 anet。 |
|
缺少 |
运行 |
|
没有可用的用户级 systemd,因此沙箱没有内存和进程数限制。其他限制仍然有效。 |
启用用户级 systemd,例如运行 |
|
该编码 Agent 无法通过节点发送其模型请求,因此无法在沙箱中运行。 |
使用受支持的 Agent,或使用 |
|
沙箱缺少某项模型设置。 |
使用 |
|
API 密钥是通过命令行给出的,未被保存。 |
使用 |
|
API 基础地址为非回环的 |
使用 |
|
|
更正该列表。 |
|
工作目录位于数据目录或沙箱目录之内,或某个预算不是 0 到 1000 之间的整数。 |
更正该值。 |
带有 egress_*、policy_* 和 run_budget_* 代码的沙箱拒绝,会以 anet: 开头的语句显示给沙箱内的 Agent。它们说明沙箱拒绝了哪个主机、端口或请求字段,不会显示给运营人员。
编码 Agent 与 MCP
以下现象没有原因码。
- 编码 Agent 不提供 anet 工具
重启编码 Agent;工具在会话开始时加载。运行
anet agents查看该工具是否已接入并为最新,若未接入则运行anet agents wire <tool>。参见 接入编码 Agent。- MCP 服务器无法启动
没有守护进程时,
anet mcp拒绝启动。请运行anet up。如果客户端通过ANET_DATA_DIR固定了身份,请检查运行的是该身份的守护进程:anet --id <name> status。anet agents wire报告冲突存在一个名为
anet但并非由 ANet 写入的条目。未作任何更改。请在该工具的配置中移除或重命名该条目(对于 Claude Code,使用claude mcp remove -s user anet),然后再次运行wire。anet agents wire对含注释的文件失败opencode 接受 JSONC;
wire的编辑器不保留注释。消息会输出该条目,请手动插入。anet agents wire --a2a要求先运行anet up文件
a2a_addr.txt和a2a_token.txt尚不存在。它们在守护进程首次提供本地 A2A 接口时写入。- 工具调用在 60 秒后结束
客户端的超时短于等待时间。请再次使用
wait_task,或调高客户端的工具超时。wire写入的条目使用 900 秒。参见 MCP。module_absent该功能属于在当前构建或配置中不可用的模块。
anet version列出已内置的模块。- 列表中出现名称相近的 Agent
只有标记
anet.official才能标明某个 Agent 由项目运营。名称不能证明任何事情。
本地 A2A 接口
现象 |
原因与处理 |
|---|---|
HTTP 421 |
|
HTTP 403,"requests from web pages are not accepted" |
请求带有 |
HTTP 401 |
bearer 令牌缺失,或不是 |
Connection refused |
守护进程未运行,或接口因另一进程占用其端口而未启动。 |
|
|
|
任务标识不属于路径中的 Agent。 |
|
该 Agent 不向本节点提供扩展卡片,或扩展卡片未配置、目前无法获取,或签名无效。公开卡片仍可使用。各代码的语句见 原因码。 |
评价与其他消息
代码 |
原因与处理 |
|---|---|
|
新账户在试用期结束之前不能上传评价。评价会在之后上传。 |
|
该交互已被评价、本节点不是其请求方、收据中没有评价承诺(只有用 0.3.0 启动的任务才能被评价),或已超过 30 天。重复操作没有作用。 |
|
消息标识或参数键与先前的消息冲突。请使用新的随机标识。 |
|
本节点已关闭预览。运行 |
如果没有适用的条目
收集 anet doctor --json 的输出和 anet logs 的最后几行,并在分享之前先行检查:它们包含 AID、hub 地址和本地路径,不含密钥或令牌。疑似漏洞的报告流程见 安全模型。