From 3f143aea5948b9e3bd0e22817d24943aad34f667 Mon Sep 17 00:00:00 2001 From: -LAN- Date: Thu, 17 Jul 2025 19:43:38 +0800 Subject: [PATCH] refactor(nodes): rename `from_dict` to `init_node_data`. Signed-off-by: -LAN- --- .../workflow/graph_engine/graph_engine.py | 2 +- api/core/workflow/nodes/agent/agent_node.py | 2 +- api/core/workflow/nodes/answer/answer_node.py | 2 +- api/core/workflow/nodes/base/node.py | 2 +- api/core/workflow/nodes/code/code_node.py | 2 +- .../workflow/nodes/document_extractor/node.py | 2 +- api/core/workflow/nodes/end/end_node.py | 2 +- api/core/workflow/nodes/http_request/node.py | 2 +- .../workflow/nodes/if_else/if_else_node.py | 2 +- .../nodes/iteration/iteration_node.py | 2 +- .../nodes/iteration/iteration_start_node.py | 2 +- .../knowledge_retrieval_node.py | 2 +- api/core/workflow/nodes/list_operator/node.py | 2 +- api/core/workflow/nodes/llm/node.py | 26 ++++++++++--------- api/core/workflow/nodes/loop/loop_end_node.py | 2 +- api/core/workflow/nodes/loop/loop_node.py | 2 +- .../workflow/nodes/loop/loop_start_node.py | 2 +- .../parameter_extractor_node.py | 2 +- .../question_classifier_node.py | 2 +- api/core/workflow/nodes/start/start_node.py | 2 +- .../template_transform_node.py | 2 +- api/core/workflow/nodes/tool/tool_node.py | 11 +++++--- .../variable_aggregator_node.py | 2 +- .../nodes/variable_assigner/v1/node.py | 2 +- .../nodes/variable_assigner/v2/node.py | 2 +- 25 files changed, 44 insertions(+), 39 deletions(-) diff --git a/api/core/workflow/graph_engine/graph_engine.py b/api/core/workflow/graph_engine/graph_engine.py index c582778a58..a97443bd6f 100644 --- a/api/core/workflow/graph_engine/graph_engine.py +++ b/api/core/workflow/graph_engine/graph_engine.py @@ -276,7 +276,7 @@ class GraphEngine: previous_node_id=previous_node_id, thread_pool_id=self.thread_pool_id, ) - node_instance.from_dict(node_config.get("data", {})) + node_instance.init_node_data(node_config.get("data", {})) try: # run node generator = self._run_node( diff --git a/api/core/workflow/nodes/agent/agent_node.py b/api/core/workflow/nodes/agent/agent_node.py index 9e727f7a49..fc8e69f9f1 100644 --- a/api/core/workflow/nodes/agent/agent_node.py +++ b/api/core/workflow/nodes/agent/agent_node.py @@ -65,7 +65,7 @@ class AgentNode(BaseNode): _node_type = NodeType.AGENT node_data: AgentNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = AgentNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/answer/answer_node.py b/api/core/workflow/nodes/answer/answer_node.py index f9e1bc4b04..1ae5fddbc7 100644 --- a/api/core/workflow/nodes/answer/answer_node.py +++ b/api/core/workflow/nodes/answer/answer_node.py @@ -21,7 +21,7 @@ class AnswerNode(BaseNode): node_data: AnswerNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = AnswerNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/base/node.py b/api/core/workflow/nodes/base/node.py index 467c63959e..8bb67f9840 100644 --- a/api/core/workflow/nodes/base/node.py +++ b/api/core/workflow/nodes/base/node.py @@ -50,7 +50,7 @@ class BaseNode: self.node_id = node_id @abstractmethod - def from_dict(self, data: Mapping[str, Any]) -> None: ... + def init_node_data(self, data: Mapping[str, Any]) -> None: ... @abstractmethod def _run(self) -> NodeRunResult | Generator[Union[NodeEvent, "InNodeEvent"], None, None]: diff --git a/api/core/workflow/nodes/code/code_node.py b/api/core/workflow/nodes/code/code_node.py index 97a99b57b4..17458d21f3 100644 --- a/api/core/workflow/nodes/code/code_node.py +++ b/api/core/workflow/nodes/code/code_node.py @@ -26,7 +26,7 @@ class CodeNode(BaseNode): node_data: CodeNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = CodeNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/document_extractor/node.py b/api/core/workflow/nodes/document_extractor/node.py index d62a1c6cf2..f02ea5c033 100644 --- a/api/core/workflow/nodes/document_extractor/node.py +++ b/api/core/workflow/nodes/document_extractor/node.py @@ -46,7 +46,7 @@ class DocumentExtractorNode(BaseNode): node_data: DocumentExtractorNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = DocumentExtractorNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/end/end_node.py b/api/core/workflow/nodes/end/end_node.py index c0d7e084c2..745d8f898a 100644 --- a/api/core/workflow/nodes/end/end_node.py +++ b/api/core/workflow/nodes/end/end_node.py @@ -13,7 +13,7 @@ class EndNode(BaseNode): node_data: EndNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = EndNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/http_request/node.py b/api/core/workflow/nodes/http_request/node.py index b7f248e968..a5e1ef22d7 100644 --- a/api/core/workflow/nodes/http_request/node.py +++ b/api/core/workflow/nodes/http_request/node.py @@ -37,7 +37,7 @@ class HttpRequestNode(BaseNode): node_data: HttpRequestNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = HttpRequestNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/if_else/if_else_node.py b/api/core/workflow/nodes/if_else/if_else_node.py index 0e36a2a135..6cbe7aeb84 100644 --- a/api/core/workflow/nodes/if_else/if_else_node.py +++ b/api/core/workflow/nodes/if_else/if_else_node.py @@ -18,7 +18,7 @@ class IfElseNode(BaseNode): node_data: IfElseNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = IfElseNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/iteration/iteration_node.py b/api/core/workflow/nodes/iteration/iteration_node.py index d3ee642e81..7942316816 100644 --- a/api/core/workflow/nodes/iteration/iteration_node.py +++ b/api/core/workflow/nodes/iteration/iteration_node.py @@ -65,7 +65,7 @@ class IterationNode(BaseNode): node_data: IterationNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = IterationNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/iteration/iteration_start_node.py b/api/core/workflow/nodes/iteration/iteration_start_node.py index d01382e37e..ffafc6dcc2 100644 --- a/api/core/workflow/nodes/iteration/iteration_start_node.py +++ b/api/core/workflow/nodes/iteration/iteration_start_node.py @@ -17,7 +17,7 @@ class IterationStartNode(BaseNode): node_data: IterationStartNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = IterationStartNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py b/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py index ef617cc878..bb19005f57 100644 --- a/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py +++ b/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py @@ -124,7 +124,7 @@ class KnowledgeRetrievalNode(BaseNode): ) self._llm_file_saver = llm_file_saver - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = KnowledgeRetrievalNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/list_operator/node.py b/api/core/workflow/nodes/list_operator/node.py index cc4393769b..00c9a070b9 100644 --- a/api/core/workflow/nodes/list_operator/node.py +++ b/api/core/workflow/nodes/list_operator/node.py @@ -18,7 +18,7 @@ class ListOperatorNode(BaseNode): node_data: ListOperatorNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = ListOperatorNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/llm/node.py b/api/core/workflow/nodes/llm/node.py index 80587466fb..e08a207a61 100644 --- a/api/core/workflow/nodes/llm/node.py +++ b/api/core/workflow/nodes/llm/node.py @@ -137,7 +137,7 @@ class LLMNode(BaseNode): ) self._llm_file_saver = llm_file_saver - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = LLMNodeData(**data) @classmethod @@ -788,10 +788,12 @@ class LLMNode(BaseNode): *, graph_config: Mapping[str, Any], node_id: str, - node_data: LLMNodeData, + node_data: Mapping[str, Any], ) -> Mapping[str, Sequence[str]]: - prompt_template = node_data.prompt_template - + # Create typed NodeData from dict + typed_node_data = LLMNodeData(**node_data) + + prompt_template = typed_node_data.prompt_template variable_selectors = [] if isinstance(prompt_template, list) and all( isinstance(prompt, LLMNodeChatModelMessage) for prompt in prompt_template @@ -811,7 +813,7 @@ class LLMNode(BaseNode): for variable_selector in variable_selectors: variable_mapping[variable_selector.variable] = variable_selector.value_selector - memory = node_data.memory + memory = typed_node_data.memory if memory and memory.query_prompt_template: query_variable_selectors = VariableTemplateParser( template=memory.query_prompt_template @@ -819,16 +821,16 @@ class LLMNode(BaseNode): for variable_selector in query_variable_selectors: variable_mapping[variable_selector.variable] = variable_selector.value_selector - if node_data.context.enabled: - variable_mapping["#context#"] = node_data.context.variable_selector + if typed_node_data.context.enabled: + variable_mapping["#context#"] = typed_node_data.context.variable_selector - if node_data.vision.enabled: - variable_mapping["#files#"] = node_data.vision.configs.variable_selector + if typed_node_data.vision.enabled: + variable_mapping["#files#"] = typed_node_data.vision.configs.variable_selector - if node_data.memory: + if typed_node_data.memory: variable_mapping["#sys.query#"] = ["sys", SystemVariableKey.QUERY.value] - if node_data.prompt_config: + if typed_node_data.prompt_config: enable_jinja = False if isinstance(prompt_template, list): @@ -841,7 +843,7 @@ class LLMNode(BaseNode): enable_jinja = True if enable_jinja: - for variable_selector in node_data.prompt_config.jinja2_variables or []: + for variable_selector in typed_node_data.prompt_config.jinja2_variables or []: variable_mapping[variable_selector.variable] = variable_selector.value_selector variable_mapping = {node_id + "." + key: value for key, value in variable_mapping.items()} diff --git a/api/core/workflow/nodes/loop/loop_end_node.py b/api/core/workflow/nodes/loop/loop_end_node.py index 2657165d61..53856c17c4 100644 --- a/api/core/workflow/nodes/loop/loop_end_node.py +++ b/api/core/workflow/nodes/loop/loop_end_node.py @@ -17,7 +17,7 @@ class LoopEndNode(BaseNode): node_data: LoopEndNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = LoopEndNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/loop/loop_node.py b/api/core/workflow/nodes/loop/loop_node.py index 004ec8bdf4..269f402b5f 100644 --- a/api/core/workflow/nodes/loop/loop_node.py +++ b/api/core/workflow/nodes/loop/loop_node.py @@ -52,7 +52,7 @@ class LoopNode(BaseNode): node_data: LoopNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = LoopNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/loop/loop_start_node.py b/api/core/workflow/nodes/loop/loop_start_node.py index 93db39ab12..9362b4a38b 100644 --- a/api/core/workflow/nodes/loop/loop_start_node.py +++ b/api/core/workflow/nodes/loop/loop_start_node.py @@ -17,7 +17,7 @@ class LoopStartNode(BaseNode): node_data: LoopStartNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = LoopStartNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/parameter_extractor/parameter_extractor_node.py b/api/core/workflow/nodes/parameter_extractor/parameter_extractor_node.py index 0fa7d0147e..6229b1bad0 100644 --- a/api/core/workflow/nodes/parameter_extractor/parameter_extractor_node.py +++ b/api/core/workflow/nodes/parameter_extractor/parameter_extractor_node.py @@ -95,7 +95,7 @@ class ParameterExtractorNode(BaseNode): node_data: ParameterExtractorNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = ParameterExtractorNodeData(**data) _model_instance: Optional[ModelInstance] = None diff --git a/api/core/workflow/nodes/question_classifier/question_classifier_node.py b/api/core/workflow/nodes/question_classifier/question_classifier_node.py index 93ea7c9ca4..b59187f279 100644 --- a/api/core/workflow/nodes/question_classifier/question_classifier_node.py +++ b/api/core/workflow/nodes/question_classifier/question_classifier_node.py @@ -81,7 +81,7 @@ class QuestionClassifierNode(BaseNode): ) self._llm_file_saver = llm_file_saver - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = QuestionClassifierNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/start/start_node.py b/api/core/workflow/nodes/start/start_node.py index 49efdfb317..2fc3dcb363 100644 --- a/api/core/workflow/nodes/start/start_node.py +++ b/api/core/workflow/nodes/start/start_node.py @@ -14,7 +14,7 @@ class StartNode(BaseNode): node_data: StartNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = StartNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/template_transform/template_transform_node.py b/api/core/workflow/nodes/template_transform/template_transform_node.py index 4ca1eb8a94..df0692ca3f 100644 --- a/api/core/workflow/nodes/template_transform/template_transform_node.py +++ b/api/core/workflow/nodes/template_transform/template_transform_node.py @@ -17,7 +17,7 @@ class TemplateTransformNode(BaseNode): node_data: TemplateTransformNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = TemplateTransformNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/tool/tool_node.py b/api/core/workflow/nodes/tool/tool_node.py index aa1fa0c282..a43267b0fd 100644 --- a/api/core/workflow/nodes/tool/tool_node.py +++ b/api/core/workflow/nodes/tool/tool_node.py @@ -44,7 +44,7 @@ class ToolNode(BaseNode): node_data: ToolNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = ToolNodeData(**data) @classmethod @@ -373,7 +373,7 @@ class ToolNode(BaseNode): *, graph_config: Mapping[str, Any], node_id: str, - node_data: ToolNodeData, + node_data: Mapping[str, Any], ) -> Mapping[str, Sequence[str]]: """ Extract variable selector to variable mapping @@ -382,9 +382,12 @@ class ToolNode(BaseNode): :param node_data: node data :return: """ + # Create typed NodeData from dict + typed_node_data = ToolNodeData(**node_data) + result = {} - for parameter_name in node_data.tool_parameters: - input = node_data.tool_parameters[parameter_name] + for parameter_name in typed_node_data.tool_parameters: + input = typed_node_data.tool_parameters[parameter_name] if input.type == "mixed": assert isinstance(input.value, str) selectors = VariableTemplateParser(input.value).extract_variable_selectors() diff --git a/api/core/workflow/nodes/variable_aggregator/variable_aggregator_node.py b/api/core/workflow/nodes/variable_aggregator/variable_aggregator_node.py index 08ec38e734..b8448d2333 100644 --- a/api/core/workflow/nodes/variable_aggregator/variable_aggregator_node.py +++ b/api/core/workflow/nodes/variable_aggregator/variable_aggregator_node.py @@ -14,7 +14,7 @@ class VariableAggregatorNode(BaseNode): node_data: VariableAssignerNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = VariableAssignerNodeData(**data) @classmethod diff --git a/api/core/workflow/nodes/variable_assigner/v1/node.py b/api/core/workflow/nodes/variable_assigner/v1/node.py index 899372f5e5..31db41497b 100644 --- a/api/core/workflow/nodes/variable_assigner/v1/node.py +++ b/api/core/workflow/nodes/variable_assigner/v1/node.py @@ -28,7 +28,7 @@ class VariableAssignerNode(BaseNode): node_data: VariableAssignerData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = VariableAssignerData(**data) def __init__( diff --git a/api/core/workflow/nodes/variable_assigner/v2/node.py b/api/core/workflow/nodes/variable_assigner/v2/node.py index daa962904b..f367ae664b 100644 --- a/api/core/workflow/nodes/variable_assigner/v2/node.py +++ b/api/core/workflow/nodes/variable_assigner/v2/node.py @@ -59,7 +59,7 @@ class VariableAssignerNode(BaseNode): node_data: VariableAssignerNodeData - def from_dict(self, data: Mapping[str, Any]) -> None: + def init_node_data(self, data: Mapping[str, Any]) -> None: self.node_data = VariableAssignerNodeData(**data) def _conv_var_updater_factory(self) -> ConversationVariableUpdater: