mirror of
https://github.com/langgenius/dify.git
synced 2026-04-28 03:36:36 +08:00
node meta data
This commit is contained in:
parent
754a1d1197
commit
84daf49047
@ -1,6 +1,12 @@
|
|||||||
import { useMemo } from 'react'
|
import { useMemo } from 'react'
|
||||||
import type { AvailableNodesMetaData } from '@/app/components/workflow/hooks-store'
|
import type { AvailableNodesMetaData } from '@/app/components/workflow/hooks-store'
|
||||||
import { useHooksStore } from '@/app/components/workflow/hooks-store'
|
import { useHooksStore } from '@/app/components/workflow/hooks-store'
|
||||||
|
import { BlockEnum } from '@/app/components/workflow/types'
|
||||||
|
import type { Node } from '@/app/components/workflow/types'
|
||||||
|
import { CollectionType } from '@/app/components/tools/types'
|
||||||
|
import { useStore } from '@/app/components/workflow/store'
|
||||||
|
import { canFindTool } from '@/utils'
|
||||||
|
import { useGetLanguage } from '@/context/i18n'
|
||||||
|
|
||||||
export const useNodesMetaData = () => {
|
export const useNodesMetaData = () => {
|
||||||
const availableNodesMetaData = useHooksStore(s => s.availableNodesMetaData)
|
const availableNodesMetaData = useHooksStore(s => s.availableNodesMetaData)
|
||||||
@ -12,3 +18,48 @@ export const useNodesMetaData = () => {
|
|||||||
} as AvailableNodesMetaData
|
} as AvailableNodesMetaData
|
||||||
}, [availableNodesMetaData])
|
}, [availableNodesMetaData])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const useNodeMetaData = (node: Node) => {
|
||||||
|
const language = useGetLanguage()
|
||||||
|
const buildInTools = useStore(s => s.buildInTools)
|
||||||
|
const customTools = useStore(s => s.customTools)
|
||||||
|
const workflowTools = useStore(s => s.workflowTools)
|
||||||
|
const dataSourceList = useStore(s => s.dataSourceList)
|
||||||
|
const availableNodesMetaData = useNodesMetaData()
|
||||||
|
const { data } = node
|
||||||
|
const nodeMetaData = availableNodesMetaData.nodesMap?.[data.type]
|
||||||
|
const author = useMemo(() => {
|
||||||
|
if (data.type === BlockEnum.DataSource)
|
||||||
|
return dataSourceList?.find(dataSource => dataSource.id === data.provider_id)?.author
|
||||||
|
|
||||||
|
if (data.type === BlockEnum.Tool) {
|
||||||
|
if (data.provider_type === CollectionType.builtIn)
|
||||||
|
return buildInTools.find(toolWithProvider => canFindTool(toolWithProvider.id, data.provider_id))?.author
|
||||||
|
if (data.provider_type === CollectionType.workflow)
|
||||||
|
return workflowTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.author
|
||||||
|
return customTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.author
|
||||||
|
}
|
||||||
|
return nodeMetaData?.metaData.author
|
||||||
|
}, [data, buildInTools, customTools, workflowTools, nodeMetaData, dataSourceList])
|
||||||
|
|
||||||
|
const description = useMemo(() => {
|
||||||
|
if (data.type === BlockEnum.DataSource)
|
||||||
|
return dataSourceList?.find(dataSource => dataSource.id === data.provider_id)?.description[language]
|
||||||
|
if (data.type === BlockEnum.Tool) {
|
||||||
|
if (data.provider_type === CollectionType.builtIn)
|
||||||
|
return buildInTools.find(toolWithProvider => canFindTool(toolWithProvider.id, data.provider_id))?.description[language]
|
||||||
|
if (data.provider_type === CollectionType.workflow)
|
||||||
|
return workflowTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.description[language]
|
||||||
|
return customTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.description[language]
|
||||||
|
}
|
||||||
|
return nodeMetaData?.metaData.description
|
||||||
|
}, [data, buildInTools, customTools, workflowTools, nodeMetaData, dataSourceList, language])
|
||||||
|
|
||||||
|
return useMemo(() => {
|
||||||
|
return {
|
||||||
|
...nodeMetaData?.metaData,
|
||||||
|
author,
|
||||||
|
description,
|
||||||
|
}
|
||||||
|
}, [author, nodeMetaData, description])
|
||||||
|
}
|
||||||
|
|||||||
@ -31,7 +31,6 @@ const PanelOperator = ({
|
|||||||
crossAxis: 53,
|
crossAxis: 53,
|
||||||
},
|
},
|
||||||
onOpenChange,
|
onOpenChange,
|
||||||
inNode,
|
|
||||||
showHelpLink = true,
|
showHelpLink = true,
|
||||||
}: PanelOperatorProps) => {
|
}: PanelOperatorProps) => {
|
||||||
const [open, setOpen] = useState(false)
|
const [open, setOpen] = useState(false)
|
||||||
|
|||||||
@ -1,28 +1,22 @@
|
|||||||
import {
|
import {
|
||||||
memo,
|
memo,
|
||||||
useMemo,
|
|
||||||
} from 'react'
|
} from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { useEdges } from 'reactflow'
|
import { useEdges } from 'reactflow'
|
||||||
import { useNodeHelpLink } from '../../hooks/use-node-help-link'
|
|
||||||
import ChangeBlock from './change-block'
|
import ChangeBlock from './change-block'
|
||||||
import {
|
import {
|
||||||
canRunBySingle,
|
canRunBySingle,
|
||||||
} from '@/app/components/workflow/utils'
|
} from '@/app/components/workflow/utils'
|
||||||
import { useStore } from '@/app/components/workflow/store'
|
|
||||||
import {
|
import {
|
||||||
useNodeDataUpdate,
|
useNodeDataUpdate,
|
||||||
|
useNodeMetaData,
|
||||||
useNodesInteractions,
|
useNodesInteractions,
|
||||||
useNodesMetaData,
|
|
||||||
useNodesReadOnly,
|
useNodesReadOnly,
|
||||||
useNodesSyncDraft,
|
useNodesSyncDraft,
|
||||||
} from '@/app/components/workflow/hooks'
|
} from '@/app/components/workflow/hooks'
|
||||||
import ShortcutsName from '@/app/components/workflow/shortcuts-name'
|
import ShortcutsName from '@/app/components/workflow/shortcuts-name'
|
||||||
import type { Node } from '@/app/components/workflow/types'
|
import type { Node } from '@/app/components/workflow/types'
|
||||||
import { BlockEnum } from '@/app/components/workflow/types'
|
import { BlockEnum } from '@/app/components/workflow/types'
|
||||||
import { useGetLanguage } from '@/context/i18n'
|
|
||||||
import { CollectionType } from '@/app/components/tools/types'
|
|
||||||
import { canFindTool } from '@/utils'
|
|
||||||
|
|
||||||
type PanelOperatorPopupProps = {
|
type PanelOperatorPopupProps = {
|
||||||
id: string
|
id: string
|
||||||
@ -37,7 +31,6 @@ const PanelOperatorPopup = ({
|
|||||||
showHelpLink,
|
showHelpLink,
|
||||||
}: PanelOperatorPopupProps) => {
|
}: PanelOperatorPopupProps) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const language = useGetLanguage()
|
|
||||||
const edges = useEdges()
|
const edges = useEdges()
|
||||||
const {
|
const {
|
||||||
handleNodeDelete,
|
handleNodeDelete,
|
||||||
@ -48,41 +41,10 @@ const PanelOperatorPopup = ({
|
|||||||
const { handleNodeDataUpdate } = useNodeDataUpdate()
|
const { handleNodeDataUpdate } = useNodeDataUpdate()
|
||||||
const { handleSyncWorkflowDraft } = useNodesSyncDraft()
|
const { handleSyncWorkflowDraft } = useNodesSyncDraft()
|
||||||
const { nodesReadOnly } = useNodesReadOnly()
|
const { nodesReadOnly } = useNodesReadOnly()
|
||||||
const { nodesMap: nodesExtraData } = useNodesMetaData()
|
|
||||||
const buildInTools = useStore(s => s.buildInTools)
|
|
||||||
const customTools = useStore(s => s.customTools)
|
|
||||||
const workflowTools = useStore(s => s.workflowTools)
|
|
||||||
const edge = edges.find(edge => edge.target === id)
|
const edge = edges.find(edge => edge.target === id)
|
||||||
const author = useMemo(() => {
|
const nodeMetaData = useNodeMetaData({ id, data } as Node)
|
||||||
if (data.type !== BlockEnum.Tool)
|
|
||||||
return nodesExtraData![data.type].metaData.author
|
|
||||||
|
|
||||||
if (data.provider_type === CollectionType.builtIn)
|
|
||||||
return buildInTools.find(toolWithProvider => canFindTool(toolWithProvider.id, data.provider_id))?.author
|
|
||||||
|
|
||||||
if (data.provider_type === CollectionType.workflow)
|
|
||||||
return workflowTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.author
|
|
||||||
|
|
||||||
return customTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.author
|
|
||||||
}, [data, nodesExtraData, buildInTools, customTools, workflowTools])
|
|
||||||
|
|
||||||
const about = useMemo(() => {
|
|
||||||
if (data.type !== BlockEnum.Tool)
|
|
||||||
return nodesExtraData![data.type].metaData.description
|
|
||||||
|
|
||||||
if (data.provider_type === CollectionType.builtIn)
|
|
||||||
return buildInTools.find(toolWithProvider => canFindTool(toolWithProvider.id, data.provider_id))?.description[language]
|
|
||||||
|
|
||||||
if (data.provider_type === CollectionType.workflow)
|
|
||||||
return workflowTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.description[language]
|
|
||||||
|
|
||||||
return customTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.description[language]
|
|
||||||
}, [data, nodesExtraData, language, buildInTools, customTools, workflowTools])
|
|
||||||
|
|
||||||
const showChangeBlock = data.type !== BlockEnum.Start && !nodesReadOnly && data.type !== BlockEnum.Iteration && data.type !== BlockEnum.Loop
|
const showChangeBlock = data.type !== BlockEnum.Start && !nodesReadOnly && data.type !== BlockEnum.Iteration && data.type !== BlockEnum.Loop
|
||||||
|
|
||||||
const link = useNodeHelpLink(data.type)
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='w-[240px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl'>
|
<div className='w-[240px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl'>
|
||||||
{
|
{
|
||||||
@ -147,28 +109,34 @@ const PanelOperatorPopup = ({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className='h-[1px] bg-divider-regular'></div>
|
<div className='h-[1px] bg-divider-regular'></div>
|
||||||
<div className='p-1'>
|
{
|
||||||
<div
|
!nodeMetaData.isUndeletable && (
|
||||||
className={`
|
<>
|
||||||
flex h-8 cursor-pointer items-center justify-between rounded-lg px-3 text-sm text-text-secondary
|
<div className='p-1'>
|
||||||
hover:bg-state-destructive-hover hover:text-red-500
|
<div
|
||||||
`}
|
className={`
|
||||||
onClick={() => handleNodeDelete(id)}
|
flex h-8 cursor-pointer items-center justify-between rounded-lg px-3 text-sm text-text-secondary
|
||||||
>
|
hover:bg-state-destructive-hover hover:text-red-500
|
||||||
{t('common.operation.delete')}
|
`}
|
||||||
<ShortcutsName keys={['del']} />
|
onClick={() => handleNodeDelete(id)}
|
||||||
</div>
|
>
|
||||||
</div>
|
{t('common.operation.delete')}
|
||||||
<div className='h-[1px] bg-divider-regular'></div>
|
<ShortcutsName keys={['del']} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='h-[1px] bg-divider-regular'></div>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
showHelpLink && link && (
|
showHelpLink && nodeMetaData.helpLinkUri && (
|
||||||
<>
|
<>
|
||||||
<div className='p-1'>
|
<div className='p-1'>
|
||||||
<a
|
<a
|
||||||
href={link}
|
href={nodeMetaData.helpLinkUri}
|
||||||
target='_blank'
|
target='_blank'
|
||||||
className='flex h-8 cursor-pointer items-center rounded-lg px-3 text-sm text-text-secondary hover:bg-state-base-hover'
|
className='flex h-8 cursor-pointer items-center rounded-lg px-3 text-sm text-text-secondary hover:bg-state-base-hover'
|
||||||
>
|
>
|
||||||
@ -184,9 +152,9 @@ const PanelOperatorPopup = ({
|
|||||||
<div className='mb-1 flex h-[22px] items-center font-medium'>
|
<div className='mb-1 flex h-[22px] items-center font-medium'>
|
||||||
{t('workflow.panel.about').toLocaleUpperCase()}
|
{t('workflow.panel.about').toLocaleUpperCase()}
|
||||||
</div>
|
</div>
|
||||||
<div className='mb-1 leading-[18px] text-text-secondary'>{about}</div>
|
<div className='mb-1 leading-[18px] text-text-secondary'>{nodeMetaData.description}</div>
|
||||||
<div className='leading-[18px]'>
|
<div className='leading-[18px]'>
|
||||||
{t('workflow.panel.createdBy')} {author}
|
{t('workflow.panel.createdBy')} {nodeMetaData.author}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
memo,
|
memo,
|
||||||
|
useCallback,
|
||||||
|
useEffect,
|
||||||
useMemo,
|
useMemo,
|
||||||
} from 'react'
|
} from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
@ -26,6 +28,7 @@ const EmbeddingModel = ({
|
|||||||
}: EmbeddingModelProps) => {
|
}: EmbeddingModelProps) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const {
|
const {
|
||||||
|
defaultModel,
|
||||||
modelList: embeddingModelList,
|
modelList: embeddingModelList,
|
||||||
} = useModelListAndDefaultModel(ModelTypeEnum.textEmbedding)
|
} = useModelListAndDefaultModel(ModelTypeEnum.textEmbedding)
|
||||||
const embeddingModelConfig = useMemo(() => {
|
const embeddingModelConfig = useMemo(() => {
|
||||||
@ -38,12 +41,21 @@ const EmbeddingModel = ({
|
|||||||
}
|
}
|
||||||
}, [embeddingModel, embeddingModelProvider])
|
}, [embeddingModel, embeddingModelProvider])
|
||||||
|
|
||||||
const handleRerankingModelChange = (model: DefaultModel) => {
|
const handleEmbeddingModelChange = useCallback((model: DefaultModel) => {
|
||||||
onEmbeddingModelChange?.({
|
onEmbeddingModelChange?.({
|
||||||
embeddingModelProvider: model.provider,
|
embeddingModelProvider: model.provider,
|
||||||
embeddingModel: model.model,
|
embeddingModel: model.model,
|
||||||
})
|
})
|
||||||
}
|
}, [onEmbeddingModelChange])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!embeddingModelConfig && defaultModel) {
|
||||||
|
handleEmbeddingModelChange({
|
||||||
|
provider: defaultModel.provider.provider,
|
||||||
|
model: defaultModel.model,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}, [embeddingModelConfig, defaultModel, handleEmbeddingModelChange])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Field
|
<Field
|
||||||
@ -54,7 +66,7 @@ const EmbeddingModel = ({
|
|||||||
<ModelSelector
|
<ModelSelector
|
||||||
defaultModel={embeddingModelConfig && { provider: embeddingModelConfig.providerName, model: embeddingModelConfig.modelName }}
|
defaultModel={embeddingModelConfig && { provider: embeddingModelConfig.providerName, model: embeddingModelConfig.modelName }}
|
||||||
modelList={embeddingModelList}
|
modelList={embeddingModelList}
|
||||||
onSelect={handleRerankingModelChange}
|
onSelect={handleEmbeddingModelChange}
|
||||||
readonly={readonly}
|
readonly={readonly}
|
||||||
/>
|
/>
|
||||||
</Field>
|
</Field>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user