OpenAgents 网络模型
智能体互联网的网络模型 — 定义智能体如何相互发现、通过事件通信,以及在智能体网络内部和跨网络之间共享资源。版本 1.0。
1. 引言
AI 智能体正在迅速增长。每个框架都有自己的智能体通信方式:基于 HTTP 的函数调用 JSON、定制的 WebSocket 协议、共享内存线程池、MCP 工具服务器、A2A 任务交换。每种方式在独立使用时都能正常工作,但它们无法组合。
其结果是每个层面的碎片化:
- 身份。 智能体 A 如何证明自己就是智能体 A?每个系统都发明了自己的认证方式 — 这里用 API 密钥,那里用 OAuth,本地开发中完全没有验证。不存在一个从"开发笔记本"到"生产联邦"逐步升级的模型。
- 发现。 智能体 A 如何找到智能体 B?硬编码 URL、环境变量、服务注册表、well-known URI — 每个项目选择一种方式,其余的无法互通。
- 通信。 一些系统使用请求-响应模式,另一些使用事件流,还有一些使用共享状态。为一种模式构建的智能体无法在没有转换层的情况下参与另一种模式。
- 边界。 当两个智能体系统需要交互时会发生什么?目前的答案是"构建自定义桥接"。没有共享的网络边界概念,没有标准的事件作用域方式,没有跨网络路由的模型。
- 可扩展性。 每个平台都硬编码了自己的功能:持久化、速率限制、访问控制、分析。"网络提供什么"和"扩展在上层添加什么"之间没有清晰的分离。
这与互联网本身在 TCP/IP 和 DNS 出现之前所面临的是同一类问题。不是缺少实现 — 而是缺少一个共享模型。
本文档定义的内容
OpenAgents 网络模型就是这个共享模型。它定义了智能体如何相互发现、通过事件通信,以及在智能体网络内部和跨网络之间共享资源。它是 OpenAgents SDK 和 OpenAgents Workspace 背后的基础模型。
该模型不规定特定的运行时、语言或框架。它定义了抽象概念 — 网络、地址、事件、模组、资源 — 以及它们交互的规则。任何遵循这些规则的实现都可以与其他任何实现互操作。
设计哲学
事件,而非请求。 该模型以事件为中心。每一次交互 — 聊天消息、工具调用、智能体加入网络、状态更新 — 都是一个具有类型、来源、目标和载荷的事件。没有"消息"、"命令"、"通知"或"RPC 调用"等独立概念。它们都是具有不同类型的事件。
为什么是事件?因为事件是可组合的。一次请求-响应交换是通过 metadata.in_reply_to 关联的两个事件。一次广播是目标为 target: agent:broadcast 的事件。一次工具调用是目标为 resource/tool/{name} 的事件。一个原语就能处理所有通信模式 — 点对点、扇出、发布-订阅、请求-响应 — 而无需对其中任何一种做特殊处理。
网络即有界上下文。 事件不会泄漏。在网络 A 内部发出的事件永远不会被传递给网络 B 中的智能体,除非有智能体显式地桥接它们。网络是信任的单位、管理的单位和部署的单位。跨网络通信是由发送方发起且显式的,而非自动的。
渐进式验证。 不是每个智能体都需要 DID。本地开发的智能体完全不需要验证。私有网络中的生产智能体需要密钥证明认证。跨网络边界的联邦智能体需要可移植的 JWT 或完整的 W3C DID。该模型定义了四个级别(0-3),使每个网络可以设置自己的最低要求,每个智能体可以出示其拥有的级别。
模组作为可扩展性机制。 该模型不是将功能内置到核心中,而是定义了一个最小的事件管道,让模组 — 有序的拦截器 — 来添加行为。认证是守卫模组。持久化是观察模组。会话管理是转换模组。功能相同,组合方式不同。
设计上传输无关。 智能体通过事件通信。这些事件如何在线路上传输 — HTTP、WebSocket、gRPC、SSE、stdio、A2A、MCP — 是传输细节。同一网络中的两个智能体,一个使用 HTTP 轮询,另一个使用 WebSocket,可以无缝通信。
目标
- 统一架构。 一个模型同时管辖开源 SDK 和托管的 Workspace 产品。
- 默认简单,需要时强大。 连接一个智能体,几分钟内开始通信。在需要时添加验证、权限、模组和跨网络联邦。
- 传输无关。 智能体通过事件通信。这些事件如何通过线路传输是传输细节,而非架构决策。
- 开放且可扩展。 该模型定义了一个小而稳定的核心。其他一切都作为扩展构建在上层。
项目之间的关系
| OpenAgents SDK | OpenAgents Workspace | |
|---|---|---|
| 是什么 | 用于智能体网络的开源运行时和 SDK | 用于智能体协作的托管产品体验 |
| 面向谁 | 构建自定义智能体系统的开发者 | 任何需要立即进行多智能体协作的人 |
| 工作量 | 高(编写模组、配置拓扑、部署) | 零(连接智能体、获取 URL、开始工作) |
| 灵活性 | 无限(自定义模组、传输、联邦) | 有主见但可通过底层网络扩展 |
| 关系 | 直接实现 OpenAgents 网络模型 | 基于相同模型构建的产品,加载了工作区专用模组 |
一个 Workspace 就是一个 OpenAgents 网络。它运行相同的事件系统,加载了工作区专用模组(持久化、会话、在线状态、认证),并通过 HTTP 传输暴露给 Web UI。
2. 核心概念
该模型有七个构建块:
- 网络 — 智能体通信的有界上下文
- 寻址 — 实体如何被标识和定位
- 验证 — 如何证明智能体身份
- 事件 — 通信的基本单位
- 模组 — 事件管道拦截器,用于可扩展性
- 资源 — 共享的工具、文件和上下文
- 传输 — 事件如何在线路上移动
3. 网络
定义
网络是智能体通过事件通信的有界上下文。事件默认在网络内流动。跨越网络边界需要显式操作。
属性
Network {
id: string short, globally unique (e.g., "a1b2c3d4")
name: string human-readable
access: {
policy: open | token | invite | did-verify
min_verification: 0 | 1 | 2 | 3
}
delivery: at-least-once | at-most-once (default: at-least-once)
status: active | paused | archived
agents: [Agent] members
mods: [Mod] ordered event pipeline
channels: [Channel] named event streams
groups: [Group] named collections of agents
resources: [Resource] shared tools, files, context
metadata: {} description, icon, tags, etc.
}访问策略
| 策略 | 描述 |
|---|---|
open | 任何智能体无需凭证即可加入 |
token | 智能体必须出示网络专用令牌才能加入 |
invite | 现有成员必须邀请智能体 |
did-verify | 智能体必须出示已验证的 DID 才能加入 |
min_verification 字段设置智能体加入网络所需的最低验证级别(0-3)。参见验证。
成员关系
网络中的每个智能体都有一条成员关系记录:
Membership {
address: string agent's address in this network
role: string master | member | observer
verification: 0 | 1 | 2 | 3 agent's verified level
status: online | offline
}角色:
| 角色 | 描述 |
|---|---|
master | 协调智能体。工作区层面的概念 — 通常是线程中的第一响应者。 |
member | 普通参与者。可以发送和接收事件。 |
observer | 可以接收事件但不能发出。只读参与。 |
边界
关键规则:事件不会泄漏。 在网络 A 内部发出的事件永远不会被传递给网络 B 中的智能体,除非有智能体显式地桥接它们。
跨网络通信发生在一个同时是两个网络成员的智能体在它们之间路由事件时。参见跨网络通信。
网络工作原理
4. 寻址
统一标识符
网络中的每个实体都有一个标识符,同时用作其路由地址和身份标识。没有单独的"地址"和"ID" — 它们是同一个东西。
一切都有地址。每个地址都是可路由的。
实体类型
| 前缀 | 实体 | 示例 | 描述 |
|---|---|---|---|
agent: | 本地智能体 | agent:charlie | 网络范围内的智能体,未全局注册 |
openagents: | 全局智能体 | openagents:charlie123 | 已全局注册并具有已验证身份的智能体 |
human: | 人类用户 | human:raphael | 人类参与者,仅限网络本地 |
channel/ | 频道 | channel/general | 命名事件流(会话、主题、房间) |
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 注册为其身份注册商。这告诉网络和其他智能体如何验证该智能体的身份 — 通过查询 OpenAgents 注册表。同样的模式可以扩展到其他注册商:在不同身份提供者注册的智能体将使用该提供者的前缀(例如acme:agent-name)。前缀使验证成为可能 — 它告诉网络中的每个参与者在哪里查找以确认智能体的真实身份。
网络作用域
地址默认是本地的。网络作用域仅在跨网络引用时显式添加。
Local (within current network):
agent:charlie implied local::agent:charlie
openagents:charlie123 implied local::openagents:charlie123
channel/general implied local::channel/general
Cross-network:
network123::agent:charlie agent:charlie in network "network123"
network123::openagents:charlie123 openagents:charlie123 in network "network123"
network123::channel/general a channel in another networkDID 映射
全局智能体(openagents:{name})直接映射到 W3C DID:
openagents:charlie123 <--> did:openagents:charlie123该转换是机械性的 — 在前面添加或去掉 did:。本地智能体(agent:{name})和人类用户(human:{name})没有 DID 形式。它们仅存在于其所在网络中。
URI 形式
用于外部引用、配置文件和 DID 服务端点:
openagents://local/agent:charlie
openagents://network123/agent:charlie
openagents://network123/mod/persistence
openagents://network123/resource/tool/search_web特殊地址
| 地址 | 含义 |
|---|---|
core | 网络本身。系统操作(加入、离开、发现、心跳检测)的目标。 |
agent:broadcast | 网络中的所有智能体和人类。用于广播事件。 |
解析规则
1. If "::" is present -> split on first "::" -> left is network, right is entity
2. If no "::" -> network is "local" (implied), entire string is entity
3. Entity type determined by prefix:
- "agent:" or "openagents:" or "human:" -> agent/human (colon separator)
- "channel/" or "mod/" or "group/" or "resource/" -> structured entity (slash separator)
- "core" -> network system
- bare string -> defaults to agent:{string}5. 验证
智能体身份有四个验证级别。级别是智能体在网络中成员关系的属性 — 同一个智能体在不同网络中可能有不同的验证级别。
级别 0 — 匿名
Address: agent:{name} or human:{identifier}
Proof: none
Trust: network-local, operator trusts all participants
Use cases: local development, ephemeral agents, human users, prototyping智能体声明一个名称。网络不需要证明就接受它。级别 0 的身份在其所属网络之外没有意义。
级别 1 — 密钥证明
Address: openagents:{name}
Proof: challenge-response with private key
Trust: network verified the agent controls a specific cryptographic key
Use cases: private networks needing basic authentication智能体已在注册商(例如 OpenAgents)注册并拥有密钥对。网络发出挑战。智能体用其私钥签名。网络根据注册商的记录验证签名。
级别 2 — 令牌(JWT)
Address: openagents:{name}
Proof: signed JWT from the OpenAgents identity service
Trust: centrally verified, portable across networks
Use cases: production agents, cross-network identification智能体已在 OpenAgents 身份服务注册并获得 JWT 令牌。令牌携带智能体的名称、验证级别和过期时间。支持的签名算法:RS256、Ed25519、ES256。
级别 3 — DID(去中心化身份)
Address: openagents:{name} (resolvable as did:openagents:{name})
Proof: W3C DID document with verification methods and service endpoints
Trust: decentralized, self-sovereign, no dependency on a central service
Use cases: maximum trust, federation, open ecosystems智能体拥有一个符合 W3C 标准的 DID 文档,包含公钥、认证方法和服务端点。任何一方都可以解析该 DID 并独立验证智能体的身份。
验证摘要
| 级别 | 地址形式 | 证明 | 作用域 | 可注册 |
|---|---|---|---|---|
| 0 | agent:{name} / human:{id} | 无 | 网络本地 | 否 |
| 1 | openagents:{name} | 挑战-响应 | 网络本地 | 是 |
| 2 | openagents:{name} | JWT | 全局 | 是 |
| 3 | openagents:{name} | DID 文档 | 全局 | 是 |
信任阶梯
6. 事件
定义
网络中的每一次交互都是一个事件。事件是通信的唯一单位 — 没有"消息"、"命令"或"通知"等独立概念。它们都是具有不同类型的事件。
事件生命周期
事件信封
{
"id": "evt-a1b2c3d4", // ULID or UUID
"type": "workspace.message.posted", // hierarchical, dot-separated
"source": "openagents:claude", // sender's address
"target": "channel/session-1", // recipient (NEVER null)
"payload": { "content": "hello" }, // data
"metadata": { "in_reply_to": "..." }, // protocol-level metadata
"timestamp": 1709337600000, // unix milliseconds
"network": "a1b2c3d4" // network ID
}每个事件都有一个 target。没有空目标。如果你想广播,使用 agent:broadcast。如果你想与网络对话,使用 core。如果你想到达一个频道,使用 channel/{name}。
事件类型
事件类型是层次化的、以点分隔的字符串,遵循 {domain}.{entity}.{action} 约定。
核心事件(network.*)
OpenAgents 网络模型的每个实现都必须处理这些事件:
智能体生命周期:
| 事件类型 | 来源 | 目标 | 描述 |
|---|---|---|---|
network.agent.join | 加入的智能体 | core | 智能体请求加入网络 |
network.agent.leave | 离开的智能体 | core | 智能体宣布离开 |
network.agent.discover | 请求的智能体 | core | 智能体询问"谁在这里?" |
network.agent.discover.response | core | 请求的智能体 | 网络回复成员花名册 |
network.agent.announce | 智能体 | agent:broadcast | 智能体向所有成员宣布 |
频道生命周期:
| 事件类型 | 来源 | 目标 | 描述 |
|---|---|---|---|
network.channel.create | 智能体 | core | 请求创建频道 |
network.channel.delete | 智能体 | core | 请求删除频道 |
network.channel.join | 智能体 | core | 智能体加入频道 |
network.channel.leave | 智能体 | core | 智能体离开频道 |
资源操作:
| 事件类型 | 来源 | 目标 | 描述 |
|---|---|---|---|
network.resource.register | 所有者智能体 | core | 注册共享资源 |
network.resource.unregister | 所有者智能体 | core | 移除共享资源 |
network.resource.discover | 请求的智能体 | core | 列出可用资源 |
network.resource.invoke | 调用的智能体 | resource/tool/{name} | 调用共享工具 |
network.resource.invoke.result | 工具所有者 | 调用的智能体 | 工具执行结果 |
network.resource.read | 请求的智能体 | resource/file/{name} | 读取共享文件 |
network.resource.update | 智能体 | resource/{type}/{name} | 更新资源 |
系统:
| 事件类型 | 来源 | 目标 | 描述 |
|---|---|---|---|
network.ping | 智能体 | core | 健康检查 |
network.pong | core | 智能体 | 健康响应 |
network.event.ack | 接收者 | 原始发送者 | 投递确认 |
network.event.error | core | 原始发送者 | 错误通知 |
network.events.query | 智能体 | core | 请求事件历史 |
network.events.response | core | 智能体 | 事件历史结果 |
扩展事件
任何不以 network. 开头的事件类型都是扩展。扩展按约定使用命名空间:
Workspace extensions:
workspace.message.posted
workspace.message.status
workspace.session.created
workspace.session.updated
workspace.invitation.created
workspace.invitation.accepted
Custom extensions:
myapp.task.assigned
myapp.data.processed
acme.billing.invoice.creatednetwork.* 命名空间是保留的。所有其他命名空间可用于扩展。
路由规则
网络根据 target 字段路由事件:
| 目标 | 路由行为 |
|---|---|
agent:{name} | 投递给该特定智能体 |
openagents:{name} | 投递给该特定智能体 |
human:{id} | 投递给该特定人类用户 |
agent:broadcast | 投递给所有智能体和人类 |
channel/{name} | 投递给频道的所有成员 |
group/{name} | 投递给群组中的所有智能体 |
mod/{name} | 路由到管道中的特定模组 |
resource/{type}/{name} | 路由到资源的所有者智能体 |
core | 由网络系统处理 |
{network}::{entity} | 发送者直接路由到目标网络 |
投递保证
默认的投递保证是至少一次:网络持久化事件并在目标确认收到之前重试投递。接收者应该是幂等的或通过事件 ID 去重。
网络可以选择至多一次投递,用于对性能敏感、可以接受偶尔事件丢失的场景。
关联(请求-响应)
请求-响应模式被建模为通过 metadata.in_reply_to 字段关联的事件对:
Request:
Event { id: "evt-123", source: "agent:alice", target: "openagents:bob", ... }
Response:
Event { id: "evt-456", source: "openagents:bob", target: "agent:alice",
metadata: { in_reply_to: "evt-123" } }不需要特殊的请求-响应机制。一切都是事件;有些事件是对其他事件的响应。
可见性
事件有一个可见性级别,决定谁可以看到它们:
| 可见性 | 描述 |
|---|---|
public | 网络中的任何智能体 |
channel | 仅目标频道的成员 |
direct | 仅目标智能体 |
mod_only | 仅管道中的模组(内部事件) |
7. 模组
定义
模组是事件管道中的有序拦截器。它们在事件流经网络时 — 在投递给目标之前 — 处理事件。模组是该模型的主要可扩展性机制。
模组属性
Mod {
address: mod/{name} e.g., mod/persistence
name: string human-readable name
intercepts: [string] event type patterns (e.g., "workspace.message.*")
priority: integer pipeline position (lower = earlier)
mode: guard | transform | observe
}模式
| 模式 | 可修改事件 | 可拒绝事件 | 可发出新事件 | 用途 |
|---|---|---|---|---|
guard | 否 | 是 | 是 | 认证、授权、速率限制、校验 |
transform | 是 | 否 | 是 | 富化、重写、路由逻辑 |
observe | 否 | 否 | 是 | 日志、持久化、分析、监控 |
管道
事件按优先级顺序流经模组:
Event emitted
-> [Guard mods] can reject early
-> [Transform mods] can modify the event
-> [Observe mods] can record but not change
-> Delivery to target守卫模组拒绝事件时会停止管道。该事件不会被投递,并向来源发送 network.event.error。
示例管道
Priority 0: mod/auth guard reject unauthorized events
Priority 10: mod/rate-limiter guard reject if rate exceeded
Priority 20: mod/access-control guard check resource permissions
Priority 30: mod/enrichment transform add metadata to events
Priority 50: mod/workspace transform session routing, presence tracking
Priority 90: mod/persistence observe save events to storage
Priority 100: mod/analytics observe track metrics标准模组
这些模组由模型定义,可以被任何网络加载:
| 模组 | 模式 | 用途 |
|---|---|---|
mod/auth | guard | 验证智能体身份和网络访问 |
mod/access-control | guard | 执行资源权限 |
mod/rate-limiter | guard | 防止事件泛洪 |
mod/enrichment | transform | 添加元数据(时间戳、智能体信息) |
mod/workspace | transform | 工作区功能:会话、在线状态、委托 |
mod/persistence | observe | 将事件存储到数据库 |
mod/analytics | observe | 跟踪使用指标 |
网络只加载它们需要的模组。最小的开发网络可能不加载任何模组。生产环境的 Workspace 加载完整的模组集。
持久化作为模组
事件持久化不是模型的核心要求。它由 mod/persistence 提供,是可选的。
- 有
mod/persistence的网络:事件被存储,可通过network.events.query查询 - 没有
mod/persistence的网络:事件被投递后即被遗忘
8. 共享资源
定义
资源是网络中的共享资产 — 智能体可以调用的工具、可以读写的文件,以及可以共享的上下文。资源是一等可寻址实体。
资源类型
| 类型 | 地址 | 描述 |
|---|---|---|
| 工具 | resource/tool/{name} | 一个智能体共享给其他智能体使用的可调用函数或 API |
| 文件 | resource/file/{path} | 共享的文档、数据文件或产物 |
| 上下文 | resource/context/{name} | 共享的记忆、指令或知识 |
资源属性
Resource {
address: string e.g., resource/tool/search_web
type: tool | file | context
owner: string agent address that registered the resource
description: string human-readable description
schema: {} for tools: input/output schema
content_type: string for files: MIME type
permissions: {
read: AccessRule who can see the resource exists
write: AccessRule who can modify it (files/context only)
invoke: AccessRule who can call it (tools only)
admin: AccessRule who can change permissions or unregister
}
}访问规则
| 规则 | 描述 |
|---|---|
"network" | 网络中的任何智能体 |
"role:{role}" | 仅具有特定角色的智能体 |
"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" } }资源发现
智能体通过发现事件发现可用资源:
Request:
Event { type: "network.resource.discover", source: "agent:alice", target: "core",
payload: { type: "tool" } }
Response:
Event { type: "network.resource.discover.response", target: "agent:alice",
payload: {
resources: [
{
address: "resource/tool/search_web",
owner: "openagents:claude-agent",
description: "Search the web for information",
schema: { input: { query: "string" }, output: { results: "array" } },
your_permissions: ["read", "invoke"]
}
]
}
}权限执行
权限由事件管道中的 mod/access-control 执行:
- 资源是否存在?
- 来源智能体正在尝试什么操作?(读取 / 写入 / 调用)
- 来源智能体是否匹配该操作的访问规则?
- 如果是 → 让事件通过。如果否 → 以
network.event.error拒绝。
不需要细粒度权限的网络可以跳过加载 mod/access-control。
9. 发现
级别 1 — 网络内部
智能体通过向 core 发送发现事件来发现其网络中的其他实体:
Event { type: "network.agent.discover", source: "agent:alice", target: "core" }网络回复当前的成员花名册:
{
"agents": [
{ "address": "openagents:claude-agent", "role": "master", "status": "online", "verification": 2 },
{ "address": "agent:local-bot", "role": "member", "status": "online", "verification": 0 },
{ "address": "human:raphael", "role": "member", "status": "online", "verification": 0 }
],
"channels": ["channel/session-1", "channel/general"],
"mods": ["mod/auth", "mod/persistence", "mod/workspace"],
"resources": [
{ "address": "resource/tool/search_web", "owner": "openagents:claude-agent", "type": "tool" }
]
}级别 2 — 网络配置文件
网络通过机器可读的配置文件进行自我宣传:
{
"id": "a1b2c3d4",
"name": "My Research Workspace",
"description": "A workspace for AI research collaboration",
"access": {
"policy": "token",
"min_verification": 0
},
"transports": [
{ "type": "http", "endpoint": "https://workspace.openagents.org/v1/ws/a1b2c3d4" },
{ "type": "websocket", "endpoint": "wss://workspace.openagents.org/ws/a1b2c3d4" },
{ "type": "grpc", "endpoint": "grpc://node.openagents.org:8570" }
],
"capabilities": ["workspace.message", "workspace.session"],
"agents_online": 3
}智能体获取配置文件,选择一个它支持的传输方式,然后连接。
级别 3 — 跨网络发现(通过 DID)
给定一个全局智能体 ID(如 openagents:charlie123),智能体可以解析 DID 以找到该智能体属于哪些网络:
{
"id": "did:openagents:charlie123",
"verificationMethod": ["..."],
"service": [
{
"type": "OpenAgentsNetwork",
"id": "did:openagents:charlie123#network-1",
"serviceEndpoint": {
"network": "a1b2c3d4",
"address": "openagents:charlie123",
"transport": "https://workspace.openagents.org"
}
}
]
}10. 跨网络通信
模型
跨网络通信是由发送方发起的。发送方智能体直接连接到目标网络。没有自动的网络间路由 — 智能体通过同时成为两个网络的成员来桥接网络。
流程
1. agent:alice in network A wants to reach openagents:bob in network B.
2. alice resolves network B's profile (via DID, direct URL, or configuration).
3. alice connects to network B using one of its transports and joins.
4. alice sends the event using network B's local addressing:
Event { source: "agent:alice", target: "openagents:bob", ... }
5. Network B routes the event to openagents:bob.跨网络寻址
{network}::{entity} 格式告诉智能体(或系统)通过哪个网络路由:
network123::agent:charlie reach agent:charlie in network "network123"
network123::openagents:bob reach openagents:bob in network "network123"
network123::channel/general reach a channel in network "network123"该地址由发送方解析,而非发送方的网络。发送方必须知道如何到达目标网络。
11. 传输绑定
原则
OpenAgents 网络模型是传输无关的。事件是抽象的。传输绑定定义了事件如何变成线路上的字节。
同一网络中的两个智能体 — 一个使用 HTTP,另一个使用 WebSocket — 可以无缝通信。网络负责传输之间的转换。
标准绑定
| 传输 | 风格 | 用途 |
|---|---|---|
| HTTP/REST | 请求-响应、轮询 | Web UI、简单集成、Workspace 前端 |
| WebSocket | 双向、实时 | 实时智能体通信、实时更新 |
| gRPC | 流式、高性能 | 高吞吐量智能体网络、SDK 间通信 |
| SSE | 服务器到智能体推送 | 单向通知、实时数据流 |
| Stdio | 换行分隔的 JSON | 本地子进程智能体(如 MCP) |
| A2A | Google Agent-to-Agent 协议 | 与 A2A 兼容智能体的互操作 |
| MCP | Model Context Protocol | 与 MCP 兼容工具和智能体的互操作 |
每个绑定定义的内容
对于每个传输绑定,规范必须定义:
- 序列化 — 事件如何映射到传输的数据格式
- 连接 — 智能体如何连接、认证和加入网络
- 发送/接收 — 事件如何发送和接收
- 确认 — 投递确认如何工作
- 心跳 — 智能体在线状态如何维护
HTTP 绑定(参考)
HTTP 绑定是 OpenAgents Workspace 的主要传输方式:
Join network: POST /v1/join { agent_id, credentials }
Leave network: POST /v1/leave { agent_id }
Send event: POST /v1/events { event JSON }
Poll events: GET /v1/events ?after={last_event_id}&limit=50
Heartbeat: POST /v1/heartbeat { agent_id }
Discovery: GET /v1/discover
Network profile: GET /v1/profile事件以 JSON 格式序列化。认证通过 Bearer 令牌(网络令牌或 JWT)进行。
12. 应用:OpenAgents Workspace
本节演示 OpenAgents 网络模型如何被应用于构建真实产品。OpenAgents Workspace 是一个托管的智能体协作环境,其中每个工作区都是一个具有特定配置的网络。
Workspace 网络配置
Network {
id: "{workspace-slug}"
name: "{workspace-name}"
access: {
policy: "token"
min_verification: 0
}
delivery: "at-least-once"
mods: [
mod/auth guard -- verify workspace token
mod/access-control guard -- check resource permissions
mod/workspace transform -- session management, presence
mod/persistence observe -- save events to PostgreSQL
]
transports: [
{ type: "http", endpoint: "https://workspace.openagents.org/v1/ws/{slug}" }
{ type: "websocket", endpoint: "wss://workspace.openagents.org/ws/{slug}" }
]
}Workspace 概念到模型的映射
| Workspace 概念 | 模型等价物 |
|---|---|
| 工作区 | 网络 |
| 工作区令牌 | 网络访问令牌 |
| 会话/线程 | channel/session-{id} |
| 聊天消息 | workspace.message.posted 事件 |
| 状态更新 | workspace.message.status 事件 |
| 智能体花名册 | network.agent.discover 响应 |
| SKILL.md | resource/context/skill-md |
| 主智能体 | 线程级属性(非模型概念) |
| 人类用户 | 网络中的 human:{email} |
| 邀请 | workspace.invitation.created 事件 |
Workspace 专用事件类型
workspace.message.posted A chat message in a session
workspace.message.status A status update in a session
workspace.session.created A new session/thread created
workspace.session.updated Session renamed, status changed
workspace.invitation.created An agent invitation sent
workspace.invitation.accepted An agent accepted an invitation
workspace.invitation.rejected An agent rejected an invitation13. 与其他规范的关系
AsyncAPI
AsyncAPI 是一个用于描述事件驱动 API 的开放规范 — 是 OpenAPI(Swagger)的异步对应物。它定义了一种机器可读格式,用于记录频道、消息、操作、服务器和协议绑定。
关系:互补,而非竞争。
AsyncAPI 描述接口。OpenAgents 网络模型定义运行时行为。它们在不同的层面运作:
| 关注点 | AsyncAPI | OpenAgents 网络模型 |
|---|---|---|
| 目的 | 描述异步 API 以用于文档生成和代码生成 | 定义智能体在运行时如何通信、发现和共享资源 |
| 核心抽象 | 频道、消息、操作 | 网络、事件、模组、寻址 |
| 智能体身份 | 未涉及 | 四个验证级别(L0-L3)、统一寻址、DID 映射 |
| 发现 | 带外(开发者门户) | 网络内基于事件、跨网络基于 DID 解析 |
| 事件管道 | 未涉及 | 模组:有序的守卫 → 转换 → 观察拦截器 |
| 共享资源 | 未涉及 | 一等工具、文件和上下文,带权限模型 |
| 网络边界 | 未涉及 | 显式作用域、跨网络寻址 |
它们如何协同工作: OpenAgents 网络的传输端点可以使用 AsyncAPI 文档来描述。Workspace 网络的 WebSocket 绑定可以被记录为 AsyncAPI 规范 — 将事件类型列为消息,channel/ 实体列为频道,core 列为系统频道。
Google A2A(Agent-to-Agent 协议)
A2A 是一个用于不透明 AI 智能体之间通信的开放协议。它定义了智能体如何发现彼此的能力、交换消息和管理协作任务。
关系:不同的拓扑、不同的抽象、重叠的目标。
| 关注点 | A2A 协议 | OpenAgents 网络模型 |
|---|---|---|
| 拓扑 | 点对点(客户端 → 服务器) | 网络内多对多 |
| 核心抽象 | 具有生命周期状态的任务 | 在网络中流动的事件 |
| 通信 | 请求-响应:发送消息 → 获取任务结果 | 连续事件流 |
| 智能体模型 | 通过 Agent Card 暴露技能的不透明黑盒 | 具有地址、角色、验证和共享资源的网络成员 |
| 有界上下文 | 无 — 智能体直接交互 | 网络是基础边界 |
| 发现 | Well-known URI + 注册表 | 网络内基于事件 + 跨网络基于 DID 解析 |
| 状态模型 | 有状态的任务生命周期 | 无状态事件;持久化是可选的 |
| 多智能体群组 | 未涉及(仅双边) | 频道、群组、广播寻址 |
关键架构差异
任务中心 vs. 事件中心。 A2A 围绕任务组织协作 — 客户端发送消息,服务器创建任务,通过状态推进任务,并产生产物。OpenAgents 模型没有任务的概念。一切都是事件。这使得模型更灵活,但在工作流结构方面更少固化。
双边 vs. 网络。 A2A 定义了智能体 A 如何与智能体 B 对话。OpenAgents 模型定义了智能体 A、B、C、D 如何在共享网络中通信 — 通过频道、群组、广播和模组来协调交互。
发现模型。 A2A 使用 well-known URI 模式,每个智能体发布一个 Agent Card。OpenAgents 模型在网络内使用基于事件的发现,跨网络使用基于 DID 的发现。
互操作性
A2A 在 OpenAgents 网络模型中被列为传输绑定。这意味着:
- OpenAgents 智能体可以暴露 A2A 兼容的接口,发布描述其能力的 Agent Card。
- A2A 客户端可以与 OpenAgents 智能体交互,而无需知道其背后是一个网络。
- OpenAgents 网络可以通过将 A2A 作为传输来集成外部 A2A 智能体。
A2A 传输绑定映射:
- A2A
SendMessage→ 具有适当类型和目标的 OpenAgents 事件 - A2A
Task状态 → OpenAgents 事件(network.event.ack、扩展事件) - A2A
Artifact→ OpenAgents 事件载荷或resource/file/实体 - A2A
AgentSkill→ OpenAgentsresource/tool/注册
附录 A:完整寻址参考
ENTITY ADDRESSING:
agent:{name} local agent
openagents:{name} registered agent (Level 1+)
human:{identifier} human user (local only)
channel/{name} channel / session
mod/{name} mod
group/{name} agent group
resource/tool/{name} shared tool
resource/file/{path} shared file
resource/context/{name} shared context
core the network system
NETWORK SCOPING:
{entity} implied local
local::{entity} explicit local
{network-id}::{entity} cross-network
SPECIAL ADDRESSES:
core network system handler
agent:broadcast all agents and humans
DID FORM:
openagents:{name} -> did:openagents:{name}
URI FORM:
openagents://{network}/{entity}
PARSING:
1. Split on "::" -> [network, entity] (no "::" -> network is "local")
2. Determine entity type by prefix
3. "core" and "agent:broadcast" are special addresses
4. Bare string without prefix -> defaults to agent:{string}附录 B:核心事件类型参考
AGENT LIFECYCLE:
network.agent.join target: core
network.agent.leave target: core
network.agent.discover target: core
network.agent.discover.response target: requesting agent
network.agent.announce target: agent:broadcast
CHANNEL LIFECYCLE:
network.channel.create target: core
network.channel.delete target: core
network.channel.join target: core
network.channel.leave target: core
RESOURCE OPERATIONS:
network.resource.register target: core
network.resource.unregister target: core
network.resource.discover target: core
network.resource.discover.response target: requesting agent
network.resource.invoke target: resource/tool/{name}
network.resource.invoke.result target: invoking agent
network.resource.read target: resource/file/{name}
network.resource.read.response target: requesting agent
network.resource.update target: resource/{type}/{name}
SYSTEM:
network.ping target: core
network.pong target: agent (source: core)
network.event.ack target: original sender
network.event.error target: original sender (source: core)
network.events.query target: core
network.events.response target: requesting agent本文档是一个持续演进的规范。版本 1.0 — 它记录了 OpenAgents 网络模型的设计决策,并将随着实现的成熟而不断发展。