from typing import Any
from chariot import _apis
from chariot.datasets import _utils, models
from chariot_api._openapi.datasets_v3 import models as openapi_models
__all__ = [
"create_annotation",
"get_annotation",
"update_annotation",
"archive_annotation",
]
[docs]
def create_annotation(
datum_id: str,
*,
class_label: str | None = None,
contour: list[list[models.Point]] | None = None,
bbox: models.BoundingBox | None = None,
oriented_bbox: models.OrientedBoundingBox | None = None,
text_classification: models.TextClassification | None = None,
text_generation: models.TextGeneration | None = None,
token_classification: models.TokenClassification | None = None,
metadata: dict[str, Any] | None = None,
approval_status: models.ApprovalStatus | None = None,
) -> models.Annotation:
"""Create a new annotation
:param datum_id: Id of datum to add annotation to
:type datum_id: str
:param class_label: Class label of the annotation
:type class_label: Optional[str]
:param contour: Contour for an Image Segmentation annotation
:type contour: Optional[List[List[models.Point]]]
:param bbox: Bounding box for an Object Detection annotation
:type bbox: Optional[models.BoundingBox]
:param oriented_bbox: Oriented bounding box for an Oriented Object Detection annotation
:type oriented_bbox: Optional[models.OrientedBoundingBox]
:param text_classification: Text Classification annotation
:type text_classification: Optional[models.TextClassification]
:param text_generation: Text Generation annotation
:type text_generation: Optional[models.TextGeneration]
:param token_classification: Token Classification annotation
:type token_classification: Optional[models.TokenClassification]
:param metadata: Metadata associated with the annotation
:type metadata: Optional[Dict[str, Any]]
:param approval_status: Reviewer approval status for the annotation
:type approval_status: Optional[models.ApprovalStatus]
:return: New annotation details
:rtype: models.Annotation
"""
request = openapi_models.InputCreateAnnotationRequest(
class_label=class_label,
bbox=_utils.convert_from_dataclass(bbox, openapi_models.ModelBoundingBox),
contour=[_utils.convert_from_dataclass_list(c, openapi_models.ModelPoint) for c in contour]
if contour is not None
else None,
oriented_bbox=_utils.convert_from_dataclass(
oriented_bbox, openapi_models.ModelOrientedBoundingBox
),
text_classification=_utils.convert_from_dataclass(
text_classification, openapi_models.ModelTextClassification
),
text_generation=_utils.convert_from_dataclass(
text_generation, openapi_models.InputTextGenerationInput
),
token_classification=_utils.convert_from_dataclass(
token_classification, openapi_models.ModelTokenClassification
),
metadata=metadata,
approval_status=_utils.enum_value(approval_status),
)
response = _apis.datasets_v3.annotations_api.create_annotation(datum_id=datum_id, body=request)
if not response.data:
raise RuntimeError("Received malformed response (missing `data`) from create_annotation")
return _utils.convert_to_dataclass(response.data.model_dump(), models.Annotation)
[docs]
def get_annotation(id: str) -> models.Annotation:
"""Get an annotation by id
:param id: Id of annotation to get
:type id: str
:return: Annotation details
:rtype: models.Annotation
"""
response = _apis.datasets_v3.annotations_api.get_annotation(annotation_id=id)
if not response.data:
raise RuntimeError("Received malformed response (missing `data`) from get_annotation")
return _utils.convert_to_dataclass(response.data.model_dump(), models.Annotation)
[docs]
def update_annotation(
annotation_id: str,
*,
class_label: str | None = None,
contour: list[list[models.Point]] | None = None,
bbox: models.BoundingBox | None = None,
oriented_bbox: models.OrientedBoundingBox | None = None,
text_classification: models.TextClassification | None = None,
text_generation: models.TextGeneration | None = None,
token_classification: models.TokenClassification | None = None,
metadata: dict[str, Any] | None = None,
approval_status: models.ApprovalStatus | None = None,
updated_at: str | None = None,
) -> models.Annotation:
"""Update or replace an annotation
:param annotation_id: Id of annotation to be updted or replaced
:type annotation_id: str
:param class_label: Class label of the annotation
:type class_label: Optional[str]
:param contour: Contour for an Image Segmentation annotation
:type contour: Optional[List[List[models.Point]]]
:param bbox: Bounding box for an Object Detection annotation
:type bbox: Optional[models.BoundingBox]
:param oriented_bbox: Oriented bounding box for an Oriented Object Detection annotation
:type oriented_bbox: Optional[models.OrientedBoundingBox]
:param text_classification: Text Classification annotation
:type text_classification: Optional[models.TextClassification]
:param text_generation: Text Generation annotation
:type text_generation: Optional[models.TextGeneration]
:param token_classification: Token Classification annotation
:type token_classification: Optional[models.TokenClassification]
:param metadata: Metadata associated with the annotation
:type metadata: Optional[Dict[str, Any]]
:param approval_status: Reviewer approval status for the annotation
:type approval_status: Optional[models.ApprovalStatus]
:param updated_at: must match the updated_at time on the annotation being updated
:type updated_at: Optional[str]
:return: New annotation details
:rtype: models.Annotation
"""
request = openapi_models.InputUpdateAnnotationRequest(
class_label=class_label,
bbox=_utils.convert_from_dataclass(bbox, openapi_models.ModelBoundingBox),
contour=[_utils.convert_from_dataclass_list(c, openapi_models.ModelPoint) for c in contour]
if contour is not None
else None,
oriented_bbox=_utils.convert_from_dataclass(
oriented_bbox, openapi_models.ModelOrientedBoundingBox
),
text_classification=_utils.convert_from_dataclass(
text_classification, openapi_models.ModelTextClassification
),
text_generation=_utils.convert_from_dataclass(
text_generation, openapi_models.InputTextGenerationInput
),
token_classification=_utils.convert_from_dataclass(
token_classification, openapi_models.ModelTokenClassification
),
metadata=metadata,
approval_status=_utils.enum_value(approval_status),
updated_at=updated_at,
)
response = _apis.datasets_v3.annotations_api.update_annotation(
annotation_id=annotation_id, body=request
)
if not response.data:
raise RuntimeError("Received malformed response (missing `data`) from update_annotation")
return _utils.convert_to_dataclass(response.data.model_dump(), models.Annotation)
[docs]
def archive_annotation(id: str) -> models.Annotation:
"""Archive (soft-delete) an annotation by id
:param id: Id of annotation to archive
:type id: str
:return: Annotation details
:rtype: models.Annotation
"""
response = _apis.datasets_v3.annotations_api.archive_annotation(annotation_id=id)
if not response.data:
raise RuntimeError("Received malformed response (missing `data`) from archive_annotation")
return _utils.convert_to_dataclass(response.data.model_dump(), models.Annotation)