dify/web/app/components/workflow/nodes/agent/node.tsx

111 lines
3.8 KiB
TypeScript
Raw Normal View History

import { type FC, useMemo } from 'react'
import type { NodeProps } from '../../types'
import type { AgentNodeType } from './types'
import { SettingItem } from '../_base/components/setting-item'
import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
import { Group, GroupLabel } from '../_base/components/group'
import type { ToolIconProps } from './components/tool-icon'
import { ToolIcon } from './components/tool-icon'
2024-12-25 11:24:24 +08:00
import useConfig from './use-config'
2024-12-25 14:23:57 +08:00
import { useTranslation } from 'react-i18next'
import { useInstalledPluginList } from '@/service/use-plugins'
2024-12-27 16:39:18 +08:00
import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
const AgentNode: FC<NodeProps<AgentNodeType>> = (props) => {
const { inputs, currentStrategy } = useConfig(props.id, props.data)
2024-12-25 14:23:57 +08:00
const { t } = useTranslation()
const pluginList = useInstalledPluginList()
// TODO: Implement models
const models = useMemo(() => {
2024-12-27 16:39:18 +08:00
if (!inputs) return []
2024-12-27 16:45:46 +08:00
// if selected, show in node
// if required and not selected, show empty selector
// if not required and not selected, show nothing
2024-12-27 16:39:18 +08:00
const models = currentStrategy?.parameters
.filter(param => param.type === FormTypeEnum.modelSelector)
2024-12-27 16:45:46 +08:00
.reduce((acc, param) => {
2024-12-27 16:39:18 +08:00
const item = inputs.agent_parameters?.[param.name]
if (!item) {
2024-12-27 16:45:46 +08:00
if (param.required) {
acc.push({ param: param.name })
return acc
}
else { return acc }
2024-12-27 16:39:18 +08:00
}
2024-12-27 16:45:46 +08:00
acc.push({ provider: item.provider, model: item.model, param: param.name })
return acc
}, [] as Array<{ param: string } | { provider: string, model: string, param: string }>) || []
2024-12-27 16:39:18 +08:00
return models
}, [currentStrategy, inputs])
const tools = useMemo(() => {
const tools: Array<ToolIconProps> = []
currentStrategy?.parameters.forEach((param) => {
if (['array[tool]', 'tool'].includes(param.type)) {
const vari = inputs.agent_parameters?.[param.name]
if (!vari) return
if (Array.isArray(vari.value)) {
// TODO: Implement array of tools
}
else {
// TODO: Implement single tool
}
}
})
}, [currentStrategy, inputs.agent_parameters])
return <div className='mb-1 px-3 py-1 space-y-1'>
2024-12-25 11:24:24 +08:00
{inputs.agent_strategy_name
2024-12-25 14:52:11 +08:00
? <SettingItem
label={t('workflow.nodes.agent.strategy.shortLabel')}
status='error'
tooltip={t('workflow.nodes.agent.strategyNotInstallTooltip', {
2024-12-26 10:16:52 +08:00
strategy: inputs.agent_strategy_label,
2024-12-25 14:52:11 +08:00
})}
>
2024-12-26 10:16:52 +08:00
{inputs.agent_strategy_label}
</SettingItem>
2024-12-25 14:23:57 +08:00
: <SettingItem label={t('workflow.nodes.agent.strategyNotSet')} />}
2024-12-27 16:39:18 +08:00
{models.length && <Group
2024-12-25 11:24:24 +08:00
label={<GroupLabel className='mt-1'>
2024-12-25 14:23:57 +08:00
{t('workflow.nodes.agent.model')}
2024-12-25 11:24:24 +08:00
</GroupLabel>}
>
2024-12-27 16:39:18 +08:00
{models.map((model) => {
return <ModelSelector
2024-12-27 16:48:16 +08:00
key={model.param}
2024-12-27 16:39:18 +08:00
modelList={[]}
2024-12-27 16:48:16 +08:00
defaultModel={
'provider' in model
? {
provider: model.provider,
model: model.model,
}
: undefined}
2024-12-27 16:45:46 +08:00
readonly
2024-12-27 16:39:18 +08:00
/>
})}
</Group>}
<Group label={<GroupLabel className='mt-1'>
2024-12-25 14:23:57 +08:00
{t('workflow.nodes.agent.toolbox')}
</GroupLabel>}>
<div className='grid grid-cols-10 gap-0.5'>
<ToolIcon src='/logo/logo.png' />
2024-12-25 14:52:11 +08:00
<ToolIcon
src='/logo/logo.png'
status='error'
tooltip={t('workflow.nodes.agent.toolNotInstallTooltip', {
tool: 'Gmail Sender',
})} />
<ToolIcon
src='/logo/logo.png'
status='warning'
tooltip={t('workflow.nodes.agent.toolNotAuthorizedTooltip', {
tool: 'DuckDuckGo AI Search',
})} />
</div>
</Group>
</div>
}
export default AgentNode