Skip to content

Commit e98fed3

Browse files
author
Val Brodsky
committed
Revert "Revert "Vb/model offline eval plt 1107 (#1682)" (#1687)"
This reverts commit a8dc569.
1 parent de47ca3 commit e98fed3

File tree

7 files changed

+335
-85
lines changed

7 files changed

+335
-85
lines changed

libs/labelbox/src/labelbox/client.py

Lines changed: 99 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,8 @@ def delete_model_config(self, id: str) -> bool:
652652
params = {"id": id}
653653
result = self.execute(query, params)
654654
if not result:
655-
raise labelbox.exceptions.ResourceNotFoundError(Entity.ModelConfig, params)
655+
raise labelbox.exceptions.ResourceNotFoundError(
656+
Entity.ModelConfig, params)
656657
return result['deleteModelConfig']['success']
657658

658659
def create_dataset(self,
@@ -740,85 +741,17 @@ def create_project(self, **kwargs) -> Project:
740741
Raises:
741742
InvalidAttributeError: If the Project type does not contain
742743
any of the attribute names given in kwargs.
743-
"""
744-
745-
auto_audit_percentage = kwargs.get("auto_audit_percentage")
746-
auto_audit_number_of_labels = kwargs.get("auto_audit_number_of_labels")
747-
if auto_audit_percentage is not None or auto_audit_number_of_labels is not None:
748-
raise ValueError(
749-
"quality_mode must be set instead of auto_audit_percentage or auto_audit_number_of_labels."
750-
)
751-
752-
name = kwargs.get("name")
753-
if name is None or not name.strip():
754-
raise ValueError("project name must be a valid string.")
755-
756-
queue_mode = kwargs.get("queue_mode")
757-
if queue_mode is QueueMode.Dataset:
758-
raise ValueError(
759-
"Dataset queue mode is deprecated. Please prefer Batch queue mode."
760-
)
761-
elif queue_mode is QueueMode.Batch:
762-
logger.warning(
763-
"Passing a queue mode of batch is redundant and will soon no longer be supported."
764-
)
765744
766-
media_type = kwargs.get("media_type")
767-
if media_type and MediaType.is_supported(media_type):
768-
media_type_value = media_type.value
769-
elif media_type:
770-
raise TypeError(f"{media_type} is not a valid media type. Use"
771-
f" any of {MediaType.get_supported_members()}"
772-
" from MediaType. Example: MediaType.Image.")
773-
else:
774-
logger.warning(
775-
"Creating a project without specifying media_type"
776-
" through this method will soon no longer be supported.")
777-
media_type_value = None
778-
779-
ontology_kind = kwargs.pop("ontology_kind", None)
780-
if ontology_kind and OntologyKind.is_supported(ontology_kind):
781-
editor_task_type_value = EditorTaskTypeMapper.to_editor_task_type(
782-
ontology_kind, media_type).value
783-
elif ontology_kind:
784-
raise OntologyKind.get_ontology_kind_validation_error(ontology_kind)
785-
else:
786-
editor_task_type_value = None
787-
788-
quality_mode = kwargs.get("quality_mode")
789-
if not quality_mode:
790-
logger.info("Defaulting quality mode to Benchmark.")
791-
792-
data = kwargs
793-
data.pop("quality_mode", None)
794-
if quality_mode is None or quality_mode is QualityMode.Benchmark:
795-
data[
796-
"auto_audit_number_of_labels"] = BENCHMARK_AUTO_AUDIT_NUMBER_OF_LABELS
797-
data["auto_audit_percentage"] = BENCHMARK_AUTO_AUDIT_PERCENTAGE
798-
elif quality_mode is QualityMode.Consensus:
799-
data[
800-
"auto_audit_number_of_labels"] = CONSENSUS_AUTO_AUDIT_NUMBER_OF_LABELS
801-
data["auto_audit_percentage"] = CONSENSUS_AUTO_AUDIT_PERCENTAGE
802-
else:
803-
raise ValueError(f"{quality_mode} is not a valid quality mode.")
804-
805-
params = {**data}
806-
if media_type_value:
807-
params["media_type"] = media_type_value
808-
if editor_task_type_value:
809-
params["editor_task_type"] = editor_task_type_value
810-
811-
extra_params = {
812-
Field.String("dataset_name_or_id"):
813-
params.pop("dataset_name_or_id", None),
814-
Field.Boolean("append_to_existing_dataset"):
815-
params.pop("append_to_existing_dataset", None),
816-
Field.Int("data_row_count"):
817-
params.pop("data_row_count", None),
818-
}
819-
extra_params = {k: v for k, v in extra_params.items() if v is not None}
820-
821-
return self._create(Entity.Project, params, extra_params)
745+
NOTE: the following attributes are used only in chat model evaluation projects:
746+
dataset_name_or_id, append_to_existing_dataset, data_row_count, editor_task_type
747+
They are not used for general projects and not supported in this method
748+
"""
749+
# The following arguments are not supported for general projects, only for chat model evaluation projects
750+
kwargs.pop("dataset_name_or_id", None)
751+
kwargs.pop("append_to_existing_dataset", None)
752+
kwargs.pop("data_row_count", None)
753+
kwargs.pop("editor_task_type", None)
754+
return self._create_project(**kwargs)
822755

823756
@overload
824757
def create_model_evaluation_project(self,
@@ -881,13 +814,99 @@ def create_model_evaluation_project(self,
881814
dataset_name_or_id = dataset_name
882815

883816
kwargs["media_type"] = MediaType.Conversational
884-
kwargs["ontology_kind"] = OntologyKind.ModelEvaluation
885817
kwargs["dataset_name_or_id"] = dataset_name_or_id
886818
kwargs["append_to_existing_dataset"] = append_to_existing_dataset
887819
kwargs["data_row_count"] = data_row_count
820+
kwargs["editor_task_type"] = EditorTaskType.ModelChatEvaluation.value
821+
822+
return self._create_project(**kwargs)
823+
824+
def create_offline_model_evaluation_project(self, **kwargs) -> Project:
825+
"""
826+
Creates a project for offline model evaluation.
827+
Args:
828+
**kwargs: Additional parameters to pass see the create_project method
829+
Returns:
830+
Project: The created project
831+
"""
832+
kwargs[
833+
"media_type"] = MediaType.Conversational # Only Conversational is supported
834+
kwargs[
835+
"editor_task_type"] = EditorTaskType.OfflineModelChatEvaluation.value # Special editor task type for offline model evaluation
836+
837+
# The following arguments are not supported for offline model evaluation
838+
kwargs.pop("dataset_name_or_id", None)
839+
kwargs.pop("append_to_existing_dataset", None)
840+
kwargs.pop("data_row_count", None)
888841

889842
return self.create_project(**kwargs)
890843

844+
def _create_project(self, **kwargs) -> Project:
845+
auto_audit_percentage = kwargs.get("auto_audit_percentage")
846+
auto_audit_number_of_labels = kwargs.get("auto_audit_number_of_labels")
847+
if auto_audit_percentage is not None or auto_audit_number_of_labels is not None:
848+
raise ValueError(
849+
"quality_mode must be set instead of auto_audit_percentage or auto_audit_number_of_labels."
850+
)
851+
852+
name = kwargs.get("name")
853+
if name is None or not name.strip():
854+
raise ValueError("project name must be a valid string.")
855+
856+
queue_mode = kwargs.get("queue_mode")
857+
if queue_mode is QueueMode.Dataset:
858+
raise ValueError(
859+
"Dataset queue mode is deprecated. Please prefer Batch queue mode."
860+
)
861+
elif queue_mode is QueueMode.Batch:
862+
logger.warning(
863+
"Passing a queue mode of batch is redundant and will soon no longer be supported."
864+
)
865+
866+
media_type = kwargs.get("media_type")
867+
if media_type and MediaType.is_supported(media_type):
868+
media_type_value = media_type.value
869+
elif media_type:
870+
raise TypeError(f"{media_type} is not a valid media type. Use"
871+
f" any of {MediaType.get_supported_members()}"
872+
" from MediaType. Example: MediaType.Image.")
873+
else:
874+
logger.warning(
875+
"Creating a project without specifying media_type"
876+
" through this method will soon no longer be supported.")
877+
media_type_value = None
878+
879+
quality_mode = kwargs.get("quality_mode")
880+
if not quality_mode:
881+
logger.info("Defaulting quality mode to Benchmark.")
882+
883+
data = kwargs
884+
data.pop("quality_mode", None)
885+
if quality_mode is None or quality_mode is QualityMode.Benchmark:
886+
data[
887+
"auto_audit_number_of_labels"] = BENCHMARK_AUTO_AUDIT_NUMBER_OF_LABELS
888+
data["auto_audit_percentage"] = BENCHMARK_AUTO_AUDIT_PERCENTAGE
889+
elif quality_mode is QualityMode.Consensus:
890+
data[
891+
"auto_audit_number_of_labels"] = CONSENSUS_AUTO_AUDIT_NUMBER_OF_LABELS
892+
data["auto_audit_percentage"] = CONSENSUS_AUTO_AUDIT_PERCENTAGE
893+
else:
894+
raise ValueError(f"{quality_mode} is not a valid quality mode.")
895+
896+
params = {**data}
897+
if media_type_value:
898+
params["media_type"] = media_type_value
899+
900+
extra_params = {
901+
Field.String("dataset_name_or_id"):
902+
params.pop("dataset_name_or_id", None),
903+
Field.Boolean("append_to_existing_dataset"):
904+
params.pop("append_to_existing_dataset", None),
905+
}
906+
extra_params = {k: v for k, v in extra_params.items() if v is not None}
907+
908+
return self._create(Entity.Project, params, extra_params)
909+
891910
def get_roles(self) -> List[Role]:
892911
"""
893912
Returns:

libs/labelbox/src/labelbox/schema/ontology_kind.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,28 @@ def get_ontology_kind_validation_error(cls, ontology_kind):
2626
class EditorTaskType(Enum):
2727
ModelChatEvaluation = "MODEL_CHAT_EVALUATION"
2828
ResponseCreation = "RESPONSE_CREATION"
29+
OfflineModelChatEvaluation = "OFFLINE_MODEL_CHAT_EVALUATION"
2930
Missing = None
3031

3132
@classmethod
3233
def is_supported(cls, value):
3334
return isinstance(value, cls)
3435

36+
@classmethod
37+
def _missing_(cls, name) -> 'EditorTaskType':
38+
"""Handle missing null new task types
39+
Handle upper case names for compatibility with
40+
the GraphQL"""
41+
42+
if name is None:
43+
return cls.Missing
44+
45+
for name, member in cls.__members__.items():
46+
if name == name.upper():
47+
return member
48+
49+
return cls.Missing
50+
3551

3652
class EditorTaskTypeMapper:
3753

libs/labelbox/src/labelbox/schema/project.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ class Project(DbObject, Updateable, Deletable):
121121
# Bind data_type and allowedMediaTYpe using the GraphQL type MediaType
122122
media_type = Field.Enum(MediaType, "media_type", "allowedMediaType")
123123
editor_task_type = Field.Enum(EditorTaskType, "editor_task_type")
124+
data_row_count = Field.Int("data_row_count")
124125

125126
# Relationships
126127
created_by = Relationship.ToOne("User", False, "created_by")

0 commit comments

Comments
 (0)