From 74606e673b0307dfb6807dba685f862591be9aa5 Mon Sep 17 00:00:00 2001 From: Seth Foster Date: Tue, 3 Dec 2024 16:40:52 -0500 Subject: [PATCH] fix schema generation This is in one commit so it's easy to diff vs the last sorted schema. Minimal changes from the last one. Funny little trick from https://skaaptjop.medium.com/how-i-use-pydantic-unrequired-fields-so-that-the-schema-works-0010d8758072 to make it express optional things in the same way as before. --- .../commands/absorbance_reader/initialize.py | 13 +- .../commands/absorbance_reader/read.py | 12 +- .../commands/calibration/calibrate_gripper.py | 13 +- .../protocol_engine/commands/command.py | 13 +- .../commands/configure_for_volume.py | 11 +- .../protocol_engine/commands/dispense.py | 10 +- .../commands/dispense_in_place.py | 10 +- .../protocol_engine/commands/drop_tip.py | 14 +- .../commands/drop_tip_in_place.py | 12 +- .../commands/generate_command_schema.py | 15 +- .../heater_shaker/wait_for_temperature.py | 12 +- .../protocol_engine/commands/home.py | 15 +- .../protocol_engine/commands/liquid_probe.py | 12 +- .../protocol_engine/commands/load_labware.py | 14 +- .../commands/load_liquid_class.py | 11 +- .../protocol_engine/commands/load_module.py | 10 +- .../protocol_engine/commands/load_pipette.py | 24 +- .../protocol_engine/commands/move_labware.py | 19 +- .../move_to_addressable_area_for_drop_tip.py | 16 +- .../commands/movement_common.py | 13 +- .../commands/robot/close_gripper_jaw.py | 15 +- .../commands/robot/move_axes_relative.py | 11 +- .../commands/robot/move_axes_to.py | 17 +- .../protocol_engine/commands/robot/move_to.py | 11 +- .../protocol_engine/commands/save_position.py | 17 +- .../wait_for_temperature.py | 12 +- .../thermocycler/run_extended_profile.py | 10 +- .../commands/thermocycler/run_profile.py | 10 +- .../set_target_block_temperature.py | 13 +- .../protocol_engine/commands/touch_tip.py | 13 +- .../unsafe/unsafe_drop_tip_in_place.py | 14 +- .../commands/verify_tip_presence.py | 13 +- .../commands/wait_for_duration.py | 11 +- .../commands/wait_for_resume.py | 11 +- shared-data/command/schemas/11.json | 2128 +++++++---------- .../liquid_classes/liquid_class_definition.py | 36 +- 36 files changed, 1193 insertions(+), 1418 deletions(-) diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py index 458225ad1bb..911a9686cf8 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py @@ -1,9 +1,10 @@ """Command models to initialize an Absorbance Reader.""" from __future__ import annotations -from typing import List, Optional, Literal, TYPE_CHECKING +from typing import List, Optional, Literal, TYPE_CHECKING, Any from typing_extensions import Type from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from opentrons.drivers.types import ABSMeasurementMode from opentrons.protocol_engine.types import ABSMeasureMode @@ -20,6 +21,10 @@ InitializeCommandType = Literal["absorbanceReader/initialize"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class InitializeParams(BaseModel): """Input parameters to initialize an absorbance reading.""" @@ -28,8 +33,10 @@ class InitializeParams(BaseModel): ..., description="Initialize single or multi measurement mode." ) sampleWavelengths: List[int] = Field(..., description="Sample wavelengths in nm.") - referenceWavelength: Optional[int] = Field( - None, description="Optional reference wavelength in nm." + referenceWavelength: int | SkipJsonSchema[None] = Field( + None, + description="Optional reference wavelength in nm.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py index 8e8926089f1..f4eda2ddf51 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py @@ -1,10 +1,11 @@ """Command models to read absorbance.""" from __future__ import annotations from datetime import datetime -from typing import Optional, Dict, TYPE_CHECKING, List -from typing_extensions import Literal, Type +from typing import Optional, Dict, TYPE_CHECKING, List, Any +from typing_extensions import Literal, Type from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ...errors import CannotPerformModuleAction, StorageLimitReachedError @@ -22,6 +23,10 @@ from opentrons.protocol_engine.execution import EquipmentHandler +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + ReadAbsorbanceCommandType = Literal["absorbanceReader/read"] @@ -29,9 +34,10 @@ class ReadAbsorbanceParams(BaseModel): """Input parameters for an absorbance reading.""" moduleId: str = Field(..., description="Unique ID of the Absorbance Reader.") - fileName: Optional[str] = Field( + fileName: str | SkipJsonSchema[None] = Field( None, description="Optional file name to use when storing the results of a measurement.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/calibration/calibrate_gripper.py b/api/src/opentrons/protocol_engine/commands/calibration/calibrate_gripper.py index 2b8ccd66e2d..4b08f8f8d1f 100644 --- a/api/src/opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +++ b/api/src/opentrons/protocol_engine/commands/calibration/calibrate_gripper.py @@ -1,10 +1,11 @@ """Models and implementation for the calibrateGripper command.""" from enum import Enum -from typing import Optional, Type +from typing import Optional, Type, Any from typing_extensions import Literal from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from opentrons.types import Point from opentrons.hardware_control import HardwareControlAPI @@ -22,6 +23,10 @@ CalibrateGripperCommandType = Literal["calibration/calibrateGripper"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class CalibrateGripperParamsJaw(Enum): # noqa: D101 FRONT = "front" REAR = "rear" @@ -39,7 +44,7 @@ class CalibrateGripperParams(BaseModel): ), ) - otherJawOffset: Optional[Vec3f] = Field( + otherJawOffset: Vec3f | SkipJsonSchema[None] = Field( None, description=( "If an offset for the other probe is already found, then specifying it here" @@ -48,6 +53,7 @@ class CalibrateGripperParams(BaseModel): " If this param is not specified then the command will only find and return" " the offset for the specified probe." ), + json_schema_extra=_remove_default, ) @@ -62,11 +68,12 @@ class CalibrateGripperResult(BaseModel): ), ) - savedCalibration: Optional[GripperCalibrationOffset] = Field( + savedCalibration: GripperCalibrationOffset | SkipJsonSchema[None] = Field( None, description=( "Gripper calibration result data, when `otherJawOffset` is provided." ), + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/command.py b/api/src/opentrons/protocol_engine/commands/command.py index cf0aaa9b517..a2503344d02 100644 --- a/api/src/opentrons/protocol_engine/commands/command.py +++ b/api/src/opentrons/protocol_engine/commands/command.py @@ -14,9 +14,12 @@ List, Type, Union, + Any, + Dict, ) from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from opentrons.hardware_control import HardwareControlAPI from opentrons.protocol_engine.state.update_types import StateUpdate @@ -61,6 +64,10 @@ class CommandIntent(str, enum.Enum): FIXIT = "fixit" +def _pop_default(s: Dict[str, Any]) -> None: + s.pop("default") + + class BaseCommandCreate( BaseModel, # These type parameters need to be invariant because our fields are mutable. @@ -80,7 +87,7 @@ class BaseCommandCreate( ), ) params: _ParamsT = Field(..., description="Command execution data payload") - intent: Optional[CommandIntent] = Field( + intent: CommandIntent | SkipJsonSchema[None] = Field( None, description=( "The reason the command was added. If not specified or `protocol`," @@ -93,14 +100,16 @@ class BaseCommandCreate( "Use setup commands for activities like pre-run calibration checks" " and module setup, like pre-heating." ), + json_schema_extra=_pop_default, ) - key: Optional[str] = Field( + key: str | SkipJsonSchema[None] = Field( None, description=( "A key value, unique in this run, that can be used to track" " the same logical command across multiple runs of the same protocol." " If a value is not provided, one will be generated." ), + json_schema_extra=_pop_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/configure_for_volume.py b/api/src/opentrons/protocol_engine/commands/configure_for_volume.py index 1404bcecac6..2593ffc5106 100644 --- a/api/src/opentrons/protocol_engine/commands/configure_for_volume.py +++ b/api/src/opentrons/protocol_engine/commands/configure_for_volume.py @@ -1,7 +1,9 @@ """Configure for volume command request, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any + from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from .pipetting_common import PipetteIdMixin @@ -16,6 +18,10 @@ ConfigureForVolumeCommandType = Literal["configureForVolume"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class ConfigureForVolumeParams(PipetteIdMixin): """Parameters required to configure volume for a specific pipette.""" @@ -25,12 +31,13 @@ class ConfigureForVolumeParams(PipetteIdMixin): "than a pipette-specific maximum volume.", ge=0, ) - tipOverlapNotAfterVersion: Optional[str] = Field( + tipOverlapNotAfterVersion: str | SkipJsonSchema[None] = Field( None, description="A version of tip overlap data to not exceed. The highest-versioned " "tip overlap data that does not exceed this version will be used. Versions are " "expressed as vN where N is an integer, counting up from v0. If None, the current " "highest version will be used.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/dispense.py b/api/src/opentrons/protocol_engine/commands/dispense.py index de6bb449d11..eb760ccbb81 100644 --- a/api/src/opentrons/protocol_engine/commands/dispense.py +++ b/api/src/opentrons/protocol_engine/commands/dispense.py @@ -1,11 +1,12 @@ """Dispense command request, result, and implementation models.""" from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Type, Union +from typing import TYPE_CHECKING, Optional, Type, Union, Any from typing_extensions import Literal from pydantic import Field +from pydantic.json_schema import SkipJsonSchema from ..state.update_types import StateUpdate, CLEAR from .pipetting_common import ( @@ -39,14 +40,19 @@ DispenseCommandType = Literal["dispense"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class DispenseParams( PipetteIdMixin, DispenseVolumeMixin, FlowRateMixin, LiquidHandlingWellLocationMixin ): """Payload required to dispense to a specific well.""" - pushOut: Optional[float] = Field( + pushOut: float | SkipJsonSchema[None] = Field( None, description="push the plunger a small amount farther than necessary for accurate low-volume dispensing", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/dispense_in_place.py b/api/src/opentrons/protocol_engine/commands/dispense_in_place.py index 92ea75e9de1..1ac692193f4 100644 --- a/api/src/opentrons/protocol_engine/commands/dispense_in_place.py +++ b/api/src/opentrons/protocol_engine/commands/dispense_in_place.py @@ -1,9 +1,10 @@ """Dispense-in-place command request, result, and implementation models.""" from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Type, Union +from typing import TYPE_CHECKING, Optional, Type, Union, Any from typing_extensions import Literal from pydantic import Field +from pydantic.json_schema import SkipJsonSchema from .pipetting_common import ( PipetteIdMixin, @@ -32,12 +33,17 @@ DispenseInPlaceCommandType = Literal["dispenseInPlace"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class DispenseInPlaceParams(PipetteIdMixin, DispenseVolumeMixin, FlowRateMixin): """Payload required to dispense in place.""" - pushOut: Optional[float] = Field( + pushOut: float | SkipJsonSchema[None] = Field( None, description="push the plunger a small amount farther than necessary for accurate low-volume dispensing", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/drop_tip.py b/api/src/opentrons/protocol_engine/commands/drop_tip.py index d3e81b47144..118e960d79e 100644 --- a/api/src/opentrons/protocol_engine/commands/drop_tip.py +++ b/api/src/opentrons/protocol_engine/commands/drop_tip.py @@ -1,9 +1,11 @@ """Drop tip command request, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any from pydantic import Field -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema + from typing_extensions import Literal from opentrons.protocol_engine.errors.exceptions import TipAttachedError @@ -37,6 +39,10 @@ DropTipCommandType = Literal["dropTip"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class DropTipParams(PipetteIdMixin): """Payload required to drop a tip in a specific well.""" @@ -46,15 +52,16 @@ class DropTipParams(PipetteIdMixin): default_factory=DropTipWellLocation, description="Relative well location at which to drop the tip.", ) - homeAfter: Optional[bool] = Field( + homeAfter: bool | SkipJsonSchema[None] = Field( None, description=( "Whether to home this pipette's plunger after dropping the tip." " You should normally leave this unspecified to let the robot choose" " a safe default depending on its hardware." ), + json_schema_extra=_remove_default, ) - alternateDropLocation: Optional[bool] = Field( + alternateDropLocation: bool | SkipJsonSchema[None] = Field( False, description=( "Whether to alternate location where tip is dropped within the labware." @@ -63,6 +70,7 @@ class DropTipParams(PipetteIdMixin): " labware well." " If False, the tip will be dropped at the top center of the well." ), + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/drop_tip_in_place.py b/api/src/opentrons/protocol_engine/commands/drop_tip_in_place.py index a8fa6b05040..d1d48491671 100644 --- a/api/src/opentrons/protocol_engine/commands/drop_tip_in_place.py +++ b/api/src/opentrons/protocol_engine/commands/drop_tip_in_place.py @@ -1,7 +1,10 @@ """Drop tip in place command request, result, and implementation models.""" from __future__ import annotations + +from typing import TYPE_CHECKING, Optional, Type, Any + from pydantic import Field, BaseModel -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from .command import ( @@ -24,16 +27,21 @@ DropTipInPlaceCommandType = Literal["dropTipInPlace"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class DropTipInPlaceParams(PipetteIdMixin): """Payload required to drop a tip in place.""" - homeAfter: Optional[bool] = Field( + homeAfter: bool | SkipJsonSchema[None] = Field( None, description=( "Whether to home this pipette's plunger after dropping the tip." " You should normally leave this unspecified to let the robot choose" " a safe default depending on its hardware." ), + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/generate_command_schema.py b/api/src/opentrons/protocol_engine/commands/generate_command_schema.py index 990bb5da03a..938244b74e8 100644 --- a/api/src/opentrons/protocol_engine/commands/generate_command_schema.py +++ b/api/src/opentrons/protocol_engine/commands/generate_command_schema.py @@ -1,24 +1,17 @@ """Generate a JSON schema against which all create commands statically validate.""" + import json -import pydantic import argparse import sys -from opentrons.protocol_engine.commands.command_unions import CommandCreate - - -class CreateCommandUnion(pydantic.RootModel[CommandCreate]): - """Model that validates a union of all CommandCreate models.""" - - root: CommandCreate +from opentrons.protocol_engine.commands.command_unions import CommandCreateAdapter def generate_command_schema(version: str) -> str: """Generate a JSON Schema that all valid create commands can validate against.""" - raw_json_schema = CreateCommandUnion.schema_json() - schema_as_dict = json.loads(raw_json_schema) + schema_as_dict = CommandCreateAdapter.json_schema(mode="validation") schema_as_dict["$id"] = f"opentronsCommandSchemaV{version}" schema_as_dict["$schema"] = "http://json-schema.org/draft-07/schema#" - return json.dumps(schema_as_dict, indent=2) + return json.dumps(schema_as_dict, indent=2, sort_keys=True) if __name__ == "__main__": diff --git a/api/src/opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py b/api/src/opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py index 14bc98b0918..5c91059fb88 100644 --- a/api/src/opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +++ b/api/src/opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py @@ -1,9 +1,10 @@ """Command models to wait for a Heater-Shaker Module's target temperature.""" from __future__ import annotations -from typing import Optional, TYPE_CHECKING -from typing_extensions import Literal, Type +from typing import Optional, TYPE_CHECKING, Any +from typing_extensions import Literal, Type from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ...errors.error_occurrence import ErrorOccurrence @@ -16,11 +17,15 @@ WaitForTemperatureCommandType = Literal["heaterShaker/waitForTemperature"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class WaitForTemperatureParams(BaseModel): """Input parameters to wait for a Heater-Shaker's target temperature.""" moduleId: str = Field(..., description="Unique ID of the Heater-Shaker Module.") - celsius: Optional[float] = Field( + celsius: float | SkipJsonSchema[None] = Field( None, description="Target temperature in °C. If not specified, will " "default to the module's target temperature. " @@ -28,6 +33,7 @@ class WaitForTemperatureParams(BaseModel): "could lead to unpredictable behavior and hence is not " "recommended for use. This parameter can be removed in a " "future version without prior notice.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/home.py b/api/src/opentrons/protocol_engine/commands/home.py index 7bbb231641b..99b6c74bca2 100644 --- a/api/src/opentrons/protocol_engine/commands/home.py +++ b/api/src/opentrons/protocol_engine/commands/home.py @@ -1,7 +1,10 @@ """Home command payload, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, List, Type, Any + from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, List, Type +from pydantic.json_schema import SkipJsonSchema + from typing_extensions import Literal from opentrons.types import MountType @@ -17,24 +20,30 @@ HomeCommandType = Literal["home"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class HomeParams(BaseModel): """Payload required for a Home command.""" - axes: Optional[List[MotorAxis]] = Field( + axes: List[MotorAxis] | SkipJsonSchema[None] = Field( None, description=( "Axes to return to their home positions. If omitted," " will home all motors. Extra axes may be implicitly homed" " to ensure accurate homing of the explicitly specified axes." ), + json_schema_extra=_remove_default, ) - skipIfMountPositionOk: Optional[MountType] = Field( + skipIfMountPositionOk: MountType | SkipJsonSchema[None] = Field( None, description=( "If this parameter is provided, the gantry will only be homed if the" " specified mount has an invalid position. If omitted, the homing action" " will be executed unconditionally." ), + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/liquid_probe.py b/api/src/opentrons/protocol_engine/commands/liquid_probe.py index 1bf58e8be26..4eb3d23d54b 100644 --- a/api/src/opentrons/protocol_engine/commands/liquid_probe.py +++ b/api/src/opentrons/protocol_engine/commands/liquid_probe.py @@ -1,10 +1,11 @@ """The liquidProbe and tryLiquidProbe commands.""" from __future__ import annotations -from typing import TYPE_CHECKING, NamedTuple, Optional, Type, Union -from typing_extensions import Literal +from typing import TYPE_CHECKING, NamedTuple, Optional, Type, Union, Any +from typing_extensions import Literal from pydantic import Field +from pydantic.json_schema import SkipJsonSchema from opentrons.protocol_engine.state import update_types from opentrons.protocol_engine.errors.exceptions import ( @@ -47,6 +48,10 @@ from ..state.state import StateView +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + LiquidProbeCommandType = Literal["liquidProbe"] TryLiquidProbeCommandType = Literal["tryLiquidProbe"] @@ -82,12 +87,13 @@ class LiquidProbeResult(DestinationPositionResult): class TryLiquidProbeResult(DestinationPositionResult): """Result data from the execution of a `tryLiquidProbe` command.""" - z_position: Optional[float] = Field( + z_position: float | SkipJsonSchema[None] = Field( ..., description=( "The Z coordinate, in mm, of the found liquid in deck space." " If no liquid was found, `null` or omitted." ), + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/load_labware.py b/api/src/opentrons/protocol_engine/commands/load_labware.py index 651889a49d7..db39c4ab6d6 100644 --- a/api/src/opentrons/protocol_engine/commands/load_labware.py +++ b/api/src/opentrons/protocol_engine/commands/load_labware.py @@ -1,7 +1,9 @@ """Load labware command request, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any + from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from opentrons_shared_data.labware.models import LabwareDefinition @@ -29,6 +31,10 @@ LoadLabwareCommandType = Literal["loadLabware"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class LoadLabwareParams(BaseModel): """Payload required to load a labware into a slot.""" @@ -48,18 +54,20 @@ class LoadLabwareParams(BaseModel): ..., description="The labware definition version.", ) - labwareId: Optional[str] = Field( + labwareId: str | SkipJsonSchema[None] = Field( None, description="An optional ID to assign to this labware. If None, an ID " "will be generated.", + json_schema_extra=_remove_default, ) - displayName: Optional[str] = Field( + displayName: str | SkipJsonSchema[None] = Field( None, description="An optional user-specified display name " "or label for this labware.", # NOTE: v4/5 JSON protocols will always have a displayName which will be the # user-specified label OR the displayName property of the labware's definition. # TODO: Make sure v6 JSON protocols don't do that. + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/load_liquid_class.py b/api/src/opentrons/protocol_engine/commands/load_liquid_class.py index bd267abe567..b975f2929af 100644 --- a/api/src/opentrons/protocol_engine/commands/load_liquid_class.py +++ b/api/src/opentrons/protocol_engine/commands/load_liquid_class.py @@ -1,9 +1,11 @@ """LoadLiquidClass stores the liquid class settings used for a transfer into the Protocol Engine.""" from __future__ import annotations -from typing import Optional, Type, TYPE_CHECKING +from typing import Optional, Type, TYPE_CHECKING, Any + from typing_extensions import Literal from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ..errors import LiquidClassDoesNotExistError @@ -19,13 +21,18 @@ LoadLiquidClassCommandType = Literal["loadLiquidClass"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class LoadLiquidClassParams(BaseModel): """The liquid class transfer properties to store.""" - liquidClassId: Optional[str] = Field( + liquidClassId: str | SkipJsonSchema[None] = Field( None, description="Unique identifier for the liquid class to store. " "If you do not supply a liquidClassId, we will generate one.", + json_schema_extra=_remove_default, ) liquidClassRecord: LiquidClassRecord = Field( ..., diff --git a/api/src/opentrons/protocol_engine/commands/load_module.py b/api/src/opentrons/protocol_engine/commands/load_module.py index c4d56c3639d..2cf6ffcbe8d 100644 --- a/api/src/opentrons/protocol_engine/commands/load_module.py +++ b/api/src/opentrons/protocol_engine/commands/load_module.py @@ -1,8 +1,9 @@ """Implementation, request models, and response models for the load module command.""" from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Type +from typing import TYPE_CHECKING, Optional, Type, Any from typing_extensions import Literal from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ..errors.error_occurrence import ErrorOccurrence @@ -25,6 +26,10 @@ LoadModuleCommandType = Literal["loadModule"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class LoadModuleParams(BaseModel): """Payload required to load a module.""" @@ -57,12 +62,13 @@ class LoadModuleParams(BaseModel): ), ) - moduleId: Optional[str] = Field( + moduleId: str | SkipJsonSchema[None] = Field( None, description=( "An optional ID to assign to this module." " If None, an ID will be generated." ), + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/load_pipette.py b/api/src/opentrons/protocol_engine/commands/load_pipette.py index b4dd5d1b4b5..40790964252 100644 --- a/api/src/opentrons/protocol_engine/commands/load_pipette.py +++ b/api/src/opentrons/protocol_engine/commands/load_pipette.py @@ -1,20 +1,23 @@ """Load pipette command request, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any + +from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema +from typing_extensions import Literal -from opentrons.protocol_engine.state.update_types import StateUpdate from opentrons_shared_data.pipette.pipette_load_name_conversions import ( convert_to_pipette_name_type, ) from opentrons_shared_data.pipette.types import PipetteGenerationType from opentrons_shared_data.robot import user_facing_robot_type from opentrons_shared_data.robot.types import RobotTypeEnum -from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, Type -from typing_extensions import Literal + from opentrons_shared_data.pipette.types import PipetteNameType from opentrons.types import MountType +from opentrons.protocol_engine.state.update_types import StateUpdate from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ..errors.error_occurrence import ErrorOccurrence from ..errors import InvalidSpecificationForRobotTypeError, InvalidLoadPipetteSpecsError @@ -27,6 +30,10 @@ LoadPipetteCommandType = Literal["loadPipette"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class LoadPipetteParams(BaseModel): """Payload needed to load a pipette on to a mount.""" @@ -38,21 +45,24 @@ class LoadPipetteParams(BaseModel): ..., description="The mount the pipette should be present on.", ) - pipetteId: Optional[str] = Field( + pipetteId: str | SkipJsonSchema[None] = Field( None, description="An optional ID to assign to this pipette. If None, an ID " "will be generated.", + json_schema_extra=_remove_default, ) - tipOverlapNotAfterVersion: Optional[str] = Field( + tipOverlapNotAfterVersion: str | SkipJsonSchema[None] = Field( None, description="A version of tip overlap data to not exceed. The highest-versioned " "tip overlap data that does not exceed this version will be used. Versions are " "expressed as vN where N is an integer, counting up from v0. If None, the current " "highest version will be used.", + json_schema_extra=_remove_default, ) - liquidPresenceDetection: Optional[bool] = Field( + liquidPresenceDetection: bool | SkipJsonSchema[None] = Field( None, description="Enable liquid presence detection for this pipette. Defaults to False.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/move_labware.py b/api/src/opentrons/protocol_engine/commands/move_labware.py index fc31117b1de..b08bc66cc91 100644 --- a/api/src/opentrons/protocol_engine/commands/move_labware.py +++ b/api/src/opentrons/protocol_engine/commands/move_labware.py @@ -1,14 +1,17 @@ """Models and implementation for the ``moveLabware`` command.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any + +from pydantic.json_schema import SkipJsonSchema +from pydantic import BaseModel, Field +from typing_extensions import Literal + from opentrons_shared_data.errors.exceptions import ( FailedGripperPickupError, LabwareDroppedError, StallOrCollisionDetectedError, ) -from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, Type -from typing_extensions import Literal from opentrons.protocol_engine.resources.model_utils import ModelUtils from opentrons.types import Point @@ -49,6 +52,10 @@ MoveLabwareCommandType = Literal["moveLabware"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + # Extra buffer on top of minimum distance to move to the right _TRASH_CHUTE_DROP_BUFFER_MM = 8 @@ -63,15 +70,17 @@ class MoveLabwareParams(BaseModel): description="Whether to use the gripper to perform the labware movement" " or to perform a manual movement with an option to pause.", ) - pickUpOffset: Optional[LabwareOffsetVector] = Field( + pickUpOffset: LabwareOffsetVector | SkipJsonSchema[None] = Field( None, description="Offset to use when picking up labware. " "Experimental param, subject to change", + json_schema_extra=_remove_default, ) - dropOffset: Optional[LabwareOffsetVector] = Field( + dropOffset: LabwareOffsetVector | SkipJsonSchema[None] = Field( None, description="Offset to use when dropping off labware. " "Experimental param, subject to change", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py b/api/src/opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py index 4a0e3e256ba..3e58768f720 100644 --- a/api/src/opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +++ b/api/src/opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py @@ -1,9 +1,11 @@ """Move to addressable area for drop tip command request, result, and implementation models.""" from __future__ import annotations -from pydantic import Field -from typing import TYPE_CHECKING, Optional, Type +from typing import TYPE_CHECKING, Optional, Type, Any from typing_extensions import Literal +from pydantic import Field +from pydantic.json_schema import SkipJsonSchema + from ..errors import LocationNotAccessibleByPipetteError from ..types import AddressableOffsetVector from ..resources import fixture_validation @@ -32,6 +34,10 @@ MoveToAddressableAreaForDropTipCommandType = Literal["moveToAddressableAreaForDropTip"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class MoveToAddressableAreaForDropTipParams(PipetteIdMixin, MovementMixin): """Payload required to move a pipette to a specific addressable area. @@ -65,7 +71,7 @@ class MoveToAddressableAreaForDropTipParams(PipetteIdMixin, MovementMixin): AddressableOffsetVector(x=0, y=0, z=0), description="Relative offset of addressable area to move pipette's critical point.", ) - alternateDropLocation: Optional[bool] = Field( + alternateDropLocation: bool | SkipJsonSchema[None] = Field( False, description=( "Whether to alternate location where tip is dropped within the addressable area." @@ -74,8 +80,9 @@ class MoveToAddressableAreaForDropTipParams(PipetteIdMixin, MovementMixin): " labware well." " If False, the tip will be dropped at the top center of the area." ), + json_schema_extra=_remove_default, ) - ignoreTipConfiguration: Optional[bool] = Field( + ignoreTipConfiguration: bool | SkipJsonSchema[None] = Field( True, description=( "Whether to utilize the critical point of the tip configuraiton when moving to an addressable area." @@ -83,6 +90,7 @@ class MoveToAddressableAreaForDropTipParams(PipetteIdMixin, MovementMixin): " as the critical point for movement." " If False, this command will use the critical point provided by the current tip configuration." ), + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/movement_common.py b/api/src/opentrons/protocol_engine/commands/movement_common.py index 7917daa8613..0a90c5e742c 100644 --- a/api/src/opentrons/protocol_engine/commands/movement_common.py +++ b/api/src/opentrons/protocol_engine/commands/movement_common.py @@ -2,9 +2,10 @@ from __future__ import annotations -from typing import Optional, Union, TYPE_CHECKING, Literal +from typing import Optional, Union, TYPE_CHECKING, Literal, Any from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from opentrons_shared_data.errors import ErrorCodes from opentrons_shared_data.errors.exceptions import StallOrCollisionDetectedError @@ -26,6 +27,10 @@ from ..resources.model_utils import ModelUtils +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class WellLocationMixin(BaseModel): """Mixin for command requests that take a location that's somewhere in a well.""" @@ -63,13 +68,14 @@ class LiquidHandlingWellLocationMixin(BaseModel): class MovementMixin(BaseModel): """Mixin for command requests that move a pipette.""" - minimumZHeight: Optional[float] = Field( + minimumZHeight: float | SkipJsonSchema[None] = Field( None, description=( "Optional minimal Z margin in mm." " If this is larger than the API's default safe Z margin," " it will make the arc higher. If it's smaller, it will have no effect." ), + json_schema_extra=_remove_default, ) forceDirect: bool = Field( @@ -83,12 +89,13 @@ class MovementMixin(BaseModel): ), ) - speed: Optional[float] = Field( + speed: float | SkipJsonSchema[None] = Field( None, description=( "Override the travel speed in mm/s." " This controls the straight linear speed of motion." ), + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/robot/close_gripper_jaw.py b/api/src/opentrons/protocol_engine/commands/robot/close_gripper_jaw.py index 965c6d2ec72..7990d382688 100644 --- a/api/src/opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +++ b/api/src/opentrons/protocol_engine/commands/robot/close_gripper_jaw.py @@ -1,10 +1,12 @@ """Command models for opening a gripper jaw.""" from __future__ import annotations -from typing import Literal, Type, Optional -from opentrons.hardware_control import HardwareControlAPI -from opentrons.protocol_engine.resources import ensure_ot3_hardware +from typing import Literal, Type, Optional, Any from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema + +from opentrons.hardware_control import HardwareControlAPI +from opentrons.protocol_engine.resources import ensure_ot3_hardware from ..command import ( AbstractCommandImpl, @@ -18,12 +20,17 @@ closeGripperJawCommandType = Literal["robot/closeGripperJaw"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class closeGripperJawParams(BaseModel): """Payload required to close a gripper.""" - force: Optional[float] = Field( + force: float | SkipJsonSchema[None] = Field( default=None, description="The force the gripper should use to hold the jaws, falls to default if none is provided.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/robot/move_axes_relative.py b/api/src/opentrons/protocol_engine/commands/robot/move_axes_relative.py index 238229ebce6..5daf4e7981d 100644 --- a/api/src/opentrons/protocol_engine/commands/robot/move_axes_relative.py +++ b/api/src/opentrons/protocol_engine/commands/robot/move_axes_relative.py @@ -1,8 +1,10 @@ """Command models for moving any robot axis relative.""" + from __future__ import annotations -from typing import Literal, Type, Optional, TYPE_CHECKING +from typing import Literal, Type, Optional, TYPE_CHECKING, Any from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from opentrons.hardware_control import HardwareControlAPI from opentrons.protocol_engine.resources import ensure_ot3_hardware @@ -23,15 +25,20 @@ MoveAxesRelativeCommandType = Literal["robot/moveAxesRelative"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class MoveAxesRelativeParams(BaseModel): """Payload required to move axes relative to position.""" axis_map: MotorAxisMapType = Field( ..., description="A dictionary mapping axes to relative movements in mm." ) - speed: Optional[float] = Field( + speed: float | SkipJsonSchema[None] = Field( default=None, description="The max velocity to move the axes at. Will fall to hardware defaults if none provided.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/robot/move_axes_to.py b/api/src/opentrons/protocol_engine/commands/robot/move_axes_to.py index 0d17d5f171f..adab2a64e76 100644 --- a/api/src/opentrons/protocol_engine/commands/robot/move_axes_to.py +++ b/api/src/opentrons/protocol_engine/commands/robot/move_axes_to.py @@ -1,7 +1,9 @@ """Command models for moving any robot axis to an absolute position.""" from __future__ import annotations -from typing import Literal, Optional, Type, TYPE_CHECKING +from typing import Literal, Optional, Type, TYPE_CHECKING, Any + from pydantic import Field, BaseModel +from pydantic.json_schema import SkipJsonSchema from opentrons.hardware_control import HardwareControlAPI from opentrons.protocol_engine.resources import ensure_ot3_hardware @@ -22,18 +24,25 @@ MoveAxesToCommandType = Literal["robot/moveAxesTo"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class MoveAxesToParams(BaseModel): """Payload required to move axes to absolute position.""" axis_map: MotorAxisMapType = Field( ..., description="The specified axes to move to an absolute deck position with." ) - critical_point: Optional[MotorAxisMapType] = Field( - default=None, description="The critical point to move the mount with." + critical_point: MotorAxisMapType | SkipJsonSchema[None] = Field( + default=None, + description="The critical point to move the mount with.", + json_schema_extra=_remove_default, ) - speed: Optional[float] = Field( + speed: float | SkipJsonSchema[None] = Field( default=None, description="The max velocity to move the axes at. Will fall to hardware defaults if none provided.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/robot/move_to.py b/api/src/opentrons/protocol_engine/commands/robot/move_to.py index 199d5be5079..5f8441ddc4a 100644 --- a/api/src/opentrons/protocol_engine/commands/robot/move_to.py +++ b/api/src/opentrons/protocol_engine/commands/robot/move_to.py @@ -1,8 +1,10 @@ """Command models for moving any robot mount to a destination point.""" from __future__ import annotations -from typing import Literal, Type, Optional, TYPE_CHECKING +from typing import Literal, Type, Optional, TYPE_CHECKING, Any from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema + from opentrons.types import MountType from ..movement_common import DestinationPositionResult @@ -23,6 +25,10 @@ MoveToCommandType = Literal["robot/moveTo"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class MoveToParams(BaseModel): """Payload required to move to a destination position.""" @@ -34,9 +40,10 @@ class MoveToParams(BaseModel): ..., description="X, Y and Z coordinates in mm from deck's origin location (left-front-bottom corner of work space)", ) - speed: Optional[float] = Field( + speed: float | SkipJsonSchema[None] = Field( default=None, description="The max velocity to move the axes at. Will fall to hardware defaults if none provided.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/save_position.py b/api/src/opentrons/protocol_engine/commands/save_position.py index 6eb0d09cdeb..4298bd0a140 100644 --- a/api/src/opentrons/protocol_engine/commands/save_position.py +++ b/api/src/opentrons/protocol_engine/commands/save_position.py @@ -1,8 +1,10 @@ """Save pipette position command request, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any + from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from ..types import DeckPoint @@ -16,19 +18,26 @@ SavePositionCommandType = Literal["savePosition"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class SavePositionParams(BaseModel): """Payload needed to save a pipette's current position.""" pipetteId: str = Field( ..., description="Unique identifier of the pipette in question." ) - positionId: Optional[str] = Field( + positionId: str | SkipJsonSchema[None] = Field( None, description="An optional ID to assign to this command instance. " "Auto-assigned if not defined.", + json_schema_extra=_remove_default, ) - failOnNotHomed: Optional[bool] = Field( - True, description="Require all axes to be homed before saving position." + failOnNotHomed: bool | SkipJsonSchema[None] = Field( + True, + description="Require all axes to be homed before saving position.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py b/api/src/opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py index e3f9a31b435..3717f332de4 100644 --- a/api/src/opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +++ b/api/src/opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py @@ -1,9 +1,10 @@ """Command models to wait for target temperature of a Temperature Module.""" from __future__ import annotations -from typing import Optional, TYPE_CHECKING -from typing_extensions import Literal, Type +from typing import Optional, TYPE_CHECKING, Any +from typing_extensions import Literal, Type from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ...errors.error_occurrence import ErrorOccurrence @@ -15,11 +16,15 @@ WaitForTemperatureCommandType = Literal["temperatureModule/waitForTemperature"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class WaitForTemperatureParams(BaseModel): """Input parameters to wait for a Temperature Module's target temperature.""" moduleId: str = Field(..., description="Unique ID of the Temperature Module.") - celsius: Optional[float] = Field( + celsius: float | SkipJsonSchema[None] = Field( None, description="Target temperature in °C. If not specified, will " "default to the module's target temperature. " @@ -27,6 +32,7 @@ class WaitForTemperatureParams(BaseModel): "could lead to unpredictable behavior and hence is not " "recommended for use. This parameter can be removed in a " "future version without prior notice.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py b/api/src/opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py index 6f63aed8fe3..2775514adff 100644 --- a/api/src/opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +++ b/api/src/opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py @@ -1,9 +1,10 @@ """Command models to execute a Thermocycler profile.""" from __future__ import annotations -from typing import List, Optional, TYPE_CHECKING, overload, Union +from typing import List, Optional, TYPE_CHECKING, overload, Union, Any from typing_extensions import Literal, Type from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from opentrons.hardware_control.modules.types import ThermocyclerStep, ThermocyclerCycle @@ -21,6 +22,10 @@ RunExtendedProfileCommandType = Literal["thermocycler/runExtendedProfile"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class ProfileStep(BaseModel): """An individual step in a Thermocycler extended profile.""" @@ -45,10 +50,11 @@ class RunExtendedProfileParams(BaseModel): ..., description="Elements of the profile. Each can be either a step or a cycle.", ) - blockMaxVolumeUl: Optional[float] = Field( + blockMaxVolumeUl: float | SkipJsonSchema[None] = Field( None, description="Amount of liquid in uL of the most-full well" " in labware loaded onto the thermocycler.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/thermocycler/run_profile.py b/api/src/opentrons/protocol_engine/commands/thermocycler/run_profile.py index 74ea7fa9f23..e909e3d3af3 100644 --- a/api/src/opentrons/protocol_engine/commands/thermocycler/run_profile.py +++ b/api/src/opentrons/protocol_engine/commands/thermocycler/run_profile.py @@ -1,9 +1,10 @@ """Command models to execute a Thermocycler profile.""" from __future__ import annotations -from typing import List, Optional, TYPE_CHECKING +from typing import List, Optional, TYPE_CHECKING, Any from typing_extensions import Literal, Type from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from opentrons.hardware_control.modules.types import ThermocyclerStep @@ -18,6 +19,10 @@ RunProfileCommandType = Literal["thermocycler/runProfile"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class RunProfileStepParams(BaseModel): """Input parameters for an individual Thermocycler profile step.""" @@ -35,10 +40,11 @@ class RunProfileParams(BaseModel): ..., description="Array of profile steps with target temperature and temperature hold time.", ) - blockMaxVolumeUl: Optional[float] = Field( + blockMaxVolumeUl: float | SkipJsonSchema[None] = Field( None, description="Amount of liquid in uL of the most-full well" " in labware loaded onto the thermocycler.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py b/api/src/opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py index 39a8ece6d16..03583b01145 100644 --- a/api/src/opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +++ b/api/src/opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py @@ -1,9 +1,10 @@ """Command models to start heating a Thermocycler's block.""" from __future__ import annotations -from typing import Optional, TYPE_CHECKING +from typing import Optional, TYPE_CHECKING, Any from typing_extensions import Literal, Type from pydantic import BaseModel, Field +from pydantic.json_schema import SkipJsonSchema from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ...errors.error_occurrence import ErrorOccurrence @@ -16,21 +17,27 @@ SetTargetBlockTemperatureCommandType = Literal["thermocycler/setTargetBlockTemperature"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class SetTargetBlockTemperatureParams(BaseModel): """Input parameters to set a Thermocycler's target block temperature.""" moduleId: str = Field(..., description="Unique ID of the Thermocycler Module.") celsius: float = Field(..., description="Target temperature in °C.") - blockMaxVolumeUl: Optional[float] = Field( + blockMaxVolumeUl: float | SkipJsonSchema[None] = Field( None, description="Amount of liquid in uL of the most-full well" " in labware loaded onto the thermocycler.", + json_schema_extra=_remove_default, ) - holdTimeSeconds: Optional[float] = Field( + holdTimeSeconds: float | SkipJsonSchema[None] = Field( None, description="Amount of time, in seconds, to hold the temperature for." " If specified, a waitForBlockTemperature command will block until" " the given hold time has elapsed.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/touch_tip.py b/api/src/opentrons/protocol_engine/commands/touch_tip.py index d9df0215301..c07880a666c 100644 --- a/api/src/opentrons/protocol_engine/commands/touch_tip.py +++ b/api/src/opentrons/protocol_engine/commands/touch_tip.py @@ -1,9 +1,11 @@ """Touch tip command request, result, and implementation models.""" from __future__ import annotations -from pydantic import Field -from typing import TYPE_CHECKING, Optional, Type +from typing import TYPE_CHECKING, Optional, Type, Any + from typing_extensions import Literal +from pydantic import Field +from pydantic.json_schema import SkipJsonSchema from opentrons.types import Point @@ -35,6 +37,10 @@ TouchTipCommandType = Literal["touchTip"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class TouchTipParams(PipetteIdMixin, WellLocationMixin): """Payload needed to touch a pipette tip the sides of a specific well.""" @@ -45,12 +51,13 @@ class TouchTipParams(PipetteIdMixin, WellLocationMixin): ), ) - speed: Optional[float] = Field( + speed: float | SkipJsonSchema[None] = Field( None, description=( "Override the travel speed in mm/s." " This controls the straight linear speed of motion." ), + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py b/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py index 5aa4e292f63..363637f0353 100644 --- a/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +++ b/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py @@ -1,13 +1,16 @@ """Command models to drop tip in place while plunger positions are unknown.""" + from __future__ import annotations -from opentrons.protocol_engine.state.update_types import StateUpdate +from typing import TYPE_CHECKING, Optional, Type, Any + from pydantic import Field, BaseModel -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from opentrons.hardware_control import HardwareControlAPI from opentrons.hardware_control.types import Axis +from opentrons.protocol_engine.state.update_types import StateUpdate from ..pipetting_common import PipetteIdMixin from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ...errors.error_occurrence import ErrorOccurrence @@ -21,16 +24,21 @@ UnsafeDropTipInPlaceCommandType = Literal["unsafe/dropTipInPlace"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class UnsafeDropTipInPlaceParams(PipetteIdMixin): """Payload required to drop a tip in place even if the plunger position is not known.""" - homeAfter: Optional[bool] = Field( + homeAfter: bool | SkipJsonSchema[None] = Field( None, description=( "Whether to home this pipette's plunger after dropping the tip." " You should normally leave this unspecified to let the robot choose" " a safe default depending on its hardware." ), + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/verify_tip_presence.py b/api/src/opentrons/protocol_engine/commands/verify_tip_presence.py index 4c85d4f9728..ea8774bd68b 100644 --- a/api/src/opentrons/protocol_engine/commands/verify_tip_presence.py +++ b/api/src/opentrons/protocol_engine/commands/verify_tip_presence.py @@ -1,8 +1,9 @@ """Verify tip presence command request, result and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any from pydantic import Field, BaseModel -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from .pipetting_common import PipetteIdMixin @@ -18,14 +19,20 @@ VerifyTipPresenceCommandType = Literal["verifyTipPresence"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class VerifyTipPresenceParams(PipetteIdMixin): """Payload required for a VerifyTipPresence command.""" expectedState: TipPresenceStatus = Field( ..., description="The expected tip presence status on the pipette." ) - followSingularSensor: Optional[InstrumentSensorId] = Field( - default=None, description="The sensor id to follow if the other can be ignored." + followSingularSensor: InstrumentSensorId | SkipJsonSchema[None] = Field( + default=None, + description="The sensor id to follow if the other can be ignored.", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/wait_for_duration.py b/api/src/opentrons/protocol_engine/commands/wait_for_duration.py index 7a15834a066..59b268cd4c2 100644 --- a/api/src/opentrons/protocol_engine/commands/wait_for_duration.py +++ b/api/src/opentrons/protocol_engine/commands/wait_for_duration.py @@ -1,7 +1,9 @@ """Wait for duration command request, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any + from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData @@ -14,13 +16,18 @@ WaitForDurationCommandType = Literal["waitForDuration"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class WaitForDurationParams(BaseModel): """Payload required to pause the protocol.""" seconds: float = Field(..., description="Duration, in seconds, to wait for.") - message: Optional[str] = Field( + message: str | SkipJsonSchema[None] = Field( None, description="A user-facing message associated with the pause", + json_schema_extra=_remove_default, ) diff --git a/api/src/opentrons/protocol_engine/commands/wait_for_resume.py b/api/src/opentrons/protocol_engine/commands/wait_for_resume.py index f0b6e05419c..27e4a02d28e 100644 --- a/api/src/opentrons/protocol_engine/commands/wait_for_resume.py +++ b/api/src/opentrons/protocol_engine/commands/wait_for_resume.py @@ -1,7 +1,9 @@ """Wait for resume command request, result, and implementation models.""" from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Any + from pydantic import BaseModel, Field -from typing import TYPE_CHECKING, Optional, Type +from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData @@ -16,12 +18,17 @@ WaitForResumeCommandType = Literal["waitForResume", "pause"] +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class WaitForResumeParams(BaseModel): """Payload required to pause the protocol.""" - message: Optional[str] = Field( + message: str | SkipJsonSchema[None] = Field( None, description="A user-facing message associated with the pause", + json_schema_extra=_remove_default, ) diff --git a/shared-data/command/schemas/11.json b/shared-data/command/schemas/11.json index 46a810a8db0..f8bb8ac5688 100644 --- a/shared-data/command/schemas/11.json +++ b/shared-data/command/schemas/11.json @@ -1,7 +1,5 @@ { - "$id": "opentronsCommandSchemaV11", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { + "$defs": { "AddressableAreaLocation": { "description": "The location of something place in an addressable area. This is a superset of deck slots.", "properties": { @@ -39,18 +37,16 @@ "description": "AirGapInPlace command request model.", "properties": { "commandType": { + "const": "airGapInPlace", "default": "airGapInPlace", "enum": ["airGapInPlace"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -58,7 +54,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/AirGapInPlaceParams" + "$ref": "#/$defs/AirGapInPlaceParams" } }, "required": ["params"], @@ -70,7 +66,7 @@ "properties": { "flowRate": { "description": "Speed in \u00b5L/s configured for the pipette", - "exclusiveMinimum": 0, + "exclusiveMinimum": 0.0, "title": "Flowrate", "type": "number" }, @@ -81,7 +77,7 @@ }, "volume": { "description": "The amount of liquid to aspirate, in \u00b5L. Must not be greater than the remaining available amount, which depends on the pipette (see `loadPipette`), its configuration (see `configureForVolume`), the tip (see `pickUpTip`), and the amount you've aspirated so far. There is some tolerance for floating point rounding errors.", - "minimum": 0, + "minimum": 0.0, "title": "Volume", "type": "number" } @@ -94,6 +90,7 @@ "description": "All basemodel to represent a reset to the nozzle configuration. Sending no parameters resets to default.", "properties": { "style": { + "const": "ALL", "default": "ALL", "enum": ["ALL"], "title": "Style", @@ -107,18 +104,16 @@ "description": "Create aspirate command request model.", "properties": { "commandType": { + "const": "aspirate", "default": "aspirate", "enum": ["aspirate"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -126,7 +121,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/AspirateParams" + "$ref": "#/$defs/AspirateParams" } }, "required": ["params"], @@ -137,18 +132,16 @@ "description": "AspirateInPlace command request model.", "properties": { "commandType": { + "const": "aspirateInPlace", "default": "aspirateInPlace", "enum": ["aspirateInPlace"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -156,7 +149,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/AspirateInPlaceParams" + "$ref": "#/$defs/AspirateInPlaceParams" } }, "required": ["params"], @@ -168,7 +161,7 @@ "properties": { "flowRate": { "description": "Speed in \u00b5L/s configured for the pipette", - "exclusiveMinimum": 0, + "exclusiveMinimum": 0.0, "title": "Flowrate", "type": "number" }, @@ -179,7 +172,7 @@ }, "volume": { "description": "The amount of liquid to aspirate, in \u00b5L. Must not be greater than the remaining available amount, which depends on the pipette (see `loadPipette`), its configuration (see `configureForVolume`), the tip (see `pickUpTip`), and the amount you've aspirated so far. There is some tolerance for floating point rounding errors.", - "minimum": 0, + "minimum": 0.0, "title": "Volume", "type": "number" } @@ -193,7 +186,7 @@ "properties": { "flowRate": { "description": "Speed in \u00b5L/s configured for the pipette", - "exclusiveMinimum": 0, + "exclusiveMinimum": 0.0, "title": "Flowrate", "type": "number" }, @@ -209,18 +202,13 @@ }, "volume": { "description": "The amount of liquid to aspirate, in \u00b5L. Must not be greater than the remaining available amount, which depends on the pipette (see `loadPipette`), its configuration (see `configureForVolume`), the tip (see `pickUpTip`), and the amount you've aspirated so far. There is some tolerance for floating point rounding errors.", - "minimum": 0, + "minimum": 0.0, "title": "Volume", "type": "number" }, "wellLocation": { - "allOf": [ - { - "$ref": "#/definitions/LiquidHandlingWellLocation" - } - ], - "description": "Relative well location at which to perform the operation", - "title": "Welllocation" + "$ref": "#/$defs/LiquidHandlingWellLocation", + "description": "Relative well location at which to perform the operation" }, "wellName": { "description": "Name of well to use in labware.", @@ -238,7 +226,9 @@ "correctionByVolume": { "description": "Settings for volume correction keyed by by target aspiration volume, representing additional volume the plunger should move to accurately hit target volume.", "items": { - "items": [ + "maxItems": 2, + "minItems": 2, + "prefixItems": [ { "anyOf": [ { @@ -262,26 +252,21 @@ ] } ], - "maxItems": 2, - "minItems": 2, "type": "array" }, "title": "Correctionbyvolume", "type": "array" }, "delay": { - "allOf": [ - { - "$ref": "#/definitions/DelayProperties" - } - ], - "description": "Delay settings after an aspirate", - "title": "Delay" + "$ref": "#/$defs/DelayProperties", + "description": "Delay settings after an aspirate" }, "flowRateByVolume": { "description": "Settings for flow rate keyed by target aspiration volume.", "items": { - "items": [ + "maxItems": 2, + "minItems": 2, + "prefixItems": [ { "anyOf": [ { @@ -307,37 +292,21 @@ ] } ], - "maxItems": 2, - "minItems": 2, "type": "array" }, "title": "Flowratebyvolume", "type": "array" }, "mix": { - "allOf": [ - { - "$ref": "#/definitions/MixProperties" - } - ], - "description": "Mixing settings for before an aspirate", - "title": "Mix" + "$ref": "#/$defs/MixProperties", + "description": "Mixing settings for before an aspirate" }, "offset": { - "allOf": [ - { - "$ref": "#/definitions/Coordinate" - } - ], - "description": "Relative offset for aspiration.", - "title": "Offset" + "$ref": "#/$defs/Coordinate", + "description": "Relative offset for aspiration." }, "positionReference": { - "allOf": [ - { - "$ref": "#/definitions/PositionReference" - } - ], + "$ref": "#/$defs/PositionReference", "description": "Position reference for aspiration." }, "preWet": { @@ -346,22 +315,12 @@ "type": "boolean" }, "retract": { - "allOf": [ - { - "$ref": "#/definitions/RetractAspirate" - } - ], - "description": "Pipette retract settings after an aspirate.", - "title": "Retract" + "$ref": "#/$defs/RetractAspirate", + "description": "Pipette retract settings after an aspirate." }, "submerge": { - "allOf": [ - { - "$ref": "#/definitions/Submerge" - } - ], - "description": "Submerge settings for aspirate.", - "title": "Submerge" + "$ref": "#/$defs/Submerge", + "description": "Submerge settings for aspirate." } }, "required": [ @@ -382,18 +341,16 @@ "description": "Create blow-out command request model.", "properties": { "commandType": { + "const": "blowout", "default": "blowout", "enum": ["blowout"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -401,7 +358,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/BlowOutParams" + "$ref": "#/$defs/BlowOutParams" } }, "required": ["params"], @@ -412,18 +369,16 @@ "description": "BlowOutInPlace command request model.", "properties": { "commandType": { + "const": "blowOutInPlace", "default": "blowOutInPlace", "enum": ["blowOutInPlace"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -431,7 +386,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/BlowOutInPlaceParams" + "$ref": "#/$defs/BlowOutInPlaceParams" } }, "required": ["params"], @@ -443,7 +398,7 @@ "properties": { "flowRate": { "description": "Speed in \u00b5L/s configured for the pipette", - "exclusiveMinimum": 0, + "exclusiveMinimum": 0.0, "title": "Flowrate", "type": "number" }, @@ -462,7 +417,7 @@ "properties": { "flowRate": { "description": "Speed in \u00b5L/s configured for the pipette", - "exclusiveMinimum": 0, + "exclusiveMinimum": 0.0, "title": "Flowrate", "type": "number" }, @@ -477,13 +432,8 @@ "type": "string" }, "wellLocation": { - "allOf": [ - { - "$ref": "#/definitions/WellLocation" - } - ], - "description": "Relative well location at which to perform the operation", - "title": "Welllocation" + "$ref": "#/$defs/WellLocation", + "description": "Relative well location at which to perform the operation" }, "wellName": { "description": "Name of well to use in labware.", @@ -498,7 +448,8 @@ "BlowoutLocation": { "description": "Location for blowout during a transfer function.", "enum": ["source", "destination", "trash"], - "title": "BlowoutLocation" + "title": "BlowoutLocation", + "type": "string" }, "BlowoutParams": { "description": "Parameters for blowout.", @@ -518,11 +469,7 @@ "title": "Flowrate" }, "location": { - "allOf": [ - { - "$ref": "#/definitions/BlowoutLocation" - } - ], + "$ref": "#/$defs/BlowoutLocation", "description": "Location well or trash entity for blow out." } }, @@ -539,11 +486,7 @@ "type": "boolean" }, "params": { - "allOf": [ - { - "$ref": "#/definitions/BlowoutParams" - } - ], + "$ref": "#/$defs/BlowoutParams", "description": "Parameters for the blowout function.", "title": "Params" } @@ -556,18 +499,16 @@ "description": "A request to create a `calibrateGripper` command.", "properties": { "commandType": { + "const": "calibration/calibrateGripper", "default": "calibration/calibrateGripper", "enum": ["calibration/calibrateGripper"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -575,7 +516,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/CalibrateGripperParams" + "$ref": "#/$defs/CalibrateGripperParams" } }, "required": ["params"], @@ -586,19 +527,11 @@ "description": "Parameters for a `calibrateGripper` command.", "properties": { "jaw": { - "allOf": [ - { - "$ref": "#/definitions/CalibrateGripperParamsJaw" - } - ], + "$ref": "#/$defs/CalibrateGripperParamsJaw", "description": "Which of the gripper's jaws to use to measure its offset. The robot will assume that a human operator has already attached the capacitive probe to the jaw and none is attached to the other jaw." }, "otherJawOffset": { - "allOf": [ - { - "$ref": "#/definitions/Vec3f" - } - ], + "$ref": "#/$defs/Vec3f_float_", "description": "If an offset for the other probe is already found, then specifying it here will enable the CalibrateGripper command to complete the calibration process by calculating the total offset and saving it to disk. If this param is not specified then the command will only find and return the offset for the specified probe.", "title": "Otherjawoffset" } @@ -608,26 +541,24 @@ "type": "object" }, "CalibrateGripperParamsJaw": { - "description": "An enumeration.", "enum": ["front", "rear"], - "title": "CalibrateGripperParamsJaw" + "title": "CalibrateGripperParamsJaw", + "type": "string" }, "CalibrateModuleCreate": { "description": "Create calibrate-module command request model.", "properties": { "commandType": { + "const": "calibration/calibrateModule", "default": "calibration/calibrateModule", "enum": ["calibration/calibrateModule"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -635,7 +566,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/CalibrateModuleParams" + "$ref": "#/$defs/CalibrateModuleParams" } }, "required": ["params"], @@ -656,11 +587,7 @@ "type": "string" }, "mount": { - "allOf": [ - { - "$ref": "#/definitions/MountType" - } - ], + "$ref": "#/$defs/MountType", "description": "The instrument mount used to calibrate the module." } }, @@ -672,18 +599,16 @@ "description": "Create calibrate-pipette command request model.", "properties": { "commandType": { + "const": "calibration/calibratePipette", "default": "calibration/calibratePipette", "enum": ["calibration/calibratePipette"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -691,7 +616,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/CalibratePipetteParams" + "$ref": "#/$defs/CalibratePipetteParams" } }, "required": ["params"], @@ -702,11 +627,7 @@ "description": "Payload required to calibrate-pipette.", "properties": { "mount": { - "allOf": [ - { - "$ref": "#/definitions/MountType" - } - ], + "$ref": "#/$defs/MountType", "description": "Instrument mount to calibrate." } }, @@ -718,18 +639,16 @@ "description": "A request to create a Heater-Shaker's close latch command.", "properties": { "commandType": { + "const": "heaterShaker/closeLabwareLatch", "default": "heaterShaker/closeLabwareLatch", "enum": ["heaterShaker/closeLabwareLatch"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -737,7 +656,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/CloseLabwareLatchParams" + "$ref": "#/$defs/CloseLabwareLatchParams" } }, "required": ["params"], @@ -767,6 +686,7 @@ "type": "string" }, "style": { + "const": "COLUMN", "default": "COLUMN", "enum": ["COLUMN"], "title": "Style", @@ -787,18 +707,16 @@ "description": "Comment command request model.", "properties": { "commandType": { + "const": "comment", "default": "comment", "enum": ["comment"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -806,7 +724,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/CommentParams" + "$ref": "#/$defs/CommentParams" } }, "required": ["params"], @@ -830,18 +748,16 @@ "description": "Configure for volume command creation request model.", "properties": { "commandType": { + "const": "configureForVolume", "default": "configureForVolume", "enum": ["configureForVolume"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -849,7 +765,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/ConfigureForVolumeParams" + "$ref": "#/$defs/ConfigureForVolumeParams" } }, "required": ["params"], @@ -871,7 +787,7 @@ }, "volume": { "description": "Amount of liquid in uL. Must be at least 0 and no greater than a pipette-specific maximum volume.", - "minimum": 0, + "minimum": 0.0, "title": "Volume", "type": "number" } @@ -884,18 +800,16 @@ "description": "Configure nozzle layout creation request model.", "properties": { "commandType": { + "const": "configureNozzleLayout", "default": "configureNozzleLayout", "enum": ["configureNozzleLayout"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -903,7 +817,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/ConfigureNozzleLayoutParams" + "$ref": "#/$defs/ConfigureNozzleLayoutParams" } }, "required": ["params"], @@ -916,19 +830,19 @@ "configurationParams": { "anyOf": [ { - "$ref": "#/definitions/AllNozzleLayoutConfiguration" + "$ref": "#/$defs/AllNozzleLayoutConfiguration" }, { - "$ref": "#/definitions/SingleNozzleLayoutConfiguration" + "$ref": "#/$defs/SingleNozzleLayoutConfiguration" }, { - "$ref": "#/definitions/RowNozzleLayoutConfiguration" + "$ref": "#/$defs/RowNozzleLayoutConfiguration" }, { - "$ref": "#/definitions/ColumnNozzleLayoutConfiguration" + "$ref": "#/$defs/ColumnNozzleLayoutConfiguration" }, { - "$ref": "#/definitions/QuadrantNozzleLayoutConfiguration" + "$ref": "#/$defs/QuadrantNozzleLayoutConfiguration" } ], "title": "Configurationparams" @@ -988,18 +902,16 @@ "description": "A request to create a custom command.", "properties": { "commandType": { + "const": "custom", "default": "custom", "enum": ["custom"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -1007,7 +919,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/CustomParams" + "$ref": "#/$defs/CustomParams" } }, "required": ["params"], @@ -1015,6 +927,7 @@ "type": "object" }, "CustomParams": { + "additionalProperties": true, "description": "Payload used by a custom command.", "properties": {}, "title": "CustomParams", @@ -1024,18 +937,16 @@ "description": "A request to create a Thermocycler's deactivate block command.", "properties": { "commandType": { + "const": "thermocycler/deactivateBlock", "default": "thermocycler/deactivateBlock", "enum": ["thermocycler/deactivateBlock"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -1043,7 +954,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/DeactivateBlockParams" + "$ref": "#/$defs/DeactivateBlockParams" } }, "required": ["params"], @@ -1067,18 +978,16 @@ "description": "A request to create a Heater-Shaker's deactivate heater command.", "properties": { "commandType": { + "const": "heaterShaker/deactivateHeater", "default": "heaterShaker/deactivateHeater", "enum": ["heaterShaker/deactivateHeater"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -1086,7 +995,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/DeactivateHeaterParams" + "$ref": "#/$defs/DeactivateHeaterParams" } }, "required": ["params"], @@ -1110,18 +1019,16 @@ "description": "A request to create a Thermocycler's deactivate lid command.", "properties": { "commandType": { + "const": "thermocycler/deactivateLid", "default": "thermocycler/deactivateLid", "enum": ["thermocycler/deactivateLid"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -1129,7 +1036,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/DeactivateLidParams" + "$ref": "#/$defs/DeactivateLidParams" } }, "required": ["params"], @@ -1153,18 +1060,16 @@ "description": "A request to create a Heater-Shaker's deactivate shaker command.", "properties": { "commandType": { + "const": "heaterShaker/deactivateShaker", "default": "heaterShaker/deactivateShaker", "enum": ["heaterShaker/deactivateShaker"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -1172,7 +1077,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/DeactivateShakerParams" + "$ref": "#/$defs/DeactivateShakerParams" } }, "required": ["params"], @@ -1196,18 +1101,16 @@ "description": "A request to deactivate a Temperature Module.", "properties": { "commandType": { + "const": "temperatureModule/deactivate", "default": "temperatureModule/deactivate", "enum": ["temperatureModule/deactivate"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -1215,7 +1118,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/DeactivateTemperatureParams" + "$ref": "#/$defs/DeactivateTemperatureParams" } }, "required": ["params"], @@ -1259,11 +1162,7 @@ "description": "The location of something placed in a single deck slot.", "properties": { "slotName": { - "allOf": [ - { - "$ref": "#/definitions/DeckSlotName" - } - ], + "$ref": "#/$defs/DeckSlotName", "description": "A slot on the robot's deck.\n\nThe plain numbers like `\"5\"` are for the OT-2, and the coordinates like `\"C2\"` are for the Flex.\n\nWhen you provide one of these values, you can use either style. It will automatically be converted to match the robot.\n\nWhen one of these values is returned, it will always match the robot." } }, @@ -1299,7 +1198,8 @@ "D2", "D3" ], - "title": "DeckSlotName" + "title": "DeckSlotName", + "type": "string" }, "DelayParams": { "description": "Parameters for delay.", @@ -1332,11 +1232,7 @@ "type": "boolean" }, "params": { - "allOf": [ - { - "$ref": "#/definitions/DelayParams" - } - ], + "$ref": "#/$defs/DelayParams", "description": "Parameters for the delay function.", "title": "Params" } @@ -1349,18 +1245,16 @@ "description": "A request to create a Magnetic Module disengage command.", "properties": { "commandType": { + "const": "magneticModule/disengage", "default": "magneticModule/disengage", "enum": ["magneticModule/disengage"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -1368,7 +1262,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/DisengageParams" + "$ref": "#/$defs/DisengageParams" } }, "required": ["params"], @@ -1392,18 +1286,16 @@ "description": "Create dispense command request model.", "properties": { "commandType": { + "const": "dispense", "default": "dispense", "enum": ["dispense"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -1411,7 +1303,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/DispenseParams" + "$ref": "#/$defs/DispenseParams" } }, "required": ["params"], @@ -1422,18 +1314,16 @@ "description": "DispenseInPlace command request model.", "properties": { "commandType": { + "const": "dispenseInPlace", "default": "dispenseInPlace", "enum": ["dispenseInPlace"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -1441,7 +1331,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/DispenseInPlaceParams" + "$ref": "#/$defs/DispenseInPlaceParams" } }, "required": ["params"], @@ -1453,7 +1343,7 @@ "properties": { "flowRate": { "description": "Speed in \u00b5L/s configured for the pipette", - "exclusiveMinimum": 0, + "exclusiveMinimum": 0.0, "title": "Flowrate", "type": "number" }, @@ -1469,7 +1359,7 @@ }, "volume": { "description": "The amount of liquid to dispense, in \u00b5L. Must not be greater than the currently aspirated volume. There is some tolerance for floating point rounding errors.", - "minimum": 0, + "minimum": 0.0, "title": "Volume", "type": "number" } @@ -1483,7 +1373,7 @@ "properties": { "flowRate": { "description": "Speed in \u00b5L/s configured for the pipette", - "exclusiveMinimum": 0, + "exclusiveMinimum": 0.0, "title": "Flowrate", "type": "number" }, @@ -1504,18 +1394,13 @@ }, "volume": { "description": "The amount of liquid to dispense, in \u00b5L. Must not be greater than the currently aspirated volume. There is some tolerance for floating point rounding errors.", - "minimum": 0, + "minimum": 0.0, "title": "Volume", "type": "number" }, "wellLocation": { - "allOf": [ - { - "$ref": "#/definitions/LiquidHandlingWellLocation" - } - ], - "description": "Relative well location at which to perform the operation", - "title": "Welllocation" + "$ref": "#/$defs/LiquidHandlingWellLocation", + "description": "Relative well location at which to perform the operation" }, "wellName": { "description": "Name of well to use in labware.", @@ -1531,18 +1416,16 @@ "description": "Drop tip command creation request model.", "properties": { "commandType": { + "const": "dropTip", "default": "dropTip", "enum": ["dropTip"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -1550,7 +1433,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/DropTipParams" + "$ref": "#/$defs/DropTipParams" } }, "required": ["params"], @@ -1561,18 +1444,16 @@ "description": "Drop tip in place command creation request model.", "properties": { "commandType": { + "const": "dropTipInPlace", "default": "dropTipInPlace", "enum": ["dropTipInPlace"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -1580,7 +1461,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/DropTipInPlaceParams" + "$ref": "#/$defs/DropTipInPlaceParams" } }, "required": ["params"], @@ -1609,7 +1490,6 @@ "description": "Payload required to drop a tip in a specific well.", "properties": { "alternateDropLocation": { - "default": false, "description": "Whether to alternate location where tip is dropped within the labware. If True, this command will ignore the wellLocation provided and alternate between dropping tips at two predetermined locations inside the specified labware well. If False, the tip will be dropped at the top center of the well.", "title": "Alternatedroplocation", "type": "boolean" @@ -1630,13 +1510,8 @@ "type": "string" }, "wellLocation": { - "allOf": [ - { - "$ref": "#/definitions/DropTipWellLocation" - } - ], - "description": "Relative well location at which to drop the tip.", - "title": "Welllocation" + "$ref": "#/$defs/DropTipWellLocation", + "description": "Relative well location at which to drop the tip." }, "wellName": { "description": "Name of well to use in labware.", @@ -1652,14 +1527,10 @@ "description": "Like WellLocation, but for dropping tips.\n\nUnlike a typical WellLocation, the location for a drop tip\ndefaults to location based on the tip length rather than the well's top.", "properties": { "offset": { - "$ref": "#/definitions/WellOffset" + "$ref": "#/$defs/WellOffset" }, "origin": { - "allOf": [ - { - "$ref": "#/definitions/DropTipWellOrigin" - } - ], + "$ref": "#/$defs/DropTipWellOrigin", "default": "default" } }, @@ -1676,18 +1547,16 @@ "description": "A request to create a Magnetic Module engage command.", "properties": { "commandType": { + "const": "magneticModule/engage", "default": "magneticModule/engage", "enum": ["magneticModule/engage"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -1695,7 +1564,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/EngageParams" + "$ref": "#/$defs/EngageParams" } }, "required": ["params"], @@ -1724,18 +1593,16 @@ "description": "GetTipPresence command creation request model.", "properties": { "commandType": { + "const": "getTipPresence", "default": "getTipPresence", "enum": ["getTipPresence"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -1743,7 +1610,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/GetTipPresenceParams" + "$ref": "#/$defs/GetTipPresenceParams" } }, "required": ["params"], @@ -1767,18 +1634,16 @@ "description": "Data to create a Home command.", "properties": { "commandType": { + "const": "home", "default": "home", "enum": ["home"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -1786,7 +1651,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/HomeParams" + "$ref": "#/$defs/HomeParams" } }, "required": ["params"], @@ -1799,17 +1664,15 @@ "axes": { "description": "Axes to return to their home positions. If omitted, will home all motors. Extra axes may be implicitly homed to ensure accurate homing of the explicitly specified axes.", "items": { - "$ref": "#/definitions/MotorAxis" + "$ref": "#/$defs/MotorAxis" }, + "title": "Axes", "type": "array" }, "skipIfMountPositionOk": { - "allOf": [ - { - "$ref": "#/definitions/MountType" - } - ], - "description": "If this parameter is provided, the gantry will only be homed if the specified mount has an invalid position. If omitted, the homing action will be executed unconditionally." + "$ref": "#/$defs/MountType", + "description": "If this parameter is provided, the gantry will only be homed if the specified mount has an invalid position. If omitted, the homing action will be executed unconditionally.", + "title": "Skipifmountpositionok" } }, "title": "HomeParams", @@ -1819,18 +1682,16 @@ "description": "A request to execute an Absorbance Reader measurement.", "properties": { "commandType": { + "const": "absorbanceReader/initialize", "default": "absorbanceReader/initialize", "enum": ["absorbanceReader/initialize"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -1838,7 +1699,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/InitializeParams" + "$ref": "#/$defs/InitializeParams" } }, "required": ["params"], @@ -1889,37 +1750,12 @@ "title": "LabwareMovementStrategy", "type": "string" }, - "LabwareOffsetVector": { - "description": "Offset, in deck coordinates from nominal to actual position.", - "properties": { - "x": { - "title": "X", - "type": "number" - }, - "y": { - "title": "Y", - "type": "number" - }, - "z": { - "title": "Z", - "type": "number" - } - }, - "required": ["x", "y", "z"], - "title": "LabwareOffsetVector", - "type": "object" - }, "LiquidClassRecord": { "description": "LiquidClassRecord is our internal representation of an (immutable) liquid class.\n\nConceptually, a liquid class record is the tuple (name, pipette, tip, transfer properties).\nWe consider two liquid classes to be the same if every entry in that tuple is the same; and liquid\nclasses are different if any entry in the tuple is different.\n\nThis class defines the tuple via inheritance so that we can reuse the definitions from shared_data.", "properties": { "aspirate": { - "allOf": [ - { - "$ref": "#/definitions/AspirateProperties" - } - ], - "description": "Aspirate parameters for this tip type.", - "title": "Aspirate" + "$ref": "#/$defs/AspirateProperties", + "description": "Aspirate parameters for this tip type." }, "liquidClassName": { "description": "Identifier for the liquid of this liquid class, e.g. glycerol50.", @@ -1927,11 +1763,7 @@ "type": "string" }, "multiDispense": { - "allOf": [ - { - "$ref": "#/definitions/MultiDispenseProperties" - } - ], + "$ref": "#/$defs/MultiDispenseProperties", "description": "Optional multi-dispense parameters for this tip type.", "title": "Multidispense" }, @@ -1941,13 +1773,8 @@ "type": "string" }, "singleDispense": { - "allOf": [ - { - "$ref": "#/definitions/SingleDispenseProperties" - } - ], - "description": "Single dispense parameters for this tip type.", - "title": "Singledispense" + "$ref": "#/$defs/SingleDispenseProperties", + "description": "Single dispense parameters for this tip type." }, "tiprack": { "description": "The name of tiprack whose tip will be used when handling this specific liquid class with this pipette", @@ -2015,14 +1842,10 @@ "description": "A relative location in reference to a well's location.\n\nTo be used with commands that handle liquids.", "properties": { "offset": { - "$ref": "#/definitions/WellOffset" + "$ref": "#/$defs/WellOffset" }, "origin": { - "allOf": [ - { - "$ref": "#/definitions/WellOrigin" - } - ], + "$ref": "#/$defs/WellOrigin", "default": "top" }, "volumeOffset": { @@ -2031,6 +1854,7 @@ "type": "number" }, { + "const": "operationVolume", "enum": ["operationVolume"], "type": "string" } @@ -2047,18 +1871,16 @@ "description": "The request model for a `liquidProbe` command.", "properties": { "commandType": { + "const": "liquidProbe", "default": "liquidProbe", "enum": ["liquidProbe"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -2066,7 +1888,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/LiquidProbeParams" + "$ref": "#/$defs/LiquidProbeParams" } }, "required": ["params"], @@ -2087,13 +1909,8 @@ "type": "string" }, "wellLocation": { - "allOf": [ - { - "$ref": "#/definitions/WellLocation" - } - ], - "description": "Relative well location at which to perform the operation", - "title": "Welllocation" + "$ref": "#/$defs/WellLocation", + "description": "Relative well location at which to perform the operation" }, "wellName": { "description": "Name of well to use in labware.", @@ -2109,18 +1926,16 @@ "description": "Load labware command creation request.", "properties": { "commandType": { + "const": "loadLabware", "default": "loadLabware", "enum": ["loadLabware"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -2128,7 +1943,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/LoadLabwareParams" + "$ref": "#/$defs/LoadLabwareParams" } }, "required": ["params"], @@ -2156,20 +1971,21 @@ "location": { "anyOf": [ { - "$ref": "#/definitions/DeckSlotLocation" + "$ref": "#/$defs/DeckSlotLocation" }, { - "$ref": "#/definitions/ModuleLocation" + "$ref": "#/$defs/ModuleLocation" }, { - "$ref": "#/definitions/OnLabwareLocation" + "$ref": "#/$defs/OnLabwareLocation" }, { + "const": "offDeck", "enum": ["offDeck"], "type": "string" }, { - "$ref": "#/definitions/AddressableAreaLocation" + "$ref": "#/$defs/AddressableAreaLocation" } ], "description": "Location the labware should be loaded into.", @@ -2194,18 +2010,16 @@ "description": "Load Liquid Class command creation request.", "properties": { "commandType": { + "const": "loadLiquidClass", "default": "loadLiquidClass", "enum": ["loadLiquidClass"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -2213,7 +2027,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/LoadLiquidClassParams" + "$ref": "#/$defs/LoadLiquidClassParams" } }, "required": ["params"], @@ -2229,13 +2043,8 @@ "type": "string" }, "liquidClassRecord": { - "allOf": [ - { - "$ref": "#/definitions/LiquidClassRecord" - } - ], - "description": "The liquid class to store.", - "title": "Liquidclassrecord" + "$ref": "#/$defs/LiquidClassRecord", + "description": "The liquid class to store." } }, "required": ["liquidClassRecord"], @@ -2246,18 +2055,16 @@ "description": "Load liquid command creation request.", "properties": { "commandType": { + "const": "loadLiquid", "default": "loadLiquid", "enum": ["loadLiquid"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -2265,7 +2072,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/LoadLiquidParams" + "$ref": "#/$defs/LoadLiquidParams" } }, "required": ["params"], @@ -2286,6 +2093,7 @@ "type": "string" }, { + "const": "EMPTY", "enum": ["EMPTY"], "type": "string" } @@ -2310,18 +2118,16 @@ "description": "The model for a creation request for a load module command.", "properties": { "commandType": { + "const": "loadModule", "default": "loadModule", "enum": ["loadModule"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -2329,7 +2135,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/LoadModuleParams" + "$ref": "#/$defs/LoadModuleParams" } }, "required": ["params"], @@ -2340,20 +2146,11 @@ "description": "Payload required to load a module.", "properties": { "location": { - "allOf": [ - { - "$ref": "#/definitions/DeckSlotLocation" - } - ], - "description": "The location into which this module should be loaded.\n\nFor the Thermocycler Module, which occupies multiple deck slots, this should be the front-most occupied slot (normally slot 7).", - "title": "Location" + "$ref": "#/$defs/DeckSlotLocation", + "description": "The location into which this module should be loaded.\n\nFor the Thermocycler Module, which occupies multiple deck slots, this should be the front-most occupied slot (normally slot 7)." }, "model": { - "allOf": [ - { - "$ref": "#/definitions/ModuleModel" - } - ], + "$ref": "#/$defs/ModuleModel", "description": "The model name of the module to load.\n\nProtocol Engine will look for a connected module that either exactly matches this one, or is compatible.\n\n For example, if you request a `temperatureModuleV1` here, Protocol Engine might load a `temperatureModuleV1` or a `temperatureModuleV2`.\n\n The model that it finds connected will be available through `result.model`." }, "moduleId": { @@ -2370,18 +2167,16 @@ "description": "Load pipette command creation request model.", "properties": { "commandType": { + "const": "loadPipette", "default": "loadPipette", "enum": ["loadPipette"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -2389,7 +2184,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/LoadPipetteParams" + "$ref": "#/$defs/LoadPipetteParams" } }, "required": ["params"], @@ -2405,11 +2200,7 @@ "type": "boolean" }, "mount": { - "allOf": [ - { - "$ref": "#/definitions/MountType" - } - ], + "$ref": "#/$defs/MountType", "description": "The mount the pipette should be present on." }, "pipetteId": { @@ -2418,11 +2209,7 @@ "type": "string" }, "pipetteName": { - "allOf": [ - { - "$ref": "#/definitions/PipetteNameType" - } - ], + "$ref": "#/$defs/PipetteNameType", "description": "The load name of the pipette to be required." }, "tipOverlapNotAfterVersion": { @@ -2438,7 +2225,8 @@ "MaintenancePosition": { "description": "Maintenance position options.", "enum": ["attachPlate", "attachInstrument"], - "title": "MaintenancePosition" + "title": "MaintenancePosition", + "type": "string" }, "MixParams": { "description": "Parameters for mix.", @@ -2475,11 +2263,7 @@ "type": "boolean" }, "params": { - "allOf": [ - { - "$ref": "#/definitions/MixParams" - } - ], + "$ref": "#/$defs/MixParams", "description": "Parameters for the mix function.", "title": "Params" } @@ -2534,7 +2318,6 @@ "type": "string" }, "MountType": { - "description": "An enumeration.", "enum": ["left", "right", "extension"], "title": "MountType", "type": "string" @@ -2543,18 +2326,16 @@ "description": "MoveAxesRelative command request model.", "properties": { "commandType": { + "const": "robot/moveAxesRelative", "default": "robot/moveAxesRelative", "enum": ["robot/moveAxesRelative"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -2562,7 +2343,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/MoveAxesRelativeParams" + "$ref": "#/$defs/MoveAxesRelativeParams" } }, "required": ["params"], @@ -2594,18 +2375,16 @@ "description": "MoveAxesTo command request model.", "properties": { "commandType": { + "const": "robot/moveAxesTo", "default": "robot/moveAxesTo", "enum": ["robot/moveAxesTo"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -2613,7 +2392,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/MoveAxesToParams" + "$ref": "#/$defs/MoveAxesToParams" } }, "required": ["params"], @@ -2653,18 +2432,16 @@ "description": "A request to create a ``moveLabware`` command.", "properties": { "commandType": { + "const": "moveLabware", "default": "moveLabware", "enum": ["moveLabware"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -2672,7 +2449,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/MoveLabwareParams" + "$ref": "#/$defs/MoveLabwareParams" } }, "required": ["params"], @@ -2683,11 +2460,7 @@ "description": "Input parameters for a ``moveLabware`` command.", "properties": { "dropOffset": { - "allOf": [ - { - "$ref": "#/definitions/LabwareOffsetVector" - } - ], + "$ref": "#/$defs/OffsetVector", "description": "Offset to use when dropping off labware. Experimental param, subject to change", "title": "Dropoffset" }, @@ -2699,40 +2472,33 @@ "newLocation": { "anyOf": [ { - "$ref": "#/definitions/DeckSlotLocation" + "$ref": "#/$defs/DeckSlotLocation" }, { - "$ref": "#/definitions/ModuleLocation" + "$ref": "#/$defs/ModuleLocation" }, { - "$ref": "#/definitions/OnLabwareLocation" + "$ref": "#/$defs/OnLabwareLocation" }, { + "const": "offDeck", "enum": ["offDeck"], "type": "string" }, { - "$ref": "#/definitions/AddressableAreaLocation" + "$ref": "#/$defs/AddressableAreaLocation" } ], "description": "Where to move the labware.", "title": "Newlocation" }, "pickUpOffset": { - "allOf": [ - { - "$ref": "#/definitions/LabwareOffsetVector" - } - ], + "$ref": "#/$defs/OffsetVector", "description": "Offset to use when picking up labware. Experimental param, subject to change", "title": "Pickupoffset" }, "strategy": { - "allOf": [ - { - "$ref": "#/definitions/LabwareMovementStrategy" - } - ], + "$ref": "#/$defs/LabwareMovementStrategy", "description": "Whether to use the gripper to perform the labware movement or to perform a manual movement with an option to pause." } }, @@ -2744,18 +2510,16 @@ "description": "Data to create a MoveRelative command.", "properties": { "commandType": { + "const": "moveRelative", "default": "moveRelative", "enum": ["moveRelative"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -2763,7 +2527,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/MoveRelativeParams" + "$ref": "#/$defs/MoveRelativeParams" } }, "required": ["params"], @@ -2774,11 +2538,7 @@ "description": "Payload required for a MoveRelative command.", "properties": { "axis": { - "allOf": [ - { - "$ref": "#/definitions/MovementAxis" - } - ], + "$ref": "#/$defs/MovementAxis", "description": "Axis along which to move." }, "distance": { @@ -2800,18 +2560,16 @@ "description": "Move to addressable area command creation request model.", "properties": { "commandType": { + "const": "moveToAddressableArea", "default": "moveToAddressableArea", "enum": ["moveToAddressableArea"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -2819,7 +2577,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/MoveToAddressableAreaParams" + "$ref": "#/$defs/MoveToAddressableAreaParams" } }, "required": ["params"], @@ -2830,18 +2588,16 @@ "description": "Move to addressable area for drop tip command creation request model.", "properties": { "commandType": { + "const": "moveToAddressableAreaForDropTip", "default": "moveToAddressableAreaForDropTip", "enum": ["moveToAddressableAreaForDropTip"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -2849,7 +2605,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/MoveToAddressableAreaForDropTipParams" + "$ref": "#/$defs/MoveToAddressableAreaForDropTipParams" } }, "required": ["params"], @@ -2865,7 +2621,6 @@ "type": "string" }, "alternateDropLocation": { - "default": false, "description": "Whether to alternate location where tip is dropped within the addressable area. If True, this command will ignore the offset provided and alternate between dropping tips at two predetermined locations inside the specified labware well. If False, the tip will be dropped at the top center of the area.", "title": "Alternatedroplocation", "type": "boolean" @@ -2877,7 +2632,6 @@ "type": "boolean" }, "ignoreTipConfiguration": { - "default": true, "description": "Whether to utilize the critical point of the tip configuraiton when moving to an addressable area. If True, this command will ignore the tip configuration and use the center of the entire instrument as the critical point for movement. If False, this command will use the critical point provided by the current tip configuration.", "title": "Ignoretipconfiguration", "type": "boolean" @@ -2888,18 +2642,13 @@ "type": "number" }, "offset": { - "allOf": [ - { - "$ref": "#/definitions/AddressableOffsetVector" - } - ], + "$ref": "#/$defs/AddressableOffsetVector", "default": { "x": 0.0, "y": 0.0, "z": 0.0 }, - "description": "Relative offset of addressable area to move pipette's critical point.", - "title": "Offset" + "description": "Relative offset of addressable area to move pipette's critical point." }, "pipetteId": { "description": "Identifier of pipette to use for liquid handling.", @@ -2936,18 +2685,13 @@ "type": "number" }, "offset": { - "allOf": [ - { - "$ref": "#/definitions/AddressableOffsetVector" - } - ], + "$ref": "#/$defs/AddressableOffsetVector", "default": { "x": 0.0, "y": 0.0, "z": 0.0 }, - "description": "Relative offset of addressable area to move pipette's critical point.", - "title": "Offset" + "description": "Relative offset of addressable area to move pipette's critical point." }, "pipetteId": { "description": "Identifier of pipette to use for liquid handling.", @@ -2974,18 +2718,16 @@ "description": "Move to coordinates command creation request model.", "properties": { "commandType": { + "const": "moveToCoordinates", "default": "moveToCoordinates", "enum": ["moveToCoordinates"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -2993,7 +2735,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/MoveToCoordinatesParams" + "$ref": "#/$defs/MoveToCoordinatesParams" } }, "required": ["params"], @@ -3004,13 +2746,8 @@ "description": "Payload required to move a pipette to coordinates.", "properties": { "coordinates": { - "allOf": [ - { - "$ref": "#/definitions/DeckPoint" - } - ], - "description": "X, Y and Z coordinates in mm from deck's origin location (left-front-bottom corner of work space)", - "title": "Coordinates" + "$ref": "#/$defs/DeckPoint", + "description": "X, Y and Z coordinates in mm from deck's origin location (left-front-bottom corner of work space)" }, "forceDirect": { "default": false, @@ -3042,18 +2779,16 @@ "description": "MoveTo command request model.", "properties": { "commandType": { + "const": "robot/moveTo", "default": "robot/moveTo", "enum": ["robot/moveTo"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -3061,7 +2796,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/MoveToParams" + "$ref": "#/$defs/MoveToParams" } }, "required": ["params"], @@ -3072,18 +2807,16 @@ "description": "Calibration set up position command creation request model.", "properties": { "commandType": { + "const": "calibration/moveToMaintenancePosition", "default": "calibration/moveToMaintenancePosition", "enum": ["calibration/moveToMaintenancePosition"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -3091,7 +2824,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/MoveToMaintenancePositionParams" + "$ref": "#/$defs/MoveToMaintenancePositionParams" } }, "required": ["params"], @@ -3102,20 +2835,12 @@ "description": "Calibration set up position command parameters.", "properties": { "maintenancePosition": { - "allOf": [ - { - "$ref": "#/definitions/MaintenancePosition" - } - ], + "$ref": "#/$defs/MaintenancePosition", "default": "attachInstrument", "description": "The position the gantry mount needs to move to." }, "mount": { - "allOf": [ - { - "$ref": "#/definitions/MountType" - } - ], + "$ref": "#/$defs/MountType", "description": "Gantry mount to move maintenance position." } }, @@ -3127,20 +2852,11 @@ "description": "Payload required to move to a destination position.", "properties": { "destination": { - "allOf": [ - { - "$ref": "#/definitions/DeckPoint" - } - ], - "description": "X, Y and Z coordinates in mm from deck's origin location (left-front-bottom corner of work space)", - "title": "Destination" + "$ref": "#/$defs/DeckPoint", + "description": "X, Y and Z coordinates in mm from deck's origin location (left-front-bottom corner of work space)" }, "mount": { - "allOf": [ - { - "$ref": "#/definitions/MountType" - } - ], + "$ref": "#/$defs/MountType", "description": "The mount to move to the destination point." }, "speed": { @@ -3157,18 +2873,16 @@ "description": "Move to well command creation request model.", "properties": { "commandType": { + "const": "moveToWell", "default": "moveToWell", "enum": ["moveToWell"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -3176,7 +2890,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/MoveToWellParams" + "$ref": "#/$defs/MoveToWellParams" } }, "required": ["params"], @@ -3213,13 +2927,8 @@ "type": "number" }, "wellLocation": { - "allOf": [ - { - "$ref": "#/definitions/WellLocation" - } - ], - "description": "Relative well location at which to perform the operation", - "title": "Welllocation" + "$ref": "#/$defs/WellLocation", + "description": "Relative well location at which to perform the operation" }, "wellName": { "description": "Name of well to use in labware.", @@ -3243,7 +2952,9 @@ "conditioningByVolume": { "description": "Settings for conditioning volume keyed by target dispense volume.", "items": { - "items": [ + "maxItems": 2, + "minItems": 2, + "prefixItems": [ { "anyOf": [ { @@ -3269,8 +2980,6 @@ ] } ], - "maxItems": 2, - "minItems": 2, "type": "array" }, "title": "Conditioningbyvolume", @@ -3279,7 +2988,9 @@ "correctionByVolume": { "description": "Settings for volume correction keyed by by target dispense volume, representing additional volume the plunger should move to accurately hit target volume.", "items": { - "items": [ + "maxItems": 2, + "minItems": 2, + "prefixItems": [ { "anyOf": [ { @@ -3303,26 +3014,21 @@ ] } ], - "maxItems": 2, - "minItems": 2, "type": "array" }, "title": "Correctionbyvolume", "type": "array" }, "delay": { - "allOf": [ - { - "$ref": "#/definitions/DelayProperties" - } - ], - "description": "Delay settings after each dispense", - "title": "Delay" + "$ref": "#/$defs/DelayProperties", + "description": "Delay settings after each dispense" }, "disposalByVolume": { "description": "Settings for disposal volume keyed by target dispense volume.", "items": { - "items": [ + "maxItems": 2, + "minItems": 2, + "prefixItems": [ { "anyOf": [ { @@ -3348,8 +3054,6 @@ ] } ], - "maxItems": 2, - "minItems": 2, "type": "array" }, "title": "Disposalbyvolume", @@ -3358,7 +3062,9 @@ "flowRateByVolume": { "description": "Settings for flow rate keyed by target dispense volume.", "items": { - "items": [ + "maxItems": 2, + "minItems": 2, + "prefixItems": [ { "anyOf": [ { @@ -3384,47 +3090,26 @@ ] } ], - "maxItems": 2, - "minItems": 2, "type": "array" }, "title": "Flowratebyvolume", "type": "array" }, "offset": { - "allOf": [ - { - "$ref": "#/definitions/Coordinate" - } - ], - "description": "Relative offset for single multi-dispense.", - "title": "Offset" + "$ref": "#/$defs/Coordinate", + "description": "Relative offset for single multi-dispense." }, "positionReference": { - "allOf": [ - { - "$ref": "#/definitions/PositionReference" - } - ], + "$ref": "#/$defs/PositionReference", "description": "Position reference for multi-dispense." }, "retract": { - "allOf": [ - { - "$ref": "#/definitions/RetractDispense" - } - ], - "description": "Pipette retract settings after a multi-dispense.", - "title": "Retract" + "$ref": "#/$defs/RetractDispense", + "description": "Pipette retract settings after a multi-dispense." }, "submerge": { - "allOf": [ - { - "$ref": "#/definitions/Submerge" - } - ], - "description": "Submerge settings for multi-dispense.", - "title": "Submerge" + "$ref": "#/$defs/Submerge", + "description": "Submerge settings for multi-dispense." } }, "required": [ @@ -3441,6 +3126,47 @@ "title": "MultiDispenseProperties", "type": "object" }, + "OffsetVector": { + "description": "A generic 3-D offset vector.", + "properties": { + "x": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + } + ], + "title": "X" + }, + "y": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + } + ], + "title": "Y" + }, + "z": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + } + ], + "title": "Z" + } + }, + "required": ["x", "y", "z"], + "title": "OffsetVector", + "type": "object" + }, "OnLabwareLocation": { "description": "The location of something placed atop another labware.", "properties": { @@ -3458,18 +3184,16 @@ "description": "A request to create a Heater-Shaker's open labware latch command.", "properties": { "commandType": { + "const": "heaterShaker/openLabwareLatch", "default": "heaterShaker/openLabwareLatch", "enum": ["heaterShaker/openLabwareLatch"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -3477,7 +3201,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/OpenLabwareLatchParams" + "$ref": "#/$defs/OpenLabwareLatchParams" } }, "required": ["params"], @@ -3501,18 +3225,16 @@ "description": "Pick up tip command creation request model.", "properties": { "commandType": { + "const": "pickUpTip", "default": "pickUpTip", "enum": ["pickUpTip"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -3520,7 +3242,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/PickUpTipParams" + "$ref": "#/$defs/PickUpTipParams" } }, "required": ["params"], @@ -3541,13 +3263,8 @@ "type": "string" }, "wellLocation": { - "allOf": [ - { - "$ref": "#/definitions/PickUpTipWellLocation" - } - ], - "description": "Relative well location at which to pick up the tip.", - "title": "Welllocation" + "$ref": "#/$defs/PickUpTipWellLocation", + "description": "Relative well location at which to pick up the tip." }, "wellName": { "description": "Name of well to use in labware.", @@ -3563,14 +3280,10 @@ "description": "A relative location in reference to a well's location.\n\nTo be used for picking up tips.", "properties": { "offset": { - "$ref": "#/definitions/WellOffset" + "$ref": "#/$defs/WellOffset" }, "origin": { - "allOf": [ - { - "$ref": "#/definitions/PickUpTipWellOrigin" - } - ], + "$ref": "#/$defs/PickUpTipWellOrigin", "default": "top" } }, @@ -3612,24 +3325,23 @@ "PositionReference": { "description": "Positional reference for liquid handling operations.", "enum": ["well-bottom", "well-top", "well-center", "liquid-meniscus"], - "title": "PositionReference" + "title": "PositionReference", + "type": "string" }, "PrepareToAspirateCreate": { "description": "Prepare for aspirate command creation request model.", "properties": { "commandType": { + "const": "prepareToAspirate", "default": "prepareToAspirate", "enum": ["prepareToAspirate"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -3637,7 +3349,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/PrepareToAspirateParams" + "$ref": "#/$defs/PrepareToAspirateParams" } }, "required": ["params"], @@ -3668,7 +3380,7 @@ "steps": { "description": "Steps to repeat.", "items": { - "$ref": "#/definitions/ProfileStep" + "$ref": "#/$defs/ProfileStep" }, "title": "Steps", "type": "array" @@ -3718,6 +3430,7 @@ "type": "string" }, "style": { + "const": "QUADRANT", "default": "QUADRANT", "enum": ["QUADRANT"], "title": "Style", @@ -3732,18 +3445,16 @@ "description": "A request to execute an Absorbance Reader measurement.", "properties": { "commandType": { + "const": "absorbanceReader/read", "default": "absorbanceReader/read", "enum": ["absorbanceReader/read"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -3751,7 +3462,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/ReadAbsorbanceParams" + "$ref": "#/$defs/ReadAbsorbanceParams" } }, "required": ["params"], @@ -3780,18 +3491,16 @@ "description": "Reload labware command creation request.", "properties": { "commandType": { + "const": "reloadLabware", "default": "reloadLabware", "enum": ["reloadLabware"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -3799,7 +3508,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/ReloadLabwareParams" + "$ref": "#/$defs/ReloadLabwareParams" } }, "required": ["params"], @@ -3825,7 +3534,9 @@ "airGapByVolume": { "description": "Settings for air gap keyed by target aspiration volume.", "items": { - "items": [ + "maxItems": 2, + "minItems": 2, + "prefixItems": [ { "anyOf": [ { @@ -3851,37 +3562,21 @@ ] } ], - "maxItems": 2, - "minItems": 2, "type": "array" }, "title": "Airgapbyvolume", "type": "array" }, "delay": { - "allOf": [ - { - "$ref": "#/definitions/DelayProperties" - } - ], - "description": "Delay settings for retract after aspirate.", - "title": "Delay" + "$ref": "#/$defs/DelayProperties", + "description": "Delay settings for retract after aspirate." }, "offset": { - "allOf": [ - { - "$ref": "#/definitions/Coordinate" - } - ], - "description": "Relative offset for retract after aspirate.", - "title": "Offset" + "$ref": "#/$defs/Coordinate", + "description": "Relative offset for retract after aspirate." }, "positionReference": { - "allOf": [ - { - "$ref": "#/definitions/PositionReference" - } - ], + "$ref": "#/$defs/PositionReference", "description": "Position reference for retract after aspirate." }, "speed": { @@ -3899,13 +3594,8 @@ "title": "Speed" }, "touchTip": { - "allOf": [ - { - "$ref": "#/definitions/TouchTipProperties" - } - ], - "description": "Touch tip settings for retract after aspirate.", - "title": "Touchtip" + "$ref": "#/$defs/TouchTipProperties", + "description": "Touch tip settings for retract after aspirate." } }, "required": [ @@ -3923,18 +3613,16 @@ "description": "Data to create a Retract Axis command.", "properties": { "commandType": { + "const": "retractAxis", "default": "retractAxis", "enum": ["retractAxis"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -3942,7 +3630,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/RetractAxisParams" + "$ref": "#/$defs/RetractAxisParams" } }, "required": ["params"], @@ -3953,11 +3641,7 @@ "description": "Payload required for a Retract Axis command.", "properties": { "axis": { - "allOf": [ - { - "$ref": "#/definitions/MotorAxis" - } - ], + "$ref": "#/$defs/MotorAxis", "description": "Axis to retract to its home position as quickly as safely possible. The difference between retracting an axis and homing an axis using the home command is that a home will always probe the limit switch and will work as the first motion command a robot will need to execute; On the other hand, retraction will rely on this previously determined home position to move to it as fast as safely possible. So on the Flex, it will move (fast) the axis to the previously recorded home position and on the OT2, it will move (fast) the axis a safe distance from the previously recorded home position, and then slowly approach the limit switch." } }, @@ -3971,7 +3655,9 @@ "airGapByVolume": { "description": "Settings for air gap keyed by target aspiration volume.", "items": { - "items": [ + "maxItems": 2, + "minItems": 2, + "prefixItems": [ { "anyOf": [ { @@ -3997,46 +3683,25 @@ ] } ], - "maxItems": 2, - "minItems": 2, "type": "array" }, "title": "Airgapbyvolume", "type": "array" }, "blowout": { - "allOf": [ - { - "$ref": "#/definitions/BlowoutProperties" - } - ], - "description": "Blowout properties for retract after dispense.", - "title": "Blowout" + "$ref": "#/$defs/BlowoutProperties", + "description": "Blowout properties for retract after dispense." }, "delay": { - "allOf": [ - { - "$ref": "#/definitions/DelayProperties" - } - ], - "description": "Delay settings for retract after dispense.", - "title": "Delay" + "$ref": "#/$defs/DelayProperties", + "description": "Delay settings for retract after dispense." }, "offset": { - "allOf": [ - { - "$ref": "#/definitions/Coordinate" - } - ], - "description": "Relative offset for retract after dispense.", - "title": "Offset" + "$ref": "#/$defs/Coordinate", + "description": "Relative offset for retract after dispense." }, "positionReference": { - "allOf": [ - { - "$ref": "#/definitions/PositionReference" - } - ], + "$ref": "#/$defs/PositionReference", "description": "Position reference for retract after dispense." }, "speed": { @@ -4054,13 +3719,8 @@ "title": "Speed" }, "touchTip": { - "allOf": [ - { - "$ref": "#/definitions/TouchTipProperties" - } - ], - "description": "Touch tip settings for retract after dispense.", - "title": "Touchtip" + "$ref": "#/$defs/TouchTipProperties", + "description": "Touch tip settings for retract after dispense." } }, "required": [ @@ -4085,6 +3745,7 @@ "type": "string" }, "style": { + "const": "ROW", "default": "ROW", "enum": ["ROW"], "title": "Style", @@ -4099,18 +3760,16 @@ "description": "A request to execute a Thermocycler profile run.", "properties": { "commandType": { + "const": "thermocycler/runExtendedProfile", "default": "thermocycler/runExtendedProfile", "enum": ["thermocycler/runExtendedProfile"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -4118,7 +3777,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/RunExtendedProfileParams" + "$ref": "#/$defs/RunExtendedProfileParams" } }, "required": ["params"], @@ -4143,10 +3802,10 @@ "items": { "anyOf": [ { - "$ref": "#/definitions/ProfileStep" + "$ref": "#/$defs/ProfileStep" }, { - "$ref": "#/definitions/ProfileCycle" + "$ref": "#/$defs/ProfileCycle" } ] }, @@ -4162,18 +3821,16 @@ "description": "A request to execute a Thermocycler profile run.", "properties": { "commandType": { + "const": "thermocycler/runProfile", "default": "thermocycler/runProfile", "enum": ["thermocycler/runProfile"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -4181,7 +3838,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/RunProfileParams" + "$ref": "#/$defs/RunProfileParams" } }, "required": ["params"], @@ -4204,7 +3861,7 @@ "profile": { "description": "Array of profile steps with target temperature and temperature hold time.", "items": { - "$ref": "#/definitions/RunProfileStepParams" + "$ref": "#/$defs/RunProfileStepParams" }, "title": "Profile", "type": "array" @@ -4236,18 +3893,16 @@ "description": "Save position command creation request model.", "properties": { "commandType": { + "const": "savePosition", "default": "savePosition", "enum": ["savePosition"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -4255,7 +3910,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/SavePositionParams" + "$ref": "#/$defs/SavePositionParams" } }, "required": ["params"], @@ -4266,8 +3921,7 @@ "description": "Payload needed to save a pipette's current position.", "properties": { "failOnNotHomed": { - "default": true, - "descrption": "Require all axes to be homed before saving position.", + "description": "Require all axes to be homed before saving position.", "title": "Failonnothomed", "type": "boolean" }, @@ -4290,18 +3944,16 @@ "description": "A request to create a Heater-Shaker's set and wait for shake speed command.", "properties": { "commandType": { + "const": "heaterShaker/setAndWaitForShakeSpeed", "default": "heaterShaker/setAndWaitForShakeSpeed", "enum": ["heaterShaker/setAndWaitForShakeSpeed"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -4309,7 +3961,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/SetAndWaitForShakeSpeedParams" + "$ref": "#/$defs/SetAndWaitForShakeSpeedParams" } }, "required": ["params"], @@ -4338,18 +3990,16 @@ "description": "setRailLights command request model.", "properties": { "commandType": { + "const": "setRailLights", "default": "setRailLights", "enum": ["setRailLights"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -4357,7 +4007,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/SetRailLightsParams" + "$ref": "#/$defs/SetRailLightsParams" } }, "required": ["params"], @@ -4381,18 +4031,16 @@ "description": "setStatusBar command request model.", "properties": { "commandType": { + "const": "setStatusBar", "default": "setStatusBar", "enum": ["setStatusBar"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -4400,7 +4048,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/SetStatusBarParams" + "$ref": "#/$defs/SetStatusBarParams" } }, "required": ["params"], @@ -4411,11 +4059,7 @@ "description": "Payload required to set the status bar to run an animation.", "properties": { "animation": { - "allOf": [ - { - "$ref": "#/definitions/StatusBarAnimation" - } - ], + "$ref": "#/$defs/StatusBarAnimation", "description": "The animation that should be executed on the status bar." } }, @@ -4427,18 +4071,16 @@ "description": "A request to create a Thermocycler's set block temperature command.", "properties": { "commandType": { + "const": "thermocycler/setTargetBlockTemperature", "default": "thermocycler/setTargetBlockTemperature", "enum": ["thermocycler/setTargetBlockTemperature"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -4446,7 +4088,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/SetTargetBlockTemperatureParams" + "$ref": "#/$defs/SetTargetBlockTemperatureParams" } }, "required": ["params"], @@ -4485,18 +4127,16 @@ "description": "A request to create a Thermocycler's set lid temperature command.", "properties": { "commandType": { + "const": "thermocycler/setTargetLidTemperature", "default": "thermocycler/setTargetLidTemperature", "enum": ["thermocycler/setTargetLidTemperature"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -4504,7 +4144,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/SetTargetLidTemperatureParams" + "$ref": "#/$defs/SetTargetLidTemperatureParams" } }, "required": ["params"], @@ -4535,7 +4175,9 @@ "correctionByVolume": { "description": "Settings for volume correction keyed by by target dispense volume, representing additional volume the plunger should move to accurately hit target volume.", "items": { - "items": [ + "maxItems": 2, + "minItems": 2, + "prefixItems": [ { "anyOf": [ { @@ -4559,26 +4201,21 @@ ] } ], - "maxItems": 2, - "minItems": 2, "type": "array" }, "title": "Correctionbyvolume", "type": "array" }, "delay": { - "allOf": [ - { - "$ref": "#/definitions/DelayProperties" - } - ], - "description": "Delay after dispense, in seconds.", - "title": "Delay" + "$ref": "#/$defs/DelayProperties", + "description": "Delay after dispense, in seconds." }, "flowRateByVolume": { "description": "Settings for flow rate keyed by target dispense volume.", "items": { - "items": [ + "maxItems": 2, + "minItems": 2, + "prefixItems": [ { "anyOf": [ { @@ -4604,43 +4241,29 @@ ] } ], - "maxItems": 2, - "minItems": 2, "type": "array" }, "title": "Flowratebyvolume", "type": "array" }, "mix": { - "allOf": [ - { - "$ref": "#/definitions/MixProperties" - } - ], - "description": "Mixing settings for after a dispense", - "title": "Mix" + "$ref": "#/$defs/MixProperties", + "description": "Mixing settings for after a dispense" }, "offset": { - "allOf": [ - { - "$ref": "#/definitions/Coordinate" - } - ], - "description": "Relative offset for single dispense.", - "title": "Offset" + "$ref": "#/$defs/Coordinate", + "description": "Relative offset for single dispense." }, "positionReference": { - "allOf": [ - { - "$ref": "#/definitions/PositionReference" - } - ], + "$ref": "#/$defs/PositionReference", "description": "Position reference for single dispense." }, "pushOutByVolume": { "description": "Settings for pushout keyed by target dispense volume.", "items": { - "items": [ + "maxItems": 2, + "minItems": 2, + "prefixItems": [ { "anyOf": [ { @@ -4666,30 +4289,18 @@ ] } ], - "maxItems": 2, - "minItems": 2, "type": "array" }, "title": "Pushoutbyvolume", "type": "array" }, "retract": { - "allOf": [ - { - "$ref": "#/definitions/RetractDispense" - } - ], - "description": "Pipette retract settings after a single dispense.", - "title": "Retract" + "$ref": "#/$defs/RetractDispense", + "description": "Pipette retract settings after a single dispense." }, "submerge": { - "allOf": [ - { - "$ref": "#/definitions/Submerge" - } - ], - "description": "Submerge settings for single dispense.", - "title": "Submerge" + "$ref": "#/$defs/Submerge", + "description": "Submerge settings for single dispense." } }, "required": [ @@ -4716,6 +4327,7 @@ "type": "string" }, "style": { + "const": "SINGLE", "default": "SINGLE", "enum": ["SINGLE"], "title": "Style", @@ -4729,35 +4341,22 @@ "StatusBarAnimation": { "description": "Status Bar animation options.", "enum": ["idle", "confirm", "updating", "disco", "off"], - "title": "StatusBarAnimation" + "title": "StatusBarAnimation", + "type": "string" }, "Submerge": { "description": "Shared properties for the submerge function before aspiration or dispense.", "properties": { "delay": { - "allOf": [ - { - "$ref": "#/definitions/DelayProperties" - } - ], - "description": "Delay settings for submerge.", - "title": "Delay" + "$ref": "#/$defs/DelayProperties", + "description": "Delay settings for submerge." }, "offset": { - "allOf": [ - { - "$ref": "#/definitions/Coordinate" - } - ], - "description": "Relative offset for submerge.", - "title": "Offset" + "$ref": "#/$defs/Coordinate", + "description": "Relative offset for submerge." }, "positionReference": { - "allOf": [ - { - "$ref": "#/definitions/PositionReference" - } - ], + "$ref": "#/$defs/PositionReference", "description": "Position reference for submerge." }, "speed": { @@ -4789,18 +4388,16 @@ "description": "Touch tip command creation request model.", "properties": { "commandType": { + "const": "touchTip", "default": "touchTip", "enum": ["touchTip"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -4808,7 +4405,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/TouchTipParams" + "$ref": "#/$defs/TouchTipParams" } }, "required": ["params"], @@ -4840,13 +4437,8 @@ "type": "number" }, "wellLocation": { - "allOf": [ - { - "$ref": "#/definitions/WellLocation" - } - ], - "description": "Relative well location at which to perform the operation", - "title": "Welllocation" + "$ref": "#/$defs/WellLocation", + "description": "Relative well location at which to perform the operation" }, "wellName": { "description": "Name of well to use in labware.", @@ -4867,11 +4459,7 @@ "type": "boolean" }, "params": { - "allOf": [ - { - "$ref": "#/definitions/LiquidClassTouchTipParams" - } - ], + "$ref": "#/$defs/LiquidClassTouchTipParams", "description": "Parameters for the touch-tip function.", "title": "Params" } @@ -4884,18 +4472,16 @@ "description": "The request model for a `tryLiquidProbe` command.", "properties": { "commandType": { + "const": "tryLiquidProbe", "default": "tryLiquidProbe", "enum": ["tryLiquidProbe"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -4903,7 +4489,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/TryLiquidProbeParams" + "$ref": "#/$defs/TryLiquidProbeParams" } }, "required": ["params"], @@ -4924,13 +4510,8 @@ "type": "string" }, "wellLocation": { - "allOf": [ - { - "$ref": "#/definitions/WellLocation" - } - ], - "description": "Relative well location at which to perform the operation", - "title": "Welllocation" + "$ref": "#/$defs/WellLocation", + "description": "Relative well location at which to perform the operation" }, "wellName": { "description": "Name of well to use in labware.", @@ -4946,18 +4527,16 @@ "description": "UnsafeBlowOutInPlace command request model.", "properties": { "commandType": { + "const": "unsafe/blowOutInPlace", "default": "unsafe/blowOutInPlace", "enum": ["unsafe/blowOutInPlace"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -4965,7 +4544,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/UnsafeBlowOutInPlaceParams" + "$ref": "#/$defs/UnsafeBlowOutInPlaceParams" } }, "required": ["params"], @@ -4977,7 +4556,7 @@ "properties": { "flowRate": { "description": "Speed in \u00b5L/s configured for the pipette", - "exclusiveMinimum": 0, + "exclusiveMinimum": 0.0, "title": "Flowrate", "type": "number" }, @@ -4995,18 +4574,16 @@ "description": "Drop tip in place command creation request model.", "properties": { "commandType": { + "const": "unsafe/dropTipInPlace", "default": "unsafe/dropTipInPlace", "enum": ["unsafe/dropTipInPlace"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5014,7 +4591,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/UnsafeDropTipInPlaceParams" + "$ref": "#/$defs/UnsafeDropTipInPlaceParams" } }, "required": ["params"], @@ -5043,18 +4620,16 @@ "description": "UnsafeEngageAxes command request model.", "properties": { "commandType": { + "const": "unsafe/engageAxes", "default": "unsafe/engageAxes", "enum": ["unsafe/engageAxes"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5062,7 +4637,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/UnsafeEngageAxesParams" + "$ref": "#/$defs/UnsafeEngageAxesParams" } }, "required": ["params"], @@ -5075,8 +4650,9 @@ "axes": { "description": "The axes for which to enable.", "items": { - "$ref": "#/definitions/MotorAxis" + "$ref": "#/$defs/MotorAxis" }, + "title": "Axes", "type": "array" } }, @@ -5088,18 +4664,16 @@ "description": "UnsafePlaceLabware command request model.", "properties": { "commandType": { + "const": "unsafe/placeLabware", "default": "unsafe/placeLabware", "enum": ["unsafe/placeLabware"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5107,7 +4681,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/UnsafePlaceLabwareParams" + "$ref": "#/$defs/UnsafePlaceLabwareParams" } }, "required": ["params"], @@ -5125,16 +4699,16 @@ "location": { "anyOf": [ { - "$ref": "#/definitions/DeckSlotLocation" + "$ref": "#/$defs/DeckSlotLocation" }, { - "$ref": "#/definitions/ModuleLocation" + "$ref": "#/$defs/ModuleLocation" }, { - "$ref": "#/definitions/OnLabwareLocation" + "$ref": "#/$defs/OnLabwareLocation" }, { - "$ref": "#/definitions/AddressableAreaLocation" + "$ref": "#/$defs/AddressableAreaLocation" } ], "description": "Where to place the labware.", @@ -5149,18 +4723,16 @@ "description": "UnsafeEngageAxes command request model.", "properties": { "commandType": { + "const": "unsafe/ungripLabware", "default": "unsafe/ungripLabware", "enum": ["unsafe/ungripLabware"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5168,7 +4740,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/UnsafeUngripLabwareParams" + "$ref": "#/$defs/UnsafeUngripLabwareParams" } }, "required": ["params"], @@ -5185,18 +4757,16 @@ "description": "UpdatePositionEstimators command request model.", "properties": { "commandType": { + "const": "unsafe/updatePositionEstimators", "default": "unsafe/updatePositionEstimators", "enum": ["unsafe/updatePositionEstimators"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5204,7 +4774,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/UpdatePositionEstimatorsParams" + "$ref": "#/$defs/UpdatePositionEstimatorsParams" } }, "required": ["params"], @@ -5217,8 +4787,9 @@ "axes": { "description": "The axes for which to update the position estimators. Any axes that are not physically present will be ignored.", "items": { - "$ref": "#/definitions/MotorAxis" + "$ref": "#/$defs/MotorAxis" }, + "title": "Axes", "type": "array" } }, @@ -5226,8 +4797,7 @@ "title": "UpdatePositionEstimatorsParams", "type": "object" }, - "Vec3f": { - "description": "A 3D vector of floats.", + "Vec3f_float_": { "properties": { "x": { "title": "X", @@ -5243,25 +4813,23 @@ } }, "required": ["x", "y", "z"], - "title": "Vec3f", + "title": "Vec3f[float]", "type": "object" }, "VerifyTipPresenceCreate": { "description": "VerifyTipPresence command creation request model.", "properties": { "commandType": { + "const": "verifyTipPresence", "default": "verifyTipPresence", "enum": ["verifyTipPresence"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5269,7 +4837,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/VerifyTipPresenceParams" + "$ref": "#/$defs/VerifyTipPresenceParams" } }, "required": ["params"], @@ -5280,20 +4848,13 @@ "description": "Payload required for a VerifyTipPresence command.", "properties": { "expectedState": { - "allOf": [ - { - "$ref": "#/definitions/TipPresenceStatus" - } - ], + "$ref": "#/$defs/TipPresenceStatus", "description": "The expected tip presence status on the pipette." }, "followSingularSensor": { - "allOf": [ - { - "$ref": "#/definitions/InstrumentSensorId" - } - ], - "description": "The sensor id to follow if the other can be ignored." + "$ref": "#/$defs/InstrumentSensorId", + "description": "The sensor id to follow if the other can be ignored.", + "title": "Followsingularsensor" }, "pipetteId": { "description": "Identifier of pipette to use for liquid handling.", @@ -5309,18 +4870,16 @@ "description": "A request to create Thermocycler's wait for block temperature command.", "properties": { "commandType": { + "const": "thermocycler/waitForBlockTemperature", "default": "thermocycler/waitForBlockTemperature", "enum": ["thermocycler/waitForBlockTemperature"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5328,7 +4887,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/WaitForBlockTemperatureParams" + "$ref": "#/$defs/WaitForBlockTemperatureParams" } }, "required": ["params"], @@ -5352,18 +4911,16 @@ "description": "Wait for duration command request model.", "properties": { "commandType": { + "const": "waitForDuration", "default": "waitForDuration", "enum": ["waitForDuration"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5371,7 +4928,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/WaitForDurationParams" + "$ref": "#/$defs/WaitForDurationParams" } }, "required": ["params"], @@ -5400,18 +4957,16 @@ "description": "A request to create Thermocycler's wait for lid temperature command.", "properties": { "commandType": { + "const": "thermocycler/waitForLidTemperature", "default": "thermocycler/waitForLidTemperature", "enum": ["thermocycler/waitForLidTemperature"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5419,7 +4974,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/WaitForLidTemperatureParams" + "$ref": "#/$defs/WaitForLidTemperatureParams" } }, "required": ["params"], @@ -5449,12 +5004,9 @@ "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5462,7 +5014,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/WaitForResumeParams" + "$ref": "#/$defs/WaitForResumeParams" } }, "required": ["params"], @@ -5485,14 +5037,10 @@ "description": "A relative location in reference to a well's location.", "properties": { "offset": { - "$ref": "#/definitions/WellOffset" + "$ref": "#/$defs/WellOffset" }, "origin": { - "allOf": [ - { - "$ref": "#/definitions/WellOrigin" - } - ], + "$ref": "#/$defs/WellOrigin", "default": "top" }, "volumeOffset": { @@ -5537,18 +5085,16 @@ "description": "closeGripperJaw command request model.", "properties": { "commandType": { + "const": "robot/closeGripperJaw", "default": "robot/closeGripperJaw", "enum": ["robot/closeGripperJaw"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5556,7 +5102,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/closeGripperJawParams" + "$ref": "#/$defs/closeGripperJawParams" } }, "required": ["params"], @@ -5579,18 +5125,16 @@ "description": "openGripperJaw command request model.", "properties": { "commandType": { + "const": "robot/openGripperJaw", "default": "robot/openGripperJaw", "enum": ["robot/openGripperJaw"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5598,7 +5142,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/openGripperJawParams" + "$ref": "#/$defs/openGripperJawParams" } }, "required": ["params"], @@ -5615,18 +5159,16 @@ "description": "A request to execute an Absorbance Reader close lid command.", "properties": { "commandType": { + "const": "absorbanceReader/closeLid", "default": "absorbanceReader/closeLid", "enum": ["absorbanceReader/closeLid"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5634,7 +5176,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidParams" + "$ref": "#/$defs/opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidParams" } }, "required": ["params"], @@ -5658,18 +5200,16 @@ "description": "A request to execute an Absorbance Reader open lid command.", "properties": { "commandType": { + "const": "absorbanceReader/openLid", "default": "absorbanceReader/openLid", "enum": ["absorbanceReader/openLid"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5677,7 +5217,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidParams" + "$ref": "#/$defs/opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidParams" } }, "required": ["params"], @@ -5701,18 +5241,16 @@ "description": "A request to create a Heater-Shaker's set temperature command.", "properties": { "commandType": { + "const": "heaterShaker/setTargetTemperature", "default": "heaterShaker/setTargetTemperature", "enum": ["heaterShaker/setTargetTemperature"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5720,7 +5258,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/opentrons__protocol_engine__commands__heater_shaker__set_target_temperature__SetTargetTemperatureParams" + "$ref": "#/$defs/opentrons__protocol_engine__commands__heater_shaker__set_target_temperature__SetTargetTemperatureParams" } }, "required": ["params"], @@ -5749,18 +5287,16 @@ "description": "A request to create a Heater-Shaker's wait for temperature command.", "properties": { "commandType": { + "const": "heaterShaker/waitForTemperature", "default": "heaterShaker/waitForTemperature", "enum": ["heaterShaker/waitForTemperature"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5768,7 +5304,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureParams" + "$ref": "#/$defs/opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureParams" } }, "required": ["params"], @@ -5797,18 +5333,16 @@ "description": "A request to create a Temperature Module's set temperature command.", "properties": { "commandType": { + "const": "temperatureModule/setTargetTemperature", "default": "temperatureModule/setTargetTemperature", "enum": ["temperatureModule/setTargetTemperature"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5816,7 +5350,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/opentrons__protocol_engine__commands__temperature_module__set_target_temperature__SetTargetTemperatureParams" + "$ref": "#/$defs/opentrons__protocol_engine__commands__temperature_module__set_target_temperature__SetTargetTemperatureParams" } }, "required": ["params"], @@ -5845,18 +5379,16 @@ "description": "A request to create a Temperature Module's wait for temperature command.", "properties": { "commandType": { + "const": "temperatureModule/waitForTemperature", "default": "temperatureModule/waitForTemperature", "enum": ["temperatureModule/waitForTemperature"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5864,7 +5396,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/opentrons__protocol_engine__commands__temperature_module__wait_for_temperature__WaitForTemperatureParams" + "$ref": "#/$defs/opentrons__protocol_engine__commands__temperature_module__wait_for_temperature__WaitForTemperatureParams" } }, "required": ["params"], @@ -5893,18 +5425,16 @@ "description": "A request to close a Thermocycler's lid.", "properties": { "commandType": { + "const": "thermocycler/closeLid", "default": "thermocycler/closeLid", "enum": ["thermocycler/closeLid"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5912,7 +5442,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidParams" + "$ref": "#/$defs/opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidParams" } }, "required": ["params"], @@ -5936,18 +5466,16 @@ "description": "A request to open a Thermocycler's lid.", "properties": { "commandType": { + "const": "thermocycler/openLid", "default": "thermocycler/openLid", "enum": ["thermocycler/openLid"], "title": "Commandtype", "type": "string" }, "intent": { - "allOf": [ - { - "$ref": "#/definitions/CommandIntent" - } - ], - "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating." + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" }, "key": { "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", @@ -5955,7 +5483,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidParams" + "$ref": "#/$defs/opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidParams" } }, "required": ["params"], @@ -5976,334 +5504,334 @@ "type": "object" } }, - "description": "Model that validates a union of all CommandCreate models.", + "$id": "opentronsCommandSchemaV11", + "$schema": "http://json-schema.org/draft-07/schema#", "discriminator": { "mapping": { - "absorbanceReader/closeLid": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidCreate", - "absorbanceReader/initialize": "#/definitions/InitializeCreate", - "absorbanceReader/openLid": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidCreate", - "absorbanceReader/read": "#/definitions/ReadAbsorbanceCreate", - "airGapInPlace": "#/definitions/AirGapInPlaceCreate", - "aspirate": "#/definitions/AspirateCreate", - "aspirateInPlace": "#/definitions/AspirateInPlaceCreate", - "blowOutInPlace": "#/definitions/BlowOutInPlaceCreate", - "blowout": "#/definitions/BlowOutCreate", - "calibration/calibrateGripper": "#/definitions/CalibrateGripperCreate", - "calibration/calibrateModule": "#/definitions/CalibrateModuleCreate", - "calibration/calibratePipette": "#/definitions/CalibratePipetteCreate", - "calibration/moveToMaintenancePosition": "#/definitions/MoveToMaintenancePositionCreate", - "comment": "#/definitions/CommentCreate", - "configureForVolume": "#/definitions/ConfigureForVolumeCreate", - "configureNozzleLayout": "#/definitions/ConfigureNozzleLayoutCreate", - "custom": "#/definitions/CustomCreate", - "dispense": "#/definitions/DispenseCreate", - "dispenseInPlace": "#/definitions/DispenseInPlaceCreate", - "dropTip": "#/definitions/DropTipCreate", - "dropTipInPlace": "#/definitions/DropTipInPlaceCreate", - "getTipPresence": "#/definitions/GetTipPresenceCreate", - "heaterShaker/closeLabwareLatch": "#/definitions/CloseLabwareLatchCreate", - "heaterShaker/deactivateHeater": "#/definitions/DeactivateHeaterCreate", - "heaterShaker/deactivateShaker": "#/definitions/DeactivateShakerCreate", - "heaterShaker/openLabwareLatch": "#/definitions/OpenLabwareLatchCreate", - "heaterShaker/setAndWaitForShakeSpeed": "#/definitions/SetAndWaitForShakeSpeedCreate", - "heaterShaker/setTargetTemperature": "#/definitions/opentrons__protocol_engine__commands__heater_shaker__set_target_temperature__SetTargetTemperatureCreate", - "heaterShaker/waitForTemperature": "#/definitions/opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureCreate", - "home": "#/definitions/HomeCreate", - "liquidProbe": "#/definitions/LiquidProbeCreate", - "loadLabware": "#/definitions/LoadLabwareCreate", - "loadLiquid": "#/definitions/LoadLiquidCreate", - "loadLiquidClass": "#/definitions/LoadLiquidClassCreate", - "loadModule": "#/definitions/LoadModuleCreate", - "loadPipette": "#/definitions/LoadPipetteCreate", - "magneticModule/disengage": "#/definitions/DisengageCreate", - "magneticModule/engage": "#/definitions/EngageCreate", - "moveLabware": "#/definitions/MoveLabwareCreate", - "moveRelative": "#/definitions/MoveRelativeCreate", - "moveToAddressableArea": "#/definitions/MoveToAddressableAreaCreate", - "moveToAddressableAreaForDropTip": "#/definitions/MoveToAddressableAreaForDropTipCreate", - "moveToCoordinates": "#/definitions/MoveToCoordinatesCreate", - "moveToWell": "#/definitions/MoveToWellCreate", - "pause": "#/definitions/WaitForResumeCreate", - "pickUpTip": "#/definitions/PickUpTipCreate", - "prepareToAspirate": "#/definitions/PrepareToAspirateCreate", - "reloadLabware": "#/definitions/ReloadLabwareCreate", - "retractAxis": "#/definitions/RetractAxisCreate", - "robot/closeGripperJaw": "#/definitions/closeGripperJawCreate", - "robot/moveAxesRelative": "#/definitions/MoveAxesRelativeCreate", - "robot/moveAxesTo": "#/definitions/MoveAxesToCreate", - "robot/moveTo": "#/definitions/MoveToCreate", - "robot/openGripperJaw": "#/definitions/openGripperJawCreate", - "savePosition": "#/definitions/SavePositionCreate", - "setRailLights": "#/definitions/SetRailLightsCreate", - "setStatusBar": "#/definitions/SetStatusBarCreate", - "temperatureModule/deactivate": "#/definitions/DeactivateTemperatureCreate", - "temperatureModule/setTargetTemperature": "#/definitions/opentrons__protocol_engine__commands__temperature_module__set_target_temperature__SetTargetTemperatureCreate", - "temperatureModule/waitForTemperature": "#/definitions/opentrons__protocol_engine__commands__temperature_module__wait_for_temperature__WaitForTemperatureCreate", - "thermocycler/closeLid": "#/definitions/opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidCreate", - "thermocycler/deactivateBlock": "#/definitions/DeactivateBlockCreate", - "thermocycler/deactivateLid": "#/definitions/DeactivateLidCreate", - "thermocycler/openLid": "#/definitions/opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidCreate", - "thermocycler/runExtendedProfile": "#/definitions/RunExtendedProfileCreate", - "thermocycler/runProfile": "#/definitions/RunProfileCreate", - "thermocycler/setTargetBlockTemperature": "#/definitions/SetTargetBlockTemperatureCreate", - "thermocycler/setTargetLidTemperature": "#/definitions/SetTargetLidTemperatureCreate", - "thermocycler/waitForBlockTemperature": "#/definitions/WaitForBlockTemperatureCreate", - "thermocycler/waitForLidTemperature": "#/definitions/WaitForLidTemperatureCreate", - "touchTip": "#/definitions/TouchTipCreate", - "tryLiquidProbe": "#/definitions/TryLiquidProbeCreate", - "unsafe/blowOutInPlace": "#/definitions/UnsafeBlowOutInPlaceCreate", - "unsafe/dropTipInPlace": "#/definitions/UnsafeDropTipInPlaceCreate", - "unsafe/engageAxes": "#/definitions/UnsafeEngageAxesCreate", - "unsafe/placeLabware": "#/definitions/UnsafePlaceLabwareCreate", - "unsafe/ungripLabware": "#/definitions/UnsafeUngripLabwareCreate", - "unsafe/updatePositionEstimators": "#/definitions/UpdatePositionEstimatorsCreate", - "verifyTipPresence": "#/definitions/VerifyTipPresenceCreate", - "waitForDuration": "#/definitions/WaitForDurationCreate", - "waitForResume": "#/definitions/WaitForResumeCreate" + "absorbanceReader/closeLid": "#/$defs/opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidCreate", + "absorbanceReader/initialize": "#/$defs/InitializeCreate", + "absorbanceReader/openLid": "#/$defs/opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidCreate", + "absorbanceReader/read": "#/$defs/ReadAbsorbanceCreate", + "airGapInPlace": "#/$defs/AirGapInPlaceCreate", + "aspirate": "#/$defs/AspirateCreate", + "aspirateInPlace": "#/$defs/AspirateInPlaceCreate", + "blowOutInPlace": "#/$defs/BlowOutInPlaceCreate", + "blowout": "#/$defs/BlowOutCreate", + "calibration/calibrateGripper": "#/$defs/CalibrateGripperCreate", + "calibration/calibrateModule": "#/$defs/CalibrateModuleCreate", + "calibration/calibratePipette": "#/$defs/CalibratePipetteCreate", + "calibration/moveToMaintenancePosition": "#/$defs/MoveToMaintenancePositionCreate", + "comment": "#/$defs/CommentCreate", + "configureForVolume": "#/$defs/ConfigureForVolumeCreate", + "configureNozzleLayout": "#/$defs/ConfigureNozzleLayoutCreate", + "custom": "#/$defs/CustomCreate", + "dispense": "#/$defs/DispenseCreate", + "dispenseInPlace": "#/$defs/DispenseInPlaceCreate", + "dropTip": "#/$defs/DropTipCreate", + "dropTipInPlace": "#/$defs/DropTipInPlaceCreate", + "getTipPresence": "#/$defs/GetTipPresenceCreate", + "heaterShaker/closeLabwareLatch": "#/$defs/CloseLabwareLatchCreate", + "heaterShaker/deactivateHeater": "#/$defs/DeactivateHeaterCreate", + "heaterShaker/deactivateShaker": "#/$defs/DeactivateShakerCreate", + "heaterShaker/openLabwareLatch": "#/$defs/OpenLabwareLatchCreate", + "heaterShaker/setAndWaitForShakeSpeed": "#/$defs/SetAndWaitForShakeSpeedCreate", + "heaterShaker/setTargetTemperature": "#/$defs/opentrons__protocol_engine__commands__heater_shaker__set_target_temperature__SetTargetTemperatureCreate", + "heaterShaker/waitForTemperature": "#/$defs/opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureCreate", + "home": "#/$defs/HomeCreate", + "liquidProbe": "#/$defs/LiquidProbeCreate", + "loadLabware": "#/$defs/LoadLabwareCreate", + "loadLiquid": "#/$defs/LoadLiquidCreate", + "loadLiquidClass": "#/$defs/LoadLiquidClassCreate", + "loadModule": "#/$defs/LoadModuleCreate", + "loadPipette": "#/$defs/LoadPipetteCreate", + "magneticModule/disengage": "#/$defs/DisengageCreate", + "magneticModule/engage": "#/$defs/EngageCreate", + "moveLabware": "#/$defs/MoveLabwareCreate", + "moveRelative": "#/$defs/MoveRelativeCreate", + "moveToAddressableArea": "#/$defs/MoveToAddressableAreaCreate", + "moveToAddressableAreaForDropTip": "#/$defs/MoveToAddressableAreaForDropTipCreate", + "moveToCoordinates": "#/$defs/MoveToCoordinatesCreate", + "moveToWell": "#/$defs/MoveToWellCreate", + "pause": "#/$defs/WaitForResumeCreate", + "pickUpTip": "#/$defs/PickUpTipCreate", + "prepareToAspirate": "#/$defs/PrepareToAspirateCreate", + "reloadLabware": "#/$defs/ReloadLabwareCreate", + "retractAxis": "#/$defs/RetractAxisCreate", + "robot/closeGripperJaw": "#/$defs/closeGripperJawCreate", + "robot/moveAxesRelative": "#/$defs/MoveAxesRelativeCreate", + "robot/moveAxesTo": "#/$defs/MoveAxesToCreate", + "robot/moveTo": "#/$defs/MoveToCreate", + "robot/openGripperJaw": "#/$defs/openGripperJawCreate", + "savePosition": "#/$defs/SavePositionCreate", + "setRailLights": "#/$defs/SetRailLightsCreate", + "setStatusBar": "#/$defs/SetStatusBarCreate", + "temperatureModule/deactivate": "#/$defs/DeactivateTemperatureCreate", + "temperatureModule/setTargetTemperature": "#/$defs/opentrons__protocol_engine__commands__temperature_module__set_target_temperature__SetTargetTemperatureCreate", + "temperatureModule/waitForTemperature": "#/$defs/opentrons__protocol_engine__commands__temperature_module__wait_for_temperature__WaitForTemperatureCreate", + "thermocycler/closeLid": "#/$defs/opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidCreate", + "thermocycler/deactivateBlock": "#/$defs/DeactivateBlockCreate", + "thermocycler/deactivateLid": "#/$defs/DeactivateLidCreate", + "thermocycler/openLid": "#/$defs/opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidCreate", + "thermocycler/runExtendedProfile": "#/$defs/RunExtendedProfileCreate", + "thermocycler/runProfile": "#/$defs/RunProfileCreate", + "thermocycler/setTargetBlockTemperature": "#/$defs/SetTargetBlockTemperatureCreate", + "thermocycler/setTargetLidTemperature": "#/$defs/SetTargetLidTemperatureCreate", + "thermocycler/waitForBlockTemperature": "#/$defs/WaitForBlockTemperatureCreate", + "thermocycler/waitForLidTemperature": "#/$defs/WaitForLidTemperatureCreate", + "touchTip": "#/$defs/TouchTipCreate", + "tryLiquidProbe": "#/$defs/TryLiquidProbeCreate", + "unsafe/blowOutInPlace": "#/$defs/UnsafeBlowOutInPlaceCreate", + "unsafe/dropTipInPlace": "#/$defs/UnsafeDropTipInPlaceCreate", + "unsafe/engageAxes": "#/$defs/UnsafeEngageAxesCreate", + "unsafe/placeLabware": "#/$defs/UnsafePlaceLabwareCreate", + "unsafe/ungripLabware": "#/$defs/UnsafeUngripLabwareCreate", + "unsafe/updatePositionEstimators": "#/$defs/UpdatePositionEstimatorsCreate", + "verifyTipPresence": "#/$defs/VerifyTipPresenceCreate", + "waitForDuration": "#/$defs/WaitForDurationCreate", + "waitForResume": "#/$defs/WaitForResumeCreate" }, "propertyName": "commandType" }, "oneOf": [ { - "$ref": "#/definitions/AirGapInPlaceCreate" + "$ref": "#/$defs/AirGapInPlaceCreate" }, { - "$ref": "#/definitions/AspirateCreate" + "$ref": "#/$defs/AspirateCreate" }, { - "$ref": "#/definitions/AspirateInPlaceCreate" + "$ref": "#/$defs/AspirateInPlaceCreate" }, { - "$ref": "#/definitions/CommentCreate" + "$ref": "#/$defs/CommentCreate" }, { - "$ref": "#/definitions/ConfigureForVolumeCreate" + "$ref": "#/$defs/ConfigureForVolumeCreate" }, { - "$ref": "#/definitions/ConfigureNozzleLayoutCreate" + "$ref": "#/$defs/ConfigureNozzleLayoutCreate" }, { - "$ref": "#/definitions/CustomCreate" + "$ref": "#/$defs/CustomCreate" }, { - "$ref": "#/definitions/DispenseCreate" + "$ref": "#/$defs/DispenseCreate" }, { - "$ref": "#/definitions/DispenseInPlaceCreate" + "$ref": "#/$defs/DispenseInPlaceCreate" }, { - "$ref": "#/definitions/BlowOutCreate" + "$ref": "#/$defs/BlowOutCreate" }, { - "$ref": "#/definitions/BlowOutInPlaceCreate" + "$ref": "#/$defs/BlowOutInPlaceCreate" }, { - "$ref": "#/definitions/DropTipCreate" + "$ref": "#/$defs/DropTipCreate" }, { - "$ref": "#/definitions/DropTipInPlaceCreate" + "$ref": "#/$defs/DropTipInPlaceCreate" }, { - "$ref": "#/definitions/HomeCreate" + "$ref": "#/$defs/HomeCreate" }, { - "$ref": "#/definitions/RetractAxisCreate" + "$ref": "#/$defs/RetractAxisCreate" }, { - "$ref": "#/definitions/LoadLabwareCreate" + "$ref": "#/$defs/LoadLabwareCreate" }, { - "$ref": "#/definitions/ReloadLabwareCreate" + "$ref": "#/$defs/ReloadLabwareCreate" }, { - "$ref": "#/definitions/LoadLiquidCreate" + "$ref": "#/$defs/LoadLiquidCreate" }, { - "$ref": "#/definitions/LoadLiquidClassCreate" + "$ref": "#/$defs/LoadLiquidClassCreate" }, { - "$ref": "#/definitions/LoadModuleCreate" + "$ref": "#/$defs/LoadModuleCreate" }, { - "$ref": "#/definitions/LoadPipetteCreate" + "$ref": "#/$defs/LoadPipetteCreate" }, { - "$ref": "#/definitions/MoveLabwareCreate" + "$ref": "#/$defs/MoveLabwareCreate" }, { - "$ref": "#/definitions/MoveRelativeCreate" + "$ref": "#/$defs/MoveRelativeCreate" }, { - "$ref": "#/definitions/MoveToCoordinatesCreate" + "$ref": "#/$defs/MoveToCoordinatesCreate" }, { - "$ref": "#/definitions/MoveToWellCreate" + "$ref": "#/$defs/MoveToWellCreate" }, { - "$ref": "#/definitions/MoveToAddressableAreaCreate" + "$ref": "#/$defs/MoveToAddressableAreaCreate" }, { - "$ref": "#/definitions/MoveToAddressableAreaForDropTipCreate" + "$ref": "#/$defs/MoveToAddressableAreaForDropTipCreate" }, { - "$ref": "#/definitions/PrepareToAspirateCreate" + "$ref": "#/$defs/PrepareToAspirateCreate" }, { - "$ref": "#/definitions/WaitForResumeCreate" + "$ref": "#/$defs/WaitForResumeCreate" }, { - "$ref": "#/definitions/WaitForDurationCreate" + "$ref": "#/$defs/WaitForDurationCreate" }, { - "$ref": "#/definitions/PickUpTipCreate" + "$ref": "#/$defs/PickUpTipCreate" }, { - "$ref": "#/definitions/SavePositionCreate" + "$ref": "#/$defs/SavePositionCreate" }, { - "$ref": "#/definitions/SetRailLightsCreate" + "$ref": "#/$defs/SetRailLightsCreate" }, { - "$ref": "#/definitions/TouchTipCreate" + "$ref": "#/$defs/TouchTipCreate" }, { - "$ref": "#/definitions/SetStatusBarCreate" + "$ref": "#/$defs/SetStatusBarCreate" }, { - "$ref": "#/definitions/VerifyTipPresenceCreate" + "$ref": "#/$defs/VerifyTipPresenceCreate" }, { - "$ref": "#/definitions/GetTipPresenceCreate" + "$ref": "#/$defs/GetTipPresenceCreate" }, { - "$ref": "#/definitions/LiquidProbeCreate" + "$ref": "#/$defs/LiquidProbeCreate" }, { - "$ref": "#/definitions/TryLiquidProbeCreate" + "$ref": "#/$defs/TryLiquidProbeCreate" }, { - "$ref": "#/definitions/opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureCreate" + "$ref": "#/$defs/opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureCreate" }, { - "$ref": "#/definitions/opentrons__protocol_engine__commands__heater_shaker__set_target_temperature__SetTargetTemperatureCreate" + "$ref": "#/$defs/opentrons__protocol_engine__commands__heater_shaker__set_target_temperature__SetTargetTemperatureCreate" }, { - "$ref": "#/definitions/DeactivateHeaterCreate" + "$ref": "#/$defs/DeactivateHeaterCreate" }, { - "$ref": "#/definitions/SetAndWaitForShakeSpeedCreate" + "$ref": "#/$defs/SetAndWaitForShakeSpeedCreate" }, { - "$ref": "#/definitions/DeactivateShakerCreate" + "$ref": "#/$defs/DeactivateShakerCreate" }, { - "$ref": "#/definitions/OpenLabwareLatchCreate" + "$ref": "#/$defs/OpenLabwareLatchCreate" }, { - "$ref": "#/definitions/CloseLabwareLatchCreate" + "$ref": "#/$defs/CloseLabwareLatchCreate" }, { - "$ref": "#/definitions/DisengageCreate" + "$ref": "#/$defs/DisengageCreate" }, { - "$ref": "#/definitions/EngageCreate" + "$ref": "#/$defs/EngageCreate" }, { - "$ref": "#/definitions/opentrons__protocol_engine__commands__temperature_module__set_target_temperature__SetTargetTemperatureCreate" + "$ref": "#/$defs/opentrons__protocol_engine__commands__temperature_module__set_target_temperature__SetTargetTemperatureCreate" }, { - "$ref": "#/definitions/opentrons__protocol_engine__commands__temperature_module__wait_for_temperature__WaitForTemperatureCreate" + "$ref": "#/$defs/opentrons__protocol_engine__commands__temperature_module__wait_for_temperature__WaitForTemperatureCreate" }, { - "$ref": "#/definitions/DeactivateTemperatureCreate" + "$ref": "#/$defs/DeactivateTemperatureCreate" }, { - "$ref": "#/definitions/SetTargetBlockTemperatureCreate" + "$ref": "#/$defs/SetTargetBlockTemperatureCreate" }, { - "$ref": "#/definitions/WaitForBlockTemperatureCreate" + "$ref": "#/$defs/WaitForBlockTemperatureCreate" }, { - "$ref": "#/definitions/SetTargetLidTemperatureCreate" + "$ref": "#/$defs/SetTargetLidTemperatureCreate" }, { - "$ref": "#/definitions/WaitForLidTemperatureCreate" + "$ref": "#/$defs/WaitForLidTemperatureCreate" }, { - "$ref": "#/definitions/DeactivateBlockCreate" + "$ref": "#/$defs/DeactivateBlockCreate" }, { - "$ref": "#/definitions/DeactivateLidCreate" + "$ref": "#/$defs/DeactivateLidCreate" }, { - "$ref": "#/definitions/opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidCreate" + "$ref": "#/$defs/opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidCreate" }, { - "$ref": "#/definitions/opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidCreate" + "$ref": "#/$defs/opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidCreate" }, { - "$ref": "#/definitions/RunProfileCreate" + "$ref": "#/$defs/RunProfileCreate" }, { - "$ref": "#/definitions/RunExtendedProfileCreate" + "$ref": "#/$defs/RunExtendedProfileCreate" }, { - "$ref": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidCreate" + "$ref": "#/$defs/opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidCreate" }, { - "$ref": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidCreate" + "$ref": "#/$defs/opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidCreate" }, { - "$ref": "#/definitions/InitializeCreate" + "$ref": "#/$defs/InitializeCreate" }, { - "$ref": "#/definitions/ReadAbsorbanceCreate" + "$ref": "#/$defs/ReadAbsorbanceCreate" }, { - "$ref": "#/definitions/CalibrateGripperCreate" + "$ref": "#/$defs/CalibrateGripperCreate" }, { - "$ref": "#/definitions/CalibratePipetteCreate" + "$ref": "#/$defs/CalibratePipetteCreate" }, { - "$ref": "#/definitions/CalibrateModuleCreate" + "$ref": "#/$defs/CalibrateModuleCreate" }, { - "$ref": "#/definitions/MoveToMaintenancePositionCreate" + "$ref": "#/$defs/MoveToMaintenancePositionCreate" }, { - "$ref": "#/definitions/UnsafeBlowOutInPlaceCreate" + "$ref": "#/$defs/UnsafeBlowOutInPlaceCreate" }, { - "$ref": "#/definitions/UnsafeDropTipInPlaceCreate" + "$ref": "#/$defs/UnsafeDropTipInPlaceCreate" }, { - "$ref": "#/definitions/UpdatePositionEstimatorsCreate" + "$ref": "#/$defs/UpdatePositionEstimatorsCreate" }, { - "$ref": "#/definitions/UnsafeEngageAxesCreate" + "$ref": "#/$defs/UnsafeEngageAxesCreate" }, { - "$ref": "#/definitions/UnsafeUngripLabwareCreate" + "$ref": "#/$defs/UnsafeUngripLabwareCreate" }, { - "$ref": "#/definitions/UnsafePlaceLabwareCreate" + "$ref": "#/$defs/UnsafePlaceLabwareCreate" }, { - "$ref": "#/definitions/MoveAxesRelativeCreate" + "$ref": "#/$defs/MoveAxesRelativeCreate" }, { - "$ref": "#/definitions/MoveAxesToCreate" + "$ref": "#/$defs/MoveAxesToCreate" }, { - "$ref": "#/definitions/MoveToCreate" + "$ref": "#/$defs/MoveToCreate" }, { - "$ref": "#/definitions/openGripperJawCreate" + "$ref": "#/$defs/openGripperJawCreate" }, { - "$ref": "#/definitions/closeGripperJawCreate" + "$ref": "#/$defs/closeGripperJawCreate" } - ], - "title": "CreateCommandUnion" + ] } diff --git a/shared-data/python/opentrons_shared_data/liquid_classes/liquid_class_definition.py b/shared-data/python/opentrons_shared_data/liquid_classes/liquid_class_definition.py index c9b70c4f55b..5ef526712f7 100644 --- a/shared-data/python/opentrons_shared_data/liquid_classes/liquid_class_definition.py +++ b/shared-data/python/opentrons_shared_data/liquid_classes/liquid_class_definition.py @@ -1,7 +1,7 @@ """Python shared data models for liquid class definitions.""" from enum import Enum -from typing import TYPE_CHECKING, Literal, Union, Optional, Sequence, Tuple +from typing import TYPE_CHECKING, Literal, Union, Optional, Sequence, Tuple, Any from pydantic import ( BaseModel, @@ -13,6 +13,7 @@ StrictInt, StrictFloat, ) +from pydantic.json_schema import SkipJsonSchema if TYPE_CHECKING: @@ -36,6 +37,10 @@ """Settings for correctionByVolume, which unlike other `byVolume` properties allows negative values with volume.""" +def _remove_default(s: dict[str, Any]) -> None: + s.pop("default") + + class PositionReference(Enum): """Positional reference for liquid handling operations.""" @@ -73,8 +78,10 @@ class DelayProperties(BaseModel): """Shared properties for delay..""" enable: bool = Field(..., description="Whether delay is enabled.") - params: Optional[DelayParams] = Field( - None, description="Parameters for the delay function." + params: DelayParams | SkipJsonSchema[None] = Field( + None, + description="Parameters for the delay function.", + json_schema_extra=_remove_default, ) @field_validator("params") @@ -110,8 +117,10 @@ class TouchTipProperties(BaseModel): """Shared properties for the touch-tip function.""" enable: bool = Field(..., description="Whether touch-tip is enabled.") - params: Optional[LiquidClassTouchTipParams] = Field( - None, description="Parameters for the touch-tip function." + params: LiquidClassTouchTipParams | SkipJsonSchema[None] = Field( + None, + description="Parameters for the touch-tip function.", + json_schema_extra=_remove_default, ) @field_validator("params") @@ -139,8 +148,10 @@ class MixProperties(BaseModel): """Mixing properties.""" enable: bool = Field(..., description="Whether mix is enabled.") - params: Optional[MixParams] = Field( - None, description="Parameters for the mix function." + params: MixParams | SkipJsonSchema[None] = Field( + None, + description="Parameters for the mix function.", + json_schema_extra=_remove_default, ) @field_validator("params") @@ -168,8 +179,10 @@ class BlowoutProperties(BaseModel): """Blowout properties.""" enable: bool = Field(..., description="Whether blow-out is enabled.") - params: Optional[BlowoutParams] = Field( - None, description="Parameters for the blowout function." + params: BlowoutParams | SkipJsonSchema[None] = Field( + None, + description="Parameters for the blowout function.", + json_schema_extra=_remove_default, ) @field_validator("params") @@ -349,8 +362,9 @@ class ByTipTypeSetting(BaseModel): singleDispense: SingleDispenseProperties = Field( ..., description="Single dispense parameters for this tip type." ) - multiDispense: Optional[MultiDispenseProperties] = Field( - None, description="Optional multi-dispense parameters for this tip type." + multiDispense: MultiDispenseProperties | SkipJsonSchema[None] = Field( + None, description="Optional multi-dispense parameters for this tip type.", + json_schema_extra=_remove_default, )