virohana-agent
Thin Python client for buying work from Virohana machine to machine: discover the catalog, parse the x402 v2 quote, verify the receipt offline against a pinned Ed25519 key.
Sovereign, humanity-first AI. Own the AI. Own your life.
pip install virohana-agent
What it does — and what it deliberately does not
| Discover the labor + memory catalogs | ✅ |
| Parse an HTTP 402 into a typed x402 v2 quote | ✅ |
| Verify a receipt's Ed25519 signature, offline | ✅ |
| Sign and send the payment | ❌ — use x402 |
Paying means holding a wallet key. A discovery client is the wrong place for one, so this package never asks for it. Hand the parsed quote to the thing that already owns your key.
Discover
from virohana_agent import Catalog
cat = Catalog.fetch() # two plain GETs, no auth, no account
print(len(cat), "skills")
s = cat.get("summarize", service="labor")
print(s.sku, s.price_usdc, s.url) # summarize 0.03 https://labor…/v1/summarize
summarize and notarize exist on both services at different prices, so
get() raises rather than picking one for you. service= disambiguates.
Quote
quote = cat.quote("summarize", {"text": "…"}, service="labor")
req = quote.cheapest()
req.amount_usdc # 0.03
req.amount_atomic # 30000 (USDC is 6 decimals)
req.network # 'eip155:8453' — Base
req.pay_to # '0x…'
req.is_usdc_on_base # True
req.input_schema # {'type': 'object', 'required': ['text'], …}
Quoting is free and commits to nothing: an unpaid request is how x402 quoting works. The client refuses anything that is not x402 v2 rather than guessing at another version's field names.
Verify — offline, always
from virohana_agent import verify_receipt
result = verify_receipt(receipt, response_body_bytes)
result.settlement_url() # https://basescan.org/tx/0x… — for you to open
Three checks, in the order they fail cheaply:
- Commitment —
sha256(body) == receipt.response_sha256. Proves the receipt is about your bytes. - Signature — Ed25519 over the raw response bytes.
- Pinning — the signing key is one this package shipped with.
(3) is what makes (2) worth doing. Verifying a signature against a key the
receipt itself handed you proves only that the receipt is internally
consistent. The pinned keys are in virohana_agent.receipts; rotating one
means a new release of this package, on purpose.
Nothing in the verify path touches the network. A verifier that asks the
seller "is this receipt valid?" proves nothing — a dishonest seller answers
yes. Settlement is the one check left to you: settlement_url() gives you
the explorer link, because confirming it would mean an RPC call this module
promises not to make.
body must be the raw bytes off the wire. Re-serialising parsed JSON
changes key order and whitespace, and the signature will not verify — that is
the signature working, not a bug. Passing a str raises for exactly this
reason.
Offline use
Everything except Catalog.fetch() and Catalog.quote() works with no
network at all:
cat = Catalog.from_payloads(labor=my_cached_x402, memory=my_cached_catalog)
Tests
PYTHONPATH=src python3 -m unittest discover -s tests -v
24 tests, no network. Fixtures are real payloads captured from the live services — a synthetic fixture would let this client drift away from what the servers actually send, which is the failure the suite exists to catch.
Links
MIT. Virohanalife OÜ, Tallinn, Estonia.
Metadata
Release files for virohana-agent 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| virohana_agent-0.1.0.tar.gz | 18.6 kB | Without provenance | Details for virohana_agent-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| virohana_agent-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for virohana_agent-0.1.0-py3-none-any.whl |
Total release size: 35.2 kB
Release files / virohana_agent-0.1.0.tar.gz
| Download URL | virohana_agent-0.1.0.tar.gz |
|---|---|
| Size | 18.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fabfdf289349707a967e48c430c8fd5e19eda73e0c69ade4b1d067836728399d
|
|
BLAKE2b-256 checksum How to use checksums |
03c375209722f8155596e9423f8c7e0077962363716f4368c86fe8c310c61c44
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.4
|
Release files / virohana_agent-0.1.0-py3-none-any.whl
| Download URL | virohana_agent-0.1.0-py3-none-any.whl |
|---|---|
| Size | 16.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f8c5168b48ce29e086859cca785a9ba4ce516879fb40ee452194fde3a305214e
|
|
BLAKE2b-256 checksum How to use checksums |
96b8f477f3668bbaa36f0da9e0d29ee8e0fc69ededb0054ef46f9568c7ac967e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.4
|
Security for virohana-agent 0.1.0
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.
To learn more about protecting yourself from malicious actors, visit our package security documentation.