label-studio-sdk 1.0.3__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.
- label_studio_sdk/__init__.py +10 -0
- label_studio_sdk/actions/client.py +8 -8
- label_studio_sdk/annotations/client.py +24 -24
- label_studio_sdk/base_client.py +3 -0
- label_studio_sdk/core/client_wrapper.py +1 -1
- label_studio_sdk/core/http_client.py +36 -8
- label_studio_sdk/core/request_options.py +2 -2
- label_studio_sdk/export_storage/__init__.py +2 -1
- label_studio_sdk/export_storage/azure/client.py +28 -28
- label_studio_sdk/export_storage/client.py +7 -4
- label_studio_sdk/export_storage/gcs/client.py +28 -28
- label_studio_sdk/export_storage/local/client.py +28 -28
- label_studio_sdk/export_storage/redis/client.py +28 -28
- label_studio_sdk/export_storage/s3/client.py +28 -28
- label_studio_sdk/export_storage/s3s/__init__.py +2 -0
- label_studio_sdk/export_storage/s3s/client.py +836 -0
- label_studio_sdk/files/client.py +24 -24
- label_studio_sdk/import_storage/__init__.py +2 -1
- label_studio_sdk/import_storage/azure/client.py +28 -28
- label_studio_sdk/import_storage/client.py +7 -4
- label_studio_sdk/import_storage/gcs/client.py +28 -28
- label_studio_sdk/import_storage/local/client.py +28 -28
- label_studio_sdk/import_storage/redis/client.py +28 -28
- label_studio_sdk/import_storage/s3/client.py +28 -28
- label_studio_sdk/import_storage/s3s/__init__.py +2 -0
- label_studio_sdk/import_storage/s3s/client.py +1054 -0
- label_studio_sdk/label_interface/base.py +2 -2
- label_studio_sdk/label_interface/control_tags.py +32 -18
- label_studio_sdk/label_interface/create.py +241 -0
- label_studio_sdk/label_interface/interface.py +68 -0
- label_studio_sdk/label_interface/object_tags.py +26 -10
- label_studio_sdk/label_interface/objects.py +5 -5
- label_studio_sdk/ml/client.py +36 -36
- label_studio_sdk/predictions/client.py +24 -24
- label_studio_sdk/projects/client.py +86 -56
- label_studio_sdk/projects/client_ext.py +16 -1
- label_studio_sdk/projects/exports/client.py +38 -38
- label_studio_sdk/tasks/client.py +70 -60
- label_studio_sdk/tasks/client_ext.py +4 -0
- label_studio_sdk/types/__init__.py +8 -0
- label_studio_sdk/types/s3s_export_storage.py +80 -0
- label_studio_sdk/types/s3s_import_storage.py +129 -0
- label_studio_sdk/types/s3s_import_storage_status.py +7 -0
- label_studio_sdk/types/workspace.py +77 -0
- label_studio_sdk/users/client.py +32 -32
- label_studio_sdk/views/client.py +24 -24
- label_studio_sdk/webhooks/client.py +24 -24
- label_studio_sdk/workspaces/__init__.py +6 -0
- label_studio_sdk/workspaces/client.py +569 -0
- label_studio_sdk/workspaces/members/__init__.py +5 -0
- label_studio_sdk/workspaces/members/client.py +297 -0
- label_studio_sdk/workspaces/members/types/__init__.py +6 -0
- label_studio_sdk/workspaces/members/types/members_create_response.py +32 -0
- label_studio_sdk/workspaces/members/types/members_list_response_item.py +32 -0
- {label_studio_sdk-1.0.3.dist-info → label_studio_sdk-1.0.4.dist-info}/METADATA +11 -12
- {label_studio_sdk-1.0.3.dist-info → label_studio_sdk-1.0.4.dist-info}/RECORD +57 -41
- {label_studio_sdk-1.0.3.dist-info → label_studio_sdk-1.0.4.dist-info}/WHEEL +0 -0
|
@@ -1,6 +1,18 @@
|
|
|
1
|
+
import typing
|
|
2
|
+
from typing_extensions import Annotated
|
|
1
3
|
from .client import ProjectsClient, AsyncProjectsClient
|
|
2
|
-
|
|
4
|
+
from pydantic import model_validator, validator, Field, ConfigDict
|
|
3
5
|
from label_studio_sdk._extensions.pager_ext import SyncPagerExt, AsyncPagerExt, T
|
|
6
|
+
from label_studio_sdk.types.project import Project
|
|
7
|
+
from label_studio_sdk.label_interface import LabelInterface
|
|
8
|
+
|
|
9
|
+
from ..core import RequestOptions
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ProjectExt(Project):
|
|
13
|
+
|
|
14
|
+
def get_label_interface(self):
|
|
15
|
+
return LabelInterface(self.label_config)
|
|
4
16
|
|
|
5
17
|
|
|
6
18
|
class ProjectsClientExt(ProjectsClient):
|
|
@@ -10,6 +22,9 @@ class ProjectsClientExt(ProjectsClient):
|
|
|
10
22
|
|
|
11
23
|
list.__doc__ = ProjectsClient.list.__doc__
|
|
12
24
|
|
|
25
|
+
def get(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> ProjectExt:
|
|
26
|
+
return ProjectExt(**dict(super().get(id, request_options=request_options)))
|
|
27
|
+
|
|
13
28
|
|
|
14
29
|
class AsyncProjectsClientExt(AsyncProjectsClient):
|
|
15
30
|
|
|
@@ -105,12 +105,12 @@ class ExportsClient:
|
|
|
105
105
|
},
|
|
106
106
|
request_options=request_options,
|
|
107
107
|
) as _response:
|
|
108
|
-
if 200 <= _response.status_code < 300:
|
|
109
|
-
for _chunk in _response.iter_bytes():
|
|
110
|
-
yield _chunk
|
|
111
|
-
return
|
|
112
|
-
_response.read()
|
|
113
108
|
try:
|
|
109
|
+
if 200 <= _response.status_code < 300:
|
|
110
|
+
for _chunk in _response.iter_bytes():
|
|
111
|
+
yield _chunk
|
|
112
|
+
return
|
|
113
|
+
_response.read()
|
|
114
114
|
_response_json = _response.json()
|
|
115
115
|
except JSONDecodeError:
|
|
116
116
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -149,9 +149,9 @@ class ExportsClient:
|
|
|
149
149
|
_response = self._client_wrapper.httpx_client.request(
|
|
150
150
|
f"api/projects/{jsonable_encoder(id)}/export/formats", method="GET", request_options=request_options
|
|
151
151
|
)
|
|
152
|
-
if 200 <= _response.status_code < 300:
|
|
153
|
-
return pydantic_v1.parse_obj_as(typing.List[str], _response.json()) # type: ignore
|
|
154
152
|
try:
|
|
153
|
+
if 200 <= _response.status_code < 300:
|
|
154
|
+
return pydantic_v1.parse_obj_as(typing.List[str], _response.json()) # type: ignore
|
|
155
155
|
_response_json = _response.json()
|
|
156
156
|
except JSONDecodeError:
|
|
157
157
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -190,9 +190,9 @@ class ExportsClient:
|
|
|
190
190
|
_response = self._client_wrapper.httpx_client.request(
|
|
191
191
|
f"api/projects/{jsonable_encoder(id)}/exports/", method="GET", request_options=request_options
|
|
192
192
|
)
|
|
193
|
-
if 200 <= _response.status_code < 300:
|
|
194
|
-
return pydantic_v1.parse_obj_as(typing.List[Export], _response.json()) # type: ignore
|
|
195
193
|
try:
|
|
194
|
+
if 200 <= _response.status_code < 300:
|
|
195
|
+
return pydantic_v1.parse_obj_as(typing.List[Export], _response.json()) # type: ignore
|
|
196
196
|
_response_json = _response.json()
|
|
197
197
|
except JSONDecodeError:
|
|
198
198
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -243,9 +243,9 @@ class ExportsClient:
|
|
|
243
243
|
request_options=request_options,
|
|
244
244
|
omit=OMIT,
|
|
245
245
|
)
|
|
246
|
-
if 200 <= _response.status_code < 300:
|
|
247
|
-
return pydantic_v1.parse_obj_as(ExportCreate, _response.json()) # type: ignore
|
|
248
246
|
try:
|
|
247
|
+
if 200 <= _response.status_code < 300:
|
|
248
|
+
return pydantic_v1.parse_obj_as(ExportCreate, _response.json()) # type: ignore
|
|
249
249
|
_response_json = _response.json()
|
|
250
250
|
except JSONDecodeError:
|
|
251
251
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -292,9 +292,9 @@ class ExportsClient:
|
|
|
292
292
|
method="GET",
|
|
293
293
|
request_options=request_options,
|
|
294
294
|
)
|
|
295
|
-
if 200 <= _response.status_code < 300:
|
|
296
|
-
return pydantic_v1.parse_obj_as(Export, _response.json()) # type: ignore
|
|
297
295
|
try:
|
|
296
|
+
if 200 <= _response.status_code < 300:
|
|
297
|
+
return pydantic_v1.parse_obj_as(Export, _response.json()) # type: ignore
|
|
298
298
|
_response_json = _response.json()
|
|
299
299
|
except JSONDecodeError:
|
|
300
300
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -338,9 +338,9 @@ class ExportsClient:
|
|
|
338
338
|
method="DELETE",
|
|
339
339
|
request_options=request_options,
|
|
340
340
|
)
|
|
341
|
-
if 200 <= _response.status_code < 300:
|
|
342
|
-
return
|
|
343
341
|
try:
|
|
342
|
+
if 200 <= _response.status_code < 300:
|
|
343
|
+
return
|
|
344
344
|
_response_json = _response.json()
|
|
345
345
|
except JSONDecodeError:
|
|
346
346
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -404,9 +404,9 @@ class ExportsClient:
|
|
|
404
404
|
request_options=request_options,
|
|
405
405
|
omit=OMIT,
|
|
406
406
|
)
|
|
407
|
-
if 200 <= _response.status_code < 300:
|
|
408
|
-
return pydantic_v1.parse_obj_as(ExportConvert, _response.json()) # type: ignore
|
|
409
407
|
try:
|
|
408
|
+
if 200 <= _response.status_code < 300:
|
|
409
|
+
return pydantic_v1.parse_obj_as(ExportConvert, _response.json()) # type: ignore
|
|
410
410
|
_response_json = _response.json()
|
|
411
411
|
except JSONDecodeError:
|
|
412
412
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -463,9 +463,9 @@ class ExportsClient:
|
|
|
463
463
|
params={"exportType": export_type},
|
|
464
464
|
request_options=request_options,
|
|
465
465
|
)
|
|
466
|
-
if 200 <= _response.status_code < 300:
|
|
467
|
-
return
|
|
468
466
|
try:
|
|
467
|
+
if 200 <= _response.status_code < 300:
|
|
468
|
+
return
|
|
469
469
|
_response_json = _response.json()
|
|
470
470
|
except JSONDecodeError:
|
|
471
471
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -561,12 +561,12 @@ class AsyncExportsClient:
|
|
|
561
561
|
},
|
|
562
562
|
request_options=request_options,
|
|
563
563
|
) as _response:
|
|
564
|
-
if 200 <= _response.status_code < 300:
|
|
565
|
-
async for _chunk in _response.aiter_bytes():
|
|
566
|
-
yield _chunk
|
|
567
|
-
return
|
|
568
|
-
await _response.aread()
|
|
569
564
|
try:
|
|
565
|
+
if 200 <= _response.status_code < 300:
|
|
566
|
+
async for _chunk in _response.aiter_bytes():
|
|
567
|
+
yield _chunk
|
|
568
|
+
return
|
|
569
|
+
await _response.aread()
|
|
570
570
|
_response_json = _response.json()
|
|
571
571
|
except JSONDecodeError:
|
|
572
572
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -607,9 +607,9 @@ class AsyncExportsClient:
|
|
|
607
607
|
_response = await self._client_wrapper.httpx_client.request(
|
|
608
608
|
f"api/projects/{jsonable_encoder(id)}/export/formats", method="GET", request_options=request_options
|
|
609
609
|
)
|
|
610
|
-
if 200 <= _response.status_code < 300:
|
|
611
|
-
return pydantic_v1.parse_obj_as(typing.List[str], _response.json()) # type: ignore
|
|
612
610
|
try:
|
|
611
|
+
if 200 <= _response.status_code < 300:
|
|
612
|
+
return pydantic_v1.parse_obj_as(typing.List[str], _response.json()) # type: ignore
|
|
613
613
|
_response_json = _response.json()
|
|
614
614
|
except JSONDecodeError:
|
|
615
615
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -648,9 +648,9 @@ class AsyncExportsClient:
|
|
|
648
648
|
_response = await self._client_wrapper.httpx_client.request(
|
|
649
649
|
f"api/projects/{jsonable_encoder(id)}/exports/", method="GET", request_options=request_options
|
|
650
650
|
)
|
|
651
|
-
if 200 <= _response.status_code < 300:
|
|
652
|
-
return pydantic_v1.parse_obj_as(typing.List[Export], _response.json()) # type: ignore
|
|
653
651
|
try:
|
|
652
|
+
if 200 <= _response.status_code < 300:
|
|
653
|
+
return pydantic_v1.parse_obj_as(typing.List[Export], _response.json()) # type: ignore
|
|
654
654
|
_response_json = _response.json()
|
|
655
655
|
except JSONDecodeError:
|
|
656
656
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -701,9 +701,9 @@ class AsyncExportsClient:
|
|
|
701
701
|
request_options=request_options,
|
|
702
702
|
omit=OMIT,
|
|
703
703
|
)
|
|
704
|
-
if 200 <= _response.status_code < 300:
|
|
705
|
-
return pydantic_v1.parse_obj_as(ExportCreate, _response.json()) # type: ignore
|
|
706
704
|
try:
|
|
705
|
+
if 200 <= _response.status_code < 300:
|
|
706
|
+
return pydantic_v1.parse_obj_as(ExportCreate, _response.json()) # type: ignore
|
|
707
707
|
_response_json = _response.json()
|
|
708
708
|
except JSONDecodeError:
|
|
709
709
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -750,9 +750,9 @@ class AsyncExportsClient:
|
|
|
750
750
|
method="GET",
|
|
751
751
|
request_options=request_options,
|
|
752
752
|
)
|
|
753
|
-
if 200 <= _response.status_code < 300:
|
|
754
|
-
return pydantic_v1.parse_obj_as(Export, _response.json()) # type: ignore
|
|
755
753
|
try:
|
|
754
|
+
if 200 <= _response.status_code < 300:
|
|
755
|
+
return pydantic_v1.parse_obj_as(Export, _response.json()) # type: ignore
|
|
756
756
|
_response_json = _response.json()
|
|
757
757
|
except JSONDecodeError:
|
|
758
758
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -796,9 +796,9 @@ class AsyncExportsClient:
|
|
|
796
796
|
method="DELETE",
|
|
797
797
|
request_options=request_options,
|
|
798
798
|
)
|
|
799
|
-
if 200 <= _response.status_code < 300:
|
|
800
|
-
return
|
|
801
799
|
try:
|
|
800
|
+
if 200 <= _response.status_code < 300:
|
|
801
|
+
return
|
|
802
802
|
_response_json = _response.json()
|
|
803
803
|
except JSONDecodeError:
|
|
804
804
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -862,9 +862,9 @@ class AsyncExportsClient:
|
|
|
862
862
|
request_options=request_options,
|
|
863
863
|
omit=OMIT,
|
|
864
864
|
)
|
|
865
|
-
if 200 <= _response.status_code < 300:
|
|
866
|
-
return pydantic_v1.parse_obj_as(ExportConvert, _response.json()) # type: ignore
|
|
867
865
|
try:
|
|
866
|
+
if 200 <= _response.status_code < 300:
|
|
867
|
+
return pydantic_v1.parse_obj_as(ExportConvert, _response.json()) # type: ignore
|
|
868
868
|
_response_json = _response.json()
|
|
869
869
|
except JSONDecodeError:
|
|
870
870
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -921,9 +921,9 @@ class AsyncExportsClient:
|
|
|
921
921
|
params={"exportType": export_type},
|
|
922
922
|
request_options=request_options,
|
|
923
923
|
)
|
|
924
|
-
if 200 <= _response.status_code < 300:
|
|
925
|
-
return
|
|
926
924
|
try:
|
|
925
|
+
if 200 <= _response.status_code < 300:
|
|
926
|
+
return
|
|
927
927
|
_response_json = _response.json()
|
|
928
928
|
except JSONDecodeError:
|
|
929
929
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
label_studio_sdk/tasks/client.py
CHANGED
|
@@ -68,9 +68,9 @@ class TasksClient:
|
|
|
68
68
|
method="GET",
|
|
69
69
|
request_options=request_options,
|
|
70
70
|
)
|
|
71
|
-
if 200 <= _response.status_code < 300:
|
|
72
|
-
return pydantic_v1.parse_obj_as(ProjectImport, _response.json()) # type: ignore
|
|
73
71
|
try:
|
|
72
|
+
if 200 <= _response.status_code < 300:
|
|
73
|
+
return pydantic_v1.parse_obj_as(ProjectImport, _response.json()) # type: ignore
|
|
74
74
|
_response_json = _response.json()
|
|
75
75
|
except JSONDecodeError:
|
|
76
76
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -108,9 +108,9 @@ class TasksClient:
|
|
|
108
108
|
_response = self._client_wrapper.httpx_client.request(
|
|
109
109
|
f"api/projects/{jsonable_encoder(id)}/tasks/", method="DELETE", request_options=request_options
|
|
110
110
|
)
|
|
111
|
-
if 200 <= _response.status_code < 300:
|
|
112
|
-
return
|
|
113
111
|
try:
|
|
112
|
+
if 200 <= _response.status_code < 300:
|
|
113
|
+
return
|
|
114
114
|
_response_json = _response.json()
|
|
115
115
|
except JSONDecodeError:
|
|
116
116
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -186,7 +186,12 @@ class TasksClient:
|
|
|
186
186
|
client = LabelStudio(
|
|
187
187
|
api_key="YOUR_API_KEY",
|
|
188
188
|
)
|
|
189
|
-
client.tasks.list()
|
|
189
|
+
response = client.tasks.list()
|
|
190
|
+
for item in response:
|
|
191
|
+
yield item
|
|
192
|
+
# alternatively, you can paginate page-by-page
|
|
193
|
+
for page in response.iter_pages():
|
|
194
|
+
yield page
|
|
190
195
|
"""
|
|
191
196
|
page = page or 1
|
|
192
197
|
_response = self._client_wrapper.httpx_client.request(
|
|
@@ -205,24 +210,24 @@ class TasksClient:
|
|
|
205
210
|
},
|
|
206
211
|
request_options=request_options,
|
|
207
212
|
)
|
|
208
|
-
if 200 <= _response.status_code < 300:
|
|
209
|
-
_parsed_response = pydantic_v1.parse_obj_as(TasksListResponse, _response.json()) # type: ignore
|
|
210
|
-
_has_next = True
|
|
211
|
-
_get_next = lambda: self.list(
|
|
212
|
-
page=page + 1,
|
|
213
|
-
page_size=page_size,
|
|
214
|
-
view=view,
|
|
215
|
-
project=project,
|
|
216
|
-
resolve_uri=resolve_uri,
|
|
217
|
-
fields=fields,
|
|
218
|
-
review=review,
|
|
219
|
-
include=include,
|
|
220
|
-
query=query,
|
|
221
|
-
request_options=request_options,
|
|
222
|
-
)
|
|
223
|
-
_items = _parsed_response.tasks
|
|
224
|
-
return SyncPager(has_next=_has_next, items=_items, get_next=_get_next)
|
|
225
213
|
try:
|
|
214
|
+
if 200 <= _response.status_code < 300:
|
|
215
|
+
_parsed_response = pydantic_v1.parse_obj_as(TasksListResponse, _response.json()) # type: ignore
|
|
216
|
+
_has_next = True
|
|
217
|
+
_get_next = lambda: self.list(
|
|
218
|
+
page=page + 1,
|
|
219
|
+
page_size=page_size,
|
|
220
|
+
view=view,
|
|
221
|
+
project=project,
|
|
222
|
+
resolve_uri=resolve_uri,
|
|
223
|
+
fields=fields,
|
|
224
|
+
review=review,
|
|
225
|
+
include=include,
|
|
226
|
+
query=query,
|
|
227
|
+
request_options=request_options,
|
|
228
|
+
)
|
|
229
|
+
_items = _parsed_response.tasks
|
|
230
|
+
return SyncPager(has_next=_has_next, items=_items, get_next=_get_next)
|
|
226
231
|
_response_json = _response.json()
|
|
227
232
|
except JSONDecodeError:
|
|
228
233
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -277,9 +282,9 @@ class TasksClient:
|
|
|
277
282
|
request_options=request_options,
|
|
278
283
|
omit=OMIT,
|
|
279
284
|
)
|
|
280
|
-
if 200 <= _response.status_code < 300:
|
|
281
|
-
return pydantic_v1.parse_obj_as(BaseTask, _response.json()) # type: ignore
|
|
282
285
|
try:
|
|
286
|
+
if 200 <= _response.status_code < 300:
|
|
287
|
+
return pydantic_v1.parse_obj_as(BaseTask, _response.json()) # type: ignore
|
|
283
288
|
_response_json = _response.json()
|
|
284
289
|
except JSONDecodeError:
|
|
285
290
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -317,9 +322,9 @@ class TasksClient:
|
|
|
317
322
|
_response = self._client_wrapper.httpx_client.request(
|
|
318
323
|
f"api/tasks/{jsonable_encoder(id)}/", method="GET", request_options=request_options
|
|
319
324
|
)
|
|
320
|
-
if 200 <= _response.status_code < 300:
|
|
321
|
-
return pydantic_v1.parse_obj_as(DataManagerTaskSerializer, _response.json()) # type: ignore
|
|
322
325
|
try:
|
|
326
|
+
if 200 <= _response.status_code < 300:
|
|
327
|
+
return pydantic_v1.parse_obj_as(DataManagerTaskSerializer, _response.json()) # type: ignore
|
|
323
328
|
_response_json = _response.json()
|
|
324
329
|
except JSONDecodeError:
|
|
325
330
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -359,9 +364,9 @@ class TasksClient:
|
|
|
359
364
|
_response = self._client_wrapper.httpx_client.request(
|
|
360
365
|
f"api/tasks/{jsonable_encoder(id)}/", method="DELETE", request_options=request_options
|
|
361
366
|
)
|
|
362
|
-
if 200 <= _response.status_code < 300:
|
|
363
|
-
return
|
|
364
367
|
try:
|
|
368
|
+
if 200 <= _response.status_code < 300:
|
|
369
|
+
return
|
|
365
370
|
_response_json = _response.json()
|
|
366
371
|
except JSONDecodeError:
|
|
367
372
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -419,9 +424,9 @@ class TasksClient:
|
|
|
419
424
|
request_options=request_options,
|
|
420
425
|
omit=OMIT,
|
|
421
426
|
)
|
|
422
|
-
if 200 <= _response.status_code < 300:
|
|
423
|
-
return pydantic_v1.parse_obj_as(BaseTask, _response.json()) # type: ignore
|
|
424
427
|
try:
|
|
428
|
+
if 200 <= _response.status_code < 300:
|
|
429
|
+
return pydantic_v1.parse_obj_as(BaseTask, _response.json()) # type: ignore
|
|
425
430
|
_response_json = _response.json()
|
|
426
431
|
except JSONDecodeError:
|
|
427
432
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -476,9 +481,9 @@ class AsyncTasksClient:
|
|
|
476
481
|
method="GET",
|
|
477
482
|
request_options=request_options,
|
|
478
483
|
)
|
|
479
|
-
if 200 <= _response.status_code < 300:
|
|
480
|
-
return pydantic_v1.parse_obj_as(ProjectImport, _response.json()) # type: ignore
|
|
481
484
|
try:
|
|
485
|
+
if 200 <= _response.status_code < 300:
|
|
486
|
+
return pydantic_v1.parse_obj_as(ProjectImport, _response.json()) # type: ignore
|
|
482
487
|
_response_json = _response.json()
|
|
483
488
|
except JSONDecodeError:
|
|
484
489
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -516,9 +521,9 @@ class AsyncTasksClient:
|
|
|
516
521
|
_response = await self._client_wrapper.httpx_client.request(
|
|
517
522
|
f"api/projects/{jsonable_encoder(id)}/tasks/", method="DELETE", request_options=request_options
|
|
518
523
|
)
|
|
519
|
-
if 200 <= _response.status_code < 300:
|
|
520
|
-
return
|
|
521
524
|
try:
|
|
525
|
+
if 200 <= _response.status_code < 300:
|
|
526
|
+
return
|
|
522
527
|
_response_json = _response.json()
|
|
523
528
|
except JSONDecodeError:
|
|
524
529
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -594,7 +599,12 @@ class AsyncTasksClient:
|
|
|
594
599
|
client = AsyncLabelStudio(
|
|
595
600
|
api_key="YOUR_API_KEY",
|
|
596
601
|
)
|
|
597
|
-
await client.tasks.list()
|
|
602
|
+
response = await client.tasks.list()
|
|
603
|
+
async for item in response:
|
|
604
|
+
yield item
|
|
605
|
+
# alternatively, you can paginate page-by-page
|
|
606
|
+
async for page in response.iter_pages():
|
|
607
|
+
yield page
|
|
598
608
|
"""
|
|
599
609
|
page = page or 1
|
|
600
610
|
_response = await self._client_wrapper.httpx_client.request(
|
|
@@ -613,24 +623,24 @@ class AsyncTasksClient:
|
|
|
613
623
|
},
|
|
614
624
|
request_options=request_options,
|
|
615
625
|
)
|
|
616
|
-
if 200 <= _response.status_code < 300:
|
|
617
|
-
_parsed_response = pydantic_v1.parse_obj_as(TasksListResponse, _response.json()) # type: ignore
|
|
618
|
-
_has_next = True
|
|
619
|
-
_get_next = lambda: self.list(
|
|
620
|
-
page=page + 1,
|
|
621
|
-
page_size=page_size,
|
|
622
|
-
view=view,
|
|
623
|
-
project=project,
|
|
624
|
-
resolve_uri=resolve_uri,
|
|
625
|
-
fields=fields,
|
|
626
|
-
review=review,
|
|
627
|
-
include=include,
|
|
628
|
-
query=query,
|
|
629
|
-
request_options=request_options,
|
|
630
|
-
)
|
|
631
|
-
_items = _parsed_response.tasks
|
|
632
|
-
return AsyncPager(has_next=_has_next, items=_items, get_next=_get_next)
|
|
633
626
|
try:
|
|
627
|
+
if 200 <= _response.status_code < 300:
|
|
628
|
+
_parsed_response = pydantic_v1.parse_obj_as(TasksListResponse, _response.json()) # type: ignore
|
|
629
|
+
_has_next = True
|
|
630
|
+
_get_next = lambda: self.list(
|
|
631
|
+
page=page + 1,
|
|
632
|
+
page_size=page_size,
|
|
633
|
+
view=view,
|
|
634
|
+
project=project,
|
|
635
|
+
resolve_uri=resolve_uri,
|
|
636
|
+
fields=fields,
|
|
637
|
+
review=review,
|
|
638
|
+
include=include,
|
|
639
|
+
query=query,
|
|
640
|
+
request_options=request_options,
|
|
641
|
+
)
|
|
642
|
+
_items = _parsed_response.tasks
|
|
643
|
+
return AsyncPager(has_next=_has_next, items=_items, get_next=_get_next)
|
|
634
644
|
_response_json = _response.json()
|
|
635
645
|
except JSONDecodeError:
|
|
636
646
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -685,9 +695,9 @@ class AsyncTasksClient:
|
|
|
685
695
|
request_options=request_options,
|
|
686
696
|
omit=OMIT,
|
|
687
697
|
)
|
|
688
|
-
if 200 <= _response.status_code < 300:
|
|
689
|
-
return pydantic_v1.parse_obj_as(BaseTask, _response.json()) # type: ignore
|
|
690
698
|
try:
|
|
699
|
+
if 200 <= _response.status_code < 300:
|
|
700
|
+
return pydantic_v1.parse_obj_as(BaseTask, _response.json()) # type: ignore
|
|
691
701
|
_response_json = _response.json()
|
|
692
702
|
except JSONDecodeError:
|
|
693
703
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -727,9 +737,9 @@ class AsyncTasksClient:
|
|
|
727
737
|
_response = await self._client_wrapper.httpx_client.request(
|
|
728
738
|
f"api/tasks/{jsonable_encoder(id)}/", method="GET", request_options=request_options
|
|
729
739
|
)
|
|
730
|
-
if 200 <= _response.status_code < 300:
|
|
731
|
-
return pydantic_v1.parse_obj_as(DataManagerTaskSerializer, _response.json()) # type: ignore
|
|
732
740
|
try:
|
|
741
|
+
if 200 <= _response.status_code < 300:
|
|
742
|
+
return pydantic_v1.parse_obj_as(DataManagerTaskSerializer, _response.json()) # type: ignore
|
|
733
743
|
_response_json = _response.json()
|
|
734
744
|
except JSONDecodeError:
|
|
735
745
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -769,9 +779,9 @@ class AsyncTasksClient:
|
|
|
769
779
|
_response = await self._client_wrapper.httpx_client.request(
|
|
770
780
|
f"api/tasks/{jsonable_encoder(id)}/", method="DELETE", request_options=request_options
|
|
771
781
|
)
|
|
772
|
-
if 200 <= _response.status_code < 300:
|
|
773
|
-
return
|
|
774
782
|
try:
|
|
783
|
+
if 200 <= _response.status_code < 300:
|
|
784
|
+
return
|
|
775
785
|
_response_json = _response.json()
|
|
776
786
|
except JSONDecodeError:
|
|
777
787
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -829,9 +839,9 @@ class AsyncTasksClient:
|
|
|
829
839
|
request_options=request_options,
|
|
830
840
|
omit=OMIT,
|
|
831
841
|
)
|
|
832
|
-
if 200 <= _response.status_code < 300:
|
|
833
|
-
return pydantic_v1.parse_obj_as(BaseTask, _response.json()) # type: ignore
|
|
834
842
|
try:
|
|
843
|
+
if 200 <= _response.status_code < 300:
|
|
844
|
+
return pydantic_v1.parse_obj_as(BaseTask, _response.json()) # type: ignore
|
|
835
845
|
_response_json = _response.json()
|
|
836
846
|
except JSONDecodeError:
|
|
837
847
|
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
@@ -5,6 +5,8 @@ from label_studio_sdk._extensions.pager_ext import SyncPagerExt, AsyncPagerExt,
|
|
|
5
5
|
class TasksClientExt(TasksClient):
|
|
6
6
|
|
|
7
7
|
def list(self, **kwargs) -> SyncPagerExt[T]:
|
|
8
|
+
# use `fields: all` by default and return the full data
|
|
9
|
+
kwargs['fields'] = kwargs.get('fields', 'all')
|
|
8
10
|
return SyncPagerExt.from_sync_pager(super().list(**kwargs))
|
|
9
11
|
|
|
10
12
|
list.__doc__ = TasksClient.list.__doc__
|
|
@@ -13,6 +15,8 @@ class TasksClientExt(TasksClient):
|
|
|
13
15
|
class AsyncTasksClientExt(AsyncTasksClient):
|
|
14
16
|
|
|
15
17
|
async def list(self, **kwargs):
|
|
18
|
+
# use `fields: all` by default and return the full data
|
|
19
|
+
kwargs['fields'] = kwargs.get('fields', 'all')
|
|
16
20
|
return await AsyncPagerExt.from_async_pager(await super().list(**kwargs))
|
|
17
21
|
|
|
18
22
|
list.__doc__ = AsyncTasksClient.list.__doc__
|
|
@@ -53,6 +53,9 @@ from .s3export_storage import S3ExportStorage
|
|
|
53
53
|
from .s3export_storage_status import S3ExportStorageStatus
|
|
54
54
|
from .s3import_storage import S3ImportStorage
|
|
55
55
|
from .s3import_storage_status import S3ImportStorageStatus
|
|
56
|
+
from .s3s_export_storage import S3SExportStorage
|
|
57
|
+
from .s3s_import_storage import S3SImportStorage
|
|
58
|
+
from .s3s_import_storage_status import S3SImportStorageStatus
|
|
56
59
|
from .serialization_option import SerializationOption
|
|
57
60
|
from .serialization_options import SerializationOptions
|
|
58
61
|
from .task import Task
|
|
@@ -64,6 +67,7 @@ from .webhook import Webhook
|
|
|
64
67
|
from .webhook_actions_item import WebhookActionsItem
|
|
65
68
|
from .webhook_serializer_for_update import WebhookSerializerForUpdate
|
|
66
69
|
from .webhook_serializer_for_update_actions_item import WebhookSerializerForUpdateActionsItem
|
|
70
|
+
from .workspace import Workspace
|
|
67
71
|
|
|
68
72
|
__all__ = [
|
|
69
73
|
"Annotation",
|
|
@@ -119,6 +123,9 @@ __all__ = [
|
|
|
119
123
|
"S3ExportStorageStatus",
|
|
120
124
|
"S3ImportStorage",
|
|
121
125
|
"S3ImportStorageStatus",
|
|
126
|
+
"S3SExportStorage",
|
|
127
|
+
"S3SImportStorage",
|
|
128
|
+
"S3SImportStorageStatus",
|
|
122
129
|
"SerializationOption",
|
|
123
130
|
"SerializationOptions",
|
|
124
131
|
"Task",
|
|
@@ -130,4 +137,5 @@ __all__ = [
|
|
|
130
137
|
"WebhookActionsItem",
|
|
131
138
|
"WebhookSerializerForUpdate",
|
|
132
139
|
"WebhookSerializerForUpdateActionsItem",
|
|
140
|
+
"Workspace",
|
|
133
141
|
]
|
|
@@ -0,0 +1,80 @@
|
|
|
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 S3SExportStorage(pydantic_v1.BaseModel):
|
|
11
|
+
id: typing.Optional[int] = None
|
|
12
|
+
title: typing.Optional[str] = pydantic_v1.Field(default=None)
|
|
13
|
+
"""
|
|
14
|
+
Cloud storage title
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
description: typing.Optional[str] = pydantic_v1.Field(default=None)
|
|
18
|
+
"""
|
|
19
|
+
Cloud storage description
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
created_at: typing.Optional[dt.datetime] = pydantic_v1.Field(default=None)
|
|
23
|
+
"""
|
|
24
|
+
Creation time
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
bucket: typing.Optional[str] = pydantic_v1.Field(default=None)
|
|
28
|
+
"""
|
|
29
|
+
S3 bucket name
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
prefix: typing.Optional[str] = pydantic_v1.Field(default=None)
|
|
33
|
+
"""
|
|
34
|
+
S3 bucket prefix
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
external_id: typing.Optional[str] = pydantic_v1.Field(default=None)
|
|
38
|
+
"""
|
|
39
|
+
AWS External ID
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
role_arn: typing.Optional[str] = pydantic_v1.Field(default=None)
|
|
43
|
+
"""
|
|
44
|
+
AWS Role ARN
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
region_name: typing.Optional[str] = pydantic_v1.Field(default=None)
|
|
48
|
+
"""
|
|
49
|
+
AWS Region
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
s3endpoint: typing.Optional[str] = pydantic_v1.Field(alias="s3_endpoint", default=None)
|
|
53
|
+
"""
|
|
54
|
+
S3 Endpoint
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
project: int = pydantic_v1.Field()
|
|
58
|
+
"""
|
|
59
|
+
A unique integer value identifying this project.
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
def json(self, **kwargs: typing.Any) -> str:
|
|
63
|
+
kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
|
|
64
|
+
return super().json(**kwargs_with_defaults)
|
|
65
|
+
|
|
66
|
+
def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
|
|
67
|
+
kwargs_with_defaults_exclude_unset: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
|
|
68
|
+
kwargs_with_defaults_exclude_none: typing.Any = {"by_alias": True, "exclude_none": True, **kwargs}
|
|
69
|
+
|
|
70
|
+
return deep_union_pydantic_dicts(
|
|
71
|
+
super().dict(**kwargs_with_defaults_exclude_unset), super().dict(**kwargs_with_defaults_exclude_none)
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
class Config:
|
|
75
|
+
frozen = True
|
|
76
|
+
smart_union = True
|
|
77
|
+
allow_population_by_field_name = True
|
|
78
|
+
populate_by_name = True
|
|
79
|
+
extra = pydantic_v1.Extra.allow
|
|
80
|
+
json_encoders = {dt.datetime: serialize_datetime}
|