選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import {
  2. useIsChatMode,
  3. useWorkflow,
  4. useWorkflowVariables,
  5. } from '@/app/components/workflow/hooks'
  6. import { BlockEnum, type Node, type NodeOutPutVar, type ValueSelector, type Var } from '@/app/components/workflow/types'
  7. type Params = {
  8. onlyLeafNodeVar?: boolean
  9. hideEnv?: boolean
  10. hideChatVar?: boolean
  11. filterVar: (payload: Var, selector: ValueSelector) => boolean
  12. passedInAvailableNodes?: Node[]
  13. }
  14. const getNodeInfo = (nodeId: string, nodes: Node[]) => {
  15. const allNodes = nodes
  16. const node = allNodes.find(n => n.id === nodeId)
  17. const isInIteration = !!node?.data.isInIteration
  18. const isInLoop = !!node?.data.isInLoop
  19. const parentNodeId = node?.parentId
  20. const parentNode = allNodes.find(n => n.id === parentNodeId)
  21. return {
  22. node,
  23. isInIteration,
  24. isInLoop,
  25. parentNode,
  26. }
  27. }
  28. // TODO: loop type?
  29. const useNodesAvailableVarList = (nodes: Node[], {
  30. onlyLeafNodeVar,
  31. filterVar,
  32. hideEnv = false,
  33. hideChatVar = false,
  34. passedInAvailableNodes,
  35. }: Params = {
  36. onlyLeafNodeVar: false,
  37. filterVar: () => true,
  38. }) => {
  39. const { getTreeLeafNodes, getBeforeNodesInSameBranchIncludeParent } = useWorkflow()
  40. const { getNodeAvailableVars } = useWorkflowVariables()
  41. const isChatMode = useIsChatMode()
  42. const nodeAvailabilityMap: { [key: string ]: { availableVars: NodeOutPutVar[], availableNodes: Node[] } } = {}
  43. nodes.forEach((node) => {
  44. const nodeId = node.id
  45. const availableNodes = passedInAvailableNodes || (onlyLeafNodeVar ? getTreeLeafNodes(nodeId) : getBeforeNodesInSameBranchIncludeParent(nodeId))
  46. if (node.data.type === BlockEnum.Loop)
  47. availableNodes.push(node)
  48. const {
  49. parentNode: iterationNode,
  50. } = getNodeInfo(nodeId, nodes)
  51. const availableVars = getNodeAvailableVars({
  52. parentNode: iterationNode,
  53. beforeNodes: availableNodes,
  54. isChatMode,
  55. filterVar,
  56. hideEnv,
  57. hideChatVar,
  58. })
  59. const result = {
  60. node,
  61. availableVars,
  62. availableNodes,
  63. }
  64. nodeAvailabilityMap[nodeId] = result
  65. })
  66. return nodeAvailabilityMap
  67. }
  68. export default useNodesAvailableVarList