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,830 @@
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.base_user import BaseUser
12
+ from .types.users_get_token_response import UsersGetTokenResponse
13
+ from .types.users_reset_token_response import UsersResetTokenResponse
14
+
15
+ # this is used as the default value for optional parameters
16
+ OMIT = typing.cast(typing.Any, ...)
17
+
18
+
19
+ class UsersClient:
20
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
21
+ self._client_wrapper = client_wrapper
22
+
23
+ def reset_token(self, *, request_options: typing.Optional[RequestOptions] = None) -> UsersResetTokenResponse:
24
+ """
25
+ Reset your access token or API key. When reset, any scripts or automations you have in place will need to be updated with the new key.
26
+
27
+ Parameters
28
+ ----------
29
+ request_options : typing.Optional[RequestOptions]
30
+ Request-specific configuration.
31
+
32
+ Returns
33
+ -------
34
+ UsersResetTokenResponse
35
+ User token response
36
+
37
+ Examples
38
+ --------
39
+ from label_studio_sdk.client import LabelStudio
40
+
41
+ client = LabelStudio(
42
+ api_key="YOUR_API_KEY",
43
+ )
44
+ client.users.reset_token()
45
+ """
46
+ _response = self._client_wrapper.httpx_client.request(
47
+ "api/current-user/reset-token/", method="POST", request_options=request_options
48
+ )
49
+ if 200 <= _response.status_code < 300:
50
+ return pydantic_v1.parse_obj_as(UsersResetTokenResponse, _response.json()) # type: ignore
51
+ try:
52
+ _response_json = _response.json()
53
+ except JSONDecodeError:
54
+ raise ApiError(status_code=_response.status_code, body=_response.text)
55
+ raise ApiError(status_code=_response.status_code, body=_response_json)
56
+
57
+ def get_token(self, *, request_options: typing.Optional[RequestOptions] = None) -> UsersGetTokenResponse:
58
+ """
59
+ Get a access token to authenticate to the API as the current user. To find this in the Label Studio interface, click **Account & Settings** in the upper right. For more information, see [Access Token](https://labelstud.io/guide/user_account#Access-token).
60
+
61
+ Parameters
62
+ ----------
63
+ request_options : typing.Optional[RequestOptions]
64
+ Request-specific configuration.
65
+
66
+ Returns
67
+ -------
68
+ UsersGetTokenResponse
69
+ User token response
70
+
71
+ Examples
72
+ --------
73
+ from label_studio_sdk.client import LabelStudio
74
+
75
+ client = LabelStudio(
76
+ api_key="YOUR_API_KEY",
77
+ )
78
+ client.users.get_token()
79
+ """
80
+ _response = self._client_wrapper.httpx_client.request(
81
+ "api/current-user/token", method="GET", request_options=request_options
82
+ )
83
+ if 200 <= _response.status_code < 300:
84
+ return pydantic_v1.parse_obj_as(UsersGetTokenResponse, _response.json()) # type: ignore
85
+ try:
86
+ _response_json = _response.json()
87
+ except JSONDecodeError:
88
+ raise ApiError(status_code=_response.status_code, body=_response.text)
89
+ raise ApiError(status_code=_response.status_code, body=_response_json)
90
+
91
+ def whoami(self, *, request_options: typing.Optional[RequestOptions] = None) -> BaseUser:
92
+ """
93
+ Get information about your user account, such as your username, email, and user ID.
94
+
95
+ Parameters
96
+ ----------
97
+ request_options : typing.Optional[RequestOptions]
98
+ Request-specific configuration.
99
+
100
+ Returns
101
+ -------
102
+ BaseUser
103
+
104
+
105
+ Examples
106
+ --------
107
+ from label_studio_sdk.client import LabelStudio
108
+
109
+ client = LabelStudio(
110
+ api_key="YOUR_API_KEY",
111
+ )
112
+ client.users.whoami()
113
+ """
114
+ _response = self._client_wrapper.httpx_client.request(
115
+ "api/current-user/whoami", method="GET", request_options=request_options
116
+ )
117
+ if 200 <= _response.status_code < 300:
118
+ return pydantic_v1.parse_obj_as(BaseUser, _response.json()) # type: ignore
119
+ try:
120
+ _response_json = _response.json()
121
+ except JSONDecodeError:
122
+ raise ApiError(status_code=_response.status_code, body=_response.text)
123
+ raise ApiError(status_code=_response.status_code, body=_response_json)
124
+
125
+ def list(self, *, request_options: typing.Optional[RequestOptions] = None) -> typing.List[BaseUser]:
126
+ """
127
+ List all users in your Label Studio organization.
128
+
129
+ Parameters
130
+ ----------
131
+ request_options : typing.Optional[RequestOptions]
132
+ Request-specific configuration.
133
+
134
+ Returns
135
+ -------
136
+ typing.List[BaseUser]
137
+
138
+
139
+ Examples
140
+ --------
141
+ from label_studio_sdk.client import LabelStudio
142
+
143
+ client = LabelStudio(
144
+ api_key="YOUR_API_KEY",
145
+ )
146
+ client.users.list()
147
+ """
148
+ _response = self._client_wrapper.httpx_client.request(
149
+ "api/users/", method="GET", request_options=request_options
150
+ )
151
+ if 200 <= _response.status_code < 300:
152
+ return pydantic_v1.parse_obj_as(typing.List[BaseUser], _response.json()) # type: ignore
153
+ try:
154
+ _response_json = _response.json()
155
+ except JSONDecodeError:
156
+ raise ApiError(status_code=_response.status_code, body=_response.text)
157
+ raise ApiError(status_code=_response.status_code, body=_response_json)
158
+
159
+ def create(
160
+ self,
161
+ *,
162
+ id: typing.Optional[int] = OMIT,
163
+ first_name: typing.Optional[str] = OMIT,
164
+ last_name: typing.Optional[str] = OMIT,
165
+ username: typing.Optional[str] = OMIT,
166
+ email: typing.Optional[str] = OMIT,
167
+ avatar: typing.Optional[str] = OMIT,
168
+ initials: typing.Optional[str] = OMIT,
169
+ phone: typing.Optional[str] = OMIT,
170
+ allow_newsletters: typing.Optional[bool] = OMIT,
171
+ request_options: typing.Optional[RequestOptions] = None,
172
+ ) -> BaseUser:
173
+ """
174
+ Create a user in Label Studio.
175
+
176
+ Parameters
177
+ ----------
178
+ id : typing.Optional[int]
179
+ User ID
180
+
181
+ first_name : typing.Optional[str]
182
+ First name of the user
183
+
184
+ last_name : typing.Optional[str]
185
+ Last name of the user
186
+
187
+ username : typing.Optional[str]
188
+ Username of the user
189
+
190
+ email : typing.Optional[str]
191
+ Email of the user
192
+
193
+ avatar : typing.Optional[str]
194
+ Avatar URL of the user
195
+
196
+ initials : typing.Optional[str]
197
+ Initials of the user
198
+
199
+ phone : typing.Optional[str]
200
+ Phone number of the user
201
+
202
+ allow_newsletters : typing.Optional[bool]
203
+ Whether the user allows newsletters
204
+
205
+ request_options : typing.Optional[RequestOptions]
206
+ Request-specific configuration.
207
+
208
+ Returns
209
+ -------
210
+ BaseUser
211
+
212
+
213
+ Examples
214
+ --------
215
+ from label_studio_sdk.client import LabelStudio
216
+
217
+ client = LabelStudio(
218
+ api_key="YOUR_API_KEY",
219
+ )
220
+ client.users.create()
221
+ """
222
+ _response = self._client_wrapper.httpx_client.request(
223
+ "api/users/",
224
+ method="POST",
225
+ json={
226
+ "id": id,
227
+ "first_name": first_name,
228
+ "last_name": last_name,
229
+ "username": username,
230
+ "email": email,
231
+ "avatar": avatar,
232
+ "initials": initials,
233
+ "phone": phone,
234
+ "allow_newsletters": allow_newsletters,
235
+ },
236
+ request_options=request_options,
237
+ omit=OMIT,
238
+ )
239
+ if 200 <= _response.status_code < 300:
240
+ return pydantic_v1.parse_obj_as(BaseUser, _response.json()) # type: ignore
241
+ try:
242
+ _response_json = _response.json()
243
+ except JSONDecodeError:
244
+ raise ApiError(status_code=_response.status_code, body=_response.text)
245
+ raise ApiError(status_code=_response.status_code, body=_response_json)
246
+
247
+ def get(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> BaseUser:
248
+ """
249
+ Get info about a specific Label Studio user.
250
+ You will need to provide their user ID. You can find a list of all user IDs using [List users](list).
251
+
252
+ Parameters
253
+ ----------
254
+ id : int
255
+ User ID
256
+
257
+ request_options : typing.Optional[RequestOptions]
258
+ Request-specific configuration.
259
+
260
+ Returns
261
+ -------
262
+ BaseUser
263
+
264
+
265
+ Examples
266
+ --------
267
+ from label_studio_sdk.client import LabelStudio
268
+
269
+ client = LabelStudio(
270
+ api_key="YOUR_API_KEY",
271
+ )
272
+ client.users.get(
273
+ id=1,
274
+ )
275
+ """
276
+ _response = self._client_wrapper.httpx_client.request(
277
+ f"api/users/{jsonable_encoder(id)}/", method="GET", request_options=request_options
278
+ )
279
+ if 200 <= _response.status_code < 300:
280
+ return pydantic_v1.parse_obj_as(BaseUser, _response.json()) # type: ignore
281
+ try:
282
+ _response_json = _response.json()
283
+ except JSONDecodeError:
284
+ raise ApiError(status_code=_response.status_code, body=_response.text)
285
+ raise ApiError(status_code=_response.status_code, body=_response_json)
286
+
287
+ def delete(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
288
+ """
289
+ Delete a specific Label Studio user.
290
+
291
+ You will need to provide their user ID. You can find a list of all user IDs using [List users](list).
292
+
293
+ <Warning>Use caution when deleting a user, as this can cause issues such as breaking the "Annotated by" filter or leaving orphaned records.</Warning>
294
+
295
+ Parameters
296
+ ----------
297
+ id : int
298
+ User ID
299
+
300
+ request_options : typing.Optional[RequestOptions]
301
+ Request-specific configuration.
302
+
303
+ Returns
304
+ -------
305
+ None
306
+
307
+ Examples
308
+ --------
309
+ from label_studio_sdk.client import LabelStudio
310
+
311
+ client = LabelStudio(
312
+ api_key="YOUR_API_KEY",
313
+ )
314
+ client.users.delete(
315
+ id=1,
316
+ )
317
+ """
318
+ _response = self._client_wrapper.httpx_client.request(
319
+ f"api/users/{jsonable_encoder(id)}/", method="DELETE", request_options=request_options
320
+ )
321
+ if 200 <= _response.status_code < 300:
322
+ return
323
+ try:
324
+ _response_json = _response.json()
325
+ except JSONDecodeError:
326
+ raise ApiError(status_code=_response.status_code, body=_response.text)
327
+ raise ApiError(status_code=_response.status_code, body=_response_json)
328
+
329
+ def update(
330
+ self,
331
+ id: int,
332
+ *,
333
+ users_update_request_id: typing.Optional[int] = OMIT,
334
+ first_name: typing.Optional[str] = OMIT,
335
+ last_name: typing.Optional[str] = OMIT,
336
+ username: typing.Optional[str] = OMIT,
337
+ email: typing.Optional[str] = OMIT,
338
+ avatar: typing.Optional[str] = OMIT,
339
+ initials: typing.Optional[str] = OMIT,
340
+ phone: typing.Optional[str] = OMIT,
341
+ allow_newsletters: typing.Optional[bool] = OMIT,
342
+ request_options: typing.Optional[RequestOptions] = None,
343
+ ) -> BaseUser:
344
+ """
345
+ Update details for a specific Label Studio user, such as their name or contact information.
346
+
347
+ You will need to provide their user ID. You can find a list of all user IDs using [List users](list).
348
+
349
+ Parameters
350
+ ----------
351
+ id : int
352
+ User ID
353
+
354
+ users_update_request_id : typing.Optional[int]
355
+ User ID
356
+
357
+ first_name : typing.Optional[str]
358
+ First name of the user
359
+
360
+ last_name : typing.Optional[str]
361
+ Last name of the user
362
+
363
+ username : typing.Optional[str]
364
+ Username of the user
365
+
366
+ email : typing.Optional[str]
367
+ Email of the user
368
+
369
+ avatar : typing.Optional[str]
370
+ Avatar URL of the user
371
+
372
+ initials : typing.Optional[str]
373
+ Initials of the user
374
+
375
+ phone : typing.Optional[str]
376
+ Phone number of the user
377
+
378
+ allow_newsletters : typing.Optional[bool]
379
+ Whether the user allows newsletters
380
+
381
+ request_options : typing.Optional[RequestOptions]
382
+ Request-specific configuration.
383
+
384
+ Returns
385
+ -------
386
+ BaseUser
387
+
388
+
389
+ Examples
390
+ --------
391
+ from label_studio_sdk.client import LabelStudio
392
+
393
+ client = LabelStudio(
394
+ api_key="YOUR_API_KEY",
395
+ )
396
+ client.users.update(
397
+ id=1,
398
+ )
399
+ """
400
+ _response = self._client_wrapper.httpx_client.request(
401
+ f"api/users/{jsonable_encoder(id)}/",
402
+ method="PATCH",
403
+ json={
404
+ "id": users_update_request_id,
405
+ "first_name": first_name,
406
+ "last_name": last_name,
407
+ "username": username,
408
+ "email": email,
409
+ "avatar": avatar,
410
+ "initials": initials,
411
+ "phone": phone,
412
+ "allow_newsletters": allow_newsletters,
413
+ },
414
+ request_options=request_options,
415
+ omit=OMIT,
416
+ )
417
+ if 200 <= _response.status_code < 300:
418
+ return pydantic_v1.parse_obj_as(BaseUser, _response.json()) # type: ignore
419
+ try:
420
+ _response_json = _response.json()
421
+ except JSONDecodeError:
422
+ raise ApiError(status_code=_response.status_code, body=_response.text)
423
+ raise ApiError(status_code=_response.status_code, body=_response_json)
424
+
425
+
426
+ class AsyncUsersClient:
427
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
428
+ self._client_wrapper = client_wrapper
429
+
430
+ async def reset_token(self, *, request_options: typing.Optional[RequestOptions] = None) -> UsersResetTokenResponse:
431
+ """
432
+ Reset your access token or API key. When reset, any scripts or automations you have in place will need to be updated with the new key.
433
+
434
+ Parameters
435
+ ----------
436
+ request_options : typing.Optional[RequestOptions]
437
+ Request-specific configuration.
438
+
439
+ Returns
440
+ -------
441
+ UsersResetTokenResponse
442
+ User token response
443
+
444
+ Examples
445
+ --------
446
+ from label_studio_sdk.client import AsyncLabelStudio
447
+
448
+ client = AsyncLabelStudio(
449
+ api_key="YOUR_API_KEY",
450
+ )
451
+ await client.users.reset_token()
452
+ """
453
+ _response = await self._client_wrapper.httpx_client.request(
454
+ "api/current-user/reset-token/", method="POST", request_options=request_options
455
+ )
456
+ if 200 <= _response.status_code < 300:
457
+ return pydantic_v1.parse_obj_as(UsersResetTokenResponse, _response.json()) # type: ignore
458
+ try:
459
+ _response_json = _response.json()
460
+ except JSONDecodeError:
461
+ raise ApiError(status_code=_response.status_code, body=_response.text)
462
+ raise ApiError(status_code=_response.status_code, body=_response_json)
463
+
464
+ async def get_token(self, *, request_options: typing.Optional[RequestOptions] = None) -> UsersGetTokenResponse:
465
+ """
466
+ Get a access token to authenticate to the API as the current user. To find this in the Label Studio interface, click **Account & Settings** in the upper right. For more information, see [Access Token](https://labelstud.io/guide/user_account#Access-token).
467
+
468
+ Parameters
469
+ ----------
470
+ request_options : typing.Optional[RequestOptions]
471
+ Request-specific configuration.
472
+
473
+ Returns
474
+ -------
475
+ UsersGetTokenResponse
476
+ User token response
477
+
478
+ Examples
479
+ --------
480
+ from label_studio_sdk.client import AsyncLabelStudio
481
+
482
+ client = AsyncLabelStudio(
483
+ api_key="YOUR_API_KEY",
484
+ )
485
+ await client.users.get_token()
486
+ """
487
+ _response = await self._client_wrapper.httpx_client.request(
488
+ "api/current-user/token", method="GET", request_options=request_options
489
+ )
490
+ if 200 <= _response.status_code < 300:
491
+ return pydantic_v1.parse_obj_as(UsersGetTokenResponse, _response.json()) # type: ignore
492
+ try:
493
+ _response_json = _response.json()
494
+ except JSONDecodeError:
495
+ raise ApiError(status_code=_response.status_code, body=_response.text)
496
+ raise ApiError(status_code=_response.status_code, body=_response_json)
497
+
498
+ async def whoami(self, *, request_options: typing.Optional[RequestOptions] = None) -> BaseUser:
499
+ """
500
+ Get information about your user account, such as your username, email, and user ID.
501
+
502
+ Parameters
503
+ ----------
504
+ request_options : typing.Optional[RequestOptions]
505
+ Request-specific configuration.
506
+
507
+ Returns
508
+ -------
509
+ BaseUser
510
+
511
+
512
+ Examples
513
+ --------
514
+ from label_studio_sdk.client import AsyncLabelStudio
515
+
516
+ client = AsyncLabelStudio(
517
+ api_key="YOUR_API_KEY",
518
+ )
519
+ await client.users.whoami()
520
+ """
521
+ _response = await self._client_wrapper.httpx_client.request(
522
+ "api/current-user/whoami", method="GET", request_options=request_options
523
+ )
524
+ if 200 <= _response.status_code < 300:
525
+ return pydantic_v1.parse_obj_as(BaseUser, _response.json()) # type: ignore
526
+ try:
527
+ _response_json = _response.json()
528
+ except JSONDecodeError:
529
+ raise ApiError(status_code=_response.status_code, body=_response.text)
530
+ raise ApiError(status_code=_response.status_code, body=_response_json)
531
+
532
+ async def list(self, *, request_options: typing.Optional[RequestOptions] = None) -> typing.List[BaseUser]:
533
+ """
534
+ List all users in your Label Studio organization.
535
+
536
+ Parameters
537
+ ----------
538
+ request_options : typing.Optional[RequestOptions]
539
+ Request-specific configuration.
540
+
541
+ Returns
542
+ -------
543
+ typing.List[BaseUser]
544
+
545
+
546
+ Examples
547
+ --------
548
+ from label_studio_sdk.client import AsyncLabelStudio
549
+
550
+ client = AsyncLabelStudio(
551
+ api_key="YOUR_API_KEY",
552
+ )
553
+ await client.users.list()
554
+ """
555
+ _response = await self._client_wrapper.httpx_client.request(
556
+ "api/users/", method="GET", request_options=request_options
557
+ )
558
+ if 200 <= _response.status_code < 300:
559
+ return pydantic_v1.parse_obj_as(typing.List[BaseUser], _response.json()) # type: ignore
560
+ try:
561
+ _response_json = _response.json()
562
+ except JSONDecodeError:
563
+ raise ApiError(status_code=_response.status_code, body=_response.text)
564
+ raise ApiError(status_code=_response.status_code, body=_response_json)
565
+
566
+ async def create(
567
+ self,
568
+ *,
569
+ id: typing.Optional[int] = OMIT,
570
+ first_name: typing.Optional[str] = OMIT,
571
+ last_name: typing.Optional[str] = OMIT,
572
+ username: typing.Optional[str] = OMIT,
573
+ email: typing.Optional[str] = OMIT,
574
+ avatar: typing.Optional[str] = OMIT,
575
+ initials: typing.Optional[str] = OMIT,
576
+ phone: typing.Optional[str] = OMIT,
577
+ allow_newsletters: typing.Optional[bool] = OMIT,
578
+ request_options: typing.Optional[RequestOptions] = None,
579
+ ) -> BaseUser:
580
+ """
581
+ Create a user in Label Studio.
582
+
583
+ Parameters
584
+ ----------
585
+ id : typing.Optional[int]
586
+ User ID
587
+
588
+ first_name : typing.Optional[str]
589
+ First name of the user
590
+
591
+ last_name : typing.Optional[str]
592
+ Last name of the user
593
+
594
+ username : typing.Optional[str]
595
+ Username of the user
596
+
597
+ email : typing.Optional[str]
598
+ Email of the user
599
+
600
+ avatar : typing.Optional[str]
601
+ Avatar URL of the user
602
+
603
+ initials : typing.Optional[str]
604
+ Initials of the user
605
+
606
+ phone : typing.Optional[str]
607
+ Phone number of the user
608
+
609
+ allow_newsletters : typing.Optional[bool]
610
+ Whether the user allows newsletters
611
+
612
+ request_options : typing.Optional[RequestOptions]
613
+ Request-specific configuration.
614
+
615
+ Returns
616
+ -------
617
+ BaseUser
618
+
619
+
620
+ Examples
621
+ --------
622
+ from label_studio_sdk.client import AsyncLabelStudio
623
+
624
+ client = AsyncLabelStudio(
625
+ api_key="YOUR_API_KEY",
626
+ )
627
+ await client.users.create()
628
+ """
629
+ _response = await self._client_wrapper.httpx_client.request(
630
+ "api/users/",
631
+ method="POST",
632
+ json={
633
+ "id": id,
634
+ "first_name": first_name,
635
+ "last_name": last_name,
636
+ "username": username,
637
+ "email": email,
638
+ "avatar": avatar,
639
+ "initials": initials,
640
+ "phone": phone,
641
+ "allow_newsletters": allow_newsletters,
642
+ },
643
+ request_options=request_options,
644
+ omit=OMIT,
645
+ )
646
+ if 200 <= _response.status_code < 300:
647
+ return pydantic_v1.parse_obj_as(BaseUser, _response.json()) # type: ignore
648
+ try:
649
+ _response_json = _response.json()
650
+ except JSONDecodeError:
651
+ raise ApiError(status_code=_response.status_code, body=_response.text)
652
+ raise ApiError(status_code=_response.status_code, body=_response_json)
653
+
654
+ async def get(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> BaseUser:
655
+ """
656
+ Get info about a specific Label Studio user.
657
+ You will need to provide their user ID. You can find a list of all user IDs using [List users](list).
658
+
659
+ Parameters
660
+ ----------
661
+ id : int
662
+ User ID
663
+
664
+ request_options : typing.Optional[RequestOptions]
665
+ Request-specific configuration.
666
+
667
+ Returns
668
+ -------
669
+ BaseUser
670
+
671
+
672
+ Examples
673
+ --------
674
+ from label_studio_sdk.client import AsyncLabelStudio
675
+
676
+ client = AsyncLabelStudio(
677
+ api_key="YOUR_API_KEY",
678
+ )
679
+ await client.users.get(
680
+ id=1,
681
+ )
682
+ """
683
+ _response = await self._client_wrapper.httpx_client.request(
684
+ f"api/users/{jsonable_encoder(id)}/", method="GET", request_options=request_options
685
+ )
686
+ if 200 <= _response.status_code < 300:
687
+ return pydantic_v1.parse_obj_as(BaseUser, _response.json()) # type: ignore
688
+ try:
689
+ _response_json = _response.json()
690
+ except JSONDecodeError:
691
+ raise ApiError(status_code=_response.status_code, body=_response.text)
692
+ raise ApiError(status_code=_response.status_code, body=_response_json)
693
+
694
+ async def delete(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
695
+ """
696
+ Delete a specific Label Studio user.
697
+
698
+ You will need to provide their user ID. You can find a list of all user IDs using [List users](list).
699
+
700
+ <Warning>Use caution when deleting a user, as this can cause issues such as breaking the "Annotated by" filter or leaving orphaned records.</Warning>
701
+
702
+ Parameters
703
+ ----------
704
+ id : int
705
+ User ID
706
+
707
+ request_options : typing.Optional[RequestOptions]
708
+ Request-specific configuration.
709
+
710
+ Returns
711
+ -------
712
+ None
713
+
714
+ Examples
715
+ --------
716
+ from label_studio_sdk.client import AsyncLabelStudio
717
+
718
+ client = AsyncLabelStudio(
719
+ api_key="YOUR_API_KEY",
720
+ )
721
+ await client.users.delete(
722
+ id=1,
723
+ )
724
+ """
725
+ _response = await self._client_wrapper.httpx_client.request(
726
+ f"api/users/{jsonable_encoder(id)}/", method="DELETE", request_options=request_options
727
+ )
728
+ if 200 <= _response.status_code < 300:
729
+ return
730
+ try:
731
+ _response_json = _response.json()
732
+ except JSONDecodeError:
733
+ raise ApiError(status_code=_response.status_code, body=_response.text)
734
+ raise ApiError(status_code=_response.status_code, body=_response_json)
735
+
736
+ async def update(
737
+ self,
738
+ id: int,
739
+ *,
740
+ users_update_request_id: typing.Optional[int] = OMIT,
741
+ first_name: typing.Optional[str] = OMIT,
742
+ last_name: typing.Optional[str] = OMIT,
743
+ username: typing.Optional[str] = OMIT,
744
+ email: typing.Optional[str] = OMIT,
745
+ avatar: typing.Optional[str] = OMIT,
746
+ initials: typing.Optional[str] = OMIT,
747
+ phone: typing.Optional[str] = OMIT,
748
+ allow_newsletters: typing.Optional[bool] = OMIT,
749
+ request_options: typing.Optional[RequestOptions] = None,
750
+ ) -> BaseUser:
751
+ """
752
+ Update details for a specific Label Studio user, such as their name or contact information.
753
+
754
+ You will need to provide their user ID. You can find a list of all user IDs using [List users](list).
755
+
756
+ Parameters
757
+ ----------
758
+ id : int
759
+ User ID
760
+
761
+ users_update_request_id : typing.Optional[int]
762
+ User ID
763
+
764
+ first_name : typing.Optional[str]
765
+ First name of the user
766
+
767
+ last_name : typing.Optional[str]
768
+ Last name of the user
769
+
770
+ username : typing.Optional[str]
771
+ Username of the user
772
+
773
+ email : typing.Optional[str]
774
+ Email of the user
775
+
776
+ avatar : typing.Optional[str]
777
+ Avatar URL of the user
778
+
779
+ initials : typing.Optional[str]
780
+ Initials of the user
781
+
782
+ phone : typing.Optional[str]
783
+ Phone number of the user
784
+
785
+ allow_newsletters : typing.Optional[bool]
786
+ Whether the user allows newsletters
787
+
788
+ request_options : typing.Optional[RequestOptions]
789
+ Request-specific configuration.
790
+
791
+ Returns
792
+ -------
793
+ BaseUser
794
+
795
+
796
+ Examples
797
+ --------
798
+ from label_studio_sdk.client import AsyncLabelStudio
799
+
800
+ client = AsyncLabelStudio(
801
+ api_key="YOUR_API_KEY",
802
+ )
803
+ await client.users.update(
804
+ id=1,
805
+ )
806
+ """
807
+ _response = await self._client_wrapper.httpx_client.request(
808
+ f"api/users/{jsonable_encoder(id)}/",
809
+ method="PATCH",
810
+ json={
811
+ "id": users_update_request_id,
812
+ "first_name": first_name,
813
+ "last_name": last_name,
814
+ "username": username,
815
+ "email": email,
816
+ "avatar": avatar,
817
+ "initials": initials,
818
+ "phone": phone,
819
+ "allow_newsletters": allow_newsletters,
820
+ },
821
+ request_options=request_options,
822
+ omit=OMIT,
823
+ )
824
+ if 200 <= _response.status_code < 300:
825
+ return pydantic_v1.parse_obj_as(BaseUser, _response.json()) # type: ignore
826
+ try:
827
+ _response_json = _response.json()
828
+ except JSONDecodeError:
829
+ raise ApiError(status_code=_response.status_code, body=_response.text)
830
+ raise ApiError(status_code=_response.status_code, body=_response_json)