Skip to content

Commit 67eddb9

Browse files
authored
Workflow cloning: Fix validation for some nodes (#2005)
1 parent 56abd9e commit 67eddb9

File tree

7 files changed

+21
-8
lines changed

7 files changed

+21
-8
lines changed

libs/labelbox/src/labelbox/schema/workflow/nodes/done_node.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import logging
44
from typing import Dict, List, Any, Optional
5-
from pydantic import Field, field_validator
5+
from pydantic import Field, field_validator, ConfigDict
66

77
from labelbox.schema.workflow.base import BaseWorkflowNode
88
from labelbox.schema.workflow.enums import (
@@ -57,6 +57,8 @@ class DoneNode(BaseWorkflowNode):
5757
and will not flow to any other nodes in the workflow.
5858
"""
5959

60+
model_config = ConfigDict(extra="ignore")
61+
6062
label: str = Field(default="Done", max_length=50)
6163
definition_id: WorkflowDefinitionId = Field(
6264
default=WorkflowDefinitionId.Done, frozen=True, alias="definitionId"

libs/labelbox/src/labelbox/schema/workflow/nodes/initial_labeling_node.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import logging
44
from typing import Dict, List, Any, Optional, Literal, Union
5-
from pydantic import Field, field_validator, model_validator
5+
from pydantic import Field, field_validator, model_validator, ConfigDict
66

77
from labelbox.schema.workflow.base import BaseWorkflowNode
88
from labelbox.schema.workflow.enums import (
@@ -59,6 +59,8 @@ class InitialLabelingNode(BaseWorkflowNode):
5959
and cannot have incoming connections from other nodes.
6060
"""
6161

62+
model_config = ConfigDict(extra="ignore")
63+
6264
label: str = Field(
6365
default="Initial labeling task", frozen=True, max_length=50
6466
)

libs/labelbox/src/labelbox/schema/workflow/nodes/initial_rework_node.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import logging
44
from typing import Dict, List, Any, Optional, Literal, Union
5-
from pydantic import Field, field_validator, model_validator
5+
from pydantic import Field, field_validator, model_validator, ConfigDict
66

77
from labelbox.schema.workflow.base import BaseWorkflowNode
88
from labelbox.schema.workflow.enums import (
@@ -66,6 +66,8 @@ class InitialReworkNode(BaseWorkflowNode):
6666
to ensure proper routing in the Labelbox platform.
6767
"""
6868

69+
model_config = ConfigDict(extra="ignore")
70+
6971
label: str = Field(
7072
default="Rework (all rejected)", frozen=True, max_length=50
7173
)

libs/labelbox/src/labelbox/schema/workflow/nodes/logic_node.py

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

77
import logging
88
from typing import Dict, List, Any, Optional, Literal
9-
from pydantic import Field, model_validator, field_validator
9+
from pydantic import Field, model_validator, field_validator, ConfigDict
1010

1111
from labelbox.schema.workflow.base import BaseWorkflowNode
1212
from labelbox.schema.workflow.enums import (
@@ -27,6 +27,7 @@
2727

2828

2929
class LogicNode(BaseWorkflowNode):
30+
model_config = ConfigDict(extra="ignore")
3031
"""Logic node. One or more instances possible. One input, two outputs (if/else)."""
3132

3233
label: str = Field(

libs/labelbox/src/labelbox/schema/workflow/nodes/review_node.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import logging
44
from typing import Dict, List, Any, Optional, Literal, Union
5-
from pydantic import Field, field_validator, model_validator
5+
from pydantic import Field, field_validator, model_validator, ConfigDict
66

77
from labelbox.schema.workflow.base import BaseWorkflowNode
88
from labelbox.schema.workflow.enums import (
@@ -69,6 +69,8 @@ class ReviewNode(BaseWorkflowNode):
6969
which default to "and" logic. This allows more flexible routing.
7070
"""
7171

72+
model_config = ConfigDict(extra="ignore")
73+
7274
label: str = Field(default="Review task", max_length=50)
7375
# For ReviewNode, filter_logic defaults to "or"
7476
filter_logic: Literal["and", "or"] = Field(

libs/labelbox/src/labelbox/schema/workflow/nodes/rework_node.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import logging
44
from typing import Dict, List, Any, Optional, Literal
5-
from pydantic import Field, field_validator
5+
from pydantic import Field, field_validator, ConfigDict
66

77
from labelbox.schema.workflow.base import BaseWorkflowNode
88
from labelbox.schema.workflow.enums import (
@@ -17,6 +17,7 @@
1717

1818

1919
class ReworkNode(BaseWorkflowNode):
20+
model_config = ConfigDict(extra="ignore")
2021
"""
2122
Terminal rework node for sending work back for corrections.
2223

libs/labelbox/src/labelbox/schema/workflow/workflow.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,10 +283,13 @@ def get_nodes(self) -> List[BaseWorkflowNode]:
283283
node_kwargs["config"] = node_data["config"]
284284

285285
if "customFields" in node_data:
286-
node_kwargs["customFields"] = node_data["customFields"]
286+
# Handle customFields being None by converting to empty dict
287+
custom_fields = node_data["customFields"]
288+
if custom_fields is None:
289+
custom_fields = {}
290+
node_kwargs["customFields"] = custom_fields
287291

288292
# Extract instructions from customFields if available
289-
custom_fields = node_data["customFields"]
290293
if (
291294
isinstance(custom_fields, dict)
292295
and "description" in custom_fields

0 commit comments

Comments
 (0)