QiliSDK is Qilimanjaro Quantum Tech's open-source Python framework for designing and executing analog, digital, and hybrid quantum algorithms. Its modular structure unifies circuit-based and Hamiltonian-based workflows within a single API. It provides high-level abstractions for gates, circuits, Hamiltonians, and more, while remaining fully backend-agnostic allowing a seamless switch between CPU, GPU, or QPU execution. Fast CPU simulation can be done locally using QiliSim, our quantum simulator written in C++.
Why QiliSDK?
There are several other quantum frameworks out there, but QiliSDK has many unique advantages:
- We use a single framework for digital, analog and hybrid workflows, running on CPU, GPU or a Qilimanjaro QPU. Everything is one unified stack.
- All core functionality is included in the package, with performance critical parts pre-compiled from C++, all easily installable with a single
pip installcommand. - At the highest level we have our Model class, which lets you write problems in their simplest form and simplify the conversion to quantum jobs.
- At a slightly lower level we have our functionals, describing specific quantum tasks: VariationalProgram, AnalogEvolution, DigitalPropagation and even QuantumReservoirs.
- Meanwhile, on the more fundamental side, we have symbolic Hamiltonians and Expression classes, fully customizable analog Schedules, all standard quantum gates, parametrizable objects, our quantum object class QTensor which has a wide range of quantum information utilities, and many more.
Installation
QiliSDK is available via PyPI:
pip install qilisdk
For other installaton options, see the docs.
Usage
Here are just a few examples to get you started, for tutorials and full documentation, please see the docs.
Digital Circuits
To create a simple quantum circuit and simulate it on your CPU:
from qilisdk.digital import Circuit, H, RX, CNOT
from qilisdk.functionals import DigitalPropagation
from qilisdk.readout import Readout
from qilisdk.backends import QiliSim
# Create a simple two-qubit circuit
circuit = Circuit(2)
circuit.add(H(0))
circuit.add(RX(1, theta=3.14))
circuit.add(CNOT(0, 1))
# Set up the quantum task
functional = DigitalPropagation(circuit)
readout = Readout().with_sampling(1000)
# Simulate it with CPU
backend = QiliSim()
results = backend.execute(functional, readout)
print(results)
Analog Evolution
To create a linear interpolation between an initial and final Hamiltonian, then simulate it using your GPU:
from qilisdk.analog import Schedule, X, Z
from qilisdk.functionals import AnalogEvolution
from qilisdk.readout import Readout
from qilisdk.core import InitialState
from qilisdk.backends import QiliSim, AnalogMethod, ExecutionConfig
# Construct the interpolation between Hamiltonians
initial_hamiltonian = -X(0) - X(1)
final_hamiltonian = Z(0) + Z(1) + 0.5 * Z(0) * Z(1)
schedule = Schedule.linear(initial_hamiltonian, final_hamiltonian, total_time=10.0, dt=0.5)
# Set up the quantum task
functional = AnalogEvolution(schedule, initial_state=InitialState.UNIFORM)
readout = Readout().with_expectation([final_hamiltonian])
# Simulate it with GPU
config = ExecutionConfig(gpu=True)
method = AnalogMethod.variational_annealing()
backend = QiliSim(execution_config=config, analog_simulation_method=method)
results = backend.execute(functional, readout)
print(results)
Quantum Reservoirs
import numpy as np
from qilisdk.backends import QiliSim
from qilisdk.core import ket
from qilisdk.digital import Circuit, U2
from qilisdk.functionals.quantum_reservoirs import QuantumReservoir, ReservoirInput, ReservoirLayer
from qilisdk.analog import Schedule, X, Z
from qilisdk.readout import Readout
# Set up the quantum reservoir
pre_processing = Circuit(2)
pre_processing.add(U2(1, phi=ReservoirInput("phi_1", 0.1), gamma=ReservoirInput("gamma_1", 0.1)))
res_layer = ReservoirLayer(
evolution_dynamics=Schedule(
hamiltonians={"h": Z(0) + Z(1) + Z(0) * Z(1) + 0.5 * (X(0) + X(1))},
total_time=1.0,
dt=0.1,
),
input_encoding=pre_processing,
qubits_to_reset=[1],
)
reservoir = QuantumReservoir(
initial_state=(np.random.rand() * ket(0, 0) + np.random.rand() * ket(1, 1)).unit(),
reservoir_layer=res_layer,
input_per_layer=[
{"phi_1": 0.2, "gamma_1": 0.1},
{"phi_1": 0.3, "gamma_1": 0.2},
{"phi_1": 0.4, "gamma_1": 0.3},
],
)
# Simulate it with CPU
results = QiliSim().execute(
reservoir,
Readout().with_expectation(observables=[Z(0), Z(1), Z(0) * Z(1)]),
)
print(results.get_expectation_values())
Benchmarks
Development Guide
This section covers how to set up a local development environment for qilisdk, run tests, enforce code style, manage dependencies, and contribute to the project. We use a number of tools to maintain code quality and consistency:
- uv for dependency management and packaging.
- ruff for linting and code formatting.
- ty for language server and static type checking.
- towncrier for automated changelog generation.
Setup & Dependency Management
For instructions on how to compile from source and set up the development environment, see the docs. Following those instructions will setup a virtual environment (venv) in which you can run all other development tools (e.g. tests, linting).
Testing
We use pytest for the test suite. Once you have your venv set up, run the Python unit tests using:
pytest tests/unit_python
To run the integration tests (bigger tests which use the full QiliSDK stack and might take a bit longer):
pytest tests/integration
To run the CUDA, qutip, and SpeQtrum backend tests, install the optional dependencies first (e.g., uv sync --all-groups --extra all-cu13).
To run the C++ tests, you first need to recompile with C++ testing enabled:
uv sync --reinstall -Ccmake.define.tests=ON
The C++ testing suite can then be ran using:
./tests/unit_cpp/test_cpp
Linting & Formatting
We enforce code style and best practices using ruff. ruff handles:
- Lint checks (similar to flake8, pylint).
- Formatting (similar to black or isort).
- Automated fixes for certain issues.
To check linting:
ruff check
To automatically fix lint issues (where possible):
ruff check --fix
To automatically format your code:
ruff format
(We recommend running ruff check --fix and ruff format before committing any changes.)
To check the C++ code, compile with the tidy flag:
uv pip install -v -e ./ -Ccmake.build-type=Debug -Ccmake.define.tidy=ON
This will run clang-tidy as well as a number of C++ compiler flags for debugging. For this you will need clang-tidy installed, which can be done on Debian/Ubuntu with:
sudo apt-get install clang-tidy
It may also throw an error about not being able to find omp.h, if so, try:
sudo apt-get install libomp-dev
For ease of use there are also a number of bash scripts in the "scripts" folder, for instance to generate coverage reports or to run all pre-commit checks.
Type Checking
We use ty for static type checking. This helps ensure our code is type-safe and maintainable.
ty check
(We encourage developers to annotate new functions, classes, and methods with type hints.)
Helpful Scripts
For ease of use there are also a number of scripts in the scripts/ directory. Each of these generates a .log file with the same name as the script (checks.sh generates checks.log and so on).
To run all pre-commit checks (e.g. linting/tests):
bash scripts/checks.sh
To check all of the code blocks in the documentaton:
bash scripts/docs.sh
To generate a full coverage report of all code, run:
bash scripts/coverage.sh
This will generate a html file which you can open in your browser to see which lines (in both the C++ and Python) are covered by the tests. We aim for 100% coverage!
Changelog Management
We manage our changelog using towncrier. Instead of editing CHANGELOG.md directly, each pull request includes a small news fragment file in the changes/ directory describing the user-facing changes.
For example, if you create a PR with id #123 adding a new feature, you add:
changes/123.feature.md
Inside this file, you briefly describe the new feature:
Added a new `cool_feature` in the `qilisdk.backends` module.
These change fragments should be written in Markdown, so use standard Markdown syntax. Also, instead of manually creating the file, you can run:
towncrier create --no-edit
When we cut a new release, we update the version in pyproject.toml file and run:
towncrier
This aggregates all the news fragments into the CHANGELOG.md under the new version and removes the used fragments.
Contributing
We welcome contributions! Here’s the workflow:
- Fork this repository and create a feature branch.
- Write your changes (code, docs, or tests).
- Add a news fragment in
changes/describing the user-facing impact. - Run the following checks locally:
bash scripts/checks.sh - Commit and push your branch to your fork.
- Open a Pull Request against the
mainbranch here.
Our CI will run tests, linting, and type checks. Please make sure your branch passes these checks before requesting a review.
License
This project is licensed under the Apache License.
Acknowledgments
- Thanks to all the contributors who help develop qilisdk!
- uv for making dependency management smoother.
- ruff, ty, and towncrier for their amazing tooling.
Feel free to open issues or pull requests if you have questions or contributions. Happy quantum coding!
Metadata
Release files for qilisdk 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
Total release size: 56.8 MB
Release files / qilisdk-0.3.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | qilisdk-0.3.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 4.1 MB |
| Tags | CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
7a2aafd9f17650ef232ccb1221958b3005dc2e7e1c14fc3c7e8815f51120dd52
|
|
BLAKE2b-256 checksum How to use checksums |
a728b71b381cb1db5808f5aa5fa4064a8b9817288d39380ae3dfc3e57f14c671
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / qilisdk-0.3.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | qilisdk-0.3.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 3.9 MB |
| Tags | CPython 3.13 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
788e2751d8c239fcddcebe9b32e4100e219887a698b60afa771d7b29207a3de6
|
|
BLAKE2b-256 checksum How to use checksums |
ca6a2746cd7382e8bfdd280f8e3817ca4aceae7170d8648eaa56514f4df54bcc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / qilisdk-0.3.1-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | qilisdk-0.3.1-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
291297cc4089055229edd6590669f5df3ec6e4eb1837d711cbbf6b5d22dc71ff
|
|
BLAKE2b-256 checksum How to use checksums |
ace4abff483154872945ced23db8f393da476058f6f7eff0dd31c569a1e223ff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / qilisdk-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl
| Download URL | qilisdk-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl |
|---|---|
| Size | 3.9 MB |
| Tags | CPython 3.13 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
e9f5bd270515f34ea871c088e0340b93b7c3542e05c72007632de17edaf64b7c
|
|
BLAKE2b-256 checksum How to use checksums |
594d04c2e7d0dabceb6c65916f7cface34ecc76a7d6295f508a3849d8d26193a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / qilisdk-0.3.1-cp312-cp312-win_amd64.whl
| Download URL | qilisdk-0.3.1-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 5.3 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
e7c7ac0e179b1b6e07e70dc66b0e4f4ce39a47414da516e1ed40bb58842ae7f2
|
|
BLAKE2b-256 checksum How to use checksums |
56fb6b687813e02ff468397dda75d122553a9d8938811604e5d61faa2a423c15
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / qilisdk-0.3.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | qilisdk-0.3.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 4.1 MB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
8bf86e13f1508aad9c2b1ecf69051f10468bf31f26f9c3e9681f600bf8bc24f9
|
|
BLAKE2b-256 checksum How to use checksums |
faf4bd2adc2a798a6ee43176315a666523f06e68a2a94fb2befb007bf1f73cbe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / qilisdk-0.3.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | qilisdk-0.3.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 3.9 MB |
| Tags | CPython 3.12 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
b3b7ad3fc318a778b44d2b7c92d224c0d70ff00597930698d91e84486235efef
|
|
BLAKE2b-256 checksum How to use checksums |
26c635473b46348f1347b348e0ec490dd0a81ac2f2c7cfd2d2d71a20e37d6535
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / qilisdk-0.3.1-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | qilisdk-0.3.1-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
d2f790c73e6c4877d47b3ce2f7e6607c97ba0e7869c0f3943be5190ded41218e
|
|
BLAKE2b-256 checksum How to use checksums |
5959e0be8a27e7b35afd27c825ffa126c684cb8b417662a19e4536140c55238a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / qilisdk-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl
| Download URL | qilisdk-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl |
|---|---|
| Size | 3.9 MB |
| Tags | CPython 3.12 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
91b21d8a83bf912a239f1a717330b194618f74dca5853a2573ce0fec0144d43c
|
|
BLAKE2b-256 checksum How to use checksums |
f590605a653bf9738d6c3c9c6a00d067523571e70a0b976681ef784dbe197711
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / qilisdk-0.3.1-cp311-cp311-win_amd64.whl
| Download URL | qilisdk-0.3.1-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 5.2 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
bd60572a4b0c6c37ddbc38f2e00e01fe59b71c6aa10568b079c20c660cf1ec15
|
|
BLAKE2b-256 checksum How to use checksums |
5965496bc0aa501e926c6d959df6370f7d4fdc80f07d9e9448190c1a30aef648
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / qilisdk-0.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | qilisdk-0.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 4.1 MB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
5c74d0f535847d290e0e4444a2196ae50981f0efc973f86fc9368838d38aee19
|
|
BLAKE2b-256 checksum How to use checksums |
336636c562e464e116fcfe24933092574da667177e426bffa04306865f56c3a5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / qilisdk-0.3.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | qilisdk-0.3.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 3.9 MB |
| Tags | CPython 3.11 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
4586cf34c34ee2537190b762ff8ccccc996f222be3215c8fff442c4e69c7a455
|
|
BLAKE2b-256 checksum How to use checksums |
6b7284ccadb6de3fc65b2af4c6010d5b7c1a934fde9e6793dd65afce13a6d7aa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / qilisdk-0.3.1-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | qilisdk-0.3.1-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
7d208c2a72ca176fc2921944a206f600f305bbbde9e349802ee2fd3424635baa
|
|
BLAKE2b-256 checksum How to use checksums |
ed0d273a3537d98237c1ac0b05cbfdb036661068e740c0caecb4f7c1d7b5038c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / qilisdk-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl
| Download URL | qilisdk-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl |
|---|---|
| Size | 3.9 MB |
| Tags | CPython 3.11 macOS 10.9+ x86-64 |
|
SHA-256 checksum How to use checksums |
7fe7c09209160ba9ca06b3b8ce30e05884c94505e4d6ee62f95d8e6b7f7beadd
|
|
BLAKE2b-256 checksum How to use checksums |
42ce4734fd3d0671e37de8969274ebfd872f6f35b94fba8dfffef9c60dfcc800
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|