Skip to content
qBraid
001/CHANGELOG

Every release, in the open.

The qBraid SDK ships continuously — new hardware providers, transpiler conversions, and runtime improvements. Every version is documented here, mirrored straight from GitHub.

  1. v0.12.2
    July 11, 2026
    Added
    • Added support for Python 3.14: added the Programming Language :: Python :: 3.14 classifier and 3.14 to the CI test matrices

    • Added an optional token_provider to OpenQuantumSession, letting a caller supply a per-user access token on demand (token_provider: () -> (access_token, expires_at_epoch)) instead of the session minting its own via client_credentials. When set, _fetch_token calls the provider and _ensure_token re-invokes it on near-expiry, so long wait_for_preparation waits still get a fresh token; client_id/client_secret are not required in this mode. Purely additive — the existing client_credentials path is unchanged

    • Added cirq_to_pytket and pytket_to_cirq transpiler conversions (via the pytket-cirq extension), giving a direct Cirq <-> PyTKET edge in the conversion graph.

    • Added pytket_to_pyqir transpiler conversion (via the pytket-qir extension), giving a direct PyTKET -> PyQIR edge in the conversion graph.

    • Added pyquil_to_qasm3 conversion, providing a direct transpiler edge from pyQuil to OpenQASM 3 (previously only reachable via a lossy multi-hop path through cirq), and completing the pyQuil <-> OpenQASM 3 round trip alongside openqasm3_to_pyquil.

    • QASM conditional (if) statement support for Cirq conversions: qasm2_to_cirq and qasm3_to_cirq now translate classically-controlled (if (c == val)) operations into Cirq, backed by a new normalize_if_blocks pass that rewrites QASM 3 braced if blocks to the single-line form Cirq's parser accepts

    • Added openqasm3_to_pyquil conversion, providing a direct, pyqasm-backed transpiler edge from OpenQASM 3 to pyQuil (previously only reachable via a lossy multi-hop path through cirq). Supports the standard gate set (incl. modifiers and controlled gates via pyqasm decomposition), measurement, barrier (→ FENCE), reset (→ RESET), delay (→ DELAY), and if (c == 0|1) classical feedforward (→ JUMP-WHEN); declared-but-idle qubits are padded with I so the operator dimension matches the source

    • Added include_retired parameter to QbraidProvider.get_devices method to optionally include retired devices in the device list

    • Added PasqalProvider, PasqalDevice, and PasqalJob classes implementing the qBraid runtime interface for Pasqal Cloud Services (neutral-atom QPUs and emulators, using Pulser as the native IR).

    • Added qasm2_to_qat and cirq_to_qat extras-based conversion functions,

    • Added qbraid/runtime/rigetti/availability.py (modeled on qbraid/runtime/aws/availability.py) exposing is_in_maintenance() and next_available_time(), derived from the QCS maintenance calendar. RigettiDevice gains maintenance_calendar() (the raw RFC 5545 maintenance iCalendar fetched from the QCS REST API GET /v1/calendars/{id}) and availability_window(), which returns (is_available, "HH:MM:SS"_until_switch, switch_datetime) and merges contiguous/overlapping maintenance windows so the reported next-available time is when the device truly leaves maintenance

    Improved / Modified
    • Replaced logging.getLogger(__name__) with centralized from qbraid._logging import logger in Rigetti, Origin Quantum, and Quantinuum runtime modules

    • Modified get_devices and get_device methods in IonQProvider to use public endpoint access instead of authenticated requests

    • Updated QbraidProvider.get_devices method to accept **kwargs and pass them through to the underlying client.list_devices call

    • Removed the cirq-specific fallback in transpile that, on a failed conversion step, round-tripped the cirq intermediate through QASM (circuit_from_qasm(circuit.to_qasm())) and retried. This flatten-and-retry is already provided generically by the conversion graph's cirq -> qasm2 -> target paths combined with the multi-path retry, making the hardcoded special case redundant (cirq conversion coverage is unchanged)

    • openqasm3_to_pyquil now emits native pyQuil two-qubit gates (CPHASE, RXX, RYY, RZZ, XY, ISWAP, CSWAP) by keeping them external to pyqasm.unroll, instead of expanding them into long RZ/RX/CNOT sequences (e.g. cp went from 17 instructions to one CPHASE). The results match exactly, including global phase. This also fixes xy, which previously raised Unsupported gate: sxdg because its decomposition produced an sxdg the converter could not handle

    Fixed
    • Fixed BraketProvider._fetch_resources (used by get_tasks_by_tag and, transitively, list_jobs(tags=...)) reading only the first page of the AWS Resource Groups Tagging API. It called get_resources once per region with no PaginationToken loop, so tag-based task lookups silently capped at ~100 resources and missed matches in accounts with more tagged tasks. It now follows PaginationToken until exhausted, returning all matching task ARNs across every page

    • Fixed QiskitRuntimeProvider._ibm_api_get serializing list-valued query params via their Python repr. It built the query string with urlencode(params) (no doseq), so a list value such as tags=["a", "b"] became the literal tags=%5B%27a%27%2C+%27b%27%5D instead of repeated tags=a&tags=b params. As a result list_jobs(tags=[...]) silently matched nothing against the IBM Quantum REST API. Now uses urlencode(params, doseq=True); scalar params are unaffected

    • Fixed a flaky test_transform_run_input (IBM runtime tests) that intermittently failed on qiskit >= 2.5 (seen on the 3.10/3.12 CI runners). The test's FakeDevice instantiated GenericBackendV2 without a seed, so its coupling map was randomized per run; ~10% of runs routed the circuit into extra single-qubit gates, breaking the exact count_ops() assertion. The fake backend is now seeded for a deterministic coupling map

    • Fixed RigettiDevice.status() incorrectly reporting devices as ONLINE while under scheduled maintenance (e.g. Cepheus-1-108Q). It previously only checked whether the processor appeared in list_quantum_processors() and then always returned ONLINE. It now also consults Rigetti's maintenance schedule, returning UNAVAILABLE while a maintenance window is in progress (the QCS gateway queues jobs during maintenance), OFFLINE when the processor is absent from the catalog, and ONLINE otherwise. A calendar lookup/parse failure degrades to ONLINE with a logged warning so status() never raises on a transient calendar issue

    • Fixed ConversionGraph.__eq__ raising TypeError: NotImplemented should not be used in a boolean context on Python 3.14. It chained super().__eq__(value) (which resolves to object.__eq__ and returns NotImplemented for any distinct object) into a boolean and; Python 3.14 promotes using NotImplemented in a boolean context from a DeprecationWarning to a hard error. The redundant super() term is removed and the isinstance guard leads the structural comparison, which is behaviour-preserving

    • Fixed the qrisp-to-X transpiler coverage benchmark dropping below its accuracy baselines after the qrisp 0.9 release. qrisp 0.9 imports TYPE_CHECKING at module scope in qrisp.circuit.standard_operations (with no __all__), leaking the name into dir(); the benchmark's upper-case-name gate enumeration counted it as a non-buildable "gate", producing a guaranteed conversion failure on every target. Enumeration is now restricted to callables, so the leaked constant is ignored; accuracy thresholds are unchanged

    • Fixed test collection failing under pytest 9.1, which promotes "marks applied to fixtures" from a silent no-op into a hard collection error. Four fixtures in the Azure remote test modules stacked @pytest.mark.skipif(...) on @pytest.fixture, aborting collection of the entire suite. The marks (which pytest never honored on fixtures) are removed and the dependency skip guards moved into the fixture bodies; the consuming tests keep their own skipif marks, so behavior is unchanged

    • Fixed cirq_to_pyquil raising TypeError when converting a TwoQubitDiagonalGate (e.g. a pyQuil CPHASE00/CPHASE01/CPHASE10 round-tripped through cirq), whose diagonal angles are stored as a complex array: exponent_to_pi_string could not build a Fraction from a complex value. The angles are now coerced to their real part before formatting

    • ConversionGraph now raises PackageValueError when the nodes argument contains a program type that is neither a registered alias nor an endpoint of one of the graph's conversions, instead of silently adding an unusable isolated node (or silently dropping it when require_native=True)

    • Fixed circuits_allclose raising IndexError instead of returning False when the two programs' unitaries have different dimensions (e.g. comparing a measurement-only circuit against a target that drops measurements, yielding an empty unitary). The comparison now short-circuits to False on a shape mismatch and only computes the qubit-reversed unitary when allow_rev_qubits=True; unitary_rev_qubits also raises its documented ValueError for non-2D matrices

    • Fixed Cirq → pyQuil transpilation of the XXPowGate, YYPowGate, ZZPowGate, and SwapPowGate two-qubit gates for non-integer exponents. The interaction gates were previously decomposed into independent single-qubit rotations, and SwapPowGate was emitted as PSWAP (a parametric swap-with-phase), both producing a circuit whose unitary did not match the input. The interaction gates now round-trip exactly (including global phase) via PHASE/CPHASE decompositions, and SwapPowGate falls back to cirq's CNOT/RY/CPHASE decomposition.

    • Implemented remove_idle_qubits and reverse_qubit_order on PyQuilProgram (previously inherited base stubs that raised NotImplementedError). They remap the program's qubits onto contiguous indices, which also fixes incorrect unitaries for programs acting on non-contiguous qubits and unblocks circuits_allclose(..., index_contig=True) for pyQuil targets

    • Removed the intermediate cirq round-trip from the PyTKET transpiler coverage test; it now transpiles each PyTKET source circuit directly to the target and compares with circuits_allclose(..., index_contig=True), which drops idle qubits so the source and target unitaries have matching dimensions

    • Fixed qasm2_to_cirq corrupting cirq's shared OpenQASM lexer: the QASM 2 parser assigned a reduced token list onto cirq.contrib.qasm_import._lexer.QasmLexer.tokens at import time, stripping the OpenQASM 3 tokens (e.g. STDGATESINC) process-wide and causing qasm3_to_cirq to raise a ply LexError on any QASM 3 parse that followed a qasm2_to_cirq call. The reduced token set now lives on a local QasmLexer subclass, leaving cirq's class intact

    • Changed the error OpenQuantumDevice.submit() raises when the user's Open Quantum account has no associated organization from a bare ValueError("No organization found for user.") to QbraidRuntimeError("Failed to connect to Open Quantum."). The old message read like a qBraid organization error and surfaced verbatim to users; the new form is a clearer, provider-attributed runtime error

    • Fixed a memory/thread-safety leak in qbraid.runtime.aws.tracker._get_tracker_task_details where a Braket Tracker was registered but never deregistered from Braket's process-global tracking context, which could cause a "Set changed size during iteration" RuntimeError during concurrent quantum task submissions; the tracker is now used as a context manager to ensure proper cleanup.

    Dependencies
    • Bumped the amazon-braket-sdk upper bound from <1.111.0 to <1.121.0 (latest tested: 1.120.0) in both pyproject.toml (braket extra) and requirements-dev.txt

    • Added sympy to the cirq extra, since cirq_qasm_parser now imports it directly for conditional (if) statement parsing (previously only available transitively via cirq-core). Left unpinned to mirror cirq-core's own sympy requirement

    • Replaced qiskit-qir dependency with qbraid-qir[qiskit]>=0.6.0; the qiskit_to_pyqir conversion now uses qbraid_qir.qiskit.qiskit_to_qir instead of the archived qiskit-qir package

    • Updated qbraid-core requirement from >=0.3.2,<0.4.0 to >=0.3.3,<0.4.0

    • Updated qiskit-ibm-runtime optional dependency upper bound from <0.42 to <0.46; replaced deprecated RuntimeJob (V1) with RuntimeJobV2 in QiskitJob and updated tests accordingly

    • Added icalendar>=6.0 and recurring-ical-events>=3.0 to the rigetti extra for RFC 5545 maintenance-calendar parsing and recurrence handling

  2. v0.12.1
    May 17, 2026
    Added
    • Added as_batch=True parameter to QbraidDevice.submit() enabling submission of a list of circuits as a single batch job (one API call, one job QRN). QbraidJob.result() returns BatchResult for batch jobs and a single Result for regular jobs.

    • Added OpenQuantumProvider, OpenQuantumDevice, and OpenQuantumJob classes implementing the qBraid runtime interface for Open Quantum

    • Added config.yml, provider_integration_request.yml, documentation.yml, and question.yml GitHub issue templates, and expanded the existing bug-report and feature-request templates with structured fields (SDK version, affected-area dropdowns, steps/expected/actual splits, feature-area dropdowns, motivation/use-case prompts). The new config.yml routes the New Issue picker to the documentation, the qBraid contact page, GitHub Discussions, the security policy, and the contributing guide; blank_issues_enabled: false ensures every issue arrives via a template. The new provider-integration template provides a structured on-ramp for the external-contributor pattern that produced the Origin Quantum, Quantinuum, and Rigetti integrations during POSE Phase I

    • Added py.typed package data configuration in pyproject.toml to mark the package as type-aware

    Improved / Modified
    • Updated README.md to include documentation links for OriginProvider, QuantinuumProvider, and RigettiProvider in the runtime setup instructions

    • Replaced warnings.warn with logger.warning in QbraidProvider._get_program_spec method for to reduce noise in get_devices() calls

    • Updated examples submodule to latest commit

    Removed
    • Removed QirRunner from native runtime API exports and imports

    Dependencies
    • Updated qbraid-core minimum version requirement from 0.2.3 to 0.3.2 (#1182, #1187)

  3. v0.12.0
    Added
    • Added RigettiProvider, RigettiDevice, and RigettiJob classes implementing the qBraid runtime interface for Rigetti QCS; auth is handled via RIGETTI_REFRESH_TOKEN, RIGETTI_CLIENT_ID, and RIGETTI_ISSUER env vars or a QCSClient passthrough; requires local quilc and QVM binaries for compilation and simulation — install the Forest SDK before use

    • Added GroupJobSession context manager and GroupResult container to qbraid.runtime for grouping quantum job submissions into a logical group. Jobs submitted via QbraidDevice.run() inside an active GroupJobSession are automatically tagged with the group's QRN, supporting cross-device and cross-provider groups on qBraid native devices. Supports both with context-manager usage and manual open()/close() for interactive workflows, an optional max_ttl (1–86400s) after which the backend auto-closes the group, and an on_all_complete callback that fires with aggregated results when the context exits. Also exports get_active_group for retrieving the currently active group QRN

    • Added Quantinuum NEXUS provider integration (qbraid.runtime.quantinuum) with QuantinuumProvider, QuantinuumDevice, and QuantinuumJob classes. Supports single-circuit and batch submission via the NEXUS compile + execute pipeline; accepts any program type reachable to pytket via the qBraid transpiler graph. Counts are returned in MSB-first (BasisOrder.dlo) ordering for consistency with other qBraid providers.

    • Added OriginQ QCloud provider integration (qbraid.runtime.origin) with OriginProvider, OriginDevice, and OriginJob classes. Supports single-circuit submission on simulators and QPU backends, and batch submission (list[QProg]) on QPU backends. Simulator batch input automatically fans out to individual jobs.

    • Added pytket_to_qiskit conversion function in qbraid.transpiler.conversions.pytket.pytket_extras, enabling the transpiler graph to route pytket ↔ qiskit directly (previously reachable only via the qasm2 bridge). Gated by @requires_extras("pytket.extensions.qiskit").

    • Added cross-repo integration test workflow (.github/workflows/cross-repo-test.yml) and report script (.github/scripts/parse_test_report.py) to support testing the qBraid SDK against in-development branches of qbraid-core and pyqasm before they are released

    • Added remove_empty_registers function to qbraid.passes.qasm for stripping zero-length register declarations (e.g. creg c[0];) from QASM strings

    • Added pytest remote tests for QIR simulator device with fixtures for Bell state circuits as both QASM and QIR module formats

    • Added CodeRabbit configuration file (.coderabbit.yaml) to disable automatic code review functionality

    • Added @overload method signatures to QbraidDevice.submit method to provide type hints for single Program vs list[Program] input types

    • Added list_jobs and get_job methods to BraketProvider for querying AWS Braket quantum tasks; supports filtering by status, device ARN, tags, and cross-region queries when using multiple device ARNs

    • Added list_jobs and get_job methods to QiskitRuntimeProvider for querying IBM Quantum jobs via REST API; includes authentication via API key exchange for IAM tokens, filtering by status/backend/tags/date range, and pagination support

    Improved / Modified
    • Updated Azure Quantum provider to be compatible with azure-quantum>=3.6.0: replaced private _current_availability attribute access with public current_availability property on Target; simplified AzureQuantumProvider.__init__ to accept only an optional Workspace (removed credential parameter)

    • Added ccx → ccnot gate mapping in QASM3-to-Braket conversion

    • Updated PennyLane-to-QASM2 conversion to use pennylane.to_openqasm() module-level function, replacing the removed QuantumTape.to_openqasm() instance method

    • Added credential validation check in Azure Quantum test workspace fixture to skip tests when resource_id or credential are not fully configured

    • Added skip marker to test_submit_qasm2_to_quantinuum due to Quantinuum emulator usage quota exceeded

    • Added device status checks to QIR simulator remote tests (test_qir_simulator_qasm_circuit and test_qir_simulator_qir_module) to skip when device is not ONLINE

    • Simplified test_qasm3_to_braket_error_includes_detail test by removing reset case and converting from parametrized test to single case testing only the c3x undefined gate error

    • Modernized type annotations throughout qbraid.runtime by replacing Optional[] and Union[] with PEP 604 syntax using | operator

    • Fixed OpenQASM 3 to CUDA-Q conversion to promote integer gate parameters to floating-point values, preventing incorrect integer inference in rotation angles.

    • Improved qbraid.runtime.aws and qbraid.runtime.ibm modules with lazy imports using __getattr__ to reduce initialization overhead

    Deprecated
    • AzureQuantumJob._make_estimator_result and OutputDataFormat.RESOURCE_ESTIMATOR are deprecated; the microsoft.resource-estimates.v1 output format is no longer emitted by azure-quantum >= 3.x. These will be removed in v0.12

    Fixed
    • Fixed pyqpanda3-to-QASM2 conversion emitting invalid creg c[0] declarations, which caused downstream parsers to reject the output and broke round-trip conversions (e.g. cirq → pyqpanda3 → cirq)

    • Fixed azure-quantum version mismatch in development requirements to align with package optional dependency constraints

    • Fixed classical bit collisions in Braket pad_measurements method by detecting internal collisions, padding collisions, and out-of-range indices; rebases existing measures to sequential indices when necessary to ensure valid QASM output

    • Fixed BraketQuantumTask._get_partial_measurement_qubits_from_tags to return None and log warning when tag qubits are missing from result measurements, preventing crashes during result processing

    • Fixed QbraidJob.result method to handle failed jobs by creating a qbraid_core.services.runtime.schemas.Result with empty resultData instead of calling get_job_result, preventing crashes when processing failed job results

    Dependencies
    • Updated azure-quantum optional dependency from >=2.0,<2.3 to >=3.6.0,<4.0; removed azure-identity from the azure extra

    • Bumped pyqasm minimum version from >=0.5.0 to >=1.0.1

    • Updated pennylane optional dependency from <0.43 to >=0.43

    • Updated pytket-braket requirement from <0.46,>=0.30 to >=0.30,<0.47 in braket optional dependency and development requirements

    • Updated azure-quantum development requirement from >=2.0,<2.3 to >=3.6.0,<4.0 in requirements-dev.txt

    • Updated cudaq optional dependency from >=0.9.0 to >=0.9.0,<0.14.0 in the cudaq extra and development requirements

    • Updated qbraid-core requirement from >=0.2.3,<0.3.0 to >=0.2.3,<0.4.0 to support expanded version range

  4. v0.11.1
    February 24, 2026
    Added
    • Added IonQJob.cost() method to retrieve job cost information from the IonQ API

    Improved / Modified
    • Updated IonQ provider to use v0.4 API, including support for multi-circuit jobs, updated job status mappings (running → started), and enhanced measurement probability transformations

    • Added degraded status handling for IonQ devices

    • Refactored QbraidJob.result() to use qbraid_core.services.runtime.schemas.Result directly: removed dependency on ExperimentMetadata classes, added single ResultData.from_object(result, experiment_type) that builds from the core Result’s resultData, and pass time_stamps and cost through as Result details instead of metadata dump

    • Refactored ResultData subclasses to handle API camelCase keys (measurementCounts, numSolutions, etc.) in their from_dict implementations; GateModelResultData.from_dict now uses .get() and a known-keys filter instead of mutating a copy

    • QASM3-to-Braket conversion now supports QASM3 strings with physical qubits via a try/except workaround when PyQASM validation or transform fails

    Removed
    • Removed qbraid.runtime.experiment module (ExperimentMetadata, GateModelExperimentMetadata, AnnealingExperimentMetadata, AhsExperimentMetadata) and related tests; native job results now rely on the core Result schema and ResultData.from_object only

    Fixed
    • Fixed IonQ job submission to use updated API field names (target → backend) and proper job type specification

    • Fixed error mitigation parameter handling for IonQ jobs, now correctly nested under settings

    Dependencies
    • Add upper bound on pulser-core and pulser-simulation dev dependencies to >=1.4.0,<1.7.0

    • Increased upper bound on qbraid-qir dependency from <=0.5.0 to <=0.5.1

  5. v0.11.0
    February 8, 2026
    Improved / Modified
    • All serialize methods in program classes (analog, annealing, gate_model, etc.) now return a Program object from qbraid_core.services.runtime.schemas, replacing custom dictionary formats. This ensures a consistent API for program submission across all quantum program types.

    • The ahs module has been renamed to analog, with all relevant class and import names updated (e.g., AHSEncoder → AnalogHamiltonianEncoder). This includes file renames and updates to __init__.py, ensuring clarity and alignment with terminology.

    • The ExperimentType, JobStatus, and DeviceStatus enums are now imported directly from qbraid_core, removing the local definition and reducing duplication.

    Dependencies
    • Upgraded to qbraid-core>=0.2.0 to support qBraid Platform migration to V2 endpoints. See migration guide.

  6. v0.10.2
    February 8, 2026
    Deprecated
    • Deprecated qBraid V1 quantum jobs endpoints in favor of new V2 endpoints. See the API migration guide.

  7. v0.10.1
    January 14, 2026
    Added
    • Added AzureQuantumDevice.avg_queue_time() method which returns int average queue time in min

    Improved / Modified
    • Added a transformation for programs targeting IonQ devices, converting all i gates to rz(0). This transformation is useful because IonQ devices do not support the identity gate directly.

    • Updated number of shots used in Amazon Braket remote tests to minimum of 100 to match new lower bound of providers like IonQ (enforced by AWS, server-side)

    • Updated QASM2 to QASM3 transpiler weight from 0.7 to 1.0 to reflect improved conversion reliability.

    • For Amazon Braket devices, users can now use environment variables to define region name ("AWS_REGION") and endpoint url ("BRAKET_ENDPOINT"). This is useful when an application wraps over qBraid and does not have direct access to qBraid Provider class or AwsSession class.

    Removed
    • Removed qbraid-core[runner] dependency from qbraid[qir] extra. The only additional package that was being installed was psutil in order to support a function that tracks memory usage during a subprocess call to qir-runner. But people are mainly interested in this "extra" for the qbraid-qir conversions, and since this is outside of that scope, better to take it out and keep the dependencies lean.

    Fixed
    • Fixed OQCDevice.get_next_window() method with more robust ISO datetime string handling

    • Fixed BraketQuantumTask.result() to correctly handle AnalogHamiltonianSimulationQuantumTaskResult given the fact the partial measurement qubits aren't applicable to that job/result type.

    • Fixed OQC runtime tests by padding the date-time month/day with leading zero to ensure valid ISO format

    Dependencies
    • Updated qbraid-core requirement from >=0.1.39 to >=0.1.44,<0.2.0

  8. v0.10.0
    October 14, 2025
    Improved / Modified
    • Support circuits that use non-contiguous qubit indices on IonQ device and simulators through Amazon Braket. A measurement is added to every unused qubit up to the max qubit index. The results are filtered such that it only returns the results for the original measurements.

    • Change project license from GPL-3.0 to Apache-2.0.

    Dependencies
    • Updated cirq-core and cirq-ionq requirements from >=1.3,<1.6 to >=1.3,<1.7

  9. v0.9.10
    September 16, 2025
    Improved / Modified
    • Updated the QasmParserand transpilation from Cirq to PyQuil to be compatible with Cirq 1.5. Added testing for new behavior in Cirq 1.5.

    Dependencies
    • Updated cirq-core and cirq-ionq requirements from >=1.3,<1.5 to >=1.3,<1.6

    • Update qiskit-ibm-runtime dependency from >=0.25.0,<0.42 to >=0.39.0,<0.42

  10. v0.9.9
    September 1, 2025
    Added
    • Added opaque runtime_options (dict) argument to QbraidDevice.submit() to include in job payload

    • Added Equal1SimulationMetadata and Equal1SimulatorResultData classes to support processing of Equal 1 simulator v0.2.2 job data including base64 encoded "compiledOut"

    Improved / Modified
    • Skip remote Azure provider tests that now require payed plan

    • Adds support for partial measurements on IonQ and Amazon Braket devices by automatically padding circuits with measurements on all qubits while tracking and filtering results to show only the originally measured qubits.

    • Replaced execution_mode and device_name fields in the Equal1SimulationMetadata class with ir_type and noise_model to match data returned by Equal1 simulator v0.3.0

    • Moved decoding logic from Equal1SimulatorResultData class to the Equal1SimulationMetadata schema, ensuring that compiled outputs are automatically decoded when metadata is instantiated. For equal1_simulator jobs, the base64 decoded compiled output will now be accessible from a Result object as follows:

    Removed
    • Removed benchmarking module from tests as not relevant or used

    Fixed
    • Fixed bug that returned a single job instead of a list of jobs after batch job submission in the native provider runtime for QuEra Aquila using Bloqade Analog

    • Fixed the boto3.client initialization by adding the region_name parameter in _get_partial_measurement_qubits_from_tags method

    • Fixed bug that resulted in AttributeError: 'NoneType' object has no attribute 'service' when checking BraketDevice.availability_window(). Now ensures that AwsDevice.properties is defined using refresh_metadata() before proceeding with availability check.

    Dependencies
    • Reset Cirq dependency extra upper-bound to <1.5

    • Updated pyqasm requirement from >=0.3.2,<0.5 to >=0.5.0,<0.6.0

    • Updated pennylane requirement from <0.42 to >=0.42.3,<0.43

  11. v0.9.8
    July 22, 2025
    Improved / Modified
    • Removed legacy pkg_resources logic for loading entry points (qbraid._entrypoints), as support for Python 3.9 has been dropped and the project now requires Python 3.10 or higher.

    • Populated basis gates property in profile of AWS Braket provider device

    • Emit a UserWarning instead of raising a ValueError when checking for the sum of result probabilities from job to be equal

    • House keeping updates

    • Removed deprecated modules (qbraid.programs.circuits, qbraid.runtime.qiskit, and qbraid.runtime.braket)

    • Updated readme, contributing, citation, and various project config files.

    • Updated QiskitRuntimeProvider default channel to ibm_quantum_platform in preparation for the sunsetting of the IBM Quantum channel in favor of IBM Cloud. See qiskit-ibm-runtime updated instructions for account setup.

    • Implemented autoqasm_to_qasm3 conversion extra in transpiler for support of AutoQASM to QASM3 conversion. Added "autoqasm" program type to program registry.

    Fixed
    • Fixed handling of IBM job results for different creg names. Specifically, generalized measurements() and get_counts() methods in QiskitGateModelResultBuilder to account for mixed classical register names, and for classical register names other than "c" and "meas".

    Dependencies
    • Updated qiskit-ibm-runtime requirement from <0.39,>=0.25.0 to >=0.25.0,<0.41

    • Updated pydantic requirement from >2.0.0 to >2.0.0,<=2.11.1

    • Remove qiskit-qir (deprecated) from qbraid[qir] dependency extras

    • Updated amazon-braket-sdk requirement from >=1.83.0,<1.94.0 to >=1.83.0,<1.96.0

  12. v0.9.7
    June 13, 2025
    Added
    • Added CudaQKernel.serialize method that converts cudaq program to QIR string for run_input compatible format for QbraidDevice.submit.

    • Added support for batch jobs for devices from Azure provider. The AzureQuantumDevice.submit method now accepts single and batched qbraid.programs.QPROGRAM inputs.

    • Added ax_margins argument to plot_conversion_graph to prevent possible clipping.

    Improved / Modified
    • Updated TimeStamps schema to auto-compute executionDuration from createdAt and endedAt if not explicitly provided.

    • Enhanced TimeStamps to accept both datetime.datetime objects for createdAt and endedAt (previously only accepted ISO-formatted strings).

    • Added a measurement_probabilties argument to the GateModelResultData class.

    Removed
    • Removed queue_position from result details, as it is always None and not applicable.

    Fixed
    • Fixed lazy importing bug in plot_histogram method

    • Fixed bug which caused all braket conversions to be unavailable if cirq was not installed due to an eager top-level import in braket_to_cirq.py which should have been done lazily

    • Made Pulser unit test version-agnostic to support any installed Pulser version.

    • Fixed the bug that included unregistered program type in ConversionGraph.

    Dependencies
    • Migrated to setuptools>=77 due to TOML-table based project.license deprecation in favor of SPDX expression in compliance with PEP 639

    • Bumped qbraid-core dependency to v0.1.39

  13. v0.9.6
    Added
    • Added QbraidJob.async_result() to support async result retrieval using await.

    • Added QbraidDevice.set_target_program_type, allowing you to set a specific ProgramSpec (from TargetProfile) alias as the default. For example, if a device supports both "qasm2" and "qasm3", you can now restrict transpilation to one format:

    • Added support for Pasqal devices through the AzureQuantumProvider with pulser program type. For example:

    • Added support for transpiling between pyqpanda3 and QASM2 with pyqpanda3 program type

    Improved / Modified
    • Prepped tests for supporting qiskit>=2.0

    • Updated the qbraid.runtime.aws.BraketProvider to include an aws_session_token during initialization. Users can now choose to supply their temporary AWS credentials instead of permanent account secrets to access AWS -

    Removed
    • Removed the strict=False parameter from the pydantic_core.core_schema.union_schema() calls in the __get_pydantic_core_schema__ method(s) in qbraid.runtime.schemas.base. strict parameter no longer included in the pydantic-core API for that method as of release v0.2.30, PR #1638.

    Fixed
    • Fixed Amazon Braket remote test by changing catch JobStateError to TimeoutError

    • Fixed upper bound of html length check in pytket circuit drawer test

    • Fixed simulator check for Azure target profiles

    Dependencies
    • Added pydantic-core to project requirements

    • Updated pyqasm dependency to >=0.3.2, <0.4.0

  14. v0.9.5
    March 26, 2025
    Added
    • Added qbraid.runtime.get_providers() and corresponding qbraid.runtime.PROVIDERS which is a list of the provider aliases that can be passed to the qbraid.runtime.load_job()function.

    • Added bin script + logic in version bump workflow to automatically update CITATION.ff

    • Added a workflow for deploying to GitHub Pages on release publication or manual dispatch.

    • Added pytest.skip statements to Azure remote tests to skip them when the relevant device is not online.

    Improved / Modified
    • Disabled validation step in remote (native) IonQ runtime test when constructing IonQDict via qiskit-ionq

    • Enabled loading azure.quantum.Workspace from AZURE_QUANTUM_CONNECTION_STRING environment variable in AzureQuantumProvider class

    • Populated basis gates property in profile of IBM Quantum provider backends

    • Adjusted docs side navigation search styling for better alignment.

    • Added support for interpreting zz as a QIS gate in openqasm3_to_ionq and refactored determine_gateset accordingly

    • Modified openqasm3_to_ionq to emit warning instead of raise error when circuits contains measurements.

    • Set 20 minute timeout for daily github actions workflow

    • Updated QiskitRuntimeProvider class with better docstring annotations for specifying either ibm_quantum or ibm_cloud channel

    • QuantumJob.wait_for_final_state now raises TimeoutError on timeout instead of JobStateError

    • Updated job ID type annotations to support both str and int (for compatibility with QUDORA)

    • Updated qbraid._logging so that logging.basicConfig is only set if LOG_LEVEL environment variable is defined.

    Removed
    • Removed qasm3_drawer function in favor of pyqasm.draw

    Fixed
    • Updated bump-version.yml to track qbraid/_version.py instead of pyproject.toml.

    • Fixed bug where BraketQuantumTask._task.arn undefined if instaniated without AwsQuantumTask object

    • Fixed bug where doing repr(result) would cause result.details['opeQasm'] to be set to ...

    • Loosened relative tolerance for distribute_counts function in requiring probs to sum to 1 from default 1e-9 to 1e-7

    Dependencies
    • Updated qBraid-CLI dependency to >= 0.10.0

    • Migrated from bloqade to bloqade-analog

    • Added pyqasm[visualization] to optional dependencies

  15. v0.9.4
    February 20, 2025
    Added
    • Added qibo to dynamic QPROGRAM_REGISTRY imports

    • Fixed plt.show / plt.save_fig bug in plot conversion_graph

    • Added IonQ Forte Enterprise devices to IonQProvider runtime tests

    • Added CudaQKernel class to support cudaq.PyKernel as "native" program type

    • Added qibo_to_qasm2 conversion to transpiler

    • Added stim to dynamic QPROGRAM_REGISTRY imports and stim_to_cirq conversion to transpiler

    • Added Qasm2KirinString metatype to support qasm2 strings adapted for QuEra kirin qasm parser through qBraid native runtime.

    • Added translate functions as alias for transpile, but also that can chain multiple conversions together. For example:

    • Added logger DEBUG statements to QuantumDevice that track with the steps in job submission runtime

    • Expanded list of natively supported hardware vendors to include Rigetti, OQC, and IQM

    • Added qbraid.runtime.load_provider function to allow instantiating provider via a single interface using entrypoints based on provider name

    Improved / Modified
    • Updated conversion graph and QPROGRAM_REGISTRY on README.md

    • Improved plot_runtime_conversion_scheme by removing edges not within ConversionScheme.max_path_depth

    • Updated native runtime QbraidProvider and QbraidDevice to support list of ProgramSpec loaded from API "runInputTypes" of type list[str] instead of single "runPackage" of type str.

    • Updated qasm3_to_ionq: no longer need to check if pyqasm is installed as it is now a core project dependency

    Fixed
    • Handling of empty counts dict in format_counts pre-processing function

    • Skipping NEC remote tests if device is not online

  16. v0.9.3
    January 28, 2025
    Added
    • Added cudaq to QPROGRAM_REGISTRY dynamic import list

    • Added qiskit_ionq conversion to transpiler and refactored IonQDevice._apply_qiskit_ionq_conversion accordingly

    • Added qbraid.runtime.load_job function that uses entrypoints to load provider job class and create instance with job id

    • Added QuantumProgram.serialize method to streamline creation of ProgramSpec classes in QbraidProvider

    Improved / Modified
    • Switched all QbraidJob sub-classes to only require job_id as positional argument, and any other args that used to be required for auth can now be loaded with credentials from environment variables

    • Allow some minimum tolerance when checking for the sum of result probabilities from job to be equal to 1

    Fixed
    • Updated plot conversion graph test to account for rustworkx v0.16.0 release

Showing the 16 most recent releases. Browse the full history on GitHub.

002/BUILD ON THE LATEST

Ship on the newest release.

Every environment on qBraid ships the current SDK, pinned and reproducible. Open a notebook and dispatch to a real QPU.