refactor(workflow): unify all enum classes in one file and restructure workflow node type definitions

This commit is contained in:
mengyonghao
2025-12-19 15:43:56 +08:00
committed by 谢俊男
parent 4e0c5ed3c1
commit d12b1e4a51
5 changed files with 52 additions and 59 deletions

View File

@@ -4,13 +4,14 @@
提供各种类型的节点实现,用于工作流执行。 提供各种类型的节点实现,用于工作流执行。
""" """
from app.core.workflow.nodes.base_node import BaseNode, WorkflowState
from app.core.workflow.nodes.llm import LLMNode
from app.core.workflow.nodes.agent import AgentNode from app.core.workflow.nodes.agent import AgentNode
from app.core.workflow.nodes.transform import TransformNode from app.core.workflow.nodes.base_node import BaseNode, WorkflowState
from app.core.workflow.nodes.start import StartNode
from app.core.workflow.nodes.end import EndNode from app.core.workflow.nodes.end import EndNode
from app.core.workflow.nodes.node_factory import NodeFactory from app.core.workflow.nodes.if_else import IfElseNode
from app.core.workflow.nodes.llm import LLMNode
from app.core.workflow.nodes.node_factory import NodeFactory, WorkflowNode
from app.core.workflow.nodes.start import StartNode
from app.core.workflow.nodes.transform import TransformNode
__all__ = [ __all__ = [
"BaseNode", "BaseNode",
@@ -18,7 +19,9 @@ __all__ = [
"LLMNode", "LLMNode",
"AgentNode", "AgentNode",
"TransformNode", "TransformNode",
"IfElseNode",
"StartNode", "StartNode",
"EndNode", "EndNode",
"NodeFactory", "NodeFactory",
"WorkflowNode"
] ]

View File

@@ -1,13 +1,4 @@
from enum import StrEnum from enum import StrEnum
from typing import Union
from app.core.workflow.nodes.base_node import BaseNode
from app.core.workflow.nodes.if_else import IfElseNode
from app.core.workflow.nodes.llm import LLMNode
from app.core.workflow.nodes.agent import AgentNode
from app.core.workflow.nodes.transform import TransformNode
from app.core.workflow.nodes.start import StartNode
from app.core.workflow.nodes.end import EndNode
class NodeType(StrEnum): class NodeType(StrEnum):
@@ -25,12 +16,21 @@ class NodeType(StrEnum):
AGENT = "agent" AGENT = "agent"
WorkflowNode = Union[ class ComparisonOperator(StrEnum):
BaseNode, EMPTY = "empty"
StartNode, NOT_EMPTY = "not_empty"
EndNode, CONTAINS = "contains"
LLMNode, NOT_CONTAINS = "not_contains"
IfElseNode, START_WITH = "startwith"
AgentNode, END_WITH = "endwith"
TransformNode, EQ = "eq"
] NE = "ne"
LT = "lt"
LE = "le"
GT = "gt"
GE = "ge"
class LogicOperator(StrEnum):
AND = "and"
OR = "or"

View File

@@ -1,27 +1,8 @@
"""Condition Configuration""" """Condition Configuration"""
from pydantic import Field, BaseModel, field_validator from pydantic import Field, BaseModel, field_validator
from enum import StrEnum
from app.core.workflow.nodes.base_config import BaseNodeConfig from app.core.workflow.nodes.base_config import BaseNodeConfig
from app.core.workflow.nodes.enums import ComparisonOperator, LogicOperator
class LogicOperator(StrEnum):
AND = "and"
OR = "or"
class ComparisonOperator(StrEnum):
EMPTY = "empty"
NOT_EMPTY = "not_empty"
CONTAINS = "contains"
NOT_CONTAINS = "not_contains"
START_WITH = "startwith"
END_WITH = "endwith"
EQ = "eq"
NE = "ne"
LT = "lt"
LE = "le"
GT = "gt"
GE = "ge"
class ConditionDetail(BaseModel): class ConditionDetail(BaseModel):
@@ -77,7 +58,7 @@ class IfElseNodeConfig(BaseNodeConfig):
{ {
"logical_operator": "and", "logical_operator": "and",
"conditions": [ "conditions": [
{ [
{ {
"left": "node.userinput.message", "left": "node.userinput.message",
"comparison_operator": "eq", "comparison_operator": "eq",
@@ -88,14 +69,14 @@ class IfElseNodeConfig(BaseNodeConfig):
"comparison_operator": "eq", "comparison_operator": "eq",
"right": "True" "right": "True"
} }
} ]
] ]
}, },
# CASE1 / ELIF Branch # CASE1 / ELIF Branch
{ {
"logical_operator": "or", "logical_operator": "or",
"conditions": [ "conditions": [
{ [
{ {
"left": "node.userinput.test", "left": "node.userinput.test",
"comparison_operator": "eq", "comparison_operator": "eq",
@@ -106,7 +87,7 @@ class IfElseNodeConfig(BaseNodeConfig):
"comparison_operator": "contains", "comparison_operator": "contains",
"right": "'123'" "right": "'123'"
} }
} ]
] ]
} }
# CASE3 / ELSE Branch # CASE3 / ELSE Branch

View File

@@ -1,11 +1,10 @@
import logging import logging
from typing import Any from typing import Any
from simpleeval import NameNotDefined, InvalidExpression
from app.core.workflow.nodes import BaseNode, WorkflowState from app.core.workflow.nodes import BaseNode, WorkflowState
from app.core.workflow.nodes.enums import ComparisonOperator
from app.core.workflow.nodes.if_else import IfElseNodeConfig from app.core.workflow.nodes.if_else import IfElseNodeConfig
from app.core.workflow.nodes.if_else.config import LogicOperator, ConditionDetail, ComparisonOperator from app.core.workflow.nodes.if_else.config import ConditionDetail
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@@ -5,19 +5,29 @@
""" """
import logging import logging
from typing import Any from typing import Any, Union
from app.core.workflow.nodes.agent import AgentNode
from app.core.workflow.nodes.base_node import BaseNode from app.core.workflow.nodes.base_node import BaseNode
from app.core.workflow.nodes.enums import NodeType, WorkflowNode from app.core.workflow.nodes.end import EndNode
from app.core.workflow.nodes.enums import NodeType
from app.core.workflow.nodes.if_else import IfElseNode from app.core.workflow.nodes.if_else import IfElseNode
from app.core.workflow.nodes.llm import LLMNode from app.core.workflow.nodes.llm import LLMNode
from app.core.workflow.nodes.agent import AgentNode
from app.core.workflow.nodes.transform import TransformNode
from app.core.workflow.nodes.start import StartNode from app.core.workflow.nodes.start import StartNode
from app.core.workflow.nodes.end import EndNode from app.core.workflow.nodes.transform import TransformNode
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
WorkflowNode = Union[
BaseNode,
StartNode,
EndNode,
LLMNode,
IfElseNode,
AgentNode,
TransformNode,
]
class NodeFactory: class NodeFactory:
"""节点工厂 """节点工厂
@@ -54,9 +64,9 @@ class NodeFactory:
@classmethod @classmethod
def create_node( def create_node(
cls, cls,
node_config: dict[str, Any], node_config: dict[str, Any],
workflow_config: dict[str, Any] workflow_config: dict[str, Any]
) -> WorkflowNode | None: ) -> WorkflowNode | None:
"""创建节点实例 """创建节点实例