UncountablePythonSDK 0.0.52__py3-none-any.whl → 0.0.131__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 UncountablePythonSDK might be problematic. Click here for more details.

Files changed (316) hide show
  1. docs/conf.py +54 -7
  2. docs/index.md +107 -4
  3. docs/integration_examples/create_ingredient.md +43 -0
  4. docs/integration_examples/create_output.md +56 -0
  5. docs/integration_examples/index.md +6 -0
  6. docs/justfile +2 -2
  7. docs/requirements.txt +6 -4
  8. examples/async_batch.py +3 -3
  9. examples/basic_auth.py +7 -0
  10. examples/create_entity.py +3 -1
  11. examples/create_ingredient_sdk.py +34 -0
  12. examples/download_files.py +26 -0
  13. examples/edit_recipe_inputs.py +4 -2
  14. examples/integration-server/jobs/materials_auto/concurrent_cron.py +11 -0
  15. examples/integration-server/jobs/materials_auto/example_cron.py +21 -0
  16. examples/integration-server/jobs/materials_auto/example_http.py +47 -0
  17. examples/integration-server/jobs/materials_auto/example_instrument.py +100 -0
  18. examples/integration-server/jobs/materials_auto/example_parse.py +140 -0
  19. examples/integration-server/jobs/materials_auto/example_predictions.py +61 -0
  20. examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +39 -0
  21. examples/integration-server/jobs/materials_auto/example_wh.py +23 -0
  22. examples/integration-server/jobs/materials_auto/profile.yaml +104 -0
  23. examples/integration-server/pyproject.toml +224 -0
  24. examples/invoke_uploader.py +4 -1
  25. examples/oauth.py +7 -0
  26. examples/set_recipe_metadata_file.py +40 -0
  27. examples/set_recipe_output_file_sdk.py +26 -0
  28. examples/upload_files.py +1 -2
  29. pkgs/argument_parser/__init__.py +9 -0
  30. pkgs/argument_parser/_is_namedtuple.py +3 -0
  31. pkgs/argument_parser/argument_parser.py +217 -70
  32. pkgs/filesystem_utils/__init__.py +1 -0
  33. pkgs/filesystem_utils/_blob_session.py +144 -0
  34. pkgs/filesystem_utils/_gdrive_session.py +10 -7
  35. pkgs/filesystem_utils/_s3_session.py +15 -13
  36. pkgs/filesystem_utils/_sftp_session.py +11 -7
  37. pkgs/filesystem_utils/file_type_utils.py +30 -10
  38. pkgs/py.typed +0 -0
  39. pkgs/serialization/__init__.py +7 -2
  40. pkgs/serialization/annotation.py +64 -0
  41. pkgs/serialization/missing_sentry.py +1 -1
  42. pkgs/serialization/opaque_key.py +1 -1
  43. pkgs/serialization/serial_alias.py +47 -0
  44. pkgs/serialization/serial_class.py +47 -26
  45. pkgs/serialization/serial_generic.py +16 -0
  46. pkgs/serialization/serial_union.py +17 -14
  47. pkgs/serialization/yaml.py +4 -1
  48. pkgs/serialization_util/__init__.py +6 -0
  49. pkgs/serialization_util/dataclasses.py +14 -0
  50. pkgs/serialization_util/serialization_helpers.py +15 -5
  51. pkgs/type_spec/actions_registry/__main__.py +0 -4
  52. pkgs/type_spec/actions_registry/emit_typescript.py +5 -5
  53. pkgs/type_spec/builder.py +354 -119
  54. pkgs/type_spec/builder_types.py +9 -0
  55. pkgs/type_spec/config.py +51 -11
  56. pkgs/type_spec/cross_output_links.py +99 -0
  57. pkgs/type_spec/emit_io_ts.py +1 -1
  58. pkgs/type_spec/emit_open_api.py +127 -36
  59. pkgs/type_spec/emit_open_api_util.py +5 -6
  60. pkgs/type_spec/emit_python.py +329 -121
  61. pkgs/type_spec/emit_typescript.py +117 -256
  62. pkgs/type_spec/emit_typescript_util.py +291 -2
  63. pkgs/type_spec/load_types.py +18 -4
  64. pkgs/type_spec/non_discriminated_union_exceptions.py +14 -0
  65. pkgs/type_spec/open_api_util.py +29 -4
  66. pkgs/type_spec/parts/base.py.prepart +13 -10
  67. pkgs/type_spec/parts/base.ts.prepart +4 -0
  68. pkgs/type_spec/type_info/__main__.py +3 -1
  69. pkgs/type_spec/type_info/emit_type_info.py +124 -29
  70. pkgs/type_spec/ui_entry_actions/__init__.py +4 -0
  71. pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +308 -0
  72. pkgs/type_spec/util.py +4 -4
  73. pkgs/type_spec/value_spec/__main__.py +26 -9
  74. pkgs/type_spec/value_spec/convert_type.py +21 -1
  75. pkgs/type_spec/value_spec/emit_python.py +25 -7
  76. pkgs/type_spec/value_spec/types.py +1 -1
  77. uncountable/core/async_batch.py +1 -1
  78. uncountable/core/client.py +142 -39
  79. uncountable/core/environment.py +41 -0
  80. uncountable/core/file_upload.py +52 -18
  81. uncountable/integration/cli.py +142 -0
  82. uncountable/integration/construct_client.py +8 -8
  83. uncountable/integration/cron.py +11 -37
  84. uncountable/integration/db/connect.py +12 -2
  85. uncountable/integration/db/session.py +25 -0
  86. uncountable/integration/entrypoint.py +8 -37
  87. uncountable/integration/executors/executors.py +125 -2
  88. uncountable/integration/executors/generic_upload_executor.py +87 -29
  89. uncountable/integration/executors/script_executor.py +3 -3
  90. uncountable/integration/http_server/__init__.py +5 -0
  91. uncountable/integration/http_server/types.py +69 -0
  92. uncountable/integration/job.py +242 -12
  93. uncountable/integration/queue_runner/__init__.py +0 -0
  94. uncountable/integration/queue_runner/command_server/__init__.py +28 -0
  95. uncountable/integration/queue_runner/command_server/command_client.py +133 -0
  96. uncountable/integration/queue_runner/command_server/command_server.py +142 -0
  97. uncountable/integration/queue_runner/command_server/constants.py +4 -0
  98. uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  99. uncountable/integration/queue_runner/command_server/protocol/command_server.proto +58 -0
  100. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +57 -0
  101. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +114 -0
  102. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +264 -0
  103. uncountable/integration/queue_runner/command_server/types.py +75 -0
  104. uncountable/integration/queue_runner/datastore/__init__.py +3 -0
  105. uncountable/integration/queue_runner/datastore/datastore_sqlite.py +250 -0
  106. uncountable/integration/queue_runner/datastore/interface.py +29 -0
  107. uncountable/integration/queue_runner/datastore/model.py +24 -0
  108. uncountable/integration/queue_runner/job_scheduler.py +200 -0
  109. uncountable/integration/queue_runner/queue_runner.py +34 -0
  110. uncountable/integration/queue_runner/types.py +7 -0
  111. uncountable/integration/queue_runner/worker.py +116 -0
  112. uncountable/integration/scan_profiles.py +67 -0
  113. uncountable/integration/scheduler.py +199 -0
  114. uncountable/integration/secret_retrieval/retrieve_secret.py +26 -4
  115. uncountable/integration/server.py +94 -69
  116. uncountable/integration/telemetry.py +150 -34
  117. uncountable/integration/webhook_server/entrypoint.py +97 -0
  118. uncountable/types/__init__.py +78 -1
  119. uncountable/types/api/batch/execute_batch.py +13 -6
  120. uncountable/types/api/batch/execute_batch_load_async.py +9 -3
  121. uncountable/types/api/chemical/convert_chemical_formats.py +17 -5
  122. uncountable/types/api/condition_parameters/__init__.py +1 -0
  123. uncountable/types/api/condition_parameters/upsert_condition_match.py +72 -0
  124. uncountable/types/api/entity/create_entities.py +19 -7
  125. uncountable/types/api/entity/create_entity.py +17 -8
  126. uncountable/types/api/entity/create_or_update_entity.py +48 -0
  127. uncountable/types/api/entity/export_entities.py +59 -0
  128. uncountable/types/api/entity/get_entities_data.py +13 -4
  129. uncountable/types/api/entity/grant_entity_permissions.py +48 -0
  130. uncountable/types/api/entity/list_aggregate.py +79 -0
  131. uncountable/types/api/entity/list_entities.py +42 -10
  132. uncountable/types/api/entity/lock_entity.py +11 -4
  133. uncountable/types/api/entity/lookup_entity.py +116 -0
  134. uncountable/types/api/entity/resolve_entity_ids.py +15 -6
  135. uncountable/types/api/entity/set_entity_field_values.py +44 -0
  136. uncountable/types/api/entity/set_values.py +10 -3
  137. uncountable/types/api/entity/transition_entity_phase.py +22 -7
  138. uncountable/types/api/entity/unlock_entity.py +10 -3
  139. uncountable/types/api/equipment/associate_equipment_input.py +9 -3
  140. uncountable/types/api/field_options/upsert_field_options.py +17 -7
  141. uncountable/types/api/files/__init__.py +1 -0
  142. uncountable/types/api/files/download_file.py +77 -0
  143. uncountable/types/api/id_source/list_id_source.py +16 -7
  144. uncountable/types/api/id_source/match_id_source.py +14 -5
  145. uncountable/types/api/input_groups/get_input_group_names.py +13 -4
  146. uncountable/types/api/inputs/create_inputs.py +23 -9
  147. uncountable/types/api/inputs/get_input_data.py +30 -12
  148. uncountable/types/api/inputs/get_input_names.py +16 -7
  149. uncountable/types/api/inputs/get_inputs_data.py +25 -7
  150. uncountable/types/api/inputs/set_input_attribute_values.py +12 -6
  151. uncountable/types/api/inputs/set_input_category.py +12 -5
  152. uncountable/types/api/inputs/set_input_subcategories.py +10 -3
  153. uncountable/types/api/inputs/set_intermediate_type.py +11 -4
  154. uncountable/types/api/integrations/__init__.py +1 -0
  155. uncountable/types/api/integrations/publish_realtime_data.py +41 -0
  156. uncountable/types/api/integrations/push_notification.py +49 -0
  157. uncountable/types/api/integrations/register_sockets_token.py +41 -0
  158. uncountable/types/api/listing/__init__.py +1 -0
  159. uncountable/types/api/listing/fetch_listing.py +58 -0
  160. uncountable/types/api/material_families/update_entity_material_families.py +10 -4
  161. uncountable/types/api/notebooks/__init__.py +1 -0
  162. uncountable/types/api/notebooks/add_notebook_content.py +119 -0
  163. uncountable/types/api/outputs/get_output_data.py +28 -13
  164. uncountable/types/api/outputs/get_output_names.py +15 -6
  165. uncountable/types/api/outputs/get_output_organization.py +173 -0
  166. uncountable/types/api/outputs/resolve_output_conditions.py +20 -8
  167. uncountable/types/api/permissions/set_core_permissions.py +26 -10
  168. uncountable/types/api/project/get_projects.py +16 -7
  169. uncountable/types/api/project/get_projects_data.py +17 -8
  170. uncountable/types/api/recipe_links/create_recipe_link.py +12 -5
  171. uncountable/types/api/recipe_links/remove_recipe_link.py +11 -4
  172. uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +16 -7
  173. uncountable/types/api/recipes/add_recipe_to_project.py +10 -3
  174. uncountable/types/api/recipes/add_time_series_data.py +64 -0
  175. uncountable/types/api/recipes/archive_recipes.py +11 -4
  176. uncountable/types/api/recipes/associate_recipe_as_input.py +12 -5
  177. uncountable/types/api/recipes/associate_recipe_as_lot.py +10 -3
  178. uncountable/types/api/recipes/clear_recipe_outputs.py +42 -0
  179. uncountable/types/api/recipes/create_mix_order.py +44 -0
  180. uncountable/types/api/recipes/create_recipe.py +15 -9
  181. uncountable/types/api/recipes/create_recipes.py +21 -9
  182. uncountable/types/api/recipes/disassociate_recipe_as_input.py +10 -3
  183. uncountable/types/api/recipes/edit_recipe_inputs.py +134 -22
  184. uncountable/types/api/recipes/get_column_calculation_values.py +57 -0
  185. uncountable/types/api/recipes/get_curve.py +11 -5
  186. uncountable/types/api/recipes/get_recipe_calculations.py +13 -7
  187. uncountable/types/api/recipes/get_recipe_links.py +10 -4
  188. uncountable/types/api/recipes/get_recipe_names.py +13 -4
  189. uncountable/types/api/recipes/get_recipe_output_metadata.py +12 -6
  190. uncountable/types/api/recipes/get_recipes_data.py +87 -33
  191. uncountable/types/api/recipes/lock_recipes.py +19 -8
  192. uncountable/types/api/recipes/remove_recipe_from_project.py +10 -3
  193. uncountable/types/api/recipes/set_recipe_inputs.py +16 -10
  194. uncountable/types/api/recipes/set_recipe_metadata.py +10 -3
  195. uncountable/types/api/recipes/set_recipe_output_annotations.py +24 -12
  196. uncountable/types/api/recipes/set_recipe_output_file.py +55 -0
  197. uncountable/types/api/recipes/set_recipe_outputs.py +35 -12
  198. uncountable/types/api/recipes/set_recipe_tags.py +26 -9
  199. uncountable/types/api/recipes/set_recipe_total.py +59 -0
  200. uncountable/types/api/recipes/unarchive_recipes.py +10 -3
  201. uncountable/types/api/recipes/unlock_recipes.py +14 -6
  202. uncountable/types/api/runsheet/__init__.py +1 -0
  203. uncountable/types/api/runsheet/complete_async_upload.py +41 -0
  204. uncountable/types/api/triggers/run_trigger.py +11 -4
  205. uncountable/types/api/uploader/complete_async_parse.py +46 -0
  206. uncountable/types/api/uploader/invoke_uploader.py +13 -6
  207. uncountable/types/api/user/__init__.py +1 -0
  208. uncountable/types/api/user/get_current_user_info.py +40 -0
  209. uncountable/types/async_batch.py +2 -1
  210. uncountable/types/async_batch_processor.py +618 -18
  211. uncountable/types/async_batch_t.py +54 -7
  212. uncountable/types/async_jobs.py +8 -0
  213. uncountable/types/async_jobs_t.py +52 -0
  214. uncountable/types/auth_retrieval.py +11 -0
  215. uncountable/types/auth_retrieval_t.py +75 -0
  216. uncountable/types/base.py +0 -1
  217. uncountable/types/base_t.py +13 -11
  218. uncountable/types/calculations.py +0 -1
  219. uncountable/types/calculations_t.py +5 -2
  220. uncountable/types/chemical_structure.py +0 -1
  221. uncountable/types/chemical_structure_t.py +6 -5
  222. uncountable/types/client_base.py +751 -70
  223. uncountable/types/client_config.py +1 -1
  224. uncountable/types/client_config_t.py +17 -3
  225. uncountable/types/curves.py +0 -1
  226. uncountable/types/curves_t.py +10 -7
  227. uncountable/types/data.py +12 -0
  228. uncountable/types/data_t.py +103 -0
  229. uncountable/types/entity.py +4 -1
  230. uncountable/types/entity_t.py +125 -7
  231. uncountable/types/experiment_groups.py +0 -1
  232. uncountable/types/experiment_groups_t.py +5 -2
  233. uncountable/types/exports.py +8 -0
  234. uncountable/types/exports_t.py +34 -0
  235. uncountable/types/field_values.py +19 -1
  236. uncountable/types/field_values_t.py +246 -9
  237. uncountable/types/fields.py +0 -1
  238. uncountable/types/fields_t.py +5 -2
  239. uncountable/types/generic_upload.py +6 -1
  240. uncountable/types/generic_upload_t.py +88 -9
  241. uncountable/types/id_source.py +0 -1
  242. uncountable/types/id_source_t.py +26 -7
  243. uncountable/types/identifier.py +0 -1
  244. uncountable/types/identifier_t.py +13 -5
  245. uncountable/types/input_attributes.py +0 -1
  246. uncountable/types/input_attributes_t.py +4 -4
  247. uncountable/types/inputs.py +1 -1
  248. uncountable/types/inputs_t.py +24 -4
  249. uncountable/types/integration_server.py +8 -0
  250. uncountable/types/integration_server_t.py +46 -0
  251. uncountable/types/integration_session.py +10 -0
  252. uncountable/types/integration_session_t.py +60 -0
  253. uncountable/types/integrations.py +10 -0
  254. uncountable/types/integrations_t.py +62 -0
  255. uncountable/types/job_definition.py +4 -6
  256. uncountable/types/job_definition_t.py +96 -65
  257. uncountable/types/listing.py +9 -0
  258. uncountable/types/listing_t.py +51 -0
  259. uncountable/types/notices.py +8 -0
  260. uncountable/types/notices_t.py +37 -0
  261. uncountable/types/notifications.py +11 -0
  262. uncountable/types/notifications_t.py +74 -0
  263. uncountable/types/outputs.py +0 -1
  264. uncountable/types/outputs_t.py +6 -3
  265. uncountable/types/overrides.py +9 -0
  266. uncountable/types/overrides_t.py +49 -0
  267. uncountable/types/permissions.py +0 -1
  268. uncountable/types/permissions_t.py +1 -2
  269. uncountable/types/phases.py +0 -1
  270. uncountable/types/phases_t.py +5 -2
  271. uncountable/types/post_base.py +0 -1
  272. uncountable/types/post_base_t.py +1 -2
  273. uncountable/types/queued_job.py +17 -0
  274. uncountable/types/queued_job_t.py +140 -0
  275. uncountable/types/recipe_identifiers.py +0 -1
  276. uncountable/types/recipe_identifiers_t.py +21 -8
  277. uncountable/types/recipe_inputs.py +0 -1
  278. uncountable/types/recipe_inputs_t.py +1 -2
  279. uncountable/types/recipe_links.py +0 -1
  280. uncountable/types/recipe_links_t.py +7 -4
  281. uncountable/types/recipe_metadata.py +0 -1
  282. uncountable/types/recipe_metadata_t.py +14 -9
  283. uncountable/types/recipe_output_metadata.py +0 -1
  284. uncountable/types/recipe_output_metadata_t.py +5 -2
  285. uncountable/types/recipe_tags.py +0 -1
  286. uncountable/types/recipe_tags_t.py +5 -2
  287. uncountable/types/recipe_workflow_steps.py +0 -1
  288. uncountable/types/recipe_workflow_steps_t.py +14 -7
  289. uncountable/types/recipes.py +0 -1
  290. uncountable/types/recipes_t.py +6 -2
  291. uncountable/types/response.py +0 -1
  292. uncountable/types/response_t.py +3 -2
  293. uncountable/types/secret_retrieval.py +0 -1
  294. uncountable/types/secret_retrieval_t.py +13 -7
  295. uncountable/types/sockets.py +20 -0
  296. uncountable/types/sockets_t.py +169 -0
  297. uncountable/types/structured_filters.py +25 -0
  298. uncountable/types/structured_filters_t.py +248 -0
  299. uncountable/types/units.py +0 -1
  300. uncountable/types/units_t.py +5 -2
  301. uncountable/types/uploader.py +24 -0
  302. uncountable/types/uploader_t.py +222 -0
  303. uncountable/types/users.py +0 -1
  304. uncountable/types/users_t.py +5 -2
  305. uncountable/types/webhook_job.py +9 -0
  306. uncountable/types/webhook_job_t.py +48 -0
  307. uncountable/types/workflows.py +0 -1
  308. uncountable/types/workflows_t.py +10 -4
  309. uncountablepythonsdk-0.0.131.dist-info/METADATA +64 -0
  310. uncountablepythonsdk-0.0.131.dist-info/RECORD +363 -0
  311. {UncountablePythonSDK-0.0.52.dist-info → uncountablepythonsdk-0.0.131.dist-info}/WHEEL +1 -1
  312. UncountablePythonSDK-0.0.52.dist-info/METADATA +0 -56
  313. UncountablePythonSDK-0.0.52.dist-info/RECORD +0 -246
  314. docs/quickstart.md +0 -19
  315. uncountable/core/version.py +0 -11
  316. {UncountablePythonSDK-0.0.52.dist-info → uncountablepythonsdk-0.0.131.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -9,17 +8,25 @@ import typing # noqa: F401
9
8
  import datetime # noqa: F401
10
9
  from decimal import Decimal # noqa: F401
11
10
  from pkgs.serialization import OpaqueKey
11
+ import uncountable.types.api.notebooks.add_notebook_content as add_notebook_content_t
12
12
  import uncountable.types.api.recipes.add_recipe_to_project as add_recipe_to_project_t
13
+ import uncountable.types.api.recipes.add_time_series_data as add_time_series_data_t
13
14
  import uncountable.types.api.recipes.archive_recipes as archive_recipes_t
14
15
  import uncountable.types.api.equipment.associate_equipment_input as associate_equipment_input_t
15
16
  import uncountable.types.api.recipes.associate_recipe_as_input as associate_recipe_as_input_t
16
17
  import uncountable.types.api.recipes.associate_recipe_as_lot as associate_recipe_as_lot_t
17
18
  from uncountable.types import async_batch_t
18
19
  from uncountable.types import base_t
20
+ import uncountable.types.api.recipes.clear_recipe_outputs as clear_recipe_outputs_t
21
+ from uncountable.types import client_config_t
22
+ import uncountable.types.api.uploader.complete_async_parse as complete_async_parse_t
23
+ import uncountable.types.api.runsheet.complete_async_upload as complete_async_upload_t
19
24
  import uncountable.types.api.chemical.convert_chemical_formats as convert_chemical_formats_t
20
25
  import uncountable.types.api.entity.create_entities as create_entities_t
21
26
  import uncountable.types.api.entity.create_entity as create_entity_t
22
27
  import uncountable.types.api.inputs.create_inputs as create_inputs_t
28
+ import uncountable.types.api.recipes.create_mix_order as create_mix_order_t
29
+ import uncountable.types.api.entity.create_or_update_entity as create_or_update_entity_t
23
30
  import uncountable.types.api.recipes.create_recipe as create_recipe_t
24
31
  import uncountable.types.api.recipe_links.create_recipe_link as create_recipe_link_t
25
32
  import uncountable.types.api.recipes.create_recipes as create_recipes_t
@@ -28,7 +35,13 @@ import uncountable.types.api.recipes.edit_recipe_inputs as edit_recipe_inputs_t
28
35
  from uncountable.types import entity_t
29
36
  import uncountable.types.api.batch.execute_batch as execute_batch_t
30
37
  import uncountable.types.api.batch.execute_batch_load_async as execute_batch_load_async_t
38
+ import uncountable.types.api.entity.export_entities as export_entities_t
39
+ from uncountable.types import exports_t
40
+ import uncountable.types.api.listing.fetch_listing as fetch_listing_t
31
41
  from uncountable.types import field_values_t
42
+ from uncountable.types import generic_upload_t
43
+ import uncountable.types.api.recipes.get_column_calculation_values as get_column_calculation_values_t
44
+ import uncountable.types.api.user.get_current_user_info as get_current_user_info_t
32
45
  import uncountable.types.api.recipes.get_curve as get_curve_t
33
46
  import uncountable.types.api.entity.get_entities_data as get_entities_data_t
34
47
  import uncountable.types.api.inputs.get_input_data as get_input_data_t
@@ -45,26 +58,35 @@ import uncountable.types.api.recipe_metadata.get_recipe_metadata_data as get_rec
45
58
  import uncountable.types.api.recipes.get_recipe_names as get_recipe_names_t
46
59
  import uncountable.types.api.recipes.get_recipe_output_metadata as get_recipe_output_metadata_t
47
60
  import uncountable.types.api.recipes.get_recipes_data as get_recipes_data_t
61
+ import uncountable.types.api.entity.grant_entity_permissions as grant_entity_permissions_t
48
62
  from uncountable.types import id_source_t
49
63
  from uncountable.types import identifier_t
50
64
  import uncountable.types.api.uploader.invoke_uploader as invoke_uploader_t
65
+ import uncountable.types.api.entity.list_aggregate as list_aggregate_t
51
66
  import uncountable.types.api.entity.list_entities as list_entities_t
52
67
  import uncountable.types.api.id_source.list_id_source as list_id_source_t
68
+ from uncountable.types import listing_t
53
69
  import uncountable.types.api.entity.lock_entity as lock_entity_t
54
70
  import uncountable.types.api.recipes.lock_recipes as lock_recipes_t
71
+ import uncountable.types.api.entity.lookup_entity as lookup_entity_t
55
72
  import uncountable.types.api.id_source.match_id_source as match_id_source_t
73
+ from uncountable.types import notices_t
74
+ from uncountable.types import notifications_t
56
75
  from uncountable.types import permissions_t
57
76
  from uncountable.types import post_base_t
77
+ import uncountable.types.api.integrations.push_notification as push_notification_t
58
78
  from uncountable.types import recipe_identifiers_t
59
79
  from uncountable.types import recipe_links_t
60
80
  from uncountable.types import recipe_metadata_t
61
81
  from uncountable.types import recipe_workflow_steps_t
82
+ import uncountable.types.api.integrations.register_sockets_token as register_sockets_token_t
62
83
  import uncountable.types.api.recipes.remove_recipe_from_project as remove_recipe_from_project_t
63
84
  import uncountable.types.api.recipe_links.remove_recipe_link as remove_recipe_link_t
64
85
  import uncountable.types.api.entity.resolve_entity_ids as resolve_entity_ids_t
65
86
  import uncountable.types.api.outputs.resolve_output_conditions as resolve_output_conditions_t
66
87
  import uncountable.types.api.triggers.run_trigger as run_trigger_t
67
88
  import uncountable.types.api.permissions.set_core_permissions as set_core_permissions_t
89
+ import uncountable.types.api.entity.set_entity_field_values as set_entity_field_values_t
68
90
  import uncountable.types.api.inputs.set_input_attribute_values as set_input_attribute_values_t
69
91
  import uncountable.types.api.inputs.set_input_category as set_input_category_t
70
92
  import uncountable.types.api.inputs.set_input_subcategories as set_input_subcategories_t
@@ -72,14 +94,20 @@ import uncountable.types.api.inputs.set_intermediate_type as set_intermediate_ty
72
94
  import uncountable.types.api.recipes.set_recipe_inputs as set_recipe_inputs_t
73
95
  import uncountable.types.api.recipes.set_recipe_metadata as set_recipe_metadata_t
74
96
  import uncountable.types.api.recipes.set_recipe_output_annotations as set_recipe_output_annotations_t
97
+ import uncountable.types.api.recipes.set_recipe_output_file as set_recipe_output_file_t
75
98
  import uncountable.types.api.recipes.set_recipe_outputs as set_recipe_outputs_t
76
99
  import uncountable.types.api.recipes.set_recipe_tags as set_recipe_tags_t
100
+ import uncountable.types.api.recipes.set_recipe_total as set_recipe_total_t
77
101
  import uncountable.types.api.entity.set_values as set_values_t
102
+ from uncountable.types import sockets_t
103
+ from uncountable.types import structured_filters_t
78
104
  import uncountable.types.api.entity.transition_entity_phase as transition_entity_phase_t
79
105
  import uncountable.types.api.recipes.unarchive_recipes as unarchive_recipes_t
80
106
  import uncountable.types.api.entity.unlock_entity as unlock_entity_t
81
107
  import uncountable.types.api.recipes.unlock_recipes as unlock_recipes_t
82
108
  import uncountable.types.api.material_families.update_entity_material_families as update_entity_material_families_t
109
+ from uncountable.types import uploader_t
110
+ import uncountable.types.api.condition_parameters.upsert_condition_match as upsert_condition_match_t
83
111
  import uncountable.types.api.field_options.upsert_field_options as upsert_field_options_t
84
112
  from abc import ABC, abstractmethod
85
113
  import dataclasses
@@ -92,6 +120,7 @@ class APIRequest:
92
120
  method: str
93
121
  endpoint: str
94
122
  args: typing.Any
123
+ request_options: client_config_t.RequestOptions | None = None
95
124
 
96
125
 
97
126
  class ClientMethods(ABC):
@@ -100,11 +129,39 @@ class ClientMethods(ABC):
100
129
  def do_request(self, *, api_request: APIRequest, return_type: type[DT]) -> DT:
101
130
  ...
102
131
 
132
+ def add_notebook_content(
133
+ self,
134
+ *,
135
+ notebook_key: identifier_t.IdentifierKey,
136
+ location: add_notebook_content_t.Location,
137
+ contents: list[add_notebook_content_t.InputContent],
138
+ _request_options: client_config_t.RequestOptions | None = None,
139
+ ) -> add_notebook_content_t.Data:
140
+ """Adds content to an existing notebook
141
+
142
+ :param notebook_key: Key of the notebook to add the content to
143
+ :param location: The location to add the content to in the notebook
144
+ :param contents: List of input content to add to the notebook
145
+ """
146
+ args = add_notebook_content_t.Arguments(
147
+ notebook_key=notebook_key,
148
+ location=location,
149
+ contents=contents,
150
+ )
151
+ api_request = APIRequest(
152
+ method=add_notebook_content_t.ENDPOINT_METHOD,
153
+ endpoint=add_notebook_content_t.ENDPOINT_PATH,
154
+ args=args,
155
+ request_options=_request_options,
156
+ )
157
+ return self.do_request(api_request=api_request, return_type=add_notebook_content_t.Data)
158
+
103
159
  def add_recipe_to_project(
104
160
  self,
105
161
  *,
106
162
  recipe_key: identifier_t.IdentifierKey,
107
163
  project_key: identifier_t.IdentifierKey,
164
+ _request_options: client_config_t.RequestOptions | None = None,
108
165
  ) -> add_recipe_to_project_t.Data:
109
166
  """Adds a recipe to a project
110
167
 
@@ -119,14 +176,43 @@ class ClientMethods(ABC):
119
176
  method=add_recipe_to_project_t.ENDPOINT_METHOD,
120
177
  endpoint=add_recipe_to_project_t.ENDPOINT_PATH,
121
178
  args=args,
179
+ request_options=_request_options,
122
180
  )
123
181
  return self.do_request(api_request=api_request, return_type=add_recipe_to_project_t.Data)
124
182
 
183
+ def external_add_time_series_data(
184
+ self,
185
+ *,
186
+ time_series_segment_key: identifier_t.IdentifierKey,
187
+ time_series_data: list[add_time_series_data_t.TimeSeriesDatum],
188
+ on_conflict: add_time_series_data_t.OnTimepointConflict = add_time_series_data_t.OnTimepointConflict.ERROR,
189
+ _request_options: client_config_t.RequestOptions | None = None,
190
+ ) -> add_time_series_data_t.Data:
191
+ """Add timepoint data to a time series segment.
192
+
193
+ :param time_series_segment_key: The time series segment to add data to
194
+ :param time_series_data: The data to add to the time series segment
195
+ :param on_conflict: What to do if a TimeSeriesDatum already exists at the same timestamp
196
+ """
197
+ args = add_time_series_data_t.Arguments(
198
+ time_series_segment_key=time_series_segment_key,
199
+ time_series_data=time_series_data,
200
+ on_conflict=on_conflict,
201
+ )
202
+ api_request = APIRequest(
203
+ method=add_time_series_data_t.ENDPOINT_METHOD,
204
+ endpoint=add_time_series_data_t.ENDPOINT_PATH,
205
+ args=args,
206
+ request_options=_request_options,
207
+ )
208
+ return self.do_request(api_request=api_request, return_type=add_time_series_data_t.Data)
209
+
125
210
  def archive_recipes(
126
211
  self,
127
212
  *,
128
213
  recipes: list[identifier_t.IdentifierKey],
129
- reason: typing.Optional[str] = None,
214
+ reason: str | None = None,
215
+ _request_options: client_config_t.RequestOptions | None = None,
130
216
  ) -> archive_recipes_t.Data:
131
217
  """Archive the provided recipes and their children
132
218
 
@@ -141,6 +227,7 @@ class ClientMethods(ABC):
141
227
  method=archive_recipes_t.ENDPOINT_METHOD,
142
228
  endpoint=archive_recipes_t.ENDPOINT_PATH,
143
229
  args=args,
230
+ request_options=_request_options,
144
231
  )
145
232
  return self.do_request(api_request=api_request, return_type=archive_recipes_t.Data)
146
233
 
@@ -149,6 +236,7 @@ class ClientMethods(ABC):
149
236
  *,
150
237
  equipment_key: identifier_t.IdentifierKey,
151
238
  material_family_ids: list[base_t.ObjectId],
239
+ _request_options: client_config_t.RequestOptions | None = None,
152
240
  ) -> associate_equipment_input_t.Data:
153
241
  """Create or return the input association for equipment
154
242
 
@@ -163,6 +251,7 @@ class ClientMethods(ABC):
163
251
  method=associate_equipment_input_t.ENDPOINT_METHOD,
164
252
  endpoint=associate_equipment_input_t.ENDPOINT_PATH,
165
253
  args=args,
254
+ request_options=_request_options,
166
255
  )
167
256
  return self.do_request(api_request=api_request, return_type=associate_equipment_input_t.Data)
168
257
 
@@ -170,8 +259,9 @@ class ClientMethods(ABC):
170
259
  self,
171
260
  *,
172
261
  recipe_key: identifier_t.IdentifierKey,
173
- input_key: typing.Optional[identifier_t.IdentifierKey] = None,
174
- show_in_listings: typing.Optional[bool] = None,
262
+ input_key: identifier_t.IdentifierKey | None = None,
263
+ show_in_listings: bool | None = None,
264
+ _request_options: client_config_t.RequestOptions | None = None,
175
265
  ) -> associate_recipe_as_input_t.Data:
176
266
  """Create or return the input association for a recipe
177
267
 
@@ -188,6 +278,7 @@ class ClientMethods(ABC):
188
278
  method=associate_recipe_as_input_t.ENDPOINT_METHOD,
189
279
  endpoint=associate_recipe_as_input_t.ENDPOINT_PATH,
190
280
  args=args,
281
+ request_options=_request_options,
191
282
  )
192
283
  return self.do_request(api_request=api_request, return_type=associate_recipe_as_input_t.Data)
193
284
 
@@ -196,6 +287,7 @@ class ClientMethods(ABC):
196
287
  *,
197
288
  recipe_key: identifier_t.IdentifierKey,
198
289
  ingredient_key: identifier_t.IdentifierKey,
290
+ _request_options: client_config_t.RequestOptions | None = None,
199
291
  ) -> associate_recipe_as_lot_t.Data:
200
292
  """Create a new lot association for the provided recipe with the provided ingredient
201
293
 
@@ -210,13 +302,82 @@ class ClientMethods(ABC):
210
302
  method=associate_recipe_as_lot_t.ENDPOINT_METHOD,
211
303
  endpoint=associate_recipe_as_lot_t.ENDPOINT_PATH,
212
304
  args=args,
305
+ request_options=_request_options,
213
306
  )
214
307
  return self.do_request(api_request=api_request, return_type=associate_recipe_as_lot_t.Data)
215
308
 
309
+ def clear_recipe_outputs(
310
+ self,
311
+ *,
312
+ recipe_key: identifier_t.IdentifierKey,
313
+ _request_options: client_config_t.RequestOptions | None = None,
314
+ ) -> clear_recipe_outputs_t.Data:
315
+ """Clears all output values & output metadata for a given recipe
316
+
317
+ :param recipe_key: The identifier of the recipe
318
+ """
319
+ args = clear_recipe_outputs_t.Arguments(
320
+ recipe_key=recipe_key,
321
+ )
322
+ api_request = APIRequest(
323
+ method=clear_recipe_outputs_t.ENDPOINT_METHOD,
324
+ endpoint=clear_recipe_outputs_t.ENDPOINT_PATH,
325
+ args=args,
326
+ request_options=_request_options,
327
+ )
328
+ return self.do_request(api_request=api_request, return_type=clear_recipe_outputs_t.Data)
329
+
330
+ def complete_async_parse(
331
+ self,
332
+ *,
333
+ parsed_file_data: list[uploader_t.ParsedFileData],
334
+ async_job_key: identifier_t.IdentifierKey,
335
+ upload_destination: generic_upload_t.UploadDestinationRecipe,
336
+ _request_options: client_config_t.RequestOptions | None = None,
337
+ ) -> complete_async_parse_t.Data:
338
+ """Parses uploaded files asynchronously
339
+
340
+ """
341
+ args = complete_async_parse_t.Arguments(
342
+ parsed_file_data=parsed_file_data,
343
+ async_job_key=async_job_key,
344
+ upload_destination=upload_destination,
345
+ )
346
+ api_request = APIRequest(
347
+ method=complete_async_parse_t.ENDPOINT_METHOD,
348
+ endpoint=complete_async_parse_t.ENDPOINT_PATH,
349
+ args=args,
350
+ request_options=_request_options,
351
+ )
352
+ return self.do_request(api_request=api_request, return_type=complete_async_parse_t.Data)
353
+
354
+ def complete_async_upload(
355
+ self,
356
+ *,
357
+ async_job_id: base_t.ObjectId,
358
+ file_id: base_t.ObjectId,
359
+ _request_options: client_config_t.RequestOptions | None = None,
360
+ ) -> complete_async_upload_t.Data:
361
+ """Processes an file id with a given async job id to be uploaded asynchronously
362
+
363
+ """
364
+ args = complete_async_upload_t.Arguments(
365
+ async_job_id=async_job_id,
366
+ file_id=file_id,
367
+ )
368
+ api_request = APIRequest(
369
+ method=complete_async_upload_t.ENDPOINT_METHOD,
370
+ endpoint=complete_async_upload_t.ENDPOINT_PATH,
371
+ args=args,
372
+ request_options=_request_options,
373
+ )
374
+ return self.do_request(api_request=api_request, return_type=complete_async_upload_t.Data)
375
+
216
376
  def convert_chemical_formats(
217
377
  self,
218
378
  *,
219
379
  source_chemical_structures: list[convert_chemical_formats_t.ChemicalStructureFile],
380
+ _request_options: client_config_t.RequestOptions | None = None,
220
381
  ) -> convert_chemical_formats_t.Data:
221
382
  """Converts chemical formats, into the format used by Uncountable and usable in other APIs for eg. set_input_attribute_values
222
383
 
@@ -228,24 +389,29 @@ class ClientMethods(ABC):
228
389
  method=convert_chemical_formats_t.ENDPOINT_METHOD,
229
390
  endpoint=convert_chemical_formats_t.ENDPOINT_PATH,
230
391
  args=args,
392
+ request_options=_request_options,
231
393
  )
232
394
  return self.do_request(api_request=api_request, return_type=convert_chemical_formats_t.Data)
233
395
 
234
396
  def create_entities(
235
397
  self,
236
398
  *,
237
- definition_id: base_t.ObjectId,
238
- entity_type: typing.Union[typing.Literal[entity_t.EntityType.LAB_REQUEST], typing.Literal[entity_t.EntityType.APPROVAL], typing.Literal[entity_t.EntityType.CUSTOM_ENTITY], typing.Literal[entity_t.EntityType.INVENTORY_AMOUNT], typing.Literal[entity_t.EntityType.TASK], typing.Literal[entity_t.EntityType.PROJECT], typing.Literal[entity_t.EntityType.EQUIPMENT], typing.Literal[entity_t.EntityType.INV_LOCAL_LOCATIONS], typing.Literal[entity_t.EntityType.FIELD_OPTION_SET], typing.Literal[entity_t.EntityType.WEBHOOK], typing.Literal[entity_t.EntityType.SPECS], typing.Literal[entity_t.EntityType.GOAL]],
399
+ entity_type: entity_t.LimitedEntityType,
239
400
  entities_to_create: list[create_entities_t.EntityToCreate],
401
+ definition_id: base_t.ObjectId | None = None,
402
+ definition_key: identifier_t.IdentifierKey | None = None,
403
+ _request_options: client_config_t.RequestOptions | None = None,
240
404
  ) -> create_entities_t.Data:
241
405
  """Creates new Uncountable entities
242
406
 
243
407
  :param definition_id: Definition id for the entities to create
408
+ :param definition_key: Key for the definition of the entities to create
244
409
  :param entity_type: The type of the entities to create
245
410
  :param entities_to_create: A list of the entities to create
246
411
  """
247
412
  args = create_entities_t.Arguments(
248
413
  definition_id=definition_id,
414
+ definition_key=definition_key,
249
415
  entity_type=entity_type,
250
416
  entities_to_create=entities_to_create,
251
417
  )
@@ -253,30 +419,39 @@ class ClientMethods(ABC):
253
419
  method=create_entities_t.ENDPOINT_METHOD,
254
420
  endpoint=create_entities_t.ENDPOINT_PATH,
255
421
  args=args,
422
+ request_options=_request_options,
256
423
  )
257
424
  return self.do_request(api_request=api_request, return_type=create_entities_t.Data)
258
425
 
259
426
  def create_entity(
260
427
  self,
261
428
  *,
262
- definition_id: base_t.ObjectId,
263
- entity_type: typing.Union[typing.Literal[entity_t.EntityType.LAB_REQUEST], typing.Literal[entity_t.EntityType.APPROVAL], typing.Literal[entity_t.EntityType.CUSTOM_ENTITY], typing.Literal[entity_t.EntityType.INVENTORY_AMOUNT], typing.Literal[entity_t.EntityType.TASK], typing.Literal[entity_t.EntityType.PROJECT], typing.Literal[entity_t.EntityType.EQUIPMENT], typing.Literal[entity_t.EntityType.INV_LOCAL_LOCATIONS], typing.Literal[entity_t.EntityType.FIELD_OPTION_SET], typing.Literal[entity_t.EntityType.WEBHOOK], typing.Literal[entity_t.EntityType.SPECS], typing.Literal[entity_t.EntityType.GOAL]],
264
- field_values: typing.Optional[typing.Optional[list[field_values_t.FieldRefNameValue]]] = None,
429
+ entity_type: entity_t.LimitedEntityType,
430
+ definition_id: base_t.ObjectId | None = None,
431
+ definition_key: identifier_t.IdentifierKey | None = None,
432
+ field_values: list[field_values_t.FieldRefNameValue] | None = None,
433
+ parent_entity: entity_t.Entity | None = None,
434
+ _request_options: client_config_t.RequestOptions | None = None,
265
435
  ) -> create_entity_t.Data:
266
436
  """Creates a new Uncountable entity
267
437
 
268
438
  :param definition_id: Definition id of the entity to create
439
+ :param definition_key: Key for the definition of the entity to create
269
440
  :param entity_type: The type of the entities requested
441
+ :param parent_entity: The parent entity associated for this new entity. This only applies if there is a pre-defined relationship.
270
442
  """
271
443
  args = create_entity_t.Arguments(
272
444
  definition_id=definition_id,
445
+ definition_key=definition_key,
273
446
  entity_type=entity_type,
274
447
  field_values=field_values,
448
+ parent_entity=parent_entity,
275
449
  )
276
450
  api_request = APIRequest(
277
451
  method=create_entity_t.ENDPOINT_METHOD,
278
452
  endpoint=create_entity_t.ENDPOINT_PATH,
279
453
  args=args,
454
+ request_options=_request_options,
280
455
  )
281
456
  return self.do_request(api_request=api_request, return_type=create_entity_t.Data)
282
457
 
@@ -284,6 +459,7 @@ class ClientMethods(ABC):
284
459
  self,
285
460
  *,
286
461
  inputs_to_create: list[create_inputs_t.InputToCreate],
462
+ _request_options: client_config_t.RequestOptions | None = None,
287
463
  ) -> create_inputs_t.Data:
288
464
  """Creates new inputs
289
465
 
@@ -296,20 +472,73 @@ class ClientMethods(ABC):
296
472
  method=create_inputs_t.ENDPOINT_METHOD,
297
473
  endpoint=create_inputs_t.ENDPOINT_PATH,
298
474
  args=args,
475
+ request_options=_request_options,
299
476
  )
300
477
  return self.do_request(api_request=api_request, return_type=create_inputs_t.Data)
301
478
 
479
+ def create_mix_order(
480
+ self,
481
+ *,
482
+ recipe_key: identifier_t.IdentifierKey,
483
+ recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifier,
484
+ _request_options: client_config_t.RequestOptions | None = None,
485
+ ) -> create_mix_order_t.Data:
486
+ """Creates mix order on a recipe workflow step
487
+
488
+ """
489
+ args = create_mix_order_t.Arguments(
490
+ recipe_key=recipe_key,
491
+ recipe_workflow_step_identifier=recipe_workflow_step_identifier,
492
+ )
493
+ api_request = APIRequest(
494
+ method=create_mix_order_t.ENDPOINT_METHOD,
495
+ endpoint=create_mix_order_t.ENDPOINT_PATH,
496
+ args=args,
497
+ request_options=_request_options,
498
+ )
499
+ return self.do_request(api_request=api_request, return_type=create_mix_order_t.Data)
500
+
501
+ def create_or_update_entity(
502
+ self,
503
+ *,
504
+ entity_type: entity_t.EntityType,
505
+ definition_key: identifier_t.IdentifierKey,
506
+ field_values: list[field_values_t.FieldArgumentValue],
507
+ entity_key: identifier_t.IdentifierKey | None = None,
508
+ on_create_init_field_values: list[field_values_t.FieldArgumentValue] | None = None,
509
+ _request_options: client_config_t.RequestOptions | None = None,
510
+ ) -> create_or_update_entity_t.Data:
511
+ """Creates or updates field values for an entity
512
+
513
+ :param on_create_init_field_values: Field values set only when the entity is created (will be ignored if entity already exists)
514
+ """
515
+ args = create_or_update_entity_t.Arguments(
516
+ entity_key=entity_key,
517
+ entity_type=entity_type,
518
+ definition_key=definition_key,
519
+ field_values=field_values,
520
+ on_create_init_field_values=on_create_init_field_values,
521
+ )
522
+ api_request = APIRequest(
523
+ method=create_or_update_entity_t.ENDPOINT_METHOD,
524
+ endpoint=create_or_update_entity_t.ENDPOINT_PATH,
525
+ args=args,
526
+ request_options=_request_options,
527
+ )
528
+ return self.do_request(api_request=api_request, return_type=create_or_update_entity_t.Data)
529
+
302
530
  def create_recipe(
303
531
  self,
304
532
  *,
305
533
  material_family_id: base_t.ObjectId,
306
534
  workflow_id: base_t.ObjectId,
307
- name: typing.Optional[str] = None,
308
- project_id: typing.Optional[base_t.ObjectId] = None,
309
- workflow_variant_id: typing.Optional[typing.Optional[base_t.ObjectId]] = None,
310
- recipe_metadata: typing.Optional[list[recipe_metadata_t.MetadataValue]] = None,
311
- identifiers: typing.Optional[recipe_identifiers_t.RecipeIdentifiers] = None,
312
- definition_key: typing.Optional[identifier_t.IdentifierKey] = None,
535
+ name: str | None = None,
536
+ project_id: base_t.ObjectId | None = None,
537
+ workflow_variant_id: base_t.ObjectId | None = None,
538
+ recipe_metadata: list[recipe_metadata_t.MetadataValue] | None = None,
539
+ identifiers: recipe_identifiers_t.RecipeIdentifiers | None = None,
540
+ definition_key: identifier_t.IdentifierKey | None = None,
541
+ _request_options: client_config_t.RequestOptions | None = None,
313
542
  ) -> create_recipe_t.Data:
314
543
  """Returns the id of the recipe being created.
315
544
 
@@ -336,6 +565,7 @@ class ClientMethods(ABC):
336
565
  method=create_recipe_t.ENDPOINT_METHOD,
337
566
  endpoint=create_recipe_t.ENDPOINT_PATH,
338
567
  args=args,
568
+ request_options=_request_options,
339
569
  )
340
570
  return self.do_request(api_request=api_request, return_type=create_recipe_t.Data)
341
571
 
@@ -344,8 +574,9 @@ class ClientMethods(ABC):
344
574
  *,
345
575
  recipe_from_key: identifier_t.IdentifierKey,
346
576
  recipe_to_key: identifier_t.IdentifierKey,
347
- link_type: typing.Union[typing.Literal[recipe_links_t.RecipeLinkType.CHILD], typing.Literal[recipe_links_t.RecipeLinkType.CONTROL], typing.Literal[recipe_links_t.RecipeLinkType.USER_LINK]],
348
- name: str,
577
+ link_type: typing.Literal[recipe_links_t.RecipeLinkType.CHILD] | typing.Literal[recipe_links_t.RecipeLinkType.CONTROL] | typing.Literal[recipe_links_t.RecipeLinkType.USER_LINK] | typing.Literal[recipe_links_t.RecipeLinkType.PREVIOUS_EXPERIMENT],
578
+ name: str | None = None,
579
+ _request_options: client_config_t.RequestOptions | None = None,
349
580
  ) -> create_recipe_link_t.Data:
350
581
  """Create a link between two recipes. Skip if the link already exists
351
582
 
@@ -364,6 +595,7 @@ class ClientMethods(ABC):
364
595
  method=create_recipe_link_t.ENDPOINT_METHOD,
365
596
  endpoint=create_recipe_link_t.ENDPOINT_PATH,
366
597
  args=args,
598
+ request_options=_request_options,
367
599
  )
368
600
  return self.do_request(api_request=api_request, return_type=create_recipe_link_t.Data)
369
601
 
@@ -372,9 +604,10 @@ class ClientMethods(ABC):
372
604
  *,
373
605
  material_family_id: base_t.ObjectId,
374
606
  recipe_definitions: list[create_recipes_t.CreateRecipeDefinition],
375
- project_id: typing.Optional[base_t.ObjectId] = None,
607
+ project_id: base_t.ObjectId | None = None,
608
+ _request_options: client_config_t.RequestOptions | None = None,
376
609
  ) -> create_recipes_t.Data:
377
- """Sets inputs values for an experiment. Values set can be numeric, text or categorical types in the Uncountable system
610
+ """Creates recipes in Uncountable, optionally with metadata values, and returns the resulting ids in corresponding order
378
611
 
379
612
  :param material_family_id: The identifier of the material family to create the recipes in
380
613
  :param project_id: The identifier of the project to create the recipes in
@@ -388,6 +621,7 @@ class ClientMethods(ABC):
388
621
  method=create_recipes_t.ENDPOINT_METHOD,
389
622
  endpoint=create_recipes_t.ENDPOINT_PATH,
390
623
  args=args,
624
+ request_options=_request_options,
391
625
  )
392
626
  return self.do_request(api_request=api_request, return_type=create_recipes_t.Data)
393
627
 
@@ -395,6 +629,7 @@ class ClientMethods(ABC):
395
629
  self,
396
630
  *,
397
631
  recipe_key: identifier_t.IdentifierKey,
632
+ _request_options: client_config_t.RequestOptions | None = None,
398
633
  ) -> disassociate_recipe_as_input_t.Data:
399
634
  """Remove any association between a recipe and ingredients
400
635
 
@@ -407,6 +642,7 @@ class ClientMethods(ABC):
407
642
  method=disassociate_recipe_as_input_t.ENDPOINT_METHOD,
408
643
  endpoint=disassociate_recipe_as_input_t.ENDPOINT_PATH,
409
644
  args=args,
645
+ request_options=_request_options,
410
646
  )
411
647
  return self.do_request(api_request=api_request, return_type=disassociate_recipe_as_input_t.Data)
412
648
 
@@ -416,6 +652,7 @@ class ClientMethods(ABC):
416
652
  recipe_key: identifier_t.IdentifierKey,
417
653
  recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifier,
418
654
  edits: list[edit_recipe_inputs_t.RecipeInputEdit],
655
+ _request_options: client_config_t.RequestOptions | None = None,
419
656
  ) -> edit_recipe_inputs_t.Data:
420
657
  """Clear, update, or add inputs on a recipe
421
658
 
@@ -430,6 +667,7 @@ class ClientMethods(ABC):
430
667
  method=edit_recipe_inputs_t.ENDPOINT_METHOD,
431
668
  endpoint=edit_recipe_inputs_t.ENDPOINT_PATH,
432
669
  args=args,
670
+ request_options=_request_options,
433
671
  )
434
672
  return self.do_request(api_request=api_request, return_type=edit_recipe_inputs_t.Data)
435
673
 
@@ -437,6 +675,7 @@ class ClientMethods(ABC):
437
675
  self,
438
676
  *,
439
677
  requests: list[execute_batch_t.BatchRequest],
678
+ _request_options: client_config_t.RequestOptions | None = None,
440
679
  ) -> execute_batch_t.Data:
441
680
  """Run multiple API calls via one request
442
681
 
@@ -448,6 +687,7 @@ class ClientMethods(ABC):
448
687
  method=execute_batch_t.ENDPOINT_METHOD,
449
688
  endpoint=execute_batch_t.ENDPOINT_PATH,
450
689
  args=args,
690
+ request_options=_request_options,
451
691
  )
452
692
  return self.do_request(api_request=api_request, return_type=execute_batch_t.Data)
453
693
 
@@ -455,6 +695,7 @@ class ClientMethods(ABC):
455
695
  self,
456
696
  *,
457
697
  requests: list[async_batch_t.AsyncBatchRequest],
698
+ _request_options: client_config_t.RequestOptions | None = None,
458
699
  ) -> execute_batch_load_async_t.Data:
459
700
  """Run multiple API calls via one request
460
701
 
@@ -466,14 +707,120 @@ class ClientMethods(ABC):
466
707
  method=execute_batch_load_async_t.ENDPOINT_METHOD,
467
708
  endpoint=execute_batch_load_async_t.ENDPOINT_PATH,
468
709
  args=args,
710
+ request_options=_request_options,
469
711
  )
470
712
  return self.do_request(api_request=api_request, return_type=execute_batch_load_async_t.Data)
471
713
 
714
+ def export_entities(
715
+ self,
716
+ *,
717
+ config_key: identifier_t.IdentifierKey,
718
+ type: exports_t.ExportType = exports_t.ExportType.EXCEL,
719
+ client_timezone: exports_t.ListingExportUserTimezone | None = None,
720
+ limit: int | None = None,
721
+ attributes: list[export_entities_t.ListingAttribute] | None = None,
722
+ _request_options: client_config_t.RequestOptions | None = None,
723
+ ) -> export_entities_t.Data:
724
+ """Uses a structured loading configuration to export entities in the system. This endpoint is asynchronous, and returns the job ID that can be used to query the status of the export.
725
+
726
+ :param config_key: The configuration reference for the listing config
727
+ :param limit: The number of data points to return. If not filled in, all filtered entities will be included in the export.
728
+ """
729
+ args = export_entities_t.Arguments(
730
+ config_key=config_key,
731
+ client_timezone=client_timezone,
732
+ limit=limit,
733
+ type=type,
734
+ attributes=attributes,
735
+ )
736
+ api_request = APIRequest(
737
+ method=export_entities_t.ENDPOINT_METHOD,
738
+ endpoint=export_entities_t.ENDPOINT_PATH,
739
+ args=args,
740
+ request_options=_request_options,
741
+ )
742
+ return self.do_request(api_request=api_request, return_type=export_entities_t.Data)
743
+
744
+ def fetch_listing(
745
+ self,
746
+ *,
747
+ entity_type: entity_t.EntityType,
748
+ columns: list[listing_t.ColumnIdentifier],
749
+ filters: structured_filters_t.FilterNode | None = None,
750
+ limit: int | None = None,
751
+ offset: int | None = None,
752
+ _request_options: client_config_t.RequestOptions | None = None,
753
+ ) -> fetch_listing_t.Data:
754
+ """External API for fetching a listing based on some structured columns and filters
755
+
756
+ :param entity_type: The entity type to fetch listing entries for
757
+ :param columns: The columns to include in the results
758
+ :param filters: Structured filters to apply to the listing, represented by a FilterNode object
759
+ :param limit: The number of entries to return. If not provided, defaults to 100. Note a maximum of 100 entries can be returned.
760
+ :param offset: The number of entries to skip for pagination
761
+ """
762
+ args = fetch_listing_t.Arguments(
763
+ entity_type=entity_type,
764
+ columns=columns,
765
+ filters=filters,
766
+ limit=limit,
767
+ offset=offset,
768
+ )
769
+ api_request = APIRequest(
770
+ method=fetch_listing_t.ENDPOINT_METHOD,
771
+ endpoint=fetch_listing_t.ENDPOINT_PATH,
772
+ args=args,
773
+ request_options=_request_options,
774
+ )
775
+ return self.do_request(api_request=api_request, return_type=fetch_listing_t.Data)
776
+
777
+ def get_column_calculation_values(
778
+ self,
779
+ *,
780
+ recipe_keys: list[identifier_t.IdentifierKey],
781
+ calculation_key: identifier_t.IdentifierKey,
782
+ _request_options: client_config_t.RequestOptions | None = None,
783
+ ) -> get_column_calculation_values_t.Data:
784
+ """Get the values for a column calculations for recipes
785
+
786
+ :param recipe_keys: Required: The recipe keys to load values for
787
+ :param calculation_key: Required: The calculation key to get the values for
788
+ """
789
+ args = get_column_calculation_values_t.Arguments(
790
+ recipe_keys=recipe_keys,
791
+ calculation_key=calculation_key,
792
+ )
793
+ api_request = APIRequest(
794
+ method=get_column_calculation_values_t.ENDPOINT_METHOD,
795
+ endpoint=get_column_calculation_values_t.ENDPOINT_PATH,
796
+ args=args,
797
+ request_options=_request_options,
798
+ )
799
+ return self.do_request(api_request=api_request, return_type=get_column_calculation_values_t.Data)
800
+
801
+ def get_current_user_info(
802
+ self,
803
+ *,
804
+ _request_options: client_config_t.RequestOptions | None = None,
805
+ ) -> get_current_user_info_t.Data:
806
+ """Return information about the current user
807
+
808
+ """
809
+ args = get_current_user_info_t.Arguments()
810
+ api_request = APIRequest(
811
+ method=get_current_user_info_t.ENDPOINT_METHOD,
812
+ endpoint=get_current_user_info_t.ENDPOINT_PATH,
813
+ args=args,
814
+ request_options=_request_options,
815
+ )
816
+ return self.do_request(api_request=api_request, return_type=get_current_user_info_t.Data)
817
+
472
818
  def get_curve(
473
819
  self,
474
820
  *,
475
- recipe_output_id: typing.Optional[base_t.ObjectId] = None,
476
- recipe_input_id: typing.Optional[base_t.ObjectId] = None,
821
+ recipe_output_id: base_t.ObjectId | None = None,
822
+ recipe_input_id: base_t.ObjectId | None = None,
823
+ _request_options: client_config_t.RequestOptions | None = None,
477
824
  ) -> get_curve_t.Data:
478
825
  """Returns an array of values for the specified curve id.
479
826
 
@@ -488,6 +835,7 @@ class ClientMethods(ABC):
488
835
  method=get_curve_t.ENDPOINT_METHOD,
489
836
  endpoint=get_curve_t.ENDPOINT_PATH,
490
837
  args=args,
838
+ request_options=_request_options,
491
839
  )
492
840
  return self.do_request(api_request=api_request, return_type=get_curve_t.Data)
493
841
 
@@ -496,6 +844,7 @@ class ClientMethods(ABC):
496
844
  *,
497
845
  entity_ids: list[base_t.ObjectId],
498
846
  entity_type: entity_t.EntityType,
847
+ _request_options: client_config_t.RequestOptions | None = None,
499
848
  ) -> get_entities_data_t.Data:
500
849
  """Gets the details for a passed entity
501
850
 
@@ -510,6 +859,7 @@ class ClientMethods(ABC):
510
859
  method=get_entities_data_t.ENDPOINT_METHOD,
511
860
  endpoint=get_entities_data_t.ENDPOINT_PATH,
512
861
  args=args,
862
+ request_options=_request_options,
513
863
  )
514
864
  return self.do_request(api_request=api_request, return_type=get_entities_data_t.Data)
515
865
 
@@ -517,10 +867,11 @@ class ClientMethods(ABC):
517
867
  self,
518
868
  *,
519
869
  material_family_id: base_t.ObjectId,
520
- input_ids: typing.Optional[list[base_t.ObjectId]],
521
- is_parameter: typing.Optional[bool],
522
- offset: typing.Optional[typing.Optional[int]] = None,
523
- limit: typing.Optional[typing.Optional[int]] = None,
870
+ input_ids: list[base_t.ObjectId] | None,
871
+ is_parameter: bool | None,
872
+ offset: int | None = None,
873
+ limit: int | None = None,
874
+ _request_options: client_config_t.RequestOptions | None = None,
524
875
  ) -> get_input_data_t.Data:
525
876
  """Gets the attribute, categorization and other metadata associated with a set of inputs. An input is either an ingredient or process parameter, with metadata and calculations assigned separately
526
877
 
@@ -541,6 +892,7 @@ class ClientMethods(ABC):
541
892
  method=get_input_data_t.ENDPOINT_METHOD,
542
893
  endpoint=get_input_data_t.ENDPOINT_PATH,
543
894
  args=args,
895
+ request_options=_request_options,
544
896
  )
545
897
  return self.do_request(api_request=api_request, return_type=get_input_data_t.Data)
546
898
 
@@ -548,6 +900,7 @@ class ClientMethods(ABC):
548
900
  self,
549
901
  *,
550
902
  material_family_id: base_t.ObjectId,
903
+ _request_options: client_config_t.RequestOptions | None = None,
551
904
  ) -> get_input_group_names_t.Data:
552
905
  """Gets the name of all input groups in a material family that either the user created, or are shared to all users.
553
906
 
@@ -560,6 +913,7 @@ class ClientMethods(ABC):
560
913
  method=get_input_group_names_t.ENDPOINT_METHOD,
561
914
  endpoint=get_input_group_names_t.ENDPOINT_PATH,
562
915
  args=args,
916
+ request_options=_request_options,
563
917
  )
564
918
  return self.do_request(api_request=api_request, return_type=get_input_group_names_t.Data)
565
919
 
@@ -567,9 +921,10 @@ class ClientMethods(ABC):
567
921
  self,
568
922
  *,
569
923
  material_family_id: base_t.ObjectId,
570
- is_parameter: typing.Optional[bool],
571
- offset: typing.Optional[typing.Optional[int]] = None,
572
- limit: typing.Optional[typing.Optional[int]] = None,
924
+ is_parameter: bool | None,
925
+ offset: int | None = None,
926
+ limit: int | None = None,
927
+ _request_options: client_config_t.RequestOptions | None = None,
573
928
  ) -> get_input_names_t.Data:
574
929
  """Gets the name of all inputs for a material family. An input is either an ingredient or process parameter, with metadata and calculations assigned separately
575
930
 
@@ -588,6 +943,7 @@ class ClientMethods(ABC):
588
943
  method=get_input_names_t.ENDPOINT_METHOD,
589
944
  endpoint=get_input_names_t.ENDPOINT_PATH,
590
945
  args=args,
946
+ request_options=_request_options,
591
947
  )
592
948
  return self.do_request(api_request=api_request, return_type=get_input_names_t.Data)
593
949
 
@@ -595,6 +951,7 @@ class ClientMethods(ABC):
595
951
  self,
596
952
  *,
597
953
  input_ids: list[base_t.ObjectId],
954
+ _request_options: client_config_t.RequestOptions | None = None,
598
955
  ) -> get_inputs_data_t.Data:
599
956
  """Gets the details for passed input ids
600
957
 
@@ -607,6 +964,7 @@ class ClientMethods(ABC):
607
964
  method=get_inputs_data_t.ENDPOINT_METHOD,
608
965
  endpoint=get_inputs_data_t.ENDPOINT_PATH,
609
966
  args=args,
967
+ request_options=_request_options,
610
968
  )
611
969
  return self.do_request(api_request=api_request, return_type=get_inputs_data_t.Data)
612
970
 
@@ -614,9 +972,10 @@ class ClientMethods(ABC):
614
972
  self,
615
973
  *,
616
974
  material_family_id: base_t.ObjectId,
617
- output_ids: typing.Optional[list[base_t.ObjectId]] = None,
618
- offset: typing.Optional[int] = None,
619
- limit: typing.Optional[int] = None,
975
+ output_ids: list[base_t.ObjectId] | None = None,
976
+ offset: int | None = None,
977
+ limit: int | None = None,
978
+ _request_options: client_config_t.RequestOptions | None = None,
620
979
  ) -> get_output_data_t.Data:
621
980
  """Gets the attribute, categorization and other metadata associated with a set of outputs
622
981
 
@@ -635,6 +994,7 @@ class ClientMethods(ABC):
635
994
  method=get_output_data_t.ENDPOINT_METHOD,
636
995
  endpoint=get_output_data_t.ENDPOINT_PATH,
637
996
  args=args,
997
+ request_options=_request_options,
638
998
  )
639
999
  return self.do_request(api_request=api_request, return_type=get_output_data_t.Data)
640
1000
 
@@ -642,8 +1002,9 @@ class ClientMethods(ABC):
642
1002
  self,
643
1003
  *,
644
1004
  material_family_id: base_t.ObjectId,
645
- offset: typing.Optional[int] = None,
646
- limit: typing.Optional[int] = None,
1005
+ offset: int | None = None,
1006
+ limit: int | None = None,
1007
+ _request_options: client_config_t.RequestOptions | None = None,
647
1008
  ) -> get_output_names_t.Data:
648
1009
  """Gets the name of all outputs for a material family. An output represents a measurement value of any time (numeric, text, curve, etc). This includes calculations based off of other outputs, such as a calculated change over time
649
1010
 
@@ -660,6 +1021,7 @@ class ClientMethods(ABC):
660
1021
  method=get_output_names_t.ENDPOINT_METHOD,
661
1022
  endpoint=get_output_names_t.ENDPOINT_PATH,
662
1023
  args=args,
1024
+ request_options=_request_options,
663
1025
  )
664
1026
  return self.do_request(api_request=api_request, return_type=get_output_names_t.Data)
665
1027
 
@@ -667,7 +1029,8 @@ class ClientMethods(ABC):
667
1029
  self,
668
1030
  *,
669
1031
  all_material_families: bool,
670
- material_family_id: typing.Optional[base_t.ObjectId],
1032
+ material_family_id: base_t.ObjectId | None,
1033
+ _request_options: client_config_t.RequestOptions | None = None,
671
1034
  ) -> get_projects_t.Data:
672
1035
  """Gets either all projects created in the platform, or the projects associated with a material family ID. Projects are where experiments are placed in Uncountable, similar to folders in a directory structure
673
1036
 
@@ -682,6 +1045,7 @@ class ClientMethods(ABC):
682
1045
  method=get_projects_t.ENDPOINT_METHOD,
683
1046
  endpoint=get_projects_t.ENDPOINT_PATH,
684
1047
  args=args,
1048
+ request_options=_request_options,
685
1049
  )
686
1050
  return self.do_request(api_request=api_request, return_type=get_projects_t.Data)
687
1051
 
@@ -689,8 +1053,9 @@ class ClientMethods(ABC):
689
1053
  self,
690
1054
  *,
691
1055
  project_ids: list[base_t.ObjectId],
692
- offset: typing.Optional[typing.Optional[int]] = None,
693
- limit: typing.Optional[typing.Optional[int]] = None,
1056
+ offset: int | None = None,
1057
+ limit: int | None = None,
1058
+ _request_options: client_config_t.RequestOptions | None = None,
694
1059
  ) -> get_projects_data_t.Data:
695
1060
  """Gets either all data associated with a set of projects created in the platform. Because Uncountables recipe structure is complex, various data values are exploded out to increase efficiency in parsing, and this page is paginated to prevent too large of return values
696
1061
 
@@ -707,6 +1072,7 @@ class ClientMethods(ABC):
707
1072
  method=get_projects_data_t.ENDPOINT_METHOD,
708
1073
  endpoint=get_projects_data_t.ENDPOINT_PATH,
709
1074
  args=args,
1075
+ request_options=_request_options,
710
1076
  )
711
1077
  return self.do_request(api_request=api_request, return_type=get_projects_data_t.Data)
712
1078
 
@@ -714,7 +1080,8 @@ class ClientMethods(ABC):
714
1080
  self,
715
1081
  *,
716
1082
  recipe_ids: list[base_t.ObjectId],
717
- calculation_ids: typing.Optional[list[base_t.ObjectId]] = None,
1083
+ calculation_ids: list[base_t.ObjectId] | None = None,
1084
+ _request_options: client_config_t.RequestOptions | None = None,
718
1085
  ) -> get_recipe_calculations_t.Data:
719
1086
  """Gets the calculations for the passed recipes
720
1087
 
@@ -729,6 +1096,7 @@ class ClientMethods(ABC):
729
1096
  method=get_recipe_calculations_t.ENDPOINT_METHOD,
730
1097
  endpoint=get_recipe_calculations_t.ENDPOINT_PATH,
731
1098
  args=args,
1099
+ request_options=_request_options,
732
1100
  )
733
1101
  return self.do_request(api_request=api_request, return_type=get_recipe_calculations_t.Data)
734
1102
 
@@ -737,7 +1105,8 @@ class ClientMethods(ABC):
737
1105
  *,
738
1106
  recipe_ids: list[base_t.ObjectId],
739
1107
  depth: int = 1,
740
- link_types: typing.Optional[list[recipe_links_t.RecipeLinkType]],
1108
+ link_types: list[recipe_links_t.RecipeLinkType] | None,
1109
+ _request_options: client_config_t.RequestOptions | None = None,
741
1110
  ) -> get_recipe_links_t.Data:
742
1111
  """Gets the links for the passed recipes
743
1112
 
@@ -754,6 +1123,7 @@ class ClientMethods(ABC):
754
1123
  method=get_recipe_links_t.ENDPOINT_METHOD,
755
1124
  endpoint=get_recipe_links_t.ENDPOINT_PATH,
756
1125
  args=args,
1126
+ request_options=_request_options,
757
1127
  )
758
1128
  return self.do_request(api_request=api_request, return_type=get_recipe_links_t.Data)
759
1129
 
@@ -761,9 +1131,10 @@ class ClientMethods(ABC):
761
1131
  self,
762
1132
  *,
763
1133
  material_family_id: base_t.ObjectId,
764
- recipe_metadata_ids: typing.Optional[list[base_t.ObjectId]],
765
- offset: typing.Optional[typing.Optional[int]] = None,
766
- limit: typing.Optional[typing.Optional[int]] = None,
1134
+ recipe_metadata_ids: list[base_t.ObjectId] | None,
1135
+ offset: int | None = None,
1136
+ limit: int | None = None,
1137
+ _request_options: client_config_t.RequestOptions | None = None,
767
1138
  ) -> get_recipe_metadata_data_t.Data:
768
1139
  """Gets the recipe metadata. Recipe metadata is data associated with experiments that is not an input, output or calculation, such as a sample ID.
769
1140
 
@@ -782,6 +1153,7 @@ class ClientMethods(ABC):
782
1153
  method=get_recipe_metadata_data_t.ENDPOINT_METHOD,
783
1154
  endpoint=get_recipe_metadata_data_t.ENDPOINT_PATH,
784
1155
  args=args,
1156
+ request_options=_request_options,
785
1157
  )
786
1158
  return self.do_request(api_request=api_request, return_type=get_recipe_metadata_data_t.Data)
787
1159
 
@@ -789,6 +1161,7 @@ class ClientMethods(ABC):
789
1161
  self,
790
1162
  *,
791
1163
  project_id: base_t.ObjectId,
1164
+ _request_options: client_config_t.RequestOptions | None = None,
792
1165
  ) -> get_recipe_names_t.Data:
793
1166
  """Gets the name of all recipes (or experiments, used as synonyms by Uncountable) for a project. The call external_get_projects can be used to find projects
794
1167
 
@@ -801,6 +1174,7 @@ class ClientMethods(ABC):
801
1174
  method=get_recipe_names_t.ENDPOINT_METHOD,
802
1175
  endpoint=get_recipe_names_t.ENDPOINT_PATH,
803
1176
  args=args,
1177
+ request_options=_request_options,
804
1178
  )
805
1179
  return self.do_request(api_request=api_request, return_type=get_recipe_names_t.Data)
806
1180
 
@@ -808,6 +1182,7 @@ class ClientMethods(ABC):
808
1182
  self,
809
1183
  *,
810
1184
  recipe_output_ids: list[base_t.ObjectId],
1185
+ _request_options: client_config_t.RequestOptions | None = None,
811
1186
  ) -> get_recipe_output_metadata_t.Data:
812
1187
  """Gets the metadata values for the passed recipe outputs
813
1188
 
@@ -820,16 +1195,19 @@ class ClientMethods(ABC):
820
1195
  method=get_recipe_output_metadata_t.ENDPOINT_METHOD,
821
1196
  endpoint=get_recipe_output_metadata_t.ENDPOINT_PATH,
822
1197
  args=args,
1198
+ request_options=_request_options,
823
1199
  )
824
1200
  return self.do_request(api_request=api_request, return_type=get_recipe_output_metadata_t.Data)
825
1201
 
826
1202
  def get_recipes_data(
827
1203
  self,
828
1204
  *,
829
- recipe_ids: typing.Optional[typing.Optional[list[base_t.ObjectId]]] = None,
830
- project_id: typing.Optional[typing.Optional[base_t.ObjectId]] = None,
831
- offset: typing.Optional[typing.Optional[int]] = None,
832
- limit: typing.Optional[typing.Optional[int]] = None,
1205
+ recipe_ids: list[base_t.ObjectId] | None = None,
1206
+ project_id: base_t.ObjectId | None = None,
1207
+ offset: int | None = None,
1208
+ limit: int | None = None,
1209
+ empty_output_behavior: get_recipes_data_t.RecipeOutputInclusion | None = None,
1210
+ _request_options: client_config_t.RequestOptions | None = None,
833
1211
  ) -> get_recipes_data_t.Data:
834
1212
  """Gets all data associated with a set of recipes. Because Uncountables recipe structure is complex, various data values are exploded out to increase efficiency in parsing, and this page is paginated to prevent too large of return values
835
1213
 
@@ -837,52 +1215,120 @@ class ClientMethods(ABC):
837
1215
  :param project_id: The projects to get the data from. Either these or recipe_ids must be filled in
838
1216
  :param offset: Used for pagination. All pagination is done in order of Recipe ID. [Pagination More Info](#pagination)
839
1217
  :param limit: The number of data points to return. If not filled in, it will be set to 100, and cannot be set higher than 100. [Pagination More Info](#pagination)
1218
+ :param empty_output_behavior: Recipe output inclusion behavior for empty outputs. Empty recipe outputs are outputs added to the experiment that do not have a value associated with them.
840
1219
  """
841
1220
  args = get_recipes_data_t.Arguments(
842
1221
  recipe_ids=recipe_ids,
843
1222
  project_id=project_id,
844
1223
  offset=offset,
845
1224
  limit=limit,
1225
+ empty_output_behavior=empty_output_behavior,
846
1226
  )
847
1227
  api_request = APIRequest(
848
1228
  method=get_recipes_data_t.ENDPOINT_METHOD,
849
1229
  endpoint=get_recipes_data_t.ENDPOINT_PATH,
850
1230
  args=args,
1231
+ request_options=_request_options,
851
1232
  )
852
1233
  return self.do_request(api_request=api_request, return_type=get_recipes_data_t.Data)
853
1234
 
1235
+ def grant_entity_permissions(
1236
+ self,
1237
+ *,
1238
+ entity_type: entity_t.LimitedEntityType,
1239
+ entity_key: identifier_t.IdentifierKey,
1240
+ permission_types: list[entity_t.GrantableEntityPermissionType],
1241
+ user_keys: list[identifier_t.IdentifierKey] | None = None,
1242
+ user_group_keys: list[identifier_t.IdentifierKey] | None = None,
1243
+ all_users: bool | None = None,
1244
+ _request_options: client_config_t.RequestOptions | None = None,
1245
+ ) -> grant_entity_permissions_t.Data:
1246
+ """Grant entity permissions to a list of users or user groups or to all users.
1247
+
1248
+ """
1249
+ args = grant_entity_permissions_t.Arguments(
1250
+ entity_type=entity_type,
1251
+ entity_key=entity_key,
1252
+ permission_types=permission_types,
1253
+ user_keys=user_keys,
1254
+ user_group_keys=user_group_keys,
1255
+ all_users=all_users,
1256
+ )
1257
+ api_request = APIRequest(
1258
+ method=grant_entity_permissions_t.ENDPOINT_METHOD,
1259
+ endpoint=grant_entity_permissions_t.ENDPOINT_PATH,
1260
+ args=args,
1261
+ request_options=_request_options,
1262
+ )
1263
+ return self.do_request(api_request=api_request, return_type=grant_entity_permissions_t.Data)
1264
+
854
1265
  def invoke_uploader(
855
1266
  self,
856
1267
  *,
857
- file_id: base_t.ObjectId,
858
1268
  uploader_key: identifier_t.IdentifierKey,
859
- material_family_key: identifier_t.IdentifierKey,
860
- recipe_key: typing.Optional[identifier_t.IdentifierKey] = None,
1269
+ destination: generic_upload_t.UploadDestination,
1270
+ file_id: base_t.ObjectId | None = None,
1271
+ file_ids: list[base_t.ObjectId] | None = None,
1272
+ _request_options: client_config_t.RequestOptions | None = None,
861
1273
  ) -> invoke_uploader_t.Data:
862
1274
  """Runs a file through an uploader.
863
1275
 
1276
+ :param file_id: DEPRECATED: use file_ids
864
1277
  """
865
1278
  args = invoke_uploader_t.Arguments(
866
1279
  file_id=file_id,
1280
+ file_ids=file_ids,
867
1281
  uploader_key=uploader_key,
868
- material_family_key=material_family_key,
869
- recipe_key=recipe_key,
1282
+ destination=destination,
870
1283
  )
871
1284
  api_request = APIRequest(
872
1285
  method=invoke_uploader_t.ENDPOINT_METHOD,
873
1286
  endpoint=invoke_uploader_t.ENDPOINT_PATH,
874
1287
  args=args,
1288
+ request_options=_request_options,
875
1289
  )
876
1290
  return self.do_request(api_request=api_request, return_type=invoke_uploader_t.Data)
877
1291
 
1292
+ def list_aggregate(
1293
+ self,
1294
+ *,
1295
+ config_reference: str,
1296
+ attribute_values: list[list_aggregate_t.AttributeValue] | None = None,
1297
+ offset: int | None = None,
1298
+ limit: int | None = None,
1299
+ _request_options: client_config_t.RequestOptions | None = None,
1300
+ ) -> list_aggregate_t.Data:
1301
+ """Uses a structured loading configuration to list aggregated data from the platform
1302
+
1303
+ :param config_reference: The configuration reference name for the listing config
1304
+ :param attribute_values: Attributes to pass to the configuration for parameterizing filters
1305
+ :param offset: Used for pagination. Pagination is done based on the sorting of the config. [Pagination More Info](#pagination)
1306
+ :param limit: The number of data points to return. If not filled in, it will be set to 100, and cannot be set higher than 100. [Pagination More Info](#pagination)
1307
+ """
1308
+ args = list_aggregate_t.Arguments(
1309
+ config_reference=config_reference,
1310
+ attribute_values=attribute_values,
1311
+ offset=offset,
1312
+ limit=limit,
1313
+ )
1314
+ api_request = APIRequest(
1315
+ method=list_aggregate_t.ENDPOINT_METHOD,
1316
+ endpoint=list_aggregate_t.ENDPOINT_PATH,
1317
+ args=args,
1318
+ request_options=_request_options,
1319
+ )
1320
+ return self.do_request(api_request=api_request, return_type=list_aggregate_t.Data)
1321
+
878
1322
  def list_entities(
879
1323
  self,
880
1324
  *,
881
1325
  config_reference: str,
882
- entity_type: typing.Optional[entity_t.EntityType] = None,
883
- attributes: typing.Optional[dict[OpaqueKey, base_t.JsonValue]] = None,
884
- offset: typing.Optional[typing.Optional[int]] = None,
885
- limit: typing.Optional[typing.Optional[int]] = None,
1326
+ entity_type: entity_t.EntityType | None = None,
1327
+ attributes: dict[OpaqueKey, base_t.JsonValue] | None = None,
1328
+ offset: int | None = None,
1329
+ limit: int | None = None,
1330
+ additional_filter_configs: list[list_entities_t.AdditionalFilterConfig] | None = None,
1331
+ _request_options: client_config_t.RequestOptions | None = None,
886
1332
  ) -> list_entities_t.Data:
887
1333
  """Uses a structured loading configuration to list entities in the system
888
1334
 
@@ -891,6 +1337,7 @@ class ClientMethods(ABC):
891
1337
  :param attributes: Attributes to pass to the configuration for parameterizing filters
892
1338
  :param offset: Used for pagination. Pagination is done based on the sorting of the config. [Pagination More Info](#pagination)
893
1339
  :param limit: The number of data points to return. If not filled in, it will be set to 100, and cannot be set higher than 100. [Pagination More Info](#pagination)
1340
+ :param additional_filter_configs: Advanced property: Additional filter configurations to apply to the listing. A maximum of 10 additional filter configs are supported.
894
1341
  """
895
1342
  args = list_entities_t.Arguments(
896
1343
  entity_type=entity_type,
@@ -898,11 +1345,13 @@ class ClientMethods(ABC):
898
1345
  attributes=attributes,
899
1346
  offset=offset,
900
1347
  limit=limit,
1348
+ additional_filter_configs=additional_filter_configs,
901
1349
  )
902
1350
  api_request = APIRequest(
903
1351
  method=list_entities_t.ENDPOINT_METHOD,
904
1352
  endpoint=list_entities_t.ENDPOINT_PATH,
905
1353
  args=args,
1354
+ request_options=_request_options,
906
1355
  )
907
1356
  return self.do_request(api_request=api_request, return_type=list_entities_t.Data)
908
1357
 
@@ -911,8 +1360,9 @@ class ClientMethods(ABC):
911
1360
  *,
912
1361
  spec: id_source_t.IdSourceSpec,
913
1362
  search_label: str,
914
- offset: typing.Optional[typing.Optional[int]] = None,
915
- limit: typing.Optional[typing.Optional[int]] = None,
1363
+ offset: int | None = None,
1364
+ limit: int | None = None,
1365
+ _request_options: client_config_t.RequestOptions | None = None,
916
1366
  ) -> list_id_source_t.Data:
917
1367
  """Lists id and label pairs
918
1368
 
@@ -931,6 +1381,7 @@ class ClientMethods(ABC):
931
1381
  method=list_id_source_t.ENDPOINT_METHOD,
932
1382
  endpoint=list_id_source_t.ENDPOINT_PATH,
933
1383
  args=args,
1384
+ request_options=_request_options,
934
1385
  )
935
1386
  return self.do_request(api_request=api_request, return_type=list_id_source_t.Data)
936
1387
 
@@ -939,7 +1390,8 @@ class ClientMethods(ABC):
939
1390
  *,
940
1391
  entity_key: identifier_t.IdentifierKey,
941
1392
  entity_type: entity_t.EntityType,
942
- globally_removable: typing.Optional[bool] = None,
1393
+ globally_removable: bool | None = None,
1394
+ _request_options: client_config_t.RequestOptions | None = None,
943
1395
  ) -> lock_entity_t.Data:
944
1396
  """Lock an entity
945
1397
 
@@ -955,6 +1407,7 @@ class ClientMethods(ABC):
955
1407
  method=lock_entity_t.ENDPOINT_METHOD,
956
1408
  endpoint=lock_entity_t.ENDPOINT_PATH,
957
1409
  args=args,
1410
+ request_options=_request_options,
958
1411
  )
959
1412
  return self.do_request(api_request=api_request, return_type=lock_entity_t.Data)
960
1413
 
@@ -964,8 +1417,9 @@ class ClientMethods(ABC):
964
1417
  type: lock_recipes_t.RecipeLockType = lock_recipes_t.RecipeLockType.ALL,
965
1418
  recipes: list[identifier_t.IdentifierKey],
966
1419
  globally_removable: bool,
967
- lock_samples: typing.Optional[bool] = None,
968
- comments: typing.Optional[str] = None,
1420
+ lock_samples: bool | None = None,
1421
+ comments: str | None = None,
1422
+ _request_options: client_config_t.RequestOptions | None = None,
969
1423
  ) -> lock_recipes_t.Data:
970
1424
  """Lock experiments. Experiments will require unlocking to be editable. Edits to the experiments are blocked while they are locked.
971
1425
 
@@ -989,14 +1443,38 @@ class ClientMethods(ABC):
989
1443
  method=lock_recipes_t.ENDPOINT_METHOD,
990
1444
  endpoint=lock_recipes_t.ENDPOINT_PATH,
991
1445
  args=args,
1446
+ request_options=_request_options,
992
1447
  )
993
1448
  return self.do_request(api_request=api_request, return_type=lock_recipes_t.Data)
994
1449
 
1450
+ def lookup_entity(
1451
+ self,
1452
+ *,
1453
+ entity_type: entity_t.EntityType,
1454
+ query: lookup_entity_t.LookupEntityQuery,
1455
+ _request_options: client_config_t.RequestOptions | None = None,
1456
+ ) -> lookup_entity_t.Data:
1457
+ """Look up an entity based on an identifier or field values
1458
+
1459
+ """
1460
+ args = lookup_entity_t.Arguments(
1461
+ entity_type=entity_type,
1462
+ query=query,
1463
+ )
1464
+ api_request = APIRequest(
1465
+ method=lookup_entity_t.ENDPOINT_METHOD,
1466
+ endpoint=lookup_entity_t.ENDPOINT_PATH,
1467
+ args=args,
1468
+ request_options=_request_options,
1469
+ )
1470
+ return self.do_request(api_request=api_request, return_type=lookup_entity_t.Data)
1471
+
995
1472
  def match_id_source(
996
1473
  self,
997
1474
  *,
998
1475
  spec: id_source_t.IdSourceSpec,
999
1476
  names: list[str],
1477
+ _request_options: client_config_t.RequestOptions | None = None,
1000
1478
  ) -> match_id_source_t.Data:
1001
1479
  """Lists id and label pairs
1002
1480
 
@@ -1011,14 +1489,66 @@ class ClientMethods(ABC):
1011
1489
  method=match_id_source_t.ENDPOINT_METHOD,
1012
1490
  endpoint=match_id_source_t.ENDPOINT_PATH,
1013
1491
  args=args,
1492
+ request_options=_request_options,
1014
1493
  )
1015
1494
  return self.do_request(api_request=api_request, return_type=match_id_source_t.Data)
1016
1495
 
1496
+ def push_notification(
1497
+ self,
1498
+ *,
1499
+ notification_targets: list[notifications_t.NotificationTarget],
1500
+ subject: str,
1501
+ message: str,
1502
+ display_notice: bool = False,
1503
+ entity: entity_t.EntityIdentifier | None = None,
1504
+ notice_configuration: notices_t.NotificationNoticeConfiguration | None = None,
1505
+ _request_options: client_config_t.RequestOptions | None = None,
1506
+ ) -> push_notification_t.Data:
1507
+ """Push a notification to a user or user group
1508
+
1509
+ """
1510
+ args = push_notification_t.Arguments(
1511
+ notification_targets=notification_targets,
1512
+ subject=subject,
1513
+ message=message,
1514
+ entity=entity,
1515
+ display_notice=display_notice,
1516
+ notice_configuration=notice_configuration,
1517
+ )
1518
+ api_request = APIRequest(
1519
+ method=push_notification_t.ENDPOINT_METHOD,
1520
+ endpoint=push_notification_t.ENDPOINT_PATH,
1521
+ args=args,
1522
+ request_options=_request_options,
1523
+ )
1524
+ return self.do_request(api_request=api_request, return_type=push_notification_t.Data)
1525
+
1526
+ def register_sockets_token(
1527
+ self,
1528
+ *,
1529
+ socket_request: sockets_t.SocketTokenRequest,
1530
+ _request_options: client_config_t.RequestOptions | None = None,
1531
+ ) -> register_sockets_token_t.Data:
1532
+ """Request token for connecting to sockets server
1533
+
1534
+ """
1535
+ args = register_sockets_token_t.Arguments(
1536
+ socket_request=socket_request,
1537
+ )
1538
+ api_request = APIRequest(
1539
+ method=register_sockets_token_t.ENDPOINT_METHOD,
1540
+ endpoint=register_sockets_token_t.ENDPOINT_PATH,
1541
+ args=args,
1542
+ request_options=_request_options,
1543
+ )
1544
+ return self.do_request(api_request=api_request, return_type=register_sockets_token_t.Data)
1545
+
1017
1546
  def remove_recipe_from_project(
1018
1547
  self,
1019
1548
  *,
1020
1549
  recipe_key: identifier_t.IdentifierKey,
1021
1550
  project_key: identifier_t.IdentifierKey,
1551
+ _request_options: client_config_t.RequestOptions | None = None,
1022
1552
  ) -> remove_recipe_from_project_t.Data:
1023
1553
  """Removes a recipe from a project
1024
1554
 
@@ -1033,6 +1563,7 @@ class ClientMethods(ABC):
1033
1563
  method=remove_recipe_from_project_t.ENDPOINT_METHOD,
1034
1564
  endpoint=remove_recipe_from_project_t.ENDPOINT_PATH,
1035
1565
  args=args,
1566
+ request_options=_request_options,
1036
1567
  )
1037
1568
  return self.do_request(api_request=api_request, return_type=remove_recipe_from_project_t.Data)
1038
1569
 
@@ -1041,7 +1572,8 @@ class ClientMethods(ABC):
1041
1572
  *,
1042
1573
  recipe_from_key: identifier_t.IdentifierKey,
1043
1574
  recipe_to_key: identifier_t.IdentifierKey,
1044
- link_type: typing.Union[typing.Literal[recipe_links_t.RecipeLinkType.CHILD], typing.Literal[recipe_links_t.RecipeLinkType.CONTROL], typing.Literal[recipe_links_t.RecipeLinkType.USER_LINK]],
1575
+ link_type: typing.Literal[recipe_links_t.RecipeLinkType.CHILD] | typing.Literal[recipe_links_t.RecipeLinkType.CONTROL] | typing.Literal[recipe_links_t.RecipeLinkType.USER_LINK] | typing.Literal[recipe_links_t.RecipeLinkType.PREVIOUS_EXPERIMENT],
1576
+ _request_options: client_config_t.RequestOptions | None = None,
1045
1577
  ) -> remove_recipe_link_t.Data:
1046
1578
  """Remove a link between two recipes. Skip if the link doesn't already exist
1047
1579
 
@@ -1058,14 +1590,16 @@ class ClientMethods(ABC):
1058
1590
  method=remove_recipe_link_t.ENDPOINT_METHOD,
1059
1591
  endpoint=remove_recipe_link_t.ENDPOINT_PATH,
1060
1592
  args=args,
1593
+ request_options=_request_options,
1061
1594
  )
1062
1595
  return self.do_request(api_request=api_request, return_type=remove_recipe_link_t.Data)
1063
1596
 
1064
1597
  def resolve_entity_ids(
1065
1598
  self,
1066
1599
  *,
1067
- entity_ids: list[typing.Union[str, base_t.ObjectId]],
1600
+ entity_ids: list[str | base_t.ObjectId],
1068
1601
  entity_type: entity_t.EntityType,
1602
+ _request_options: client_config_t.RequestOptions | None = None,
1069
1603
  ) -> resolve_entity_ids_t.Data:
1070
1604
  """Gets the names for passed in ids
1071
1605
 
@@ -1080,6 +1614,7 @@ class ClientMethods(ABC):
1080
1614
  method=resolve_entity_ids_t.ENDPOINT_METHOD,
1081
1615
  endpoint=resolve_entity_ids_t.ENDPOINT_PATH,
1082
1616
  args=args,
1617
+ request_options=_request_options,
1083
1618
  )
1084
1619
  return self.do_request(api_request=api_request, return_type=resolve_entity_ids_t.Data)
1085
1620
 
@@ -1087,6 +1622,7 @@ class ClientMethods(ABC):
1087
1622
  self,
1088
1623
  *,
1089
1624
  requested_conditions: list[resolve_output_conditions_t.ConditionRequest],
1625
+ _request_options: client_config_t.RequestOptions | None = None,
1090
1626
  ) -> resolve_output_conditions_t.Data:
1091
1627
  """For the provided set of condition parameter id and values, returns the existing or newly created output condition id for that value and id pair.
1092
1628
 
@@ -1098,6 +1634,7 @@ class ClientMethods(ABC):
1098
1634
  method=resolve_output_conditions_t.ENDPOINT_METHOD,
1099
1635
  endpoint=resolve_output_conditions_t.ENDPOINT_PATH,
1100
1636
  args=args,
1637
+ request_options=_request_options,
1101
1638
  )
1102
1639
  return self.do_request(api_request=api_request, return_type=resolve_output_conditions_t.Data)
1103
1640
 
@@ -1105,7 +1642,8 @@ class ClientMethods(ABC):
1105
1642
  self,
1106
1643
  *,
1107
1644
  trigger_ref_name: str,
1108
- entity: typing.Optional[entity_t.Entity] = None,
1645
+ entity: entity_t.Entity | None = None,
1646
+ _request_options: client_config_t.RequestOptions | None = None,
1109
1647
  ) -> run_trigger_t.Data:
1110
1648
  """Runs a trigger. Requires admin access
1111
1649
 
@@ -1118,6 +1656,7 @@ class ClientMethods(ABC):
1118
1656
  method=run_trigger_t.ENDPOINT_METHOD,
1119
1657
  endpoint=run_trigger_t.ENDPOINT_PATH,
1120
1658
  args=args,
1659
+ request_options=_request_options,
1121
1660
  )
1122
1661
  return self.do_request(api_request=api_request, return_type=run_trigger_t.Data)
1123
1662
 
@@ -1127,8 +1666,9 @@ class ClientMethods(ABC):
1127
1666
  scope: set_core_permissions_t.PermissionsScope,
1128
1667
  permissions_types: list[permissions_t.CorePermissionType],
1129
1668
  update_type: post_base_t.UpdateType,
1130
- user_group_ids: typing.Optional[list[int]] = None,
1131
- user_ids: typing.Optional[list[int]] = None,
1669
+ user_group_ids: list[int] | None = None,
1670
+ user_ids: list[int] | None = None,
1671
+ _request_options: client_config_t.RequestOptions | None = None,
1132
1672
  ) -> set_core_permissions_t.Data:
1133
1673
  """Sets recipe related permissions
1134
1674
 
@@ -1148,13 +1688,39 @@ class ClientMethods(ABC):
1148
1688
  method=set_core_permissions_t.ENDPOINT_METHOD,
1149
1689
  endpoint=set_core_permissions_t.ENDPOINT_PATH,
1150
1690
  args=args,
1691
+ request_options=_request_options,
1151
1692
  )
1152
1693
  return self.do_request(api_request=api_request, return_type=set_core_permissions_t.Data)
1153
1694
 
1695
+ def set_entity_field_values(
1696
+ self,
1697
+ *,
1698
+ entity_identifier: entity_t.EntityIdentifier,
1699
+ field_values: list[field_values_t.FieldArgumentValue],
1700
+ _request_options: client_config_t.RequestOptions | None = None,
1701
+ ) -> set_entity_field_values_t.Data:
1702
+ """Sets field values for an entity
1703
+
1704
+ :param entity_identifier: Entity to update
1705
+ :param field_values: Field values to set
1706
+ """
1707
+ args = set_entity_field_values_t.Arguments(
1708
+ entity_identifier=entity_identifier,
1709
+ field_values=field_values,
1710
+ )
1711
+ api_request = APIRequest(
1712
+ method=set_entity_field_values_t.ENDPOINT_METHOD,
1713
+ endpoint=set_entity_field_values_t.ENDPOINT_PATH,
1714
+ args=args,
1715
+ request_options=_request_options,
1716
+ )
1717
+ return self.do_request(api_request=api_request, return_type=set_entity_field_values_t.Data)
1718
+
1154
1719
  def set_input_attribute_values(
1155
1720
  self,
1156
1721
  *,
1157
1722
  attribute_values: list[set_input_attribute_values_t.InputAttributeValue],
1723
+ _request_options: client_config_t.RequestOptions | None = None,
1158
1724
  ) -> set_input_attribute_values_t.Data:
1159
1725
  """Sets attribute values for an input
1160
1726
 
@@ -1167,6 +1733,7 @@ class ClientMethods(ABC):
1167
1733
  method=set_input_attribute_values_t.ENDPOINT_METHOD,
1168
1734
  endpoint=set_input_attribute_values_t.ENDPOINT_PATH,
1169
1735
  args=args,
1736
+ request_options=_request_options,
1170
1737
  )
1171
1738
  return self.do_request(api_request=api_request, return_type=set_input_attribute_values_t.Data)
1172
1739
 
@@ -1174,13 +1741,14 @@ class ClientMethods(ABC):
1174
1741
  self,
1175
1742
  *,
1176
1743
  input_key: identifier_t.IdentifierKey,
1177
- category_id: int,
1178
- material_family_ids: typing.Optional[list[int]] = None,
1744
+ category_id: int | None,
1745
+ material_family_ids: list[int] | None = None,
1746
+ _request_options: client_config_t.RequestOptions | None = None,
1179
1747
  ) -> set_input_category_t.Data:
1180
1748
  """Sets subcategories for an input
1181
1749
 
1182
1750
  :param input_key: Identifier for the input
1183
- :param category_id: The subcategory identifiers to set
1751
+ :param category_id: The category identifier to set. Null unsets the current category.
1184
1752
  :param material_family_ids: The material families to perform the update in
1185
1753
  """
1186
1754
  args = set_input_category_t.Arguments(
@@ -1192,6 +1760,7 @@ class ClientMethods(ABC):
1192
1760
  method=set_input_category_t.ENDPOINT_METHOD,
1193
1761
  endpoint=set_input_category_t.ENDPOINT_PATH,
1194
1762
  args=args,
1763
+ request_options=_request_options,
1195
1764
  )
1196
1765
  return self.do_request(api_request=api_request, return_type=set_input_category_t.Data)
1197
1766
 
@@ -1201,6 +1770,7 @@ class ClientMethods(ABC):
1201
1770
  input_key: identifier_t.IdentifierKey,
1202
1771
  subcategory_ids: list[int],
1203
1772
  update_type: post_base_t.UpdateType,
1773
+ _request_options: client_config_t.RequestOptions | None = None,
1204
1774
  ) -> set_input_subcategories_t.Data:
1205
1775
  """Sets subcategories for an input
1206
1776
 
@@ -1217,6 +1787,7 @@ class ClientMethods(ABC):
1217
1787
  method=set_input_subcategories_t.ENDPOINT_METHOD,
1218
1788
  endpoint=set_input_subcategories_t.ENDPOINT_PATH,
1219
1789
  args=args,
1790
+ request_options=_request_options,
1220
1791
  )
1221
1792
  return self.do_request(api_request=api_request, return_type=set_input_subcategories_t.Data)
1222
1793
 
@@ -1225,6 +1796,7 @@ class ClientMethods(ABC):
1225
1796
  *,
1226
1797
  input_key: identifier_t.IdentifierKey,
1227
1798
  intermediate_type: set_intermediate_type_t.IntermediateType,
1799
+ _request_options: client_config_t.RequestOptions | None = None,
1228
1800
  ) -> set_intermediate_type_t.Data:
1229
1801
  """Sets the type of an intermediate ingredient.
1230
1802
 
@@ -1239,6 +1811,7 @@ class ClientMethods(ABC):
1239
1811
  method=set_intermediate_type_t.ENDPOINT_METHOD,
1240
1812
  endpoint=set_intermediate_type_t.ENDPOINT_PATH,
1241
1813
  args=args,
1814
+ request_options=_request_options,
1242
1815
  )
1243
1816
  return self.do_request(api_request=api_request, return_type=set_intermediate_type_t.Data)
1244
1817
 
@@ -1246,6 +1819,7 @@ class ClientMethods(ABC):
1246
1819
  self,
1247
1820
  *,
1248
1821
  input_data: list[set_recipe_inputs_t.RecipeInputValue],
1822
+ _request_options: client_config_t.RequestOptions | None = None,
1249
1823
  ) -> set_recipe_inputs_t.Data:
1250
1824
  """Sets inputs values for an experiment. Values set can be numeric, text or categorical types in the Uncountable system
1251
1825
 
@@ -1258,6 +1832,7 @@ class ClientMethods(ABC):
1258
1832
  method=set_recipe_inputs_t.ENDPOINT_METHOD,
1259
1833
  endpoint=set_recipe_inputs_t.ENDPOINT_PATH,
1260
1834
  args=args,
1835
+ request_options=_request_options,
1261
1836
  )
1262
1837
  return self.do_request(api_request=api_request, return_type=set_recipe_inputs_t.Data)
1263
1838
 
@@ -1266,6 +1841,7 @@ class ClientMethods(ABC):
1266
1841
  *,
1267
1842
  recipe_key: identifier_t.IdentifierKey,
1268
1843
  recipe_metadata: list[recipe_metadata_t.MetadataValue],
1844
+ _request_options: client_config_t.RequestOptions | None = None,
1269
1845
  ) -> set_recipe_metadata_t.Data:
1270
1846
  """Set metadata values on a recipe
1271
1847
 
@@ -1280,6 +1856,7 @@ class ClientMethods(ABC):
1280
1856
  method=set_recipe_metadata_t.ENDPOINT_METHOD,
1281
1857
  endpoint=set_recipe_metadata_t.ENDPOINT_PATH,
1282
1858
  args=args,
1859
+ request_options=_request_options,
1283
1860
  )
1284
1861
  return self.do_request(api_request=api_request, return_type=set_recipe_metadata_t.Data)
1285
1862
 
@@ -1287,6 +1864,7 @@ class ClientMethods(ABC):
1287
1864
  self,
1288
1865
  *,
1289
1866
  updates: list[set_recipe_output_annotations_t.RecipeOutputUpdateAnnotations],
1867
+ _request_options: client_config_t.RequestOptions | None = None,
1290
1868
  ) -> set_recipe_output_annotations_t.Data:
1291
1869
  """Update annotations for an experiments outputs
1292
1870
 
@@ -1299,13 +1877,36 @@ class ClientMethods(ABC):
1299
1877
  method=set_recipe_output_annotations_t.ENDPOINT_METHOD,
1300
1878
  endpoint=set_recipe_output_annotations_t.ENDPOINT_PATH,
1301
1879
  args=args,
1880
+ request_options=_request_options,
1302
1881
  )
1303
1882
  return self.do_request(api_request=api_request, return_type=set_recipe_output_annotations_t.Data)
1304
1883
 
1884
+ def set_recipe_output_file(
1885
+ self,
1886
+ *,
1887
+ output_file_data: set_recipe_output_file_t.RecipeOutputFileValue,
1888
+ _request_options: client_config_t.RequestOptions | None = None,
1889
+ ) -> set_recipe_output_file_t.Data:
1890
+ """Sets output file value for an experiment. Include a single file as part of the FormData of the request with the filename as the key
1891
+
1892
+ :param output_file_data: The output file to set
1893
+ """
1894
+ args = set_recipe_output_file_t.Arguments(
1895
+ output_file_data=output_file_data,
1896
+ )
1897
+ api_request = APIRequest(
1898
+ method=set_recipe_output_file_t.ENDPOINT_METHOD,
1899
+ endpoint=set_recipe_output_file_t.ENDPOINT_PATH,
1900
+ args=args,
1901
+ request_options=_request_options,
1902
+ )
1903
+ return self.do_request(api_request=api_request, return_type=set_recipe_output_file_t.Data)
1904
+
1305
1905
  def set_recipe_outputs(
1306
1906
  self,
1307
1907
  *,
1308
1908
  output_data: list[set_recipe_outputs_t.RecipeOutputValue],
1909
+ _request_options: client_config_t.RequestOptions | None = None,
1309
1910
  ) -> set_recipe_outputs_t.Data:
1310
1911
  """Sets output values for an experiment. Values set can be numeric, text or categorical types in the Uncountable system
1311
1912
 
@@ -1318,6 +1919,7 @@ class ClientMethods(ABC):
1318
1919
  method=set_recipe_outputs_t.ENDPOINT_METHOD,
1319
1920
  endpoint=set_recipe_outputs_t.ENDPOINT_PATH,
1320
1921
  args=args,
1922
+ request_options=_request_options,
1321
1923
  )
1322
1924
  return self.do_request(api_request=api_request, return_type=set_recipe_outputs_t.Data)
1323
1925
 
@@ -1326,6 +1928,7 @@ class ClientMethods(ABC):
1326
1928
  *,
1327
1929
  recipe_key: identifier_t.IdentifierKey,
1328
1930
  recipe_tag_update: set_recipe_tags_t.RecipeTagUpdate,
1931
+ _request_options: client_config_t.RequestOptions | None = None,
1329
1932
  ) -> set_recipe_tags_t.Data:
1330
1933
  """Modifies recipes tags for a recipe
1331
1934
 
@@ -1340,14 +1943,46 @@ class ClientMethods(ABC):
1340
1943
  method=set_recipe_tags_t.ENDPOINT_METHOD,
1341
1944
  endpoint=set_recipe_tags_t.ENDPOINT_PATH,
1342
1945
  args=args,
1946
+ request_options=_request_options,
1343
1947
  )
1344
1948
  return self.do_request(api_request=api_request, return_type=set_recipe_tags_t.Data)
1345
1949
 
1950
+ def set_recipe_total(
1951
+ self,
1952
+ *,
1953
+ recipe_key: identifier_t.IdentifierKey,
1954
+ value: set_recipe_total_t.ValueNumeric,
1955
+ recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifier | None = None,
1956
+ calculation_key: identifier_t.IdentifierKey | None = None,
1957
+ _request_options: client_config_t.RequestOptions | None = None,
1958
+ ) -> set_recipe_total_t.Data:
1959
+ """Updates the Set Total value for a recipe or one of its workflow steps
1960
+
1961
+ :param recipe_key: Identifier for the recipe
1962
+ :param recipe_workflow_step_identifier: Identifier for the recipe workflow step
1963
+ :param value: The quantity in mass, volume, or moles to set for the total
1964
+ :param calculation_key: The linked basis calculation to set
1965
+ """
1966
+ args = set_recipe_total_t.Arguments(
1967
+ recipe_key=recipe_key,
1968
+ recipe_workflow_step_identifier=recipe_workflow_step_identifier,
1969
+ value=value,
1970
+ calculation_key=calculation_key,
1971
+ )
1972
+ api_request = APIRequest(
1973
+ method=set_recipe_total_t.ENDPOINT_METHOD,
1974
+ endpoint=set_recipe_total_t.ENDPOINT_PATH,
1975
+ args=args,
1976
+ request_options=_request_options,
1977
+ )
1978
+ return self.do_request(api_request=api_request, return_type=set_recipe_total_t.Data)
1979
+
1346
1980
  def set_values(
1347
1981
  self,
1348
1982
  *,
1349
1983
  entity: entity_t.Entity,
1350
1984
  values: list[field_values_t.ArgumentValueRefName],
1985
+ _request_options: client_config_t.RequestOptions | None = None,
1351
1986
  ) -> set_values_t.Data:
1352
1987
  """Sets field values for an entity
1353
1988
 
@@ -1360,26 +1995,34 @@ class ClientMethods(ABC):
1360
1995
  method=set_values_t.ENDPOINT_METHOD,
1361
1996
  endpoint=set_values_t.ENDPOINT_PATH,
1362
1997
  args=args,
1998
+ request_options=_request_options,
1363
1999
  )
1364
2000
  return self.do_request(api_request=api_request, return_type=set_values_t.Data)
1365
2001
 
1366
2002
  def transition_entity_phase(
1367
2003
  self,
1368
2004
  *,
1369
- entity: entity_t.Entity,
1370
2005
  transition: transition_entity_phase_t.TransitionIdentifier,
2006
+ entity: entity_t.Entity | None = None,
2007
+ entity_identifier: entity_t.EntityIdentifier | None = None,
2008
+ _request_options: client_config_t.RequestOptions | None = None,
1371
2009
  ) -> transition_entity_phase_t.Data:
1372
2010
  """Transitions an entity from one phase to another
1373
2011
 
2012
+ :param entity: Entity to transition. If entity_identifier is provided, this should be omitted.
2013
+ :param entity_identifier: Identifier of the entity to transition. If entity is provided, this should be omitted.
2014
+ :param transition: Identifier of the transition to perform
1374
2015
  """
1375
2016
  args = transition_entity_phase_t.Arguments(
1376
2017
  entity=entity,
2018
+ entity_identifier=entity_identifier,
1377
2019
  transition=transition,
1378
2020
  )
1379
2021
  api_request = APIRequest(
1380
2022
  method=transition_entity_phase_t.ENDPOINT_METHOD,
1381
2023
  endpoint=transition_entity_phase_t.ENDPOINT_PATH,
1382
2024
  args=args,
2025
+ request_options=_request_options,
1383
2026
  )
1384
2027
  return self.do_request(api_request=api_request, return_type=transition_entity_phase_t.Data)
1385
2028
 
@@ -1387,6 +2030,7 @@ class ClientMethods(ABC):
1387
2030
  self,
1388
2031
  *,
1389
2032
  recipes: list[identifier_t.IdentifierKey],
2033
+ _request_options: client_config_t.RequestOptions | None = None,
1390
2034
  ) -> unarchive_recipes_t.Data:
1391
2035
  """Unarchive/restore the provided recipes
1392
2036
 
@@ -1399,6 +2043,7 @@ class ClientMethods(ABC):
1399
2043
  method=unarchive_recipes_t.ENDPOINT_METHOD,
1400
2044
  endpoint=unarchive_recipes_t.ENDPOINT_PATH,
1401
2045
  args=args,
2046
+ request_options=_request_options,
1402
2047
  )
1403
2048
  return self.do_request(api_request=api_request, return_type=unarchive_recipes_t.Data)
1404
2049
 
@@ -1407,6 +2052,7 @@ class ClientMethods(ABC):
1407
2052
  *,
1408
2053
  entity_key: identifier_t.IdentifierKey,
1409
2054
  entity_type: entity_t.EntityType,
2055
+ _request_options: client_config_t.RequestOptions | None = None,
1410
2056
  ) -> unlock_entity_t.Data:
1411
2057
  """Unlock an entity
1412
2058
 
@@ -1420,6 +2066,7 @@ class ClientMethods(ABC):
1420
2066
  method=unlock_entity_t.ENDPOINT_METHOD,
1421
2067
  endpoint=unlock_entity_t.ENDPOINT_PATH,
1422
2068
  args=args,
2069
+ request_options=_request_options,
1423
2070
  )
1424
2071
  return self.do_request(api_request=api_request, return_type=unlock_entity_t.Data)
1425
2072
 
@@ -1428,7 +2075,8 @@ class ClientMethods(ABC):
1428
2075
  *,
1429
2076
  type: unlock_recipes_t.RecipeUnlockType = unlock_recipes_t.RecipeUnlockType.STANDARD,
1430
2077
  recipes: list[identifier_t.IdentifierKey],
1431
- unlock_samples: typing.Optional[bool] = None,
2078
+ unlock_samples: bool | None = None,
2079
+ _request_options: client_config_t.RequestOptions | None = None,
1432
2080
  ) -> unlock_recipes_t.Data:
1433
2081
  """Unlock experiments. Experiments will edtiable after unlocking if they are currently locked.
1434
2082
 
@@ -1445,6 +2093,7 @@ class ClientMethods(ABC):
1445
2093
  method=unlock_recipes_t.ENDPOINT_METHOD,
1446
2094
  endpoint=unlock_recipes_t.ENDPOINT_PATH,
1447
2095
  args=args,
2096
+ request_options=_request_options,
1448
2097
  )
1449
2098
  return self.do_request(api_request=api_request, return_type=unlock_recipes_t.Data)
1450
2099
 
@@ -1452,9 +2101,10 @@ class ClientMethods(ABC):
1452
2101
  self,
1453
2102
  *,
1454
2103
  entity_key: identifier_t.IdentifierKey,
1455
- entity_type: typing.Union[typing.Literal[entity_t.EntityType.RECIPE_METADATA], typing.Literal[entity_t.EntityType.INGREDIENT], typing.Literal[entity_t.EntityType.OUTPUT], typing.Literal[entity_t.EntityType.CONDITION_PARAMETER], typing.Literal[entity_t.EntityType.INGREDIENT_ATTRIBUTE]],
2104
+ entity_type: typing.Literal[entity_t.EntityType.RECIPE_METADATA] | typing.Literal[entity_t.EntityType.INGREDIENT] | typing.Literal[entity_t.EntityType.OUTPUT] | typing.Literal[entity_t.EntityType.CONDITION_PARAMETER] | typing.Literal[entity_t.EntityType.INGREDIENT_ATTRIBUTE] | typing.Literal[entity_t.EntityType.INGREDIENT_CATEGORY_ALL],
1456
2105
  material_family_ids: list[base_t.ObjectId],
1457
2106
  update_type: post_base_t.UpdateType,
2107
+ _request_options: client_config_t.RequestOptions | None = None,
1458
2108
  ) -> update_entity_material_families_t.Data:
1459
2109
  """Updates the material families that the entity is available in
1460
2110
 
@@ -1473,14 +2123,44 @@ class ClientMethods(ABC):
1473
2123
  method=update_entity_material_families_t.ENDPOINT_METHOD,
1474
2124
  endpoint=update_entity_material_families_t.ENDPOINT_PATH,
1475
2125
  args=args,
2126
+ request_options=_request_options,
1476
2127
  )
1477
2128
  return self.do_request(api_request=api_request, return_type=update_entity_material_families_t.Data)
1478
2129
 
2130
+ def upsert_condition_match(
2131
+ self,
2132
+ *,
2133
+ explicit_name: bool = False,
2134
+ name: str | None = None,
2135
+ condition_parameters: list[upsert_condition_match_t.ConditionParameter] | None = None,
2136
+ output_conditions: list[identifier_t.IdentifierKey] | None = None,
2137
+ existing_condition_match: identifier_t.IdentifierKey | None = None,
2138
+ _request_options: client_config_t.RequestOptions | None = None,
2139
+ ) -> upsert_condition_match_t.Data:
2140
+ """Creates or updates condition match
2141
+
2142
+ """
2143
+ args = upsert_condition_match_t.Arguments(
2144
+ name=name,
2145
+ condition_parameters=condition_parameters,
2146
+ output_conditions=output_conditions,
2147
+ explicit_name=explicit_name,
2148
+ existing_condition_match=existing_condition_match,
2149
+ )
2150
+ api_request = APIRequest(
2151
+ method=upsert_condition_match_t.ENDPOINT_METHOD,
2152
+ endpoint=upsert_condition_match_t.ENDPOINT_PATH,
2153
+ args=args,
2154
+ request_options=_request_options,
2155
+ )
2156
+ return self.do_request(api_request=api_request, return_type=upsert_condition_match_t.Data)
2157
+
1479
2158
  def upsert_field_options(
1480
2159
  self,
1481
2160
  *,
1482
2161
  option_set_key: identifier_t.IdentifierKey,
1483
2162
  field_options: list[upsert_field_options_t.FieldOption],
2163
+ _request_options: client_config_t.RequestOptions | None = None,
1484
2164
  ) -> upsert_field_options_t.Data:
1485
2165
  """Creates or updates field options for an option set
1486
2166
 
@@ -1495,5 +2175,6 @@ class ClientMethods(ABC):
1495
2175
  method=upsert_field_options_t.ENDPOINT_METHOD,
1496
2176
  endpoint=upsert_field_options_t.ENDPOINT_PATH,
1497
2177
  args=args,
2178
+ request_options=_request_options,
1498
2179
  )
1499
2180
  return self.do_request(api_request=api_request, return_type=upsert_field_options_t.Data)