diff --git a/CHANGELOG.md b/CHANGELOG.md index 706ed79..c4f75f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), - `Backend` now exposes `supported_gates`, `supported_native_gates`, and `supported_error_mitigations`. - `estimate_job_cost` response gained `estimated_quantum_compute_time_us`, and its `rate_information` gained `qct_cost_cents` and `rate_type` (`"qct"` or `"2qge"`). Its `cost_1q_gate`, `cost_2q_gate`, and `job_cost_minimum` rate fields are now nullable. +### Fixed + +- `estimate_job_cost` no longer raises `KeyError` parsing a successful estimate: `GetJobEstimateResponse` now matches the shape the API actually serves (`estimate_context`, `rate_card`, `estimated_unit`, `estimated_total_cost`) via the OpenAPI overlay, replacing the stale `input_values` / `rate_information` / `cost_unit` / `estimated_cost` shape. Adds the `GetJobEstimateContext`, `RateCardEntry`, and `GetJobEstimateResponseRateCard` models; removes `GetJobEstimateResponseRateInformation`. +- `get_usages` no longer raises `ValueError: badly formed hexadecimal UUID string`: organization ids are not UUIDs, so the `organization_id` path parameter and the `Usages.organization` response field are now plain `str` (previously `UUID`) via the OpenAPI overlay. +- `get_usages` no longer raises `ValueError: Invalid isoformat string` parsing `usage_data`: the API returns RFC 3339 date-times for `Usage.from`, so the field is now `datetime.datetime` (previously `datetime.date`) via the OpenAPI overlay. + ### Changed - `NativeCircuitInput.qubits` and `JsonMultiCircuitInput.qubits` are now `int | Unset` (previously `float | Unset`), matching upstream's tightening to `format: int32, minimum: 1`. `QisCircuitInput.qubits` already had this type locally via the OpenAPI overlay; that overlay action has been removed now that upstream is correct natively. diff --git a/ionq_core/api/usage/get_usages.py b/ionq_core/api/usage/get_usages.py index 8d12949..935c015 100644 --- a/ionq_core/api/usage/get_usages.py +++ b/ionq_core/api/usage/get_usages.py @@ -18,13 +18,12 @@ from ...models.modality import Modality from ...models.usages import Usages from typing import cast -from uuid import UUID import datetime def _get_kwargs( - organization_id: UUID, + organization_id: str, *, start_date: datetime.date, end_date: datetime.date, @@ -89,7 +88,7 @@ def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Res def sync_detailed( - organization_id: UUID, + organization_id: str, *, client: AuthenticatedClient | Client, start_date: datetime.date, @@ -103,7 +102,7 @@ def sync_detailed( Retrieves the costs of a given group type, broken down by the given date modality. Args: - organization_id (UUID): + organization_id (str): start_date (datetime.date): end_date (datetime.date): group_by (GroupBy): QPU Usage grouping Example: project. @@ -134,7 +133,7 @@ def sync_detailed( return _build_response(client=client, response=response) def sync( - organization_id: UUID, + organization_id: str, *, client: AuthenticatedClient | Client, start_date: datetime.date, @@ -148,7 +147,7 @@ def sync( Retrieves the costs of a given group type, broken down by the given date modality. Args: - organization_id (UUID): + organization_id (str): start_date (datetime.date): end_date (datetime.date): group_by (GroupBy): QPU Usage grouping Example: project. @@ -174,7 +173,7 @@ def sync( ).parsed async def asyncio_detailed( - organization_id: UUID, + organization_id: str, *, client: AuthenticatedClient | Client, start_date: datetime.date, @@ -188,7 +187,7 @@ async def asyncio_detailed( Retrieves the costs of a given group type, broken down by the given date modality. Args: - organization_id (UUID): + organization_id (str): start_date (datetime.date): end_date (datetime.date): group_by (GroupBy): QPU Usage grouping Example: project. @@ -219,7 +218,7 @@ async def asyncio_detailed( return _build_response(client=client, response=response) async def asyncio( - organization_id: UUID, + organization_id: str, *, client: AuthenticatedClient | Client, start_date: datetime.date, @@ -233,7 +232,7 @@ async def asyncio( Retrieves the costs of a given group type, broken down by the given date modality. Args: - organization_id (UUID): + organization_id (str): start_date (datetime.date): end_date (datetime.date): group_by (GroupBy): QPU Usage grouping Example: project. diff --git a/ionq_core/models/__init__.py b/ionq_core/models/__init__.py index 2398d7f..6819a1d 100644 --- a/ionq_core/models/__init__.py +++ b/ionq_core/models/__init__.py @@ -50,10 +50,10 @@ from .get_job_cost_response import GetJobCostResponse from .get_job_cost_response_cost import GetJobCostResponseCost from .get_job_cost_response_estimated_cost import GetJobCostResponseEstimatedCost +from .get_job_estimate_context import GetJobEstimateContext from .get_job_estimate_query_params import GetJobEstimateQueryParams from .get_job_estimate_response import GetJobEstimateResponse -from .get_job_estimate_response_rate_information import GetJobEstimateResponseRateInformation -from .get_job_estimate_response_rate_information_rate_type import GetJobEstimateResponseRateInformationRateType +from .get_job_estimate_response_rate_card import GetJobEstimateResponseRateCard from .get_job_response import GetJobResponse from .get_jobs_query_params import GetJobsQueryParams from .get_jobs_response import GetJobsResponse @@ -120,6 +120,8 @@ from .quantum_function_job_creation_payload_settings import QuantumFunctionJobCreationPayloadSettings from .quantum_function_job_creation_payload_settings_error_mitigation import QuantumFunctionJobCreationPayloadSettingsErrorMitigation from .quantum_function_job_creation_payload_type import QuantumFunctionJobCreationPayloadType +from .rate_card_entry import RateCardEntry +from .rate_card_entry_unit import RateCardEntryUnit from .registers import Registers from .request_validation import RequestValidation from .session import Session @@ -179,10 +181,10 @@ "GetJobCostResponse", "GetJobCostResponseCost", "GetJobCostResponseEstimatedCost", + "GetJobEstimateContext", "GetJobEstimateQueryParams", "GetJobEstimateResponse", - "GetJobEstimateResponseRateInformation", - "GetJobEstimateResponseRateInformationRateType", + "GetJobEstimateResponseRateCard", "GetJobResponse", "GetJobsQueryParams", "GetJobsResponse", @@ -249,6 +251,8 @@ "QuantumFunctionJobCreationPayloadSettings", "QuantumFunctionJobCreationPayloadSettingsErrorMitigation", "QuantumFunctionJobCreationPayloadType", + "RateCardEntry", + "RateCardEntryUnit", "Registers", "RequestValidation", "Session", diff --git a/ionq_core/models/get_job_estimate_response.py b/ionq_core/models/get_job_estimate_response.py index 1c04748..71547f0 100644 --- a/ionq_core/models/get_job_estimate_response.py +++ b/ionq_core/models/get_job_estimate_response.py @@ -16,8 +16,8 @@ from typing import cast if TYPE_CHECKING: - from ..models.get_job_estimate_query_params import GetJobEstimateQueryParams - from ..models.get_job_estimate_response_rate_information import GetJobEstimateResponseRateInformation + from ..models.get_job_estimate_context import GetJobEstimateContext + from ..models.get_job_estimate_response_rate_card import GetJobEstimateResponseRateCard @@ -31,41 +31,44 @@ class GetJobEstimateResponse: """ Attributes: - input_values (GetJobEstimateQueryParams): + estimate_context (GetJobEstimateContext): estimated_at (str): - cost_unit (str): - rate_information (GetJobEstimateResponseRateInformation): - estimated_cost (float): - estimated_execution_time (float): - current_predicted_queue_time (float): - estimated_quantum_compute_time_us (float | Unset): + estimated_unit (str): + rate_card (GetJobEstimateResponseRateCard): + estimated_total_cost (float): + estimated_execution_time (int): Predicted job execution time, in milliseconds. Example: 96250. + current_predicted_queue_time (int): Predicted time this job will wait in the queue before running, in + milliseconds. Example: 397577. + estimated_quantum_compute_time_us (int | Unset): Predicted quantum compute time, in microseconds. Only present + for + compute_second priced backends. """ - input_values: GetJobEstimateQueryParams + estimate_context: GetJobEstimateContext estimated_at: str - cost_unit: str - rate_information: GetJobEstimateResponseRateInformation - estimated_cost: float - estimated_execution_time: float - current_predicted_queue_time: float - estimated_quantum_compute_time_us: float | Unset = UNSET + estimated_unit: str + rate_card: GetJobEstimateResponseRateCard + estimated_total_cost: float + estimated_execution_time: int + current_predicted_queue_time: int + estimated_quantum_compute_time_us: int | Unset = UNSET def to_dict(self) -> dict[str, Any]: - from ..models.get_job_estimate_query_params import GetJobEstimateQueryParams - from ..models.get_job_estimate_response_rate_information import GetJobEstimateResponseRateInformation - input_values = self.input_values.to_dict() + from ..models.get_job_estimate_context import GetJobEstimateContext + from ..models.get_job_estimate_response_rate_card import GetJobEstimateResponseRateCard + estimate_context = self.estimate_context.to_dict() estimated_at = self.estimated_at - cost_unit = self.cost_unit + estimated_unit = self.estimated_unit - rate_information = self.rate_information.to_dict() + rate_card = self.rate_card.to_dict() - estimated_cost = self.estimated_cost + estimated_total_cost = self.estimated_total_cost estimated_execution_time = self.estimated_execution_time @@ -77,11 +80,11 @@ def to_dict(self) -> dict[str, Any]: field_dict: dict[str, Any] = {} field_dict.update({ - "input_values": input_values, + "estimate_context": estimate_context, "estimated_at": estimated_at, - "cost_unit": cost_unit, - "rate_information": rate_information, - "estimated_cost": estimated_cost, + "estimated_unit": estimated_unit, + "rate_card": rate_card, + "estimated_total_cost": estimated_total_cost, "estimated_execution_time": estimated_execution_time, "current_predicted_queue_time": current_predicted_queue_time, }) @@ -94,24 +97,24 @@ def to_dict(self) -> dict[str, Any]: @classmethod def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - from ..models.get_job_estimate_query_params import GetJobEstimateQueryParams - from ..models.get_job_estimate_response_rate_information import GetJobEstimateResponseRateInformation + from ..models.get_job_estimate_context import GetJobEstimateContext + from ..models.get_job_estimate_response_rate_card import GetJobEstimateResponseRateCard d = dict(src_dict) - input_values = GetJobEstimateQueryParams.from_dict(d.pop("input_values")) + estimate_context = GetJobEstimateContext.from_dict(d.pop("estimate_context")) estimated_at = d.pop("estimated_at") - cost_unit = d.pop("cost_unit") + estimated_unit = d.pop("estimated_unit") - rate_information = GetJobEstimateResponseRateInformation.from_dict(d.pop("rate_information")) + rate_card = GetJobEstimateResponseRateCard.from_dict(d.pop("rate_card")) - estimated_cost = d.pop("estimated_cost") + estimated_total_cost = d.pop("estimated_total_cost") estimated_execution_time = d.pop("estimated_execution_time") @@ -120,11 +123,11 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: estimated_quantum_compute_time_us = d.pop("estimated_quantum_compute_time_us", UNSET) get_job_estimate_response = cls( - input_values=input_values, + estimate_context=estimate_context, estimated_at=estimated_at, - cost_unit=cost_unit, - rate_information=rate_information, - estimated_cost=estimated_cost, + estimated_unit=estimated_unit, + rate_card=rate_card, + estimated_total_cost=estimated_total_cost, estimated_execution_time=estimated_execution_time, current_predicted_queue_time=current_predicted_queue_time, estimated_quantum_compute_time_us=estimated_quantum_compute_time_us, diff --git a/ionq_core/models/get_job_estimate_response_rate_information.py b/ionq_core/models/get_job_estimate_response_rate_information.py deleted file mode 100644 index 514176e..0000000 --- a/ionq_core/models/get_job_estimate_response_rate_information.py +++ /dev/null @@ -1,154 +0,0 @@ -# SPDX-FileCopyrightText: 2026 IonQ, Inc. -# SPDX-License-Identifier: Apache-2.0 -# @generated - -from __future__ import annotations - -from collections.abc import Mapping -from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import UNSET, Unset - -from ..models.get_job_estimate_response_rate_information_rate_type import check_get_job_estimate_response_rate_information_rate_type -from ..models.get_job_estimate_response_rate_information_rate_type import GetJobEstimateResponseRateInformationRateType -from typing import cast - - - - - - -T = TypeVar("T", bound="GetJobEstimateResponseRateInformation") - - - -@_attrs_define -class GetJobEstimateResponseRateInformation: - """ - Attributes: - qct_cost_cents (float | None): - rate_type (GetJobEstimateResponseRateInformationRateType): - job_cost_minimum (float | None): - cost_2q_gate (float | None): - cost_1q_gate (float | None): - organization (str): - """ - - qct_cost_cents: float | None - rate_type: GetJobEstimateResponseRateInformationRateType - job_cost_minimum: float | None - cost_2q_gate: float | None - cost_1q_gate: float | None - organization: str - additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) - - - - - - def to_dict(self) -> dict[str, Any]: - qct_cost_cents: float | None - qct_cost_cents = self.qct_cost_cents - - rate_type: str = self.rate_type - - job_cost_minimum: float | None - job_cost_minimum = self.job_cost_minimum - - cost_2q_gate: float | None - cost_2q_gate = self.cost_2q_gate - - cost_1q_gate: float | None - cost_1q_gate = self.cost_1q_gate - - organization = self.organization - - - field_dict: dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({ - "qct_cost_cents": qct_cost_cents, - "rate_type": rate_type, - "job_cost_minimum": job_cost_minimum, - "cost_2q_gate": cost_2q_gate, - "cost_1q_gate": cost_1q_gate, - "organization": organization, - }) - - return field_dict - - - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - d = dict(src_dict) - def _parse_qct_cost_cents(data: object) -> float | None: - if data is None: - return data - return cast(float | None, data) - - qct_cost_cents = _parse_qct_cost_cents(d.pop("qct_cost_cents")) - - - rate_type = check_get_job_estimate_response_rate_information_rate_type(d.pop("rate_type")) - - - - - def _parse_job_cost_minimum(data: object) -> float | None: - if data is None: - return data - return cast(float | None, data) - - job_cost_minimum = _parse_job_cost_minimum(d.pop("job_cost_minimum")) - - - def _parse_cost_2q_gate(data: object) -> float | None: - if data is None: - return data - return cast(float | None, data) - - cost_2q_gate = _parse_cost_2q_gate(d.pop("cost_2q_gate")) - - - def _parse_cost_1q_gate(data: object) -> float | None: - if data is None: - return data - return cast(float | None, data) - - cost_1q_gate = _parse_cost_1q_gate(d.pop("cost_1q_gate")) - - - organization = d.pop("organization") - - get_job_estimate_response_rate_information = cls( - qct_cost_cents=qct_cost_cents, - rate_type=rate_type, - job_cost_minimum=job_cost_minimum, - cost_2q_gate=cost_2q_gate, - cost_1q_gate=cost_1q_gate, - organization=organization, - ) - - - get_job_estimate_response_rate_information.additional_properties = d - return get_job_estimate_response_rate_information - - @property - def additional_keys(self) -> list[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/ionq_core/models/get_job_estimate_response_rate_information_rate_type.py b/ionq_core/models/get_job_estimate_response_rate_information_rate_type.py deleted file mode 100644 index be8103b..0000000 --- a/ionq_core/models/get_job_estimate_response_rate_information_rate_type.py +++ /dev/null @@ -1,14 +0,0 @@ -# SPDX-FileCopyrightText: 2026 IonQ, Inc. -# SPDX-License-Identifier: Apache-2.0 -# @generated - -from typing import Literal - -GetJobEstimateResponseRateInformationRateType = Literal['2qge', 'qct'] - -GET_JOB_ESTIMATE_RESPONSE_RATE_INFORMATION_RATE_TYPE_VALUES: set[GetJobEstimateResponseRateInformationRateType] = { '2qge', 'qct', } - -def check_get_job_estimate_response_rate_information_rate_type(value: str) -> GetJobEstimateResponseRateInformationRateType: - if value in GET_JOB_ESTIMATE_RESPONSE_RATE_INFORMATION_RATE_TYPE_VALUES: - return value - raise TypeError(f"Unexpected value {value!r}. Expected one of {GET_JOB_ESTIMATE_RESPONSE_RATE_INFORMATION_RATE_TYPE_VALUES!r}") diff --git a/ionq_core/models/usage.py b/ionq_core/models/usage.py index 226d985..c66f02b 100644 --- a/ionq_core/models/usage.py +++ b/ionq_core/models/usage.py @@ -32,14 +32,14 @@ class Usage: Attributes: amount (float): The amount as a cost in USD Example: 1614.23. - from_ (datetime.date): Date for this group's usage Example: 2023-07-01. + from_ (datetime.datetime): Date for this group's usage Example: 2023-07-01. group_usages (list[GroupUsage]): The top 5 usage groups in order of cost amount descending job_count (int): The count of jobs for this group on the given from date Example: 10. time_us (float): The QPU time in microseconds Example: 5143166.13413. """ amount: float - from_: datetime.date + from_: datetime.datetime group_usages: list[GroupUsage] job_count: int time_us: float @@ -87,7 +87,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: d = dict(src_dict) amount = d.pop("amount") - from_ = datetime.date.fromisoformat(d.pop("from")) + from_ = datetime.datetime.fromisoformat(d.pop("from")) diff --git a/ionq_core/models/usages.py b/ionq_core/models/usages.py index a5a10a9..a620e74 100644 --- a/ionq_core/models/usages.py +++ b/ionq_core/models/usages.py @@ -18,7 +18,6 @@ from ..models.modality import Modality from ..types import UNSET, Unset from typing import cast -from uuid import UUID import datetime if TYPE_CHECKING: @@ -42,7 +41,7 @@ class Usages: amount_total (float | Unset): The total cost amount for the given timeframe, in units given by usage_unit Example: 151.31. job_count (int | Unset): The total number of jobs run in the timeframe Example: 514. - organization (UUID | Unset): UUID of an organization. Example: 71d164e-6ebe-4126-8839-f1529bb01a00. + organization (str | Unset): UUID of an organization. Example: 71d164e-6ebe-4126-8839-f1529bb01a00. time_us_total (float | Unset): The total QPU time usage for the given timeframe, in microseconds Example: 1566154.312523. usage_data (list[Usage] | Unset): The breakdown of usage by group type in date order most to least recent @@ -55,7 +54,7 @@ class Usages: modality: Modality amount_total: float | Unset = UNSET job_count: int | Unset = UNSET - organization: UUID | Unset = UNSET + organization: str | Unset = UNSET time_us_total: float | Unset = UNSET usage_data: list[Usage] | Unset = UNSET usage_from: datetime.datetime | Unset = UNSET @@ -77,9 +76,7 @@ def to_dict(self) -> dict[str, Any]: job_count = self.job_count - organization: str | Unset = UNSET - if not isinstance(self.organization, Unset): - organization = str(self.organization) + organization = self.organization time_us_total = self.time_us_total @@ -148,15 +145,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: job_count = d.pop("job_count", UNSET) - _organization = d.pop("organization", UNSET) - organization: UUID | Unset - if isinstance(_organization, Unset): - organization = UNSET - else: - organization = UUID(_organization) - - - + organization = d.pop("organization", UNSET) time_us_total = d.pop("time_us_total", UNSET) diff --git a/openapi-overlay.yaml b/openapi-overlay.yaml index d371a15..d3c2249 100644 --- a/openapi-overlay.yaml +++ b/openapi-overlay.yaml @@ -1,13 +1,33 @@ overlay: 1.0.0 info: title: ionq-core-python local OpenAPI fixes - version: 0.2.0 + version: 0.3.0 description: | Patches applied to openapi.json before client generation. The upstream spec marks QisCircuitInput.qubits as optional, but the simulator preflight rejects payloads without it (surfacing as UnexpectedCompilationError), so we make it required locally. + The vendored spec's GetJobEstimateResponse (input_values / + rate_information / estimated_cost / cost_unit) no longer matches what + the API serves - parsing a successful estimate raised + KeyError: 'input_values'. Upstream now documents the shape the API + actually returns (estimate_context / rate_card / estimated_total_cost / + estimated_unit), so we replace the schema locally with that upstream + definition (plus its GetJobEstimateContext and RateCardEntry component + schemas) until the next full spec sync. + + The organization_id schema and path parameter declare format: uuid, but + real organization ids are not UUIDs (e.g. reverse-DNS ids such as + "com.example", and even the spec's own example is not a valid UUID), so + parsing a usage response raised "badly formed hexadecimal UUID string"; + we drop the uuid format locally and treat the id as a plain string. + + Usage.from declares format: date, but the API returns RFC 3339 + date-times (e.g. "2026-08-01T00:00:00Z"), so parsing a usage response + raised "Invalid isoformat string"; we widen the format to date-time + locally (datetime.fromisoformat also accepts plain dates). + Previously this overlay also coerced QisCircuitInput.qubits from number/double to integer/int32; upstream adopted that fix in May 2026 (and extended it to NativeCircuitInput and JsonMultiCircuitInput), so @@ -22,3 +42,140 @@ actions: - circuit - gateset - qubits + - target: $.components.schemas.GetJobEstimateResponse + remove: true + - target: $.components.schemas + update: + GetJobEstimateContext: + properties: + backend: + $ref: "#/components/schemas/JobBackends" + type: + type: string + default: ionq.circuit.v1 + qubits: + type: integer + format: int32 + default: 25 + minimum: 1 + shots: + type: integer + format: int32 + default: 1000 + minimum: 1 + maximum: 1000000 + 1q_gates: + type: integer + format: int32 + default: 0 + minimum: 0 + 2q_gates: + type: integer + format: int32 + default: 0 + minimum: 0 + error_mitigation: + type: boolean + default: false + organization: + type: string + nullable: true + project: + type: string + nullable: true + required: + - backend + - organization + - project + type: object + additionalProperties: false + RateCardEntry: + properties: + sku: + type: string + unit: + type: string + enum: + - compute_second + - gates + unit_cost: + type: number + format: double + description: Present only when unit is "compute_second". + cost_1q_gate: + type: number + format: double + description: Present only when unit is "gates". + cost_2q_gate: + type: number + format: double + description: Present only when unit is "gates". + job_cost_minimum: + type: number + format: double + description: >- + Present only when unit is "gates" and the contract applies a + job minimum. + required: + - sku + - unit + type: object + additionalProperties: false + GetJobEstimateResponse: + properties: + estimate_context: + $ref: "#/components/schemas/GetJobEstimateContext" + estimated_at: + $ref: "#/components/schemas/IsoTimestamp" + estimated_unit: + type: string + rate_card: + properties: + rates: + items: + $ref: "#/components/schemas/RateCardEntry" + type: array + id: + type: string + required: + - rates + - id + type: object + estimated_total_cost: + type: number + format: double + estimated_execution_time: + type: integer + format: int32 + description: Predicted job execution time, in milliseconds. + example: 96250 + estimated_quantum_compute_time_us: + type: integer + format: int32 + description: |- + Predicted quantum compute time, in microseconds. Only present for + compute_second priced backends. + current_predicted_queue_time: + type: integer + format: int32 + description: >- + Predicted time this job will wait in the queue before running, + in milliseconds. + example: 397577 + required: + - estimate_context + - estimated_at + - estimated_unit + - rate_card + - estimated_total_cost + - estimated_execution_time + - current_predicted_queue_time + type: object + additionalProperties: false + - target: $.components.schemas.organization_id.format + remove: true + - target: $.components.parameters.organization_id.schema.format + remove: true + - target: $.components.schemas.Usage.properties.from + update: + format: date-time