Skip to content

Commit b806523

Browse files
author
Val Brodsky
committed
Handle out of band exceptions for Project add_model_config in order to deal with a model_setup_complete scenario
1 parent aa2f43e commit b806523

File tree

4 files changed

+68
-10
lines changed

4 files changed

+68
-10
lines changed

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

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import re
12
import json
23
import logging
34
from string import Template
@@ -1268,7 +1269,22 @@ def add_model_config(self, model_config_id: str) -> str:
12681269
"projectId": self.uid,
12691270
"modelConfigId": model_config_id,
12701271
}
1271-
result = self.client.execute(query, params)
1272+
try:
1273+
result = self.client.execute(query, params)
1274+
except LabelboxError as e:
1275+
# unfortunately, this is the type of errors our client does not deal with and so the error message is not in the same format as the other errors
1276+
# needs custom parsing
1277+
error_string = e.message
1278+
# Regex to find the message content
1279+
pattern = r"'message': '([^']+)'"
1280+
# Search for the pattern in the error string
1281+
match = re.search(pattern, error_string)
1282+
if match:
1283+
error_content = match.group(1)
1284+
else:
1285+
error_content = "Unknown error"
1286+
raise LabelboxError(message=error_content) from e
1287+
12721288
if not result:
12731289
raise ResourceNotFoundError(ModelConfig, params)
12741290
return result["createProjectModelConfig"]["projectModelConfigId"]
@@ -1301,18 +1317,19 @@ def set_project_model_setup_complete(self) -> bool:
13011317
13021318
Returns:
13031319
bool, indicates if the model setup is complete.
1320+
1321+
NOTE: This method should only be used for live model evaluation projects.
13041322
"""
1305-
query = """query ModelSetupCompletePyApi($projectId: ID!) {
1306-
project(where: {id: $projectId}, data: {modelSetupComplete: true}) {
1323+
query = """mutation SetProjectModelSetupCompletePyApi($projectId: ID!) {
1324+
setProjectModelSetupComplete(where: {id: $projectId}, data: {modelSetupComplete: true}) {
13071325
modelSetupComplete
13081326
}
13091327
}"""
13101328

13111329
result = self.client.execute(query, {"projectId": self.uid})
1312-
1313-
self.update(
1314-
model_setup_complete=result["project"]["modelSetupComplete"])
1315-
return result["project"]["modelSetupComplete"]
1330+
self.model_setup_complete = result["setProjectModelSetupComplete"][
1331+
"modelSetupComplete"]
1332+
return result["setProjectModelSetupComplete"]["modelSetupComplete"]
13161333

13171334
def set_labeling_parameter_overrides(
13181335
self, data: List[LabelingParameterOverrideInput]) -> bool:

libs/labelbox/tests/integration/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ def chat_evaluation_ontology(client, rand_gen):
407407

408408

409409
@pytest.fixture
410-
def chat_evaluation_project_create_dataset(client, rand_gen):
410+
def live_chat_evaluation_project_with_new_dataset(client, rand_gen):
411411
project_name = f"test-model-evaluation-project-{rand_gen(str)}"
412412
dataset_name = f"test-model-evaluation-dataset-{rand_gen(str)}"
413413
project = client.create_model_evaluation_project(name=project_name,

libs/labelbox/tests/integration/test_chat_evaluation_ontology_project.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
def test_create_chat_evaluation_ontology_project(
88
client, chat_evaluation_ontology,
9-
chat_evaluation_project_create_dataset, conversation_data_row,
9+
live_chat_evaluation_project_with_new_dataset, conversation_data_row,
1010
rand_gen):
1111
ontology = chat_evaluation_ontology
1212

@@ -23,7 +23,7 @@ def test_create_chat_evaluation_ontology_project(
2323
assert classification.schema_id
2424
assert classification.feature_schema_id
2525

26-
project = chat_evaluation_project_create_dataset
26+
project = live_chat_evaluation_project_with_new_dataset
2727
assert project.model_setup_complete is None
2828

2929
project.setup_editor(ontology)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import pytest
2+
3+
from labelbox.exceptions import LabelboxError, OperationNotAllowedException
4+
5+
6+
def test_live_chat_evaluation_project(
7+
live_chat_evaluation_project_with_new_dataset, model_config):
8+
9+
project = live_chat_evaluation_project_with_new_dataset
10+
11+
project.set_project_model_setup_complete()
12+
assert bool(project.model_setup_complete) is True
13+
14+
with pytest.raises(
15+
expected_exception=LabelboxError,
16+
match=
17+
"Cannot create model config for project because model setup is complete"
18+
):
19+
project.add_model_config(model_config.uid)
20+
21+
22+
def test_offline_chat_evaluation_project(offline_chat_evaluation_project,
23+
model_config):
24+
25+
project = offline_chat_evaluation_project
26+
27+
with pytest.raises(
28+
expected_exception=OperationNotAllowedException,
29+
match=
30+
"Only live model chat evaluation projects can complete model setup"
31+
):
32+
project.set_project_model_setup_complete()
33+
34+
35+
def test_any_other_project(project, model_config):
36+
with pytest.raises(
37+
expected_exception=OperationNotAllowedException,
38+
match=
39+
"Only live model chat evaluation projects can complete model setup"
40+
):
41+
project.set_project_model_setup_complete()

0 commit comments

Comments
 (0)