opentrons 8.4.0a2__py2.py3-none-any.whl → 8.4.0a3__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.

@@ -1141,7 +1141,7 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1141
1141
  result.nextTipInfo if isinstance(result.nextTipInfo, NextTipInfo) else None
1142
1142
  )
1143
1143
 
1144
- def transfer_liquid( # noqa: C901
1144
+ def transfer_with_liquid_class( # noqa: C901
1145
1145
  self,
1146
1146
  liquid_class: LiquidClass,
1147
1147
  volume: float,
@@ -1335,7 +1335,7 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1335
1335
  _drop_tip()
1336
1336
 
1337
1337
  # TODO(spp, 2025-02-25): wire up return tip
1338
- def distribute_liquid( # noqa: C901
1338
+ def distribute_with_liquid_class( # noqa: C901
1339
1339
  self,
1340
1340
  liquid_class: LiquidClass,
1341
1341
  volume: float,
@@ -1417,7 +1417,7 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1417
1417
  tip_working_volume=working_volume,
1418
1418
  )
1419
1419
  ):
1420
- self.transfer_liquid(
1420
+ self.transfer_with_liquid_class(
1421
1421
  liquid_class=liquid_class,
1422
1422
  volume=volume,
1423
1423
  source=[source for _ in range(len(dest))],
@@ -1657,7 +1657,7 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1657
1657
  <= tip_working_volume
1658
1658
  )
1659
1659
 
1660
- def consolidate_liquid( # noqa: C901
1660
+ def consolidate_with_liquid_class( # noqa: C901
1661
1661
  self,
1662
1662
  liquid_class: LiquidClass,
1663
1663
  volume: float,
@@ -359,7 +359,7 @@ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
359
359
  ...
360
360
 
361
361
  @abstractmethod
362
- def transfer_liquid(
362
+ def transfer_with_liquid_class(
363
363
  self,
364
364
  liquid_class: LiquidClass,
365
365
  volume: float,
@@ -374,7 +374,7 @@ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
374
374
  ...
375
375
 
376
376
  @abstractmethod
377
- def distribute_liquid(
377
+ def distribute_with_liquid_class(
378
378
  self,
379
379
  liquid_class: LiquidClass,
380
380
  volume: float,
@@ -392,7 +392,7 @@ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
392
392
  ...
393
393
 
394
394
  @abstractmethod
395
- def consolidate_liquid(
395
+ def consolidate_with_liquid_class(
396
396
  self,
397
397
  liquid_class: LiquidClass,
398
398
  volume: float,
@@ -624,7 +624,7 @@ class LegacyInstrumentCore(AbstractInstrument[LegacyWellCore, LegacyLabwareCore]
624
624
  """This will never be called because it was added in API 2.16."""
625
625
  pass
626
626
 
627
- def transfer_liquid(
627
+ def transfer_with_liquid_class(
628
628
  self,
629
629
  liquid_class: LiquidClass,
630
630
  volume: float,
@@ -638,7 +638,7 @@ class LegacyInstrumentCore(AbstractInstrument[LegacyWellCore, LegacyLabwareCore]
638
638
  """This will never be called because it was added in API 2.23"""
639
639
  assert False, "transfer_liquid is not supported in legacy context"
640
640
 
641
- def distribute_liquid(
641
+ def distribute_with_liquid_class(
642
642
  self,
643
643
  liquid_class: LiquidClass,
644
644
  volume: float,
@@ -652,7 +652,7 @@ class LegacyInstrumentCore(AbstractInstrument[LegacyWellCore, LegacyLabwareCore]
652
652
  """This will never be called because it was added in API 2.23"""
653
653
  assert False, "distribute_liquid is not supported in legacy context"
654
654
 
655
- def consolidate_liquid(
655
+ def consolidate_with_liquid_class(
656
656
  self,
657
657
  liquid_class: LiquidClass,
658
658
  volume: float,
@@ -513,7 +513,7 @@ class LegacyInstrumentCoreSimulator(
513
513
  """This will never be called because it was added in API 2.15."""
514
514
  pass
515
515
 
516
- def transfer_liquid(
516
+ def transfer_with_liquid_class(
517
517
  self,
518
518
  liquid_class: LiquidClass,
519
519
  volume: float,
@@ -527,7 +527,7 @@ class LegacyInstrumentCoreSimulator(
527
527
  """This will never be called because it was added in API 2.23."""
528
528
  assert False, "transfer_liquid is not supported in legacy context"
529
529
 
530
- def distribute_liquid(
530
+ def distribute_with_liquid_class(
531
531
  self,
532
532
  liquid_class: LiquidClass,
533
533
  volume: float,
@@ -541,7 +541,7 @@ class LegacyInstrumentCoreSimulator(
541
541
  """This will never be called because it was added in API 2.23."""
542
542
  assert False, "distribute_liquid is not supported in legacy context"
543
543
 
544
- def consolidate_liquid(
544
+ def consolidate_with_liquid_class(
545
545
  self,
546
546
  liquid_class: LiquidClass,
547
547
  volume: float,
@@ -1509,7 +1509,7 @@ class InstrumentContext(publisher.CommandPublisher):
1509
1509
  getattr(self, cmd["method"])(*cmd["args"], **cmd["kwargs"])
1510
1510
 
1511
1511
  @requires_version(2, 23)
1512
- def transfer_liquid(
1512
+ def transfer_with_liquid_class(
1513
1513
  self,
1514
1514
  liquid_class: LiquidClass,
1515
1515
  volume: float,
@@ -1526,11 +1526,32 @@ class InstrumentContext(publisher.CommandPublisher):
1526
1526
  return_tip: bool = False,
1527
1527
  visit_every_well: bool = False,
1528
1528
  ) -> InstrumentContext:
1529
- """Transfer liquid from source to dest using the specified liquid class properties.
1529
+ """Move a particular type of liquid from one well or group of wells to another.
1530
1530
 
1531
- TODO: Add args description.
1531
+ :param liquid_class: The type of liquid to move. You must specify the liquid class,
1532
+ even if you have used :py:meth:`.load_liquid` to indicate what liquid the
1533
+ source contains.
1534
+ :type liquid_class: :py:class:`.LiquidClass`
1532
1535
 
1533
- :meta private:
1536
+ :param volume: The amount, in µL, to aspirate from each source and dispense to
1537
+ each destination.
1538
+ :param source: A single well or a list of wells to aspirate liquid from.
1539
+ :param dest: A single well or a list of wells to dispense liquid into.
1540
+ :param new_tip: When to pick up and drop tips during the command.
1541
+ Defaults to ``"once"``.
1542
+
1543
+ - ``"once"``: Use one tip for the entire command.
1544
+ - ``"always"``: Use a new tip for each set of aspirate and dispense steps.
1545
+ - ``"per source"``: Use one tip for each source well, even if
1546
+ :ref:`tip refilling <complex-tip-refilling>` is required.
1547
+ - ``"never"``: Do not pick up or drop tips at all.
1548
+
1549
+ See :ref:`param-tip-handling` for details.
1550
+
1551
+ :param trash_location: A trash container, well, or other location to dispose of
1552
+ tips. Depending on the liquid class, the pipette may also blow out liquid here.
1553
+ :param return_tip: Whether to drop used tips in their original locations
1554
+ in the tip rack, instead of the trash.
1534
1555
  """
1535
1556
  transfer_args = verify_and_normalize_transfer_args(
1536
1557
  source=source,
@@ -1552,7 +1573,7 @@ class InstrumentContext(publisher.CommandPublisher):
1552
1573
  " to transfer liquid onto one destinations from many sources, use 'consolidate_liquid'."
1553
1574
  )
1554
1575
 
1555
- self._core.transfer_liquid(
1576
+ self._core.transfer_with_liquid_class(
1556
1577
  liquid_class=liquid_class,
1557
1578
  volume=volume,
1558
1579
  source=[
@@ -1574,7 +1595,7 @@ class InstrumentContext(publisher.CommandPublisher):
1574
1595
  return self
1575
1596
 
1576
1597
  @requires_version(2, 23)
1577
- def distribute_liquid(
1598
+ def distribute_with_liquid_class(
1578
1599
  self,
1579
1600
  liquid_class: LiquidClass,
1580
1601
  volume: float,
@@ -1590,12 +1611,30 @@ class InstrumentContext(publisher.CommandPublisher):
1590
1611
  visit_every_well: bool = False,
1591
1612
  ) -> InstrumentContext:
1592
1613
  """
1593
- Distribute liquid from a single source to multiple destinations
1594
- using the specified liquid class properties.
1614
+ Distribute a particular type of liquid from one well to a group of wells.
1595
1615
 
1596
- TODO: Add args description.
1616
+ :param liquid_class: The type of liquid to move. You must specify the liquid class,
1617
+ even if you have used :py:meth:`.load_liquid` to indicate what liquid the
1618
+ source contains.
1619
+ :type liquid_class: :py:class:`.LiquidClass`
1597
1620
 
1598
- :meta private:
1621
+ :param volume: The amount, in µL, to aspirate from the source and dispense to
1622
+ each destination.
1623
+ :param source: A single well to aspirate liquid from.
1624
+ :param dest: A list of wells to dispense liquid into.
1625
+ :param new_tip: When to pick up and drop tips during the command.
1626
+ Defaults to ``"once"``.
1627
+
1628
+ - ``"once"`` or ``"per source"``: Use one tip for the entire command.
1629
+ - ``"always"``: Use a new tip for each set of aspirate and dispense steps.
1630
+ - ``"never"``: Do not pick up or drop tips at all.
1631
+
1632
+ See :ref:`param-tip-handling` for details.
1633
+
1634
+ :param trash_location: A trash container, well, or other location to dispose of
1635
+ tips. Depending on the liquid class, the pipette may also blow out liquid here.
1636
+ :param return_tip: Whether to drop used tips in their original locations
1637
+ in the tip rack, instead of the trash.
1599
1638
  """
1600
1639
  transfer_args = verify_and_normalize_transfer_args(
1601
1640
  source=source,
@@ -1621,7 +1660,7 @@ class InstrumentContext(publisher.CommandPublisher):
1621
1660
  )
1622
1661
 
1623
1662
  verified_source = transfer_args.sources_list[0]
1624
- self._core.distribute_liquid(
1663
+ self._core.distribute_with_liquid_class(
1625
1664
  liquid_class=liquid_class,
1626
1665
  volume=volume,
1627
1666
  source=(
@@ -1643,7 +1682,7 @@ class InstrumentContext(publisher.CommandPublisher):
1643
1682
  return self
1644
1683
 
1645
1684
  @requires_version(2, 23)
1646
- def consolidate_liquid(
1685
+ def consolidate_with_liquid_class(
1647
1686
  self,
1648
1687
  liquid_class: LiquidClass,
1649
1688
  volume: float,
@@ -1659,12 +1698,31 @@ class InstrumentContext(publisher.CommandPublisher):
1659
1698
  visit_every_well: bool = False,
1660
1699
  ) -> InstrumentContext:
1661
1700
  """
1662
- Consolidate liquid from multiple sources to a single destination
1663
- using the specified liquid class properties.
1701
+ Consolidate a particular type of liquid from a group of wells to one well.
1664
1702
 
1665
- TODO: Add args description.
1703
+ :param liquid_class: The type of liquid to move. You must specify the liquid class,
1704
+ even if you have used :py:meth:`.load_liquid` to indicate what liquid the
1705
+ source contains.
1706
+ :type liquid_class: :py:class:`.LiquidClass`
1666
1707
 
1667
- :meta private:
1708
+ :param volume: The amount, in µL, to aspirate from the source and dispense to
1709
+ each destination.
1710
+ :param source: A list of wells to aspirate liquid from.
1711
+ :param dest: A single well to dispense liquid into.
1712
+ :param new_tip: When to pick up and drop tips during the command.
1713
+ Defaults to ``"once"``.
1714
+
1715
+ - ``"once"``: Use one tip for the entire command.
1716
+ - ``"always"``: Use a new tip for each set of aspirate and dispense steps.
1717
+ - ``"per source"``: Not available when consolidating.
1718
+ - ``"never"``: Do not pick up or drop tips at all.
1719
+
1720
+ See :ref:`param-tip-handling` for details.
1721
+
1722
+ :param trash_location: A trash container, well, or other location to dispose of
1723
+ tips. Depending on the liquid class, the pipette may also blow out liquid here.
1724
+ :param return_tip: Whether to drop used tips in their original locations
1725
+ in the tip rack, instead of the trash.
1668
1726
  """
1669
1727
  transfer_args = verify_and_normalize_transfer_args(
1670
1728
  source=source,
@@ -1690,7 +1748,7 @@ class InstrumentContext(publisher.CommandPublisher):
1690
1748
  )
1691
1749
 
1692
1750
  verified_dest = transfer_args.destinations_list[0]
1693
- self._core.consolidate_liquid(
1751
+ self._core.consolidate_with_liquid_class(
1694
1752
  liquid_class=liquid_class,
1695
1753
  volume=volume,
1696
1754
  source=[
@@ -3,10 +3,11 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from __future__ import annotations
6
- from typing import Optional, Literal, TYPE_CHECKING
6
+ from typing import Optional, Literal, TYPE_CHECKING, Annotated
7
7
  from typing_extensions import Type
8
8
 
9
9
  from pydantic import BaseModel, Field
10
+ from pydantic.json_schema import SkipJsonSchema
10
11
 
11
12
  from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
12
13
  from ...errors import (
@@ -39,12 +40,12 @@ class EmptyParams(BaseModel):
39
40
  ),
40
41
  )
41
42
 
42
- message: str | None = Field(
43
+ message: str | SkipJsonSchema[None] = Field(
43
44
  None,
44
45
  description="The message to display on connected clients during a manualWithPause strategy empty.",
45
46
  )
46
47
 
47
- count: int | None = Field(
48
+ count: Optional[Annotated[int, Field(ge=0)]] = Field(
48
49
  None,
49
50
  description=(
50
51
  "The new count of labware in the pool. If None, default to an empty pool. If this number is "
@@ -52,7 +53,6 @@ class EmptyParams(BaseModel):
52
53
  "Do not use the value in the parameters as an outside observer; instead, use the count value "
53
54
  "from the results."
54
55
  ),
55
- ge=0,
56
56
  )
57
57
 
58
58
 
@@ -66,11 +66,11 @@ class EmptyResult(BaseModel):
66
66
  ...,
67
67
  description="The labware definition URI of the primary labware.",
68
68
  )
69
- adapterLabwareURI: str | None = Field(
69
+ adapterLabwareURI: str | SkipJsonSchema[None] = Field(
70
70
  None,
71
71
  description="The labware definition URI of the adapter labware.",
72
72
  )
73
- lidLabwareURI: str | None = Field(
73
+ lidLabwareURI: str | SkipJsonSchema[None] = Field(
74
74
  None,
75
75
  description="The labware definition URI of the lid labware.",
76
76
  )
@@ -1,10 +1,11 @@
1
1
  """Command models to engage a user to empty a Flex Stacker."""
2
2
 
3
3
  from __future__ import annotations
4
- from typing import Optional, Literal, TYPE_CHECKING
4
+ from typing import Optional, Literal, TYPE_CHECKING, Annotated
5
5
  from typing_extensions import Type
6
6
 
7
7
  from pydantic import BaseModel, Field
8
+ from pydantic.json_schema import SkipJsonSchema
8
9
 
9
10
  from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
10
11
  from ...errors import (
@@ -37,12 +38,12 @@ class FillParams(BaseModel):
37
38
  ),
38
39
  )
39
40
 
40
- message: str | None = Field(
41
+ message: str | SkipJsonSchema[None] = Field(
41
42
  None,
42
43
  description="The message to display on connected clients during a manualWithPause strategy fill.",
43
44
  )
44
45
 
45
- count: int | None = Field(
46
+ count: Optional[Annotated[int, Field(ge=1)]] = Field(
46
47
  None,
47
48
  description=(
48
49
  "How full the labware pool should now be. If None, default to the maximum amount "
@@ -52,7 +53,6 @@ class FillParams(BaseModel):
52
53
  "holds, it will be clamped to that minimum. Do not use the value in the parameters as "
53
54
  "an outside observer; instead, use the count value from the results."
54
55
  ),
55
- ge=1,
56
56
  )
57
57
 
58
58
 
@@ -66,11 +66,11 @@ class FillResult(BaseModel):
66
66
  ...,
67
67
  description="The labware definition URI of the primary labware.",
68
68
  )
69
- adapterLabwareURI: str | None = Field(
69
+ adapterLabwareURI: str | SkipJsonSchema[None] = Field(
70
70
  None,
71
71
  description="The labware definition URI of the adapter labware.",
72
72
  )
73
- lidLabwareURI: str | None = Field(
73
+ lidLabwareURI: str | SkipJsonSchema[None] = Field(
74
74
  None,
75
75
  description="The labware definition URI of the lid labware.",
76
76
  )
@@ -86,33 +86,33 @@ class RetrieveResult(BaseModel):
86
86
  ...,
87
87
  description="The labware ID of the primary retrieved labware.",
88
88
  )
89
- adapterId: str | None = Field(
89
+ adapterId: str | SkipJsonSchema[None] = Field(
90
90
  None,
91
91
  description="The optional Adapter Labware ID of the adapter under a primary labware.",
92
92
  )
93
- lidId: str | None = Field(
93
+ lidId: str | SkipJsonSchema[None] = Field(
94
94
  None,
95
95
  description="The optional Lid Labware ID of the lid on a primary labware.",
96
96
  )
97
97
  primaryLocationSequence: LabwareLocationSequence = Field(
98
98
  ..., description="The origin location of the primary labware."
99
99
  )
100
- lidLocationSequence: LabwareLocationSequence | None = Field(
100
+ lidLocationSequence: LabwareLocationSequence | SkipJsonSchema[None] = Field(
101
101
  None,
102
102
  description="The origin location of the adapter labware under a primary labware.",
103
103
  )
104
- adapterLocationSequence: LabwareLocationSequence | None = Field(
104
+ adapterLocationSequence: LabwareLocationSequence | SkipJsonSchema[None] = Field(
105
105
  None, description="The origin location of the lid labware on a primary labware."
106
106
  )
107
107
  primaryLabwareURI: str = Field(
108
108
  ...,
109
109
  description="The labware definition URI of the primary labware.",
110
110
  )
111
- adapterLabwareURI: str | None = Field(
111
+ adapterLabwareURI: str | SkipJsonSchema[None] = Field(
112
112
  None,
113
113
  description="The labware definition URI of the adapter labware.",
114
114
  )
115
- lidLabwareURI: str | None = Field(
115
+ lidLabwareURI: str | SkipJsonSchema[None] = Field(
116
116
  None,
117
117
  description="The labware definition URI of the lid labware.",
118
118
  )
@@ -1,10 +1,11 @@
1
1
  """Command models to configure the stored labware pool of a Flex Stacker.."""
2
2
 
3
3
  from __future__ import annotations
4
- from typing import Optional, Literal, TYPE_CHECKING
4
+ from typing import Optional, Literal, TYPE_CHECKING, Annotated
5
5
  from typing_extensions import Type
6
6
 
7
7
  from pydantic import BaseModel, Field
8
+ from pydantic.json_schema import SkipJsonSchema
8
9
 
9
10
  from opentrons_shared_data.labware.labware_definition import LabwareDefinition
10
11
 
@@ -45,21 +46,20 @@ class SetStoredLabwareParams(BaseModel):
45
46
  ...,
46
47
  description="The details of the primary labware (i.e. not the lid or adapter, if any) stored in the stacker.",
47
48
  )
48
- lidLabware: StackerStoredLabwareDetails | None = Field(
49
+ lidLabware: StackerStoredLabwareDetails | SkipJsonSchema[None] = Field(
49
50
  default=None,
50
51
  description="The details of the lid on the primary labware, if any.",
51
52
  )
52
- adapterLabware: StackerStoredLabwareDetails | None = Field(
53
+ adapterLabware: StackerStoredLabwareDetails | SkipJsonSchema[None] = Field(
53
54
  default=None,
54
55
  description="The details of the adapter under the primary labware, if any.",
55
56
  )
56
- initialCount: int | None = Field(
57
+ initialCount: Optional[Annotated[int, Field(ge=0)]] = Field(
57
58
  None,
58
59
  description=(
59
60
  "The number of labware that should be initially stored in the stacker. This number will be silently clamped to "
60
61
  "the maximum number of labware that will fit; do not rely on the parameter to know how many labware are in the stacker."
61
62
  ),
62
- ge=0,
63
63
  )
64
64
 
65
65
 
@@ -69,11 +69,11 @@ class SetStoredLabwareResult(BaseModel):
69
69
  primaryLabwareDefinition: LabwareDefinition = Field(
70
70
  ..., description="The definition of the primary labware."
71
71
  )
72
- lidLabwareDefinition: LabwareDefinition | None = Field(
73
- ..., description="The definition of the lid on the primary labware, if any."
72
+ lidLabwareDefinition: LabwareDefinition | SkipJsonSchema[None] = Field(
73
+ None, description="The definition of the lid on the primary labware, if any."
74
74
  )
75
- adapterLabwareDefinition: LabwareDefinition | None = Field(
76
- ...,
75
+ adapterLabwareDefinition: LabwareDefinition | SkipJsonSchema[None] = Field(
76
+ None,
77
77
  description="The definition of the adapter under the primary labware, if any.",
78
78
  )
79
79
  count: int = Field(
@@ -4,6 +4,7 @@ from __future__ import annotations
4
4
  from typing import Optional, Literal, TYPE_CHECKING, Type, Union
5
5
 
6
6
  from pydantic import BaseModel, Field
7
+ from pydantic.json_schema import SkipJsonSchema
7
8
 
8
9
  from ..command import (
9
10
  AbstractCommandImpl,
@@ -51,39 +52,41 @@ class StoreParams(BaseModel):
51
52
  class StoreResult(BaseModel):
52
53
  """Result data from a labware storage command."""
53
54
 
54
- eventualDestinationLocationSequence: LabwareLocationSequence | None = Field(
55
+ eventualDestinationLocationSequence: LabwareLocationSequence | SkipJsonSchema[
56
+ None
57
+ ] = Field(
55
58
  None,
56
59
  description=(
57
60
  "The full location in which all labware moved by this command will eventually reside."
58
61
  ),
59
62
  )
60
- primaryOriginLocationSequence: LabwareLocationSequence | None = Field(
61
- None, description=("The origin location of the primary labware.")
62
- )
63
- primaryLabwareId: str | None = Field(
63
+ primaryOriginLocationSequence: LabwareLocationSequence | SkipJsonSchema[
64
+ None
65
+ ] = Field(None, description=("The origin location of the primary labware."))
66
+ primaryLabwareId: str | SkipJsonSchema[None] = Field(
64
67
  None, description="The primary labware in the stack that was stored."
65
68
  )
66
- adapterOriginLocationSequence: LabwareLocationSequence | None = Field(
67
- None, description=("The origin location of the adapter labware, if any.")
68
- )
69
- adapterLabwareId: str | None = Field(
69
+ adapterOriginLocationSequence: LabwareLocationSequence | SkipJsonSchema[
70
+ None
71
+ ] = Field(None, description=("The origin location of the adapter labware, if any."))
72
+ adapterLabwareId: str | SkipJsonSchema[None] = Field(
70
73
  None, description="The adapter in the stack that was stored, if any."
71
74
  )
72
- lidOriginLocationSequence: LabwareLocationSequence | None = Field(
75
+ lidOriginLocationSequence: LabwareLocationSequence | SkipJsonSchema[None] = Field(
73
76
  None, description=("The origin location of the lid labware, if any.")
74
77
  )
75
- lidLabwareId: str | None = Field(
78
+ lidLabwareId: str | SkipJsonSchema[None] = Field(
76
79
  None, description="The lid in the stack that was stored, if any."
77
80
  )
78
81
  primaryLabwareURI: str = Field(
79
82
  ...,
80
83
  description="The labware definition URI of the primary labware.",
81
84
  )
82
- adapterLabwareURI: str | None = Field(
85
+ adapterLabwareURI: str | SkipJsonSchema[None] = Field(
83
86
  None,
84
87
  description="The labware definition URI of the adapter labware.",
85
88
  )
86
- lidLabwareURI: str | None = Field(
89
+ lidLabwareURI: str | SkipJsonSchema[None] = Field(
87
90
  None,
88
91
  description="The labware definition URI of the lid labware.",
89
92
  )
@@ -484,20 +484,20 @@ class GeometryView:
484
484
  if z_offset < lld_min_height:
485
485
  if isinstance(well_location, PickUpTipWellLocation):
486
486
  raise OperationLocationNotInWellError(
487
- f"Specifying {well_location.origin} with an offset of {well_location.offset} results in an operation location that could be below the bottom of the well"
487
+ f"Specifying {well_location.origin} with a height offset of {well_location.offset.z} results in a height of {z_offset} mm; the minimum allowed height for liquid tracking is {lld_min_height} mm"
488
488
  )
489
489
  else:
490
490
  raise OperationLocationNotInWellError(
491
- f"Specifying {well_location.origin} with an offset of {well_location.offset} and a volume offset of {well_location.volumeOffset} results in an operation location that could be below the bottom of the well"
491
+ f"Specifying {well_location.origin} with a height offset of {well_location.offset.z} results in a height of {z_offset} mm; the minimum allowed height for liquid tracking is {lld_min_height} mm"
492
492
  )
493
493
  elif z_offset < 0:
494
494
  if isinstance(well_location, PickUpTipWellLocation):
495
495
  raise OperationLocationNotInWellError(
496
- f"Specifying {well_location.origin} with an offset of {well_location.offset} results in an operation location below the bottom of the well"
496
+ f"Specifying {well_location.origin} with an offset of {well_location.offset.z} results in a location below the bottom of the well"
497
497
  )
498
498
  else:
499
499
  raise OperationLocationNotInWellError(
500
- f"Specifying {well_location.origin} with an offset of {well_location.offset} and a volume offset of {well_location.volumeOffset} results in an operation location below the bottom of the well"
500
+ f"Specifying {well_location.origin} with an offset of {well_location.offset.z} and a volume offset of {well_location.volumeOffset} results in a location below the bottom of the well"
501
501
  )
502
502
 
503
503
  def get_well_position(
@@ -4,6 +4,7 @@ from __future__ import annotations
4
4
  from typing import Literal, Union, TypeGuard
5
5
 
6
6
  from pydantic import BaseModel, Field
7
+ from pydantic.json_schema import SkipJsonSchema
7
8
 
8
9
  from opentrons.types import DeckSlotName, StagingSlotName
9
10
 
@@ -107,7 +108,7 @@ class OnLabwareLocationSequenceComponent(BaseModel):
107
108
 
108
109
  kind: Literal["onLabware"] = "onLabware"
109
110
  labwareId: str
110
- lidId: str | None
111
+ lidId: str | SkipJsonSchema[None] = Field(None)
111
112
 
112
113
 
113
114
  class OnModuleLocationSequenceComponent(BaseModel):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: opentrons
3
- Version: 8.4.0a2
3
+ Version: 8.4.0a3
4
4
  Summary: The Opentrons API is a simple framework designed to make writing automated biology lab protocols easy.
5
5
  Author: Opentrons
6
6
  Author-email: engineering@opentrons.com
@@ -21,7 +21,7 @@ Classifier: Programming Language :: Python :: 3.10
21
21
  Classifier: Topic :: Scientific/Engineering
22
22
  Requires-Python: >=3.10
23
23
  License-File: ../LICENSE
24
- Requires-Dist: opentrons-shared-data (==8.4.0a2)
24
+ Requires-Dist: opentrons-shared-data (==8.4.0a3)
25
25
  Requires-Dist: aionotify (==0.3.1)
26
26
  Requires-Dist: anyio (<4.0.0,>=3.6.1)
27
27
  Requires-Dist: jsonschema (<4.18.0,>=3.0.1)
@@ -35,9 +35,9 @@ Requires-Dist: pyusb (==1.2.1)
35
35
  Requires-Dist: packaging (>=21.0)
36
36
  Requires-Dist: importlib-metadata (>=1.0) ; python_version < "3.8"
37
37
  Provides-Extra: flex-hardware
38
- Requires-Dist: opentrons-hardware[flex] (==8.4.0a2) ; extra == 'flex-hardware'
38
+ Requires-Dist: opentrons-hardware[flex] (==8.4.0a3) ; extra == 'flex-hardware'
39
39
  Provides-Extra: ot2-hardware
40
- Requires-Dist: opentrons-hardware (==8.4.0a2) ; extra == 'ot2-hardware'
40
+ Requires-Dist: opentrons-hardware (==8.4.0a3) ; extra == 'ot2-hardware'
41
41
 
42
42
  .. _Full API Documentation: http://docs.opentrons.com
43
43
 
@@ -228,7 +228,7 @@ opentrons/protocol_api/config.py,sha256=r9lyvXjagTX_g3q5FGURPpcz2IA9sSF7Oa_1mKx-
228
228
  opentrons/protocol_api/create_protocol_context.py,sha256=wwsZje0L__oDnu1Yrihau320_f-ASloR9eL1QCtkOh8,7612
229
229
  opentrons/protocol_api/deck.py,sha256=94vFceg1SC1bAGd7TvC1ZpYwnJR-VlzurEZ6jkacYeg,8910
230
230
  opentrons/protocol_api/disposal_locations.py,sha256=NRiSGmDR0LnbyEkWSOM-o64uR2fUoB1NWJG7Y7SsJSs,7920
231
- opentrons/protocol_api/instrument_context.py,sha256=ZR8GZF35-hUEGYTUkWm55v4KvI775t1Nfrl1g4pgu00,111773
231
+ opentrons/protocol_api/instrument_context.py,sha256=ae_gLaPote11svliO-Y9QwPlbbvUwqW21l_5Mw0QVyY,115477
232
232
  opentrons/protocol_api/labware.py,sha256=q980jPZuBwvgwzIdBRyGn7bsJKiEPoAxO7y3iGPoczk,61406
233
233
  opentrons/protocol_api/module_contexts.py,sha256=3tVXj6Q7n-WuTJPU_dvIQLzzGv1P-jsMuDtMVpuhAf8,48291
234
234
  opentrons/protocol_api/module_validation_and_errors.py,sha256=XL_m72P8rcvGO2fynY7UzXLcpGuI6X4s0V6Xf735Iyc,1464
@@ -238,7 +238,7 @@ opentrons/protocol_api/validation.py,sha256=uiVTHyJF3wSh5LLfaIDBTELoMNCAT17E767u
238
238
  opentrons/protocol_api/core/__init__.py,sha256=-g74o8OtBB0LmmOvwkRvPgrHt7fF7T8FRHDj-x_-Onk,736
239
239
  opentrons/protocol_api/core/common.py,sha256=q9ZbfpRdBvB3iDAOCyONtupvkYP5n1hjE-bwqGcwP_U,1172
240
240
  opentrons/protocol_api/core/core_map.py,sha256=gq3CIYPxuPvozf8yj8FprqBfs3e4ZJGQ6s0ViPbwV08,1757
241
- opentrons/protocol_api/core/instrument.py,sha256=ML9sUgyoQ50k2Brb3Z4ulEO7Y78S4PEDoA1lRG02hoA,13422
241
+ opentrons/protocol_api/core/instrument.py,sha256=0ubPoOsnA8ZBPVbxb2jfWj7XoFVtiOPgbThj0ODObcE,13455
242
242
  opentrons/protocol_api/core/labware.py,sha256=-ZOjkalikXCV3ptehKCNaWGAdKxIdwne8LRFQW9NAm4,4290
243
243
  opentrons/protocol_api/core/module.py,sha256=z2STDyqqxZX3y6UyJVDnajeFXMEn1ie2NRBYHhry_XE,13838
244
244
  opentrons/protocol_api/core/protocol.py,sha256=v7v28jfeHSfOf-tqFDW2chGtrEatPiZ1y6YNwHfmtAs,9058
@@ -248,7 +248,7 @@ opentrons/protocol_api/core/well_grid.py,sha256=BU28DKaBgEU_JdZ6pEzrwNxmuh6TkO4z
248
248
  opentrons/protocol_api/core/engine/__init__.py,sha256=B_5T7zgkWDb1mXPg4NbT-wBkQaK-WVokMMnJRNu7xiM,582
249
249
  opentrons/protocol_api/core/engine/deck_conflict.py,sha256=q3JViIAHDthIqq6ce7h2gxw3CHRfYsm5kkwzuXB-Gnc,12334
250
250
  opentrons/protocol_api/core/engine/exceptions.py,sha256=aZgNrmYEeuPZm21nX_KZYtvyjv5h_zPjxxgPkEV7_bw,725
251
- opentrons/protocol_api/core/engine/instrument.py,sha256=OrOJAtvpkWacfwvFCx1ylH5t15kOjzYjb5O1lk6YzLs,92622
251
+ opentrons/protocol_api/core/engine/instrument.py,sha256=aXX_p08aGjqPT0RlqcS8K1BHHDxFuXrXejY-15uRci4,92666
252
252
  opentrons/protocol_api/core/engine/labware.py,sha256=1xvzguNnK7aecFLiJK0gtRrZ5kpwtzLS73HnKvdJ5lc,8413
253
253
  opentrons/protocol_api/core/engine/load_labware_params.py,sha256=I4Cb8rqpBhmykQuZE8QRG802APrdCy_TYS88rm_9oGA,7159
254
254
  opentrons/protocol_api/core/engine/module_core.py,sha256=MLPgYSRJHUZPZ9rTLvsg3GlpL5b6-Pjk5UBgXCGrL6U,30994
@@ -263,7 +263,7 @@ opentrons/protocol_api/core/engine/well.py,sha256=PEtDwdC8NkHjqasJaDaVDtzc_WFw-q
263
263
  opentrons/protocol_api/core/legacy/__init__.py,sha256=_9jCJNKG3SlS_vljVu8HHkZmtLf4F-f-JHALLF5d5go,401
264
264
  opentrons/protocol_api/core/legacy/deck.py,sha256=qHqcGo-Kdkl9L1aOE0pwrm9tsAnwkXbt4rIOr_VEP-s,13955
265
265
  opentrons/protocol_api/core/legacy/labware_offset_provider.py,sha256=2DLIby9xmUrwLb2ht8hZbvNTxqPhNzWijd7yCb2cqP8,3783
266
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py,sha256=DLxOahHdOcEsCspf0EB_qjAvALM3nSK61azwuQnwE2I,27101
266
+ opentrons/protocol_api/core/legacy/legacy_instrument_core.py,sha256=lap6L9kym_uanRjDiZx0X7r8dLvF5pJvtgOy6debXys,27134
267
267
  opentrons/protocol_api/core/legacy/legacy_labware_core.py,sha256=WQOgtMlq--zv0Ch7mmraYr9rQBT4ie2zHqwgamBq9J8,8606
268
268
  opentrons/protocol_api/core/legacy/legacy_module_core.py,sha256=tUhj88NKBMjCmCg6wjh1e2HX4d5hxjh8ZeJiYXaTaGY,23111
269
269
  opentrons/protocol_api/core/legacy/legacy_protocol_core.py,sha256=ZIFC7W6YA61oWWkq5xYGTcI_2S2pmALz16uB1R8HVyQ,23670
@@ -272,7 +272,7 @@ opentrons/protocol_api/core/legacy/load_info.py,sha256=r-WaH5ZJb3TRCp_zvbMMh0P4B
272
272
  opentrons/protocol_api/core/legacy/module_geometry.py,sha256=lvWFHZ81-JFw-1VZUW1R3yUIb59xpXT6H3jwlRintRo,21082
273
273
  opentrons/protocol_api/core/legacy/well_geometry.py,sha256=n5bEsvYZXXTAqYSAqlXd5t40bUPPrJ2Oj2frBZafQHA,4719
274
274
  opentrons/protocol_api/core/legacy_simulator/__init__.py,sha256=m9bLHGDJ6LSYC2WPm8tpOuu0zWSOPIrlybQgjRQBw9k,647
275
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py,sha256=obeYJXQ0KNW4dhLgYSmDWWQQ5o2pA-6BddfwDJkV5tY,22608
275
+ opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py,sha256=5inA5v2fVymV6BQBjja_HfYVVNH8ta7tZEt2jwBX5TU,22641
276
276
  opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py,sha256=28HrrHzeUfnGKXpZqQ-VM8WbPiadqVhKj2S9y33q6Lo,2910
277
277
  opentrons/protocol_engine/__init__.py,sha256=UPSk7MbidkiSH_h4V3yxMvyTePKpRr5DM9-wfkJrlSo,4094
278
278
  opentrons/protocol_engine/create_protocol_engine.py,sha256=tfDIsC7_JKlRiCXPB_8tuxRsssU6o0ViRmWbGPtX9QA,7582
@@ -357,13 +357,13 @@ opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py,s
357
357
  opentrons/protocol_engine/commands/flex_stacker/__init__.py,sha256=eyzQ4_2HRTxVCoGBWELU5TR_wgCcumuQB_9_yb7qOLE,2266
358
358
  opentrons/protocol_engine/commands/flex_stacker/close_latch.py,sha256=ywbnRYQdK78RlbRN0GWZE6kl9IUECZSbrZEs0D2FUrE,2312
359
359
  opentrons/protocol_engine/commands/flex_stacker/common.py,sha256=85x0AhqZ6-lOznhoP85GwOQEdab5x751EbQ7SM1y89A,556
360
- opentrons/protocol_engine/commands/flex_stacker/empty.py,sha256=4BKbDlwfllRZUNx-ZFU_itl3WTanjI2-xkYawmCtMEY,5783
361
- opentrons/protocol_engine/commands/flex_stacker/fill.py,sha256=JcK6b_2SFP5pCMpRtSW0Ug2GcMb7UNOEvd7zduw_62A,6015
360
+ opentrons/protocol_engine/commands/flex_stacker/empty.py,sha256=J14aB6-yMdKBu8GkCGkPQaMDJpX2tPhVNMFHHaGZp7o,5903
361
+ opentrons/protocol_engine/commands/flex_stacker/fill.py,sha256=R9vwsDjbxzLeCtdJWzGq_OYuNzXJIeSHSKuH5R4hwW0,6135
362
362
  opentrons/protocol_engine/commands/flex_stacker/open_latch.py,sha256=_LJNynwWfR6zyl3PZj3OMcEpmS5ynw-9X-9vU6eAOQ8,2272
363
363
  opentrons/protocol_engine/commands/flex_stacker/prepare_shuttle.py,sha256=AxWVa7RYaqWV0U-C5eZvGwFoz_G5yyD6ee4q90whkRY,3646
364
- opentrons/protocol_engine/commands/flex_stacker/retrieve.py,sha256=Tgb4VRSSwfKV2p7i6kETz0bDmea9zxrJpNzZLfgrRBM,15397
365
- opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py,sha256=elQRzxE0SGBMju1Auq_4X2f7GIFKyNqs_EYC2EkvlAw,7170
366
- opentrons/protocol_engine/commands/flex_stacker/store.py,sha256=zYu5cx19hV8Fc-_CGYPANXCD2Rw2jTdFxGPJC-hTjCM,10883
364
+ opentrons/protocol_engine/commands/flex_stacker/retrieve.py,sha256=45A3zaL88VdzPT1RfM89UycCg9kAoySJUJg216Is_uQ,15493
365
+ opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py,sha256=60rO_-49XPHyP7ELZcxfMe986zxRLXFCMxmZQ6Aon7A,7308
366
+ opentrons/protocol_engine/commands/flex_stacker/store.py,sha256=1D7RwjxltkScpSkZ-iRSLruovbWeEdlKcy_bu6VMZ-0,11089
367
367
  opentrons/protocol_engine/commands/heater_shaker/__init__.py,sha256=ImAPrYSUvP8tI7obvoHmrJbjwLldgGNTnFYRgfXj8hI,2757
368
368
  opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py,sha256=Q7sqFtzUD8wclRLL2PLWjnClIeLtJsiMCobStvzoJKc,2847
369
369
  opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py,sha256=UYeGrTmnGtfw22p0agefI2ZnpukKlIgFcmJv9v58Xnc,2755
@@ -450,7 +450,7 @@ opentrons/protocol_engine/state/config.py,sha256=7jSGxC6Vqj1eA8fqZ2I3zjlxVXg8pxv
450
450
  opentrons/protocol_engine/state/files.py,sha256=w8xxxg8HY0RqKKEGSfHWfrjV54Gb02O3dwtisJ-9j8E,1753
451
451
  opentrons/protocol_engine/state/fluid_stack.py,sha256=uwkf0qYk1UX5iU52xmk-e3yLPK8OG-TtMCcBqrkVFpM,5932
452
452
  opentrons/protocol_engine/state/frustum_helpers.py,sha256=ux9wCwQQXrZ9nr-KldtGTilpyW6zXdG5RfHUIUcqlTw,16822
453
- opentrons/protocol_engine/state/geometry.py,sha256=EQI9dBCqjuR0Pbfp3aoi10UIO_iNoRYg6FZ0G1e4dfo,94790
453
+ opentrons/protocol_engine/state/geometry.py,sha256=ptLGfIuFq9uGwxX3C9b8a8mYlS4RzAGhFXKgTpz6aJ4,94800
454
454
  opentrons/protocol_engine/state/labware.py,sha256=rehy7R1HIhxx3DTtTHIKxqHoBQJ_1tDhhiculMJeIy8,57556
455
455
  opentrons/protocol_engine/state/liquid_classes.py,sha256=u_z75UYdiFAKG0yB3mr1il4T3qaS0Sotq8sL7KLODP8,2990
456
456
  opentrons/protocol_engine/state/liquids.py,sha256=NoesktcQdJUjIVmet1uqqJPf-rzbo4SGemXwQC295W0,2338
@@ -486,7 +486,7 @@ opentrons/protocol_engine/types/liquid.py,sha256=6Ec0fC0SEN3jKHYeFSwbQxdEAj5hxDP
486
486
  opentrons/protocol_engine/types/liquid_class.py,sha256=SF5WS3s38S87efUqawRGSIYqjhwa4pNx7fB1xdiGHl0,2384
487
487
  opentrons/protocol_engine/types/liquid_handling.py,sha256=Xx1GihrNRJJdJJA5zIwWvIYNydbSXAHjSUAliF18Iu0,319
488
488
  opentrons/protocol_engine/types/liquid_level_detection.py,sha256=NmEasE7HR3GqtCj8tNBSuMufBLVMPYNbTXSvXVJu_JM,4783
489
- opentrons/protocol_engine/types/location.py,sha256=ZIyaj1FIIYxh8fNXfSEyx3dd-OalhlCfqsYWGYGFVoQ,5629
489
+ opentrons/protocol_engine/types/location.py,sha256=qIYBs86RO1ws2aXStmdx0CqEVNF9enlj-ACknf75nSs,5707
490
490
  opentrons/protocol_engine/types/module.py,sha256=su7Qw5Z0o-qAGfz0XC6nOqJpgpe84Kx96E9oHUt7Q9I,8921
491
491
  opentrons/protocol_engine/types/partial_tip_configuration.py,sha256=4RMtHOAX-dgpXWA737tthj_izTBnhKphBcA24LAKmhI,2760
492
492
  opentrons/protocol_engine/types/run_time_parameters.py,sha256=5gH4GmGK7e3OkSClftZT6VA4wXELIvEMgpmQ__waceU,4468
@@ -582,9 +582,9 @@ opentrons/util/helpers.py,sha256=3hr801bWGbxEcOFAS7f-iOhmnUhoK5qahbB8SIvaCfY,165
582
582
  opentrons/util/linal.py,sha256=IlKAP9HkNBBgULeSf4YVwSKHdx9jnCjSr7nvDvlRALg,5753
583
583
  opentrons/util/logging_config.py,sha256=UHoY7dyD6WMYNP5GKowbMxUSG_hlXeI5TaIwksR5u-U,6887
584
584
  opentrons/util/performance_helpers.py,sha256=ew7H8XD20iS6-2TJAzbQeyzStZkkE6PzHt_Adx3wbZQ,5172
585
- opentrons-8.4.0a2.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
586
- opentrons-8.4.0a2.dist-info/METADATA,sha256=TuBx_GurDW920K5Rdm5rU-KrVQQYvp28TlwZIOkTEH4,5084
587
- opentrons-8.4.0a2.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
588
- opentrons-8.4.0a2.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
589
- opentrons-8.4.0a2.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
590
- opentrons-8.4.0a2.dist-info/RECORD,,
585
+ opentrons-8.4.0a3.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
586
+ opentrons-8.4.0a3.dist-info/METADATA,sha256=CZoqSSIORoNQWj0ebai61XeELxufiPTpZOHmgyVDA30,5084
587
+ opentrons-8.4.0a3.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
588
+ opentrons-8.4.0a3.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
589
+ opentrons-8.4.0a3.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
590
+ opentrons-8.4.0a3.dist-info/RECORD,,