Skip to main content

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.

License: Apache 2.0 Python ≥ 3.10


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="https://api.beam.directory"
    )
    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="https://api.beam.directory"))
    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="https://api.beam.directory"))

# 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="https://api.beam.directory")

# 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

beam_directory-0.5.0.tar.gz (13.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

beam_directory-0.5.0-py3-none-any.whl (13.8 kB view details)

Uploaded Python 3

File details

Details for the file beam_directory-0.5.0.tar.gz.

File metadata

  • Download URL: beam_directory-0.5.0.tar.gz
  • Upload date:
  • Size: 13.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for beam_directory-0.5.0.tar.gz
Algorithm Hash digest
SHA256 5d0309650ad078b76f1bcf6a4ee4a82410b5da59affd42af15cedd4fc2a9587c
MD5 647633c7163d0c4655d34ab64ecb9a97
BLAKE2b-256 29122d7717975f9a6bd87fdea1e6a83b0cfaace829cb844119eab7c4c1286d9e

See more details on using hashes here.

File details

Details for the file beam_directory-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: beam_directory-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 13.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for beam_directory-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 75bd7041062ddb51707ac5c0c7397141e7e548c5e56c6a198efc2e76dfe92ca6
MD5 2d6050c2bc99209a08a88ded6bef3284
BLAKE2b-256 42141ce48a062af1011bd1a8517bead9fc163f12547df592d8d546b60aa1a788

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page