label-studio-sdk 0.0.34__py3-none-any.whl → 1.0.1__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 label-studio-sdk might be problematic. Click here for more details.

Files changed (272) hide show
  1. label_studio_sdk/__init__.py +232 -9
  2. label_studio_sdk/_extensions/label_studio_tools/__init__.py +0 -0
  3. label_studio_sdk/_extensions/label_studio_tools/core/__init__.py +0 -0
  4. label_studio_sdk/_extensions/label_studio_tools/core/label_config.py +163 -0
  5. label_studio_sdk/_extensions/label_studio_tools/core/utils/__init__.py +0 -0
  6. label_studio_sdk/_extensions/label_studio_tools/core/utils/exceptions.py +2 -0
  7. label_studio_sdk/_extensions/label_studio_tools/core/utils/io.py +228 -0
  8. label_studio_sdk/_extensions/label_studio_tools/core/utils/params.py +45 -0
  9. label_studio_sdk/_extensions/label_studio_tools/etl/__init__.py +1 -0
  10. label_studio_sdk/_extensions/label_studio_tools/etl/beam.py +34 -0
  11. label_studio_sdk/_extensions/label_studio_tools/etl/example.py +17 -0
  12. label_studio_sdk/_extensions/label_studio_tools/etl/registry.py +67 -0
  13. label_studio_sdk/_extensions/label_studio_tools/postprocessing/__init__.py +0 -0
  14. label_studio_sdk/_extensions/label_studio_tools/postprocessing/video.py +97 -0
  15. label_studio_sdk/_extensions/pager_ext.py +49 -0
  16. label_studio_sdk/_legacy/__init__.py +11 -0
  17. label_studio_sdk/_legacy/client.py +471 -0
  18. label_studio_sdk/_legacy/objects.py +74 -0
  19. label_studio_sdk/{project.py → _legacy/project.py} +2 -2
  20. label_studio_sdk/{schema → _legacy/schema}/label_config_schema.json +14 -14
  21. label_studio_sdk/actions/__init__.py +27 -0
  22. label_studio_sdk/actions/client.py +223 -0
  23. label_studio_sdk/actions/types/__init__.py +25 -0
  24. label_studio_sdk/actions/types/actions_create_request_filters.py +43 -0
  25. label_studio_sdk/actions/types/actions_create_request_filters_conjunction.py +5 -0
  26. label_studio_sdk/actions/types/actions_create_request_filters_items_item.py +49 -0
  27. label_studio_sdk/actions/types/actions_create_request_filters_items_item_filter.py +31 -0
  28. label_studio_sdk/actions/types/actions_create_request_filters_items_item_operator.py +23 -0
  29. label_studio_sdk/actions/types/actions_create_request_id.py +19 -0
  30. label_studio_sdk/actions/types/actions_create_request_ordering_item.py +31 -0
  31. label_studio_sdk/actions/types/actions_create_request_selected_items.py +10 -0
  32. label_studio_sdk/actions/types/actions_create_request_selected_items_excluded.py +39 -0
  33. label_studio_sdk/actions/types/actions_create_request_selected_items_included.py +39 -0
  34. label_studio_sdk/annotations/__init__.py +2 -0
  35. label_studio_sdk/annotations/client.py +750 -0
  36. label_studio_sdk/base_client.py +183 -0
  37. label_studio_sdk/client.py +17 -463
  38. label_studio_sdk/converter/__init__.py +7 -0
  39. label_studio_sdk/converter/audio.py +56 -0
  40. label_studio_sdk/converter/brush.py +452 -0
  41. label_studio_sdk/converter/converter.py +1175 -0
  42. label_studio_sdk/converter/exports/__init__.py +0 -0
  43. label_studio_sdk/converter/exports/csv.py +82 -0
  44. label_studio_sdk/converter/exports/csv2.py +103 -0
  45. label_studio_sdk/converter/funsd.py +85 -0
  46. label_studio_sdk/converter/imports/__init__.py +0 -0
  47. label_studio_sdk/converter/imports/coco.py +314 -0
  48. label_studio_sdk/converter/imports/colors.py +198 -0
  49. label_studio_sdk/converter/imports/label_config.py +45 -0
  50. label_studio_sdk/converter/imports/pathtrack.py +269 -0
  51. label_studio_sdk/converter/imports/yolo.py +236 -0
  52. label_studio_sdk/converter/main.py +202 -0
  53. label_studio_sdk/converter/utils.py +473 -0
  54. label_studio_sdk/core/__init__.py +33 -0
  55. label_studio_sdk/core/api_error.py +15 -0
  56. label_studio_sdk/core/client_wrapper.py +55 -0
  57. label_studio_sdk/core/datetime_utils.py +28 -0
  58. label_studio_sdk/core/file.py +38 -0
  59. label_studio_sdk/core/http_client.py +447 -0
  60. label_studio_sdk/core/jsonable_encoder.py +99 -0
  61. label_studio_sdk/core/pagination.py +87 -0
  62. label_studio_sdk/core/pydantic_utilities.py +28 -0
  63. label_studio_sdk/core/query_encoder.py +33 -0
  64. label_studio_sdk/core/remove_none_from_dict.py +11 -0
  65. label_studio_sdk/core/request_options.py +32 -0
  66. label_studio_sdk/environment.py +7 -0
  67. label_studio_sdk/errors/__init__.py +6 -0
  68. label_studio_sdk/errors/bad_request_error.py +8 -0
  69. label_studio_sdk/errors/internal_server_error.py +8 -0
  70. label_studio_sdk/export_storage/__init__.py +28 -0
  71. label_studio_sdk/export_storage/azure/__init__.py +5 -0
  72. label_studio_sdk/export_storage/azure/client.py +888 -0
  73. label_studio_sdk/export_storage/azure/types/__init__.py +6 -0
  74. label_studio_sdk/export_storage/azure/types/azure_create_response.py +67 -0
  75. label_studio_sdk/export_storage/azure/types/azure_update_response.py +67 -0
  76. label_studio_sdk/export_storage/client.py +107 -0
  77. label_studio_sdk/export_storage/gcs/__init__.py +5 -0
  78. label_studio_sdk/export_storage/gcs/client.py +888 -0
  79. label_studio_sdk/export_storage/gcs/types/__init__.py +6 -0
  80. label_studio_sdk/export_storage/gcs/types/gcs_create_response.py +67 -0
  81. label_studio_sdk/export_storage/gcs/types/gcs_update_response.py +67 -0
  82. label_studio_sdk/export_storage/local/__init__.py +5 -0
  83. label_studio_sdk/export_storage/local/client.py +834 -0
  84. label_studio_sdk/export_storage/local/types/__init__.py +6 -0
  85. label_studio_sdk/export_storage/local/types/local_create_response.py +57 -0
  86. label_studio_sdk/export_storage/local/types/local_update_response.py +57 -0
  87. label_studio_sdk/export_storage/redis/__init__.py +5 -0
  88. label_studio_sdk/export_storage/redis/client.py +918 -0
  89. label_studio_sdk/export_storage/redis/types/__init__.py +6 -0
  90. label_studio_sdk/export_storage/redis/types/redis_create_response.py +72 -0
  91. label_studio_sdk/export_storage/redis/types/redis_update_response.py +72 -0
  92. label_studio_sdk/export_storage/s3/__init__.py +5 -0
  93. label_studio_sdk/export_storage/s3/client.py +1008 -0
  94. label_studio_sdk/export_storage/s3/types/__init__.py +6 -0
  95. label_studio_sdk/export_storage/s3/types/s3create_response.py +89 -0
  96. label_studio_sdk/export_storage/s3/types/s3update_response.py +89 -0
  97. label_studio_sdk/export_storage/types/__init__.py +5 -0
  98. label_studio_sdk/export_storage/types/export_storage_list_types_response_item.py +30 -0
  99. label_studio_sdk/files/__init__.py +2 -0
  100. label_studio_sdk/files/client.py +556 -0
  101. label_studio_sdk/import_storage/__init__.py +28 -0
  102. label_studio_sdk/import_storage/azure/__init__.py +5 -0
  103. label_studio_sdk/import_storage/azure/client.py +988 -0
  104. label_studio_sdk/import_storage/azure/types/__init__.py +6 -0
  105. label_studio_sdk/import_storage/azure/types/azure_create_response.py +82 -0
  106. label_studio_sdk/import_storage/azure/types/azure_update_response.py +82 -0
  107. label_studio_sdk/import_storage/client.py +107 -0
  108. label_studio_sdk/import_storage/gcs/__init__.py +5 -0
  109. label_studio_sdk/import_storage/gcs/client.py +988 -0
  110. label_studio_sdk/import_storage/gcs/types/__init__.py +6 -0
  111. label_studio_sdk/import_storage/gcs/types/gcs_create_response.py +82 -0
  112. label_studio_sdk/import_storage/gcs/types/gcs_update_response.py +82 -0
  113. label_studio_sdk/import_storage/local/__init__.py +5 -0
  114. label_studio_sdk/import_storage/local/client.py +836 -0
  115. label_studio_sdk/import_storage/local/types/__init__.py +6 -0
  116. label_studio_sdk/import_storage/local/types/local_create_response.py +57 -0
  117. label_studio_sdk/import_storage/local/types/local_update_response.py +57 -0
  118. label_studio_sdk/import_storage/redis/__init__.py +5 -0
  119. label_studio_sdk/import_storage/redis/client.py +924 -0
  120. label_studio_sdk/import_storage/redis/types/__init__.py +6 -0
  121. label_studio_sdk/import_storage/redis/types/redis_create_response.py +72 -0
  122. label_studio_sdk/import_storage/redis/types/redis_update_response.py +72 -0
  123. label_studio_sdk/import_storage/s3/__init__.py +5 -0
  124. label_studio_sdk/import_storage/s3/client.py +1138 -0
  125. label_studio_sdk/import_storage/s3/types/__init__.py +6 -0
  126. label_studio_sdk/import_storage/s3/types/s3create_response.py +109 -0
  127. label_studio_sdk/import_storage/s3/types/s3update_response.py +109 -0
  128. label_studio_sdk/import_storage/types/__init__.py +5 -0
  129. label_studio_sdk/import_storage/types/import_storage_list_types_response_item.py +30 -0
  130. label_studio_sdk/label_interface/base.py +10 -0
  131. label_studio_sdk/label_interface/control_tags.py +109 -71
  132. label_studio_sdk/label_interface/data_examples.json +96 -0
  133. label_studio_sdk/label_interface/interface.py +102 -53
  134. label_studio_sdk/label_interface/object_tags.py +8 -13
  135. label_studio_sdk/label_interface/region.py +33 -1
  136. label_studio_sdk/ml/__init__.py +19 -0
  137. label_studio_sdk/ml/client.py +981 -0
  138. label_studio_sdk/ml/types/__init__.py +17 -0
  139. label_studio_sdk/ml/types/ml_create_request_auth_method.py +5 -0
  140. label_studio_sdk/ml/types/ml_create_response.py +78 -0
  141. label_studio_sdk/ml/types/ml_create_response_auth_method.py +5 -0
  142. label_studio_sdk/ml/types/ml_update_request_auth_method.py +5 -0
  143. label_studio_sdk/ml/types/ml_update_response.py +78 -0
  144. label_studio_sdk/ml/types/ml_update_response_auth_method.py +5 -0
  145. label_studio_sdk/predictions/__init__.py +2 -0
  146. label_studio_sdk/predictions/client.py +638 -0
  147. label_studio_sdk/projects/__init__.py +6 -0
  148. label_studio_sdk/projects/client.py +1055 -0
  149. label_studio_sdk/projects/client_ext.py +19 -0
  150. label_studio_sdk/projects/exports/__init__.py +2 -0
  151. label_studio_sdk/projects/exports/client.py +930 -0
  152. label_studio_sdk/projects/types/__init__.py +7 -0
  153. label_studio_sdk/projects/types/projects_create_response.py +96 -0
  154. label_studio_sdk/projects/types/projects_import_tasks_response.py +71 -0
  155. label_studio_sdk/projects/types/projects_list_response.py +33 -0
  156. label_studio_sdk/py.typed +0 -0
  157. label_studio_sdk/tasks/__init__.py +5 -0
  158. label_studio_sdk/tasks/client.py +835 -0
  159. label_studio_sdk/tasks/client_ext.py +18 -0
  160. label_studio_sdk/tasks/types/__init__.py +6 -0
  161. label_studio_sdk/tasks/types/tasks_list_request_fields.py +5 -0
  162. label_studio_sdk/tasks/types/tasks_list_response.py +48 -0
  163. label_studio_sdk/types/__init__.py +115 -0
  164. label_studio_sdk/types/annotation.py +116 -0
  165. label_studio_sdk/types/annotation_filter_options.py +42 -0
  166. label_studio_sdk/types/annotation_last_action.py +19 -0
  167. label_studio_sdk/types/azure_blob_export_storage.py +112 -0
  168. label_studio_sdk/types/azure_blob_export_storage_status.py +7 -0
  169. label_studio_sdk/types/azure_blob_import_storage.py +113 -0
  170. label_studio_sdk/types/azure_blob_import_storage_status.py +7 -0
  171. label_studio_sdk/types/base_task.py +113 -0
  172. label_studio_sdk/types/base_user.py +42 -0
  173. label_studio_sdk/types/converted_format.py +36 -0
  174. label_studio_sdk/types/converted_format_status.py +5 -0
  175. label_studio_sdk/types/export.py +48 -0
  176. label_studio_sdk/types/export_convert.py +32 -0
  177. label_studio_sdk/types/export_create.py +54 -0
  178. label_studio_sdk/types/export_create_status.py +5 -0
  179. label_studio_sdk/types/export_status.py +5 -0
  180. label_studio_sdk/types/file_upload.py +30 -0
  181. label_studio_sdk/types/filter.py +53 -0
  182. label_studio_sdk/types/filter_group.py +35 -0
  183. label_studio_sdk/types/gcs_export_storage.py +112 -0
  184. label_studio_sdk/types/gcs_export_storage_status.py +7 -0
  185. label_studio_sdk/types/gcs_import_storage.py +113 -0
  186. label_studio_sdk/types/gcs_import_storage_status.py +7 -0
  187. label_studio_sdk/types/local_files_export_storage.py +97 -0
  188. label_studio_sdk/types/local_files_export_storage_status.py +7 -0
  189. label_studio_sdk/types/local_files_import_storage.py +92 -0
  190. label_studio_sdk/types/local_files_import_storage_status.py +7 -0
  191. label_studio_sdk/types/ml_backend.py +89 -0
  192. label_studio_sdk/types/ml_backend_auth_method.py +5 -0
  193. label_studio_sdk/types/ml_backend_state.py +5 -0
  194. label_studio_sdk/types/prediction.py +78 -0
  195. label_studio_sdk/types/project.py +198 -0
  196. label_studio_sdk/types/project_import.py +63 -0
  197. label_studio_sdk/types/project_import_status.py +5 -0
  198. label_studio_sdk/types/project_label_config.py +32 -0
  199. label_studio_sdk/types/project_sampling.py +7 -0
  200. label_studio_sdk/types/project_skip_queue.py +5 -0
  201. label_studio_sdk/types/redis_export_storage.py +117 -0
  202. label_studio_sdk/types/redis_export_storage_status.py +7 -0
  203. label_studio_sdk/types/redis_import_storage.py +112 -0
  204. label_studio_sdk/types/redis_import_storage_status.py +7 -0
  205. label_studio_sdk/types/s3export_storage.py +134 -0
  206. label_studio_sdk/types/s3export_storage_status.py +7 -0
  207. label_studio_sdk/types/s3import_storage.py +140 -0
  208. label_studio_sdk/types/s3import_storage_status.py +7 -0
  209. label_studio_sdk/types/serialization_option.py +36 -0
  210. label_studio_sdk/types/serialization_options.py +45 -0
  211. label_studio_sdk/types/task.py +157 -0
  212. label_studio_sdk/types/task_filter_options.py +49 -0
  213. label_studio_sdk/types/user_simple.py +37 -0
  214. label_studio_sdk/types/view.py +55 -0
  215. label_studio_sdk/types/webhook.py +67 -0
  216. label_studio_sdk/types/webhook_actions_item.py +21 -0
  217. label_studio_sdk/types/webhook_serializer_for_update.py +67 -0
  218. label_studio_sdk/types/webhook_serializer_for_update_actions_item.py +21 -0
  219. label_studio_sdk/users/__init__.py +5 -0
  220. label_studio_sdk/users/client.py +830 -0
  221. label_studio_sdk/users/types/__init__.py +6 -0
  222. label_studio_sdk/users/types/users_get_token_response.py +36 -0
  223. label_studio_sdk/users/types/users_reset_token_response.py +36 -0
  224. label_studio_sdk/version.py +4 -0
  225. label_studio_sdk/views/__init__.py +35 -0
  226. label_studio_sdk/views/client.py +564 -0
  227. label_studio_sdk/views/types/__init__.py +33 -0
  228. label_studio_sdk/views/types/views_create_request_data.py +43 -0
  229. label_studio_sdk/views/types/views_create_request_data_filters.py +43 -0
  230. label_studio_sdk/views/types/views_create_request_data_filters_conjunction.py +5 -0
  231. label_studio_sdk/views/types/views_create_request_data_filters_items_item.py +49 -0
  232. label_studio_sdk/views/types/views_create_request_data_filters_items_item_filter.py +31 -0
  233. label_studio_sdk/views/types/views_create_request_data_filters_items_item_operator.py +23 -0
  234. label_studio_sdk/views/types/views_create_request_data_ordering_item.py +31 -0
  235. label_studio_sdk/views/types/views_update_request_data.py +43 -0
  236. label_studio_sdk/views/types/views_update_request_data_filters.py +43 -0
  237. label_studio_sdk/views/types/views_update_request_data_filters_conjunction.py +5 -0
  238. label_studio_sdk/views/types/views_update_request_data_filters_items_item.py +49 -0
  239. label_studio_sdk/views/types/views_update_request_data_filters_items_item_filter.py +31 -0
  240. label_studio_sdk/views/types/views_update_request_data_filters_items_item_operator.py +23 -0
  241. label_studio_sdk/views/types/views_update_request_data_ordering_item.py +31 -0
  242. label_studio_sdk/webhooks/__init__.py +5 -0
  243. label_studio_sdk/webhooks/client.py +636 -0
  244. label_studio_sdk/webhooks/types/__init__.py +5 -0
  245. label_studio_sdk/webhooks/types/webhooks_update_request_actions_item.py +21 -0
  246. label_studio_sdk-1.0.1.dist-info/METADATA +163 -0
  247. label_studio_sdk-1.0.1.dist-info/RECORD +256 -0
  248. {label_studio_sdk-0.0.34.dist-info → label_studio_sdk-1.0.1.dist-info}/WHEEL +1 -2
  249. label_studio_sdk/objects.py +0 -35
  250. label_studio_sdk-0.0.34.dist-info/LICENSE +0 -201
  251. label_studio_sdk-0.0.34.dist-info/METADATA +0 -24
  252. label_studio_sdk-0.0.34.dist-info/RECORD +0 -37
  253. label_studio_sdk-0.0.34.dist-info/top_level.txt +0 -2
  254. tests/test_client.py +0 -37
  255. tests/test_export.py +0 -105
  256. tests/test_interface/__init__.py +0 -1
  257. tests/test_interface/configs.py +0 -137
  258. tests/test_interface/mockups.py +0 -22
  259. tests/test_interface/test_compat.py +0 -64
  260. tests/test_interface/test_control_tags.py +0 -55
  261. tests/test_interface/test_data_generation.py +0 -45
  262. tests/test_interface/test_lpi.py +0 -15
  263. tests/test_interface/test_main.py +0 -196
  264. tests/test_interface/test_object_tags.py +0 -36
  265. tests/test_interface/test_region.py +0 -36
  266. tests/test_interface/test_validate_summary.py +0 -35
  267. tests/test_interface/test_validation.py +0 -59
  268. {tests → label_studio_sdk/_extensions}/__init__.py +0 -0
  269. /label_studio_sdk/{exceptions.py → _legacy/exceptions.py} +0 -0
  270. /label_studio_sdk/{users.py → _legacy/users.py} +0 -0
  271. /label_studio_sdk/{utils.py → _legacy/utils.py} +0 -0
  272. /label_studio_sdk/{workspaces.py → _legacy/workspaces.py} +0 -0
@@ -0,0 +1,834 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from json.decoder import JSONDecodeError
5
+
6
+ from ...core.api_error import ApiError
7
+ from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
8
+ from ...core.jsonable_encoder import jsonable_encoder
9
+ from ...core.pydantic_utilities import pydantic_v1
10
+ from ...core.request_options import RequestOptions
11
+ from ...types.local_files_export_storage import LocalFilesExportStorage
12
+ from .types.local_create_response import LocalCreateResponse
13
+ from .types.local_update_response import LocalUpdateResponse
14
+
15
+ # this is used as the default value for optional parameters
16
+ OMIT = typing.cast(typing.Any, ...)
17
+
18
+
19
+ class LocalClient:
20
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
21
+ self._client_wrapper = client_wrapper
22
+
23
+ def list(
24
+ self, *, project: typing.Optional[int] = None, request_options: typing.Optional[RequestOptions] = None
25
+ ) -> typing.List[LocalFilesExportStorage]:
26
+ """
27
+ You can connect a local file directory to Label Studio as a source storage or target storage. Use this API request to get a list of all local file export (target) storage connections for a specific project.
28
+
29
+ The project ID can be found in the URL when viewing the project in Label Studio, or you can retrieve all project IDs using [List all projects](../projects/list).
30
+
31
+ For more information about working with external storage, see [Sync data from external storage](https://labelstud.io/guide/storage).
32
+
33
+ Parameters
34
+ ----------
35
+ project : typing.Optional[int]
36
+ Project ID
37
+
38
+ request_options : typing.Optional[RequestOptions]
39
+ Request-specific configuration.
40
+
41
+ Returns
42
+ -------
43
+ typing.List[LocalFilesExportStorage]
44
+
45
+
46
+ Examples
47
+ --------
48
+ from label_studio_sdk.client import LabelStudio
49
+
50
+ client = LabelStudio(
51
+ api_key="YOUR_API_KEY",
52
+ )
53
+ client.export_storage.local.list()
54
+ """
55
+ _response = self._client_wrapper.httpx_client.request(
56
+ "api/storages/export/localfiles", method="GET", params={"project": project}, request_options=request_options
57
+ )
58
+ if 200 <= _response.status_code < 300:
59
+ return pydantic_v1.parse_obj_as(typing.List[LocalFilesExportStorage], _response.json()) # type: ignore
60
+ try:
61
+ _response_json = _response.json()
62
+ except JSONDecodeError:
63
+ raise ApiError(status_code=_response.status_code, body=_response.text)
64
+ raise ApiError(status_code=_response.status_code, body=_response_json)
65
+
66
+ def create(
67
+ self,
68
+ *,
69
+ title: typing.Optional[str] = OMIT,
70
+ description: typing.Optional[str] = OMIT,
71
+ project: typing.Optional[int] = OMIT,
72
+ path: typing.Optional[str] = OMIT,
73
+ regex_filter: typing.Optional[str] = OMIT,
74
+ use_blob_urls: typing.Optional[bool] = OMIT,
75
+ request_options: typing.Optional[RequestOptions] = None,
76
+ ) -> LocalCreateResponse:
77
+ """
78
+ Create a new target storage connection to a local file directory.
79
+
80
+ For information about the required fields and prerequisites, see [Local storage](https://labelstud.io/guide/storage#Local-storage) in the Label Studio documentation.
81
+
82
+ <Tip>After you add the storage, you should validate the connection before attempting to sync your data. Your data will not be exported until you [sync your connection](sync).</Tip>
83
+
84
+ Parameters
85
+ ----------
86
+ title : typing.Optional[str]
87
+ Storage title
88
+
89
+ description : typing.Optional[str]
90
+ Storage description
91
+
92
+ project : typing.Optional[int]
93
+ Project ID
94
+
95
+ path : typing.Optional[str]
96
+ Path to local directory
97
+
98
+ regex_filter : typing.Optional[str]
99
+ Regex for filtering objects
100
+
101
+ use_blob_urls : typing.Optional[bool]
102
+ Interpret objects as BLOBs and generate URLs. For example, if your directory contains images, you can use this option to generate URLs for these images. If set to False, it will read the content of the file and load it into Label Studio.
103
+
104
+ request_options : typing.Optional[RequestOptions]
105
+ Request-specific configuration.
106
+
107
+ Returns
108
+ -------
109
+ LocalCreateResponse
110
+
111
+
112
+ Examples
113
+ --------
114
+ from label_studio_sdk.client import LabelStudio
115
+
116
+ client = LabelStudio(
117
+ api_key="YOUR_API_KEY",
118
+ )
119
+ client.export_storage.local.create()
120
+ """
121
+ _response = self._client_wrapper.httpx_client.request(
122
+ "api/storages/export/localfiles",
123
+ method="POST",
124
+ json={
125
+ "title": title,
126
+ "description": description,
127
+ "project": project,
128
+ "path": path,
129
+ "regex_filter": regex_filter,
130
+ "use_blob_urls": use_blob_urls,
131
+ },
132
+ request_options=request_options,
133
+ omit=OMIT,
134
+ )
135
+ if 200 <= _response.status_code < 300:
136
+ return pydantic_v1.parse_obj_as(LocalCreateResponse, _response.json()) # type: ignore
137
+ try:
138
+ _response_json = _response.json()
139
+ except JSONDecodeError:
140
+ raise ApiError(status_code=_response.status_code, body=_response.text)
141
+ raise ApiError(status_code=_response.status_code, body=_response_json)
142
+
143
+ def validate(
144
+ self,
145
+ *,
146
+ id: typing.Optional[int] = OMIT,
147
+ title: typing.Optional[str] = OMIT,
148
+ description: typing.Optional[str] = OMIT,
149
+ project: typing.Optional[int] = OMIT,
150
+ path: typing.Optional[str] = OMIT,
151
+ regex_filter: typing.Optional[str] = OMIT,
152
+ use_blob_urls: typing.Optional[bool] = OMIT,
153
+ request_options: typing.Optional[RequestOptions] = None,
154
+ ) -> None:
155
+ """
156
+ Validate a specific local file export storage connection. This is useful to ensure that the storage configuration settings are correct and operational before attempting to export data.
157
+
158
+ Parameters
159
+ ----------
160
+ id : typing.Optional[int]
161
+ Storage ID. If set, storage with specified ID will be updated
162
+
163
+ title : typing.Optional[str]
164
+ Storage title
165
+
166
+ description : typing.Optional[str]
167
+ Storage description
168
+
169
+ project : typing.Optional[int]
170
+ Project ID
171
+
172
+ path : typing.Optional[str]
173
+ Path to local directory
174
+
175
+ regex_filter : typing.Optional[str]
176
+ Regex for filtering objects
177
+
178
+ use_blob_urls : typing.Optional[bool]
179
+ Interpret objects as BLOBs and generate URLs. For example, if your directory contains images, you can use this option to generate URLs for these images. If set to False, it will read the content of the file and load it into Label Studio.
180
+
181
+ request_options : typing.Optional[RequestOptions]
182
+ Request-specific configuration.
183
+
184
+ Returns
185
+ -------
186
+ None
187
+
188
+ Examples
189
+ --------
190
+ from label_studio_sdk.client import LabelStudio
191
+
192
+ client = LabelStudio(
193
+ api_key="YOUR_API_KEY",
194
+ )
195
+ client.export_storage.local.validate()
196
+ """
197
+ _response = self._client_wrapper.httpx_client.request(
198
+ "api/storages/export/localfiles/validate",
199
+ method="POST",
200
+ json={
201
+ "id": id,
202
+ "title": title,
203
+ "description": description,
204
+ "project": project,
205
+ "path": path,
206
+ "regex_filter": regex_filter,
207
+ "use_blob_urls": use_blob_urls,
208
+ },
209
+ request_options=request_options,
210
+ omit=OMIT,
211
+ )
212
+ if 200 <= _response.status_code < 300:
213
+ return
214
+ try:
215
+ _response_json = _response.json()
216
+ except JSONDecodeError:
217
+ raise ApiError(status_code=_response.status_code, body=_response.text)
218
+ raise ApiError(status_code=_response.status_code, body=_response_json)
219
+
220
+ def get(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> LocalFilesExportStorage:
221
+ """
222
+ Get a specific local file export storage connection. You will need to provide the export storage ID. You can find this using [List export storages](list).
223
+
224
+ For more information about working with external storage, see [Sync data from external storage](https://labelstud.io/guide/storage).
225
+
226
+ Parameters
227
+ ----------
228
+ id : int
229
+ A unique integer value identifying this local files export storage.
230
+
231
+ request_options : typing.Optional[RequestOptions]
232
+ Request-specific configuration.
233
+
234
+ Returns
235
+ -------
236
+ LocalFilesExportStorage
237
+
238
+
239
+ Examples
240
+ --------
241
+ from label_studio_sdk.client import LabelStudio
242
+
243
+ client = LabelStudio(
244
+ api_key="YOUR_API_KEY",
245
+ )
246
+ client.export_storage.local.get(
247
+ id=1,
248
+ )
249
+ """
250
+ _response = self._client_wrapper.httpx_client.request(
251
+ f"api/storages/export/localfiles/{jsonable_encoder(id)}", method="GET", request_options=request_options
252
+ )
253
+ if 200 <= _response.status_code < 300:
254
+ return pydantic_v1.parse_obj_as(LocalFilesExportStorage, _response.json()) # type: ignore
255
+ try:
256
+ _response_json = _response.json()
257
+ except JSONDecodeError:
258
+ raise ApiError(status_code=_response.status_code, body=_response.text)
259
+ raise ApiError(status_code=_response.status_code, body=_response_json)
260
+
261
+ def delete(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
262
+ """
263
+ Delete a specific local file export storage connection. You will need to provide the export storage ID. You can find this using [List export storages](list).
264
+
265
+ Deleting an export/target storage connection does not affect tasks with synced data in Label Studio. If you want to remove the tasks that were synced from the external storage, you will need to delete them manually from within the Label Studio UI or use the [Delete tasks](../../tasks/delete-all-tasks) API.
266
+
267
+ Parameters
268
+ ----------
269
+ id : int
270
+ A unique integer value identifying this local files export storage.
271
+
272
+ request_options : typing.Optional[RequestOptions]
273
+ Request-specific configuration.
274
+
275
+ Returns
276
+ -------
277
+ None
278
+
279
+ Examples
280
+ --------
281
+ from label_studio_sdk.client import LabelStudio
282
+
283
+ client = LabelStudio(
284
+ api_key="YOUR_API_KEY",
285
+ )
286
+ client.export_storage.local.delete(
287
+ id=1,
288
+ )
289
+ """
290
+ _response = self._client_wrapper.httpx_client.request(
291
+ f"api/storages/export/localfiles/{jsonable_encoder(id)}", method="DELETE", request_options=request_options
292
+ )
293
+ if 200 <= _response.status_code < 300:
294
+ return
295
+ try:
296
+ _response_json = _response.json()
297
+ except JSONDecodeError:
298
+ raise ApiError(status_code=_response.status_code, body=_response.text)
299
+ raise ApiError(status_code=_response.status_code, body=_response_json)
300
+
301
+ def update(
302
+ self,
303
+ id: int,
304
+ *,
305
+ title: typing.Optional[str] = OMIT,
306
+ description: typing.Optional[str] = OMIT,
307
+ project: typing.Optional[int] = OMIT,
308
+ path: typing.Optional[str] = OMIT,
309
+ regex_filter: typing.Optional[str] = OMIT,
310
+ use_blob_urls: typing.Optional[bool] = OMIT,
311
+ request_options: typing.Optional[RequestOptions] = None,
312
+ ) -> LocalUpdateResponse:
313
+ """
314
+ Update a specific local file export storage connection. You will need to provide the export storage ID. You can find this using [List export storages](list).
315
+
316
+ For more information about working with external storage, see [Sync data from external storage](https://labelstud.io/guide/storage).
317
+
318
+ Parameters
319
+ ----------
320
+ id : int
321
+ A unique integer value identifying this local files export storage.
322
+
323
+ title : typing.Optional[str]
324
+ Storage title
325
+
326
+ description : typing.Optional[str]
327
+ Storage description
328
+
329
+ project : typing.Optional[int]
330
+ Project ID
331
+
332
+ path : typing.Optional[str]
333
+ Path to local directory
334
+
335
+ regex_filter : typing.Optional[str]
336
+ Regex for filtering objects
337
+
338
+ use_blob_urls : typing.Optional[bool]
339
+ Interpret objects as BLOBs and generate URLs. For example, if your directory contains images, you can use this option to generate URLs for these images. If set to False, it will read the content of the file and load it into Label Studio.
340
+
341
+ request_options : typing.Optional[RequestOptions]
342
+ Request-specific configuration.
343
+
344
+ Returns
345
+ -------
346
+ LocalUpdateResponse
347
+
348
+
349
+ Examples
350
+ --------
351
+ from label_studio_sdk.client import LabelStudio
352
+
353
+ client = LabelStudio(
354
+ api_key="YOUR_API_KEY",
355
+ )
356
+ client.export_storage.local.update(
357
+ id=1,
358
+ )
359
+ """
360
+ _response = self._client_wrapper.httpx_client.request(
361
+ f"api/storages/export/localfiles/{jsonable_encoder(id)}",
362
+ method="PATCH",
363
+ json={
364
+ "title": title,
365
+ "description": description,
366
+ "project": project,
367
+ "path": path,
368
+ "regex_filter": regex_filter,
369
+ "use_blob_urls": use_blob_urls,
370
+ },
371
+ request_options=request_options,
372
+ omit=OMIT,
373
+ )
374
+ if 200 <= _response.status_code < 300:
375
+ return pydantic_v1.parse_obj_as(LocalUpdateResponse, _response.json()) # type: ignore
376
+ try:
377
+ _response_json = _response.json()
378
+ except JSONDecodeError:
379
+ raise ApiError(status_code=_response.status_code, body=_response.text)
380
+ raise ApiError(status_code=_response.status_code, body=_response_json)
381
+
382
+ def sync(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> LocalFilesExportStorage:
383
+ """
384
+ Sync tasks to an local file export/target storage connection. You will need to provide the export storage ID. You can find this using [List export storages](list).
385
+
386
+ Sync operations with external local file directories only go one way. They either create tasks from objects in the directory (source/import storage) or push annotations to the output directory (export/target storage). Changing something on the local file side doesn’t guarantee consistency in results.
387
+
388
+ <Note>Before proceeding, you should review [How sync operations work - Source storage](https://labelstud.io/guide/storage#Source-storage) to ensure that your data remains secure and private.</Note>
389
+
390
+ Parameters
391
+ ----------
392
+ id : str
393
+
394
+ request_options : typing.Optional[RequestOptions]
395
+ Request-specific configuration.
396
+
397
+ Returns
398
+ -------
399
+ LocalFilesExportStorage
400
+
401
+
402
+ Examples
403
+ --------
404
+ from label_studio_sdk.client import LabelStudio
405
+
406
+ client = LabelStudio(
407
+ api_key="YOUR_API_KEY",
408
+ )
409
+ client.export_storage.local.sync(
410
+ id="id",
411
+ )
412
+ """
413
+ _response = self._client_wrapper.httpx_client.request(
414
+ f"api/storages/export/localfiles/{jsonable_encoder(id)}/sync",
415
+ method="POST",
416
+ request_options=request_options,
417
+ )
418
+ if 200 <= _response.status_code < 300:
419
+ return pydantic_v1.parse_obj_as(LocalFilesExportStorage, _response.json()) # type: ignore
420
+ try:
421
+ _response_json = _response.json()
422
+ except JSONDecodeError:
423
+ raise ApiError(status_code=_response.status_code, body=_response.text)
424
+ raise ApiError(status_code=_response.status_code, body=_response_json)
425
+
426
+
427
+ class AsyncLocalClient:
428
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
429
+ self._client_wrapper = client_wrapper
430
+
431
+ async def list(
432
+ self, *, project: typing.Optional[int] = None, request_options: typing.Optional[RequestOptions] = None
433
+ ) -> typing.List[LocalFilesExportStorage]:
434
+ """
435
+ You can connect a local file directory to Label Studio as a source storage or target storage. Use this API request to get a list of all local file export (target) storage connections for a specific project.
436
+
437
+ The project ID can be found in the URL when viewing the project in Label Studio, or you can retrieve all project IDs using [List all projects](../projects/list).
438
+
439
+ For more information about working with external storage, see [Sync data from external storage](https://labelstud.io/guide/storage).
440
+
441
+ Parameters
442
+ ----------
443
+ project : typing.Optional[int]
444
+ Project ID
445
+
446
+ request_options : typing.Optional[RequestOptions]
447
+ Request-specific configuration.
448
+
449
+ Returns
450
+ -------
451
+ typing.List[LocalFilesExportStorage]
452
+
453
+
454
+ Examples
455
+ --------
456
+ from label_studio_sdk.client import AsyncLabelStudio
457
+
458
+ client = AsyncLabelStudio(
459
+ api_key="YOUR_API_KEY",
460
+ )
461
+ await client.export_storage.local.list()
462
+ """
463
+ _response = await self._client_wrapper.httpx_client.request(
464
+ "api/storages/export/localfiles", method="GET", params={"project": project}, request_options=request_options
465
+ )
466
+ if 200 <= _response.status_code < 300:
467
+ return pydantic_v1.parse_obj_as(typing.List[LocalFilesExportStorage], _response.json()) # type: ignore
468
+ try:
469
+ _response_json = _response.json()
470
+ except JSONDecodeError:
471
+ raise ApiError(status_code=_response.status_code, body=_response.text)
472
+ raise ApiError(status_code=_response.status_code, body=_response_json)
473
+
474
+ async def create(
475
+ self,
476
+ *,
477
+ title: typing.Optional[str] = OMIT,
478
+ description: typing.Optional[str] = OMIT,
479
+ project: typing.Optional[int] = OMIT,
480
+ path: typing.Optional[str] = OMIT,
481
+ regex_filter: typing.Optional[str] = OMIT,
482
+ use_blob_urls: typing.Optional[bool] = OMIT,
483
+ request_options: typing.Optional[RequestOptions] = None,
484
+ ) -> LocalCreateResponse:
485
+ """
486
+ Create a new target storage connection to a local file directory.
487
+
488
+ For information about the required fields and prerequisites, see [Local storage](https://labelstud.io/guide/storage#Local-storage) in the Label Studio documentation.
489
+
490
+ <Tip>After you add the storage, you should validate the connection before attempting to sync your data. Your data will not be exported until you [sync your connection](sync).</Tip>
491
+
492
+ Parameters
493
+ ----------
494
+ title : typing.Optional[str]
495
+ Storage title
496
+
497
+ description : typing.Optional[str]
498
+ Storage description
499
+
500
+ project : typing.Optional[int]
501
+ Project ID
502
+
503
+ path : typing.Optional[str]
504
+ Path to local directory
505
+
506
+ regex_filter : typing.Optional[str]
507
+ Regex for filtering objects
508
+
509
+ use_blob_urls : typing.Optional[bool]
510
+ Interpret objects as BLOBs and generate URLs. For example, if your directory contains images, you can use this option to generate URLs for these images. If set to False, it will read the content of the file and load it into Label Studio.
511
+
512
+ request_options : typing.Optional[RequestOptions]
513
+ Request-specific configuration.
514
+
515
+ Returns
516
+ -------
517
+ LocalCreateResponse
518
+
519
+
520
+ Examples
521
+ --------
522
+ from label_studio_sdk.client import AsyncLabelStudio
523
+
524
+ client = AsyncLabelStudio(
525
+ api_key="YOUR_API_KEY",
526
+ )
527
+ await client.export_storage.local.create()
528
+ """
529
+ _response = await self._client_wrapper.httpx_client.request(
530
+ "api/storages/export/localfiles",
531
+ method="POST",
532
+ json={
533
+ "title": title,
534
+ "description": description,
535
+ "project": project,
536
+ "path": path,
537
+ "regex_filter": regex_filter,
538
+ "use_blob_urls": use_blob_urls,
539
+ },
540
+ request_options=request_options,
541
+ omit=OMIT,
542
+ )
543
+ if 200 <= _response.status_code < 300:
544
+ return pydantic_v1.parse_obj_as(LocalCreateResponse, _response.json()) # type: ignore
545
+ try:
546
+ _response_json = _response.json()
547
+ except JSONDecodeError:
548
+ raise ApiError(status_code=_response.status_code, body=_response.text)
549
+ raise ApiError(status_code=_response.status_code, body=_response_json)
550
+
551
+ async def validate(
552
+ self,
553
+ *,
554
+ id: typing.Optional[int] = OMIT,
555
+ title: typing.Optional[str] = OMIT,
556
+ description: typing.Optional[str] = OMIT,
557
+ project: typing.Optional[int] = OMIT,
558
+ path: typing.Optional[str] = OMIT,
559
+ regex_filter: typing.Optional[str] = OMIT,
560
+ use_blob_urls: typing.Optional[bool] = OMIT,
561
+ request_options: typing.Optional[RequestOptions] = None,
562
+ ) -> None:
563
+ """
564
+ Validate a specific local file export storage connection. This is useful to ensure that the storage configuration settings are correct and operational before attempting to export data.
565
+
566
+ Parameters
567
+ ----------
568
+ id : typing.Optional[int]
569
+ Storage ID. If set, storage with specified ID will be updated
570
+
571
+ title : typing.Optional[str]
572
+ Storage title
573
+
574
+ description : typing.Optional[str]
575
+ Storage description
576
+
577
+ project : typing.Optional[int]
578
+ Project ID
579
+
580
+ path : typing.Optional[str]
581
+ Path to local directory
582
+
583
+ regex_filter : typing.Optional[str]
584
+ Regex for filtering objects
585
+
586
+ use_blob_urls : typing.Optional[bool]
587
+ Interpret objects as BLOBs and generate URLs. For example, if your directory contains images, you can use this option to generate URLs for these images. If set to False, it will read the content of the file and load it into Label Studio.
588
+
589
+ request_options : typing.Optional[RequestOptions]
590
+ Request-specific configuration.
591
+
592
+ Returns
593
+ -------
594
+ None
595
+
596
+ Examples
597
+ --------
598
+ from label_studio_sdk.client import AsyncLabelStudio
599
+
600
+ client = AsyncLabelStudio(
601
+ api_key="YOUR_API_KEY",
602
+ )
603
+ await client.export_storage.local.validate()
604
+ """
605
+ _response = await self._client_wrapper.httpx_client.request(
606
+ "api/storages/export/localfiles/validate",
607
+ method="POST",
608
+ json={
609
+ "id": id,
610
+ "title": title,
611
+ "description": description,
612
+ "project": project,
613
+ "path": path,
614
+ "regex_filter": regex_filter,
615
+ "use_blob_urls": use_blob_urls,
616
+ },
617
+ request_options=request_options,
618
+ omit=OMIT,
619
+ )
620
+ if 200 <= _response.status_code < 300:
621
+ return
622
+ try:
623
+ _response_json = _response.json()
624
+ except JSONDecodeError:
625
+ raise ApiError(status_code=_response.status_code, body=_response.text)
626
+ raise ApiError(status_code=_response.status_code, body=_response_json)
627
+
628
+ async def get(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> LocalFilesExportStorage:
629
+ """
630
+ Get a specific local file export storage connection. You will need to provide the export storage ID. You can find this using [List export storages](list).
631
+
632
+ For more information about working with external storage, see [Sync data from external storage](https://labelstud.io/guide/storage).
633
+
634
+ Parameters
635
+ ----------
636
+ id : int
637
+ A unique integer value identifying this local files export storage.
638
+
639
+ request_options : typing.Optional[RequestOptions]
640
+ Request-specific configuration.
641
+
642
+ Returns
643
+ -------
644
+ LocalFilesExportStorage
645
+
646
+
647
+ Examples
648
+ --------
649
+ from label_studio_sdk.client import AsyncLabelStudio
650
+
651
+ client = AsyncLabelStudio(
652
+ api_key="YOUR_API_KEY",
653
+ )
654
+ await client.export_storage.local.get(
655
+ id=1,
656
+ )
657
+ """
658
+ _response = await self._client_wrapper.httpx_client.request(
659
+ f"api/storages/export/localfiles/{jsonable_encoder(id)}", method="GET", request_options=request_options
660
+ )
661
+ if 200 <= _response.status_code < 300:
662
+ return pydantic_v1.parse_obj_as(LocalFilesExportStorage, _response.json()) # type: ignore
663
+ try:
664
+ _response_json = _response.json()
665
+ except JSONDecodeError:
666
+ raise ApiError(status_code=_response.status_code, body=_response.text)
667
+ raise ApiError(status_code=_response.status_code, body=_response_json)
668
+
669
+ async def delete(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
670
+ """
671
+ Delete a specific local file export storage connection. You will need to provide the export storage ID. You can find this using [List export storages](list).
672
+
673
+ Deleting an export/target storage connection does not affect tasks with synced data in Label Studio. If you want to remove the tasks that were synced from the external storage, you will need to delete them manually from within the Label Studio UI or use the [Delete tasks](../../tasks/delete-all-tasks) API.
674
+
675
+ Parameters
676
+ ----------
677
+ id : int
678
+ A unique integer value identifying this local files export storage.
679
+
680
+ request_options : typing.Optional[RequestOptions]
681
+ Request-specific configuration.
682
+
683
+ Returns
684
+ -------
685
+ None
686
+
687
+ Examples
688
+ --------
689
+ from label_studio_sdk.client import AsyncLabelStudio
690
+
691
+ client = AsyncLabelStudio(
692
+ api_key="YOUR_API_KEY",
693
+ )
694
+ await client.export_storage.local.delete(
695
+ id=1,
696
+ )
697
+ """
698
+ _response = await self._client_wrapper.httpx_client.request(
699
+ f"api/storages/export/localfiles/{jsonable_encoder(id)}", method="DELETE", request_options=request_options
700
+ )
701
+ if 200 <= _response.status_code < 300:
702
+ return
703
+ try:
704
+ _response_json = _response.json()
705
+ except JSONDecodeError:
706
+ raise ApiError(status_code=_response.status_code, body=_response.text)
707
+ raise ApiError(status_code=_response.status_code, body=_response_json)
708
+
709
+ async def update(
710
+ self,
711
+ id: int,
712
+ *,
713
+ title: typing.Optional[str] = OMIT,
714
+ description: typing.Optional[str] = OMIT,
715
+ project: typing.Optional[int] = OMIT,
716
+ path: typing.Optional[str] = OMIT,
717
+ regex_filter: typing.Optional[str] = OMIT,
718
+ use_blob_urls: typing.Optional[bool] = OMIT,
719
+ request_options: typing.Optional[RequestOptions] = None,
720
+ ) -> LocalUpdateResponse:
721
+ """
722
+ Update a specific local file export storage connection. You will need to provide the export storage ID. You can find this using [List export storages](list).
723
+
724
+ For more information about working with external storage, see [Sync data from external storage](https://labelstud.io/guide/storage).
725
+
726
+ Parameters
727
+ ----------
728
+ id : int
729
+ A unique integer value identifying this local files export storage.
730
+
731
+ title : typing.Optional[str]
732
+ Storage title
733
+
734
+ description : typing.Optional[str]
735
+ Storage description
736
+
737
+ project : typing.Optional[int]
738
+ Project ID
739
+
740
+ path : typing.Optional[str]
741
+ Path to local directory
742
+
743
+ regex_filter : typing.Optional[str]
744
+ Regex for filtering objects
745
+
746
+ use_blob_urls : typing.Optional[bool]
747
+ Interpret objects as BLOBs and generate URLs. For example, if your directory contains images, you can use this option to generate URLs for these images. If set to False, it will read the content of the file and load it into Label Studio.
748
+
749
+ request_options : typing.Optional[RequestOptions]
750
+ Request-specific configuration.
751
+
752
+ Returns
753
+ -------
754
+ LocalUpdateResponse
755
+
756
+
757
+ Examples
758
+ --------
759
+ from label_studio_sdk.client import AsyncLabelStudio
760
+
761
+ client = AsyncLabelStudio(
762
+ api_key="YOUR_API_KEY",
763
+ )
764
+ await client.export_storage.local.update(
765
+ id=1,
766
+ )
767
+ """
768
+ _response = await self._client_wrapper.httpx_client.request(
769
+ f"api/storages/export/localfiles/{jsonable_encoder(id)}",
770
+ method="PATCH",
771
+ json={
772
+ "title": title,
773
+ "description": description,
774
+ "project": project,
775
+ "path": path,
776
+ "regex_filter": regex_filter,
777
+ "use_blob_urls": use_blob_urls,
778
+ },
779
+ request_options=request_options,
780
+ omit=OMIT,
781
+ )
782
+ if 200 <= _response.status_code < 300:
783
+ return pydantic_v1.parse_obj_as(LocalUpdateResponse, _response.json()) # type: ignore
784
+ try:
785
+ _response_json = _response.json()
786
+ except JSONDecodeError:
787
+ raise ApiError(status_code=_response.status_code, body=_response.text)
788
+ raise ApiError(status_code=_response.status_code, body=_response_json)
789
+
790
+ async def sync(
791
+ self, id: str, *, request_options: typing.Optional[RequestOptions] = None
792
+ ) -> LocalFilesExportStorage:
793
+ """
794
+ Sync tasks to an local file export/target storage connection. You will need to provide the export storage ID. You can find this using [List export storages](list).
795
+
796
+ Sync operations with external local file directories only go one way. They either create tasks from objects in the directory (source/import storage) or push annotations to the output directory (export/target storage). Changing something on the local file side doesn’t guarantee consistency in results.
797
+
798
+ <Note>Before proceeding, you should review [How sync operations work - Source storage](https://labelstud.io/guide/storage#Source-storage) to ensure that your data remains secure and private.</Note>
799
+
800
+ Parameters
801
+ ----------
802
+ id : str
803
+
804
+ request_options : typing.Optional[RequestOptions]
805
+ Request-specific configuration.
806
+
807
+ Returns
808
+ -------
809
+ LocalFilesExportStorage
810
+
811
+
812
+ Examples
813
+ --------
814
+ from label_studio_sdk.client import AsyncLabelStudio
815
+
816
+ client = AsyncLabelStudio(
817
+ api_key="YOUR_API_KEY",
818
+ )
819
+ await client.export_storage.local.sync(
820
+ id="id",
821
+ )
822
+ """
823
+ _response = await self._client_wrapper.httpx_client.request(
824
+ f"api/storages/export/localfiles/{jsonable_encoder(id)}/sync",
825
+ method="POST",
826
+ request_options=request_options,
827
+ )
828
+ if 200 <= _response.status_code < 300:
829
+ return pydantic_v1.parse_obj_as(LocalFilesExportStorage, _response.json()) # type: ignore
830
+ try:
831
+ _response_json = _response.json()
832
+ except JSONDecodeError:
833
+ raise ApiError(status_code=_response.status_code, body=_response.text)
834
+ raise ApiError(status_code=_response.status_code, body=_response_json)