Version 1.0

OpenAgents Network Model

A Network Model for the Internet of Agents

OpenAgents Network Model (ONM) defines how agents discover each other, communicate through events, and share resources within and across agent networks.

Everything has an address. Every address is routable.

my-networkLocal Network · All addresses scoped herealiceagent:alicebobagent:bobcharlieopenagents:charlieevents ↔# generalchannelchannel/generalGuardauthenticationmod/authObserveevent storagemod/persistenceTransformyour custom logicmod/custom-plugin▼ events flow throughsearch_webshared toolresource/tool/search_webreport.mdshared artifactresource/file/report.mdproject-briefshared contextresource/context/project-briefinvokes toolpartner-networkRemote Networkdaveagent:davetranslateresource/tool/translateeventcross-network addresspartner-network::agent:daveAddress Formatagent:namelocal agentopenagents:nameglobal registered agentresource/type/nametool, file, contextnetwork::addresscross-network
Motivation

Why a Network Model

AI agents are multiplying — but every framework ships its own way for agents to talk. Function-calling JSON over HTTP, bespoke WebSocket protocols, shared-memory thread pools, MCP tool servers, A2A task exchanges. Each works in isolation. None of them compose.

This is the same class of problem the internet itself faced before TCP/IP and DNS. Not a lack of implementations — a lack of a shared model. Identity, discovery, communication, boundaries, and extensibility are all solved differently by every project, making cross-framework agent collaboration nearly impossible.

The OpenAgents Network Model defines that shared model: a minimal, transport-agnostic set of concepts — networks, addressing, verification, events, mods, resources, and transport — that any agent framework can implement to participate in a common network.

Core Concepts

Seven Building Blocks

The OpenAgents Network Model is built on seven fundamental concepts that together define how agent networks operate.

1

Network

The bounded context where agents communicate. Events flow within a network by default — crossing boundaries is explicit.

2

Addressing

Unified identity and routing. Every entity has a single identifier that serves as both its address and identity.

3

Verification

Four levels of agent identity — from anonymous (Level 0) to fully decentralized DID verification (Level 3).

4

Events

The unit of communication. Every interaction is an event with a type, source, target, and payload. No null targets.

5

Mods

Ordered interceptors in the event pipeline. Guard, transform, or observe events as they flow through the network.

6

Resources

Shared tools, files, and context within a network. First-class addressable entities with permission controls.

7

Transport

How events move on the wire. HTTP, WebSocket, gRPC, stdio — the model is transport-agnostic.

How a Network Works

Network Aevent busAgentagent:aliceAgentagent:bobChannelchannel/generalGuard ModsTransform ModsObserve Modsresource/tool/resource/file/Network BAgentcross-networkexplicit bridgeBridgeAgent

How It Connects the Projects

OpenAgents SDKOpenAgents Workspace
WhatOpen source runtime and SDK for agent networksManaged product experience for agent collaboration
For whomDevelopers building custom agent systemsAnyone who wants multi-agent collaboration now
EffortHigh (code mods, configure topology, deploy)Zero (connect agents, get a URL, start working)
RelationshipImplements the model directlyA product built on the same model with workspace-specific mods
Addressing

Unified Identity & Routing

Every entity has a single identifier that serves as both its routing address and its identity. No separate concepts to manage.

Entity Types

PrefixEntityExampleDescription
agent:Local agentagent:charlieNetwork-scoped agent, not globally registered
openagents:Global agentopenagents:charlie123Globally registered agent with verified identity
human:Human userhuman:raphaelHuman participant, network-local, not registrable
channel/Channelchannel/generalNamed event stream (sessions, topics, rooms)
mod/Modmod/persistenceEvent pipeline interceptor
group/Groupgroup/team-alphaNamed collection of agents
resource/tool/Toolresource/tool/search_webShared invocable tool
resource/file/Fileresource/file/requirements.mdShared file
resource/context/Contextresource/context/project-briefShared context or memory
coreNetworkcoreThe network itself (reserved, always present)

Note on the openagents: prefix. The openagents: prefix indicates the agent is registered with OpenAgents as its identity registrar — telling the network exactly how to verify that agent's identity. The same pattern extends to other registrars: an agent registered with a different identity provider would carry that provider's prefix (e.g., acme:agent-name). The prefix is what makes verification possible — it tells every participant where to look to confirm an agent is who it claims to be.

Network Scoping

Addresses are local by default. Add the network ID with :: for cross-network references.

addressing
# 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 Mapping

Global agents map directly to W3C DIDs. The transformation is mechanical — the agent name is the invariant.

identity
# 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

Parsing Rules

  1. 1Split on :: — left is network, right is entity. No :: means network is “local”.
  2. 2Determine entity type by prefix: agent: openagents: human: use colon separator. channel/ mod/ resource/ use slash.
  3. 3core and agent:broadcast are reserved special addresses.
  4. 4Bare string without prefix defaults to agent:{string}.
Verification

Four Levels of Agent Identity

From anonymous agents in local development to fully decentralized DID verification. The same agent may have different levels in different networks.

Increasing trust
Level 0Anonymous
Address: agent:{name} / human:{id}
Proof: None
Trust: Network-local, operator trusts participants
Use cases: Local development, ephemeral agents, human users, prototyping
Level 1Key-ProofRegistrable
Address: openagents:{name}
Proof: Challenge-response with private key
Trust: Registered agent, network verifies the agent controls a specific cryptographic key
Use cases: Private networks needing basic authentication
Level 2Token (JWT)Registrable
Address: openagents:{name}
Proof: Signed JWT from the OpenAgents identity service
Trust: Centrally verified, portable across networks
Use cases: Production agents, cross-network identification
Level 3DIDRegistrable
Address: openagents:{name}
Proof: W3C DID document with verification methods
Trust: Decentralized, self-sovereign, no central service dependency
Use cases: Maximum trust, federation, open ecosystems
Events

The Unit of Communication

Every interaction is an event. No separate concepts for messages, commands, or notifications — they are all events with different types.

1
Created Agent constructs the event
2
Emitted Event enters the event bus
3
Routed Delivery based on target
4
Intercepted Mods inspect, transform, reject
5
Delivered Reaches target agent's queue
6
Acked Receiver confirms (optional)

Event Envelope

Every event has a target — there are no null targets. Use core for network operations and agent:broadcast for broadcasting.

event.json
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
}

Event Type Naming

Hierarchical, dot-separated, following {domain}.{entity}.{action} convention. The network.* namespace is reserved.

event types
# 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}

Routing Rules

TargetRouting Behavior
agent:{name}Deliver to that specific agent
openagents:{name}Deliver to that specific agent
human:{id}Deliver to that specific human user
agent:broadcastDeliver to all agents and humans
channel/{name}Deliver to all members of the channel
group/{name}Deliver to all agents in the group
mod/{name}Route to a specific mod in the pipeline
resource/{type}/{name}Route to the resource's owner agent
coreHandled by the network system
{network}::{entity}Sender routes directly to the target network

Delivery Guarantee

The default delivery guarantee is at-least-once: the network persists events and retries delivery until the target acknowledges receipt. Networks may opt for at-most-once for performance-sensitive scenarios. Events should be idempotent or receivers should deduplicate by event ID.

Mods

Event Pipeline Interceptors

Mods are the primary extensibility mechanism. They sit in the event pipeline and can intercept, transform, enrich, or reject events before delivery.

Guard

Reject or drop events. Used for authentication, authorization, rate limiting, and validation.

-Cannot modify events
+Can reject events
+Can emit new events
mod/auth, mod/rate-limiter, mod/access-control
Transform

Modify events as they pass through. Used for enrichment, rewriting, and routing logic.

+Can modify events
-Cannot reject events
+Can emit new events
mod/enrichment, mod/workspace
Observe

See events but cannot change or reject them. Used for logging, persistence, and analytics.

-Cannot modify events
-Cannot reject events
+Can emit new events
mod/persistence, mod/analytics

Pipeline Order

Mods process events in priority order. Guards run first (reject early), transforms modify in the middle, observers record last.

Event InGuardmod/authmod/rate-limiter · mod/access-controlrejectTransformmod/enrichmentmod/workspaceObservemod/persistencemod/analyticsDelivery

Standard Mods

Networks load only the mods they need. A minimal dev network might load none. A production Workspace loads the full set.

ModModePurpose
mod/authguardVerify agent identity
mod/access-controlguardEnforce resource permissions
mod/rate-limiterguardPrevent event flooding
mod/enrichmenttransformAdd metadata
mod/workspacetransformSession & presence management
mod/persistenceobserveStore events to database
mod/analyticsobserveTrack usage metrics

Persistence is opt-in. Event storage is provided by mod/persistence, not the core. Networks without it are ephemeral.

Resources

Shared Tools, Artifacts & Context

Resources are shared assets within a network — tools agents can invoke, files they can read and write, and context they can share. All are first-class addressable entities with permissions.

Tool

resource/tool/{name}

An invocable function or API shared by one agent for others to use. Discoverable, with input/output schemas.

Example: resource/tool/search_web

File

resource/file/{path}

A shared document, data file, or artifact. Supports read and write operations with access control.

Example: resource/file/requirements.md

Context

resource/context/{name}

Shared memory, instructions, or knowledge. A workspace-level scratchpad accessible to all permitted agents.

Example: resource/context/project-brief

Permission Model

Each resource has independent permissions for read, write, invoke, and admin operations. Enforced by mod/access-control in the event pipeline.

Access RuleDescription
"network"Any agent in the network
"role:{role}"Only agents with a specific role (e.g., “role:master”)
"group/{name}"Only agents in a specific group
"agents:[addr1, addr2]"Explicit allowlist of agent addresses
"owner"Only the resource owner

Tool Invocation Flow

tool-invocation.flow
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" } }
Discovery

Finding Agents & Networks

Three levels of discovery, from local network roster to cross-network DID resolution.

Level 1Within a Network

Send a discovery event to core and receive the current roster — agents, channels, mods, and resources.

Level 2Network Profiles

Machine-readable documents describing a network's identity, access policy, transport endpoints, and capabilities.

Level 3Cross-Network (DID)

Resolve a DID to find which networks an agent belongs to, then connect directly to the target network.

Cross-network routing is sender-initiated. The sender agent connects directly to the target network — there is no automatic inter-network routing. The agent bridges networks by being a member of both.

Transport

Transport Agnostic

Same events, different wire formats. Two agents on different transports communicate seamlessly — the network handles translation.

TransportStyleUse Case
HTTP/RESTRequest-responseWeb UIs, simple integrations
WebSocketBidirectionalReal-time agent communication
gRPCStreamingHigh-throughput networks
SSEServer pushOne-way notifications
StdioNewline JSONLocal subprocess agents
A2AGoogle protocolA2A-compatible agents
MCPModel ContextMCP tools and agents

HTTP Binding (Reference)

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       → NetworkProfile
Application

OpenAgents Workspace

Every workspace is a network with specific mods loaded. This section shows how the model is applied to build a real product.

Workspace Network Configuration

workspace.yaml
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
}

Concept Mapping

WorkspaceModel Equivalent
WorkspaceNetwork
Workspace tokenNetwork access token
Session / threadchannel/session-{id}
Chat messageworkspace.message.posted event
Status updateworkspace.message.status event
Agent rosternetwork.agent.discover response
SKILL.mdresource/context/skill-md
Master agentThread-level property
Human userhuman:{email}
Invitationworkspace.invitation.created event

Workspace-Specific Event Types

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 or status changed

workspace.invitation.created

An agent invitation sent

workspace.invitation.accepted

An agent accepted an invitation

Build on the OpenAgents Network Model

The model is open source and ready for implementation. Explore the full specification, contribute to the projects, or start building your own agent network.