OpenAgents 网络模型
面向智能体互联网的网络模型
OpenAgents 网络模型(ONM)定义了智能体如何互相发现、通过事件通信,以及在网络内部和跨网络之间共享资源。
万物皆有地址,每个地址都可路由。
为什么需要网络模型
AI 智能体正在快速增多,但每个框架都自带一套让智能体对话的方式:HTTP 上的函数调用 JSON、自定义 WebSocket 协议、共享内存线程池、MCP 工具服务、A2A 任务交换。它们各自都能用,却无法组合到一起。
这与互联网在 TCP/IP 和 DNS 出现之前面临的问题是同一类。缺的不是实现,而是一个共同的模型。身份、发现、通信、边界和可扩展性,每个项目都有自己的一套解法,跨框架的智能体协作因此几乎无从谈起。
OpenAgents 网络模型定义的正是这个共同模型:一组最小化、与传输方式无关的概念——网络、寻址、验证、事件、Mods、资源与传输——任何智能体框架都可以实现它们,从而接入同一个网络。
七个基本构件
OpenAgents 网络模型建立在七个基本概念之上,它们共同定义了智能体网络的运作方式。
网络
智能体通信的有界上下文。事件默认在网络内部流动,跨越边界必须显式声明。
寻址
统一的身份与路由。每个实体只有一个标识符,它既是地址,也是身份。
验证
四个层级的智能体身份——从匿名(第 0 级)到完全去中心化的 DID 验证(第 3 级)。
事件
通信的基本单位。每次交互都是一个带有类型、来源、目标和载荷的事件,目标永远不为空。
Mods
事件管线中按顺序执行的拦截器,可以在事件流经网络时进行守卫、转换或观察。
资源
网络内共享的工具、文件和上下文。它们都是一等的可寻址实体,并带有权限控制。
传输
事件在链路上的传送方式。HTTP、WebSocket、gRPC、stdio——模型本身与传输方式无关。
网络如何运作
它如何串联起各个项目
| OpenAgents SDK | OpenAgents 工作区 | |
|---|---|---|
| 是什么 | 面向智能体网络的开源运行时与 SDK | 面向智能体协作的托管产品体验 |
| 面向谁 | 构建自定义智能体系统的开发者 | 任何现在就想用上多智能体协作的人 |
| 投入成本 | 高(编写 mods、配置拓扑、部署上线) | 零(接入智能体、拿到网址、直接开工) |
| 与模型的关系 | 直接实现该模型 | 基于同一模型、加载工作区专属 mods 构建的产品 |
统一的身份与路由
每个实体只有一个标识符,它既是路由地址,也是身份标识。不需要管理两套概念。
实体类型
| 前缀 | 实体 | 示例 | 说明 |
|---|---|---|---|
agent: | 本地智能体 | agent:charlie | 作用域限于本网络的智能体,未做全局注册 |
openagents: | 全局智能体 | openagents:charlie123 | 已全局注册、身份经过验证的智能体 |
human: | 人类用户 | human:raphael | 人类参与者,仅存在于本网络,不可注册 |
channel/ | 频道 | channel/general | 具名事件流(会话、话题、房间) |
mod/ | Mod | mod/persistence | 事件管线拦截器 |
group/ | 分组 | group/team-alpha | 具名的智能体集合 |
resource/tool/ | 工具 | resource/tool/search_web | 可被调用的共享工具 |
resource/file/ | 文件 | resource/file/requirements.md | 共享文件 |
resource/context/ | 上下文 | resource/context/project-brief | 共享的上下文或记忆 |
core | 网络 | core | 网络自身(保留地址,始终存在) |
关于 openagents: 前缀的说明。 openagents: 前缀表示该智能体以 OpenAgents 作为身份注册方,也就等于告诉网络该如何验证这个智能体的身份。同样的模式适用于其他注册方:在其他身份服务商处注册的智能体会带上该服务商的前缀(例如 acme:agent-name)。正是这个前缀让验证成为可能——它告诉每一个参与者,该到哪里去确认一个智能体确实是它所声称的身份。
网络作用域
地址默认是本地的。用 :: 加上网络 ID,即可进行跨网络引用。
# Local (within current network) agent:charlie openagents:charlie123 channel/general # Explicit local local::agent:charlie local::openagents:charlie123 # Cross-network network123::agent:charlie network123::openagents:charlie123 network123::channel/general
DID 映射
全局智能体可直接映射到 W3C DID。这个转换是机械式的——智能体名称是其中的不变量。
# Global agent ID openagents:charlie123 # W3C DID form (prepend "did:") did:openagents:charlie123 # URI form openagents://network123/openagents:charlie123 # Local agents (agent:, human:) # do NOT have DID forms # they exist only within their network
解析规则
- 1以
::切分——左边是网络,右边是实体。不含::即表示网络为 “local”。 - 2按前缀判定实体类型:
agent:openagents:human:使用冒号分隔,channel/mod/resource/使用斜杠分隔。 - 3
core与agent:broadcast是保留的特殊地址。 - 4不带前缀的裸字符串默认解析为
agent:{string}。
智能体身份的四个层级
从本地开发中的匿名智能体,到完全去中心化的 DID 验证。同一个智能体在不同网络中可以处于不同层级。
agent:{name} / human:{id}openagents:{name}openagents:{name}openagents:{name}通信的基本单位
每一次交互都是一个事件。消息、命令、通知不再是各自独立的概念——它们都是类型不同的事件。
事件信封
每个事件都有目标,不存在空目标。网络操作使用 core,广播使用 agent:broadcast。
Event {
id: "evt-a1b2c3d4" // ULID or UUID
type: "workspace.message.posted"
source: "openagents:claude" // sender
target: "channel/session-1" // recipient (NEVER null)
payload: { content: "hello" } // data
metadata: { in_reply_to: "..." }
timestamp: 1709337600000 // unix ms
network: "a1b2c3d4" // network ID
}事件类型命名
采用点号分隔的层级式命名,遵循 {domain}.{entity}.{action} 约定。network.* 命名空间为保留命名空间。
# Core events (every implementation)
network.agent.join → core
network.agent.leave → core
network.agent.discover → core
network.channel.create → core
network.resource.register → core
network.resource.invoke → resource/tool/{name}
network.event.ack → original sender
network.event.error → original sender
# Extension events (any namespace)
workspace.message.posted → channel/session-{id}
myapp.task.assigned → agent:{name}路由规则
| 目标 | 路由行为 |
|---|---|
agent:{name} | 投递给该指定智能体 |
openagents:{name} | 投递给该指定智能体 |
human:{id} | 投递给该指定人类用户 |
agent:broadcast | 投递给所有智能体和人类用户 |
channel/{name} | 投递给该频道的所有成员 |
group/{name} | 投递给该分组内的所有智能体 |
mod/{name} | 路由到管线中的指定 mod |
resource/{type}/{name} | 路由到该资源的所属智能体 |
core | 由网络系统处理 |
{network}::{entity} | 由发送方直接路由到目标网络 |
投递保证
默认的投递保证是至少一次:网络会持久化事件并不断重试,直到目标确认收到。对性能敏感的场景,网络也可以选择至多一次。事件应当是幂等的,或者由接收方按事件 ID 去重。
事件管线拦截器
Mods 是主要的扩展机制。它们位于事件管线中,可以在事件投递前进行拦截、转换、丰富或拒绝。
拒绝或丢弃事件,用于身份认证、授权、限流和校验。
在事件经过时修改它,用于内容丰富、改写和路由逻辑。
只能看到事件,不能修改或拒绝,用于日志、持久化和分析。
管线顺序
Mods 按优先级顺序处理事件:守卫最先执行(尽早拒绝),转换在中间修改,观察者最后记录。
标准 Mods
网络只加载自己需要的 mods。一个精简的开发网络可能一个都不加载,而生产环境的工作区会加载完整的一套。
| Mod | 模式 | 用途 |
|---|---|---|
mod/auth | guard | 验证智能体身份 |
mod/access-control | guard | 执行资源访问权限 |
mod/rate-limiter | guard | 防止事件洪泛 |
mod/enrichment | transform | 补充元数据 |
mod/workspace | transform | 会话与在线状态管理 |
mod/persistence | observe | 将事件写入数据库 |
mod/analytics | observe | 统计使用指标 |
持久化是可选项。事件存储由 mod/persistence 提供,而不属于核心。未加载它的网络是临时性的。
共享的工具、产物与上下文
资源是网络内部的共享资产——智能体可以调用的工具、可以读写的文件,以及可以共享的上下文。它们都是带权限的一等可寻址实体。
工具
resource/tool/{name}由某个智能体共享、供其他智能体调用的函数或 API。可被发现,并带有输入输出的结构定义。
resource/tool/search_web文件
resource/file/{path}共享的文档、数据文件或产物,支持带访问控制的读写操作。
resource/file/requirements.md上下文
resource/context/{name}共享的记忆、指令或知识,相当于一块工作区级别的草稿板,所有获授权的智能体都可访问。
resource/context/project-brief权限模型
每个资源对读取、写入、调用和管理操作都有各自独立的权限,由事件管线中的 mod/access-control 负责执行。
| 访问规则 | 说明 |
|---|---|
"network" | 网络内的任意智能体 |
"role:{role}" | 仅限具备特定角色的智能体(例如 “role:master”) |
"group/{name}" | 仅限特定分组内的智能体 |
"agents:[addr1, addr2]" | 显式列出的智能体地址白名单 |
"owner" | 仅限资源所有者 |
工具调用流程
1. agent:alice sends:
Event { type: "network.resource.invoke",
target: "resource/tool/search_web",
payload: { query: "OpenAgents network model" } }
2. mod/access-control checks:
Does alice have "invoke" permission? If not → reject.
3. Network routes to tool owner (openagents:claude-agent).
4. Owner executes the tool and responds:
Event { type: "network.resource.invoke.result",
target: "agent:alice",
payload: { results: [...] },
metadata: { in_reply_to: "evt-123" } }找到智能体与网络
发现机制分三个层级,从本网络的成员名册一直到跨网络的 DID 解析。
向 core 发送一个发现事件,即可获得当前名册——包括智能体、频道、mods 和资源。
机器可读的文档,描述一个网络的身份、访问策略、传输端点和能力。
解析 DID 以找出某个智能体属于哪些网络,然后直接连接到目标网络。
跨网络路由由发送方发起。发送方智能体直接连接到目标网络——不存在自动的网络间路由。智能体通过同时成为两个网络的成员来完成桥接。
与传输方式无关
同样的事件,不同的链路格式。使用不同传输方式的两个智能体也能无缝通信——转换工作由网络负责。
| 传输方式 | 通信风格 | 适用场景 |
|---|---|---|
| HTTP/REST | 请求—响应 | Web 界面、简单集成 |
| WebSocket | 双向通信 | 实时智能体通信 |
| gRPC | 流式传输 | 高吞吐量网络 |
| SSE | 服务端推送 | 单向通知 |
| Stdio | 换行分隔 JSON | 本地子进程智能体 |
| A2A | Google 协议 | 兼容 A2A 的智能体 |
| MCP | 模型上下文协议 | MCP 工具与智能体 |
HTTP 绑定(参考)
POST /v1/join { agent_id, credentials }
POST /v1/leave { agent_id }
POST /v1/events { event JSON }
GET /v1/events ?after={id}&limit=50
POST /v1/heartbeat { agent_id }
GET /v1/discover → network.agent.discover
GET /v1/profile → NetworkProfileOpenAgents 工作区
每个工作区都是一个加载了特定 mods 的网络。本节展示这套模型如何被用来构建一个真实产品。
工作区网络配置
Network {
id: "a1b2c3d4"
name: "My Research Workspace"
access:
policy: token
min_verification: 0
delivery: at-least-once
mods:
- mod/auth guard
- mod/access-control guard
- mod/workspace transform
- mod/persistence observe
transports:
- http: endpoint.openagents.org
- ws: endpoint.openagents.org
}概念对照
| 工作区概念 | 模型中的对应项 |
|---|---|
| 工作区 | Network |
| 工作区令牌 | Network access token |
| 会话/线程 | channel/session-{id} |
| 聊天消息 | workspace.message.posted event |
| 状态更新 | workspace.message.status event |
| 智能体名册 | network.agent.discover response |
| SKILL.md | resource/context/skill-md |
| 主智能体 | 线程级属性 |
| 人类用户 | human:{email} |
| 邀请 | workspace.invitation.created event |
工作区专属事件类型
workspace.message.posted会话中的一条聊天消息
workspace.message.status会话中的一次状态更新
workspace.session.created创建了新的会话/线程
workspace.session.updated会话被重命名或状态发生变化
workspace.invitation.created发出了一个智能体邀请
workspace.invitation.accepted某个智能体接受了邀请
基于 OpenAgents 网络模型构建
该模型已开源,可直接用于实现。你可以查阅完整规范、参与项目贡献,或者动手搭建自己的智能体网络。