UncountablePythonSDK 0.0.160__py3-none-any.whl → 0.0.162__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.
docs/requirements.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  furo==2025.12.19
2
2
  myst-parser==5.0.0
3
- sphinx-autoapi==3.7.0
3
+ sphinx-autoapi==3.8.0
4
4
  sphinx-copybutton==0.5.2
5
5
  Sphinx==9.1.0
6
6
  sphinx_design==0.7.0
@@ -2,6 +2,7 @@
2
2
  # ruff: noqa: E402 Q003
3
3
  # fmt: off
4
4
  # isort: skip_file
5
+ from .api.file_folders import add_file_to_folder as add_file_to_folder_t
5
6
  from .api.notebooks import add_notebook_content as add_notebook_content_t
6
7
  from .api.recipes import add_recipe_to_project as add_recipe_to_project_t
7
8
  from .api.recipes import add_time_series_data as add_time_series_data_t
@@ -22,7 +23,6 @@ from .api.runsheet import complete_async_upload as complete_async_upload_t
22
23
  from .api.chemical import convert_chemical_formats as convert_chemical_formats_t
23
24
  from .api.entity import create_entities as create_entities_t
24
25
  from .api.entity import create_entity as create_entity_t
25
- from .api.files import create_file_record as create_file_record_t
26
26
  from .api.inputs import create_inputs as create_inputs_t
27
27
  from .api.recipes import create_mix_order as create_mix_order_t
28
28
  from .api.entity import create_or_update_entity as create_or_update_entity_t
@@ -102,6 +102,7 @@ from . import recipe_metadata_t as recipe_metadata_t
102
102
  from . import recipe_output_metadata_t as recipe_output_metadata_t
103
103
  from . import recipe_step_relationships_t as recipe_step_relationships_t
104
104
  from . import recipe_tags_t as recipe_tags_t
105
+ from . import recipe_workflow_step_types_t as recipe_workflow_step_types_t
105
106
  from . import recipe_workflow_steps_t as recipe_workflow_steps_t
106
107
  from . import recipes_t as recipes_t
107
108
  from .api.integrations import register_sockets_token as register_sockets_token_t
@@ -132,6 +133,7 @@ from .api.recipes import set_recipe_total as set_recipe_total_t
132
133
  from .api.entity import set_values as set_values_t
133
134
  from . import sockets_t as sockets_t
134
135
  from . import specs_t as specs_t
136
+ from . import step_relationships_t as step_relationships_t
135
137
  from .api.entity import transition_entity_phase as transition_entity_phase_t
136
138
  from .api.recipes import unarchive_recipes as unarchive_recipes_t
137
139
  from . import units_t as units_t
@@ -142,12 +144,15 @@ from .api.outputs import update_output_condition_parameter as update_output_cond
142
144
  from . import uploader_t as uploader_t
143
145
  from .api.condition_parameters import upsert_condition_match as upsert_condition_match_t
144
146
  from .api.field_options import upsert_field_options as upsert_field_options_t
147
+ from .api.recipes import upsert_recipe_workflow_step as upsert_recipe_workflow_step_t
148
+ from .api.recipes import upsert_step_relationships as upsert_step_relationships_t
145
149
  from . import users_t as users_t
146
150
  from . import webhook_job_t as webhook_job_t
147
151
  from . import workflows_t as workflows_t
148
152
 
149
153
 
150
154
  __all__: list[str] = [
155
+ "add_file_to_folder_t",
151
156
  "add_notebook_content_t",
152
157
  "add_recipe_to_project_t",
153
158
  "add_time_series_data_t",
@@ -168,7 +173,6 @@ __all__: list[str] = [
168
173
  "convert_chemical_formats_t",
169
174
  "create_entities_t",
170
175
  "create_entity_t",
171
- "create_file_record_t",
172
176
  "create_inputs_t",
173
177
  "create_mix_order_t",
174
178
  "create_or_update_entity_t",
@@ -248,6 +252,7 @@ __all__: list[str] = [
248
252
  "recipe_output_metadata_t",
249
253
  "recipe_step_relationships_t",
250
254
  "recipe_tags_t",
255
+ "recipe_workflow_step_types_t",
251
256
  "recipe_workflow_steps_t",
252
257
  "recipes_t",
253
258
  "register_sockets_token_t",
@@ -278,6 +283,7 @@ __all__: list[str] = [
278
283
  "set_values_t",
279
284
  "sockets_t",
280
285
  "specs_t",
286
+ "step_relationships_t",
281
287
  "transition_entity_phase_t",
282
288
  "unarchive_recipes_t",
283
289
  "units_t",
@@ -288,6 +294,8 @@ __all__: list[str] = [
288
294
  "uploader_t",
289
295
  "upsert_condition_match_t",
290
296
  "upsert_field_options_t",
297
+ "upsert_recipe_workflow_step_t",
298
+ "upsert_step_relationships_t",
291
299
  "users_t",
292
300
  "webhook_job_t",
293
301
  "workflows_t",
@@ -8,8 +8,9 @@ import datetime # noqa: F401
8
8
  from decimal import Decimal # noqa: F401
9
9
  import dataclasses
10
10
  from pkgs.serialization import serial_class
11
+ from ... import async_batch_t
11
12
  from ... import base_t
12
- from ... import response_t
13
+ from ... import identifier_t
13
14
 
14
15
  __all__: list[str] = [
15
16
  "Arguments",
@@ -19,23 +20,24 @@ __all__: list[str] = [
19
20
  ]
20
21
 
21
22
  ENDPOINT_METHOD = "POST"
22
- ENDPOINT_PATH = "api/external/file_upload/external_create_file_record"
23
+ ENDPOINT_PATH = "api/external/file_folders/add_file_to_folder"
23
24
 
24
25
 
25
26
  # DO NOT MODIFY -- This file is generated by type_spec
26
27
  @serial_class(
27
- named_type_path="sdk.api.files.create_file_record.Arguments",
28
+ named_type_path="sdk.api.file_folders.add_file_to_folder.Arguments",
28
29
  )
29
30
  @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
30
31
  class Arguments:
31
- pass
32
+ file_id: base_t.ObjectId
33
+ folder_key: identifier_t.IdentifierKey
32
34
 
33
35
 
34
36
  # DO NOT MODIFY -- This file is generated by type_spec
35
37
  @serial_class(
36
- named_type_path="sdk.api.files.create_file_record.Data",
38
+ named_type_path="sdk.api.file_folders.add_file_to_folder.Data",
37
39
  )
38
40
  @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
39
- class Data(response_t.Response):
40
- file_id: base_t.ObjectId
41
+ class Data(async_batch_t.AsyncBatchActionReturn):
42
+ pass
41
43
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -36,6 +36,7 @@ class Arguments:
36
36
  update_type: post_base_t.UpdateType
37
37
  requirement_type: ConditionParameterRequirementType | None = None
38
38
  material_family_key: identifier_t.IdentifierKey | None = None
39
+ analytical_method_keys: list[identifier_t.IdentifierKey] | None = None
39
40
 
40
41
 
41
42
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -38,6 +38,7 @@ class Arguments:
38
38
  recipe_metadata: list[recipe_metadata_t.MetadataValue] | None = None
39
39
  identifiers: recipe_identifiers_t.RecipeIdentifiers | None = None
40
40
  definition_key: identifier_t.IdentifierKey | None = None
41
+ recipe_key: identifier_t.IdentifierKey | None = None
41
42
 
42
43
 
43
44
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,46 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ import dataclasses
10
+ from pkgs.serialization import serial_class
11
+ from ... import async_batch_t
12
+ from ... import base_t
13
+ from ... import identifier_t
14
+ from ... import recipe_workflow_step_types_t
15
+
16
+ __all__: list[str] = [
17
+ "Arguments",
18
+ "Data",
19
+ "ENDPOINT_METHOD",
20
+ "ENDPOINT_PATH",
21
+ ]
22
+
23
+ ENDPOINT_METHOD = "POST"
24
+ ENDPOINT_PATH = "api/external/recipes/upsert_recipe_workflow_step"
25
+
26
+
27
+ # DO NOT MODIFY -- This file is generated by type_spec
28
+ @serial_class(
29
+ named_type_path="sdk.api.recipes.upsert_recipe_workflow_step.Arguments",
30
+ )
31
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
32
+ class Arguments:
33
+ recipe_key: identifier_t.IdentifierKey
34
+ data_source: recipe_workflow_step_types_t.RecipeWorkflowStepDataSource
35
+ location: recipe_workflow_step_types_t.RecipeWorkflowStepLocation
36
+ recipe_workflow_step_key: identifier_t.IdentifierKey | None = None
37
+
38
+
39
+ # DO NOT MODIFY -- This file is generated by type_spec
40
+ @serial_class(
41
+ named_type_path="sdk.api.recipes.upsert_recipe_workflow_step.Data",
42
+ )
43
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
44
+ class Data(async_batch_t.AsyncBatchActionReturn):
45
+ pass
46
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,91 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ from enum import StrEnum
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from pkgs.serialization import serial_union_annotation
13
+ from ... import async_batch_t
14
+ from ... import base_t
15
+ from ... import identifier_t
16
+ from ... import recipe_workflow_steps_t
17
+ from ... import step_relationships_t
18
+
19
+ __all__: list[str] = [
20
+ "Arguments",
21
+ "Data",
22
+ "ENDPOINT_METHOD",
23
+ "ENDPOINT_PATH",
24
+ "StepRelationshipEdit",
25
+ "StepRelationshipEditBase",
26
+ "StepRelationshipEditType",
27
+ "StepRelationshipEditUpsert",
28
+ ]
29
+
30
+ ENDPOINT_METHOD = "POST"
31
+ ENDPOINT_PATH = "api/external/recipes/upsert_step_relationships"
32
+
33
+
34
+ # DO NOT MODIFY -- This file is generated by type_spec
35
+ class StepRelationshipEditType(StrEnum):
36
+ UPSERT = "upsert"
37
+
38
+
39
+ # DO NOT MODIFY -- This file is generated by type_spec
40
+ @serial_class(
41
+ named_type_path="sdk.api.recipes.upsert_step_relationships.StepRelationshipEditBase",
42
+ )
43
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
44
+ class StepRelationshipEditBase:
45
+ type: StepRelationshipEditType
46
+
47
+
48
+ # DO NOT MODIFY -- This file is generated by type_spec
49
+ @serial_class(
50
+ named_type_path="sdk.api.recipes.upsert_step_relationships.StepRelationshipEditUpsert",
51
+ parse_require={"type"},
52
+ )
53
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
54
+ class StepRelationshipEditUpsert(StepRelationshipEditBase):
55
+ type: typing.Literal[StepRelationshipEditType.UPSERT] = StepRelationshipEditType.UPSERT
56
+ source_recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifier
57
+ target_recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifier
58
+ relationship: step_relationships_t.StepRelationshipType
59
+
60
+
61
+ # DO NOT MODIFY -- This file is generated by type_spec
62
+ StepRelationshipEdit = typing.Annotated[
63
+ typing.Union[StepRelationshipEditUpsert],
64
+ serial_union_annotation(
65
+ named_type_path="sdk.api.recipes.upsert_step_relationships.StepRelationshipEdit",
66
+ discriminator="type",
67
+ discriminator_map={
68
+ "upsert": StepRelationshipEditUpsert,
69
+ },
70
+ ),
71
+ ]
72
+
73
+
74
+ # DO NOT MODIFY -- This file is generated by type_spec
75
+ @serial_class(
76
+ named_type_path="sdk.api.recipes.upsert_step_relationships.Arguments",
77
+ )
78
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
79
+ class Arguments:
80
+ recipe_key: identifier_t.IdentifierKey
81
+ edits: list[StepRelationshipEdit]
82
+
83
+
84
+ # DO NOT MODIFY -- This file is generated by type_spec
85
+ @serial_class(
86
+ named_type_path="sdk.api.recipes.upsert_step_relationships.Data",
87
+ )
88
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
89
+ class Data(async_batch_t.AsyncBatchActionReturn):
90
+ pass
91
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -34,6 +34,7 @@ from uncountable.types import notifications_t
34
34
  import uncountable.types.api.integrations.push_notification as push_notification_t
35
35
  from uncountable.types import recipe_identifiers_t
36
36
  from uncountable.types import recipe_metadata_t
37
+ from uncountable.types import recipe_workflow_step_types_t
37
38
  from uncountable.types import recipe_workflow_steps_t
38
39
  import uncountable.types.api.triggers.run_trigger as run_trigger_t
39
40
  import uncountable.types.api.entity.set_barcode as set_barcode_t
@@ -44,6 +45,8 @@ import uncountable.types.api.entity.unlock_entity as unlock_entity_t
44
45
  import uncountable.types.api.recipes.unlock_recipes as unlock_recipes_t
45
46
  from uncountable.types import uploader_t
46
47
  import uncountable.types.api.condition_parameters.upsert_condition_match as upsert_condition_match_t
48
+ import uncountable.types.api.recipes.upsert_recipe_workflow_step as upsert_recipe_workflow_step_t
49
+ import uncountable.types.api.recipes.upsert_step_relationships as upsert_step_relationships_t
47
50
  import uuid
48
51
  from abc import ABC, abstractmethod
49
52
  from pkgs.serialization_util import serialize_for_api
@@ -362,6 +365,7 @@ class AsyncBatchProcessorBase(ABC):
362
365
  recipe_metadata: list[recipe_metadata_t.MetadataValue] | None = None,
363
366
  identifiers: recipe_identifiers_t.RecipeIdentifiers | None = None,
364
367
  definition_key: identifier_t.IdentifierKey | None = None,
368
+ recipe_key: identifier_t.IdentifierKey | None = None,
365
369
  depends_on: list[str] | None = None,
366
370
  _request_options: client_config_t.RequestOptions | None = None,
367
371
  ) -> async_batch_t.QueuedAsyncBatchRequest:
@@ -373,8 +377,9 @@ class AsyncBatchProcessorBase(ABC):
373
377
  :param workflow_id: The identifier of the workflow to create the recipe with
374
378
  :param workflow_variant_id: The identifier of the workflow variant to create the recipe with
375
379
  :param recipe_metadata: Metadata values to populate the recipe with
376
- :param identifiers: A recipe won't be created if it matches the identifier. An identifier must be unique in the schema
380
+ :param identifiers: [DEPRECATED] - use `recipeKey`. A recipe won't be created if it matches the identifier. An identifier must be unique in the schema. An error will be raised if an argument is provided to both `recipeKey` and `identifiers` properties.
377
381
  :param definition_key: The entity definition identifier, default is used if not supplied
382
+ :param recipe_key: If this identifier matches an existing recipe, the id of the existing recipe will be returned and no update will occur. Use the `lookup_entity` endpoint to match an existing recipe based on a set of field values.
378
383
  :param depends_on: A list of batch reference keys to process before processing this request
379
384
  """
380
385
  args = create_recipe_t.Arguments(
@@ -386,6 +391,7 @@ class AsyncBatchProcessorBase(ABC):
386
391
  recipe_metadata=recipe_metadata,
387
392
  identifiers=identifiers,
388
393
  definition_key=definition_key,
394
+ recipe_key=recipe_key,
389
395
  )
390
396
  json_data = serialize_for_api(args)
391
397
 
@@ -981,3 +987,75 @@ class AsyncBatchProcessorBase(ABC):
981
987
  path=req.path,
982
988
  batch_reference=req.batch_reference,
983
989
  )
990
+
991
+ def upsert_recipe_workflow_step(
992
+ self,
993
+ *,
994
+ recipe_key: identifier_t.IdentifierKey,
995
+ data_source: recipe_workflow_step_types_t.RecipeWorkflowStepDataSource,
996
+ location: recipe_workflow_step_types_t.RecipeWorkflowStepLocation,
997
+ recipe_workflow_step_key: identifier_t.IdentifierKey | None = None,
998
+ depends_on: list[str] | None = None,
999
+ _request_options: client_config_t.RequestOptions | None = None,
1000
+ ) -> async_batch_t.QueuedAsyncBatchRequest:
1001
+ """Create or update a recipe workflow step on a recipe
1002
+
1003
+ :param depends_on: A list of batch reference keys to process before processing this request
1004
+ """
1005
+ args = upsert_recipe_workflow_step_t.Arguments(
1006
+ recipe_key=recipe_key,
1007
+ data_source=data_source,
1008
+ location=location,
1009
+ recipe_workflow_step_key=recipe_workflow_step_key,
1010
+ )
1011
+ json_data = serialize_for_api(args)
1012
+
1013
+ batch_reference = str(uuid.uuid4())
1014
+
1015
+ req = async_batch_t.AsyncBatchRequest(
1016
+ path=async_batch_t.AsyncBatchRequestPath.UPSERT_RECIPE_WORKFLOW_STEP,
1017
+ data=json_data,
1018
+ depends_on=depends_on,
1019
+ batch_reference=batch_reference,
1020
+ )
1021
+
1022
+ self._enqueue(req)
1023
+
1024
+ return async_batch_t.QueuedAsyncBatchRequest(
1025
+ path=req.path,
1026
+ batch_reference=req.batch_reference,
1027
+ )
1028
+
1029
+ def upsert_step_relationships(
1030
+ self,
1031
+ *,
1032
+ recipe_key: identifier_t.IdentifierKey,
1033
+ edits: list[upsert_step_relationships_t.StepRelationshipEdit],
1034
+ depends_on: list[str] | None = None,
1035
+ _request_options: client_config_t.RequestOptions | None = None,
1036
+ ) -> async_batch_t.QueuedAsyncBatchRequest:
1037
+ """Upsert step relationships on a recipe
1038
+
1039
+ :param depends_on: A list of batch reference keys to process before processing this request
1040
+ """
1041
+ args = upsert_step_relationships_t.Arguments(
1042
+ recipe_key=recipe_key,
1043
+ edits=edits,
1044
+ )
1045
+ json_data = serialize_for_api(args)
1046
+
1047
+ batch_reference = str(uuid.uuid4())
1048
+
1049
+ req = async_batch_t.AsyncBatchRequest(
1050
+ path=async_batch_t.AsyncBatchRequestPath.UPSERT_STEP_RELATIONSHIPS,
1051
+ data=json_data,
1052
+ depends_on=depends_on,
1053
+ batch_reference=batch_reference,
1054
+ )
1055
+
1056
+ self._enqueue(req)
1057
+
1058
+ return async_batch_t.QueuedAsyncBatchRequest(
1059
+ path=req.path,
1060
+ batch_reference=req.batch_reference,
1061
+ )
@@ -53,6 +53,8 @@ class AsyncBatchRequestPath(StrEnum):
53
53
  LOCK_ENTITY = "entity/lock_entity"
54
54
  UNLOCK_ENTITY = "entity/unlock_entity"
55
55
  RUN_TRIGGER = "triggers/run_trigger"
56
+ UPSERT_STEP_RELATIONSHIPS = "recipes/upsert_step_relationships"
57
+ UPSERT_RECIPE_WORKFLOW_STEP = "recipes/upsert_recipe_workflow_step"
56
58
 
57
59
 
58
60
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -8,6 +8,7 @@ import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
10
  from pkgs.serialization import OpaqueKey
11
+ import uncountable.types.api.file_folders.add_file_to_folder as add_file_to_folder_t
11
12
  import uncountable.types.api.notebooks.add_notebook_content as add_notebook_content_t
12
13
  import uncountable.types.api.recipes.add_recipe_to_project as add_recipe_to_project_t
13
14
  import uncountable.types.api.recipes.add_time_series_data as add_time_series_data_t
@@ -24,7 +25,6 @@ import uncountable.types.api.runsheet.complete_async_upload as complete_async_up
24
25
  import uncountable.types.api.chemical.convert_chemical_formats as convert_chemical_formats_t
25
26
  import uncountable.types.api.entity.create_entities as create_entities_t
26
27
  import uncountable.types.api.entity.create_entity as create_entity_t
27
- import uncountable.types.api.files.create_file_record as create_file_record_t
28
28
  import uncountable.types.api.inputs.create_inputs as create_inputs_t
29
29
  import uncountable.types.api.recipes.create_mix_order as create_mix_order_t
30
30
  import uncountable.types.api.entity.create_or_update_entity as create_or_update_entity_t
@@ -86,6 +86,7 @@ import uncountable.types.api.integrations.push_notification as push_notification
86
86
  from uncountable.types import recipe_identifiers_t
87
87
  from uncountable.types import recipe_links_t
88
88
  from uncountable.types import recipe_metadata_t
89
+ from uncountable.types import recipe_workflow_step_types_t
89
90
  from uncountable.types import recipe_workflow_steps_t
90
91
  import uncountable.types.api.integrations.register_sockets_token as register_sockets_token_t
91
92
  import uncountable.types.api.recipes.remove_recipe_from_project as remove_recipe_from_project_t
@@ -119,6 +120,8 @@ import uncountable.types.api.outputs.update_output_condition_parameter as update
119
120
  from uncountable.types import uploader_t
120
121
  import uncountable.types.api.condition_parameters.upsert_condition_match as upsert_condition_match_t
121
122
  import uncountable.types.api.field_options.upsert_field_options as upsert_field_options_t
123
+ import uncountable.types.api.recipes.upsert_recipe_workflow_step as upsert_recipe_workflow_step_t
124
+ import uncountable.types.api.recipes.upsert_step_relationships as upsert_step_relationships_t
122
125
  from abc import ABC, abstractmethod
123
126
  import dataclasses
124
127
 
@@ -139,6 +142,30 @@ class ClientMethods(ABC):
139
142
  def do_request(self, *, api_request: APIRequest, return_type: type[DT]) -> DT:
140
143
  ...
141
144
 
145
+ def add_file_to_folder(
146
+ self,
147
+ *,
148
+ file_id: base_t.ObjectId,
149
+ folder_key: identifier_t.IdentifierKey,
150
+ _request_options: client_config_t.RequestOptions | None = None,
151
+ ) -> add_file_to_folder_t.Data:
152
+ """Add a previously uploaded file to a folder in the Files repository. This is the second step of a two-step upload workflow: first upload the file via file_upload/external_create_file_record to obtain a file_id, then call this endpoint to place it in a target folder. Returns the created document's ID in result_id.
153
+
154
+ :param file_id: ID of the file upload returned by file_upload/external_create_file_record
155
+ :param folder_key: Target folder to place the file in. Use type 'id' with a folder ID, or type 'ref_name' with 'root' for the top-level folder.
156
+ """
157
+ args = add_file_to_folder_t.Arguments(
158
+ file_id=file_id,
159
+ folder_key=folder_key,
160
+ )
161
+ api_request = APIRequest(
162
+ method=add_file_to_folder_t.ENDPOINT_METHOD,
163
+ endpoint=add_file_to_folder_t.ENDPOINT_PATH,
164
+ args=args,
165
+ request_options=_request_options,
166
+ )
167
+ return self.do_request(api_request=api_request, return_type=add_file_to_folder_t.Data)
168
+
142
169
  def add_notebook_content(
143
170
  self,
144
171
  *,
@@ -469,23 +496,6 @@ class ClientMethods(ABC):
469
496
  )
470
497
  return self.do_request(api_request=api_request, return_type=create_entity_t.Data)
471
498
 
472
- def create_file_record(
473
- self,
474
- *,
475
- _request_options: client_config_t.RequestOptions | None = None,
476
- ) -> create_file_record_t.Data:
477
- """Upload Files to Uncountable and retrieve the File Id. File bytes must be included in a multi-part form field that shares its name with the uploaded file.
478
-
479
- """
480
- args = create_file_record_t.Arguments()
481
- api_request = APIRequest(
482
- method=create_file_record_t.ENDPOINT_METHOD,
483
- endpoint=create_file_record_t.ENDPOINT_PATH,
484
- args=args,
485
- request_options=_request_options,
486
- )
487
- return self.do_request(api_request=api_request, return_type=create_file_record_t.Data)
488
-
489
499
  def external_create_inputs(
490
500
  self,
491
501
  *,
@@ -569,6 +579,7 @@ class ClientMethods(ABC):
569
579
  recipe_metadata: list[recipe_metadata_t.MetadataValue] | None = None,
570
580
  identifiers: recipe_identifiers_t.RecipeIdentifiers | None = None,
571
581
  definition_key: identifier_t.IdentifierKey | None = None,
582
+ recipe_key: identifier_t.IdentifierKey | None = None,
572
583
  _request_options: client_config_t.RequestOptions | None = None,
573
584
  ) -> create_recipe_t.Data:
574
585
  """Returns the id of the recipe being created.
@@ -579,8 +590,9 @@ class ClientMethods(ABC):
579
590
  :param workflow_id: The identifier of the workflow to create the recipe with
580
591
  :param workflow_variant_id: The identifier of the workflow variant to create the recipe with
581
592
  :param recipe_metadata: Metadata values to populate the recipe with
582
- :param identifiers: A recipe won't be created if it matches the identifier. An identifier must be unique in the schema
593
+ :param identifiers: [DEPRECATED] - use `recipeKey`. A recipe won't be created if it matches the identifier. An identifier must be unique in the schema. An error will be raised if an argument is provided to both `recipeKey` and `identifiers` properties.
583
594
  :param definition_key: The entity definition identifier, default is used if not supplied
595
+ :param recipe_key: If this identifier matches an existing recipe, the id of the existing recipe will be returned and no update will occur. Use the `lookup_entity` endpoint to match an existing recipe based on a set of field values.
584
596
  """
585
597
  args = create_recipe_t.Arguments(
586
598
  name=name,
@@ -591,6 +603,7 @@ class ClientMethods(ABC):
591
603
  recipe_metadata=recipe_metadata,
592
604
  identifiers=identifiers,
593
605
  definition_key=definition_key,
606
+ recipe_key=recipe_key,
594
607
  )
595
608
  api_request = APIRequest(
596
609
  method=create_recipe_t.ENDPOINT_METHOD,
@@ -2357,6 +2370,7 @@ class ClientMethods(ABC):
2357
2370
  update_type: post_base_t.UpdateType,
2358
2371
  requirement_type: update_output_condition_parameter_t.ConditionParameterRequirementType | None = None,
2359
2372
  material_family_key: identifier_t.IdentifierKey | None = None,
2373
+ analytical_method_keys: list[identifier_t.IdentifierKey] | None = None,
2360
2374
  _request_options: client_config_t.RequestOptions | None = None,
2361
2375
  ) -> update_output_condition_parameter_t.Data:
2362
2376
  """Adds, updates, or removes a condition parameter on an output
@@ -2366,6 +2380,7 @@ class ClientMethods(ABC):
2366
2380
  :param update_type: Use "append" to add or update, "remove" to delete
2367
2381
  :param requirement_type: The requirement level for the condition parameter. Required when update_type is "append"
2368
2382
  :param material_family_key: The material family context. If omitted, creates a global setting
2383
+ :param analytical_method_keys: When update_type is "append", sets the analytical methods for this condition parameter on the output. The provided list replaces the existing set of analytical methods.
2369
2384
  """
2370
2385
  args = update_output_condition_parameter_t.Arguments(
2371
2386
  output_key=output_key,
@@ -2373,6 +2388,7 @@ class ClientMethods(ABC):
2373
2388
  update_type=update_type,
2374
2389
  requirement_type=requirement_type,
2375
2390
  material_family_key=material_family_key,
2391
+ analytical_method_keys=analytical_method_keys,
2376
2392
  )
2377
2393
  api_request = APIRequest(
2378
2394
  method=update_output_condition_parameter_t.ENDPOINT_METHOD,
@@ -2433,3 +2449,51 @@ class ClientMethods(ABC):
2433
2449
  request_options=_request_options,
2434
2450
  )
2435
2451
  return self.do_request(api_request=api_request, return_type=upsert_field_options_t.Data)
2452
+
2453
+ def upsert_recipe_workflow_step(
2454
+ self,
2455
+ *,
2456
+ recipe_key: identifier_t.IdentifierKey,
2457
+ data_source: recipe_workflow_step_types_t.RecipeWorkflowStepDataSource,
2458
+ location: recipe_workflow_step_types_t.RecipeWorkflowStepLocation,
2459
+ recipe_workflow_step_key: identifier_t.IdentifierKey | None = None,
2460
+ _request_options: client_config_t.RequestOptions | None = None,
2461
+ ) -> upsert_recipe_workflow_step_t.Data:
2462
+ """Create or update a recipe workflow step on a recipe
2463
+
2464
+ """
2465
+ args = upsert_recipe_workflow_step_t.Arguments(
2466
+ recipe_key=recipe_key,
2467
+ data_source=data_source,
2468
+ location=location,
2469
+ recipe_workflow_step_key=recipe_workflow_step_key,
2470
+ )
2471
+ api_request = APIRequest(
2472
+ method=upsert_recipe_workflow_step_t.ENDPOINT_METHOD,
2473
+ endpoint=upsert_recipe_workflow_step_t.ENDPOINT_PATH,
2474
+ args=args,
2475
+ request_options=_request_options,
2476
+ )
2477
+ return self.do_request(api_request=api_request, return_type=upsert_recipe_workflow_step_t.Data)
2478
+
2479
+ def upsert_step_relationships(
2480
+ self,
2481
+ *,
2482
+ recipe_key: identifier_t.IdentifierKey,
2483
+ edits: list[upsert_step_relationships_t.StepRelationshipEdit],
2484
+ _request_options: client_config_t.RequestOptions | None = None,
2485
+ ) -> upsert_step_relationships_t.Data:
2486
+ """Upsert step relationships on a recipe
2487
+
2488
+ """
2489
+ args = upsert_step_relationships_t.Arguments(
2490
+ recipe_key=recipe_key,
2491
+ edits=edits,
2492
+ )
2493
+ api_request = APIRequest(
2494
+ method=upsert_step_relationships_t.ENDPOINT_METHOD,
2495
+ endpoint=upsert_step_relationships_t.ENDPOINT_PATH,
2496
+ args=args,
2497
+ request_options=_request_options,
2498
+ )
2499
+ return self.do_request(api_request=api_request, return_type=upsert_step_relationships_t.Data)
@@ -77,6 +77,7 @@ __all__: list[str] = [
77
77
  "equipment": "Equipment",
78
78
  "equipment_maintenance": "Equipment Maintenance",
79
79
  "equipment_type": "Equipment Type",
80
+ "external_ai_connector": "External AI Connector",
80
81
  "external_ai_model": "External AI Model",
81
82
  "external_ai_session": "External AI Session",
82
83
  "experiment_group": "Experiment Group",
@@ -120,6 +121,7 @@ __all__: list[str] = [
120
121
  "measurement_group_input": "Request Measurement Group Input",
121
122
  "measurement_group_recipe": "Request Measurement Group Experiment",
122
123
  "measurement_requested": "Measurement Requested",
124
+ "milestone": "Milestone",
123
125
  "ml_job": "Batch Processing Job",
124
126
  "naming_scheme": "Naming Scheme",
125
127
  "naming_counter": "Naming Counter",
@@ -305,6 +307,7 @@ class EntityType(StrEnum):
305
307
  EQUIPMENT = "equipment"
306
308
  EQUIPMENT_MAINTENANCE = "equipment_maintenance"
307
309
  EQUIPMENT_TYPE = "equipment_type"
310
+ EXTERNAL_AI_CONNECTOR = "external_ai_connector"
308
311
  EXTERNAL_AI_MODEL = "external_ai_model"
309
312
  EXTERNAL_AI_SESSION = "external_ai_session"
310
313
  EXPERIMENT_GROUP = "experiment_group"
@@ -348,6 +351,7 @@ class EntityType(StrEnum):
348
351
  MEASUREMENT_GROUP_INPUT = "measurement_group_input"
349
352
  MEASUREMENT_GROUP_RECIPE = "measurement_group_recipe"
350
353
  MEASUREMENT_REQUESTED = "measurement_requested"
354
+ MILESTONE = "milestone"
351
355
  ML_JOB = "ml_job"
352
356
  NAMING_SCHEME = "naming_scheme"
353
357
  NAMING_COUNTER = "naming_counter"
@@ -30,6 +30,7 @@ from .listing_t import FilterScalarType as FilterScalarType
30
30
  from .listing_t import FilterIdType as FilterIdType
31
31
  from .listing_t import StringFilterValue as StringFilterValue
32
32
  from .listing_t import FilterSpecEquals as FilterSpecEquals
33
+ from .listing_t import FilterSpecEqualsBoolean as FilterSpecEqualsBoolean
33
34
  from .listing_t import FilterSpecInclude as FilterSpecInclude
34
35
  from .listing_t import FilterSpecIStrContains as FilterSpecIStrContains
35
36
  from .listing_t import FilterSpecIStrStartsWith as FilterSpecIStrStartsWith
@@ -33,6 +33,7 @@ __all__: list[str] = [
33
33
  "FilterSpec",
34
34
  "FilterSpecBase",
35
35
  "FilterSpecEquals",
36
+ "FilterSpecEqualsBoolean",
36
37
  "FilterSpecExists",
37
38
  "FilterSpecGeq",
38
39
  "FilterSpecGreater",
@@ -324,6 +325,7 @@ ColumnIdentifier = typing.Annotated[
324
325
  # DO NOT MODIFY -- This file is generated by type_spec
325
326
  class FilterRelation(StrEnum):
326
327
  EQUALS = "equals"
328
+ EQUALS_BOOLEAN = "equals_boolean"
327
329
  GREATER = "greater"
328
330
  GEQ = "geq"
329
331
  LESS = "less"
@@ -382,6 +384,17 @@ class FilterSpecEquals(FilterSpecBase):
382
384
  value: FilterScalarType
383
385
 
384
386
 
387
+ # DO NOT MODIFY -- This file is generated by type_spec
388
+ @serial_class(
389
+ named_type_path="sdk.listing.FilterSpecEqualsBoolean",
390
+ parse_require={"relation"},
391
+ )
392
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
393
+ class FilterSpecEqualsBoolean(FilterSpecBase):
394
+ relation: typing.Literal[FilterRelation.EQUALS_BOOLEAN] = FilterRelation.EQUALS_BOOLEAN
395
+ value: bool
396
+
397
+
385
398
  # DO NOT MODIFY -- This file is generated by type_spec
386
399
  @serial_class(
387
400
  named_type_path="sdk.listing.FilterSpecInclude",
@@ -475,12 +488,13 @@ class FilterSpecLeq(FilterSpecBase):
475
488
 
476
489
  # DO NOT MODIFY -- This file is generated by type_spec
477
490
  FilterSpec = typing.Annotated[
478
- FilterSpecEquals | FilterSpecGreater | FilterSpecGeq | FilterSpecLeq | FilterSpecIStrContains | FilterSpecIStrStartsWith | FilterSpecInclude | FilterSpecExists | FilterSpecLess,
491
+ FilterSpecEquals | FilterSpecEqualsBoolean | FilterSpecGreater | FilterSpecGeq | FilterSpecLeq | FilterSpecIStrContains | FilterSpecIStrStartsWith | FilterSpecInclude | FilterSpecExists | FilterSpecLess,
479
492
  serial_union_annotation(
480
493
  named_type_path="sdk.listing.FilterSpec",
481
494
  discriminator="relation",
482
495
  discriminator_map={
483
496
  "equals": FilterSpecEquals,
497
+ "equals_boolean": FilterSpecEqualsBoolean,
484
498
  "greater": FilterSpecGreater,
485
499
  "geq": FilterSpecGeq,
486
500
  "leq": FilterSpecLeq,
@@ -0,0 +1,15 @@
1
+ # ruff: noqa: E402 Q003
2
+ # fmt: off
3
+ # isort: skip_file
4
+ # DO NOT MODIFY -- This file is generated by type_spec
5
+ # Kept only for SDK backwards compatibility
6
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepDataSourceType as RecipeWorkflowStepDataSourceType
7
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepDataSourceBase as RecipeWorkflowStepDataSourceBase
8
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepDataSourceWorkflowStep as RecipeWorkflowStepDataSourceWorkflowStep
9
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepDataSourceCopyRecipeWorkflowStep as RecipeWorkflowStepDataSourceCopyRecipeWorkflowStep
10
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepDataSource as RecipeWorkflowStepDataSource
11
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepLocationType as RecipeWorkflowStepLocationType
12
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepLocationBase as RecipeWorkflowStepLocationBase
13
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepLocationAtEnd as RecipeWorkflowStepLocationAtEnd
14
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepLocation as RecipeWorkflowStepLocation
15
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,118 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ from enum import StrEnum
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from pkgs.serialization import serial_union_annotation
13
+ from . import base_t
14
+ from . import identifier_t
15
+ from . import recipe_workflow_steps_t
16
+
17
+ __all__: list[str] = [
18
+ "RecipeWorkflowStepDataSource",
19
+ "RecipeWorkflowStepDataSourceBase",
20
+ "RecipeWorkflowStepDataSourceCopyRecipeWorkflowStep",
21
+ "RecipeWorkflowStepDataSourceType",
22
+ "RecipeWorkflowStepDataSourceWorkflowStep",
23
+ "RecipeWorkflowStepLocation",
24
+ "RecipeWorkflowStepLocationAtEnd",
25
+ "RecipeWorkflowStepLocationBase",
26
+ "RecipeWorkflowStepLocationType",
27
+ ]
28
+
29
+
30
+ # DO NOT MODIFY -- This file is generated by type_spec
31
+ class RecipeWorkflowStepDataSourceType(StrEnum):
32
+ WORKFLOW_STEP = "workflow_step"
33
+ COPY_RECIPE_WORKFLOW_STEP = "copy_recipe_workflow_step"
34
+
35
+
36
+ # DO NOT MODIFY -- This file is generated by type_spec
37
+ @serial_class(
38
+ named_type_path="sdk.recipe_workflow_step_types.RecipeWorkflowStepDataSourceBase",
39
+ )
40
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
41
+ class RecipeWorkflowStepDataSourceBase:
42
+ type: RecipeWorkflowStepDataSourceType
43
+
44
+
45
+ # DO NOT MODIFY -- This file is generated by type_spec
46
+ @serial_class(
47
+ named_type_path="sdk.recipe_workflow_step_types.RecipeWorkflowStepDataSourceWorkflowStep",
48
+ parse_require={"type"},
49
+ )
50
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
51
+ class RecipeWorkflowStepDataSourceWorkflowStep(RecipeWorkflowStepDataSourceBase):
52
+ type: typing.Literal[RecipeWorkflowStepDataSourceType.WORKFLOW_STEP] = RecipeWorkflowStepDataSourceType.WORKFLOW_STEP
53
+ workflow_step_key: identifier_t.IdentifierKey
54
+ name: str | None = None
55
+
56
+
57
+ # DO NOT MODIFY -- This file is generated by type_spec
58
+ @serial_class(
59
+ named_type_path="sdk.recipe_workflow_step_types.RecipeWorkflowStepDataSourceCopyRecipeWorkflowStep",
60
+ parse_require={"type"},
61
+ )
62
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
63
+ class RecipeWorkflowStepDataSourceCopyRecipeWorkflowStep(RecipeWorkflowStepDataSourceBase):
64
+ type: typing.Literal[RecipeWorkflowStepDataSourceType.COPY_RECIPE_WORKFLOW_STEP] = RecipeWorkflowStepDataSourceType.COPY_RECIPE_WORKFLOW_STEP
65
+ source_recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifierKey
66
+ name: str | None = None
67
+
68
+
69
+ # DO NOT MODIFY -- This file is generated by type_spec
70
+ RecipeWorkflowStepDataSource = typing.Annotated[
71
+ RecipeWorkflowStepDataSourceWorkflowStep | RecipeWorkflowStepDataSourceCopyRecipeWorkflowStep,
72
+ serial_union_annotation(
73
+ named_type_path="sdk.recipe_workflow_step_types.RecipeWorkflowStepDataSource",
74
+ discriminator="type",
75
+ discriminator_map={
76
+ "workflow_step": RecipeWorkflowStepDataSourceWorkflowStep,
77
+ "copy_recipe_workflow_step": RecipeWorkflowStepDataSourceCopyRecipeWorkflowStep,
78
+ },
79
+ ),
80
+ ]
81
+
82
+
83
+ # DO NOT MODIFY -- This file is generated by type_spec
84
+ class RecipeWorkflowStepLocationType(StrEnum):
85
+ AT_END = "at_end"
86
+
87
+
88
+ # DO NOT MODIFY -- This file is generated by type_spec
89
+ @serial_class(
90
+ named_type_path="sdk.recipe_workflow_step_types.RecipeWorkflowStepLocationBase",
91
+ )
92
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
93
+ class RecipeWorkflowStepLocationBase:
94
+ type: RecipeWorkflowStepLocationType
95
+
96
+
97
+ # DO NOT MODIFY -- This file is generated by type_spec
98
+ @serial_class(
99
+ named_type_path="sdk.recipe_workflow_step_types.RecipeWorkflowStepLocationAtEnd",
100
+ parse_require={"type"},
101
+ )
102
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
103
+ class RecipeWorkflowStepLocationAtEnd(RecipeWorkflowStepLocationBase):
104
+ type: typing.Literal[RecipeWorkflowStepLocationType.AT_END] = RecipeWorkflowStepLocationType.AT_END
105
+
106
+
107
+ # DO NOT MODIFY -- This file is generated by type_spec
108
+ RecipeWorkflowStepLocation = typing.Annotated[
109
+ typing.Union[RecipeWorkflowStepLocationAtEnd],
110
+ serial_union_annotation(
111
+ named_type_path="sdk.recipe_workflow_step_types.RecipeWorkflowStepLocation",
112
+ discriminator="type",
113
+ discriminator_map={
114
+ "at_end": RecipeWorkflowStepLocationAtEnd,
115
+ },
116
+ ),
117
+ ]
118
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,15 @@
1
+ # ruff: noqa: E402 Q003
2
+ # fmt: off
3
+ # isort: skip_file
4
+ # DO NOT MODIFY -- This file is generated by type_spec
5
+ # Kept only for SDK backwards compatibility
6
+ from .step_relationships_t import StepRelationshipTypeValue as StepRelationshipTypeValue
7
+ from .step_relationships_t import StepRelationshipTypeBase as StepRelationshipTypeBase
8
+ from .step_relationships_t import StepRelationshipTypeIncludeAll as StepRelationshipTypeIncludeAll
9
+ from .step_relationships_t import StepRelationshipTypeIncludeQuantity as StepRelationshipTypeIncludeQuantity
10
+ from .step_relationships_t import StepRelationshipTypeIncludePercentage as StepRelationshipTypeIncludePercentage
11
+ from .step_relationships_t import StepRelationshipTypeAutoFill as StepRelationshipTypeAutoFill
12
+ from .step_relationships_t import StepRelationshipTypeFeed as StepRelationshipTypeFeed
13
+ from .step_relationships_t import StepRelationshipTypeFeedPercentage as StepRelationshipTypeFeedPercentage
14
+ from .step_relationships_t import StepRelationshipType as StepRelationshipType
15
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,140 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ from enum import StrEnum
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from pkgs.serialization import serial_union_annotation
13
+ from . import base_t
14
+ from . import recipe_inputs_t
15
+
16
+ __all__: list[str] = [
17
+ "StepRelationshipType",
18
+ "StepRelationshipTypeAutoFill",
19
+ "StepRelationshipTypeBase",
20
+ "StepRelationshipTypeFeed",
21
+ "StepRelationshipTypeFeedPercentage",
22
+ "StepRelationshipTypeIncludeAll",
23
+ "StepRelationshipTypeIncludePercentage",
24
+ "StepRelationshipTypeIncludeQuantity",
25
+ "StepRelationshipTypeValue",
26
+ ]
27
+
28
+
29
+ # DO NOT MODIFY -- This file is generated by type_spec
30
+ class StepRelationshipTypeValue(StrEnum):
31
+ INCLUDE_ALL = "include_all"
32
+ INCLUDE_QUANTITY = "include_quantity"
33
+ INCLUDE_PERCENTAGE = "include_percentage"
34
+ AUTO_FILL = "auto_fill"
35
+ FEED = "feed"
36
+ FEED_PERCENTAGE = "feed_percentage"
37
+
38
+
39
+ # DO NOT MODIFY -- This file is generated by type_spec
40
+ @serial_class(
41
+ named_type_path="sdk.step_relationships.StepRelationshipTypeBase",
42
+ )
43
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
44
+ class StepRelationshipTypeBase:
45
+ type: StepRelationshipTypeValue
46
+
47
+
48
+ # DO NOT MODIFY -- This file is generated by type_spec
49
+ @serial_class(
50
+ named_type_path="sdk.step_relationships.StepRelationshipTypeIncludeAll",
51
+ parse_require={"type"},
52
+ )
53
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
54
+ class StepRelationshipTypeIncludeAll(StepRelationshipTypeBase):
55
+ type: typing.Literal[StepRelationshipTypeValue.INCLUDE_ALL] = StepRelationshipTypeValue.INCLUDE_ALL
56
+
57
+
58
+ # DO NOT MODIFY -- This file is generated by type_spec
59
+ @serial_class(
60
+ named_type_path="sdk.step_relationships.StepRelationshipTypeIncludeQuantity",
61
+ to_string_values={"quantity"},
62
+ parse_require={"type"},
63
+ )
64
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
65
+ class StepRelationshipTypeIncludeQuantity(StepRelationshipTypeBase):
66
+ type: typing.Literal[StepRelationshipTypeValue.INCLUDE_QUANTITY] = StepRelationshipTypeValue.INCLUDE_QUANTITY
67
+ quantity: Decimal
68
+ quantity_basis: recipe_inputs_t.QuantityBasis | None
69
+
70
+
71
+ # DO NOT MODIFY -- This file is generated by type_spec
72
+ @serial_class(
73
+ named_type_path="sdk.step_relationships.StepRelationshipTypeIncludePercentage",
74
+ to_string_values={"quantity"},
75
+ parse_require={"type"},
76
+ )
77
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
78
+ class StepRelationshipTypeIncludePercentage(StepRelationshipTypeBase):
79
+ type: typing.Literal[StepRelationshipTypeValue.INCLUDE_PERCENTAGE] = StepRelationshipTypeValue.INCLUDE_PERCENTAGE
80
+ quantity: Decimal
81
+ quantity_basis: recipe_inputs_t.QuantityBasis | None
82
+
83
+
84
+ # DO NOT MODIFY -- This file is generated by type_spec
85
+ @serial_class(
86
+ named_type_path="sdk.step_relationships.StepRelationshipTypeAutoFill",
87
+ parse_require={"type"},
88
+ )
89
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
90
+ class StepRelationshipTypeAutoFill(StepRelationshipTypeBase):
91
+ type: typing.Literal[StepRelationshipTypeValue.AUTO_FILL] = StepRelationshipTypeValue.AUTO_FILL
92
+
93
+
94
+ # DO NOT MODIFY -- This file is generated by type_spec
95
+ @serial_class(
96
+ named_type_path="sdk.step_relationships.StepRelationshipTypeFeed",
97
+ to_string_values={"feed_rate", "feed_time", "quantity"},
98
+ parse_require={"type"},
99
+ )
100
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
101
+ class StepRelationshipTypeFeed(StepRelationshipTypeBase):
102
+ type: typing.Literal[StepRelationshipTypeValue.FEED] = StepRelationshipTypeValue.FEED
103
+ quantity: Decimal
104
+ quantity_basis: recipe_inputs_t.QuantityBasis | None
105
+ feed_rate: Decimal | None = None
106
+ feed_time: Decimal | None = None
107
+
108
+
109
+ # DO NOT MODIFY -- This file is generated by type_spec
110
+ @serial_class(
111
+ named_type_path="sdk.step_relationships.StepRelationshipTypeFeedPercentage",
112
+ to_string_values={"feed_rate", "feed_time", "quantity"},
113
+ parse_require={"type"},
114
+ )
115
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
116
+ class StepRelationshipTypeFeedPercentage(StepRelationshipTypeBase):
117
+ type: typing.Literal[StepRelationshipTypeValue.FEED_PERCENTAGE] = StepRelationshipTypeValue.FEED_PERCENTAGE
118
+ quantity: Decimal
119
+ quantity_basis: recipe_inputs_t.QuantityBasis | None
120
+ feed_rate: Decimal | None = None
121
+ feed_time: Decimal | None = None
122
+
123
+
124
+ # DO NOT MODIFY -- This file is generated by type_spec
125
+ StepRelationshipType = typing.Annotated[
126
+ StepRelationshipTypeIncludeAll | StepRelationshipTypeIncludeQuantity | StepRelationshipTypeIncludePercentage | StepRelationshipTypeAutoFill | StepRelationshipTypeFeed | StepRelationshipTypeFeedPercentage,
127
+ serial_union_annotation(
128
+ named_type_path="sdk.step_relationships.StepRelationshipType",
129
+ discriminator="type",
130
+ discriminator_map={
131
+ "include_all": StepRelationshipTypeIncludeAll,
132
+ "include_quantity": StepRelationshipTypeIncludeQuantity,
133
+ "include_percentage": StepRelationshipTypeIncludePercentage,
134
+ "auto_fill": StepRelationshipTypeAutoFill,
135
+ "feed": StepRelationshipTypeFeed,
136
+ "feed_percentage": StepRelationshipTypeFeedPercentage,
137
+ },
138
+ ),
139
+ ]
140
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.160
3
+ Version: 0.0.162
4
4
  Summary: Uncountable SDK
5
5
  Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
6
6
  Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
@@ -38,6 +38,7 @@ Requires-Dist: simplejson==3.*
38
38
  Requires-Dist: grpcio==1.78.0
39
39
  Requires-Dist: protobuf>=4.21.1
40
40
  Requires-Dist: azure-storage-blob==12.*
41
+ Requires-Dist: azure-storage-file-share==12.*
41
42
  Requires-Dist: boto3-stubs[essential,ses]==1.*
42
43
  Requires-Dist: msgspec<0.21,>=0.19
43
44
  Requires-Dist: tabulate==0.9.0
@@ -2,7 +2,7 @@ docs/.gitignore,sha256=_ebkZUcwfvfnGEJ95rfj1lxoBNd6EE9ZvtOc7FsbfFE,7
2
2
  docs/conf.py,sha256=Ky-_Y76T7pwN2aBG-dSF79Av70e7ASgcOXEdQ1qyor4,3542
3
3
  docs/index.md,sha256=g4Yi5831fEkywYkkcFohYLkKzSI91SOZF7DxKsm9zgI,3193
4
4
  docs/justfile,sha256=WymCEQ6W2A8Ak79iUPmecmuaUNN2htb7STUrz5K7ELE,273
5
- docs/requirements.txt,sha256=gVAxkq2HhYRQ8HIlV4Mnuou1L4cEKTq3jJ4--adr24M,172
5
+ docs/requirements.txt,sha256=V1MVHqwMMjatcTNnZflt-n1t0eOVPkAZajkNfI6ggNo,172
6
6
  docs/integration_examples/create_ingredient.md,sha256=bzTQ943YhINxa3HQylEA26rbAsjr6HvvN_HkVkrzUeA,1547
7
7
  docs/integration_examples/create_output.md,sha256=aDn2TjzKgY-HnxnvgsZS578cvajmHpF1y2HKkHfdtd4,2104
8
8
  docs/integration_examples/index.md,sha256=LaQiK1fT8XLtazxLvPr2YjIf3Jh_Mi-goOMLatiozK8,85
@@ -159,10 +159,10 @@ uncountable/integration/queue_runner/datastore/model.py,sha256=YPqlULU7FxuwjmhXG
159
159
  uncountable/integration/secret_retrieval/__init__.py,sha256=3QXVj35w8rRMxVvmmsViFYDi3lcb3g70incfalOEm6o,87
160
160
  uncountable/integration/secret_retrieval/retrieve_secret.py,sha256=LBEf18KHtXZxg-ZZ80stJ1vW39AWf0CQllP6pNu3Eq8,2994
161
161
  uncountable/integration/webhook_server/entrypoint.py,sha256=RQndrVCKdaVBk-xJ592eGqeN-O0IOM7flXDGoJ2HXsc,3505
162
- uncountable/types/__init__.py,sha256=ApHBQPfdsERb_lWeFAtwDb1yJO7YztgBt2BKa4-HlcI,12545
162
+ uncountable/types/__init__.py,sha256=FTfD4Xlv77YSf3SrclyexVxEzJcIme-0MOq3oZBCi3o,12990
163
163
  uncountable/types/async_batch.py,sha256=yCCWrrLQfxXVqZp-KskxLBNkNmuELdz4PJjx8ULppgs,662
164
- uncountable/types/async_batch_processor.py,sha256=elN8gsywAi2hNVMjds9rMyXuYbuo5ylsL2JAy38lfEU,36988
165
- uncountable/types/async_batch_t.py,sha256=2o6BGg8L6JoYl57AHkdhCvT8t-JZKEPlKmpih8_p42k,4170
164
+ uncountable/types/async_batch_processor.py,sha256=GMEoEqh0BClpYv9ZGJZLT9CUrsw-XtD1XA-rmSnE61s,40266
165
+ uncountable/types/async_batch_t.py,sha256=AA2Jdf1z67qMocK81XlhVmVWp5j_ZCqQwks7GbR5r04,4310
166
166
  uncountable/types/async_jobs.py,sha256=JI0ScfawaqMRbJ2jbgW3YQLhijPnBeYdMnZJjygSxHg,322
167
167
  uncountable/types/async_jobs_t.py,sha256=u4xd3i512PZ-9592Q2ZgWh_faMiI4UMm0F_gOmZnerI,1389
168
168
  uncountable/types/auth_retrieval.py,sha256=770zjN1K9EF5zs1Xml7x6ke6Hkze7rcMT5FdDVCIl9M,549
@@ -173,7 +173,7 @@ uncountable/types/calculations.py,sha256=fApOFpgBemt_t7IVneVR0VdI3X5EOxiG6Xhzr6R
173
173
  uncountable/types/calculations_t.py,sha256=pl-lhjyDQuj11Sf9g1-0BsSkN7Ez8UxDp8-KMQ_3enM,709
174
174
  uncountable/types/chemical_structure.py,sha256=ujyragaD26-QG5jgKnWhO7TN3N1V9b_04T2WhqNYxxo,281
175
175
  uncountable/types/chemical_structure_t.py,sha256=VFFyits_vx4t5L2euu_qFiSpsGJjURkDPr3ISnr3nPc,855
176
- uncountable/types/client_base.py,sha256=vpWAxbvdRZXrfvzy-pYAmaorYL3gY7BFjV1eAJp17p4,108212
176
+ uncountable/types/client_base.py,sha256=piLkQpFo83kpPTIgFqLNb6mtEGcOC_h_IElsmcK5kBg,111793
177
177
  uncountable/types/client_config.py,sha256=M7FZ0m_lGmBsIYcMn8pm92DdoVzrLpzd8sH6DqTQLKo,456
178
178
  uncountable/types/client_config_t.py,sha256=m1sVg0zaVf8DvQKaDJH_fG1abU2-VZZH0wOIMDjlECU,1944
179
179
  uncountable/types/curves.py,sha256=QyEyC20jsG-LGKVx6miiF-w70vKMwNkILFBDIJ5Ok9g,345
@@ -181,7 +181,7 @@ uncountable/types/curves_t.py,sha256=DxYepdC3QKKR7mepOOBoyarNcFZQdUa5ZYH-hwCY3BI
181
181
  uncountable/types/data.py,sha256=u2isf4XEug3Eu-xSIoqGaCQmW2dFaKBHCkP_WKYwwBc,500
182
182
  uncountable/types/data_t.py,sha256=vFoypK_WMGfN28r1sSlDYHZNUdBQC0XCN7-_Mlo4FJk,2832
183
183
  uncountable/types/entity.py,sha256=Zclk1LYcRaYrMDhqyCjMSLEg0fE6_q8LHvV22Qvscgs,566
184
- uncountable/types/entity_t.py,sha256=8a3EWGsGWxsHaby0Ji95nd6uwA9txiR_UQWmpfl0Ic4,25606
184
+ uncountable/types/entity_t.py,sha256=Y6IE-ylyikpwH55hV40mhjr1VMoQEj3isdDUyxx8KOs,25778
185
185
  uncountable/types/experiment_groups.py,sha256=qUpFOx1AKgzaT_4khCOv5Xs6jwiQGbvHH-GUh3v1nv4,288
186
186
  uncountable/types/experiment_groups_t.py,sha256=29Ct-WPejpYMuGfnFfOoosU9iSfjzxpabpBX6oTPFUA,761
187
187
  uncountable/types/exports.py,sha256=VMmxUO2PpV1Y63hZ2AnVor4H-B6aswJ7YpSru_u89lU,334
@@ -208,8 +208,8 @@ uncountable/types/integrations.py,sha256=0fOhtbLIOl9w1GP9J3PTagRU8mjOKV48JNLLH3S
208
208
  uncountable/types/integrations_t.py,sha256=ihyhuMDKtJarQ19OppS0fYpJUYd8o5-w6YCDE440O-w,1871
209
209
  uncountable/types/job_definition.py,sha256=hYp5jPYLLYm3NKEqzQrQfXL0Ms5KgEQGTON13YWSPYk,1804
210
210
  uncountable/types/job_definition_t.py,sha256=3rdN-wNtswOEoWssbv2kVGw_J8fiUZRhCjCSr1h1c3U,9662
211
- uncountable/types/listing.py,sha256=TwF1WjFZK-MxeI90xVcPPC_IJrobyEg5y5DYoLlu8T4,2764
212
- uncountable/types/listing_t.py,sha256=Gmoq43ncFm5QmMehDphTxEeptKRDl8Y0Un-QNk1vL-4,18352
211
+ uncountable/types/listing.py,sha256=U-0-opI0Wgxzmwp4y0qhyT26aK_BjaqdlFVpjud-ryk,2838
212
+ uncountable/types/listing_t.py,sha256=pMvBcIZJY_94-fS2paRl0DxbWJPNYVeF6OYYyX-ppgM,18942
213
213
  uncountable/types/notices.py,sha256=j3BWaogmbLsVSqxdk6GZEnzIj30f0KVdNTP660kMeMk,346
214
214
  uncountable/types/notices_t.py,sha256=GibfAH5Ed68PqoNFyjXR9vPgQLVwH1zjaFC8EL_Ysf8,1021
215
215
  uncountable/types/notifications.py,sha256=ZGr1ULMG3cPMED83NbMjrjmgVzCeOTS1Tc-pFTNuY4Y,600
@@ -240,6 +240,8 @@ uncountable/types/recipe_step_relationships.py,sha256=qx2-_YA0Q4PuiwcM0BDixgnaxV
240
240
  uncountable/types/recipe_step_relationships_t.py,sha256=wwaAGq8NYkg9430BDdxFd89c4ubsJRft94FmrI3HPwM,520
241
241
  uncountable/types/recipe_tags.py,sha256=tKIwHY677lZCxrmOk1bbuZQgDuf1n1cNyp6c5r1uRbo,270
242
242
  uncountable/types/recipe_tags_t.py,sha256=zsA9NuIKsJg9kkN32gMxU32OjkJr2v2thgPgu7DXkCw,731
243
+ uncountable/types/recipe_workflow_step_types.py,sha256=ibdK4aKoy2iRD7wC85BR34Qq8geTnpKIBTLR5NjmVMQ,1229
244
+ uncountable/types/recipe_workflow_step_types_t.py,sha256=Z5Kd4zGldAuJhPv63GpJwjKIPjNQqYLfY-JRJGDhLbI,4597
243
245
  uncountable/types/recipe_workflow_steps.py,sha256=fb55_sREdeZrtguIZOuy4ZcTLbRBNAxQ3A0oGbH8muA,950
244
246
  uncountable/types/recipe_workflow_steps_t.py,sha256=sOpRcH2wGbqQ7UY9DhkaPaZcdVjMDx4ZrycEH3WLB7g,3671
245
247
  uncountable/types/recipes.py,sha256=6Z7bagYXX15kGlhYt_OFiYSD3lqFp4H0EquI1fUfYyk,286
@@ -256,6 +258,8 @@ uncountable/types/sockets.py,sha256=OogyQ-pLyhJkV6JrBSLTOz9v6cDViYY5QM1ScSXPU3U,
256
258
  uncountable/types/sockets_t.py,sha256=s--y5nbN4uHA2HVKW6rOz3HwIMk3MT2VKGXCA7reXb4,5608
257
259
  uncountable/types/specs.py,sha256=e2bsHJl2rbGn52k2Gg5nM4_0mON6eGm4BQKrxi3qpLM,258
258
260
  uncountable/types/specs_t.py,sha256=WuFwuHGzbz-Z9x1hH9Tyz3tuk8HXqbQsnK6dmtyv5H0,534
261
+ uncountable/types/step_relationships.py,sha256=I6t7tj-VmHAhH8YpJPIUFBxPaRiXU_Zg-4Kf0g0pfHY,1073
262
+ uncountable/types/step_relationships_t.py,sha256=53zMcuh5jRFynjuHUVMVx4BJHMVCVD9a_mwsUEezq1Q,5670
259
263
  uncountable/types/units.py,sha256=yxuddayiE8cnzrjQiIsURisWc-Vm1F37uyS3fjM--Ao,254
260
264
  uncountable/types/units_t.py,sha256=d62vY2ETqIgMHASw_IcREwDDqKAqI-vPnoBOqzMt4-o,704
261
265
  uncountable/types/uploader.py,sha256=odT7wkBfXUf1MoFy6W5JzZ-WY8JX0vO6odGOS_C2Voo,1222
@@ -296,9 +300,9 @@ uncountable/types/api/equipment/associate_equipment_input.py,sha256=K3LBXzmtOLgC
296
300
  uncountable/types/api/field_options/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
297
301
  uncountable/types/api/field_options/upsert_field_options.py,sha256=yhgbPXd75fTDzXJhZg2fiv3Nq_Ks6dhwDv6Q-6EjmZo,1631
298
302
  uncountable/types/api/file_folders/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
303
+ uncountable/types/api/file_folders/add_file_to_folder.py,sha256=h8mGJss2F-pWM2OaJFUlqTRyWbXx8Gz1GXGk1s5yDVo,1265
299
304
  uncountable/types/api/file_folders/modify_file_system.py,sha256=oklJa6g_KC18mQA-kkFmICO9pyGKLQNNG_QSYegkdkE,2815
300
305
  uncountable/types/api/files/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
301
- uncountable/types/api/files/create_file_record.py,sha256=joaPDTxCD518RjB0-dWVWoBYGpPqHWYYsqFzsVIt5MI,1167
302
306
  uncountable/types/api/files/download_file.py,sha256=pxFEha3PglQ767sSh3RjrT1a2Wu1P9uetNuEoBwAO24,3372
303
307
  uncountable/types/api/id_source/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
304
308
  uncountable/types/api/id_source/list_id_source.py,sha256=td3pA624Sv7tSpg5zifhx42AM203-m875i9JXo3P7kk,1542
@@ -331,7 +335,7 @@ uncountable/types/api/outputs/get_output_data.py,sha256=luGoQZzbZsGIzo2dXMD5f6rD
331
335
  uncountable/types/api/outputs/get_output_names.py,sha256=myxLS1YedzWlKs3st64jmM9XMUphrUltxKISBz4pVSo,1539
332
336
  uncountable/types/api/outputs/get_output_organization.py,sha256=-oi9LjPVH_UzloxwFJSAoT8OPZLuqF-KoeuSQEmcn90,6609
333
337
  uncountable/types/api/outputs/resolve_output_conditions.py,sha256=X8qHd_xZUxIlmfPyLyaBbVjdH_dIN4tj7xVuFFvaQsw,2578
334
- uncountable/types/api/outputs/update_output_condition_parameter.py,sha256=mfd4U8r1JppSssZVw6S-AYXZCalKJbw01JyBXNFTlrM,1721
338
+ uncountable/types/api/outputs/update_output_condition_parameter.py,sha256=qE-VVyrFh5Fo7yavdjEYYfT1H0RFw_QSwQapIXrFAqw,1796
335
339
  uncountable/types/api/permissions/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
336
340
  uncountable/types/api/permissions/set_core_permissions.py,sha256=RtI5l9iyR80mkh9PzpCvn02xfCKsuvHYYCXDr48FT_Q,3651
337
341
  uncountable/types/api/permissions/set_entity_permission.py,sha256=4t8JdUyCTEplB9rs7A04dw7Id-HT3k4Ff7V3X6DL9d8,3745
@@ -351,7 +355,7 @@ uncountable/types/api/recipes/associate_recipe_as_input.py,sha256=vXtdffaWJGvK1r
351
355
  uncountable/types/api/recipes/associate_recipe_as_lot.py,sha256=SBfeNGn6TF2Fawemc1hkJkElWrxD89jvZiQvCnTawBs,1283
352
356
  uncountable/types/api/recipes/clear_recipe_outputs.py,sha256=IOHeOl7eO5Arzpfgjhk3y5eWY1lWb6xSzOrIC4uH78w,1227
353
357
  uncountable/types/api/recipes/create_mix_order.py,sha256=LMLTw5malVnHsegFsKW04SBHJFDIJheh_qQClRFRsPM,1345
354
- uncountable/types/api/recipes/create_recipe.py,sha256=ESgjPKKQLPLZUOqn20LpYupxYyKl8g52RE25TC-Gjx4,1594
358
+ uncountable/types/api/recipes/create_recipe.py,sha256=xN8tmQ5rXQDyCVUqIOOlRKZf6KbH1HtzxdUhK5X7sVM,1651
355
359
  uncountable/types/api/recipes/create_recipes.py,sha256=vSBCmHWdXDGacNXiRgK22G_nei8SHK1kwSJRRBQnaPU,2106
356
360
  uncountable/types/api/recipes/disassociate_recipe_as_input.py,sha256=Lka3041BI6nXYIzKFjvKs_E9XO67ioHuFg8bEB85GCM,1251
357
361
  uncountable/types/api/recipes/edit_recipe_inputs.py,sha256=TnkdLxbiU_27IJBPUrcAxjPZ3RlUV43Qf2-PXDtDlMs,14755
@@ -373,6 +377,8 @@ uncountable/types/api/recipes/set_recipe_tags.py,sha256=C4GzlHVfTDUA2CrgDqfYrDpS
373
377
  uncountable/types/api/recipes/set_recipe_total.py,sha256=K1eHfz95txl6EUoDNap3QEsRX-if2Ns5UihzMBawwMM,1859
374
378
  uncountable/types/api/recipes/unarchive_recipes.py,sha256=ke3JPaj6hRdTjP-Qot8Gc-_ptTYqC_1ZF3kKbPJ0H88,1145
375
379
  uncountable/types/api/recipes/unlock_recipes.py,sha256=Qa_qLyp0McWpaIAXIOJxe6L9p5dfdEId_TtgUk8Lnzo,1471
380
+ uncountable/types/api/recipes/upsert_recipe_workflow_step.py,sha256=S0IagClvKmTIX98GnMkREBri2qdgvOjao-p6afCwpEc,1509
381
+ uncountable/types/api/recipes/upsert_step_relationships.py,sha256=FzIwxBRZYtsYwELGWZpPTFhqAEZVB0egX3XDvmZfYnQ,3097
376
382
  uncountable/types/api/runsheet/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
377
383
  uncountable/types/api/runsheet/complete_async_upload.py,sha256=r3zsmD8tcalMfa67MNdF7LE_YJjBsSXK07zZ9fMap0Y,1156
378
384
  uncountable/types/api/runsheet/export_default_runsheet.py,sha256=Jk6e5U5LQXN_rjbJV7g6FO2YFEDVhK3m0PxDEywHDOk,1425
@@ -383,7 +389,7 @@ uncountable/types/api/uploader/complete_async_parse.py,sha256=ffS3ApqCNkZb6QPuYE
383
389
  uncountable/types/api/uploader/invoke_uploader.py,sha256=Bj7Dq4A90k00suacwk3bLA_dCb2aovS1kAbVam2AQnM,1395
384
390
  uncountable/types/api/user/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
385
391
  uncountable/types/api/user/get_current_user_info.py,sha256=Avqi_RXtRgbefrT_dwJ9MrO6eDNSSa_Nu650FSuESlg,1109
386
- uncountablepythonsdk-0.0.160.dist-info/METADATA,sha256=_EUAQ74njcqpVHEcNhh-YJWKGbjkojjKmMKrcyCADu8,2243
387
- uncountablepythonsdk-0.0.160.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
388
- uncountablepythonsdk-0.0.160.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
389
- uncountablepythonsdk-0.0.160.dist-info/RECORD,,
392
+ uncountablepythonsdk-0.0.162.dist-info/METADATA,sha256=rms0l-jk3HaKExTdt3MknfZGNeZimXkm6TJLKAIeNic,2289
393
+ uncountablepythonsdk-0.0.162.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
394
+ uncountablepythonsdk-0.0.162.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
395
+ uncountablepythonsdk-0.0.162.dist-info/RECORD,,