label-studio-sdk 2.0.1__py3-none-any.whl → 2.0.3__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 +20 -0
- label_studio_sdk/actions/client.py +13 -13
- label_studio_sdk/actions/types/actions_list_response_item.py +3 -3
- label_studio_sdk/actions/types/actions_list_response_item_dialog.py +2 -2
- label_studio_sdk/annotations/client.py +441 -441
- label_studio_sdk/base_client.py +4 -0
- label_studio_sdk/comments/client.py +176 -176
- label_studio_sdk/export_storage/azure/client.py +274 -274
- label_studio_sdk/export_storage/gcs/client.py +263 -263
- label_studio_sdk/export_storage/local/client.py +206 -206
- label_studio_sdk/export_storage/redis/client.py +287 -287
- label_studio_sdk/export_storage/s3/client.py +347 -347
- label_studio_sdk/export_storage/s3s/client.py +678 -678
- label_studio_sdk/import_storage/azure/client.py +357 -357
- label_studio_sdk/import_storage/gcs/client.py +357 -357
- label_studio_sdk/import_storage/local/client.py +206 -206
- label_studio_sdk/import_storage/redis/client.py +309 -309
- label_studio_sdk/import_storage/s3/client.py +452 -452
- label_studio_sdk/import_storage/s3s/client.py +735 -735
- label_studio_sdk/jwt_settings/client.py +10 -10
- label_studio_sdk/ml/client.py +118 -118
- label_studio_sdk/ml/types/ml_list_model_versions_response.py +1 -1
- label_studio_sdk/model_providers/client.py +181 -181
- label_studio_sdk/organizations/members/client.py +8 -8
- label_studio_sdk/predictions/client.py +60 -60
- label_studio_sdk/projects/__init__.py +33 -1
- label_studio_sdk/projects/assignments/__init__.py +35 -0
- label_studio_sdk/projects/assignments/client.py +801 -0
- label_studio_sdk/projects/assignments/types/__init__.py +37 -0
- label_studio_sdk/projects/assignments/types/assignments_assign_request_type.py +5 -0
- label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_filters.py +33 -0
- label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_filters_conjunction.py +5 -0
- label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_filters_items_item.py +44 -0
- label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_filters_items_item_filter.py +31 -0
- label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_filters_items_item_operator.py +23 -0
- label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_filters_items_item_value.py +7 -0
- label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_selected_items.py +9 -0
- label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_selected_items_excluded.py +29 -0
- label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_selected_items_included.py +29 -0
- label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_type.py +5 -0
- label_studio_sdk/projects/assignments/types/assignments_bulk_assign_response.py +22 -0
- label_studio_sdk/projects/assignments/types/assignments_delete_request_type.py +5 -0
- label_studio_sdk/projects/assignments/types/assignments_update_request_type.py +5 -0
- label_studio_sdk/projects/client.py +445 -425
- label_studio_sdk/projects/exports/client.py +55 -55
- label_studio_sdk/projects/exports/types/exports_convert_response.py +1 -1
- label_studio_sdk/projects/members/__init__.py +2 -0
- label_studio_sdk/projects/members/client.py +137 -0
- label_studio_sdk/projects/stats/types/stats_iaa_response.py +5 -5
- label_studio_sdk/projects/types/projects_import_tasks_response.py +12 -12
- label_studio_sdk/prompts/client.py +211 -211
- label_studio_sdk/prompts/runs/client.py +33 -33
- label_studio_sdk/prompts/versions/client.py +72 -72
- label_studio_sdk/sso/__init__.py +5 -0
- label_studio_sdk/sso/client.py +22 -0
- label_studio_sdk/sso/saml/__init__.py +2 -0
- label_studio_sdk/sso/saml/client.py +278 -0
- label_studio_sdk/sso/scim/__init__.py +2 -0
- label_studio_sdk/sso/scim/client.py +278 -0
- label_studio_sdk/tasks/client.py +174 -174
- label_studio_sdk/types/__init__.py +18 -0
- label_studio_sdk/types/all_roles_project_list.py +94 -94
- label_studio_sdk/types/annotation.py +35 -35
- label_studio_sdk/types/annotation_request.py +27 -27
- label_studio_sdk/types/azure_blob_export_storage.py +29 -29
- label_studio_sdk/types/azure_blob_import_storage.py +33 -33
- label_studio_sdk/types/batch_failed_predictions.py +1 -1
- label_studio_sdk/types/billing_checks.py +14 -14
- label_studio_sdk/types/billing_flags.py +16 -16
- label_studio_sdk/types/blueprint_list.py +7 -8
- label_studio_sdk/types/child_filter.py +11 -10
- label_studio_sdk/types/comment.py +15 -15
- label_studio_sdk/types/comment_request.py +7 -8
- label_studio_sdk/types/comment_serializer_with_expanded_user.py +17 -18
- label_studio_sdk/types/converted_format.py +1 -1
- label_studio_sdk/types/converted_format_request.py +1 -1
- label_studio_sdk/types/export.py +8 -8
- label_studio_sdk/types/file_upload.py +3 -2
- label_studio_sdk/types/filter.py +10 -9
- label_studio_sdk/types/filter_group.py +4 -3
- label_studio_sdk/types/gcs_export_storage.py +23 -23
- label_studio_sdk/types/gcs_import_storage.py +27 -27
- label_studio_sdk/types/import_api_request.py +26 -26
- label_studio_sdk/types/inference_run_cost_estimate.py +10 -10
- label_studio_sdk/types/local_files_export_storage.py +23 -23
- label_studio_sdk/types/local_files_import_storage.py +26 -26
- label_studio_sdk/types/lse_annotation_filter_options.py +10 -10
- label_studio_sdk/types/lse_annotation_filter_options_request.py +10 -10
- label_studio_sdk/types/lse_export_create.py +12 -12
- label_studio_sdk/types/lse_fields.py +14 -14
- label_studio_sdk/types/lse_organization.py +17 -17
- label_studio_sdk/types/lse_organization_member_list.py +1 -1
- label_studio_sdk/types/lse_project_create.py +72 -72
- label_studio_sdk/types/lse_project_update.py +89 -89
- label_studio_sdk/types/lse_s3export_storage.py +46 -46
- label_studio_sdk/types/lse_s3export_storage_request.py +43 -43
- label_studio_sdk/types/lse_s3import_storage.py +53 -53
- label_studio_sdk/types/lse_s3import_storage_request.py +49 -49
- label_studio_sdk/types/lse_task.py +49 -49
- label_studio_sdk/types/lse_task_drafts_item.py +1 -1
- label_studio_sdk/types/lse_task_filter_options.py +14 -14
- label_studio_sdk/types/lse_task_filter_options_request.py +14 -14
- label_studio_sdk/types/lse_task_predictions_item.py +5 -5
- label_studio_sdk/types/lse_task_serializer_for_annotators.py +12 -12
- label_studio_sdk/types/lse_task_serializer_for_annotators_drafts_item.py +1 -1
- label_studio_sdk/types/lse_task_serializer_for_annotators_predictions_item.py +5 -5
- label_studio_sdk/types/lse_task_serializer_for_reviewers.py +49 -49
- label_studio_sdk/types/lse_task_serializer_for_reviewers_drafts_item.py +1 -1
- label_studio_sdk/types/lse_task_serializer_for_reviewers_predictions_item.py +5 -5
- label_studio_sdk/types/lse_user.py +13 -13
- label_studio_sdk/types/lse_user_api.py +11 -11
- label_studio_sdk/types/lse_user_organization_member_list.py +13 -13
- label_studio_sdk/types/lseapi_token_create.py +1 -1
- label_studio_sdk/types/lseapi_token_list.py +1 -1
- label_studio_sdk/types/lsejwt_settings.py +5 -5
- label_studio_sdk/types/ml_backend.py +27 -28
- label_studio_sdk/types/model_interface.py +12 -12
- label_studio_sdk/types/model_interface_request.py +7 -8
- label_studio_sdk/types/model_interface_serializer_get.py +13 -13
- label_studio_sdk/types/model_provider_connection.py +34 -34
- label_studio_sdk/types/model_provider_connection_request.py +15 -14
- label_studio_sdk/types/model_run.py +12 -12
- label_studio_sdk/types/organization_billing.py +1 -1
- label_studio_sdk/types/organization_id.py +2 -2
- label_studio_sdk/types/organization_invite.py +1 -1
- label_studio_sdk/types/organization_member.py +8 -9
- label_studio_sdk/types/organization_membership.py +2 -1
- label_studio_sdk/types/pause.py +23 -23
- label_studio_sdk/types/prediction.py +21 -21
- label_studio_sdk/types/prediction_request.py +16 -16
- label_studio_sdk/types/project.py +72 -72
- label_studio_sdk/types/project_group.py +22 -0
- label_studio_sdk/types/project_group_request.py +22 -0
- label_studio_sdk/types/project_group_role_enum.py +5 -0
- label_studio_sdk/types/project_import.py +21 -21
- label_studio_sdk/types/redis_export_storage.py +34 -34
- label_studio_sdk/types/redis_import_storage.py +37 -37
- label_studio_sdk/types/refined_prompt_response.py +11 -11
- label_studio_sdk/types/review_settings.py +29 -30
- label_studio_sdk/types/review_settings_request.py +29 -30
- label_studio_sdk/types/s3export_storage.py +45 -45
- label_studio_sdk/types/s3import_storage.py +44 -44
- label_studio_sdk/types/saml_settings.py +21 -0
- label_studio_sdk/types/saml_settings_update.py +22 -0
- label_studio_sdk/types/scim_settings.py +21 -0
- label_studio_sdk/types/scim_settings_update.py +22 -0
- label_studio_sdk/types/selected_items_request.py +1 -1
- label_studio_sdk/types/serialization_options.py +10 -10
- label_studio_sdk/types/serialization_options_request.py +10 -10
- label_studio_sdk/types/task_assignment.py +43 -0
- label_studio_sdk/types/third_party_model_version.py +11 -11
- label_studio_sdk/types/third_party_model_version_request.py +6 -7
- label_studio_sdk/types/type_enum.py +5 -0
- label_studio_sdk/types/user_simple.py +3 -3
- label_studio_sdk/types/user_simple_request.py +1 -1
- label_studio_sdk/types/version_response.py +19 -20
- label_studio_sdk/types/view.py +8 -8
- label_studio_sdk/types/webhook.py +16 -16
- label_studio_sdk/types/webhook_serializer_for_update.py +16 -16
- label_studio_sdk/types/workspace.py +10 -11
- label_studio_sdk/users/client.py +160 -160
- label_studio_sdk/views/client.py +164 -164
- label_studio_sdk/webhooks/client.py +183 -183
- label_studio_sdk/webhooks/types/webhooks_info_response.py +32 -32
- label_studio_sdk/webhooks/types/webhooks_info_response_annotation_created.py +1 -1
- label_studio_sdk/webhooks/types/webhooks_info_response_annotation_updated.py +1 -1
- label_studio_sdk/webhooks/types/webhooks_info_response_annotations_created.py +1 -1
- label_studio_sdk/webhooks/types/webhooks_info_response_annotations_deleted.py +1 -1
- label_studio_sdk/webhooks/types/webhooks_info_response_label_link_created.py +1 -1
- label_studio_sdk/webhooks/types/webhooks_info_response_label_link_deleted.py +1 -1
- label_studio_sdk/webhooks/types/webhooks_info_response_label_link_updated.py +1 -1
- label_studio_sdk/webhooks/types/webhooks_info_response_project_created.py +1 -1
- label_studio_sdk/webhooks/types/webhooks_info_response_project_deleted.py +1 -1
- label_studio_sdk/webhooks/types/webhooks_info_response_project_updated.py +1 -1
- label_studio_sdk/webhooks/types/webhooks_info_response_review_created.py +1 -1
- label_studio_sdk/webhooks/types/webhooks_info_response_review_updated.py +1 -1
- label_studio_sdk/webhooks/types/webhooks_info_response_reviews_deleted.py +1 -1
- label_studio_sdk/webhooks/types/webhooks_info_response_tasks_created.py +1 -1
- label_studio_sdk/webhooks/types/webhooks_info_response_tasks_deleted.py +1 -1
- label_studio_sdk/workspaces/client.py +40 -40
- {label_studio_sdk-2.0.1.dist-info → label_studio_sdk-2.0.3.dist-info}/METADATA +1 -1
- {label_studio_sdk-2.0.1.dist-info → label_studio_sdk-2.0.3.dist-info}/RECORD +184 -150
- {label_studio_sdk-2.0.1.dist-info → label_studio_sdk-2.0.3.dist-info}/LICENSE +0 -0
- {label_studio_sdk-2.0.1.dist-info → label_studio_sdk-2.0.3.dist-info}/WHEEL +0 -0
|
@@ -8,14 +8,14 @@ import pydantic
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class LseTaskPredictionsItem(UncheckedBaseModel):
|
|
11
|
-
|
|
12
|
-
score: typing.Optional[float] = None
|
|
13
|
-
model_version: typing.Optional[str] = None
|
|
11
|
+
created_at: typing.Optional[dt.datetime] = None
|
|
14
12
|
model: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = None
|
|
15
13
|
model_run: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = None
|
|
16
|
-
|
|
14
|
+
model_version: typing.Optional[str] = None
|
|
17
15
|
project: typing.Optional[int] = None
|
|
18
|
-
|
|
16
|
+
result: typing.Optional[typing.List[typing.Dict[str, typing.Optional[typing.Any]]]] = None
|
|
17
|
+
score: typing.Optional[float] = None
|
|
18
|
+
task: typing.Optional[int] = None
|
|
19
19
|
updated_at: typing.Optional[dt.datetime] = None
|
|
20
20
|
|
|
21
21
|
if IS_PYDANTIC_V2:
|
|
@@ -14,35 +14,35 @@ class LseTaskSerializerForAnnotators(UncheckedBaseModel):
|
|
|
14
14
|
Task Serializer with project scheme configs validation
|
|
15
15
|
"""
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
annotations: str
|
|
18
|
+
annotations_results: str
|
|
19
|
+
cancelled_annotations: typing.Optional[int] = None
|
|
20
|
+
comment_count: str
|
|
21
|
+
comments: str
|
|
19
22
|
created_at: dt.datetime = pydantic.Field()
|
|
20
23
|
"""
|
|
21
24
|
Time a task was created
|
|
22
25
|
"""
|
|
23
26
|
|
|
24
|
-
|
|
27
|
+
data: typing.Optional[typing.Any] = None
|
|
28
|
+
draft_exists: typing.Optional[bool] = None
|
|
25
29
|
drafts: typing.List[LseTaskSerializerForAnnotatorsDraftsItem] = pydantic.Field()
|
|
26
30
|
"""
|
|
27
31
|
Drafts for this task
|
|
28
32
|
"""
|
|
29
33
|
|
|
30
|
-
|
|
31
|
-
cancelled_annotations: typing.Optional[int] = None
|
|
32
|
-
annotations_results: str
|
|
34
|
+
id: int
|
|
33
35
|
predictions: typing.List[LseTaskSerializerForAnnotatorsPredictionsItem] = pydantic.Field()
|
|
34
36
|
"""
|
|
35
37
|
Predictions for this task
|
|
36
38
|
"""
|
|
37
39
|
|
|
38
|
-
total_predictions: typing.Optional[int] = None
|
|
39
|
-
predictions_score: typing.Optional[float] = None
|
|
40
40
|
predictions_results: str
|
|
41
|
-
|
|
42
|
-
comment_count: str
|
|
43
|
-
unresolved_comment_count: str
|
|
41
|
+
predictions_score: typing.Optional[float] = None
|
|
44
42
|
reviews_rejected: typing.Optional[int] = None
|
|
45
|
-
|
|
43
|
+
total_annotations: typing.Optional[int] = None
|
|
44
|
+
total_predictions: typing.Optional[int] = None
|
|
45
|
+
unresolved_comment_count: str
|
|
46
46
|
|
|
47
47
|
if IS_PYDANTIC_V2:
|
|
48
48
|
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|
|
@@ -8,8 +8,8 @@ import pydantic
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class LseTaskSerializerForAnnotatorsDraftsItem(UncheckedBaseModel):
|
|
11
|
-
result: typing.Optional[typing.List[typing.Dict[str, typing.Optional[typing.Any]]]] = None
|
|
12
11
|
created_at: typing.Optional[dt.datetime] = None
|
|
12
|
+
result: typing.Optional[typing.List[typing.Dict[str, typing.Optional[typing.Any]]]] = None
|
|
13
13
|
updated_at: typing.Optional[dt.datetime] = None
|
|
14
14
|
|
|
15
15
|
if IS_PYDANTIC_V2:
|
|
@@ -8,14 +8,14 @@ import pydantic
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class LseTaskSerializerForAnnotatorsPredictionsItem(UncheckedBaseModel):
|
|
11
|
-
|
|
12
|
-
score: typing.Optional[float] = None
|
|
13
|
-
model_version: typing.Optional[str] = None
|
|
11
|
+
created_at: typing.Optional[dt.datetime] = None
|
|
14
12
|
model: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = None
|
|
15
13
|
model_run: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = None
|
|
16
|
-
|
|
14
|
+
model_version: typing.Optional[str] = None
|
|
17
15
|
project: typing.Optional[int] = None
|
|
18
|
-
|
|
16
|
+
result: typing.Optional[typing.List[typing.Dict[str, typing.Optional[typing.Any]]]] = None
|
|
17
|
+
score: typing.Optional[float] = None
|
|
18
|
+
task: typing.Optional[int] = None
|
|
19
19
|
updated_at: typing.Optional[dt.datetime] = None
|
|
20
20
|
|
|
21
21
|
if IS_PYDANTIC_V2:
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
from ..core.unchecked_base_model import UncheckedBaseModel
|
|
4
4
|
import typing
|
|
5
|
-
from .lse_task_serializer_for_reviewers_predictions_item import LseTaskSerializerForReviewersPredictionsItem
|
|
6
5
|
import pydantic
|
|
7
|
-
from .lse_task_serializer_for_reviewers_drafts_item import LseTaskSerializerForReviewersDraftsItem
|
|
8
6
|
import datetime as dt
|
|
7
|
+
from .lse_task_serializer_for_reviewers_drafts_item import LseTaskSerializerForReviewersDraftsItem
|
|
8
|
+
from .lse_task_serializer_for_reviewers_predictions_item import LseTaskSerializerForReviewersPredictionsItem
|
|
9
9
|
from ..core.pydantic_utilities import IS_PYDANTIC_V2
|
|
10
10
|
|
|
11
11
|
|
|
@@ -14,97 +14,97 @@ class LseTaskSerializerForReviewers(UncheckedBaseModel):
|
|
|
14
14
|
Task Serializer with project scheme configs validation
|
|
15
15
|
"""
|
|
16
16
|
|
|
17
|
-
id: int
|
|
18
17
|
agreement: str
|
|
19
|
-
predictions: typing.List[LseTaskSerializerForReviewersPredictionsItem] = pydantic.Field()
|
|
20
|
-
"""
|
|
21
|
-
Predictions for this task
|
|
22
|
-
"""
|
|
23
|
-
|
|
24
18
|
annotations: str
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
Drafts for this task
|
|
28
|
-
"""
|
|
29
|
-
|
|
19
|
+
annotations_ids: str
|
|
20
|
+
annotations_results: str
|
|
30
21
|
annotators: typing.List[int] = pydantic.Field()
|
|
31
22
|
"""
|
|
32
23
|
Annotators IDs who annotated this task
|
|
33
24
|
"""
|
|
34
25
|
|
|
35
|
-
|
|
36
|
-
cancelled_annotations: typing.Optional[int] = None
|
|
37
|
-
total_annotations: typing.Optional[int] = None
|
|
38
|
-
total_predictions: typing.Optional[int] = None
|
|
39
|
-
completed_at: typing.Optional[dt.datetime] = None
|
|
40
|
-
annotations_results: str
|
|
41
|
-
predictions_results: str
|
|
42
|
-
predictions_score: typing.Optional[float] = None
|
|
43
|
-
file_upload: str
|
|
44
|
-
storage_filename: str
|
|
45
|
-
annotations_ids: str
|
|
46
|
-
predictions_model_versions: str
|
|
47
|
-
avg_lead_time: typing.Optional[float] = None
|
|
48
|
-
draft_exists: typing.Optional[bool] = None
|
|
49
|
-
updated_by: typing.List[typing.Dict[str, typing.Optional[typing.Any]]] = pydantic.Field()
|
|
26
|
+
annotators_count: int = pydantic.Field()
|
|
50
27
|
"""
|
|
51
|
-
|
|
28
|
+
The annotators_count is calculated as the number of users with annotations (can be repeated, so same as the number of annotations) + the number of assignees without annotations.
|
|
52
29
|
"""
|
|
53
30
|
|
|
54
|
-
|
|
55
|
-
|
|
31
|
+
avg_lead_time: typing.Optional[float] = None
|
|
32
|
+
cancelled_annotations: typing.Optional[int] = None
|
|
56
33
|
comment_authors: typing.List[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
reviews_rejected: typing.Optional[int] = None
|
|
60
|
-
ground_truth: typing.Optional[bool] = None
|
|
61
|
-
annotators_count: int = pydantic.Field()
|
|
34
|
+
comment_authors_count: int
|
|
35
|
+
comment_count: typing.Optional[int] = pydantic.Field(default=None)
|
|
62
36
|
"""
|
|
63
|
-
|
|
37
|
+
Number of comments in the task including all annotations
|
|
64
38
|
"""
|
|
65
39
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
data: typing.Optional[typing.Any] = None
|
|
69
|
-
meta: typing.Optional[typing.Optional[typing.Any]] = None
|
|
40
|
+
comments: str
|
|
41
|
+
completed_at: typing.Optional[dt.datetime] = None
|
|
70
42
|
created_at: dt.datetime = pydantic.Field()
|
|
71
43
|
"""
|
|
72
44
|
Time a task was created
|
|
73
45
|
"""
|
|
74
46
|
|
|
75
|
-
|
|
47
|
+
data: typing.Optional[typing.Any] = None
|
|
48
|
+
draft_exists: typing.Optional[bool] = None
|
|
49
|
+
drafts: typing.List[LseTaskSerializerForReviewersDraftsItem] = pydantic.Field()
|
|
76
50
|
"""
|
|
77
|
-
|
|
51
|
+
Drafts for this task
|
|
78
52
|
"""
|
|
79
53
|
|
|
54
|
+
file_upload: str
|
|
55
|
+
ground_truth: typing.Optional[bool] = None
|
|
56
|
+
id: int
|
|
57
|
+
inner_id: typing.Optional[int] = None
|
|
80
58
|
is_labeled: typing.Optional[bool] = pydantic.Field(default=None)
|
|
81
59
|
"""
|
|
82
60
|
True if the number of annotations for this task is greater than or equal to the number of maximum_completions for the project
|
|
83
61
|
"""
|
|
84
62
|
|
|
63
|
+
last_comment_updated_at: typing.Optional[dt.datetime] = pydantic.Field(default=None)
|
|
64
|
+
"""
|
|
65
|
+
When the last comment was updated
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
meta: typing.Optional[typing.Optional[typing.Any]] = None
|
|
85
69
|
overlap: typing.Optional[int] = pydantic.Field(default=None)
|
|
86
70
|
"""
|
|
87
71
|
Number of distinct annotators that processed the current task
|
|
88
72
|
"""
|
|
89
73
|
|
|
90
|
-
|
|
74
|
+
predictions: typing.List[LseTaskSerializerForReviewersPredictionsItem] = pydantic.Field()
|
|
91
75
|
"""
|
|
92
|
-
|
|
76
|
+
Predictions for this task
|
|
93
77
|
"""
|
|
94
78
|
|
|
79
|
+
predictions_model_versions: str
|
|
80
|
+
predictions_results: str
|
|
81
|
+
predictions_score: typing.Optional[float] = None
|
|
82
|
+
project: typing.Optional[int] = pydantic.Field(default=None)
|
|
83
|
+
"""
|
|
84
|
+
Project ID for this task
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
reviewed: typing.Optional[bool] = None
|
|
88
|
+
reviewers: typing.List[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
89
|
+
reviewers_count: int
|
|
90
|
+
reviews_accepted: typing.Optional[int] = None
|
|
91
|
+
reviews_rejected: typing.Optional[int] = None
|
|
92
|
+
storage_filename: str
|
|
93
|
+
total_annotations: typing.Optional[int] = None
|
|
94
|
+
total_predictions: typing.Optional[int] = None
|
|
95
95
|
unresolved_comment_count: typing.Optional[int] = pydantic.Field(default=None)
|
|
96
96
|
"""
|
|
97
97
|
Number of unresolved comments in the task including all annotations
|
|
98
98
|
"""
|
|
99
99
|
|
|
100
|
-
|
|
100
|
+
updated_at: dt.datetime = pydantic.Field()
|
|
101
101
|
"""
|
|
102
|
-
|
|
102
|
+
Last time a task was updated
|
|
103
103
|
"""
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
updated_by: typing.List[typing.Dict[str, typing.Optional[typing.Any]]] = pydantic.Field()
|
|
106
106
|
"""
|
|
107
|
-
|
|
107
|
+
User IDs who updated this task
|
|
108
108
|
"""
|
|
109
109
|
|
|
110
110
|
if IS_PYDANTIC_V2:
|
|
@@ -8,8 +8,8 @@ import pydantic
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class LseTaskSerializerForReviewersDraftsItem(UncheckedBaseModel):
|
|
11
|
-
result: typing.Optional[typing.List[typing.Dict[str, typing.Optional[typing.Any]]]] = None
|
|
12
11
|
created_at: typing.Optional[dt.datetime] = None
|
|
12
|
+
result: typing.Optional[typing.List[typing.Dict[str, typing.Optional[typing.Any]]]] = None
|
|
13
13
|
updated_at: typing.Optional[dt.datetime] = None
|
|
14
14
|
|
|
15
15
|
if IS_PYDANTIC_V2:
|
|
@@ -8,14 +8,14 @@ import pydantic
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class LseTaskSerializerForReviewersPredictionsItem(UncheckedBaseModel):
|
|
11
|
-
|
|
12
|
-
score: typing.Optional[float] = None
|
|
13
|
-
model_version: typing.Optional[str] = None
|
|
11
|
+
created_at: typing.Optional[dt.datetime] = None
|
|
14
12
|
model: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = None
|
|
15
13
|
model_run: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = None
|
|
16
|
-
|
|
14
|
+
model_version: typing.Optional[str] = None
|
|
17
15
|
project: typing.Optional[int] = None
|
|
18
|
-
|
|
16
|
+
result: typing.Optional[typing.List[typing.Dict[str, typing.Optional[typing.Any]]]] = None
|
|
17
|
+
score: typing.Optional[float] = None
|
|
18
|
+
task: typing.Optional[int] = None
|
|
19
19
|
updated_at: typing.Optional[dt.datetime] = None
|
|
20
20
|
|
|
21
21
|
if IS_PYDANTIC_V2:
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
from ..core.unchecked_base_model import UncheckedBaseModel
|
|
4
4
|
import typing
|
|
5
|
-
import datetime as dt
|
|
6
5
|
import pydantic
|
|
7
|
-
|
|
6
|
+
import datetime as dt
|
|
8
7
|
from .lse_fields import LseFields
|
|
8
|
+
from .organization_membership import OrganizationMembership
|
|
9
9
|
from ..core.pydantic_utilities import IS_PYDANTIC_V2
|
|
10
10
|
|
|
11
11
|
|
|
@@ -17,16 +17,6 @@ class LseUser(UncheckedBaseModel):
|
|
|
17
17
|
values with complex, nested serializations
|
|
18
18
|
"""
|
|
19
19
|
|
|
20
|
-
id: int
|
|
21
|
-
first_name: typing.Optional[str] = None
|
|
22
|
-
last_name: typing.Optional[str] = None
|
|
23
|
-
username: str
|
|
24
|
-
email: typing.Optional[str] = None
|
|
25
|
-
last_activity: dt.datetime
|
|
26
|
-
custom_hotkeys: typing.Optional[typing.Optional[typing.Any]] = None
|
|
27
|
-
avatar: str
|
|
28
|
-
initials: str
|
|
29
|
-
phone: typing.Optional[str] = None
|
|
30
20
|
active_organization: typing.Optional[int] = None
|
|
31
21
|
active_organization_meta: str
|
|
32
22
|
allow_newsletters: typing.Optional[bool] = pydantic.Field(default=None)
|
|
@@ -34,10 +24,20 @@ class LseUser(UncheckedBaseModel):
|
|
|
34
24
|
Allow sending newsletters to user
|
|
35
25
|
"""
|
|
36
26
|
|
|
27
|
+
avatar: str
|
|
28
|
+
custom_hotkeys: typing.Optional[typing.Optional[typing.Any]] = None
|
|
37
29
|
date_joined: typing.Optional[dt.datetime] = None
|
|
38
|
-
|
|
30
|
+
email: typing.Optional[str] = None
|
|
31
|
+
first_name: typing.Optional[str] = None
|
|
32
|
+
id: int
|
|
33
|
+
initials: str
|
|
34
|
+
last_activity: dt.datetime
|
|
35
|
+
last_name: typing.Optional[str] = None
|
|
39
36
|
lse_fields: LseFields
|
|
37
|
+
org_membership: typing.List[OrganizationMembership]
|
|
40
38
|
pause: str
|
|
39
|
+
phone: typing.Optional[str] = None
|
|
40
|
+
username: str
|
|
41
41
|
|
|
42
42
|
if IS_PYDANTIC_V2:
|
|
43
43
|
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
from ..core.unchecked_base_model import UncheckedBaseModel
|
|
4
4
|
import typing
|
|
5
|
-
import datetime as dt
|
|
6
5
|
import pydantic
|
|
6
|
+
import datetime as dt
|
|
7
7
|
from .organization_membership import OrganizationMembership
|
|
8
8
|
from ..core.pydantic_utilities import IS_PYDANTIC_V2
|
|
9
9
|
|
|
@@ -16,16 +16,6 @@ class LseUserApi(UncheckedBaseModel):
|
|
|
16
16
|
values with complex, nested serializations
|
|
17
17
|
"""
|
|
18
18
|
|
|
19
|
-
id: int
|
|
20
|
-
first_name: typing.Optional[str] = None
|
|
21
|
-
last_name: typing.Optional[str] = None
|
|
22
|
-
username: str
|
|
23
|
-
email: typing.Optional[str] = None
|
|
24
|
-
last_activity: dt.datetime
|
|
25
|
-
custom_hotkeys: typing.Optional[typing.Optional[typing.Any]] = None
|
|
26
|
-
avatar: str
|
|
27
|
-
initials: str
|
|
28
|
-
phone: typing.Optional[str] = None
|
|
29
19
|
active_organization: typing.Optional[int] = None
|
|
30
20
|
active_organization_meta: str
|
|
31
21
|
allow_newsletters: typing.Optional[bool] = pydantic.Field(default=None)
|
|
@@ -33,8 +23,18 @@ class LseUserApi(UncheckedBaseModel):
|
|
|
33
23
|
Allow sending newsletters to user
|
|
34
24
|
"""
|
|
35
25
|
|
|
26
|
+
avatar: str
|
|
27
|
+
custom_hotkeys: typing.Optional[typing.Optional[typing.Any]] = None
|
|
36
28
|
date_joined: typing.Optional[dt.datetime] = None
|
|
29
|
+
email: typing.Optional[str] = None
|
|
30
|
+
first_name: typing.Optional[str] = None
|
|
31
|
+
id: int
|
|
32
|
+
initials: str
|
|
33
|
+
last_activity: dt.datetime
|
|
34
|
+
last_name: typing.Optional[str] = None
|
|
37
35
|
org_membership: typing.List[OrganizationMembership]
|
|
36
|
+
phone: typing.Optional[str] = None
|
|
37
|
+
username: str
|
|
38
38
|
|
|
39
39
|
if IS_PYDANTIC_V2:
|
|
40
40
|
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
from ..core.unchecked_base_model import UncheckedBaseModel
|
|
4
4
|
import typing
|
|
5
|
-
import datetime as dt
|
|
6
5
|
import pydantic
|
|
6
|
+
import datetime as dt
|
|
7
7
|
from .lse_fields import LseFields
|
|
8
8
|
from ..core.pydantic_utilities import IS_PYDANTIC_V2
|
|
9
9
|
|
|
@@ -16,27 +16,27 @@ class LseUserOrganizationMemberList(UncheckedBaseModel):
|
|
|
16
16
|
values with complex, nested serializations
|
|
17
17
|
"""
|
|
18
18
|
|
|
19
|
-
id: int
|
|
20
|
-
first_name: typing.Optional[str] = None
|
|
21
|
-
last_name: typing.Optional[str] = None
|
|
22
|
-
username: str
|
|
23
|
-
email: typing.Optional[str] = None
|
|
24
|
-
last_activity: dt.datetime
|
|
25
|
-
custom_hotkeys: typing.Optional[typing.Optional[typing.Any]] = None
|
|
26
|
-
avatar: str
|
|
27
|
-
initials: str
|
|
28
|
-
phone: typing.Optional[str] = None
|
|
29
19
|
active_organization: typing.Optional[int] = None
|
|
30
20
|
allow_newsletters: typing.Optional[bool] = pydantic.Field(default=None)
|
|
31
21
|
"""
|
|
32
22
|
Allow sending newsletters to user
|
|
33
23
|
"""
|
|
34
24
|
|
|
25
|
+
avatar: str
|
|
26
|
+
contributed_to_projects: str
|
|
27
|
+
created_projects: str
|
|
28
|
+
custom_hotkeys: typing.Optional[typing.Optional[typing.Any]] = None
|
|
35
29
|
date_joined: typing.Optional[dt.datetime] = None
|
|
30
|
+
email: typing.Optional[str] = None
|
|
31
|
+
first_name: typing.Optional[str] = None
|
|
32
|
+
id: int
|
|
33
|
+
initials: str
|
|
34
|
+
last_activity: dt.datetime
|
|
35
|
+
last_name: typing.Optional[str] = None
|
|
36
36
|
lse_fields: LseFields
|
|
37
37
|
pause: str
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
phone: typing.Optional[str] = None
|
|
39
|
+
username: str
|
|
40
40
|
|
|
41
41
|
if IS_PYDANTIC_V2:
|
|
42
42
|
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|
|
@@ -7,9 +7,9 @@ import pydantic
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class LseapiTokenCreate(UncheckedBaseModel):
|
|
10
|
-
token: str
|
|
11
10
|
created_at: str
|
|
12
11
|
expires_at: str
|
|
12
|
+
token: str
|
|
13
13
|
|
|
14
14
|
if IS_PYDANTIC_V2:
|
|
15
15
|
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|
|
@@ -7,9 +7,9 @@ import pydantic
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class LseapiTokenList(UncheckedBaseModel):
|
|
10
|
-
token: str
|
|
11
10
|
created_at: str
|
|
12
11
|
expires_at: str
|
|
12
|
+
token: str
|
|
13
13
|
|
|
14
14
|
if IS_PYDANTIC_V2:
|
|
15
15
|
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|
|
@@ -7,6 +7,11 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class LsejwtSettings(UncheckedBaseModel):
|
|
10
|
+
api_token_ttl_days: typing.Optional[int] = pydantic.Field(default=None)
|
|
11
|
+
"""
|
|
12
|
+
Number of days before JWT API tokens expire
|
|
13
|
+
"""
|
|
14
|
+
|
|
10
15
|
api_tokens_enabled: typing.Optional[bool] = pydantic.Field(default=None)
|
|
11
16
|
"""
|
|
12
17
|
Enable JWT API token authentication for this organization
|
|
@@ -17,11 +22,6 @@ class LsejwtSettings(UncheckedBaseModel):
|
|
|
17
22
|
Enable legacy API token authentication for this organization
|
|
18
23
|
"""
|
|
19
24
|
|
|
20
|
-
api_token_ttl_days: typing.Optional[int] = pydantic.Field(default=None)
|
|
21
|
-
"""
|
|
22
|
-
Number of days before JWT API tokens expire
|
|
23
|
-
"""
|
|
24
|
-
|
|
25
25
|
if IS_PYDANTIC_V2:
|
|
26
26
|
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|
|
27
27
|
else:
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
from ..core.unchecked_base_model import UncheckedBaseModel
|
|
4
4
|
import typing
|
|
5
|
-
from .state_enum import StateEnum
|
|
6
|
-
import pydantic
|
|
7
5
|
from .auth_method_enum import AuthMethodEnum
|
|
6
|
+
import pydantic
|
|
8
7
|
import datetime as dt
|
|
8
|
+
from .state_enum import StateEnum
|
|
9
9
|
from ..core.pydantic_utilities import IS_PYDANTIC_V2
|
|
10
10
|
|
|
11
11
|
|
|
@@ -14,60 +14,59 @@ class MlBackend(UncheckedBaseModel):
|
|
|
14
14
|
Serializer for MLBackend model.
|
|
15
15
|
"""
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
readable_state: str
|
|
20
|
-
is_interactive: typing.Optional[bool] = pydantic.Field(default=None)
|
|
21
|
-
"""
|
|
22
|
-
Used to interactively annotate tasks. If true, model returns one list with results
|
|
23
|
-
"""
|
|
24
|
-
|
|
25
|
-
url: str = pydantic.Field()
|
|
17
|
+
auth_method: typing.Optional[AuthMethodEnum] = None
|
|
18
|
+
auto_update: typing.Optional[bool] = pydantic.Field(default=None)
|
|
26
19
|
"""
|
|
27
|
-
|
|
20
|
+
If false, model version is set by the user, if true - getting latest version from backend.
|
|
28
21
|
"""
|
|
29
22
|
|
|
30
|
-
|
|
23
|
+
basic_auth_pass_is_set: str
|
|
24
|
+
basic_auth_user: typing.Optional[str] = pydantic.Field(default=None)
|
|
31
25
|
"""
|
|
32
|
-
|
|
26
|
+
HTTP Basic Auth user
|
|
33
27
|
"""
|
|
34
28
|
|
|
35
|
-
|
|
29
|
+
created_at: dt.datetime
|
|
30
|
+
description: typing.Optional[str] = pydantic.Field(default=None)
|
|
36
31
|
"""
|
|
37
|
-
|
|
32
|
+
Description for the machine learning backend
|
|
38
33
|
"""
|
|
39
34
|
|
|
40
|
-
|
|
41
|
-
basic_auth_user: typing.Optional[str] = pydantic.Field(default=None)
|
|
35
|
+
error_message: typing.Optional[str] = pydantic.Field(default=None)
|
|
42
36
|
"""
|
|
43
|
-
|
|
37
|
+
Error message in error state
|
|
44
38
|
"""
|
|
45
39
|
|
|
46
|
-
|
|
47
|
-
|
|
40
|
+
extra_params: typing.Optional[typing.Optional[typing.Any]] = None
|
|
41
|
+
id: int
|
|
42
|
+
is_interactive: typing.Optional[bool] = pydantic.Field(default=None)
|
|
48
43
|
"""
|
|
49
|
-
|
|
44
|
+
Used to interactively annotate tasks. If true, model returns one list with results
|
|
50
45
|
"""
|
|
51
46
|
|
|
52
|
-
extra_params: typing.Optional[typing.Optional[typing.Any]] = None
|
|
53
47
|
model_version: typing.Optional[str] = pydantic.Field(default=None)
|
|
54
48
|
"""
|
|
55
49
|
Current model version associated with this machine learning backend
|
|
56
50
|
"""
|
|
57
51
|
|
|
52
|
+
project: int
|
|
53
|
+
readable_state: str
|
|
54
|
+
state: typing.Optional[StateEnum] = None
|
|
58
55
|
timeout: typing.Optional[float] = pydantic.Field(default=None)
|
|
59
56
|
"""
|
|
60
57
|
Response model timeout
|
|
61
58
|
"""
|
|
62
59
|
|
|
63
|
-
|
|
64
|
-
updated_at: dt.datetime
|
|
65
|
-
auto_update: typing.Optional[bool] = pydantic.Field(default=None)
|
|
60
|
+
title: typing.Optional[str] = pydantic.Field(default=None)
|
|
66
61
|
"""
|
|
67
|
-
|
|
62
|
+
Name of the machine learning backend
|
|
68
63
|
"""
|
|
69
64
|
|
|
70
|
-
|
|
65
|
+
updated_at: dt.datetime
|
|
66
|
+
url: str = pydantic.Field()
|
|
67
|
+
"""
|
|
68
|
+
URL for the machine learning model server
|
|
69
|
+
"""
|
|
71
70
|
|
|
72
71
|
if IS_PYDANTIC_V2:
|
|
73
72
|
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|
|
@@ -2,37 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
from ..core.unchecked_base_model import UncheckedBaseModel
|
|
4
4
|
import typing
|
|
5
|
+
import datetime as dt
|
|
5
6
|
from .user_simple import UserSimple
|
|
6
7
|
import pydantic
|
|
7
8
|
from .skill_name_enum import SkillNameEnum
|
|
8
|
-
import datetime as dt
|
|
9
9
|
from ..core.pydantic_utilities import IS_PYDANTIC_V2
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class ModelInterface(UncheckedBaseModel):
|
|
13
|
-
|
|
13
|
+
associated_projects: typing.Optional[typing.List[int]] = None
|
|
14
|
+
created_at: dt.datetime
|
|
14
15
|
created_by: typing.Optional[UserSimple] = pydantic.Field(default=None)
|
|
15
16
|
"""
|
|
16
17
|
User who created Dataset
|
|
17
18
|
"""
|
|
18
19
|
|
|
19
|
-
skill_name: typing.Optional[SkillNameEnum] = None
|
|
20
|
-
title: str = pydantic.Field()
|
|
21
|
-
"""
|
|
22
|
-
Model name
|
|
23
|
-
"""
|
|
24
|
-
|
|
25
20
|
description: typing.Optional[str] = pydantic.Field(default=None)
|
|
26
21
|
"""
|
|
27
22
|
Model description
|
|
28
23
|
"""
|
|
29
24
|
|
|
30
|
-
|
|
31
|
-
updated_at: dt.datetime
|
|
25
|
+
id: int
|
|
32
26
|
input_fields: typing.Optional[typing.Optional[typing.Any]] = None
|
|
33
|
-
output_classes: typing.Optional[typing.Optional[typing.Any]] = None
|
|
34
27
|
organization: typing.Optional[int] = None
|
|
35
|
-
|
|
28
|
+
output_classes: typing.Optional[typing.Optional[typing.Any]] = None
|
|
29
|
+
skill_name: typing.Optional[SkillNameEnum] = None
|
|
30
|
+
title: str = pydantic.Field()
|
|
31
|
+
"""
|
|
32
|
+
Model name
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
updated_at: dt.datetime
|
|
36
36
|
|
|
37
37
|
if IS_PYDANTIC_V2:
|
|
38
38
|
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|
|
@@ -9,26 +9,25 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class ModelInterfaceRequest(UncheckedBaseModel):
|
|
12
|
+
associated_projects: typing.Optional[typing.List[int]] = None
|
|
12
13
|
created_by: typing.Optional[UserSimpleRequest] = pydantic.Field(default=None)
|
|
13
14
|
"""
|
|
14
15
|
User who created Dataset
|
|
15
16
|
"""
|
|
16
17
|
|
|
17
|
-
skill_name: typing.Optional[SkillNameEnum] = None
|
|
18
|
-
title: str = pydantic.Field()
|
|
19
|
-
"""
|
|
20
|
-
Model name
|
|
21
|
-
"""
|
|
22
|
-
|
|
23
18
|
description: typing.Optional[str] = pydantic.Field(default=None)
|
|
24
19
|
"""
|
|
25
20
|
Model description
|
|
26
21
|
"""
|
|
27
22
|
|
|
28
23
|
input_fields: typing.Optional[typing.Optional[typing.Any]] = None
|
|
29
|
-
output_classes: typing.Optional[typing.Optional[typing.Any]] = None
|
|
30
24
|
organization: typing.Optional[int] = None
|
|
31
|
-
|
|
25
|
+
output_classes: typing.Optional[typing.Optional[typing.Any]] = None
|
|
26
|
+
skill_name: typing.Optional[SkillNameEnum] = None
|
|
27
|
+
title: str = pydantic.Field()
|
|
28
|
+
"""
|
|
29
|
+
Model name
|
|
30
|
+
"""
|
|
32
31
|
|
|
33
32
|
if IS_PYDANTIC_V2:
|
|
34
33
|
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|