mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-31 02:42:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			116 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { type FC, memo, useMemo } from 'react'
 | |
| import type { NodeProps } from '../../types'
 | |
| import type { AgentNodeType } from './types'
 | |
| import { SettingItem } from '../_base/components/setting-item'
 | |
| import { Group, GroupLabel } from '../_base/components/group'
 | |
| import type { ToolIconProps } from './components/tool-icon'
 | |
| import { ToolIcon } from './components/tool-icon'
 | |
| import useConfig from './use-config'
 | |
| import { useTranslation } from 'react-i18next'
 | |
| import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
 | |
| import { useRenderI18nObject } from '@/hooks/use-i18n'
 | |
| import { ModelBar } from './components/model-bar'
 | |
| 
 | |
| const AgentNode: FC<NodeProps<AgentNodeType>> = (props) => {
 | |
|   const { inputs, currentStrategy, currentStrategyStatus, pluginDetail } = useConfig(props.id, props.data)
 | |
|   const renderI18nObject = useRenderI18nObject()
 | |
|   const { t } = useTranslation()
 | |
|   const models = useMemo(() => {
 | |
|     if (!inputs) return []
 | |
|     // if selected, show in node
 | |
|     // if required and not selected, show empty selector
 | |
|     // if not required and not selected, show nothing
 | |
|     const models = currentStrategy?.parameters
 | |
|       .filter(param => param.type === FormTypeEnum.modelSelector)
 | |
|       .reduce((acc, param) => {
 | |
|         const item = inputs.agent_parameters?.[param.name]?.value
 | |
|         if (!item) {
 | |
|           if (param.required) {
 | |
|             acc.push({ param: param.name })
 | |
|             return acc
 | |
|           }
 | |
|           else { return acc }
 | |
|         }
 | |
|         acc.push({ provider: item.provider, model: item.model, param: param.name })
 | |
|         return acc
 | |
|       }, [] as Array<{ param: string } | { provider: string, model: string, param: string }>) || []
 | |
|     return models
 | |
|   }, [currentStrategy, inputs])
 | |
| 
 | |
|   const tools = useMemo(() => {
 | |
|     const tools: Array<ToolIconProps> = []
 | |
|     currentStrategy?.parameters.forEach((param, i) => {
 | |
|       if (param.type === FormTypeEnum.toolSelector) {
 | |
|         const field = param.name
 | |
|         const value = inputs.agent_parameters?.[field]?.value
 | |
|         if (value) {
 | |
|           tools.push({
 | |
|             id: `${param.name}-${i}`,
 | |
|             providerName: value.provider_name as any,
 | |
|           })
 | |
|         }
 | |
|       }
 | |
|       if (param.type === FormTypeEnum.multiToolSelector) {
 | |
|         const field = param.name
 | |
|         const value = inputs.agent_parameters?.[field]?.value
 | |
|         if (value) {
 | |
|           (value as unknown as any[]).forEach((item) => {
 | |
|             tools.push({
 | |
|               id: `${param.name}-${i}`,
 | |
|               providerName: item.provider_name,
 | |
|             })
 | |
|           })
 | |
|         }
 | |
|       }
 | |
|     })
 | |
|     return tools
 | |
|   }, [currentStrategy?.parameters, inputs.agent_parameters])
 | |
|   return <div className='mb-1 space-y-1 px-3 py-1'>
 | |
|     {inputs.agent_strategy_name
 | |
|       ? <SettingItem
 | |
|         label={t('workflow.nodes.agent.strategy.shortLabel')}
 | |
|         status={
 | |
|           currentStrategyStatus && !currentStrategyStatus.isExistInPlugin
 | |
|             ? 'error'
 | |
|             : undefined
 | |
|         }
 | |
|         tooltip={
 | |
|           (currentStrategyStatus && !currentStrategyStatus.isExistInPlugin)
 | |
|             ? t('workflow.nodes.agent.strategyNotInstallTooltip', {
 | |
|               plugin: pluginDetail?.declaration.label
 | |
|                 ? renderI18nObject(pluginDetail?.declaration.label)
 | |
|                 : undefined,
 | |
|               strategy: inputs.agent_strategy_label,
 | |
|             })
 | |
|             : undefined
 | |
|         }
 | |
|       >
 | |
|         {inputs.agent_strategy_label}
 | |
|       </SettingItem>
 | |
|       : <SettingItem label={t('workflow.nodes.agent.strategyNotSet')} />}
 | |
|     {models.length > 0 && <Group
 | |
|       label={<GroupLabel className='mt-1'>
 | |
|         {t('workflow.nodes.agent.model')}
 | |
|       </GroupLabel>}
 | |
|     >
 | |
|       {models.map((model) => {
 | |
|         return <ModelBar
 | |
|           {...model}
 | |
|           key={model.param}
 | |
|         />
 | |
|       })}
 | |
|     </Group>}
 | |
|     {tools.length > 0 && <Group label={<GroupLabel className='mt-1'>
 | |
|       {t('workflow.nodes.agent.toolbox')}
 | |
|     </GroupLabel>}>
 | |
|       <div className='grid grid-cols-10 gap-0.5'>
 | |
|         {tools.map(tool => <ToolIcon {...tool} key={tool.id} />)}
 | |
|       </div>
 | |
|     </Group>}
 | |
|   </div>
 | |
| }
 | |
| 
 | |
| AgentNode.displayName = 'AgentNode'
 | |
| 
 | |
| export default memo(AgentNode)
 | 
