From 5c1a543fa3a78ee117549e2534ddfaf4688291e7 Mon Sep 17 00:00:00 2001 From: fisher Date: Tue, 2 Dec 2025 14:48:10 +0800 Subject: [PATCH 1/3] fix(api): make app list robust when workflow graph nodes missing --- api/controllers/console/app/app.py | 7 +++++-- api/models/workflow.py | 27 ++++++++------------------- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/api/controllers/console/app/app.py b/api/controllers/console/app/app.py index e6687de03e..e47f5397bf 100644 --- a/api/controllers/console/app/app.py +++ b/api/controllers/console/app/app.py @@ -242,8 +242,11 @@ class AppListApi(Resource): NodeType.TRIGGER_PLUGIN, } for workflow in draft_workflows: - for _, node_data in workflow.walk_nodes(): - if node_data.get("type") in trigger_node_types: + graph = workflow.graph_dict + nodes = graph.get("nodes", []) + for node in nodes: + node_type = node.get("data", {}).get("type") + if node_type in trigger_node_types: draft_trigger_app_ids.add(str(workflow.app_id)) break diff --git a/api/models/workflow.py b/api/models/workflow.py index f206a6a870..62e75b3efa 100644 --- a/api/models/workflow.py +++ b/api/models/workflow.py @@ -235,13 +235,7 @@ class Workflow(Base): # bug the node's id, title, and its data as a dict. """ workflow_graph = self.graph_dict - - if not workflow_graph: - raise WorkflowDataError(f"workflow graph not found, workflow_id={self.id}") - - nodes = workflow_graph.get("nodes") - if not nodes: - raise WorkflowDataError("nodes not found in workflow graph") + nodes = workflow_graph.get("nodes", []) try: node_config: dict[str, Any] = next(filter(lambda node: node["id"] == node_id, nodes)) @@ -347,17 +341,16 @@ class Workflow(Base): # bug For specific node type, refer to `core.workflow.nodes` """ graph_dict = self.graph_dict - if "nodes" not in graph_dict: - raise WorkflowDataError("nodes not found in workflow graph") + nodes = graph_dict.get("nodes", []) if specific_node_type: yield from ( - (node["id"], node["data"]) - for node in graph_dict["nodes"] - if node["data"]["type"] == specific_node_type.value + (node["id"], node.get("data", {})) + for node in nodes + if node.get("data", {}).get("type") == specific_node_type.value ) else: - yield from ((node["id"], node["data"]) for node in graph_dict["nodes"]) + yield from ((node["id"], node.get("data", {})) for node in nodes) def user_input_form(self, to_old_structure: bool = False) -> list[Any]: # get start node from graph @@ -365,13 +358,9 @@ class Workflow(Base): # bug return [] graph_dict = self.graph_dict - if "nodes" not in graph_dict: - return [] + nodes = graph_dict.get("nodes", []) - start_node = next( - (node for node in graph_dict["nodes"] if node["data"]["type"] == "start"), - None, - ) + start_node = next((node for node in nodes if node.get("data", {}).get("type") == "start"), None) if not start_node: return [] From 02a0b1ca872a10fb6f90930bed0576a3230245ce Mon Sep 17 00:00:00 2001 From: fisher Date: Tue, 2 Dec 2025 15:11:37 +0800 Subject: [PATCH 2/3] refactor(console): use walk_nodes for trigger detection; remove unused import --- api/controllers/console/app/app.py | 7 ++----- api/models/workflow.py | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/api/controllers/console/app/app.py b/api/controllers/console/app/app.py index 4bf311f2a3..4e25705da0 100644 --- a/api/controllers/console/app/app.py +++ b/api/controllers/console/app/app.py @@ -324,11 +324,8 @@ class AppListApi(Resource): NodeType.TRIGGER_PLUGIN, } for workflow in draft_workflows: - graph = workflow.graph_dict - nodes = graph.get("nodes", []) - for node in nodes: - node_type = node.get("data", {}).get("type") - if node_type in trigger_node_types: + for node_type in trigger_node_types: + if next(workflow.walk_nodes(node_type), None): draft_trigger_app_ids.add(str(workflow.app_id)) break diff --git a/api/models/workflow.py b/api/models/workflow.py index 693fa79703..0c4fbcfbbe 100644 --- a/api/models/workflow.py +++ b/api/models/workflow.py @@ -36,7 +36,7 @@ from factories.variable_factory import TypeMismatchError, build_segment_with_typ from libs.datetime_utils import naive_utc_now from libs.uuid_utils import uuidv7 -from ._workflow_exc import NodeNotFoundError, WorkflowDataError +from ._workflow_exc import NodeNotFoundError if TYPE_CHECKING: from .model import AppMode, UploadFile From ca215c6a73232dbfa3ac70b175cf7c594ac1ca6d Mon Sep 17 00:00:00 2001 From: Yeuoly <45712896+Yeuoly@users.noreply.github.com> Date: Tue, 2 Dec 2025 15:59:42 +0800 Subject: [PATCH 3/3] Update app.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- api/controllers/console/app/app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/controllers/console/app/app.py b/api/controllers/console/app/app.py index 4e25705da0..d6adacd84d 100644 --- a/api/controllers/console/app/app.py +++ b/api/controllers/console/app/app.py @@ -324,8 +324,8 @@ class AppListApi(Resource): NodeType.TRIGGER_PLUGIN, } for workflow in draft_workflows: - for node_type in trigger_node_types: - if next(workflow.walk_nodes(node_type), None): + for _, node_data in workflow.walk_nodes(): + if node_data.get("type") in trigger_node_types: draft_trigger_app_ids.add(str(workflow.app_id)) break