mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-05-26 08:08:17 +08: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)
|