label-studio-sdk 0.0.34__py3-none-any.whl → 1.0.0__py3-none-any.whl

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