Python SDK for the Beam Protocol — SMTP for AI Agents
Project description
beam-directory · Python SDK
SMTP for AI Agents — Python SDK for agent identity, registration, discovery and intent routing via the Beam Protocol.
Installation
pip install beam-directory
With WebSocket support:
pip install "beam-directory[websocket]"
Quick Start
import asyncio
from beam_directory import BeamIdentity, BeamDirectory, BeamClient
from beam_directory.types import DirectoryConfig, AgentSearchQuery
async def main():
# 1. Generate a Beam identity
identity = BeamIdentity.generate(agent_name="myagent", org_name="myorg")
print(f"Beam ID: {identity.beam_id}")
# → myagent@myorg.beam.directory
# 2. Register with a directory
client = BeamClient(
identity=identity,
directory_url="http://localhost:3100"
)
record = await client.register("My Agent", capabilities=["query", "answer"])
print(f"Registered! Trust score: {record.trust_score}")
# 3. Look up another agent
directory = BeamDirectory(DirectoryConfig(base_url="http://localhost:3100"))
agent = await directory.lookup("other@org.beam.directory")
if agent:
print(f"Found: {agent.display_name}")
# 4. Search agents
agents = await directory.search(AgentSearchQuery(org="myorg", limit=10))
for a in agents:
print(f" {a.beam_id} — {a.display_name}")
# 5. Send an intent
result = await client.send(
to="other@org.beam.directory",
intent="query",
params={"q": "What is the weather?"}
)
if result.success:
print(f"Result: {result.payload}")
else:
print(f"Error: {result.error}")
asyncio.run(main())
Concepts
Beam ID
Every agent has a globally unique Beam ID in the format:
agent@org.beam.directory
Like an e-mail address, but for AI agents.
Intent Frames
Agents communicate via Intent Frames — small JSON objects (<1 KB) signed with Ed25519:
{
"v": "1",
"intent": "query",
"from": "jarvis@coppen.beam.directory",
"to": "clara@coppen.beam.directory",
"params": { "q": "Current pipeline status?" },
"nonce": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-03-04T00:00:00Z",
"signature": "<Ed25519 base64>"
}
Trust Scores
The directory assigns trust scores (0.0–1.0) based on:
- Domain ownership verification (DNS TXT record)
- Agent uptime and heartbeat frequency
- Signature verification success rate
API Reference
BeamIdentity
# Generate a new identity
identity = BeamIdentity.generate(agent_name="agent", org_name="org")
# Export / import
data = identity.export() # BeamIdentityData
identity = BeamIdentity.from_data(data)
# Sign and verify
sig = identity.sign("payload")
ok = BeamIdentity.verify("payload", sig, identity.public_key_base64)
# Parse a Beam ID
parts = BeamIdentity.parse_beam_id("agent@org.beam.directory")
# → {"agent": "agent", "org": "org"}
BeamDirectory
from beam_directory import BeamDirectory
from beam_directory.types import DirectoryConfig
dir = BeamDirectory(DirectoryConfig(base_url="http://localhost:3100"))
# Register
record = await dir.register(identity.to_registration("My Agent", ["query"]))
# Lookup
agent = await dir.lookup("agent@org.beam.directory")
# Search
agents = await dir.search(AgentSearchQuery(org="myorg", capabilities=["query"]))
# Heartbeat
await dir.heartbeat("agent@org.beam.directory")
BeamClient
client = BeamClient(identity=identity, directory_url="http://localhost:3100")
# Register shortcut
record = await client.register("My Agent", ["query", "answer"])
# Send intent
result = await client.send(to="other@org.beam.directory", intent="query", params={})
# Handle incoming intents
@client.on_intent("query")
async def handle_query(frame):
return create_result_frame(
success=True,
nonce=frame.nonce,
payload={"answer": "42"}
)
Development
git clone https://github.com/Beam-directory/beam-protocol
cd beam-protocol/packages/sdk-python
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest
License
Apache 2.0 — see LICENSE.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file beam_directory-0.1.0.tar.gz.
File metadata
- Download URL: beam_directory-0.1.0.tar.gz
- Upload date:
- Size: 12.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7291209131f3e2e709173c00f5e203d7a96b834f0d1b6d4b58eae36008316828
|
|
| MD5 |
6ec0f46d04c6b59612a520e89a7c6ccf
|
|
| BLAKE2b-256 |
e28e0e330fe89f22de7474e3768a8bcf309fd7e0ebf9564e35d728a15296ef2b
|
File details
Details for the file beam_directory-0.1.0-py3-none-any.whl.
File metadata
- Download URL: beam_directory-0.1.0-py3-none-any.whl
- Upload date:
- Size: 13.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a826e9074913ff0b74acb38324391e98d4d78a6e1bfa662916487753f2f39964
|
|
| MD5 |
623879f3eaadbaed17dc81aa53178cde
|
|
| BLAKE2b-256 |
61d614b775832b20b4de9416a24e1e3263446c99c94d7b468884ce0790cdeae8
|