模块

ANet 由一个小型内核和一组可选模块构成。本页列出各模块,说明节点包含哪些模块,以及如何关闭模块、如何构建不含某模块的节点,还有模块缺失时节点的行为。

概述

内核包含每个节点所需的部分:协议、身份、加密、送达确认、存储和准入。内核不可移除。其余一切都是模块(Module):节点有或没有它,都不影响交换任务的能力。

设计遵循三条规则。

  • 模块只通过固定接口访问内核,内核只授予模块所需的权限。模块不导入守护进程,内核也不导入模块。仓库中的测试对这两个方向都进行强制检查。

  • 代表网络对端行动或花费资金的功能,在运营人员开启之前于运行时保持关闭。构建中包含某模块并不意味着开启它。

  • 缺失的模块以封闭方式失败:不启动,不注册任何内容,也不接受来自网络的任何内容。对对端而言,节点的表现如同该功能已被关闭。

模块列表

模块

功能

构建标签

配置

a2a

本地 A2A 接口:在回环端口上提供 JSON-RPC 与 HTTP+JSON,由令牌保护,并为每个远端 Agent 提供代理卡片。

no_a2a

modules.a2a

anetlink

ANetLink 所提供设备能力的客户端。

no_anetlink

modules.anetlink

autoreply

自动回复:循环、openai 与 exec 后端、Agent 注册表、沙箱、网络控制和运行预算。参见 委派与自动回复 与 沙箱与凭据。

no_autoreply

顶层 auto_reply

blackboard

供协作 Agent 使用的共享黑板。

no_blackboard

modules.blackboard

cas

内容寻址存储:cas.put、cas.get、cas.has 与 cas.stat。

no_cas

modules.cas

console

本地 Web 控制台,通过 anet console 打开。它是唯一不使用持有者令牌的本地入口。

无(计划在 0.3 的补丁版本中提供)

无

mcp

面向编码 Agent 的 MCP 服务器 anet mcp,以及将其接入编码 Agent 的命令 anet agents。参见 MCP。

no_mcp

无

org

组织成员资格凭证的验证。

no_org

modules.org

p2p

节点之间的直接投递,作为 Hub 之外的补充。

no_p2p

modules.p2p

preview

预览流。参见 预览流。

no_preview

顶层 stream_preview

service

由本机程序提供服务的能力。参见 能力与 Agent 卡片。

no_service

modules.service

shell

运营人员已批准、在本机运行的命令。参见 shell 模块。

shell(附加式)

modules.shell

x402

付款:签名、结算、回执、报价、记账,以及对 hub 发放链和余额证明的核对。参见 付款(x402)。

no_x402

modules.x402

模块名称在所有使用处都相同:构建标签、anet version 的 modules 一行、without 设置、安装选项,以及 config.json 中 modules 之下。有两个模块使用较早的顶层配置键,即 auto_reply 和 stream_preview。这些键是固定的,modules.autoreply 或 modules.preview 的写法会被拒绝。

以 no_ 开头的构建标签会从二进制文件中移除一个模块。标签 shell 是附加式的:只有给出该标签时才包含该模块。

控制台在 0.3.0 中没有构建标签。scripts/build.sh --without console 会以 build_tag_pending 被拒绝,控制台通过配置中的 without 关闭。其标签将在 0.3 的补丁版本中提供。源码树中现有的标签可用 scripts/tagcheck.sh list 输出。

默认节点包含什么

发布的构建有默认构建和 shell 构建。默认构建包含除 shell 以外的所有模块。shell 构建在安装时以 --shell 选择,额外包含 shell。没有其他预编译的变体:需要不同模块组合的节点,可以用 without 关闭模块(见下文),或按 构建不含某模块的节点 一节的标签从源码构建。模块组合 一节给出仓库测试过的组合。

$ anet version
anet 0.3.0 (commit 0000000, built 2026-10-01T00:00:00Z)
modules: a2a,anetlink,autoreply,blackboard,cas,console,mcp,org,p2p,preview,service,x402
variant: default

modules 行按字母顺序列出二进制所含的模块;只有内核的二进制显示为 (none)。variant 行给出发布构建的名称(default 或 shell);本地构建的二进制显示 none。/status 在成员 build 中给出相同的信息,包括列表 modules 和 without。

执行 anet init 和 anet up 之后,默认节点无需进一步配置即可做到以下几点:

  • 在本地套接字上运行控制接口,由令牌保护。

  • 在回环端口上运行本地 A2A 接口,由令牌保护。

  • 通过控制接口提供本地 Web 控制台。浏览器会话需要来自 anet console 的一次性票据。

  • 可以读取余额和报价。其自动层和 Agent 层的付款限额均为 0,且未列出任何收款方,因此没有人工介入时不会支付任何款项。

  • 仅当本地客户端要求时,才为任务请求预览。

其他每个模块在配置之前都不执行任何操作。

关闭模块

模块可以在配置中关闭。被关闭的模块仍在二进制文件中,但从不启动。

without 设置是 config.json 顶层的模块名称列表:

{
  "without": ["p2p", "blackboard"]
}

仅在节点停止时才修改该文件。有两条命令可以完成这一操作。

$ anet down
$ anet init --without p2p,blackboard
$ anet up

anet init --without 只添加名称,从不删除名称。如果 config.json 中存在某模块的配置块,则拒绝关闭该模块,须先移除该配置块。anet init --with p2p 从列表中移除一个名称。两条命令在守护进程运行时都会拒绝执行,此时不做任何更改。

表中的每个模块都可以写入,但有两点限制。名称 autoreply 与 preview 关闭的是其设置为顶层键 auto_reply 与 stream_preview 的模块;形式 modules.autoreply 与 modules.preview 会被拒绝。不是模块名称的名称会以 config_invalid 被拒绝,而 shell 模块通过不安装来关闭。

无法通过控制接口、MCP 或本地 A2A 接口更改 without。网络上的对端,以及仅持有控制令牌的程序,都不能重新开启某个模块。

安装时,安装脚本的 --without 选项在首次启动之前起到同样的作用:

$ curl --proto '=https' --tlsv1.2 -fsSL https://agentnetwork.org.cn/install.sh | sh -s -- --without p2p,blackboard

只要有任何一个名称对所选构建无效,就不会安装任何内容。脚本没有 --with 选项。要重新开启模块,请使用 anet init --with。

构建不含某模块的节点

节点可以在构建时不包含某模块的代码。这比关闭模块更强:模块的符号不在二进制文件中。仓库通过双向统计符号数来检查这一点。

$ git clone https://github.com/ANetResearch/ANet
$ cd ANet
$ go build -tags no_p2p,no_blackboard -o anet ./cmd/anet
$ ./anet version

build.sh 可按模块名称完成同样的事,也可以用它构建带有加法模块的版本:

$ ./build.sh --without autoreply,x402
$ ./build.sh --with shell

标签之间以逗号组合。scripts/tagcheck.sh list 输出源码树的标签,scripts/tagcheck.sh all 通过统计符号数在两个方向上检查它们。含有已缺失模块的配置块的构建不会启动。

shell 模块是唯一的附加式模块。默认构建不含它,因为它是唯一会把网络请求转化为主机上命令的模块,必须由运营人员有意选择:

$ go build -tags shell -o anet ./cmd/anet

去掉模块会使二进制变小(参见 模块组合),但这样做的理由是减少节点可能被要求做的事,而不是体积。

缺失的影响

模块在位于二进制文件中且不在 without 中时为可用。不可用的模块表现如下。

启动时

config.json 含有不可用模块的配置时,节点不会启动,说明语句为 module_absent.configured。该消息指明相应的键、说明原因并给出补救办法。节点绝不会在存在已配置但未运行的模块的情况下启动。

在本地接口上

模块的每个入口依然保留,并以代码 module_absent 应答。控制接口以状态 409 应答,本地 A2A 接口以 UnsupportedOperationError 应答。属于该模块的命令行命令以状态 2 退出,不联系守护进程。说明语句指明原因(二进制文件不含该模块,或节点已将其关闭)和补救办法。

对对端

节点的表现如同该功能已关闭。没有自动回复的节点把任务留在收件箱。没有预览的节点从不声明预览,并丢弃收到的帧。没有付款的节点对收费能力的调用应答 payments_unavailable,且不执行工作。没有 p2p 的节点不发布直接地址。

在内核中

保护数据的规则在每种构建中都保持有效。过往 Agent 运行的工作目录按时删除,沙箱绝不挂载的路径列表得以保留,有关价格的事实也得以保留。

不回退

功能不会回退到较弱的路径。需要沙箱的一轮对话不会直接运行,预览也不会经由其他通道发送。

说明语句示例:

$ anet mcp
This anet does not include the MCP module (mcp), so nothing was done; install the default build (install.sh).

$ anet autoreply show
This node has turned off the auto-reply module (autoreply; without in config.json), so nothing was done; run anet down, anet init --with autoreply, anet up.

模块缺失时的效果

模块

缺失的影响

a2a

没有本机 A2A 接口的回环监听,也没有代理卡片。命令和 MCP 工具不受影响。

anetlink

不提供也不调用 ANetLink 的设备能力。

autoreply

没有自动回复循环,也不会为任务启动本地程序,任务留在收件箱中。POST /autoreply 与 POST /autoreply-test 以及命令 anet autoreply 以 module_absent 应答(退出状态 2)。/status 没有成员 auto_reply。诊断项 auto_reply 为提示级别,且没有 sandbox 各项。anet peers trust 使用句子 trust_confirm.no_agent 询问,说明信任只决定本地后端是否接收任务。控制台隐藏自动回复的提示。config.json 中的 auto_reply 块会阻止启动(module_absent.configured)。

blackboard, cas, org

不提供该模块的能力。

console

anet console 与控制台的路由以 module_absent 应答。

mcp

无论模块是未编入还是被关闭,anet mcp 与 anet agents 都以 module_absent 应答(退出状态 2)。

p2p

不发布直连地址,也不接受直连。

preview

节点不声明扩展 anet-preview/v1,也不请求预览。收到的预览帧会被丢弃并计入 preview-unsupported。anet preview 与 POST /tasks/preview 以 module_absent 应答,/status 没有成员 preview。anet delegate --watch 在标准错误输出一行提示,然后等待最终答复。stream_preview 不为 off 时会阻止启动(module_absent.configured)。

service

不提供由本机程序服务的能力。声明了文件的能力由诊断项 capabilities.files 报告。

shell

不能运行任何远程命令。

x402

anet pay、anet redeem、anet reconcile、anet audit-hub 及其背后的路由以 module_absent 应答。anet balance 将余额报告为 module_absent。收到的报价停在 input-required,附句子 module_absent.payment,原因码 anet.reason 为 module_absent``(句子变体不改变原因码)。代理卡片只在节点能够付款时才声明 ``a2a-x402。诊断项 payments.unchargeable 报告节点无法收费的标价能力。

说明语句示例:

$ anet mcp
This anet does not include the MCP module (mcp), so nothing was done; install the default build (install.sh).

$ anet autoreply show
This node has turned off the auto-reply module (autoreply; without in config.json), so nothing was done; run anet down, anet init --with autoreply, anet up.

涉及模块的句子有 module_absent、module_absent.configured、module_absent.payment、without_configured、daemon_running、build_tag_pending、update_variant_unknown 与 update_variant_unknown.mismatch,列于 原因码。

模块组合

仓库测试构建标签的组合,scripts/tagcheck.sh recipes 输出下列组合。每个组合是一个配方:为某个目的而设的一组标签。发布的构建是 default 与 shell;配方面向自行构建节点的人,或用 without 关闭相同模块的人。

配方

用途

二进制中的模块

min

参与网络:向 hub 注册、查找 agent、委派任务、验证回执、评价。不提供能力,不能收款,也没有本机 A2A 监听。

仅内核

standard

在 min 的基础上增加本机 A2A 接口,并把本地服务发布为能力。标价的能力以 UNAVAILABLE 应答,节点不会免费干活。

a2a, service

paid

在 standard 的基础上增加付款:价格、报价、结算、发放链核对与对账。

a2a, service, x402

agent

面向编码 agent:在 standard 的基础上增加 MCP 服务。

a2a, mcp, service

p2p

在 standard 的基础上增加节点之间的直接投递。发现与密钥历史仍需要 hub。

a2a, p2p, service

full

除 shell 以外的所有模块。

全部

配方 min、standard、paid、agent 与 p2p 不含 autoreply 与 preview,二者只在 full 中。

console 模块没有标签,因此每个配方都包含控制台;它是唯一不使用持有者令牌的入口,可以用 without 关闭。

构建中的模块决定节点可能被要求做什么。去掉所有可选模块可使二进制缩小 19%。其中 mcp 占最大部分,因为它链接了 MCP 库;其次是 autoreply 与 a2a。下列大小为候选版本在 Linux amd64 上以 -trimpath -ldflags "-s -w" 构建的结果。

单个标签相对于默认构建:

标签

节省的大小(KiB)

占总节省量的比例

no_mcp

1,996

48 %

no_autoreply

692

17 %

no_a2a

684

17 %

no_x402

220

5 %

no_p2p

72

2 %

no_preview

56

1 %

no_service

60

1 %

no_cas

56

1 %

no_blackboard

40

1 %

no_org

40

1 %

no_anetlink

48

1 %

配方与加法标签:

构建

大小(KiB)

链接的包数

full(默认构建)

21,224

358

agent

20,024

348

p2p

18,096

319

paid

18,236

320

standard

18,024

318

min

17,108

289

在默认构建上加入 shell

21,260

359

配方 paid、p2p 与 full 所含的模块,只有在运营人员配置之后才会打开监听或花费额度。模块 shell 是唯一把网络请求变成宿主机命令的模块;它是加法模块,不属于任何配方,在发布的构建中也不与 full 组合。

更新

anet update 根据写入二进制文件的变体名称选择构建。以默认构建安装的节点更新为默认构建,用 --shell 安装的节点更新为 shell 构建。本地构建的二进制文件没有变体,anet update 不会替换它。without 设置属于配置,更新后继续有效。

说明

  • 用 without 关闭的模块,对于以同一用户身份运行的其他代码而言并非安全边界。此类代码可以编辑 config.json 并替换二进制文件。该设置防范的是网络对端,以及仅持有控制令牌的调用方。

  • 附加式模块(如 shell)需要不同的二进制文件,减法式模块只需要不同的配置。模块的安装选项只选择一次,功能由各自的命令开启:anet autoreply set、anet preview on 和 anet payments set。

  • 节点运行期间不要手动编辑 without。守护进程在启动时读取该列表,更改在下次启动时生效。

另请参阅