Skip to content

Commit 0c9b1d6

Browse files
committed
Add workflow management API - Resolves PLT-2503
1 parent 47a1eb6 commit 0c9b1d6

24 files changed

+7533
-0
lines changed

libs/labelbox/src/labelbox/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,4 @@
101101
from labelbox.schema.taskstatus import TaskStatus
102102
from labelbox.schema.api_key import ApiKey
103103
from labelbox.schema.timeunit import TimeUnit
104+
from labelbox.schema.workflow import ProjectWorkflow

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
ProjectOverview,
6060
ProjectOverviewDetailed,
6161
)
62+
from labelbox.schema.workflow import ProjectWorkflow
6263
from labelbox.schema.resource_tag import ResourceTag
6364
from labelbox.schema.task import Task
6465
from labelbox.schema.task_queue import TaskQueue
@@ -1702,6 +1703,45 @@ def get_labeling_service_dashboard(self) -> LabelingServiceDashboard:
17021703
"""
17031704
return LabelingServiceDashboard.get(self.client, self.uid)
17041705

1706+
def get_workflow(self):
1707+
"""Get the workflow configuration for this project.
1708+
1709+
Workflows are automatically created when projects are created.
1710+
1711+
Returns:
1712+
ProjectWorkflow: A ProjectWorkflow object containing the project workflow information.
1713+
"""
1714+
warnings.warn(
1715+
"Workflow Management is currently in alpha and its behavior may change in future releases.",
1716+
)
1717+
1718+
return ProjectWorkflow.get_workflow(self.client, self.uid)
1719+
1720+
def clone_workflow_from(self, source_project_id: str) -> "ProjectWorkflow":
1721+
"""Clones a workflow from another project to this project.
1722+
1723+
Args:
1724+
source_project_id (str): The ID of the project to clone the workflow from
1725+
1726+
Returns:
1727+
ProjectWorkflow: The cloned workflow in this project
1728+
"""
1729+
warnings.warn(
1730+
"Workflow Management is currently in alpha and its behavior may change in future releases.",
1731+
)
1732+
1733+
# Get the source workflow
1734+
source_workflow = ProjectWorkflow.get_workflow(
1735+
self.client, source_project_id
1736+
)
1737+
1738+
# Use copy_workflow_structure to clone the workflow
1739+
return ProjectWorkflow.copy_workflow_structure(
1740+
source_workflow=source_workflow,
1741+
target_client=self.client,
1742+
target_project_id=self.uid,
1743+
)
1744+
17051745

17061746
class ProjectMember(DbObject):
17071747
user = Relationship.ToOne("User", cache=True)
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
"""
2+
This module contains classes for managing project workflows in Labelbox.
3+
It provides strongly-typed classes for nodes, edges, and workflow configuration.
4+
"""
5+
6+
# Import all workflow classes to expose them at the package level
7+
from labelbox.schema.workflow.enums import (
8+
WorkflowDefinitionId,
9+
NodeOutput,
10+
NodeInput,
11+
MatchFilters,
12+
Scope,
13+
FilterField,
14+
FilterOperator,
15+
IndividualAssignment,
16+
)
17+
from labelbox.schema.workflow.base import (
18+
BaseWorkflowNode,
19+
NodePosition,
20+
)
21+
22+
# Import nodes from the nodes subdirectory
23+
from labelbox.schema.workflow.nodes import (
24+
InitialLabelingNode,
25+
InitialReworkNode,
26+
ReviewNode,
27+
ReworkNode,
28+
DoneNode,
29+
CustomReworkNode,
30+
UnknownWorkflowNode,
31+
LogicNode,
32+
AutoQANode,
33+
)
34+
35+
from labelbox.schema.workflow.edges import (
36+
WorkflowEdge,
37+
WorkflowEdgeFactory,
38+
)
39+
from labelbox.schema.workflow.graph import ProjectWorkflowGraph
40+
41+
# Import from monolithic workflow.py file
42+
from labelbox.schema.workflow.workflow import ProjectWorkflow, NodeType
43+
44+
# Import from monolithic project_filter.py file
45+
from labelbox.schema.workflow.project_filter import (
46+
ProjectWorkflowFilter,
47+
created_by,
48+
labeled_by,
49+
annotation,
50+
dataset,
51+
issue_category,
52+
sample,
53+
metadata,
54+
model_prediction,
55+
natural_language,
56+
labeling_time,
57+
review_time,
58+
labeled_at,
59+
consensus_average,
60+
batch,
61+
feature_consensus_average,
62+
MetadataCondition,
63+
ModelPredictionCondition,
64+
m_condition,
65+
mp_condition,
66+
convert_to_api_format,
67+
)
68+
69+
# Re-export key classes at the module level
70+
__all__ = [
71+
# Core workflow components
72+
"WorkflowDefinitionId",
73+
"NodeOutput",
74+
"NodeInput",
75+
"MatchFilters",
76+
"Scope",
77+
"FilterField",
78+
"FilterOperator",
79+
"IndividualAssignment",
80+
"BaseWorkflowNode",
81+
"NodePosition",
82+
"InitialLabelingNode",
83+
"InitialReworkNode",
84+
"ReviewNode",
85+
"ReworkNode",
86+
"LogicNode",
87+
"DoneNode",
88+
"CustomReworkNode",
89+
"AutoQANode",
90+
"UnknownWorkflowNode",
91+
"WorkflowEdge",
92+
"WorkflowEdgeFactory",
93+
"ProjectWorkflow",
94+
"NodeType",
95+
"ProjectWorkflowGraph",
96+
"ProjectWorkflowFilter",
97+
# Filter construction functions
98+
"created_by",
99+
"labeled_by",
100+
"annotation",
101+
"sample",
102+
"dataset",
103+
"issue_category",
104+
"model_prediction",
105+
"natural_language",
106+
"labeled_at",
107+
"labeling_time",
108+
"review_time",
109+
"consensus_average",
110+
"batch",
111+
"feature_consensus_average",
112+
"metadata",
113+
"MetadataCondition",
114+
"ModelPredictionCondition",
115+
"m_condition",
116+
"mp_condition",
117+
# Utility functions
118+
"convert_to_api_format",
119+
]
120+
121+
# Define a mapping of node types for workflow creation
122+
NODE_TYPE_MAP = {
123+
WorkflowDefinitionId.InitialLabelingTask: InitialLabelingNode,
124+
WorkflowDefinitionId.InitialReworkTask: InitialReworkNode,
125+
WorkflowDefinitionId.ReviewTask: ReviewNode,
126+
WorkflowDefinitionId.SendToRework: ReworkNode,
127+
WorkflowDefinitionId.Logic: LogicNode,
128+
WorkflowDefinitionId.Done: DoneNode,
129+
WorkflowDefinitionId.CustomReworkTask: CustomReworkNode,
130+
WorkflowDefinitionId.AutoQA: AutoQANode,
131+
WorkflowDefinitionId.Unknown: UnknownWorkflowNode,
132+
}

0 commit comments

Comments
 (0)