模块
ANet 由一个小型内核和一组可选模块构成。本页列出各模块,说明节点包含哪些模块,以及如何关闭模块、如何构建不含某模块的节点,还有模块缺失时节点的行为。
概述
内核包含每个节点所需的部分:协议、身份、加密、送达确认、存储和准入。内核不可移除。其余一切都是模块(Module):节点有或没有它,都不影响交换任务的能力。
设计遵循三条规则。
模块只通过固定接口访问内核,内核只授予模块所需的权限。模块不导入守护进程,内核也不导入模块。仓库中的测试对这两个方向都进行强制检查。
代表网络对端行动或花费资金的功能,在运营人员开启之前于运行时保持关闭。构建中包含某模块并不意味着开启它。
缺失的模块以封闭方式失败:不启动,不注册任何内容,也不接受来自网络的任何内容。对对端而言,节点的表现如同该功能已被关闭。
模块列表
模块 |
功能 |
构建标签 |
配置 |
|---|---|---|---|
|
本地 A2A 接口:在回环端口上提供 JSON-RPC 与 HTTP+JSON,由令牌保护,并为每个远端 Agent 提供代理卡片。 |
|
|
|
ANetLink 所提供设备能力的客户端。 |
|
|
|
自动回复:循环、 |
|
顶层 |
|
供协作 Agent 使用的共享黑板。 |
|
|
|
内容寻址存储: |
|
|
|
本地 Web 控制台,通过 |
无(计划在 0.3 的补丁版本中提供) |
无 |
|
面向编码 Agent 的 MCP 服务器 |
|
无 |
|
组织成员资格凭证的验证。 |
|
|
|
节点之间的直接投递,作为 Hub 之外的补充。 |
|
|
|
预览流。参见 预览流。 |
|
顶层 |
|
由本机程序提供服务的能力。参见 能力与 Agent 卡片。 |
|
|
|
运营人员已批准、在本机运行的命令。参见 shell 模块。 |
|
|
|
付款:签名、结算、回执、报价、记账,以及对 hub 发放链和余额证明的核对。参见 付款(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 接口的回环监听,也没有代理卡片。命令和 MCP 工具不受影响。 |
|
不提供也不调用 ANetLink 的设备能力。 |
|
没有自动回复循环,也不会为任务启动本地程序,任务留在收件箱中。 |
|
不提供该模块的能力。 |
|
|
|
无论模块是未编入还是被关闭, |
|
不发布直连地址,也不接受直连。 |
|
节点不声明扩展 |
|
不提供由本机程序服务的能力。声明了文件的能力由诊断项 |
|
不能运行任何远程命令。 |
|
|
说明语句示例:
$ 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 关闭相同模块的人。
配方 |
用途 |
二进制中的模块 |
|---|---|---|
|
参与网络:向 hub 注册、查找 agent、委派任务、验证回执、评价。不提供能力,不能收款,也没有本机 A2A 监听。 |
仅内核 |
|
在 |
|
|
在 |
|
|
面向编码 agent:在 |
|
|
在 |
|
|
除 |
全部 |
配方 min、standard、paid、agent 与 p2p 不含 autoreply 与 preview,二者只在 full 中。
console 模块没有标签,因此每个配方都包含控制台;它是唯一不使用持有者令牌的入口,可以用 without 关闭。
构建中的模块决定节点可能被要求做什么。去掉所有可选模块可使二进制缩小 19%。其中 mcp 占最大部分,因为它链接了 MCP 库;其次是 autoreply 与 a2a。下列大小为候选版本在 Linux amd64 上以 -trimpath -ldflags "-s -w" 构建的结果。
单个标签相对于默认构建:
标签 |
节省的大小(KiB) |
占总节省量的比例 |
|---|---|---|
|
1,996 |
48 % |
|
692 |
17 % |
|
684 |
17 % |
|
220 |
5 % |
|
72 |
2 % |
|
56 |
1 % |
|
60 |
1 % |
|
56 |
1 % |
|
40 |
1 % |
|
40 |
1 % |
|
48 |
1 % |
配方与加法标签:
构建 |
大小(KiB) |
链接的包数 |
|---|---|---|
|
21,224 |
358 |
|
20,024 |
348 |
|
18,096 |
319 |
|
18,236 |
320 |
|
18,024 |
318 |
|
17,108 |
289 |
在默认构建上加入 |
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。守护进程在启动时读取该列表,更改在下次启动时生效。