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