Skip to main content

HiveLLM binary RPC (Thunder) - wire v1 codec, family profiles, sync/async multiplexed clients

Project description

hivellm-thunder

⚡ The HiveLLM binary RPC protocol for Python — wire v1 (frozen), one configurable standard, sync + async multiplexed clients

Thunder is the shared home of the HiveLLM binary RPC standard: a length-prefixed MessagePack protocol (u32 LE length + body) multiplexing concurrent requests over one persistent TCP connection. This package is the Python implementation — import name thunder_rpc, one runtime dependency (msgpack), conformance-tested against the language-neutral golden-vector corpus in conformance/.

Install

pip install hivellm-thunder

Quickstart — sync

from thunder_rpc import Client, ClientConfig, Config, Credentials, Value

# Your application's identity on top of the family standard.
config = Config.standard().with_scheme("myapp").with_port(9000)

client_config = ClientConfig(credentials=Credentials.api_key("secret-key"))
with Client.connect("myapp://localhost", config, client_config) as client:
    pong = client.call("PING")
    assert pong.as_str() == "PONG"

    hits = client.call("SEARCH", [Value.str("docs"), Value.bytes(embedding)], timeout=5.0)

Quickstart — async

from thunder_rpc import AsyncClient, Config

config = Config.standard().with_scheme("myapp").with_port(9000)

async with await AsyncClient.connect("myapp://localhost", config) as client:
    pong = await client.call("PING")
    assert pong.as_str() == "PONG"

Both clients implement the identical SPEC-003 contract: pipelined out-of-order completion, monotonic u32 ids (skipping PUSH_ID), serialized writes, max_in_flight backpressure, per-call timeouts (default 30 s), lazy 2-attempt reconnect with re-handshake, typed errors, and push-frame routing. The asyncio client additionally honors task cancellation by removing the pending entry (CLT-021).

One standard, zero product knowledge

Thunder is a protocol library, not a product catalogue: there is no registry of named configurations, because a library that must serve implementations which do not exist yet cannot ship a hardcoded list of the ones that did. Instead Config.standard() is the family standard (data, not behavior — SPEC-002), pinned to conformance/standard.yaml by the test suite so all four language implementations agree on what "standard" means:

Dimension Standard Why
handshake HELLO_MANDATORY the only shape that negotiates proto and advertises capabilities
hello_style MAP_PAYLOAD {version, token | api_key, client_name}; reply carries proto + capabilities
push RESERVED emitting push is a capability an application opts into
max_frame_bytes 64 MiB checked before allocation (WIRE-020)
max_in_flight 256 per-connection request bound
error_codes BOTH "[code] message" superset recognizing the RESP3 auth tokens — needs no negotiation
tls OFF additive capability a deployment turns on, never a dialect

scheme and default_port are deliberately not part of the standard: identity is your application's, and Thunder has no opinion about it. An application that matches the standard writes its identity and nothing else:

config = Config.standard().with_scheme("myapp").with_port(9000)

An application that still diverges says so in its own repository, where that knowledge belongs — every dimension is a with_* override returning a new frozen Config (plain Config(...) construction works too):

config = (
    Config.standard()
    .with_scheme("legacy")
    .with_port(15501)
    .with_handshake(Handshake.AUTH_COMMAND)   # AUTH-command auth, no HELLO handler
    .with_hello_style(HelloStyle.NOT_USED)
    .with_push(PushPolicy.ENABLED)            # ships a push-producing command
)

Convergence is then visible and per-application: delete overrides until only identity remains. Nobody waits on a Thunder release for a row in a registry (PRO-020).

Endpoints accept scheme://host[:port] — where the scheme is your config.scheme — or bare host:port; http(s):// is rejected (Thunder is RPC-only).

Error classes

All errors derive from thunder_rpc.ThunderError; branch on the class and code, never on message text (CLT-052):

Class Meaning
AuthError Handshake rejected, or NOAUTH/WRONGPASS/NOPERM reply
ServerError Server answered Err — raw message + optional bracket code
ConnectionError Dial/write failure, dead connection, invalid endpoint
TimeoutError Connect or per-call timeout elapsed
FrameTooLargeError Frame over the config's cap (checked before allocation)
DecodeError Malformed frame, or push frame while push is RESERVED

Wire layer

thunder_rpc.wire is pure (no sockets): encode_frame, decode_request, decode_response over the 8-variant Value model (Null | Bool | Int | Float | Bytes | Str | Array | Map). Canonical bytes are pinned by the corpus: Bytes emits as MessagePack bin, floats always pack as f64 bit-exact, structs are array-encoded; legacy int-array Bytes and map-shaped Request decode but are never re-emitted.

Development

pip install -e .[dev]
python -m pytest          # includes the conformance corpus — never skipped
ruff check .

Specs

Apache-2.0 — part of the Thunder monorepo release train.

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

hivellm_thunder-0.1.0.tar.gz (38.0 kB view details)

Uploaded Source

Built Distribution

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

hivellm_thunder-0.1.0-py3-none-any.whl (32.2 kB view details)

Uploaded Python 3

File details

Details for the file hivellm_thunder-0.1.0.tar.gz.

File metadata

  • Download URL: hivellm_thunder-0.1.0.tar.gz
  • Upload date:
  • Size: 38.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for hivellm_thunder-0.1.0.tar.gz
Algorithm Hash digest
SHA256 8f8e97458d7179175ef67e3bf9164dde82c6c51997e99a50a8232749e9ace98c
MD5 e3b1c440298e58b938a81dfcd62f4a57
BLAKE2b-256 ea4f8cd14c569eca519e6f0ab57df583e9dba793ab8a889279216d2fa915afb1

See more details on using hashes here.

File details

Details for the file hivellm_thunder-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for hivellm_thunder-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2c8a218f5a7f400cc27889f9a0bace1fa5a95b6af7b3dfd5b98d9b48645699ec
MD5 ba5a929423d7e41c2caf2850fe5beb39
BLAKE2b-256 30031cd407b231bd32fc190f9610d5c6c9907798838a76c0e04cf82f486190ff

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