diff --git a/airflow-core/src/airflow/ui/src/components/Graph/useGraphLayout.ts b/airflow-core/src/airflow/ui/src/components/Graph/useGraphLayout.ts index 9c74318db75f2..d09455e08b0e6 100644 --- a/airflow-core/src/airflow/ui/src/components/Graph/useGraphLayout.ts +++ b/airflow-core/src/airflow/ui/src/components/Graph/useGraphLayout.ts @@ -167,6 +167,8 @@ const generateElkGraph = ({ } if (!Boolean(isOpen) && node.children !== undefined) { + const seenEdges = new Set(); + filteredEdges = filteredEdges // Filter out internal group edges .filter((fe) => !(childIds.includes(fe.source_id) && childIds.includes(fe.target_id))) @@ -175,7 +177,18 @@ const generateElkGraph = ({ ...fe, source_id: childIds.includes(fe.source_id) ? node.id : fe.source_id, target_id: childIds.includes(fe.target_id) ? node.id : fe.target_id, - })); + })) + // Deduplicate edges based on source_id and target_id composite + .filter((fe) => { + const edgeKey = `${fe.source_id}-${fe.target_id}`; + + if (seenEdges.has(edgeKey)) { + return false; + } + seenEdges.add(edgeKey); + + return true; + }); closedGroupIds.push(node.id); }