mirror of
https://github.com/langgenius/dify.git
synced 2026-04-26 21:55:58 +08:00
Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: jyong <718720800@qq.com> Co-authored-by: Yansong Zhang <916125788@qq.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: hj24 <mambahj24@gmail.com> Co-authored-by: hj24 <huangjian@dify.ai> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Co-authored-by: CodingOnStar <hanxujiang@dify.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: 非法操作 <hjlarry@163.com> Co-authored-by: Ayush Baluni <73417844+aayushbaluni@users.noreply.github.com> Co-authored-by: yyh <92089059+lyzno1@users.noreply.github.com> Co-authored-by: jimcody1995 <jjimcody@gmail.com> Co-authored-by: James <63717587+jamesrayammons@users.noreply.github.com> Co-authored-by: Yunlu Wen <yunlu.wen@dify.ai> Co-authored-by: Stephen Zhou <hi@hyoban.cc> Co-authored-by: Coding On Star <447357187@qq.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: jerryzai <jerryzh8710@protonmail.com> Co-authored-by: NVIDIAN <speedy.hpc@hotmail.com> Co-authored-by: ai-hpc <ai-hpc@users.noreply.github.com> Co-authored-by: Asuka Minato <i@asukaminato.eu.org> Co-authored-by: Junghwan <70629228+shaun0927@users.noreply.github.com> Co-authored-by: HeYinKazune <70251095+HeYin-OS@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: yyh <yuanyouhuilyz@gmail.com> Co-authored-by: Jingyi <jingyi.qi@dify.ai> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: sxxtony <166789813+sxxtony@users.noreply.github.com>
121 lines
4.8 KiB
TypeScript
121 lines
4.8 KiB
TypeScript
import type { Node, ToolWithProvider } from '@/app/components/workflow/types'
|
|
import type { SchemaTypeDefinition } from '@/service/use-common'
|
|
import type { FlowType } from '@/types/common'
|
|
import type { NodeWithVar, VarInInspect } from '@/types/workflow'
|
|
import { useCallback, useMemo } from 'react'
|
|
import { useStoreApi } from 'reactflow'
|
|
import { useNodesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-nodes-interactions-without-sync'
|
|
import { useStore, useWorkflowStore } from '@/app/components/workflow/store'
|
|
import {
|
|
useAllBuiltInTools,
|
|
useAllCustomTools,
|
|
useAllMCPTools,
|
|
useAllWorkflowTools,
|
|
} from '@/service/use-tools'
|
|
import { useInvalidateConversationVarValues, useInvalidateSysVarValues } from '@/service/use-workflow'
|
|
import { fetchAllInspectVars } from '@/service/workflow'
|
|
import useMatchSchemaType from '../nodes/_base/components/variable/use-match-schema-type'
|
|
import { toNodeOutputVars } from '../nodes/_base/components/variable/utils'
|
|
|
|
type Params = {
|
|
flowType: FlowType
|
|
flowId: string
|
|
}
|
|
|
|
export const useSetWorkflowVarsWithValue = ({
|
|
flowType,
|
|
flowId,
|
|
}: Params) => {
|
|
const workflowStore = useWorkflowStore()
|
|
const store = useStoreApi()
|
|
const invalidateConversationVarValues = useInvalidateConversationVarValues(flowType, flowId)
|
|
const invalidateSysVarValues = useInvalidateSysVarValues(flowType, flowId)
|
|
const { handleCancelAllNodeSuccessStatus } = useNodesInteractionsWithoutSync()
|
|
const { schemaTypeDefinitions } = useMatchSchemaType()
|
|
const { data: buildInTools } = useAllBuiltInTools()
|
|
const { data: customTools } = useAllCustomTools()
|
|
const { data: workflowTools } = useAllWorkflowTools()
|
|
const { data: mcpTools } = useAllMCPTools()
|
|
const dataSourceList = useStore(s => s.dataSourceList)
|
|
|
|
const allPluginInfoList = useMemo(() => {
|
|
return {
|
|
buildInTools: buildInTools || [],
|
|
customTools: customTools || [],
|
|
workflowTools: workflowTools || [],
|
|
mcpTools: mcpTools || [],
|
|
dataSourceList: dataSourceList || [],
|
|
}
|
|
}, [buildInTools, customTools, workflowTools, mcpTools, dataSourceList])
|
|
|
|
const setInspectVarsToStore = useCallback((inspectVars: VarInInspect[], passedInAllPluginInfoList?: Record<string, ToolWithProvider[]>, passedInSchemaTypeDefinitions?: SchemaTypeDefinition[]) => {
|
|
const { setNodesWithInspectVars } = workflowStore.getState()
|
|
const { getNodes } = store.getState()
|
|
|
|
const nodeArr = getNodes()
|
|
const allNodesOutputVars = toNodeOutputVars(nodeArr, false, () => true, [], [], [], passedInAllPluginInfoList || allPluginInfoList, passedInSchemaTypeDefinitions || schemaTypeDefinitions)
|
|
|
|
const nodesKeyValue: Record<string, Node> = {}
|
|
nodeArr.forEach((node) => {
|
|
nodesKeyValue[node.id] = node
|
|
})
|
|
|
|
const withValueNodeIds: Record<string, boolean> = {}
|
|
inspectVars.forEach((varItem) => {
|
|
const nodeId = varItem.selector[0]
|
|
|
|
const node = nodesKeyValue[nodeId!]
|
|
if (!node)
|
|
return
|
|
withValueNodeIds[nodeId!] = true
|
|
})
|
|
const withValueNodes = Object.keys(withValueNodeIds).map((nodeId) => {
|
|
return nodesKeyValue[nodeId]
|
|
})
|
|
|
|
const res: NodeWithVar[] = withValueNodes.map((node) => {
|
|
const nodeId = node!.id
|
|
const varsUnderTheNode = inspectVars.filter((varItem) => {
|
|
return varItem.selector[0] === nodeId
|
|
})
|
|
const nodeVar = allNodesOutputVars.find(item => item.nodeId === nodeId)
|
|
|
|
const nodeWithVar = {
|
|
nodeId,
|
|
nodePayload: node!.data,
|
|
nodeType: node!.data.type,
|
|
title: node!.data.title,
|
|
vars: varsUnderTheNode.map((item) => {
|
|
const schemaType = nodeVar ? nodeVar.vars.find(v => v.variable === item.name)?.schemaType : ''
|
|
return {
|
|
...item,
|
|
schemaType,
|
|
}
|
|
}),
|
|
isSingRunRunning: false,
|
|
isValueFetched: false,
|
|
}
|
|
return nodeWithVar
|
|
})
|
|
setNodesWithInspectVars(res)
|
|
}, [workflowStore, store, allPluginInfoList, schemaTypeDefinitions])
|
|
|
|
const fetchInspectVars = useCallback(async (params: {
|
|
passInVars?: boolean
|
|
vars?: VarInInspect[]
|
|
passedInAllPluginInfoList?: Record<string, ToolWithProvider[]>
|
|
passedInSchemaTypeDefinitions?: SchemaTypeDefinition[]
|
|
}) => {
|
|
const { passInVars, vars, passedInAllPluginInfoList, passedInSchemaTypeDefinitions } = params
|
|
invalidateConversationVarValues()
|
|
invalidateSysVarValues()
|
|
const data = passInVars ? vars! : await fetchAllInspectVars(flowType, flowId)
|
|
setInspectVarsToStore(data, passedInAllPluginInfoList, passedInSchemaTypeDefinitions)
|
|
handleCancelAllNodeSuccessStatus() // to make sure clear node output show the unset status
|
|
}, [invalidateConversationVarValues, invalidateSysVarValues, flowType, flowId, setInspectVarsToStore, handleCancelAllNodeSuccessStatus])
|
|
|
|
return {
|
|
fetchInspectVars,
|
|
}
|
|
}
|