mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-31 02:42:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			221 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			221 lines
		
	
	
		
			6.0 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 {
 | |
|   useIsChatMode,
 | |
|   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 { Memory, Var } from '../../types'
 | |
| import { VarType as VarKindType } from '../../types'
 | |
| import useAvailableVarList from '../_base/hooks/use-available-var-list'
 | |
| import produce from 'immer'
 | |
| 
 | |
| 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(() => {
 | |
|     const paramNameList = (currentStrategy?.parameters || []).map(item => item.name)
 | |
|     return Object.fromEntries(
 | |
|       Object.entries(inputs.agent_parameters || {}).filter(([name]) => paramNameList.includes(name)).map(([key, value]) => {
 | |
|         return [key, value.value]
 | |
|       }),
 | |
|     )
 | |
|   }, [inputs.agent_parameters, currentStrategy?.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])
 | |
| 
 | |
|   const handleMemoryChange = useCallback((newMemory?: Memory) => {
 | |
|     const newInputs = produce(inputs, (draft) => {
 | |
|       draft.memory = newMemory
 | |
|     })
 | |
|     setInputs(newInputs)
 | |
|   }, [inputs, setInputs])
 | |
|   const isChatMode = useIsChatMode()
 | |
|   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,
 | |
|     handleMemoryChange,
 | |
|     isChatMode,
 | |
|   }
 | |
| }
 | |
| 
 | |
| export default useConfig
 | 
