mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-31 10:53:02 +00:00 
			
		
		
		
	
		
			
	
	
		
			209 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			209 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|   | import { useStrategyProviderDetail } from '@/service/use-strategy' | ||
|  | import useNodeCrud from '../_base/hooks/use-node-crud' | ||
|  | import useVarList from '../_base/hooks/use-var-list' | ||
|  | import useOneStepRun from '../_base/hooks/use-one-step-run' | ||
|  | import type { AgentNodeType } from './types' | ||
|  | import { | ||
|  |   useNodesReadOnly, | ||
|  | } from '@/app/components/workflow/hooks' | ||
|  | import { useCallback, useMemo } from 'react' | ||
|  | import { type ToolVarInputs, VarType } from '../tool/types' | ||
|  | import { useCheckInstalled, useFetchPluginsInMarketPlaceByIds } from '@/service/use-plugins' | ||
|  | import type { Var } from '../../types' | ||
|  | import { VarType as VarKindType } from '../../types' | ||
|  | import useAvailableVarList from '../_base/hooks/use-available-var-list' | ||
|  | 
 | ||
|  | export type StrategyStatus = { | ||
|  |   plugin: { | ||
|  |     source: 'external' | 'marketplace' | ||
|  |     installed: boolean | ||
|  |   } | ||
|  |   isExistInPlugin: boolean | ||
|  | } | ||
|  | 
 | ||
|  | export const useStrategyInfo = ( | ||
|  |   strategyProviderName?: string, | ||
|  |   strategyName?: string, | ||
|  | ) => { | ||
|  |   const strategyProvider = useStrategyProviderDetail( | ||
|  |     strategyProviderName || '', | ||
|  |     { retry: false }, | ||
|  |   ) | ||
|  |   const strategy = strategyProvider.data?.declaration.strategies.find( | ||
|  |     str => str.identity.name === strategyName, | ||
|  |   ) | ||
|  |   const marketplace = useFetchPluginsInMarketPlaceByIds([strategyProviderName!], { | ||
|  |     retry: false, | ||
|  |   }) | ||
|  |   const strategyStatus: StrategyStatus | undefined = useMemo(() => { | ||
|  |     if (strategyProvider.isLoading || marketplace.isLoading) | ||
|  |       return undefined | ||
|  |     const strategyExist = !!strategy | ||
|  |     const isPluginInstalled = !strategyProvider.isError | ||
|  |     const isInMarketplace = !!marketplace.data?.data.plugins.at(0) | ||
|  |     return { | ||
|  |       plugin: { | ||
|  |         source: isInMarketplace ? 'marketplace' : 'external', | ||
|  |         installed: isPluginInstalled, | ||
|  |       }, | ||
|  |       isExistInPlugin: strategyExist, | ||
|  |     } | ||
|  |   }, [strategy, marketplace, strategyProvider.isError, strategyProvider.isLoading]) | ||
|  |   const refetch = useCallback(() => { | ||
|  |     strategyProvider.refetch() | ||
|  |     marketplace.refetch() | ||
|  |   }, [marketplace, strategyProvider]) | ||
|  |   return { | ||
|  |     strategyProvider, | ||
|  |     strategy, | ||
|  |     strategyStatus, | ||
|  |     refetch, | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | const useConfig = (id: string, payload: AgentNodeType) => { | ||
|  |   const { nodesReadOnly: readOnly } = useNodesReadOnly() | ||
|  |   const { inputs, setInputs } = useNodeCrud<AgentNodeType>(id, payload) | ||
|  |   // variables
 | ||
|  |   const { handleVarListChange, handleAddVariable } = useVarList<AgentNodeType>({ | ||
|  |     inputs, | ||
|  |     setInputs, | ||
|  |   }) | ||
|  |   const { | ||
|  |     strategyStatus: currentStrategyStatus, | ||
|  |     strategy: currentStrategy, | ||
|  |     strategyProvider, | ||
|  |   } = useStrategyInfo( | ||
|  |     inputs.agent_strategy_provider_name, | ||
|  |     inputs.agent_strategy_name, | ||
|  |   ) | ||
|  |   const pluginId = inputs.agent_strategy_provider_name?.split('/').splice(0, 2).join('/') | ||
|  |   const pluginDetail = useCheckInstalled({ | ||
|  |     pluginIds: [pluginId!], | ||
|  |     enabled: Boolean(pluginId), | ||
|  |   }) | ||
|  |   const formData = useMemo(() => { | ||
|  |     return Object.fromEntries( | ||
|  |       Object.entries(inputs.agent_parameters || {}).map(([key, value]) => { | ||
|  |         return [key, value.value] | ||
|  |       }), | ||
|  |     ) | ||
|  |   }, [inputs.agent_parameters]) | ||
|  |   const onFormChange = (value: Record<string, any>) => { | ||
|  |     const res: ToolVarInputs = {} | ||
|  |     Object.entries(value).forEach(([key, val]) => { | ||
|  |       res[key] = { | ||
|  |         type: VarType.constant, | ||
|  |         value: val, | ||
|  |       } | ||
|  |     }) | ||
|  |     setInputs({ | ||
|  |       ...inputs, | ||
|  |       agent_parameters: res, | ||
|  |     }) | ||
|  |   } | ||
|  | 
 | ||
|  |   // vars
 | ||
|  | 
 | ||
|  |   const filterMemoryPromptVar = useCallback((varPayload: Var) => { | ||
|  |     return [ | ||
|  |       VarKindType.arrayObject, | ||
|  |       VarKindType.array, | ||
|  |       VarKindType.number, | ||
|  |       VarKindType.string, | ||
|  |       VarKindType.secret, | ||
|  |       VarKindType.arrayString, | ||
|  |       VarKindType.arrayNumber, | ||
|  |       VarKindType.file, | ||
|  |       VarKindType.arrayFile, | ||
|  |     ].includes(varPayload.type) | ||
|  |   }, []) | ||
|  | 
 | ||
|  |   const { | ||
|  |     availableVars, | ||
|  |     availableNodesWithParent, | ||
|  |   } = useAvailableVarList(id, { | ||
|  |     onlyLeafNodeVar: false, | ||
|  |     filterVar: filterMemoryPromptVar, | ||
|  |   }) | ||
|  | 
 | ||
|  |   // single run
 | ||
|  |   const { | ||
|  |     isShowSingleRun, | ||
|  |     showSingleRun, | ||
|  |     hideSingleRun, | ||
|  |     toVarInputs, | ||
|  |     runningStatus, | ||
|  |     handleRun, | ||
|  |     handleStop, | ||
|  |     runInputData, | ||
|  |     setRunInputData, | ||
|  |     runResult, | ||
|  |     getInputVars, | ||
|  |   } = useOneStepRun<AgentNodeType>({ | ||
|  |     id, | ||
|  |     data: inputs, | ||
|  |     defaultRunInputData: {}, | ||
|  |   }) | ||
|  |   const allVarStrArr = (() => { | ||
|  |     const arr = currentStrategy?.parameters.filter(item => item.type === 'string').map((item) => { | ||
|  |       return formData[item.name] | ||
|  |     }) || [] | ||
|  | 
 | ||
|  |     return arr | ||
|  |   })() | ||
|  |   const varInputs = (() => { | ||
|  |     const vars = getInputVars(allVarStrArr) | ||
|  | 
 | ||
|  |     return vars | ||
|  |   })() | ||
|  | 
 | ||
|  |   const outputSchema = useMemo(() => { | ||
|  |     const res: any[] = [] | ||
|  |     if (!inputs.output_schema) | ||
|  |       return [] | ||
|  |     Object.keys(inputs.output_schema.properties).forEach((outputKey) => { | ||
|  |       const output = inputs.output_schema.properties[outputKey] | ||
|  |       res.push({ | ||
|  |         name: outputKey, | ||
|  |         type: output.type === 'array' | ||
|  |           ? `Array[${output.items?.type.slice(0, 1).toLocaleUpperCase()}${output.items?.type.slice(1)}]` | ||
|  |           : `${output.type.slice(0, 1).toLocaleUpperCase()}${output.type.slice(1)}`, | ||
|  |         description: output.description, | ||
|  |       }) | ||
|  |     }) | ||
|  |     return res | ||
|  |   }, [inputs.output_schema]) | ||
|  | 
 | ||
|  |   return { | ||
|  |     readOnly, | ||
|  |     inputs, | ||
|  |     setInputs, | ||
|  |     handleVarListChange, | ||
|  |     handleAddVariable, | ||
|  |     currentStrategy, | ||
|  |     formData, | ||
|  |     onFormChange, | ||
|  |     currentStrategyStatus, | ||
|  |     strategyProvider: strategyProvider.data, | ||
|  |     pluginDetail: pluginDetail.data?.plugins.at(0), | ||
|  |     availableVars, | ||
|  |     availableNodesWithParent, | ||
|  | 
 | ||
|  |     isShowSingleRun, | ||
|  |     showSingleRun, | ||
|  |     hideSingleRun, | ||
|  |     toVarInputs, | ||
|  |     runningStatus, | ||
|  |     handleRun, | ||
|  |     handleStop, | ||
|  |     runInputData, | ||
|  |     setRunInputData, | ||
|  |     runResult, | ||
|  |     varInputs, | ||
|  |     outputSchema, | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | export default useConfig |