label-studio-sdk 1.0.2__py3-none-any.whl → 1.0.4__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 (67) hide show
  1. label_studio_sdk/__init__.py +20 -1
  2. label_studio_sdk/actions/client.py +8 -8
  3. label_studio_sdk/annotations/client.py +24 -24
  4. label_studio_sdk/base_client.py +3 -0
  5. label_studio_sdk/core/client_wrapper.py +1 -1
  6. label_studio_sdk/core/http_client.py +36 -8
  7. label_studio_sdk/core/request_options.py +2 -2
  8. label_studio_sdk/export_storage/__init__.py +2 -1
  9. label_studio_sdk/export_storage/azure/client.py +28 -28
  10. label_studio_sdk/export_storage/client.py +7 -4
  11. label_studio_sdk/export_storage/gcs/client.py +28 -28
  12. label_studio_sdk/export_storage/local/client.py +28 -28
  13. label_studio_sdk/export_storage/redis/client.py +28 -28
  14. label_studio_sdk/export_storage/s3/client.py +28 -28
  15. label_studio_sdk/export_storage/s3s/__init__.py +2 -0
  16. label_studio_sdk/export_storage/s3s/client.py +836 -0
  17. label_studio_sdk/files/client.py +24 -24
  18. label_studio_sdk/import_storage/__init__.py +2 -1
  19. label_studio_sdk/import_storage/azure/client.py +28 -28
  20. label_studio_sdk/import_storage/client.py +7 -4
  21. label_studio_sdk/import_storage/gcs/client.py +28 -28
  22. label_studio_sdk/import_storage/local/client.py +28 -28
  23. label_studio_sdk/import_storage/redis/client.py +28 -28
  24. label_studio_sdk/import_storage/s3/client.py +28 -28
  25. label_studio_sdk/import_storage/s3s/__init__.py +2 -0
  26. label_studio_sdk/import_storage/s3s/client.py +1054 -0
  27. label_studio_sdk/label_interface/base.py +2 -2
  28. label_studio_sdk/label_interface/control_tags.py +32 -18
  29. label_studio_sdk/label_interface/create.py +241 -0
  30. label_studio_sdk/label_interface/interface.py +68 -0
  31. label_studio_sdk/label_interface/object_tags.py +26 -10
  32. label_studio_sdk/label_interface/objects.py +5 -5
  33. label_studio_sdk/ml/client.py +36 -36
  34. label_studio_sdk/predictions/client.py +24 -24
  35. label_studio_sdk/projects/__init__.py +8 -2
  36. label_studio_sdk/projects/client.py +232 -69
  37. label_studio_sdk/projects/client_ext.py +16 -1
  38. label_studio_sdk/projects/exports/client.py +38 -38
  39. label_studio_sdk/projects/types/__init__.py +2 -1
  40. label_studio_sdk/projects/types/projects_update_response.py +96 -0
  41. label_studio_sdk/tasks/client.py +70 -60
  42. label_studio_sdk/tasks/client_ext.py +4 -0
  43. label_studio_sdk/types/__init__.py +16 -0
  44. label_studio_sdk/types/base_task.py +4 -2
  45. label_studio_sdk/types/base_task_file_upload.py +5 -0
  46. label_studio_sdk/types/base_task_updated_by.py +5 -0
  47. label_studio_sdk/types/data_manager_task_serializer.py +3 -2
  48. label_studio_sdk/types/data_manager_task_serializer_annotators_item.py +5 -0
  49. label_studio_sdk/types/s3s_export_storage.py +80 -0
  50. label_studio_sdk/types/s3s_import_storage.py +129 -0
  51. label_studio_sdk/types/s3s_import_storage_status.py +7 -0
  52. label_studio_sdk/types/task.py +3 -2
  53. label_studio_sdk/types/task_annotators_item.py +5 -0
  54. label_studio_sdk/types/workspace.py +77 -0
  55. label_studio_sdk/users/client.py +32 -32
  56. label_studio_sdk/views/client.py +24 -24
  57. label_studio_sdk/webhooks/client.py +24 -24
  58. label_studio_sdk/workspaces/__init__.py +6 -0
  59. label_studio_sdk/workspaces/client.py +569 -0
  60. label_studio_sdk/workspaces/members/__init__.py +5 -0
  61. label_studio_sdk/workspaces/members/client.py +297 -0
  62. label_studio_sdk/workspaces/members/types/__init__.py +6 -0
  63. label_studio_sdk/workspaces/members/types/members_create_response.py +32 -0
  64. label_studio_sdk/workspaces/members/types/members_list_response_item.py +32 -0
  65. {label_studio_sdk-1.0.2.dist-info → label_studio_sdk-1.0.4.dist-info}/METADATA +11 -12
  66. {label_studio_sdk-1.0.2.dist-info → label_studio_sdk-1.0.4.dist-info}/RECORD +67 -46
  67. {label_studio_sdk-1.0.2.dist-info → label_studio_sdk-1.0.4.dist-info}/WHEEL +0 -0
@@ -0,0 +1,297 @@
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.members_create_response import MembersCreateResponse
12
+ from .types.members_list_response_item import MembersListResponseItem
13
+
14
+ # this is used as the default value for optional parameters
15
+ OMIT = typing.cast(typing.Any, ...)
16
+
17
+
18
+ class MembersClient:
19
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
20
+ self._client_wrapper = client_wrapper
21
+
22
+ def list(
23
+ self, id: int, *, request_options: typing.Optional[RequestOptions] = None
24
+ ) -> typing.List[MembersListResponseItem]:
25
+ """
26
+ List all workspace memberships for a specific workspace. You will need to provide the workspace ID. You can find this using [List workspaces](list).
27
+
28
+ Parameters
29
+ ----------
30
+ id : int
31
+ Workspace ID
32
+
33
+ request_options : typing.Optional[RequestOptions]
34
+ Request-specific configuration.
35
+
36
+ Returns
37
+ -------
38
+ typing.List[MembersListResponseItem]
39
+
40
+
41
+ Examples
42
+ --------
43
+ from label_studio_sdk.client import LabelStudio
44
+
45
+ client = LabelStudio(
46
+ api_key="YOUR_API_KEY",
47
+ )
48
+ client.workspaces.members.list(
49
+ id=1,
50
+ )
51
+ """
52
+ _response = self._client_wrapper.httpx_client.request(
53
+ f"api/workspaces/{jsonable_encoder(id)}/memberships", method="GET", request_options=request_options
54
+ )
55
+ try:
56
+ if 200 <= _response.status_code < 300:
57
+ return pydantic_v1.parse_obj_as(typing.List[MembersListResponseItem], _response.json()) # type: ignore
58
+ _response_json = _response.json()
59
+ except JSONDecodeError:
60
+ raise ApiError(status_code=_response.status_code, body=_response.text)
61
+ raise ApiError(status_code=_response.status_code, body=_response_json)
62
+
63
+ def create(
64
+ self, id: int, *, user: typing.Optional[int] = OMIT, request_options: typing.Optional[RequestOptions] = None
65
+ ) -> MembersCreateResponse:
66
+ """
67
+ Create a new workspace membership. You will need to provide the workspace ID. You can find this using [List workspaces](list).
68
+
69
+ Parameters
70
+ ----------
71
+ id : int
72
+ Workspace ID
73
+
74
+ user : typing.Optional[int]
75
+ User ID of the workspace member
76
+
77
+ request_options : typing.Optional[RequestOptions]
78
+ Request-specific configuration.
79
+
80
+ Returns
81
+ -------
82
+ MembersCreateResponse
83
+
84
+
85
+ Examples
86
+ --------
87
+ from label_studio_sdk.client import LabelStudio
88
+
89
+ client = LabelStudio(
90
+ api_key="YOUR_API_KEY",
91
+ )
92
+ client.workspaces.members.create(
93
+ id=1,
94
+ )
95
+ """
96
+ _response = self._client_wrapper.httpx_client.request(
97
+ f"api/workspaces/{jsonable_encoder(id)}/memberships",
98
+ method="POST",
99
+ json={"user": user},
100
+ request_options=request_options,
101
+ omit=OMIT,
102
+ )
103
+ try:
104
+ if 200 <= _response.status_code < 300:
105
+ return pydantic_v1.parse_obj_as(MembersCreateResponse, _response.json()) # type: ignore
106
+ _response_json = _response.json()
107
+ except JSONDecodeError:
108
+ raise ApiError(status_code=_response.status_code, body=_response.text)
109
+ raise ApiError(status_code=_response.status_code, body=_response_json)
110
+
111
+ def delete(
112
+ self, id: int, *, user: typing.Optional[int] = OMIT, request_options: typing.Optional[RequestOptions] = None
113
+ ) -> None:
114
+ """
115
+ Delete a specific workspace membership. You will need to provide the workspace ID and the user ID. You can find this using [List workspace memberships](list).
116
+
117
+ Parameters
118
+ ----------
119
+ id : int
120
+ Workspace ID
121
+
122
+ user : typing.Optional[int]
123
+ User ID of the workspace member
124
+
125
+ request_options : typing.Optional[RequestOptions]
126
+ Request-specific configuration.
127
+
128
+ Returns
129
+ -------
130
+ None
131
+
132
+ Examples
133
+ --------
134
+ from label_studio_sdk.client import LabelStudio
135
+
136
+ client = LabelStudio(
137
+ api_key="YOUR_API_KEY",
138
+ )
139
+ client.workspaces.members.delete(
140
+ id=1,
141
+ )
142
+ """
143
+ _response = self._client_wrapper.httpx_client.request(
144
+ f"api/workspaces/{jsonable_encoder(id)}/memberships",
145
+ method="DELETE",
146
+ json={"user": user},
147
+ request_options=request_options,
148
+ omit=OMIT,
149
+ )
150
+ try:
151
+ if 200 <= _response.status_code < 300:
152
+ return
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
+
159
+ class AsyncMembersClient:
160
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
161
+ self._client_wrapper = client_wrapper
162
+
163
+ async def list(
164
+ self, id: int, *, request_options: typing.Optional[RequestOptions] = None
165
+ ) -> typing.List[MembersListResponseItem]:
166
+ """
167
+ List all workspace memberships for a specific workspace. You will need to provide the workspace ID. You can find this using [List workspaces](list).
168
+
169
+ Parameters
170
+ ----------
171
+ id : int
172
+ Workspace ID
173
+
174
+ request_options : typing.Optional[RequestOptions]
175
+ Request-specific configuration.
176
+
177
+ Returns
178
+ -------
179
+ typing.List[MembersListResponseItem]
180
+
181
+
182
+ Examples
183
+ --------
184
+ from label_studio_sdk.client import AsyncLabelStudio
185
+
186
+ client = AsyncLabelStudio(
187
+ api_key="YOUR_API_KEY",
188
+ )
189
+ await client.workspaces.members.list(
190
+ id=1,
191
+ )
192
+ """
193
+ _response = await self._client_wrapper.httpx_client.request(
194
+ f"api/workspaces/{jsonable_encoder(id)}/memberships", method="GET", request_options=request_options
195
+ )
196
+ try:
197
+ if 200 <= _response.status_code < 300:
198
+ return pydantic_v1.parse_obj_as(typing.List[MembersListResponseItem], _response.json()) # type: ignore
199
+ _response_json = _response.json()
200
+ except JSONDecodeError:
201
+ raise ApiError(status_code=_response.status_code, body=_response.text)
202
+ raise ApiError(status_code=_response.status_code, body=_response_json)
203
+
204
+ async def create(
205
+ self, id: int, *, user: typing.Optional[int] = OMIT, request_options: typing.Optional[RequestOptions] = None
206
+ ) -> MembersCreateResponse:
207
+ """
208
+ Create a new workspace membership. You will need to provide the workspace ID. You can find this using [List workspaces](list).
209
+
210
+ Parameters
211
+ ----------
212
+ id : int
213
+ Workspace ID
214
+
215
+ user : typing.Optional[int]
216
+ User ID of the workspace member
217
+
218
+ request_options : typing.Optional[RequestOptions]
219
+ Request-specific configuration.
220
+
221
+ Returns
222
+ -------
223
+ MembersCreateResponse
224
+
225
+
226
+ Examples
227
+ --------
228
+ from label_studio_sdk.client import AsyncLabelStudio
229
+
230
+ client = AsyncLabelStudio(
231
+ api_key="YOUR_API_KEY",
232
+ )
233
+ await client.workspaces.members.create(
234
+ id=1,
235
+ )
236
+ """
237
+ _response = await self._client_wrapper.httpx_client.request(
238
+ f"api/workspaces/{jsonable_encoder(id)}/memberships",
239
+ method="POST",
240
+ json={"user": user},
241
+ request_options=request_options,
242
+ omit=OMIT,
243
+ )
244
+ try:
245
+ if 200 <= _response.status_code < 300:
246
+ return pydantic_v1.parse_obj_as(MembersCreateResponse, _response.json()) # type: ignore
247
+ _response_json = _response.json()
248
+ except JSONDecodeError:
249
+ raise ApiError(status_code=_response.status_code, body=_response.text)
250
+ raise ApiError(status_code=_response.status_code, body=_response_json)
251
+
252
+ async def delete(
253
+ self, id: int, *, user: typing.Optional[int] = OMIT, request_options: typing.Optional[RequestOptions] = None
254
+ ) -> None:
255
+ """
256
+ Delete a specific workspace membership. You will need to provide the workspace ID and the user ID. You can find this using [List workspace memberships](list).
257
+
258
+ Parameters
259
+ ----------
260
+ id : int
261
+ Workspace ID
262
+
263
+ user : typing.Optional[int]
264
+ User ID of the workspace member
265
+
266
+ request_options : typing.Optional[RequestOptions]
267
+ Request-specific configuration.
268
+
269
+ Returns
270
+ -------
271
+ None
272
+
273
+ Examples
274
+ --------
275
+ from label_studio_sdk.client import AsyncLabelStudio
276
+
277
+ client = AsyncLabelStudio(
278
+ api_key="YOUR_API_KEY",
279
+ )
280
+ await client.workspaces.members.delete(
281
+ id=1,
282
+ )
283
+ """
284
+ _response = await self._client_wrapper.httpx_client.request(
285
+ f"api/workspaces/{jsonable_encoder(id)}/memberships",
286
+ method="DELETE",
287
+ json={"user": user},
288
+ request_options=request_options,
289
+ omit=OMIT,
290
+ )
291
+ try:
292
+ if 200 <= _response.status_code < 300:
293
+ return
294
+ _response_json = _response.json()
295
+ except JSONDecodeError:
296
+ raise ApiError(status_code=_response.status_code, body=_response.text)
297
+ raise ApiError(status_code=_response.status_code, body=_response_json)
@@ -0,0 +1,6 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from .members_create_response import MembersCreateResponse
4
+ from .members_list_response_item import MembersListResponseItem
5
+
6
+ __all__ = ["MembersCreateResponse", "MembersListResponseItem"]
@@ -0,0 +1,32 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import datetime as dt
4
+ import typing
5
+
6
+ from ....core.datetime_utils import serialize_datetime
7
+ from ....core.pydantic_utilities import deep_union_pydantic_dicts, pydantic_v1
8
+
9
+
10
+ class MembersCreateResponse(pydantic_v1.BaseModel):
11
+ user: typing.Optional[int] = pydantic_v1.Field(default=None)
12
+ """
13
+ User ID of the workspace member
14
+ """
15
+
16
+ def json(self, **kwargs: typing.Any) -> str:
17
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
18
+ return super().json(**kwargs_with_defaults)
19
+
20
+ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
21
+ kwargs_with_defaults_exclude_unset: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
22
+ kwargs_with_defaults_exclude_none: typing.Any = {"by_alias": True, "exclude_none": True, **kwargs}
23
+
24
+ return deep_union_pydantic_dicts(
25
+ super().dict(**kwargs_with_defaults_exclude_unset), super().dict(**kwargs_with_defaults_exclude_none)
26
+ )
27
+
28
+ class Config:
29
+ frozen = True
30
+ smart_union = True
31
+ extra = pydantic_v1.Extra.allow
32
+ json_encoders = {dt.datetime: serialize_datetime}
@@ -0,0 +1,32 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import datetime as dt
4
+ import typing
5
+
6
+ from ....core.datetime_utils import serialize_datetime
7
+ from ....core.pydantic_utilities import deep_union_pydantic_dicts, pydantic_v1
8
+
9
+
10
+ class MembersListResponseItem(pydantic_v1.BaseModel):
11
+ user: typing.Optional[typing.Dict[str, typing.Any]] = pydantic_v1.Field(default=None)
12
+ """
13
+ User ID of the workspace member
14
+ """
15
+
16
+ def json(self, **kwargs: typing.Any) -> str:
17
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
18
+ return super().json(**kwargs_with_defaults)
19
+
20
+ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
21
+ kwargs_with_defaults_exclude_unset: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
22
+ kwargs_with_defaults_exclude_none: typing.Any = {"by_alias": True, "exclude_none": True, **kwargs}
23
+
24
+ return deep_union_pydantic_dicts(
25
+ super().dict(**kwargs_with_defaults_exclude_unset), super().dict(**kwargs_with_defaults_exclude_none)
26
+ )
27
+
28
+ class Config:
29
+ frozen = True
30
+ smart_union = True
31
+ extra = pydantic_v1.Extra.allow
32
+ json_encoders = {dt.datetime: serialize_datetime}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: label-studio-sdk
3
- Version: 1.0.2
3
+ Version: 1.0.4
4
4
  Summary:
5
5
  Requires-Python: >=3.8,<4.0
6
6
  Classifier: Intended Audience :: Developers
@@ -47,12 +47,13 @@ Description-Content-Type: text/markdown
47
47
  > ```sh
48
48
  > git clone https://github.com/HumanSignal/label-studio-sdk.git
49
49
  > cd label-studio-sdk
50
- > git checkout previous-version
50
+ > git fetch origin
51
+ > git checkout release/0.0.34
51
52
  > ```
52
53
  >
53
54
  > OR you can change your import statements as follows:
54
55
  > ```python
55
- > from label_studio_sdk import Client
56
+ > from label_studio_sdk._legacy import Client
56
57
  > from label_studio_sdk.data_manager import Filters, Column, Operator, Type
57
58
  > from label_studio_sdk._legacy import Project
58
59
  > ```
@@ -97,18 +98,16 @@ Check more examples [here](https://api.labelstud.io/).
97
98
  ## Create a new project
98
99
 
99
100
  ```python
101
+ from label_studio_sdk.label_interface import LabelInterface
102
+ from label_studio_sdk.label_interface.create import labels
103
+
100
104
  project = ls.projects.create(
101
105
  name="Project name",
102
106
  description="Project description",
103
- label_config="""
104
- <View>
105
- <Image name="image" value="$image" />
106
- <RectangleLabels name="label" toName="image">
107
- <Label value="cat" />
108
- <Label value="dog" />
109
- </RectangleLabels>
110
- </View>
111
- """
107
+ label_config=LabelInterface.create({
108
+ "image": "Image",
109
+ "bbox": labels(["cat", "dog"], tag_type="RectangleLabels")
110
+ })
112
111
  )
113
112
  ```
114
113