Skip to main content

aun

AUN (Agent Union Network) Protocol Core SDK for Python.

Provides identity management, PKI authentication, key storage, and end-to-end encryption for agent-to-agent communication.

Features

  • Identity & Authentication — X.509 certificate-based two-phase challenge-response (ECDSA P-256/P-384)
  • Certificate Verification — Full chain validation, CRL, OCSP, with caching and parallel verification
  • Key Management — File-based keystore with platform-native secret protection (Windows DPAPI)
  • End-to-End Encryption — P256_HKDF_SHA256_AES_256_GCM (protocol extensible). Offline prekey-based encryption (four-way ECDH), group E2EE with epoch key management
  • Async Transport — WebSocket JSON-RPC 2.0, auto-reconnect, heartbeat, token refresh

Requirements

  • Python >= 3.11

Installation

pip install aun

Quick Start

import asyncio, random
from datetime import datetime
from aun_core import AUNClient

def ts():
    return datetime.now().strftime("%H:%M:%S.%f")[:-3]

# ── Configuration (modify as needed) ──
DOMAIN = "agentid.pub"
ALICE = f"alice{random.randint(1000,9999)}.{DOMAIN}"
BOB = f"bob{random.randint(1000,9999)}.{DOMAIN}"


async def create_client(aid: str) -> tuple[AUNClient, dict]:
    """Create client -> load or create AID -> authenticate -> return (client, auth)"""
    client = AUNClient({"aun_path": f"~/.aun/{aid}"})

    # Try loading existing identity
    identity = client._auth.load_identity_or_none(aid)
    if not identity:
        # Create if not exists
        try:
            await client.auth.create_aid({"aid": aid})
        except Exception as e:
            print(f"Failed to create AID ({aid}): {e}")
            raise

    auth = await client.auth.authenticate({"aid": aid})
    return client, auth


async def main():
    alice = None
    bob = None
    
    try:
        # 1. Create two clients
        alice, alice_auth = await create_client(ALICE)
        bob, bob_auth = await create_client(BOB)

        # 2. Bob subscribes to message events
        received = asyncio.Event()
        def on_bob_message(event):
            print(f"[{ts()}] [Bob received] {event['payload']}")
            received.set()

        bob.on("message.received", on_bob_message)

        # 3. Both connect to gateway
        await alice.connect(alice_auth, {})
        await bob.connect(bob_auth, {})
        print(f"[{ts()}] Alice ({ALICE}) connected")
        print(f"[{ts()}] Bob   ({BOB}) connected")

        # 4. Alice sends a message to Bob
        result = await alice.call("message.send", {
            "to": BOB,
            "type": "text",
            "payload": {"text": "Hello from Alice!"},
        })
        print(f"[{ts()}] [Alice sent] {result}")

        # 5. Wait for Bob to receive the message (up to 5s)
        try:
            await asyncio.wait_for(received.wait(), timeout=5.0)
        except asyncio.TimeoutError:
            # Event push not triggered, try pulling manually
            pull = await bob.call("message.pull", {"after_seq": 0, "limit": 10})
            msgs = pull.get("messages", [])
            if msgs:
                print(f"[{ts()}] [Bob pulled] received {len(msgs)} messages:")
                for m in msgs:
                    print(f"  {m.get('payload')}")
            else:
                print(f"[{ts()}] [Bob] no messages received")

        print(f"[{ts()}] done")
    finally:
        # 6. Close
        if alice:
            await alice.close()
        if bob:
            await bob.close()


asyncio.run(main())

License

Apache License 2.0 — see LICENSE.

Metadata

Release files for aunp 0.2.11

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aunp 0.2.11
File Size Uploaded Provenance
aunp-0.2.11.tar.gz 215.1 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for aunp 0.2.11
File Interpreter ABI Platform
aunp-0.2.11-py3-none-any.whl Python 3 none any Details

Total release size: 471.8 kB

Release files / aunp-0.2.11.tar.gz

Download URL aunp-0.2.11.tar.gz
Size 215.1 kB
Tags Source
SHA-256 checksum
How to use checksums
c7f2cb546315c08ccf955cde17f85aa85abe0c67bbcbd9c616f87ec03c336058
BLAKE2b-256 checksum
How to use checksums
67f8a4df186e4dc90af926459fbf87bf4a80350861c2b40ec7f5d1851a66e8d1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Release files / aunp-0.2.11-py3-none-any.whl

Download URL aunp-0.2.11-py3-none-any.whl
Size 256.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8edd612de55ceeff0025b676778a997ec13e61d328b476fe7be15690a6bb6e17
BLAKE2b-256 checksum
How to use checksums
227a1c61db7eb0cabbe8bb073f8124e1151dc926acd125e609ce0c0ee2f82c58
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Security for aunp 0.2.11

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.2.11 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page