Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

use-nodes-available-var-list.ts 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { useCallback } from 'react'
  2. import {
  3. useIsChatMode,
  4. useWorkflow,
  5. useWorkflowVariables,
  6. } from '@/app/components/workflow/hooks'
  7. import { BlockEnum, type Node, type NodeOutPutVar, type ValueSelector, type Var } from '@/app/components/workflow/types'
  8. type Params = {
  9. onlyLeafNodeVar?: boolean
  10. hideEnv?: boolean
  11. hideChatVar?: boolean
  12. filterVar: (payload: Var, selector: ValueSelector) => boolean
  13. passedInAvailableNodes?: Node[]
  14. }
  15. const getNodeInfo = (nodeId: string, nodes: Node[]) => {
  16. const allNodes = nodes
  17. const node = allNodes.find(n => n.id === nodeId)
  18. const isInIteration = !!node?.data.isInIteration
  19. const isInLoop = !!node?.data.isInLoop
  20. const parentNodeId = node?.parentId
  21. const parentNode = allNodes.find(n => n.id === parentNodeId)
  22. return {
  23. node,
  24. isInIteration,
  25. isInLoop,
  26. parentNode,
  27. }
  28. }
  29. // TODO: loop type?
  30. const useNodesAvailableVarList = (nodes: Node[], {
  31. onlyLeafNodeVar,
  32. filterVar,
  33. hideEnv = false,
  34. hideChatVar = false,
  35. passedInAvailableNodes,
  36. }: Params = {
  37. onlyLeafNodeVar: false,
  38. filterVar: () => true,
  39. }) => {
  40. const { getTreeLeafNodes, getBeforeNodesInSameBranchIncludeParent } = useWorkflow()
  41. const { getNodeAvailableVars } = useWorkflowVariables()
  42. const isChatMode = useIsChatMode()
  43. const nodeAvailabilityMap: { [key: string ]: { availableVars: NodeOutPutVar[], availableNodes: Node[] } } = {}
  44. nodes.forEach((node) => {
  45. const nodeId = node.id
  46. const availableNodes = passedInAvailableNodes || (onlyLeafNodeVar ? getTreeLeafNodes(nodeId) : getBeforeNodesInSameBranchIncludeParent(nodeId))
  47. if (node.data.type === BlockEnum.Loop)
  48. availableNodes.push(node)
  49. const {
  50. parentNode: iterationNode,
  51. } = getNodeInfo(nodeId, nodes)
  52. const availableVars = getNodeAvailableVars({
  53. parentNode: iterationNode,
  54. beforeNodes: availableNodes,
  55. isChatMode,
  56. filterVar,
  57. hideEnv,
  58. hideChatVar,
  59. })
  60. const result = {
  61. node,
  62. availableVars,
  63. availableNodes,
  64. }
  65. nodeAvailabilityMap[nodeId] = result
  66. })
  67. return nodeAvailabilityMap
  68. }
  69. export const useGetNodesAvailableVarList = () => {
  70. const { getTreeLeafNodes, getBeforeNodesInSameBranchIncludeParent } = useWorkflow()
  71. const { getNodeAvailableVars } = useWorkflowVariables()
  72. const isChatMode = useIsChatMode()
  73. const getNodesAvailableVarList = useCallback((nodes: Node[], {
  74. onlyLeafNodeVar,
  75. filterVar,
  76. hideEnv,
  77. hideChatVar,
  78. passedInAvailableNodes,
  79. }: Params = {
  80. onlyLeafNodeVar: false,
  81. filterVar: () => true,
  82. }) => {
  83. const nodeAvailabilityMap: { [key: string ]: { availableVars: NodeOutPutVar[], availableNodes: Node[] } } = {}
  84. nodes.forEach((node) => {
  85. const nodeId = node.id
  86. const availableNodes = passedInAvailableNodes || (onlyLeafNodeVar ? getTreeLeafNodes(nodeId) : getBeforeNodesInSameBranchIncludeParent(nodeId))
  87. if (node.data.type === BlockEnum.Loop)
  88. availableNodes.push(node)
  89. const {
  90. parentNode: iterationNode,
  91. } = getNodeInfo(nodeId, nodes)
  92. const availableVars = getNodeAvailableVars({
  93. parentNode: iterationNode,
  94. beforeNodes: availableNodes,
  95. isChatMode,
  96. filterVar,
  97. hideEnv,
  98. hideChatVar,
  99. })
  100. const result = {
  101. node,
  102. availableVars,
  103. availableNodes,
  104. }
  105. nodeAvailabilityMap[nodeId] = result
  106. })
  107. return nodeAvailabilityMap
  108. }, [getTreeLeafNodes, getBeforeNodesInSameBranchIncludeParent, getNodeAvailableVars, isChatMode])
  109. return {
  110. getNodesAvailableVarList,
  111. }
  112. }
  113. export default useNodesAvailableVarList