Release Notes#


Upgrade Notes#

  • module has been split into the following submodules:,,,,,,,, and

    First reason for doing this was code clean-up (including adding type annotations), but a more important reason is that this will enable import time optimization in the future. And that’s why we break backwards compatibility by not importing everything back into the top-level utils namespace.

    The utils module is considered Ocean-internal as is, so this move shouldn’t affect user’s code.

  • Positional arguments in constructor, deprecated in 0.10.0, are removed in 0.12.0. Use keyword arguments instead.

  • Alias keys samples and occurrences (for solutions and num_occurrences) in the results dict of, deprecated in 0.8.0, are now finally removed in 0.12.0. We’ll try to keep the result dict as close to raw data returned by SAPI as possible. Postprocessed data is instead available via properties.


New Features#

  • Add support for binary-ref answer encoding format, where answer data is not immediately present in the answer, but on an URI referenced in the answer response.

  • Add property to hold the answer data of a resolved future. A call to .answer_data will block until computation future is resolved.

  • Add model, a subclass of ProblemAnswer for binary-ref answers, and a method for downloading answer data (resolving binary-ref),

  • Add support for nonlinear unstructured solvers with

  • Add request/response logging to AuthFlow/OAuth2Session.

  • Add basic support for structured logs (JSON output).

  • Enable log format control with DWAVE_LOG_FORMAT env variable (set to "json" for structured output.

Bug Fixes#

  • Fix a possible race condition when multiple threads try to resolve remote computation results. A special case of this occurs on binary answer download from a reference link. See #624.

  • Log failing request/response details in the low-level API client.

  • Suppress logging output from the cloud-client by default (as recommended for libraries).

  • Format log record date/time according to ISO 8601.


New Features#

  • Add revoke_token method to to enable revocation of OAuth 2.0 refresh/access tokens. See #600.

  • Add dwave auth revoke CLI command to enable revocation of OAuth 2.0 refresh/access tokens from command line. See #600.


Bug Fixes#

  • Use fixed authorization success URL, without any authorization query parameters appended (to minimize exposure), as they are not needed on the authorization server’s success page.

  • Improve CSRF protection on localhost redirect URI during authorization code exchange. Previously, state was verified only if supplied. Now it’s mandatory. Please note this is an additional CSRF protection on top of the PKCE, just in case PKCE is not supported (or properly implemented) server-side.

  • Fix PKCE support in by properly including code_verifier in fetch token (code exchange) requests. See #605.

  • Remove circular references in to enable easier garbage collection and lower memory footprint. See #601.

  • Use a consistent User-Agent value for all API and non-API requests made by Client, api.Client and auth.flow client.

  • Speed-up User-Agent string construction significantly (10ms to 5us).


New Features#

  • Add Python 3.12 support.

  • Add as a replacement for pkg_resources.get_distribution unavailable in Python 3.12.


New Features#

  • Add optional Leap authorization step to dwave setup CLI. During setup, we now install optional contributed packages, authorize Ocean to access Leap (--auth and --oob flags), and finally create the configuration file, optionally retrieving SAPI token from Leap API (if authorized) for the currently active Leap project, or project specified with --project option. See #591.

  • Add --skip-valid option to dwave auth login CLI. When used, authorization flow will be skipped if Leap access token is valid or if it can be refreshed.

  • Prefer QPU solvers in dwave ping, unless overridden by user/config. See #592

  • Redirect user back to a Leap info page when auth redirect flow successfully completes. Similarly, redirect user to a Leap error page in case of an auth error.


New Features#

  • Add Leap authorization-related group of CLI commands under dwave auth: login, get <token-type>, refresh. See #565.

  • Add Leap project CLI commands under new dwave leap project group: ls, token.

  • Add --auto option to dwave config create to attempt SAPI token fetch from Leap API on configuration file create (if access already authorized with dwave auth login).

  • For OAuth 2.0 Authorization Code exchange flow, add support for both the redirect flow and the out-of-band flow. See #564.

  • Add a general-purpose, multi-threaded, WSGI application server, This server can handle redirect URIs in the OAuth2 authorization code flow. See #563.

  • Add based on to specifically handle only one (valid) request to the OAuth redirect URI (and self-terminate after that).

  • Add, an on-disk credentials store. See #562.

  • Add configuration options for defining Leap API endpoint: leap_api_endpoint option in configuration file or as keyword argument, and DWAVE_LEAP_API_ENDPOINT environment variable. See #569.

  • Add a configuration option for setting Leap OAuth 2.0 Ocean client id, leap_client_id. Primarily used for testing.

  • Add OAuth 2.0 Authorization Code exchange flow to enable users to authorize Ocean SDK to access Leap API on their behalf. See #564.

  • Add wall time and QPU timing to dwave sample output. See #570.

  • Add a per-call cached value maximum age (maxage_) for functions decorated with @cached.

  • Allow specifying cache key explicitly, instead of using all arguments of a function decorated with @cached.

  • Add cache bypass control via disable() and enable() on the decorated function.

  • Add @cached.disabled context manager (and a function decorator) that temporarily disables cache within the context (i.e. the decorated function). See #503.

  • Add leap_api_endpoint and solver_api_endpoint properties to

  • Move to in a new regions submodule, and refactor for flexibility of use and better caching control. See #577.

  • Add endpoints-from-region resolver, Previously, similar resolver was part of the Client class.

  • Add --clique-size/--size/-k options to dwave sample CLI command to help specify problem size (clique size) for random problems generated for unstructured solvers.

  • Add Pydantic-based data model for cloud-client configuration,

  • Consolidate client runtime configuration options under Client.config, a data model defined with and decouple config parsing from construction. See #504.

  • Add from_config() family of factories to and subclasses for SolverAPI, MetadataAPI and LeapAPI. from_config() dispatches to from_config_model() or from_config_file(), depending on arguments. See #572.

  • Use full client config for Metadata API access during region/endpoint resolution on construction. See #505.

  • Add support for specifying connection read timeout separately from connect timeout. Previously, both read and connect timeouts were set to the same value, specified with the request_timeout configuration parameter. We now accept a (read, connect) tuple for the request_timeout parameter. See #440.

  • Add --project option to dwave config create, to be used in conjunction with --auto/--auto-token.

    When project is not specified, the configuration file is initialized with a SAPI token for the currently active Leap project.

    Project can be specified via project name, code or ID.

  • Upgrade* to use Pydantic v2. See #555.

Upgrade Notes#

  • Upgrade your python to 3.8+. We no longer support python 3.7 and below.

  • Method from_client_config() is removed from, (affecting instantiation of its subclasses), in favor of a new method from_config_model() (or alternatively, a more general from_config()). Previously an instance of either or was required, and now it’s possible to use just the configuration, a object.

    To upgrade, replace {ResourceBase}.from_client_config(cloud_client) with {ResourceBase}.from_config_model(client.config), and {ResourceBase}.from_client_config(dwave_api_client) with {ResourceBase}(dwave_api_client).

  • parameter cache has been renamed to store.

  • API models now coerce Numpy types to Python types on validation (model instantiation), instead of holding typing.Any until serialization.

  • Disk cache serialization changed from Python pickle to JSON. Currently, disk cache is used only for the list of Leap regions fetched from the Metadata API on instantiation. Upgrade should be seamless, as a new on-disk cache database file is created for each dwave-cloud-client version.

Deprecation Notes#

  • Client method get_regions is deprecated in favor of

  • Individual config options exposed as attributes are deprecated since dwave-cloud-client==0.11.0 and will be removed in dwave-cloud-client==0.12.0. Use Client.config data model instead.

Bug Fixes#

  • Fix @cached instances isolation when using a shared storage (e.g. disk cache), via bucket argument (cache key prefix).

  • Fix random problem sampling on hybrid solvers via dwave sample CLI. See #557.

  • Fix region/endpoint resolution during construction when insecure connection is required (config: permissive_ssl = On) and/or a proxy is used (config: proxy = socks5://...). Previously client construction would fail completely. See #507.

  • Correctly set backoff_max time for retried requests when urllib3>=2.0 is used. See #566.


New Features#

  • Add basic support for Leap API access with and

  • Filter out more formats of API token-like strings from logs. In addition to the Solver API tokens, we now filter generic 32-char+ hex tokens (Leap API access token format), and UUID tokens (all variants). See #551.

Bug Fixes#

  • Constrain pydantic version, as V2 introduces major backwards incompatible changes.


New Features#

  • Add strict_mode support to VersionedAPISession. Strict mode is now the default, implying API requests will fail if type/version is expected and the response doesn’t include it.

  • Add version_strict_mode config option to DWaveAPIClient. It corresponds to underlying session’s (VersionedAPISession) strict_mode.

  • Add VersionedAPISession, a requests.Session subclass (more precisely, further specialized LoggingSession) that enforces conformance of API response version with supported version range(s).

  • Add accepts decorator for declaring accepted media type and response format version (range) on methods.

  • Simplify interface (require only media_type and version), but retain flexibility (pass all keyword arguments to VersionedAPISession.set_accept).

  • Support strict_mode control of API response type validation via @accepts interface.

Upgrade Notes#

  • Response type version is now always required (regardless of strict_mode) if type is expected and received, and version is expected.

  • Enforce D-Wave API response format version on all cloud.api resources.

Bug Fixes#

  • Fix to allow for partial decoration of Resource methods. See #544.


New Features#

  • Add Python 3.11 support

  • Add dimod 0.12.x support

  • Add numpy 1.24.x support


New Features#

  • Add support for NumPy scalars used as problem parameter values.


New Features#

  • Added estimate_qpu_access_time method to to estimate quantum processing unit (QPU) access time for a submission to the selected solver.


Bug Fixes#

  • Previously it was possible for mutually exclusive config options, if all specified on the same level, and depending on the order used, to not be correctly combined with options from a lower level. See #524, now fixed.


New Features#

  • Add poll_backoff_base configuration option to control the exponential base of the (problem status) polling schedule. Available as a config file option and keyword argument.

Upgrade Notes#

  • Make polling schedule denser in the beginning (by lowering the exponential base from 2 to 1.3), thus enabling much faster answer download for SAPI response times under two minutes.

  • Remove Client.solvers() method in favor of Client.get_solvers(). It was previously deprecated in dwave-cloud-client==0.5.0.

  • Remove property in favor of method. The property was previously deprecated in dwave-cloud-client==0.7.3.

  • Remove{eta_min,eta_max}. These properties were previously deprecated in dwave-cloud-client==0.8.5 when the underlying SAPI feature/field was removed.

  • Remove alias in favor of property. The alias was previously deprecated in dwave-cloud-client==0.8.0.

  • CLI: use of -c for --config-file has been deprecated since dwave-cloud-client==0.8.5 in favor of -f, and the option is now removed in 0.10.0. Use --config-file or -f instead.

  • Remove support for dimod 0.8.x. Upgrade dimod to 0.9.0+.

  • Upgrade your python to 3.7+. We no longer support python 3.6 and below.

Deprecation Notes#

  • Alias keys (samples and occurrences) in dictionary are deprecated since dwave-cloud-client==0.8.0 and will be removed in dwave-cloud-client==0.12.0.

  • Positional arguments to constructor are deprecated since dwave-cloud-client==0.10.0 and will be removed in dwave-cloud-client==0.12.0. Use keywords arguments instead.


Bug Fixes#

  • Preemptively resolve sampling answer during dwave ping and dwave sample, as to capture and properly output/format eventual errors. See #517.


New Features#

  • Add StructuredSolver.reformat_parameters() method. This method can be used to format solver parameters for SAPI. See #465.

  • Support dimod<0.13.0

Bug Fixes#

  • Make sure Future.wait_id() fails deterministically in a case of problem submit error. Previously it would hang if SAPI didn’t return problem_id for whatever reason. See #469 and #511.


New Features#

  • Add Python 3.10 support.

  • Add --json output option to dwave sample.

  • Add --sampling-params option to dwave sample. --num-reads has been kept, and it now overwrites value given in sampling params.

  • Add --label option to dwave ping and dwave sample, with a default value set. See #481.

  • Add --full option to dwave setup, propagated to dwave config create. Clarified dwave setup operation in CLI help.

  • Filter out API token-like strings from logs. Most notably, we make sure to redact Solver API tokens, but will filter out any prefixed hex token. See #391.

Bug Fixes#

  • Improved error and output handling in dwave sample. See #300.


New Features#

  • Added Metadata API client, Regions model and API resource.

  • Added multi-region support to

    New config option for region selection is called region, and environment variable is called DWAVE_API_REGION.

    New config option for specifying Metadata API endpoint URL is exposed as metadata_api_endpoint and DWAVE_METADATA_API_ENDPOINT.

    List of available regions available with

  • Add context manager protocol support to to ensure resources are easily cleaned up (session closed). Note that close() method is available for cases when context manager pattern is inconvenient.

    Similarly, we add close() method to resources in*, in addition to the existing context manager protocol support.

  • Add --region and --endpoint options to the relevant dwave CLI subcommands: ping, solvers, sample, upload.

Upgrade Notes#

  • To access solvers in a non-default region (na-west-1), you can use the region config option and DWAVE_API_REGION environment variable.

  • used to return some minimal (but arbitrary) set of always-set options (set to None if undefined). Now it returns just the options set either in config file, environment, or kwargs.

Bug Fixes#

  • Fix enumeration to include the CQM problem type.


New Features#

  • Add Leap hybrid CQM solvers support.

Upgrade Notes#

  • Sampling on structured solvers of problems with incompatible graph/structure now fails with ProblemStructureError.

Bug Fixes#

  • Make StructuredSolver.check_problem faster (15-20%). See #487.


New Features#

  • Default dwave config create configuration flow is now simplified to prompt only for essential parameters (at the moment that’s only token).

    Interactive configuration of an extended set of non-essential parameters (i.e. the previous default) is now available via a new flag: --full.

    See #304

Upgrade Notes#

  • To configure non-essential parameters such as endpoint, client and solver, configuration create command now has to be called with the --full option:

    dwave config create --full

Bug Fixes#

  • When a path to a nonexistent config file is provided to dwave config create, we’ll now happily create that file, instead of failing.



We began using Reno as a changelog tool after the release of 0.8.7. Content added before that release is not included. See releases for previous release notes.

New Features#

  • A low-level added to abstract SAPI communication details (like authentication, response decoding, error handling, retries, etc).

  • All SAPI requests and responses modelled in*. These models are used for data validation and representation.

  • Added model-level interfaces to SAPI resources (in a REST sense), and

  • Added mock solver data generators.

  • New layer of exceptions added in Base exception RequestError subclasses requests’s exception and includes raw .response object, along with .error_msg and .error_code returned by SAPI.

  • Begin using reno for changelog.

Upgrade Notes#

  • SAPIError exception is now just an alias for

  • module is now a namespace containing all client subclasses as submodules. You should update your imports accordingly:         -->  -->     -->      -->

    For backwards compatibility, old import paths still work, but are deprecated.

Deprecation Notes#

  • Import paths{hybrid,qpu,sw}.Client are deprecated and should be replaced with{hybrid,qpu,sw}.Client.

Bug Fixes#

  • Configured client session creation is sped up by caching user-agent construction (per client). Client session is now created ~200x faster, making it on par with requests.Session creation time (~50us).

  • Avoid character encoding / charset guessing for speed and stability.