opentrons 8.2.0a3__py2.py3-none-any.whl → 8.3.0__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.
Files changed (238) 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 +33 -21
  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 +78 -31
  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 +22 -1
  47. opentrons/hardware_control/protocols/motion_controller.py +7 -0
  48. opentrons/hardware_control/robot_calibration.py +1 -1
  49. opentrons/hardware_control/types.py +61 -0
  50. opentrons/legacy_commands/commands.py +37 -0
  51. opentrons/legacy_commands/types.py +39 -0
  52. opentrons/protocol_api/__init__.py +20 -1
  53. opentrons/protocol_api/_liquid.py +24 -49
  54. opentrons/protocol_api/_liquid_properties.py +754 -0
  55. opentrons/protocol_api/_types.py +24 -0
  56. opentrons/protocol_api/core/common.py +2 -0
  57. opentrons/protocol_api/core/engine/instrument.py +191 -10
  58. opentrons/protocol_api/core/engine/labware.py +29 -7
  59. opentrons/protocol_api/core/engine/protocol.py +130 -5
  60. opentrons/protocol_api/core/engine/robot.py +139 -0
  61. opentrons/protocol_api/core/engine/well.py +4 -1
  62. opentrons/protocol_api/core/instrument.py +73 -4
  63. opentrons/protocol_api/core/labware.py +13 -4
  64. opentrons/protocol_api/core/legacy/legacy_instrument_core.py +87 -3
  65. opentrons/protocol_api/core/legacy/legacy_labware_core.py +13 -4
  66. opentrons/protocol_api/core/legacy/legacy_protocol_core.py +32 -1
  67. opentrons/protocol_api/core/legacy/legacy_robot_core.py +0 -0
  68. opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +61 -3
  69. opentrons/protocol_api/core/protocol.py +34 -1
  70. opentrons/protocol_api/core/robot.py +51 -0
  71. opentrons/protocol_api/instrument_context.py +299 -44
  72. opentrons/protocol_api/labware.py +248 -9
  73. opentrons/protocol_api/module_contexts.py +21 -17
  74. opentrons/protocol_api/protocol_context.py +125 -4
  75. opentrons/protocol_api/robot_context.py +204 -32
  76. opentrons/protocol_api/validation.py +262 -3
  77. opentrons/protocol_engine/__init__.py +4 -0
  78. opentrons/protocol_engine/actions/actions.py +2 -3
  79. opentrons/protocol_engine/clients/sync_client.py +18 -0
  80. opentrons/protocol_engine/commands/__init__.py +121 -0
  81. opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +1 -3
  82. opentrons/protocol_engine/commands/absorbance_reader/initialize.py +20 -6
  83. opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +1 -2
  84. opentrons/protocol_engine/commands/absorbance_reader/read.py +40 -10
  85. opentrons/protocol_engine/commands/air_gap_in_place.py +160 -0
  86. opentrons/protocol_engine/commands/aspirate.py +103 -53
  87. opentrons/protocol_engine/commands/aspirate_in_place.py +55 -51
  88. opentrons/protocol_engine/commands/blow_out.py +44 -39
  89. opentrons/protocol_engine/commands/blow_out_in_place.py +21 -32
  90. opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +13 -6
  91. opentrons/protocol_engine/commands/calibration/calibrate_module.py +1 -1
  92. opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +3 -3
  93. opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +1 -1
  94. opentrons/protocol_engine/commands/command.py +73 -66
  95. opentrons/protocol_engine/commands/command_unions.py +140 -1
  96. opentrons/protocol_engine/commands/comment.py +1 -1
  97. opentrons/protocol_engine/commands/configure_for_volume.py +10 -3
  98. opentrons/protocol_engine/commands/configure_nozzle_layout.py +6 -4
  99. opentrons/protocol_engine/commands/custom.py +6 -12
  100. opentrons/protocol_engine/commands/dispense.py +82 -48
  101. opentrons/protocol_engine/commands/dispense_in_place.py +71 -51
  102. opentrons/protocol_engine/commands/drop_tip.py +52 -31
  103. opentrons/protocol_engine/commands/drop_tip_in_place.py +79 -8
  104. opentrons/protocol_engine/commands/evotip_dispense.py +156 -0
  105. opentrons/protocol_engine/commands/evotip_seal_pipette.py +331 -0
  106. opentrons/protocol_engine/commands/evotip_unseal_pipette.py +160 -0
  107. opentrons/protocol_engine/commands/generate_command_schema.py +4 -11
  108. opentrons/protocol_engine/commands/get_next_tip.py +134 -0
  109. opentrons/protocol_engine/commands/get_tip_presence.py +1 -1
  110. opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +1 -1
  111. opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +1 -1
  112. opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +1 -1
  113. opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +1 -1
  114. opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +1 -1
  115. opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +1 -1
  116. opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +10 -4
  117. opentrons/protocol_engine/commands/home.py +13 -4
  118. opentrons/protocol_engine/commands/liquid_probe.py +125 -31
  119. opentrons/protocol_engine/commands/load_labware.py +33 -6
  120. opentrons/protocol_engine/commands/load_lid.py +146 -0
  121. opentrons/protocol_engine/commands/load_lid_stack.py +189 -0
  122. opentrons/protocol_engine/commands/load_liquid.py +12 -4
  123. opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
  124. opentrons/protocol_engine/commands/load_module.py +31 -10
  125. opentrons/protocol_engine/commands/load_pipette.py +19 -8
  126. opentrons/protocol_engine/commands/magnetic_module/disengage.py +1 -1
  127. opentrons/protocol_engine/commands/magnetic_module/engage.py +1 -1
  128. opentrons/protocol_engine/commands/move_labware.py +28 -6
  129. opentrons/protocol_engine/commands/move_relative.py +35 -25
  130. opentrons/protocol_engine/commands/move_to_addressable_area.py +40 -27
  131. opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +53 -32
  132. opentrons/protocol_engine/commands/move_to_coordinates.py +36 -22
  133. opentrons/protocol_engine/commands/move_to_well.py +40 -24
  134. opentrons/protocol_engine/commands/movement_common.py +338 -0
  135. opentrons/protocol_engine/commands/pick_up_tip.py +49 -27
  136. opentrons/protocol_engine/commands/pipetting_common.py +169 -87
  137. opentrons/protocol_engine/commands/prepare_to_aspirate.py +24 -33
  138. opentrons/protocol_engine/commands/reload_labware.py +1 -1
  139. opentrons/protocol_engine/commands/retract_axis.py +1 -1
  140. opentrons/protocol_engine/commands/robot/__init__.py +69 -0
  141. opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +86 -0
  142. opentrons/protocol_engine/commands/robot/common.py +18 -0
  143. opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
  144. opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
  145. opentrons/protocol_engine/commands/robot/move_to.py +94 -0
  146. opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +77 -0
  147. opentrons/protocol_engine/commands/save_position.py +14 -5
  148. opentrons/protocol_engine/commands/set_rail_lights.py +1 -1
  149. opentrons/protocol_engine/commands/set_status_bar.py +1 -1
  150. opentrons/protocol_engine/commands/temperature_module/deactivate.py +1 -1
  151. opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +1 -1
  152. opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +10 -4
  153. opentrons/protocol_engine/commands/thermocycler/close_lid.py +1 -1
  154. opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +1 -1
  155. opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +1 -1
  156. opentrons/protocol_engine/commands/thermocycler/open_lid.py +1 -1
  157. opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +9 -3
  158. opentrons/protocol_engine/commands/thermocycler/run_profile.py +9 -3
  159. opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +11 -4
  160. opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +1 -1
  161. opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +1 -1
  162. opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +1 -1
  163. opentrons/protocol_engine/commands/touch_tip.py +65 -16
  164. opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +5 -2
  165. opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +13 -4
  166. opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +2 -5
  167. opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +1 -1
  168. opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +4 -2
  169. opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +2 -5
  170. opentrons/protocol_engine/commands/verify_tip_presence.py +11 -4
  171. opentrons/protocol_engine/commands/wait_for_duration.py +10 -3
  172. opentrons/protocol_engine/commands/wait_for_resume.py +10 -3
  173. opentrons/protocol_engine/errors/__init__.py +12 -0
  174. opentrons/protocol_engine/errors/error_occurrence.py +19 -20
  175. opentrons/protocol_engine/errors/exceptions.py +76 -0
  176. opentrons/protocol_engine/execution/command_executor.py +1 -1
  177. opentrons/protocol_engine/execution/equipment.py +73 -5
  178. opentrons/protocol_engine/execution/gantry_mover.py +369 -8
  179. opentrons/protocol_engine/execution/hardware_stopper.py +7 -7
  180. opentrons/protocol_engine/execution/movement.py +27 -0
  181. opentrons/protocol_engine/execution/pipetting.py +5 -1
  182. opentrons/protocol_engine/execution/tip_handler.py +34 -15
  183. opentrons/protocol_engine/notes/notes.py +1 -1
  184. opentrons/protocol_engine/protocol_engine.py +7 -6
  185. opentrons/protocol_engine/resources/labware_data_provider.py +1 -1
  186. opentrons/protocol_engine/resources/labware_validation.py +18 -0
  187. opentrons/protocol_engine/resources/module_data_provider.py +1 -1
  188. opentrons/protocol_engine/resources/pipette_data_provider.py +26 -0
  189. opentrons/protocol_engine/slot_standardization.py +9 -9
  190. opentrons/protocol_engine/state/_move_types.py +9 -5
  191. opentrons/protocol_engine/state/_well_math.py +193 -0
  192. opentrons/protocol_engine/state/addressable_areas.py +25 -61
  193. opentrons/protocol_engine/state/command_history.py +12 -0
  194. opentrons/protocol_engine/state/commands.py +22 -14
  195. opentrons/protocol_engine/state/files.py +10 -12
  196. opentrons/protocol_engine/state/fluid_stack.py +138 -0
  197. opentrons/protocol_engine/state/frustum_helpers.py +63 -69
  198. opentrons/protocol_engine/state/geometry.py +47 -1
  199. opentrons/protocol_engine/state/labware.py +92 -26
  200. opentrons/protocol_engine/state/liquid_classes.py +82 -0
  201. opentrons/protocol_engine/state/liquids.py +16 -4
  202. opentrons/protocol_engine/state/modules.py +56 -71
  203. opentrons/protocol_engine/state/motion.py +6 -1
  204. opentrons/protocol_engine/state/pipettes.py +149 -58
  205. opentrons/protocol_engine/state/state.py +21 -2
  206. opentrons/protocol_engine/state/state_summary.py +4 -2
  207. opentrons/protocol_engine/state/tips.py +11 -44
  208. opentrons/protocol_engine/state/update_types.py +343 -48
  209. opentrons/protocol_engine/state/wells.py +19 -11
  210. opentrons/protocol_engine/types.py +176 -28
  211. opentrons/protocol_reader/extract_labware_definitions.py +5 -2
  212. opentrons/protocol_reader/file_format_validator.py +5 -5
  213. opentrons/protocol_runner/json_file_reader.py +9 -3
  214. opentrons/protocol_runner/json_translator.py +51 -25
  215. opentrons/protocol_runner/legacy_command_mapper.py +66 -64
  216. opentrons/protocol_runner/protocol_runner.py +35 -4
  217. opentrons/protocol_runner/python_protocol_wrappers.py +1 -1
  218. opentrons/protocol_runner/run_orchestrator.py +13 -3
  219. opentrons/protocols/advanced_control/common.py +38 -0
  220. opentrons/protocols/advanced_control/mix.py +1 -1
  221. opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
  222. opentrons/protocols/advanced_control/transfers/common.py +56 -0
  223. opentrons/protocols/advanced_control/{transfers.py → transfers/transfer.py} +10 -85
  224. opentrons/protocols/api_support/definitions.py +1 -1
  225. opentrons/protocols/api_support/instrument.py +1 -1
  226. opentrons/protocols/api_support/util.py +10 -0
  227. opentrons/protocols/labware.py +70 -8
  228. opentrons/protocols/models/json_protocol.py +5 -9
  229. opentrons/simulate.py +3 -1
  230. opentrons/types.py +162 -2
  231. opentrons/util/entrypoint_util.py +2 -5
  232. opentrons/util/logging_config.py +1 -1
  233. {opentrons-8.2.0a3.dist-info → opentrons-8.3.0.dist-info}/METADATA +16 -15
  234. {opentrons-8.2.0a3.dist-info → opentrons-8.3.0.dist-info}/RECORD +238 -208
  235. {opentrons-8.2.0a3.dist-info → opentrons-8.3.0.dist-info}/WHEEL +1 -1
  236. {opentrons-8.2.0a3.dist-info → opentrons-8.3.0.dist-info}/LICENSE +0 -0
  237. {opentrons-8.2.0a3.dist-info → opentrons-8.3.0.dist-info}/entry_points.txt +0 -0
  238. {opentrons-8.2.0a3.dist-info → opentrons-8.3.0.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,
@@ -318,8 +360,33 @@ from .liquid_probe import (
318
360
  TryLiquidProbeCommandType,
319
361
  )
320
362
 
363
+ from .evotip_seal_pipette import (
364
+ EvotipSealPipette,
365
+ EvotipSealPipetteParams,
366
+ EvotipSealPipetteCreate,
367
+ EvotipSealPipetteResult,
368
+ EvotipSealPipetteCommandType,
369
+ )
370
+
371
+ from .evotip_dispense import (
372
+ EvotipDispense,
373
+ EvotipDispenseParams,
374
+ EvotipDispenseCreate,
375
+ EvotipDispenseResult,
376
+ EvotipDispenseCommandType,
377
+ )
378
+
379
+ from .evotip_unseal_pipette import (
380
+ EvotipUnsealPipette,
381
+ EvotipUnsealPipetteParams,
382
+ EvotipUnsealPipetteCreate,
383
+ EvotipUnsealPipetteResult,
384
+ EvotipUnsealPipetteCommandType,
385
+ )
386
+
321
387
  Command = Annotated[
322
388
  Union[
389
+ AirGapInPlace,
323
390
  Aspirate,
324
391
  AspirateInPlace,
325
392
  Comment,
@@ -337,8 +404,11 @@ Command = Annotated[
337
404
  LoadLabware,
338
405
  ReloadLabware,
339
406
  LoadLiquid,
407
+ LoadLiquidClass,
340
408
  LoadModule,
341
409
  LoadPipette,
410
+ LoadLidStack,
411
+ LoadLid,
342
412
  MoveLabware,
343
413
  MoveRelative,
344
414
  MoveToCoordinates,
@@ -355,8 +425,12 @@ Command = Annotated[
355
425
  SetStatusBar,
356
426
  VerifyTipPresence,
357
427
  GetTipPresence,
428
+ GetNextTip,
358
429
  LiquidProbe,
359
430
  TryLiquidProbe,
431
+ EvotipSealPipette,
432
+ EvotipDispense,
433
+ EvotipUnsealPipette,
360
434
  heater_shaker.WaitForTemperature,
361
435
  heater_shaker.SetTargetTemperature,
362
436
  heater_shaker.DeactivateHeater,
@@ -393,11 +467,17 @@ Command = Annotated[
393
467
  unsafe.UnsafeEngageAxes,
394
468
  unsafe.UnsafeUngripLabware,
395
469
  unsafe.UnsafePlaceLabware,
470
+ robot.MoveTo,
471
+ robot.MoveAxesRelative,
472
+ robot.MoveAxesTo,
473
+ robot.openGripperJaw,
474
+ robot.closeGripperJaw,
396
475
  ],
397
476
  Field(discriminator="commandType"),
398
477
  ]
399
478
 
400
479
  CommandParams = Union[
480
+ AirGapInPlaceParams,
401
481
  AspirateParams,
402
482
  AspirateInPlaceParams,
403
483
  CommentParams,
@@ -413,8 +493,11 @@ CommandParams = Union[
413
493
  HomeParams,
414
494
  RetractAxisParams,
415
495
  LoadLabwareParams,
496
+ LoadLidStackParams,
497
+ LoadLidParams,
416
498
  ReloadLabwareParams,
417
499
  LoadLiquidParams,
500
+ LoadLiquidClassParams,
418
501
  LoadModuleParams,
419
502
  LoadPipetteParams,
420
503
  MoveLabwareParams,
@@ -433,8 +516,12 @@ CommandParams = Union[
433
516
  SetStatusBarParams,
434
517
  VerifyTipPresenceParams,
435
518
  GetTipPresenceParams,
519
+ GetNextTipParams,
436
520
  LiquidProbeParams,
437
521
  TryLiquidProbeParams,
522
+ EvotipSealPipetteParams,
523
+ EvotipDispenseParams,
524
+ EvotipUnsealPipetteParams,
438
525
  heater_shaker.WaitForTemperatureParams,
439
526
  heater_shaker.SetTargetTemperatureParams,
440
527
  heater_shaker.DeactivateHeaterParams,
@@ -471,9 +558,15 @@ CommandParams = Union[
471
558
  unsafe.UnsafeEngageAxesParams,
472
559
  unsafe.UnsafeUngripLabwareParams,
473
560
  unsafe.UnsafePlaceLabwareParams,
561
+ robot.MoveAxesRelativeParams,
562
+ robot.MoveAxesToParams,
563
+ robot.MoveToParams,
564
+ robot.openGripperJawParams,
565
+ robot.closeGripperJawParams,
474
566
  ]
475
567
 
476
568
  CommandType = Union[
569
+ AirGapInPlaceCommandType,
477
570
  AspirateCommandType,
478
571
  AspirateInPlaceCommandType,
479
572
  CommentCommandType,
@@ -491,8 +584,11 @@ CommandType = Union[
491
584
  LoadLabwareCommandType,
492
585
  ReloadLabwareCommandType,
493
586
  LoadLiquidCommandType,
587
+ LoadLiquidClassCommandType,
494
588
  LoadModuleCommandType,
495
589
  LoadPipetteCommandType,
590
+ LoadLidStackCommandType,
591
+ LoadLidCommandType,
496
592
  MoveLabwareCommandType,
497
593
  MoveRelativeCommandType,
498
594
  MoveToCoordinatesCommandType,
@@ -509,8 +605,12 @@ CommandType = Union[
509
605
  SetStatusBarCommandType,
510
606
  VerifyTipPresenceCommandType,
511
607
  GetTipPresenceCommandType,
608
+ GetNextTipCommandType,
512
609
  LiquidProbeCommandType,
513
610
  TryLiquidProbeCommandType,
611
+ EvotipSealPipetteCommandType,
612
+ EvotipDispenseCommandType,
613
+ EvotipUnsealPipetteCommandType,
514
614
  heater_shaker.WaitForTemperatureCommandType,
515
615
  heater_shaker.SetTargetTemperatureCommandType,
516
616
  heater_shaker.DeactivateHeaterCommandType,
@@ -547,10 +647,16 @@ CommandType = Union[
547
647
  unsafe.UnsafeEngageAxesCommandType,
548
648
  unsafe.UnsafeUngripLabwareCommandType,
549
649
  unsafe.UnsafePlaceLabwareCommandType,
650
+ robot.MoveAxesRelativeCommandType,
651
+ robot.MoveAxesToCommandType,
652
+ robot.MoveToCommandType,
653
+ robot.openGripperJawCommandType,
654
+ robot.closeGripperJawCommandType,
550
655
  ]
551
656
 
552
657
  CommandCreate = Annotated[
553
658
  Union[
659
+ AirGapInPlaceCreate,
554
660
  AspirateCreate,
555
661
  AspirateInPlaceCreate,
556
662
  CommentCreate,
@@ -568,8 +674,11 @@ CommandCreate = Annotated[
568
674
  LoadLabwareCreate,
569
675
  ReloadLabwareCreate,
570
676
  LoadLiquidCreate,
677
+ LoadLiquidClassCreate,
571
678
  LoadModuleCreate,
572
679
  LoadPipetteCreate,
680
+ LoadLidStackCreate,
681
+ LoadLidCreate,
573
682
  MoveLabwareCreate,
574
683
  MoveRelativeCreate,
575
684
  MoveToCoordinatesCreate,
@@ -586,8 +695,12 @@ CommandCreate = Annotated[
586
695
  SetStatusBarCreate,
587
696
  VerifyTipPresenceCreate,
588
697
  GetTipPresenceCreate,
698
+ GetNextTipCreate,
589
699
  LiquidProbeCreate,
590
700
  TryLiquidProbeCreate,
701
+ EvotipSealPipetteCreate,
702
+ EvotipDispenseCreate,
703
+ EvotipUnsealPipetteCreate,
591
704
  heater_shaker.WaitForTemperatureCreate,
592
705
  heater_shaker.SetTargetTemperatureCreate,
593
706
  heater_shaker.DeactivateHeaterCreate,
@@ -624,11 +737,24 @@ CommandCreate = Annotated[
624
737
  unsafe.UnsafeEngageAxesCreate,
625
738
  unsafe.UnsafeUngripLabwareCreate,
626
739
  unsafe.UnsafePlaceLabwareCreate,
740
+ robot.MoveAxesRelativeCreate,
741
+ robot.MoveAxesToCreate,
742
+ robot.MoveToCreate,
743
+ robot.openGripperJawCreate,
744
+ robot.closeGripperJawCreate,
627
745
  ],
628
746
  Field(discriminator="commandType"),
629
747
  ]
630
748
 
749
+ # Each time a TypeAdapter is instantiated, it will construct a new validator and
750
+ # serializer. To improve performance, TypeAdapters are instantiated once.
751
+ # See https://docs.pydantic.dev/latest/concepts/performance/#typeadapter-instantiated-once
752
+ CommandCreateAdapter: TypeAdapter[CommandCreate] = TypeAdapter(CommandCreate)
753
+
754
+ CommandAdapter: TypeAdapter[Command] = TypeAdapter(Command)
755
+
631
756
  CommandResult = Union[
757
+ AirGapInPlaceResult,
632
758
  AspirateResult,
633
759
  AspirateInPlaceResult,
634
760
  CommentResult,
@@ -646,8 +772,11 @@ CommandResult = Union[
646
772
  LoadLabwareResult,
647
773
  ReloadLabwareResult,
648
774
  LoadLiquidResult,
775
+ LoadLiquidClassResult,
649
776
  LoadModuleResult,
650
777
  LoadPipetteResult,
778
+ LoadLidStackResult,
779
+ LoadLidResult,
651
780
  MoveLabwareResult,
652
781
  MoveRelativeResult,
653
782
  MoveToCoordinatesResult,
@@ -664,8 +793,12 @@ CommandResult = Union[
664
793
  SetStatusBarResult,
665
794
  VerifyTipPresenceResult,
666
795
  GetTipPresenceResult,
796
+ GetNextTipResult,
667
797
  LiquidProbeResult,
668
798
  TryLiquidProbeResult,
799
+ EvotipSealPipetteResult,
800
+ EvotipDispenseResult,
801
+ EvotipUnsealPipetteResult,
669
802
  heater_shaker.WaitForTemperatureResult,
670
803
  heater_shaker.SetTargetTemperatureResult,
671
804
  heater_shaker.DeactivateHeaterResult,
@@ -702,6 +835,11 @@ CommandResult = Union[
702
835
  unsafe.UnsafeEngageAxesResult,
703
836
  unsafe.UnsafeUngripLabwareResult,
704
837
  unsafe.UnsafePlaceLabwareResult,
838
+ robot.MoveAxesRelativeResult,
839
+ robot.MoveAxesToResult,
840
+ robot.MoveToResult,
841
+ robot.openGripperJawResult,
842
+ robot.closeGripperJawResult,
705
843
  ]
706
844
 
707
845
 
@@ -712,6 +850,7 @@ CommandDefinedErrorData = Union[
712
850
  DefinedErrorData[OverpressureError],
713
851
  DefinedErrorData[LiquidNotFoundError],
714
852
  DefinedErrorData[GripperMovementError],
853
+ DefinedErrorData[StallOrCollisionError],
715
854
  ]
716
855
 
717
856
 
@@ -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