Skip to main content
 ██████╗ ██████╗ ██╗
██╔═══██╗██╔══██╗██║
██║   ██║██████╔╝██║
██║▄▄ ██║██╔═══╝ ██║
╚██████╔╝██║     ██║
 ╚══▀▀═╝ ╚═╝     ╚═╝

QPI QPU Driver

PyPI version CI/CD Workflow GitHub Tag License

Python QPU driver for the QPI quantum computing platform. Runs on isolated hardware nodes controlling the QPU via multiple executor backends.

📚 Read the Documentation


Install

Base package (mock executor)

pip install qpi-driver

With CLI support

pip install "qpi-driver[cli]"

With Qiskit Aer simulator

pip install "qpi-driver[aer]"

With Quantify/Qblox hardware support

pip install "qpi-driver[quantify]"

Requires Python ≥ 3.12, < 3.13.


Quick Start

CLI

# Connect a mock QPU to the server
qpi-driver start \
  --qpi-addr http://localhost:8090 \
  --token <qpu-access-token> \
  --ca-fingerprint <fingerprint> \
  --name qpu_sim_01 \
  --executor mock \
  --data-dir ./data

Environment variables are also supported:

export QPI_ADDR=http://localhost:8090
export QPI_ACCESS_TOKEN=<token>
export QPI_CA_FINGERPRINT=<fingerprint>
export QPU_NAME=qpu_sim_01
export DRIVER_BACKEND=mock
qpi-driver start

systemd Service (Linux)

To run qpi-driver persistently on a Linux machine in the background, you can use systemd.

We have provided an interactive bash installer that will automate this entire process for you (installing uv, installing the qpi-driver tool, prompting for your tokens, and registering the systemd service):

# Run the interactive systemd installer script (requires sudo to create the service)
sudo ./install-systemd.sh

Manual systemd Installation

If you prefer to configure it manually, follow these exact steps:

  1. Install uv (a fast Python package installer):

    curl -LsSf https://astral.sh/uv/install.sh | sh
    source $HOME/.local/bin/env
    
  2. Install qpi-driver as a tool: Make sure to specify the correct extras (e.g. [cli,qblox], [cli,aer]):

    uv tool install "qpi-driver[cli,qblox]"
    
  3. Create the systemd unit file: Replace the placeholder <values> with your actual configuration.

    sudo bash -c 'cat > /etc/systemd/system/qpi-driver.service <<EOF
    [Unit]
    Description=QPI Driver Service
    After=network.target
    
    [Service]
    Type=simple
    
    Environment="QPI_ACCESS_TOKEN=<your-qpi-access-token>"
    Environment=PYTHONUNBUFFERED=1
    
    ExecStart=/home/<user>/.local/bin/qpi-driver start \
            --ca-fingerprint <your-fingerprint> \
            --qpi-addr <your-qpi-server-address> \
            --name "<your-qpu-name>" \
            --executor "qblox"
    
    Restart=on-failure
    User=<user>
    
    StandardOutput=journal
    StandardError=journal
    SyslogIdentifier=qpi-driver
    
    [Install]
    WantedBy=multi-user.target
    EOF'
    
  4. Start and enable the service:

    sudo systemctl daemon-reload
    sudo systemctl enable qpi-driver.service
    sudo systemctl start qpi-driver.service
    sudo systemctl status qpi-driver.service
    

Python API

from qpi_driver import run_driver

run_driver(
    qpi_addr="http://localhost:8090",
    token="<qpu-access-token>",
    ca_fingerprint="<fingerprint>",
    name="qpu_sim_01",
    executor="mock",
    data_dir="./data",
)

Custom executor

from qpi_driver import Executor, run_driver
from qpi_driver.executors.mock import MockExecutor

class MyCustomExecutor(Executor):
    def execute(self, payload):
        # Your QPU-specific execution logic
        ...

run_driver(
    qpi_addr="http://localhost:8090",
    token="<token>",
    ca_fingerprint="<fingerprint>",
    name="my_qpu",
    executor="custom",
    custom_executor=MyCustomExecutor(),
)

Executor Backends

Backend Description Extra
mock Qiskit BasicSimulator (default)
qiskit_aer Qiskit Aer simulator [aer]
quantify Quantify-scheduler + Qblox instruments [quantify]
qblox Qblox scheduler (legacy) [qblox]

Architecture

The driver uses Python's multiprocessing library to isolate responsibilities:

  • Main Process: NNG PULL listener, receives commands from server
  • Worker Process: Executes quantum circuits via the configured executor
  • Result Sender Process: NNG PUSH, sends results back to server
┌─────────────┐     NNG PUSH      ┌─────────────────┐
│ Server│ ────────────────> │  Main Process   │
│  Dispatcher │                   │  (PULL listener)│
└─────────────┘                   └────────┬────────┘
                                           │
                              multiprocessing.Queue
                                           │
                                           ▼
                                   ┌───────────────┐
                                   │ Worker Process│
                                   │  (Executor)   │
                                   └───────┬───────┘
                                           │
                              multiprocessing.Queue
                                           │
                                           ▼
                                   ┌───────────────┐
                                   │Result Sender  │
                                   │  (PUSH)       │
                                   └───────┬───────┘
                                           │ NNG PUSH
                                           ▼
                                   ┌───────────────┐
                                   │  Server │
                                   │   Listener    │
                                   └───────────────┘

CLI Reference

qpi-driver start [OPTIONS]

Options:
  -a, --qpi-addr TEXT          QPI server URL [env: QPI_ADDR]
  -t, --token TEXT             QPU access token [env: QPI_ACCESS_TOKEN]
  -n, --name TEXT              QPU name [env: QPU_NAME]
  -e, --executor TEXT          Backend: mock, qiskit_aer, quantify, qblox, presto [env: DRIVER_BACKEND]
  -d, --data-dir PATH          Data directory [env: QPI_DATA_DIR]
  --is-dummy                   Run in dummy/simulation mode
  --quantify-hardware-config PATH  Quantify hardware config [env: QPI_QUANTIFY_HARDWARE_CONFIG]
  --quantify-device-config PATH    Quantify device config [env: QPI_QUANTIFY_DEVICE_CONFIG]
  --job-timeout INTEGER        Job timeout in seconds [env: QPI_JOB_TIMEOUT]
  --ca-file PATH               Path to the CA root certificate [env: QPI_CA_FILE]
  --ca-fingerprint TEXT        Fingerprint to verify the CA root certificate [env: QPI_CA_FINGERPRINT]
  --help                       Show this message and exit.

Documentation


License

MIT — see the main repository for details.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

qpi_driver-0.0.28.tar.gz (37.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

qpi_driver-0.0.28-py3-none-any.whl (40.8 kB view details)

Uploaded Python 3

File details

Details for the file qpi_driver-0.0.28.tar.gz.

File metadata

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

File hashes

Hashes for qpi_driver-0.0.28.tar.gz
Algorithm Hash digest
SHA256 cf67a5ff68af18f6ff52553e978dbe5965dadb09c9b0bb106e60ee4d8569a27a
MD5 ad84f41d1a5484add4bca8e7a0445803
BLAKE2b-256 89bcf95379580557e3d30165e3f38f18e06a79e34dcfa30326280fb3a6625fe3

See more details on using hashes here.

Provenance

The following attestation bundles were made for qpi_driver-0.0.28.tar.gz:

Publisher: ci.yml on sopherapps/qpi

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

File details

Details for the file qpi_driver-0.0.28-py3-none-any.whl.

File metadata

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

File hashes

Hashes for qpi_driver-0.0.28-py3-none-any.whl
Algorithm Hash digest
SHA256 34e2d8f7195bf512a0630fa8d83a4804890f3b0e6a902e4f9ad7457d5eb9aca2
MD5 ef644a0d1f08727d8959c354ed0db6fa
BLAKE2b-256 4d50a6d5cf663b12fc79613d68bd386071b1dbe8bbff92f2f9f8e7b628b65a7b

See more details on using hashes here.

Provenance

The following attestation bundles were made for qpi_driver-0.0.28-py3-none-any.whl:

Publisher: ci.yml on sopherapps/qpi

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