eigenorbit-router-client
Run eigenkit circuits on real quantum hardware.
eigenorbit-router-client lets eigenkit users run circuits on real quantum hardware through EigenOrbit Router, with one EigenOrbit API key instead of separate vendor credentials.
You write the same eigenkit code as with your own vendor credentials and pass
provider=RouterConfig(...). The router runs the circuit on an Amazon Braket
simulator or QPU, or on an IBM Quantum device. Results have the same shape,
dtype and bit ordering as the same code on the vendor directly. Braket jobs
are billed to your prepaid EigenOrbit balance. IBM jobs run on your own IBM
Quantum account and carry no router charge.
Install
pip install "eigenkit[router]"
The router extra of eigenkit installs this client.
API key
- Sign in to EigenOrbit Router at https://router.eigenorbit.com and accept the router terms.
- Add funds on the Balance page if you run Braket jobs.
- Create an API key on the Keys page. The key is shown once; copy it then.
export EIGENORBIT_ROUTER_API_KEY=eo_live_...
| Variable | Used when |
|---|---|
EIGENORBIT_ROUTER_API_KEY |
RouterConfig(api_key=...) is None |
EIGENORBIT_ROUTER_URL |
RouterConfig(base_url=...) is None; unset means https://router.eigenorbit.com |
The router URL must be https:// (plain http:// only for localhost). The
key is never written to a pickle or a saved model, and never appears in repr.
Quickstart
import numpy as np
from eigenkit import Circuit
from eigenkit.core.blocks import (
AngleEncoding, BasicVariational, assemble,
)
from eigenkit.core.observables import all_z
from eigenorbit_router_client import RouterConfig
spec = assemble([
AngleEncoding(in_features=2),
BasicVariational(depth=1),
])
# The API key is read from EIGENORBIT_ROUTER_API_KEY.
# On a real QPU: device="braket/iqm_garnet" (see Devices)
provider = RouterConfig(device="braket/sv1", shots=1000)
circuit = Circuit(spec, all_z(2), provider=provider)
weights = np.linspace(-0.9, 1.1, spec.n_weights)
inputs = np.array([0.2, 0.6])
values = circuit(weights, inputs) # one router job
print(values)
values holds one expectation value per observable, as on any other eigenkit
provider. sample(...) and probabilities(...) work as well, and a 2-D batch
runs as one router job per row.
Devices
A device ID is <vendor>/<device>, for example braket/sv1, braket/dm1,
braket/iqm_garnet or ibm/ibm_fez. The catalog at
https://router.eigenorbit.com/devices (no sign-in needed) lists every device
with its status, availability windows, shot ranges and price.
Cost
Building a circuit asks the router for an estimate and shows one
CostWarning with the price of a job: the vendor's cost plus the EigenOrbit
fee. circuit.dry_run_info() returns the same estimate without sending
anything. Every job holds its estimate on your balance first, so the router
never runs a job your balance cannot cover. Each row of a batch and each
parameter-shift gradient evaluation is a separate paid job.
Jobs
Every call blocks until its job finishes. To come back to a job later:
handle = circuit.submit(weights, inputs)
print(handle.job_id(), handle.status())
values = handle.result()
handle.cancel() asks the router to cancel the job. A job still queued at
the router is cancelled at once; a job at the vendor ends the way the vendor
decides. The job ID is also on the router web app's Jobs page.
Errors
Every router failure raises eigenorbit_router_client.RouterError with
code, message, details and http_status. Branch on code, never on the
message. The most common codes:
| Code | What to do |
|---|---|
unauthenticated |
Check EIGENORBIT_ROUTER_API_KEY. |
terms_not_accepted |
Accept the current terms at details["accept_url"]. |
insufficient_balance |
Add funds on the Balance page. |
device_unavailable |
The device is offline; pick another or retry later. |
shots_invalid |
Use shots within details["min_shots"]..details["max_shots"]. |
router_unreachable |
No answer after the retries; see below. |
The client retries 502, 503, 504 and dropped connections with the same
Idempotency-Key, so a retry never creates a second job. If every attempt
loses its answer, router_unreachable carries details["idempotency_key"]:
the job may already exist. Pass that key as
circuit.compiled.submit(..., idempotency_key=...) to get the same job back
instead of a second, separately billed one.
IBM Quantum
IBM devices are ibm/<backend> and run on your own IBM Quantum account.
Connect it once on the router's IBM account page
(https://router.eigenorbit.com/ibm) with your IBM API key and instance CRN.
IBM jobs are free through the router; IBM bills your instance for the quantum
time they use.
Saved models
A model whose provider is a RouterConfig saves the device and the settings,
never the API key. Pass the router config again when you load it:
from eigenkit import QSVC
from eigenorbit_router_client import RouterConfig
model = QSVC.load("model.eigenkit", provider=RouterConfig(device="braket/sv1"))
Contributing
Development, the contract sync, releases and the live checks are described in CONTRIBUTING.md.
Support
Write to support@eigenorbit.com. Include the router job ID for a question about a job.
License
eigenorbit-router-client is licensed under the Apache License 2.0.
Metadata
Release files for eigenorbit-router-client 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 | |
|---|---|---|---|---|
| eigenorbit_router_client-0.1.0.tar.gz | 227.5 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| eigenorbit_router_client-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 256.3 kB
Release files / eigenorbit_router_client-0.1.0.tar.gz
| Download URL | eigenorbit_router_client-0.1.0.tar.gz |
|---|---|
| Size | 227.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
24c08a51dac4aaeceb6ac4f761e50c073de3548909e8b24be2cf21ee6f8bb94d
|
|
BLAKE2b-256 checksum How to use checksums |
16000ec3bd0d4cfedb1456fc8a7ff1b0178af45ceddac2ed28a040a6dca03d51
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.
Transparency logRelease files / eigenorbit_router_client-0.1.0-py3-none-any.whl
| Download URL | eigenorbit_router_client-0.1.0-py3-none-any.whl |
|---|---|
| Size | 28.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
32e4cef3c55536be91670a5d6f65f4c2b4caaba04a5f10939592b54d6ff8ea1f
|
|
BLAKE2b-256 checksum How to use checksums |
8f259589071692b9b852851e2337e5b7dbd3eee29c82d32c4a1acdae6217b79d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.
Transparency logSecurity for eigenorbit-router-client 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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for eigenorbit_router_client-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.
Transparency logA 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.