OpenNodes Node Kit (Python) — MVP
Implements REQ-003 (subset): a reverse proxy that turns any OpenAI-compatible engine
(vLLM, TGI, Ollama — all expose /v1) into a conforming ONP Node without touching the engine.
Requires Python ≥3.11. Dependencies: aiohttp, cryptography.
What it does
onp-node init— interrogates the engine's/v1/models, writesonp-node.toml(operator fills in pricing / data policy / identity) and generates an Ed25519 signing key.onp-node serve— serves the signed Node Card at/.well-known/open-node.json, JWKS, the HTTP challenge endpoint,/onp/health, and proxies/v1/models+/v1/chat/completionswith the ONP layer: header validation (409offering-mismatch/price_changed), usage accounting (engineusagepassed through; approximated when the engine omits it), and signed receipts — inline JWS header for non-streaming, by-URL (/onp/receipts/{id}, materialized after the stream ends) for streaming. Plain OpenAI traffic without ONP headers passes untouched (NK-INV-02) — existing engine users are unaffected.onp-node check— client-side Stage A self-test (card, signature, health, models agreement, blind invocation with usage + receipt);registerrefuses to submit while it fails (NK-REG-04,--forceoverrides).onp-node register <registry>— submits the card URL, stages the HTTP challenge token (the kit serves it itself), completes verification, prints the resulting tier + Stage A verdict.
Cross-language proof
tests/test_e2e.py runs a mock engine → the kit → the real JS registry as a subprocess:
registration, challenge, card signature verification across languages (Python Ed25519
signer, JS verifier, byte-identical stable JSON), Stage A pass to community, search with
real pricing, pinned invoke with Python-verified receipt math, streaming receipt-by-URL,
both 409s, and untouched plain-OpenAI traffic.
python -m venv .venv
.venv\Scripts\python -m pip install aiohttp cryptography
.venv\Scripts\python -m unittest discover -s tests
Real deployment (e.g. Ollama on this machine)
pipx install onp-node # from PyPI; from a checkout: pipx install ./node-kit
onp-node init --engine http://127.0.0.1:11434/v1 --id org.example.mybox --public-url https://ai.example.org
# review onp-node.toml (pricing, data_policy), then:
onp-node serve # add --mdns (pip install 'onp-node[mdns]') so LAN clients such as onp-ollama discover it
onp-node check
onp-node register https://registry.example.org
MVP shortcuts (vs REQ-003)
- Prepaid API-key management (
onp-node keys), free-tier rate limiting, probe-allowance accounting, Prometheus metrics, status UI: not yet built (NK-PAY-02/03, NK-INV-04, NK-REG-05). - Engine adapters beyond the OpenAI-compatible surface (Ollama
/api/tagsfallback, TGI/infodetails, capability probing for tool_calls/vision) are minimal: models come from/v1/modelsonly,supportsdefaults to["streaming"]. - Card revision changes require a serve restart; no
apply/ping-on-revision yet (NK-REG-02). - TLS termination is assumed to happen in front (reverse proxy/ingress).
Metadata
Release files for onp-node 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| onp_node-0.1.1.tar.gz | 17.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| onp_node-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.3 kB
Release files / onp_node-0.1.1.tar.gz
| Download URL | onp_node-0.1.1.tar.gz |
|---|---|
| Size | 17.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
955500f656e2039b504d90b768e648492e9c9a822c33e5e52a59a959977aa117
|
|
BLAKE2b-256 checksum How to use checksums |
c5f7d620975a72ce8d08c29e900b21633b892e6913cfcb22f76f5d71772464dd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.0
|
Release files / onp_node-0.1.1-py3-none-any.whl
| Download URL | onp_node-0.1.1-py3-none-any.whl |
|---|---|
| Size | 14.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
11deac6a396baee77bbba731e4e220d2085bc46276093722f6576f6ade814451
|
|
BLAKE2b-256 checksum How to use checksums |
e1a51f59602e7140d199f031bf568470afb27d1978548cfcd7fe4be7982f2977
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.0
|