Source code for chariot.datasets.annotations

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)