Hermes v0.2 — Early Access

Beautifully simple.
Massively scalable.

A seamless Machine-to-Machine protocol with direct P2P QUIC streaming and the Arion Sync-Engine, securely routing 100GB+ workloads across Subnets.

$ pip install hippius-hermes
P2P CONTROL PLANE Hippius Arion Protocol (Massive Payloads)
Sender
Receiver

The Power of Arion.

A flawless synchronization engine for massive datasets.

hermes.send()
llama-3-70b.safetensors 140.2 GB
4.2 GB/s Arion Sync-Engine

Hippius Arion Protocol

Two data paths for maximum flexibility: stream files directly between peers via QUIC for real-time gradient exchange, or route 100GB+ tensor payloads through the Arion Sync-Engine for persistent storage. NaCl SealedBox encryption (X25519 + XSalsa20-Poly1305) in Rust before data hits the wire.

Hippius Control Plane

Lightning-fast peer-to-peer signaling over QUIC. E2E encrypted signaling via NaCl SealedBox between Node IDs.

Direct P2P Streaming

Push files directly between peers over QUIC bi-streams. No HTTP intermediary, no storage server. Ideal for real-time gradient exchange and live tensor data.

Arion Decentralized Storage

Store and retrieve files on Hippius Arion — a decentralized storage network. Persist model weights, datasets, and checkpoints without centralized servers.

Native S3 Pre-Signed URLs

Automatically generate cryptographic Pre-Signed GET URLs valid for 24 hours. Transmit URLs natively over Iroh QUIC so miners can download massive payloads directly from S3 without bucket credentials.

SS58 Identity

Deterministic Identity

Node identity loads directly from your Ed25519 secret key file, mapped to your SS58 address via the on-chain AccountProfile pallet for cryptographic integrity.

{
  "node_secret_key_path": "/etc/hermes/iroh.key",
  "ss58_address": "5GrwvaEF...",
  "api_token": "sk-live-...",
  "storage_directory": "/var/hermes",
  "subnet_ids": [42, 69],
  "s3": {
    "bucket": "hippius-arion",
    "access_key": "YOUR_KEY",
    "secret_key": "YOUR_SECRET"
  },
  "enable_firewall": true,
  "pullweights_api_key": "sk-pw-...",
  "encryption_key_path": "./hermes_encryption.key"
}

JSON Offline Configuration

Say goodbye to environment variable hell. Provision your Subnet Miners beautifully via the offline hermes_config.json standard, simplifying mass deployments.

  • subnet_integration.py
  • hermes_config.json
  • send_payload.py
  • receive_payload.py
  • send_direct.py
  • send_s3.py
  • receive_direct.py

PyO3 Native Backend

Releases the Python GIL during heavy crypto.

subnet_integration.py
import asyncio
from hermes import Config, HermesClient

async def main():
    # Load config with subnet whitelisting
    config = Config(
        node_secret_key_path="/etc/hermes/iroh.key",
        ss58_address="5GrwvaEF5zXb26Fz9rcQpDW...",
        api_token="sk-your-token",
        storage_directory=".hermes_data",
        subnet_ids=[42, 69]  # Accept traffic from subnets 42 & 69
    )
    client = await HermesClient.create(config)

    # Send model weights directly via P2P QUIC
    filename = await client.send_file_unencrypted(
        "5FHneW46xGXgs5mUiveU4sbTy...",
        "./model_weights.safetensors"
    )
    print(f"Sent! File: {filename}")

if __name__ == "__main__":
    asyncio.run(main())

End-to-End Encrypted.

On-chain public keys. Forward-secret payloads. Zero trust.

  • e2e_encryption.py
  • subnet_integration.py
  • send_direct.py
  • receive_payload.py

Automated Trust

Hermes securely resolves Ephemeral X25519 + XSalsa20-Poly1305 keys under the hood.

e2e_encryption.py
import asyncio
from hermes import Config, HermesClient

async def main():
    config = Config.from_file("hermes_config.json")
    client = await HermesClient.create(config)

    # Hermes natively automates the blockchain identity resolution
    # and NaCl SealedBox encryption (X25519 + XSalsa20-Poly1305).
    await client.send_message_encrypted(
        "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY",
        "encrypted_message",
        b"top secret payload data"
    )
    print("Payload securely encrypted and delivered!")

if __name__ == "__main__":
    asyncio.run(main())