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.

Files changed (57) hide show
  1. label_studio_sdk/__init__.py +10 -0
  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/client.py +86 -56
  36. label_studio_sdk/projects/client_ext.py +16 -1
  37. label_studio_sdk/projects/exports/client.py +38 -38
  38. label_studio_sdk/tasks/client.py +70 -60
  39. label_studio_sdk/tasks/client_ext.py +4 -0
  40. label_studio_sdk/types/__init__.py +8 -0
  41. label_studio_sdk/types/s3s_export_storage.py +80 -0
  42. label_studio_sdk/types/s3s_import_storage.py +129 -0
  43. label_studio_sdk/types/s3s_import_storage_status.py +7 -0
  44. label_studio_sdk/types/workspace.py +77 -0
  45. label_studio_sdk/users/client.py +32 -32
  46. label_studio_sdk/views/client.py +24 -24
  47. label_studio_sdk/webhooks/client.py +24 -24
  48. label_studio_sdk/workspaces/__init__.py +6 -0
  49. label_studio_sdk/workspaces/client.py +569 -0
  50. label_studio_sdk/workspaces/members/__init__.py +5 -0
  51. label_studio_sdk/workspaces/members/client.py +297 -0
  52. label_studio_sdk/workspaces/members/types/__init__.py +6 -0
  53. label_studio_sdk/workspaces/members/types/members_create_response.py +32 -0
  54. label_studio_sdk/workspaces/members/types/members_list_response_item.py +32 -0
  55. {label_studio_sdk-1.0.3.dist-info → label_studio_sdk-1.0.4.dist-info}/METADATA +11 -12
  56. {label_studio_sdk-1.0.3.dist-info → label_studio_sdk-1.0.4.dist-info}/RECORD +57 -41
  57. {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)
@@ -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}