Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Return correct job version #1524

Merged
merged 13 commits into from
May 8, 2024
1 change: 1 addition & 0 deletions qiskit_ibm_runtime/api/rest/runtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ def jobs_get(
"""
url = self.get_url("jobs")
payload: Dict[str, Union[int, str, List[str]]] = {}
payload["exclude_params"] = False
if limit:
payload["limit"] = limit
if skip:
Expand Down
22 changes: 19 additions & 3 deletions qiskit_ibm_runtime/qiskit_runtime_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
from .utils.result_decoder import ResultDecoder
from .runtime_job import RuntimeJob
from .runtime_job_v2 import RuntimeJobV2
from .utils import RuntimeDecoder, to_python_identifier
from .utils import RuntimeDecoder, RuntimeEncoder, to_python_identifier
from .api.client_parameters import ClientParameters
from .runtime_options import RuntimeOptions
from .ibm_backend import IBMBackend
Expand Down Expand Up @@ -938,7 +938,7 @@ def job(self, job_id: str) -> Union[RuntimeJob, RuntimeJobV2]:
IBMRuntimeError: If the request failed.
"""
try:
response = self._api_client.job_get(job_id, exclude_params=True)
response = self._api_client.job_get(job_id, exclude_params=False)
except RequestsApiError as ex:
if ex.status_code == 404:
raise RuntimeJobNotFound(f"Job not found: {ex.message}") from None
Expand Down Expand Up @@ -1088,16 +1088,32 @@ def _decode_job(self, raw_data: Dict) -> Union[RuntimeJob, RuntimeJobV2]:
api=None,
)

version = 1
params = raw_data.get("params", {})
if isinstance(params, list):
if len(params) > 0:
params = params[0]
else:
params = {}
if not isinstance(params, str):
params = json.dumps(params)
if params:
version = params.get("version", 1)
params = json.dumps(params, cls=RuntimeEncoder)

decoded = json.loads(params, cls=RuntimeDecoder)
if version == 2:
return RuntimeJobV2(
backend=backend,
api_client=self._api_client,
client_params=self._client_params,
service=self,
job_id=raw_data["id"],
program_id=raw_data.get("program", {}).get("id", ""),
params=decoded,
creation_date=raw_data.get("created", None),
session_id=raw_data.get("session_id"),
tags=raw_data.get("tags"),
)
return RuntimeJob(
backend=backend,
api_client=self._api_client,
Expand Down
5 changes: 5 additions & 0 deletions release-notes/unreleased/1471.bug.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Fixed an issue where retrieving jobs with
`job() <https://docs.quantum.ibm.com/api/qiskit-ibm-runtime/qiskit_ibm_runtime.QiskitRuntimeService#job>`__
and `jobs() <https://docs.quantum.ibm.com/api/qiskit-ibm-runtime/qiskit_ibm_runtime.QiskitRuntimeService#jobs>`__
would only return ``RuntimeJob`` instances, even if the job was run with a V2 primitive. Now,
V2 primitive jobs will be returned correctly as ``RuntimeJobV2`` instances.
14 changes: 14 additions & 0 deletions test/integration/test_retrieve_job.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
from datetime import datetime, timezone
from qiskit.providers.jobstatus import JobStatus
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import RuntimeJob, RuntimeJobV2


from ..ibm_test_case import IBMIntegrationJobTestCase
from ..decorators import run_integration_test, production_only, quantum_only
Expand Down Expand Up @@ -229,3 +231,15 @@ def test_retrieve_jobs_backend(self, service):
jobs = service.jobs(backend_name=backend)
for job in jobs:
self.assertEqual(backend, job.backend().name)

@run_integration_test
def test_retrieve_correct_job_version(self, service):
"""Test retrieving the correct job version."""
job = self._run_program(service, program_id="sampler")
job.wait_for_final_state()
rjob = service.job(job.job_id())
job_v2 = self._run_program(service, program_id="samplerv2")
job_v2.wait_for_final_state()
rjob_v2 = service.job(job_v2.job_id())
self.assertIsInstance(rjob, RuntimeJob)
self.assertIsInstance(rjob_v2, RuntimeJobV2)
Loading