(nodes, edges)
| 706 | } |
| 707 | |
| 708 | export const getUpsertDetails = (nodes, edges) => { |
| 709 | const vsNodes = nodes.filter( |
| 710 | (node) => |
| 711 | node.data.category === 'Vector Stores' && !node.data.label.includes('Upsert') && !node.data.label.includes('Load Existing') |
| 712 | ) |
| 713 | const vsNodeIds = vsNodes.map((vs) => vs.data.id) |
| 714 | |
| 715 | const upsertNodes = [] |
| 716 | const seenVsNodeIds = [] |
| 717 | for (const edge of edges) { |
| 718 | if (vsNodeIds.includes(edge.source) || vsNodeIds.includes(edge.target)) { |
| 719 | const vsNode = vsNodes.find((node) => node.data.id === edge.source || node.data.id === edge.target) |
| 720 | if (!vsNode || seenVsNodeIds.includes(vsNode.data.id)) continue |
| 721 | seenVsNodeIds.push(vsNode.data.id) |
| 722 | |
| 723 | // Found Vector Store Node, proceed to find connected Document Loader node |
| 724 | let connectedDocs = [] |
| 725 | |
| 726 | if (vsNode.data.inputs.document) connectedDocs = [...new Set(vsNode.data.inputs.document)] |
| 727 | |
| 728 | if (connectedDocs.length) { |
| 729 | const innerNodes = [vsNode] |
| 730 | |
| 731 | if (vsNode.data.inputs.embeddings) { |
| 732 | const embeddingsId = vsNode.data.inputs.embeddings.replace(/{{|}}/g, '').split('.')[0] |
| 733 | innerNodes.push(nodes.find((node) => node.data.id === embeddingsId)) |
| 734 | } |
| 735 | |
| 736 | if (vsNode.data.inputs.recordManager) { |
| 737 | const recordManagerId = vsNode.data.inputs.recordManager.replace(/{{|}}/g, '').split('.')[0] |
| 738 | innerNodes.push(nodes.find((node) => node.data.id === recordManagerId)) |
| 739 | } |
| 740 | |
| 741 | for (const doc of connectedDocs) { |
| 742 | const docId = doc.replace(/{{|}}/g, '').split('.')[0] |
| 743 | const docNode = nodes.find((node) => node.data.id === docId) |
| 744 | if (docNode) innerNodes.push(docNode) |
| 745 | |
| 746 | // Found Document Loader Node, proceed to find connected Text Splitter node |
| 747 | if (docNode && docNode.data.inputs.textSplitter) { |
| 748 | const textSplitterId = docNode.data.inputs.textSplitter.replace(/{{|}}/g, '').split('.')[0] |
| 749 | const textSplitterNode = nodes.find((node) => node.data.id === textSplitterId) |
| 750 | if (textSplitterNode) innerNodes.push(textSplitterNode) |
| 751 | } |
| 752 | } |
| 753 | |
| 754 | upsertNodes.push({ |
| 755 | vectorNode: vsNode, |
| 756 | nodes: innerNodes.reverse() |
| 757 | }) |
| 758 | } |
| 759 | } |
| 760 | } |
| 761 | return upsertNodes |
| 762 | } |
| 763 | |
| 764 | export const rearrangeToolsOrdering = (newValues, sourceNodeId) => { |
| 765 | // RequestsGet and RequestsPost have to be in order before other tools |
no outgoing calls
no test coverage detected