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
@@ -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)
@@ -3,5 +3,6 @@
3
3
  from .projects_create_response import ProjectsCreateResponse
4
4
  from .projects_import_tasks_response import ProjectsImportTasksResponse
5
5
  from .projects_list_response import ProjectsListResponse
6
+ from .projects_update_response import ProjectsUpdateResponse
6
7
 
7
- __all__ = ["ProjectsCreateResponse", "ProjectsImportTasksResponse", "ProjectsListResponse"]
8
+ __all__ = ["ProjectsCreateResponse", "ProjectsImportTasksResponse", "ProjectsListResponse", "ProjectsUpdateResponse"]
@@ -0,0 +1,96 @@
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 ProjectsUpdateResponse(pydantic_v1.BaseModel):
11
+ """
12
+ Project
13
+ """
14
+
15
+ title: typing.Optional[str] = pydantic_v1.Field(default=None)
16
+ """
17
+ Project title
18
+ """
19
+
20
+ description: typing.Optional[str] = pydantic_v1.Field(default=None)
21
+ """
22
+ Project description
23
+ """
24
+
25
+ label_config: typing.Optional[str] = pydantic_v1.Field(default=None)
26
+ """
27
+ Label config in XML format
28
+ """
29
+
30
+ expert_instruction: typing.Optional[str] = pydantic_v1.Field(default=None)
31
+ """
32
+ Labeling instructions to show to the user
33
+ """
34
+
35
+ show_instruction: typing.Optional[bool] = pydantic_v1.Field(default=None)
36
+ """
37
+ Show labeling instructions
38
+ """
39
+
40
+ show_skip_button: typing.Optional[bool] = pydantic_v1.Field(default=None)
41
+ """
42
+ Show skip button
43
+ """
44
+
45
+ enable_empty_annotation: typing.Optional[bool] = pydantic_v1.Field(default=None)
46
+ """
47
+ Allow empty annotations
48
+ """
49
+
50
+ show_annotation_history: typing.Optional[bool] = pydantic_v1.Field(default=None)
51
+ """
52
+ Show annotation history
53
+ """
54
+
55
+ reveal_preannotations_interactively: typing.Optional[bool] = pydantic_v1.Field(default=None)
56
+ """
57
+ Reveal preannotations interactively. If set to True, predictions will be shown to the user only after selecting the area of interest
58
+ """
59
+
60
+ show_collab_predictions: typing.Optional[bool] = pydantic_v1.Field(default=None)
61
+ """
62
+ Show predictions to annotators
63
+ """
64
+
65
+ maximum_annotations: typing.Optional[int] = pydantic_v1.Field(default=None)
66
+ """
67
+ Maximum annotations per task
68
+ """
69
+
70
+ color: typing.Optional[str] = pydantic_v1.Field(default=None)
71
+ """
72
+ Project color in HEX format
73
+ """
74
+
75
+ control_weights: typing.Optional[typing.Dict[str, typing.Any]] = pydantic_v1.Field(default=None)
76
+ """
77
+ Dict of weights for each control tag in metric calculation. Each control tag (e.g. label or choice) will have its own key in control weight dict with weight for each label and overall weight. For example, if a bounding box annotation with a control tag named my_bbox should be included with 0.33 weight in agreement calculation, and the first label Car should be twice as important as Airplane, then you need to specify: {'my_bbox': {'type': 'RectangleLabels', 'labels': {'Car': 1.0, 'Airplane': 0.5}, 'overall': 0.33}
78
+ """
79
+
80
+ def json(self, **kwargs: typing.Any) -> str:
81
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
82
+ return super().json(**kwargs_with_defaults)
83
+
84
+ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
85
+ kwargs_with_defaults_exclude_unset: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
86
+ kwargs_with_defaults_exclude_none: typing.Any = {"by_alias": True, "exclude_none": True, **kwargs}
87
+
88
+ return deep_union_pydantic_dicts(
89
+ super().dict(**kwargs_with_defaults_exclude_unset), super().dict(**kwargs_with_defaults_exclude_none)
90
+ )
91
+
92
+ class Config:
93
+ frozen = True
94
+ smart_union = True
95
+ extra = pydantic_v1.Extra.allow
96
+ json_encoders = {dt.datetime: serialize_datetime}
@@ -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__
@@ -10,10 +10,13 @@ from .azure_blob_export_storage_status import AzureBlobExportStorageStatus
10
10
  from .azure_blob_import_storage import AzureBlobImportStorage
11
11
  from .azure_blob_import_storage_status import AzureBlobImportStorageStatus
12
12
  from .base_task import BaseTask
13
+ from .base_task_file_upload import BaseTaskFileUpload
14
+ from .base_task_updated_by import BaseTaskUpdatedBy
13
15
  from .base_user import BaseUser
14
16
  from .converted_format import ConvertedFormat
15
17
  from .converted_format_status import ConvertedFormatStatus
16
18
  from .data_manager_task_serializer import DataManagerTaskSerializer
19
+ from .data_manager_task_serializer_annotators_item import DataManagerTaskSerializerAnnotatorsItem
17
20
  from .data_manager_task_serializer_drafts_item import DataManagerTaskSerializerDraftsItem
18
21
  from .data_manager_task_serializer_predictions_item import DataManagerTaskSerializerPredictionsItem
19
22
  from .export import Export
@@ -50,9 +53,13 @@ from .s3export_storage import S3ExportStorage
50
53
  from .s3export_storage_status import S3ExportStorageStatus
51
54
  from .s3import_storage import S3ImportStorage
52
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
53
59
  from .serialization_option import SerializationOption
54
60
  from .serialization_options import SerializationOptions
55
61
  from .task import Task
62
+ from .task_annotators_item import TaskAnnotatorsItem
56
63
  from .task_filter_options import TaskFilterOptions
57
64
  from .user_simple import UserSimple
58
65
  from .view import View
@@ -60,6 +67,7 @@ from .webhook import Webhook
60
67
  from .webhook_actions_item import WebhookActionsItem
61
68
  from .webhook_serializer_for_update import WebhookSerializerForUpdate
62
69
  from .webhook_serializer_for_update_actions_item import WebhookSerializerForUpdateActionsItem
70
+ from .workspace import Workspace
63
71
 
64
72
  __all__ = [
65
73
  "Annotation",
@@ -72,10 +80,13 @@ __all__ = [
72
80
  "AzureBlobImportStorage",
73
81
  "AzureBlobImportStorageStatus",
74
82
  "BaseTask",
83
+ "BaseTaskFileUpload",
84
+ "BaseTaskUpdatedBy",
75
85
  "BaseUser",
76
86
  "ConvertedFormat",
77
87
  "ConvertedFormatStatus",
78
88
  "DataManagerTaskSerializer",
89
+ "DataManagerTaskSerializerAnnotatorsItem",
79
90
  "DataManagerTaskSerializerDraftsItem",
80
91
  "DataManagerTaskSerializerPredictionsItem",
81
92
  "Export",
@@ -112,9 +123,13 @@ __all__ = [
112
123
  "S3ExportStorageStatus",
113
124
  "S3ImportStorage",
114
125
  "S3ImportStorageStatus",
126
+ "S3SExportStorage",
127
+ "S3SImportStorage",
128
+ "S3SImportStorageStatus",
115
129
  "SerializationOption",
116
130
  "SerializationOptions",
117
131
  "Task",
132
+ "TaskAnnotatorsItem",
118
133
  "TaskFilterOptions",
119
134
  "UserSimple",
120
135
  "View",
@@ -122,4 +137,5 @@ __all__ = [
122
137
  "WebhookActionsItem",
123
138
  "WebhookSerializerForUpdate",
124
139
  "WebhookSerializerForUpdateActionsItem",
140
+ "Workspace",
125
141
  ]
@@ -5,6 +5,8 @@ import typing
5
5
 
6
6
  from ..core.datetime_utils import serialize_datetime
7
7
  from ..core.pydantic_utilities import deep_union_pydantic_dicts, pydantic_v1
8
+ from .base_task_file_upload import BaseTaskFileUpload
9
+ from .base_task_updated_by import BaseTaskUpdatedBy
8
10
 
9
11
 
10
12
  class BaseTask(pydantic_v1.BaseModel):
@@ -79,12 +81,12 @@ class BaseTask(pydantic_v1.BaseModel):
79
81
  Project ID for this task
80
82
  """
81
83
 
82
- updated_by: typing.Optional[int] = pydantic_v1.Field(default=None)
84
+ updated_by: typing.Optional[BaseTaskUpdatedBy] = pydantic_v1.Field(default=None)
83
85
  """
84
86
  Last annotator or reviewer who updated this task
85
87
  """
86
88
 
87
- file_upload: typing.Optional[int] = pydantic_v1.Field(default=None)
89
+ file_upload: typing.Optional[BaseTaskFileUpload] = pydantic_v1.Field(default=None)
88
90
  """
89
91
  Uploaded file used as data source for this task
90
92
  """
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ BaseTaskFileUpload = typing.Union[typing.Optional[str], typing.Optional[int]]
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ BaseTaskUpdatedBy = typing.Union[typing.Optional[int], typing.Optional[typing.List[typing.Dict[str, typing.Any]]]]