Orvix Node Software
A Python agent that runs on a GPU provider's machine. It connects to the Orvix Orchestrator over WebSocket, registers its GPU, receives inference jobs, runs them, and returns results — earning USDC for the provider.
Inference is mocked by default, so the whole pipeline runs on a machine with
no GPU at all. Set backend: "vllm" to serve real traffic — that path is live,
and image generation runs alongside it on the same card.
Hardware requirements
- For real inference: NVIDIA GPU, CUDA 11+, 8 GB+ VRAM (Linux).
- For development: anything — use
ORVIX_NODE_STUB_GPU=trueand the mock backend.
Installation
One-line (Linux providers):
curl -sSL https://raw.githubusercontent.com/OrvixCompute/orvix/main/orvix-node/install.sh | bash
orvix-node join # paste the credentials from the dashboard
orvix-node start
Manual (development, any OS):
cd orvix-node
python -m venv .venv
# Windows: .venv\Scripts\Activate.ps1 | Unix: source .venv/bin/activate
pip install -e . # core only (mock backend)
# pip install -e .[nvml] # + real GPU detection (no vLLM)
# pip install -e .[gpu] # + vLLM for real inference (Linux/CUDA)
Verify:
orvix-node --version
Configuration
Create the config file:
orvix-node config init # writes ~/.orvix/config.yaml
orvix-node config show # prints resolved config (secrets masked)
Precedence: CLI flags > env vars (ORVIX_NODE_*) > config file > defaults.
Required fields: provider_id, node_secret (get them from
POST /v1/provider/register on the orchestrator).
Running
# Development without a GPU (mock everything):
ORVIX_NODE_STUB_GPU=true orvix-node start
# Check the GPU detector:
ORVIX_NODE_STUB_GPU=true orvix-node gpu
ORVIX_NODE_STUB_GPU=true orvix-node gpu --watch
# Run inference locally without the orchestrator:
orvix-node test-inference --prompt "Hello, world"
orvix-node test-inference --prompt "Stream this" --stream
# Live status (queries the local health endpoint):
orvix-node status
# Tail logs:
orvix-node logs --tail 100 --follow
The node exposes a local health server (default :9000):
GET /health→ status, uptime, current jobs, GPU health, orchestrator connectionGET /metrics→ counters + live GPU metrics
Running as a systemd service
The installer can set this up, or do it manually:
# /etc/systemd/system/orvix-node.service
[Service]
ExecStart=%h/.local/bin/orvix-node start
Restart=always
sudo systemctl enable --now orvix-node
systemctl status orvix-node
Connection flow
Node Orchestrator
│ ── WS connect /v1/node/connect ───────▶ │
│ ── RegisterMessage ───────────────────▶ │ validate provider + secret
│ ◀── RegisterAck(accepted, node_id) ──── │
│ │
│ ── Heartbeat (every 15s) ─────────────▶ │ status, current_jobs, GPU metrics
│ ◀── JobMessage ──────────────────────── │ dispatched inference request
│ ── JobResult / JobChunk(stream) ──────▶ │ result correlated to the job
│ ◀── Ping / Shutdown ─────────────────── │
On disconnect the node reconnects with exponential backoff (1→2→4…→60s).
A rejected registration (accepted=false) is not retried.
Releasing
Publishing is automated and tokenless — PyPI trusts this repository through OIDC, so there is no API token to leak.
# 1. bump orvix_node/version.py (the single source; pyproject reads it)
# 2. merge that
git tag node-v0.2.1
git push origin node-v0.2.1
The node- prefix matters: this repository also tags its own releases as
v0.2.0, and the package has a separate version line. The prefix says which
artefact moved.
The workflow refuses to publish if the tag disagrees with version.py. PyPI
never lets a version be re-uploaded, so a mismatch is worth failing on rather
than discovering afterwards.
Never move a tag that has already published. Repointing node-v0.2.2 at a
newer commit re-runs the workflow, which rebuilds the same version and dies on
400 File already exists — PyPI refuses a filename it has seen before, even
after a deletion, and that is deliberate. This happened twice on 2026-08-08:
the release at 08:58 succeeded and the two red runs after it were the same
0.2.2 being re-uploaded, not a broken release. New content means a new version:
bump version.py, merge, tag again. To re-attempt a release that genuinely
failed (a PyPI outage, say), use the workflow's workflow_dispatch trigger
rather than touching the tag.
Providers install the last published version. A fix merged to main does
not reach them until a release is cut — set ORVIX_NODE_REF to install from a
git ref if you need one before then.
Architecture
| File | Responsibility |
|---|---|
cli.py |
Click commands; wires config → GPU → backend → executor → client |
config.py |
Layered config (CLI/env/file/defaults), pydantic-validated |
gpu.py |
GPUDetector (pynvml) with stub mode |
protocol.py |
Wire messages — kept identical with the orchestrator |
client.py |
WebSocket connection, register, heartbeat, reconnect |
executor.py |
Concurrency-limited job execution + metrics |
inference/ |
base interface, mock (default), vllm (real inference) |
health.py |
Local FastAPI health/metrics server |
state.py |
Singleton runtime state |
Local integration with the orchestrator
- Run the orchestrator on
:8000. - Point the node at it:
ORVIX_NODE_ORCHESTRATOR_URL=ws://localhost:8000. - Start the node (
ORVIX_NODE_STUB_GPU=true orvix-node start). - Send a request via the OpenAI client to the orchestrator — it routes to the node.
Testing
pip install -e .[dev]
pytest -q
# Standalone client smoke test against an in-process mock server:
ORVIX_NODE_STUB_GPU=true python test_connection.py
Troubleshooting
No GPU detected—pip install --upgrade "orvix-node[nvml]", or setORVIX_NODE_STUB_GPU=truefor development.Refusing insecure ws://— onlyws://localhostis allowed without TLS; usewss://for remote orchestrators.- Auth failed (exit 2) — check
provider_id/node_secretagainst the orchestrator's/v1/provider/register.
Status
Job routing, provider earnings and USDC withdrawals are live, and vLLM inference and image generation both run in production. Providers are paid a share of each job they serve.
Staking is disabled during alpha, so the provider stake requirement is not enforced yet. Expect breaking changes.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file orvix_node-0.2.3.tar.gz.
File metadata
- Download URL: orvix_node-0.2.3.tar.gz
- Upload date:
- Size: 57.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c70e80b902fa2392a60f38314d38957151115579a3a9e498013e99183e5649ab
|
|
| MD5 |
1916b1ff65ff4d69c91cdaeec605f5bc
|
|
| BLAKE2b-256 |
0d473b7497750b22365985b2f6d1fa19e3386143a4ca9c494fe76e5f51fb90ff
|
Provenance
The following attestation bundles were made for orvix_node-0.2.3.tar.gz:
Publisher:
release-node.yml on OrvixCompute/orvix
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
orvix_node-0.2.3.tar.gz -
Subject digest:
c70e80b902fa2392a60f38314d38957151115579a3a9e498013e99183e5649ab - Sigstore transparency entry: 2393702954
- Sigstore integration time:
-
Permalink:
OrvixCompute/orvix@4587642895e466a56d33f929a30747dec1200c93 -
Branch / Tag:
refs/tags/node-v0.2.3 - Owner: https://github.com/OrvixCompute
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-node.yml@4587642895e466a56d33f929a30747dec1200c93 -
Trigger Event:
push
-
Statement type:
File details
Details for the file orvix_node-0.2.3-py3-none-any.whl.
File metadata
- Download URL: orvix_node-0.2.3-py3-none-any.whl
- Upload date:
- Size: 47.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dab4a98534d43a563428e289ab5693ac006dd4aa0373f82264529c4aa4d24933
|
|
| MD5 |
e8efa913f5434a5ee62d54bbc1aa98ad
|
|
| BLAKE2b-256 |
5926be59e04345c993209093d8ad7c36c09febdc6a9ee34cd12580bcb87764ee
|
Provenance
The following attestation bundles were made for orvix_node-0.2.3-py3-none-any.whl:
Publisher:
release-node.yml on OrvixCompute/orvix
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
orvix_node-0.2.3-py3-none-any.whl -
Subject digest:
dab4a98534d43a563428e289ab5693ac006dd4aa0373f82264529c4aa4d24933 - Sigstore transparency entry: 2393703514
- Sigstore integration time:
-
Permalink:
OrvixCompute/orvix@4587642895e466a56d33f929a30747dec1200c93 -
Branch / Tag:
refs/tags/node-v0.2.3 - Owner: https://github.com/OrvixCompute
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-node.yml@4587642895e466a56d33f929a30747dec1200c93 -
Trigger Event:
push
-
Statement type: