opentrons 8.2.0a4__py2.py3-none-any.whl → 8.3.0a1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of opentrons might be problematic. Click here for more details.

Files changed (229) hide show
  1. opentrons/calibration_storage/deck_configuration.py +3 -3
  2. opentrons/calibration_storage/file_operators.py +3 -3
  3. opentrons/calibration_storage/helpers.py +3 -1
  4. opentrons/calibration_storage/ot2/models/v1.py +16 -29
  5. opentrons/calibration_storage/ot2/tip_length.py +7 -4
  6. opentrons/calibration_storage/ot3/models/v1.py +14 -23
  7. opentrons/cli/analyze.py +18 -6
  8. opentrons/config/defaults_ot3.py +1 -0
  9. opentrons/drivers/asyncio/communication/__init__.py +2 -0
  10. opentrons/drivers/asyncio/communication/errors.py +16 -3
  11. opentrons/drivers/asyncio/communication/serial_connection.py +24 -9
  12. opentrons/drivers/command_builder.py +2 -2
  13. opentrons/drivers/flex_stacker/__init__.py +9 -0
  14. opentrons/drivers/flex_stacker/abstract.py +89 -0
  15. opentrons/drivers/flex_stacker/driver.py +260 -0
  16. opentrons/drivers/flex_stacker/simulator.py +109 -0
  17. opentrons/drivers/flex_stacker/types.py +138 -0
  18. opentrons/drivers/heater_shaker/driver.py +18 -3
  19. opentrons/drivers/temp_deck/driver.py +13 -3
  20. opentrons/drivers/thermocycler/driver.py +17 -3
  21. opentrons/execute.py +3 -1
  22. opentrons/hardware_control/__init__.py +1 -2
  23. opentrons/hardware_control/api.py +28 -20
  24. opentrons/hardware_control/backends/flex_protocol.py +17 -7
  25. opentrons/hardware_control/backends/ot3controller.py +213 -63
  26. opentrons/hardware_control/backends/ot3simulator.py +18 -9
  27. opentrons/hardware_control/backends/ot3utils.py +43 -15
  28. opentrons/hardware_control/dev_types.py +4 -0
  29. opentrons/hardware_control/emulation/heater_shaker.py +4 -0
  30. opentrons/hardware_control/emulation/module_server/client.py +1 -1
  31. opentrons/hardware_control/emulation/module_server/server.py +5 -3
  32. opentrons/hardware_control/emulation/settings.py +3 -4
  33. opentrons/hardware_control/instruments/ot2/instrument_calibration.py +2 -1
  34. opentrons/hardware_control/instruments/ot2/pipette.py +15 -22
  35. opentrons/hardware_control/instruments/ot2/pipette_handler.py +8 -1
  36. opentrons/hardware_control/instruments/ot3/gripper.py +2 -2
  37. opentrons/hardware_control/instruments/ot3/pipette.py +23 -22
  38. opentrons/hardware_control/instruments/ot3/pipette_handler.py +10 -1
  39. opentrons/hardware_control/modules/mod_abc.py +2 -2
  40. opentrons/hardware_control/motion_utilities.py +68 -0
  41. opentrons/hardware_control/nozzle_manager.py +39 -41
  42. opentrons/hardware_control/ot3_calibration.py +1 -1
  43. opentrons/hardware_control/ot3api.py +60 -23
  44. opentrons/hardware_control/protocols/gripper_controller.py +3 -0
  45. opentrons/hardware_control/protocols/hardware_manager.py +5 -1
  46. opentrons/hardware_control/protocols/liquid_handler.py +18 -0
  47. opentrons/hardware_control/protocols/motion_controller.py +6 -0
  48. opentrons/hardware_control/robot_calibration.py +1 -1
  49. opentrons/hardware_control/types.py +61 -0
  50. opentrons/protocol_api/__init__.py +20 -1
  51. opentrons/protocol_api/_liquid.py +24 -49
  52. opentrons/protocol_api/_liquid_properties.py +754 -0
  53. opentrons/protocol_api/_types.py +24 -0
  54. opentrons/protocol_api/core/common.py +2 -0
  55. opentrons/protocol_api/core/engine/instrument.py +82 -10
  56. opentrons/protocol_api/core/engine/labware.py +29 -7
  57. opentrons/protocol_api/core/engine/protocol.py +130 -5
  58. opentrons/protocol_api/core/engine/robot.py +139 -0
  59. opentrons/protocol_api/core/engine/well.py +4 -1
  60. opentrons/protocol_api/core/instrument.py +46 -4
  61. opentrons/protocol_api/core/labware.py +13 -4
  62. opentrons/protocol_api/core/legacy/legacy_instrument_core.py +37 -3
  63. opentrons/protocol_api/core/legacy/legacy_labware_core.py +13 -4
  64. opentrons/protocol_api/core/legacy/legacy_protocol_core.py +32 -1
  65. opentrons/protocol_api/core/legacy/legacy_robot_core.py +0 -0
  66. opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +37 -3
  67. opentrons/protocol_api/core/protocol.py +34 -1
  68. opentrons/protocol_api/core/robot.py +51 -0
  69. opentrons/protocol_api/instrument_context.py +158 -44
  70. opentrons/protocol_api/labware.py +231 -7
  71. opentrons/protocol_api/module_contexts.py +21 -17
  72. opentrons/protocol_api/protocol_context.py +125 -4
  73. opentrons/protocol_api/robot_context.py +204 -32
  74. opentrons/protocol_api/validation.py +262 -3
  75. opentrons/protocol_engine/__init__.py +4 -0
  76. opentrons/protocol_engine/actions/actions.py +2 -3
  77. opentrons/protocol_engine/clients/sync_client.py +18 -0
  78. opentrons/protocol_engine/commands/__init__.py +81 -0
  79. opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +0 -2
  80. opentrons/protocol_engine/commands/absorbance_reader/initialize.py +19 -5
  81. opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +0 -1
  82. opentrons/protocol_engine/commands/absorbance_reader/read.py +32 -9
  83. opentrons/protocol_engine/commands/air_gap_in_place.py +160 -0
  84. opentrons/protocol_engine/commands/aspirate.py +103 -53
  85. opentrons/protocol_engine/commands/aspirate_in_place.py +55 -51
  86. opentrons/protocol_engine/commands/blow_out.py +44 -39
  87. opentrons/protocol_engine/commands/blow_out_in_place.py +21 -32
  88. opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +13 -6
  89. opentrons/protocol_engine/commands/calibration/calibrate_module.py +1 -1
  90. opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +3 -3
  91. opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +1 -1
  92. opentrons/protocol_engine/commands/command.py +73 -66
  93. opentrons/protocol_engine/commands/command_unions.py +101 -1
  94. opentrons/protocol_engine/commands/comment.py +1 -1
  95. opentrons/protocol_engine/commands/configure_for_volume.py +10 -3
  96. opentrons/protocol_engine/commands/configure_nozzle_layout.py +6 -4
  97. opentrons/protocol_engine/commands/custom.py +6 -12
  98. opentrons/protocol_engine/commands/dispense.py +82 -48
  99. opentrons/protocol_engine/commands/dispense_in_place.py +71 -51
  100. opentrons/protocol_engine/commands/drop_tip.py +52 -31
  101. opentrons/protocol_engine/commands/drop_tip_in_place.py +13 -3
  102. opentrons/protocol_engine/commands/generate_command_schema.py +4 -11
  103. opentrons/protocol_engine/commands/get_next_tip.py +134 -0
  104. opentrons/protocol_engine/commands/get_tip_presence.py +1 -1
  105. opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +1 -1
  106. opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +1 -1
  107. opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +1 -1
  108. opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +1 -1
  109. opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +1 -1
  110. opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +1 -1
  111. opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +10 -4
  112. opentrons/protocol_engine/commands/home.py +13 -4
  113. opentrons/protocol_engine/commands/liquid_probe.py +67 -24
  114. opentrons/protocol_engine/commands/load_labware.py +29 -7
  115. opentrons/protocol_engine/commands/load_lid.py +146 -0
  116. opentrons/protocol_engine/commands/load_lid_stack.py +189 -0
  117. opentrons/protocol_engine/commands/load_liquid.py +12 -4
  118. opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
  119. opentrons/protocol_engine/commands/load_module.py +31 -10
  120. opentrons/protocol_engine/commands/load_pipette.py +19 -8
  121. opentrons/protocol_engine/commands/magnetic_module/disengage.py +1 -1
  122. opentrons/protocol_engine/commands/magnetic_module/engage.py +1 -1
  123. opentrons/protocol_engine/commands/move_labware.py +19 -6
  124. opentrons/protocol_engine/commands/move_relative.py +35 -25
  125. opentrons/protocol_engine/commands/move_to_addressable_area.py +40 -27
  126. opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +53 -32
  127. opentrons/protocol_engine/commands/move_to_coordinates.py +36 -22
  128. opentrons/protocol_engine/commands/move_to_well.py +40 -24
  129. opentrons/protocol_engine/commands/movement_common.py +338 -0
  130. opentrons/protocol_engine/commands/pick_up_tip.py +49 -27
  131. opentrons/protocol_engine/commands/pipetting_common.py +169 -87
  132. opentrons/protocol_engine/commands/prepare_to_aspirate.py +24 -33
  133. opentrons/protocol_engine/commands/reload_labware.py +1 -1
  134. opentrons/protocol_engine/commands/retract_axis.py +1 -1
  135. opentrons/protocol_engine/commands/robot/__init__.py +69 -0
  136. opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +86 -0
  137. opentrons/protocol_engine/commands/robot/common.py +18 -0
  138. opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
  139. opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
  140. opentrons/protocol_engine/commands/robot/move_to.py +94 -0
  141. opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +77 -0
  142. opentrons/protocol_engine/commands/save_position.py +14 -5
  143. opentrons/protocol_engine/commands/set_rail_lights.py +1 -1
  144. opentrons/protocol_engine/commands/set_status_bar.py +1 -1
  145. opentrons/protocol_engine/commands/temperature_module/deactivate.py +1 -1
  146. opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +1 -1
  147. opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +10 -4
  148. opentrons/protocol_engine/commands/thermocycler/close_lid.py +1 -1
  149. opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +1 -1
  150. opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +1 -1
  151. opentrons/protocol_engine/commands/thermocycler/open_lid.py +1 -1
  152. opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +8 -2
  153. opentrons/protocol_engine/commands/thermocycler/run_profile.py +9 -3
  154. opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +11 -4
  155. opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +1 -1
  156. opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +1 -1
  157. opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +1 -1
  158. opentrons/protocol_engine/commands/touch_tip.py +65 -16
  159. opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +4 -1
  160. opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +12 -3
  161. opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +1 -4
  162. opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +1 -4
  163. opentrons/protocol_engine/commands/verify_tip_presence.py +11 -4
  164. opentrons/protocol_engine/commands/wait_for_duration.py +10 -3
  165. opentrons/protocol_engine/commands/wait_for_resume.py +10 -3
  166. opentrons/protocol_engine/errors/__init__.py +8 -0
  167. opentrons/protocol_engine/errors/error_occurrence.py +19 -20
  168. opentrons/protocol_engine/errors/exceptions.py +50 -0
  169. opentrons/protocol_engine/execution/command_executor.py +1 -1
  170. opentrons/protocol_engine/execution/equipment.py +73 -5
  171. opentrons/protocol_engine/execution/gantry_mover.py +364 -8
  172. opentrons/protocol_engine/execution/movement.py +27 -0
  173. opentrons/protocol_engine/execution/pipetting.py +5 -1
  174. opentrons/protocol_engine/execution/tip_handler.py +4 -6
  175. opentrons/protocol_engine/notes/notes.py +1 -1
  176. opentrons/protocol_engine/protocol_engine.py +7 -6
  177. opentrons/protocol_engine/resources/labware_data_provider.py +1 -1
  178. opentrons/protocol_engine/resources/labware_validation.py +5 -0
  179. opentrons/protocol_engine/resources/module_data_provider.py +1 -1
  180. opentrons/protocol_engine/resources/pipette_data_provider.py +26 -0
  181. opentrons/protocol_engine/slot_standardization.py +9 -9
  182. opentrons/protocol_engine/state/_move_types.py +9 -5
  183. opentrons/protocol_engine/state/_well_math.py +193 -0
  184. opentrons/protocol_engine/state/addressable_areas.py +25 -61
  185. opentrons/protocol_engine/state/command_history.py +12 -0
  186. opentrons/protocol_engine/state/commands.py +17 -13
  187. opentrons/protocol_engine/state/files.py +10 -12
  188. opentrons/protocol_engine/state/fluid_stack.py +138 -0
  189. opentrons/protocol_engine/state/frustum_helpers.py +57 -32
  190. opentrons/protocol_engine/state/geometry.py +47 -1
  191. opentrons/protocol_engine/state/labware.py +79 -25
  192. opentrons/protocol_engine/state/liquid_classes.py +82 -0
  193. opentrons/protocol_engine/state/liquids.py +16 -4
  194. opentrons/protocol_engine/state/modules.py +52 -70
  195. opentrons/protocol_engine/state/motion.py +6 -1
  196. opentrons/protocol_engine/state/pipettes.py +144 -58
  197. opentrons/protocol_engine/state/state.py +21 -2
  198. opentrons/protocol_engine/state/state_summary.py +4 -2
  199. opentrons/protocol_engine/state/tips.py +11 -44
  200. opentrons/protocol_engine/state/update_types.py +343 -48
  201. opentrons/protocol_engine/state/wells.py +19 -11
  202. opentrons/protocol_engine/types.py +176 -28
  203. opentrons/protocol_reader/extract_labware_definitions.py +5 -2
  204. opentrons/protocol_reader/file_format_validator.py +5 -5
  205. opentrons/protocol_runner/json_file_reader.py +9 -3
  206. opentrons/protocol_runner/json_translator.py +51 -25
  207. opentrons/protocol_runner/legacy_command_mapper.py +66 -64
  208. opentrons/protocol_runner/protocol_runner.py +35 -4
  209. opentrons/protocol_runner/python_protocol_wrappers.py +1 -1
  210. opentrons/protocol_runner/run_orchestrator.py +13 -3
  211. opentrons/protocols/advanced_control/common.py +38 -0
  212. opentrons/protocols/advanced_control/mix.py +1 -1
  213. opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
  214. opentrons/protocols/advanced_control/transfers/common.py +56 -0
  215. opentrons/protocols/advanced_control/{transfers.py → transfers/transfer.py} +10 -85
  216. opentrons/protocols/api_support/definitions.py +1 -1
  217. opentrons/protocols/api_support/instrument.py +1 -1
  218. opentrons/protocols/api_support/util.py +10 -0
  219. opentrons/protocols/labware.py +39 -6
  220. opentrons/protocols/models/json_protocol.py +5 -9
  221. opentrons/simulate.py +3 -1
  222. opentrons/types.py +162 -2
  223. opentrons/util/logging_config.py +1 -1
  224. {opentrons-8.2.0a4.dist-info → opentrons-8.3.0a1.dist-info}/METADATA +16 -15
  225. {opentrons-8.2.0a4.dist-info → opentrons-8.3.0a1.dist-info}/RECORD +229 -202
  226. {opentrons-8.2.0a4.dist-info → opentrons-8.3.0a1.dist-info}/WHEEL +1 -1
  227. {opentrons-8.2.0a4.dist-info → opentrons-8.3.0a1.dist-info}/LICENSE +0 -0
  228. {opentrons-8.2.0a4.dist-info → opentrons-8.3.0a1.dist-info}/entry_points.txt +0 -0
  229. {opentrons-8.2.0a4.dist-info → opentrons-8.3.0a1.dist-info}/top_level.txt +0 -0
@@ -1,10 +1,11 @@
1
1
  """Models and implementation for the calibrateGripper command."""
2
2
 
3
3
  from enum import Enum
4
- from typing import Optional, Type
4
+ from typing import Optional, Type, Any
5
5
  from typing_extensions import Literal
6
6
 
7
7
  from pydantic import BaseModel, Field
8
+ from pydantic.json_schema import SkipJsonSchema
8
9
 
9
10
  from opentrons.types import Point
10
11
  from opentrons.hardware_control import HardwareControlAPI
@@ -22,6 +23,10 @@ from opentrons.protocol_engine.resources import ensure_ot3_hardware
22
23
  CalibrateGripperCommandType = Literal["calibration/calibrateGripper"]
23
24
 
24
25
 
26
+ def _remove_default(s: dict[str, Any]) -> None:
27
+ s.pop("default", None)
28
+
29
+
25
30
  class CalibrateGripperParamsJaw(Enum): # noqa: D101
26
31
  FRONT = "front"
27
32
  REAR = "rear"
@@ -39,7 +44,7 @@ class CalibrateGripperParams(BaseModel):
39
44
  ),
40
45
  )
41
46
 
42
- otherJawOffset: Optional[Vec3f] = Field(
47
+ otherJawOffset: Vec3f | SkipJsonSchema[None] = Field(
43
48
  None,
44
49
  description=(
45
50
  "If an offset for the other probe is already found, then specifying it here"
@@ -48,6 +53,7 @@ class CalibrateGripperParams(BaseModel):
48
53
  " If this param is not specified then the command will only find and return"
49
54
  " the offset for the specified probe."
50
55
  ),
56
+ json_schema_extra=_remove_default,
51
57
  )
52
58
 
53
59
 
@@ -62,11 +68,12 @@ class CalibrateGripperResult(BaseModel):
62
68
  ),
63
69
  )
64
70
 
65
- savedCalibration: Optional[GripperCalibrationOffset] = Field(
71
+ savedCalibration: GripperCalibrationOffset | SkipJsonSchema[None] = Field(
66
72
  None,
67
73
  description=(
68
74
  "Gripper calibration result data, when `otherJawOffset` is provided."
69
75
  ),
76
+ json_schema_extra=_remove_default,
70
77
  )
71
78
 
72
79
 
@@ -118,8 +125,8 @@ class CalibrateGripperImplementation(
118
125
  calibration_data = result
119
126
 
120
127
  return SuccessData(
121
- public=CalibrateGripperResult.construct(
122
- jawOffset=Vec3f.construct(
128
+ public=CalibrateGripperResult.model_construct(
129
+ jawOffset=Vec3f.model_construct(
123
130
  x=probe_offset.x, y=probe_offset.y, z=probe_offset.z
124
131
  ),
125
132
  savedCalibration=calibration_data,
@@ -143,7 +150,7 @@ class CalibrateGripper(
143
150
 
144
151
  commandType: CalibrateGripperCommandType = "calibration/calibrateGripper"
145
152
  params: CalibrateGripperParams
146
- result: Optional[CalibrateGripperResult]
153
+ result: Optional[CalibrateGripperResult] = None
147
154
 
148
155
  _ImplementationCls: Type[
149
156
  CalibrateGripperImplementation
@@ -101,7 +101,7 @@ class CalibrateModule(
101
101
 
102
102
  commandType: CalibrateModuleCommandType = "calibration/calibrateModule"
103
103
  params: CalibrateModuleParams
104
- result: Optional[CalibrateModuleResult]
104
+ result: Optional[CalibrateModuleResult] = None
105
105
 
106
106
  _ImplementationCls: Type[
107
107
  CalibrateModuleImplementation
@@ -65,8 +65,8 @@ class CalibratePipetteImplementation(
65
65
  await ot3_api.save_instrument_offset(mount=ot3_mount, delta=pipette_offset)
66
66
 
67
67
  return SuccessData(
68
- public=CalibratePipetteResult.construct(
69
- pipetteOffset=InstrumentOffsetVector.construct(
68
+ public=CalibratePipetteResult.model_construct(
69
+ pipetteOffset=InstrumentOffsetVector.model_construct(
70
70
  x=pipette_offset.x, y=pipette_offset.y, z=pipette_offset.z
71
71
  )
72
72
  ),
@@ -80,7 +80,7 @@ class CalibratePipette(
80
80
 
81
81
  commandType: CalibratePipetteCommandType = "calibration/calibratePipette"
82
82
  params: CalibratePipetteParams
83
- result: Optional[CalibratePipetteResult]
83
+ result: Optional[CalibratePipetteResult] = None
84
84
 
85
85
  _ImplementationCls: Type[
86
86
  CalibratePipetteImplementation
@@ -136,7 +136,7 @@ class MoveToMaintenancePosition(
136
136
  "calibration/moveToMaintenancePosition"
137
137
  )
138
138
  params: MoveToMaintenancePositionParams
139
- result: Optional[MoveToMaintenancePositionResult]
139
+ result: Optional[MoveToMaintenancePositionResult] = None
140
140
 
141
141
  _ImplementationCls: Type[
142
142
  MoveToMaintenancePositionImplementation
@@ -1,12 +1,11 @@
1
1
  """Base command data model and type definitions."""
2
2
 
3
-
4
3
  from __future__ import annotations
5
4
 
6
5
  import dataclasses
7
6
  from abc import ABC, abstractmethod
8
7
  from datetime import datetime
9
- from enum import Enum
8
+ import enum
10
9
  from typing import (
11
10
  TYPE_CHECKING,
12
11
  Generic,
@@ -15,10 +14,12 @@ from typing import (
15
14
  List,
16
15
  Type,
17
16
  Union,
17
+ Any,
18
+ Dict,
18
19
  )
19
20
 
20
21
  from pydantic import BaseModel, Field
21
- from pydantic.generics import GenericModel
22
+ from pydantic.json_schema import SkipJsonSchema
22
23
 
23
24
  from opentrons.hardware_control import HardwareControlAPI
24
25
  from opentrons.protocol_engine.state.update_types import StateUpdate
@@ -41,7 +42,7 @@ _ErrorT = TypeVar("_ErrorT", bound=ErrorOccurrence)
41
42
  _ErrorT_co = TypeVar("_ErrorT_co", bound=ErrorOccurrence, covariant=True)
42
43
 
43
44
 
44
- class CommandStatus(str, Enum):
45
+ class CommandStatus(str, enum.Enum):
45
46
  """Command execution status."""
46
47
 
47
48
  QUEUED = "queued"
@@ -50,7 +51,7 @@ class CommandStatus(str, Enum):
50
51
  FAILED = "failed"
51
52
 
52
53
 
53
- class CommandIntent(str, Enum):
54
+ class CommandIntent(str, enum.Enum):
54
55
  """Run intent for a given command.
55
56
 
56
57
  Props:
@@ -63,8 +64,12 @@ class CommandIntent(str, Enum):
63
64
  FIXIT = "fixit"
64
65
 
65
66
 
67
+ def _pop_default(s: Dict[str, Any]) -> None:
68
+ s.pop("default", None)
69
+
70
+
66
71
  class BaseCommandCreate(
67
- GenericModel,
72
+ BaseModel,
68
73
  # These type parameters need to be invariant because our fields are mutable.
69
74
  Generic[_ParamsT],
70
75
  ):
@@ -82,7 +87,7 @@ class BaseCommandCreate(
82
87
  ),
83
88
  )
84
89
  params: _ParamsT = Field(..., description="Command execution data payload")
85
- intent: Optional[CommandIntent] = Field(
90
+ intent: CommandIntent | SkipJsonSchema[None] = Field(
86
91
  None,
87
92
  description=(
88
93
  "The reason the command was added. If not specified or `protocol`,"
@@ -95,14 +100,16 @@ class BaseCommandCreate(
95
100
  "Use setup commands for activities like pre-run calibration checks"
96
101
  " and module setup, like pre-heating."
97
102
  ),
103
+ json_schema_extra=_pop_default,
98
104
  )
99
- key: Optional[str] = Field(
105
+ key: str | SkipJsonSchema[None] = Field(
100
106
  None,
101
107
  description=(
102
108
  "A key value, unique in this run, that can be used to track"
103
109
  " the same logical command across multiple runs of the same protocol."
104
110
  " If a value is not provided, one will be generated."
105
111
  ),
112
+ json_schema_extra=_pop_default,
106
113
  )
107
114
 
108
115
 
@@ -144,8 +151,65 @@ class DefinedErrorData(Generic[_ErrorT_co]):
144
151
  )
145
152
 
146
153
 
154
+ _ExecuteReturnT_co = TypeVar(
155
+ "_ExecuteReturnT_co",
156
+ bound=Union[
157
+ SuccessData[BaseModel],
158
+ DefinedErrorData[ErrorOccurrence],
159
+ ],
160
+ covariant=True,
161
+ )
162
+
163
+
164
+ class AbstractCommandImpl(
165
+ ABC,
166
+ Generic[_ParamsT_contra, _ExecuteReturnT_co],
167
+ ):
168
+ """Abstract command creation and execution implementation.
169
+
170
+ A given command request should map to a specific command implementation,
171
+ which defines how to execute the command and map data from execution into the
172
+ result model.
173
+ """
174
+
175
+ def __init__(
176
+ self,
177
+ state_view: StateView,
178
+ hardware_api: HardwareControlAPI,
179
+ equipment: execution.EquipmentHandler,
180
+ file_provider: execution.FileProvider,
181
+ movement: execution.MovementHandler,
182
+ gantry_mover: execution.GantryMover,
183
+ labware_movement: execution.LabwareMovementHandler,
184
+ pipetting: execution.PipettingHandler,
185
+ tip_handler: execution.TipHandler,
186
+ run_control: execution.RunControlHandler,
187
+ rail_lights: execution.RailLightsHandler,
188
+ model_utils: ModelUtils,
189
+ status_bar: execution.StatusBarHandler,
190
+ command_note_adder: CommandNoteAdder,
191
+ ) -> None:
192
+ """Initialize the command implementation with execution handlers."""
193
+ pass
194
+
195
+ @abstractmethod
196
+ async def execute(self, params: _ParamsT_contra) -> _ExecuteReturnT_co:
197
+ """Execute the command, mapping data from execution into a response model.
198
+
199
+ This should either:
200
+
201
+ - Return a `SuccessData`, if the command completed normally.
202
+ - Return a `DefinedErrorData`, if the command failed with a "defined error."
203
+ Defined errors are errors that are documented as part of the robot's public
204
+ API.
205
+ - Raise an exception, if the command failed with any other error
206
+ (in other words, an undefined error).
207
+ """
208
+ ...
209
+
210
+
147
211
  class BaseCommand(
148
- GenericModel,
212
+ BaseModel,
149
213
  # These type parameters need to be invariant because our fields are mutable.
150
214
  Generic[_ParamsT, _ResultT, _ErrorT],
151
215
  ):
@@ -242,60 +306,3 @@ class BaseCommand(
242
306
  ],
243
307
  ]
244
308
  ]
245
-
246
-
247
- _ExecuteReturnT_co = TypeVar(
248
- "_ExecuteReturnT_co",
249
- bound=Union[
250
- SuccessData[BaseModel],
251
- DefinedErrorData[ErrorOccurrence],
252
- ],
253
- covariant=True,
254
- )
255
-
256
-
257
- class AbstractCommandImpl(
258
- ABC,
259
- Generic[_ParamsT_contra, _ExecuteReturnT_co],
260
- ):
261
- """Abstract command creation and execution implementation.
262
-
263
- A given command request should map to a specific command implementation,
264
- which defines how to execute the command and map data from execution into the
265
- result model.
266
- """
267
-
268
- def __init__(
269
- self,
270
- state_view: StateView,
271
- hardware_api: HardwareControlAPI,
272
- equipment: execution.EquipmentHandler,
273
- file_provider: execution.FileProvider,
274
- movement: execution.MovementHandler,
275
- gantry_mover: execution.GantryMover,
276
- labware_movement: execution.LabwareMovementHandler,
277
- pipetting: execution.PipettingHandler,
278
- tip_handler: execution.TipHandler,
279
- run_control: execution.RunControlHandler,
280
- rail_lights: execution.RailLightsHandler,
281
- model_utils: ModelUtils,
282
- status_bar: execution.StatusBarHandler,
283
- command_note_adder: CommandNoteAdder,
284
- ) -> None:
285
- """Initialize the command implementation with execution handlers."""
286
- pass
287
-
288
- @abstractmethod
289
- async def execute(self, params: _ParamsT_contra) -> _ExecuteReturnT_co:
290
- """Execute the command, mapping data from execution into a response model.
291
-
292
- This should either:
293
-
294
- - Return a `SuccessData`, if the command completed normally.
295
- - Return a `DefinedErrorData`, if the command failed with a "defined error."
296
- Defined errors are errors that are documented as part of the robot's public
297
- API.
298
- - Raise an exception, if the command failed with any other error
299
- (in other words, an undefined error).
300
- """
301
- ...
@@ -3,7 +3,7 @@
3
3
  from collections.abc import Collection
4
4
  from typing import Annotated, Type, Union, get_type_hints
5
5
 
6
- from pydantic import Field
6
+ from pydantic import Field, TypeAdapter
7
7
 
8
8
  from opentrons.util.get_union_elements import get_union_elements
9
9
 
@@ -13,6 +13,7 @@ from .pipetting_common import (
13
13
  LiquidNotFoundError,
14
14
  TipPhysicallyAttachedError,
15
15
  )
16
+ from .movement_common import StallOrCollisionError
16
17
 
17
18
  from . import absorbance_reader
18
19
  from . import heater_shaker
@@ -22,6 +23,7 @@ from . import thermocycler
22
23
 
23
24
  from . import calibration
24
25
  from . import unsafe
26
+ from . import robot
25
27
 
26
28
  from .set_rail_lights import (
27
29
  SetRailLights,
@@ -31,6 +33,14 @@ from .set_rail_lights import (
31
33
  SetRailLightsResult,
32
34
  )
33
35
 
36
+ from .air_gap_in_place import (
37
+ AirGapInPlace,
38
+ AirGapInPlaceParams,
39
+ AirGapInPlaceCreate,
40
+ AirGapInPlaceResult,
41
+ AirGapInPlaceCommandType,
42
+ )
43
+
34
44
  from .aspirate import (
35
45
  Aspirate,
36
46
  AspirateParams,
@@ -127,6 +137,14 @@ from .load_liquid import (
127
137
  LoadLiquidCommandType,
128
138
  )
129
139
 
140
+ from .load_liquid_class import (
141
+ LoadLiquidClass,
142
+ LoadLiquidClassParams,
143
+ LoadLiquidClassCreate,
144
+ LoadLiquidClassResult,
145
+ LoadLiquidClassCommandType,
146
+ )
147
+
130
148
  from .load_module import (
131
149
  LoadModule,
132
150
  LoadModuleParams,
@@ -143,6 +161,22 @@ from .load_pipette import (
143
161
  LoadPipetteCommandType,
144
162
  )
145
163
 
164
+ from .load_lid_stack import (
165
+ LoadLidStack,
166
+ LoadLidStackParams,
167
+ LoadLidStackCreate,
168
+ LoadLidStackResult,
169
+ LoadLidStackCommandType,
170
+ )
171
+
172
+ from .load_lid import (
173
+ LoadLid,
174
+ LoadLidParams,
175
+ LoadLidCreate,
176
+ LoadLidResult,
177
+ LoadLidCommandType,
178
+ )
179
+
146
180
  from .move_labware import (
147
181
  GripperMovementError,
148
182
  MoveLabware,
@@ -305,6 +339,14 @@ from .get_tip_presence import (
305
339
  GetTipPresenceCommandType,
306
340
  )
307
341
 
342
+ from .get_next_tip import (
343
+ GetNextTip,
344
+ GetNextTipCreate,
345
+ GetNextTipParams,
346
+ GetNextTipResult,
347
+ GetNextTipCommandType,
348
+ )
349
+
308
350
  from .liquid_probe import (
309
351
  LiquidProbe,
310
352
  LiquidProbeParams,
@@ -320,6 +362,7 @@ from .liquid_probe import (
320
362
 
321
363
  Command = Annotated[
322
364
  Union[
365
+ AirGapInPlace,
323
366
  Aspirate,
324
367
  AspirateInPlace,
325
368
  Comment,
@@ -337,8 +380,11 @@ Command = Annotated[
337
380
  LoadLabware,
338
381
  ReloadLabware,
339
382
  LoadLiquid,
383
+ LoadLiquidClass,
340
384
  LoadModule,
341
385
  LoadPipette,
386
+ LoadLidStack,
387
+ LoadLid,
342
388
  MoveLabware,
343
389
  MoveRelative,
344
390
  MoveToCoordinates,
@@ -355,6 +401,7 @@ Command = Annotated[
355
401
  SetStatusBar,
356
402
  VerifyTipPresence,
357
403
  GetTipPresence,
404
+ GetNextTip,
358
405
  LiquidProbe,
359
406
  TryLiquidProbe,
360
407
  heater_shaker.WaitForTemperature,
@@ -393,11 +440,17 @@ Command = Annotated[
393
440
  unsafe.UnsafeEngageAxes,
394
441
  unsafe.UnsafeUngripLabware,
395
442
  unsafe.UnsafePlaceLabware,
443
+ robot.MoveTo,
444
+ robot.MoveAxesRelative,
445
+ robot.MoveAxesTo,
446
+ robot.openGripperJaw,
447
+ robot.closeGripperJaw,
396
448
  ],
397
449
  Field(discriminator="commandType"),
398
450
  ]
399
451
 
400
452
  CommandParams = Union[
453
+ AirGapInPlaceParams,
401
454
  AspirateParams,
402
455
  AspirateInPlaceParams,
403
456
  CommentParams,
@@ -413,8 +466,11 @@ CommandParams = Union[
413
466
  HomeParams,
414
467
  RetractAxisParams,
415
468
  LoadLabwareParams,
469
+ LoadLidStackParams,
470
+ LoadLidParams,
416
471
  ReloadLabwareParams,
417
472
  LoadLiquidParams,
473
+ LoadLiquidClassParams,
418
474
  LoadModuleParams,
419
475
  LoadPipetteParams,
420
476
  MoveLabwareParams,
@@ -433,6 +489,7 @@ CommandParams = Union[
433
489
  SetStatusBarParams,
434
490
  VerifyTipPresenceParams,
435
491
  GetTipPresenceParams,
492
+ GetNextTipParams,
436
493
  LiquidProbeParams,
437
494
  TryLiquidProbeParams,
438
495
  heater_shaker.WaitForTemperatureParams,
@@ -471,9 +528,15 @@ CommandParams = Union[
471
528
  unsafe.UnsafeEngageAxesParams,
472
529
  unsafe.UnsafeUngripLabwareParams,
473
530
  unsafe.UnsafePlaceLabwareParams,
531
+ robot.MoveAxesRelativeParams,
532
+ robot.MoveAxesToParams,
533
+ robot.MoveToParams,
534
+ robot.openGripperJawParams,
535
+ robot.closeGripperJawParams,
474
536
  ]
475
537
 
476
538
  CommandType = Union[
539
+ AirGapInPlaceCommandType,
477
540
  AspirateCommandType,
478
541
  AspirateInPlaceCommandType,
479
542
  CommentCommandType,
@@ -491,8 +554,11 @@ CommandType = Union[
491
554
  LoadLabwareCommandType,
492
555
  ReloadLabwareCommandType,
493
556
  LoadLiquidCommandType,
557
+ LoadLiquidClassCommandType,
494
558
  LoadModuleCommandType,
495
559
  LoadPipetteCommandType,
560
+ LoadLidStackCommandType,
561
+ LoadLidCommandType,
496
562
  MoveLabwareCommandType,
497
563
  MoveRelativeCommandType,
498
564
  MoveToCoordinatesCommandType,
@@ -509,6 +575,7 @@ CommandType = Union[
509
575
  SetStatusBarCommandType,
510
576
  VerifyTipPresenceCommandType,
511
577
  GetTipPresenceCommandType,
578
+ GetNextTipCommandType,
512
579
  LiquidProbeCommandType,
513
580
  TryLiquidProbeCommandType,
514
581
  heater_shaker.WaitForTemperatureCommandType,
@@ -547,10 +614,16 @@ CommandType = Union[
547
614
  unsafe.UnsafeEngageAxesCommandType,
548
615
  unsafe.UnsafeUngripLabwareCommandType,
549
616
  unsafe.UnsafePlaceLabwareCommandType,
617
+ robot.MoveAxesRelativeCommandType,
618
+ robot.MoveAxesToCommandType,
619
+ robot.MoveToCommandType,
620
+ robot.openGripperJawCommandType,
621
+ robot.closeGripperJawCommandType,
550
622
  ]
551
623
 
552
624
  CommandCreate = Annotated[
553
625
  Union[
626
+ AirGapInPlaceCreate,
554
627
  AspirateCreate,
555
628
  AspirateInPlaceCreate,
556
629
  CommentCreate,
@@ -568,8 +641,11 @@ CommandCreate = Annotated[
568
641
  LoadLabwareCreate,
569
642
  ReloadLabwareCreate,
570
643
  LoadLiquidCreate,
644
+ LoadLiquidClassCreate,
571
645
  LoadModuleCreate,
572
646
  LoadPipetteCreate,
647
+ LoadLidStackCreate,
648
+ LoadLidCreate,
573
649
  MoveLabwareCreate,
574
650
  MoveRelativeCreate,
575
651
  MoveToCoordinatesCreate,
@@ -586,6 +662,7 @@ CommandCreate = Annotated[
586
662
  SetStatusBarCreate,
587
663
  VerifyTipPresenceCreate,
588
664
  GetTipPresenceCreate,
665
+ GetNextTipCreate,
589
666
  LiquidProbeCreate,
590
667
  TryLiquidProbeCreate,
591
668
  heater_shaker.WaitForTemperatureCreate,
@@ -624,11 +701,24 @@ CommandCreate = Annotated[
624
701
  unsafe.UnsafeEngageAxesCreate,
625
702
  unsafe.UnsafeUngripLabwareCreate,
626
703
  unsafe.UnsafePlaceLabwareCreate,
704
+ robot.MoveAxesRelativeCreate,
705
+ robot.MoveAxesToCreate,
706
+ robot.MoveToCreate,
707
+ robot.openGripperJawCreate,
708
+ robot.closeGripperJawCreate,
627
709
  ],
628
710
  Field(discriminator="commandType"),
629
711
  ]
630
712
 
713
+ # Each time a TypeAdapter is instantiated, it will construct a new validator and
714
+ # serializer. To improve performance, TypeAdapters are instantiated once.
715
+ # See https://docs.pydantic.dev/latest/concepts/performance/#typeadapter-instantiated-once
716
+ CommandCreateAdapter: TypeAdapter[CommandCreate] = TypeAdapter(CommandCreate)
717
+
718
+ CommandAdapter: TypeAdapter[Command] = TypeAdapter(Command)
719
+
631
720
  CommandResult = Union[
721
+ AirGapInPlaceResult,
632
722
  AspirateResult,
633
723
  AspirateInPlaceResult,
634
724
  CommentResult,
@@ -646,8 +736,11 @@ CommandResult = Union[
646
736
  LoadLabwareResult,
647
737
  ReloadLabwareResult,
648
738
  LoadLiquidResult,
739
+ LoadLiquidClassResult,
649
740
  LoadModuleResult,
650
741
  LoadPipetteResult,
742
+ LoadLidStackResult,
743
+ LoadLidResult,
651
744
  MoveLabwareResult,
652
745
  MoveRelativeResult,
653
746
  MoveToCoordinatesResult,
@@ -664,6 +757,7 @@ CommandResult = Union[
664
757
  SetStatusBarResult,
665
758
  VerifyTipPresenceResult,
666
759
  GetTipPresenceResult,
760
+ GetNextTipResult,
667
761
  LiquidProbeResult,
668
762
  TryLiquidProbeResult,
669
763
  heater_shaker.WaitForTemperatureResult,
@@ -702,6 +796,11 @@ CommandResult = Union[
702
796
  unsafe.UnsafeEngageAxesResult,
703
797
  unsafe.UnsafeUngripLabwareResult,
704
798
  unsafe.UnsafePlaceLabwareResult,
799
+ robot.MoveAxesRelativeResult,
800
+ robot.MoveAxesToResult,
801
+ robot.MoveToResult,
802
+ robot.openGripperJawResult,
803
+ robot.closeGripperJawResult,
705
804
  ]
706
805
 
707
806
 
@@ -712,6 +811,7 @@ CommandDefinedErrorData = Union[
712
811
  DefinedErrorData[OverpressureError],
713
812
  DefinedErrorData[LiquidNotFoundError],
714
813
  DefinedErrorData[GripperMovementError],
814
+ DefinedErrorData[StallOrCollisionError],
715
815
  ]
716
816
 
717
817
 
@@ -43,7 +43,7 @@ class Comment(BaseCommand[CommentParams, CommentResult, ErrorOccurrence]):
43
43
 
44
44
  commandType: CommentCommandType = "comment"
45
45
  params: CommentParams
46
- result: Optional[CommentResult]
46
+ result: Optional[CommentResult] = None
47
47
 
48
48
  _ImplementationCls: Type[CommentImplementation] = CommentImplementation
49
49
 
@@ -1,7 +1,9 @@
1
1
  """Configure for volume command request, result, and implementation models."""
2
2
  from __future__ import annotations
3
+ from typing import TYPE_CHECKING, Optional, Type, Any
4
+
3
5
  from pydantic import BaseModel, Field
4
- from typing import TYPE_CHECKING, Optional, Type
6
+ from pydantic.json_schema import SkipJsonSchema
5
7
  from typing_extensions import Literal
6
8
 
7
9
  from .pipetting_common import PipetteIdMixin
@@ -16,6 +18,10 @@ if TYPE_CHECKING:
16
18
  ConfigureForVolumeCommandType = Literal["configureForVolume"]
17
19
 
18
20
 
21
+ def _remove_default(s: dict[str, Any]) -> None:
22
+ s.pop("default", None)
23
+
24
+
19
25
  class ConfigureForVolumeParams(PipetteIdMixin):
20
26
  """Parameters required to configure volume for a specific pipette."""
21
27
 
@@ -25,12 +31,13 @@ class ConfigureForVolumeParams(PipetteIdMixin):
25
31
  "than a pipette-specific maximum volume.",
26
32
  ge=0,
27
33
  )
28
- tipOverlapNotAfterVersion: Optional[str] = Field(
34
+ tipOverlapNotAfterVersion: str | SkipJsonSchema[None] = Field(
29
35
  None,
30
36
  description="A version of tip overlap data to not exceed. The highest-versioned "
31
37
  "tip overlap data that does not exceed this version will be used. Versions are "
32
38
  "expressed as vN where N is an integer, counting up from v0. If None, the current "
33
39
  "highest version will be used.",
40
+ json_schema_extra=_remove_default,
34
41
  )
35
42
 
36
43
 
@@ -81,7 +88,7 @@ class ConfigureForVolume(
81
88
 
82
89
  commandType: ConfigureForVolumeCommandType = "configureForVolume"
83
90
  params: ConfigureForVolumeParams
84
- result: Optional[ConfigureForVolumeResult]
91
+ result: Optional[ConfigureForVolumeResult] = None
85
92
 
86
93
  _ImplementationCls: Type[
87
94
  ConfigureForVolumeImplementation
@@ -61,9 +61,11 @@ class ConfigureNozzleLayoutImplementation(
61
61
  self, params: ConfigureNozzleLayoutParams
62
62
  ) -> SuccessData[ConfigureNozzleLayoutResult]:
63
63
  """Check that requested pipette can support the requested nozzle layout."""
64
- primary_nozzle = params.configurationParams.dict().get("primaryNozzle")
65
- front_right_nozzle = params.configurationParams.dict().get("frontRightNozzle")
66
- back_left_nozzle = params.configurationParams.dict().get("backLeftNozzle")
64
+ primary_nozzle = params.configurationParams.model_dump().get("primaryNozzle")
65
+ front_right_nozzle = params.configurationParams.model_dump().get(
66
+ "frontRightNozzle"
67
+ )
68
+ back_left_nozzle = params.configurationParams.model_dump().get("backLeftNozzle")
67
69
  nozzle_params = await self._tip_handler.available_for_nozzle_layout(
68
70
  pipette_id=params.pipetteId,
69
71
  style=params.configurationParams.style,
@@ -97,7 +99,7 @@ class ConfigureNozzleLayout(
97
99
 
98
100
  commandType: ConfigureNozzleLayoutCommandType = "configureNozzleLayout"
99
101
  params: ConfigureNozzleLayoutParams
100
- result: Optional[ConfigureNozzleLayoutResult]
102
+ result: Optional[ConfigureNozzleLayoutResult] = None
101
103
 
102
104
  _ImplementationCls: Type[
103
105
  ConfigureNozzleLayoutImplementation