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.1.tar.gz (48.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.1-py3-none-any.whl (37.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: hivellm_thunder-0.1.1.tar.gz
  • Upload date:
  • Size: 48.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for hivellm_thunder-0.1.1.tar.gz
Algorithm Hash digest
SHA256 29d4a315a614aa3dd8e288d09203535a0303e62c211df361696f9e2ef630d08b
MD5 c6cbeb47ed559116ecb7250a9ff3b78a
BLAKE2b-256 24fa2e8fff4415d76adf3bd3e13bfb7bb8966f96e63afd0591afbd4cda6c32a3

See more details on using hashes here.

Provenance

The following attestation bundles were made for hivellm_thunder-0.1.1.tar.gz:

Publisher: release.yml on hivellm/thunder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: hivellm_thunder-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 37.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for hivellm_thunder-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5de0f67629051c2624a8ca3fdc0643fb2a05d0476ab1880713e098503d966073
MD5 1967903bdff744b208f524393b2cd521
BLAKE2b-256 98d376c5c545ab9f9f59dfa2ff039a9d21fece2400667bddab4e051364b1fa0d

See more details on using hashes here.

Provenance

The following attestation bundles were made for hivellm_thunder-0.1.1-py3-none-any.whl:

Publisher: release.yml on hivellm/thunder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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