mirror of
https://github.com/langgenius/dify.git
synced 2026-05-09 12:59:18 +08:00
feat: merge app and meta defaults when creating workflow nodes
This commit is contained in:
parent
5e49b27dba
commit
92c54d3c9d
@ -199,9 +199,11 @@ const AgentNodeList: FC<Props> = ({
|
||||
onSelect={onSelect}
|
||||
isHighlighted={enableKeyboardNavigation && index === activeIndex}
|
||||
onSetHighlight={enableKeyboardNavigation ? () => setActiveIndex(index) : undefined}
|
||||
registerRef={enableKeyboardNavigation ? (element) => {
|
||||
itemRefs.current[index] = element
|
||||
} : undefined}
|
||||
registerRef={enableKeyboardNavigation
|
||||
? (element) => {
|
||||
itemRefs.current[index] = element
|
||||
}
|
||||
: undefined}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
|
||||
@ -531,9 +531,11 @@ const VarReferenceVars: FC<Props> = ({
|
||||
preferSchemaType={preferSchemaType}
|
||||
isHighlighted={enableKeyboardNavigation && itemIndex === activeIndex}
|
||||
onSetHighlight={enableKeyboardNavigation ? () => setActiveIndex(itemIndex) : undefined}
|
||||
registerRef={enableKeyboardNavigation ? (element) => {
|
||||
itemRefs.current[itemIndex] = element
|
||||
} : undefined}
|
||||
registerRef={enableKeyboardNavigation
|
||||
? (element) => {
|
||||
itemRefs.current[itemIndex] = element
|
||||
}
|
||||
: undefined}
|
||||
/>
|
||||
)
|
||||
})}
|
||||
|
||||
@ -26,7 +26,7 @@ import { VarKindType as VarKindTypeEnum } from '@/app/components/workflow/nodes/
|
||||
import { Type } from '@/app/components/workflow/nodes/llm/types'
|
||||
import { useStore } from '@/app/components/workflow/store'
|
||||
import { BlockEnum, EditionType, isPromptMessageContext, PromptRole, VarType } from '@/app/components/workflow/types'
|
||||
import { generateNewNode, getNodeCustomTypeByNodeDataType } from '@/app/components/workflow/utils'
|
||||
import { generateNewNode, getNodeCustomTypeByNodeDataType, mergeNodeDefaultData } from '@/app/components/workflow/utils'
|
||||
import { useGetLanguage } from '@/context/i18n'
|
||||
import { useStrategyProviders } from '@/service/use-strategy'
|
||||
import { cn } from '@/utils/classnames'
|
||||
@ -169,6 +169,7 @@ const MixedVariableTextInput = ({
|
||||
const nodes = useNodes<CommonNodeType>()
|
||||
const controlPromptEditorRerenderKey = useStore(s => s.controlPromptEditorRerenderKey)
|
||||
const setControlPromptEditorRerenderKey = useStore(s => s.setControlPromptEditorRerenderKey)
|
||||
const nodesDefaultConfigs = useStore(s => s.nodesDefaultConfigs)
|
||||
const { nodesMap: nodesMetaDataMap } = useNodesMetaData()
|
||||
const { handleSyncWorkflowDraft } = useNodesSyncDraft()
|
||||
const [isSubGraphModalOpen, setIsSubGraphModalOpen] = useState(false)
|
||||
@ -219,8 +220,9 @@ const MixedVariableTextInput = ({
|
||||
}) => {
|
||||
if (!toolNodeId)
|
||||
return null
|
||||
const defaultValue = nodesMetaDataMap?.[payload.nodeType]?.defaultValue as Partial<LLMNodeType | CodeNodeType> | undefined
|
||||
if (!defaultValue)
|
||||
const metaDefault = nodesMetaDataMap?.[payload.nodeType]?.defaultValue as Partial<LLMNodeType | CodeNodeType> | undefined
|
||||
const appDefault = nodesDefaultConfigs?.[payload.nodeType] as Partial<LLMNodeType | CodeNodeType> | undefined
|
||||
if (!metaDefault && !appDefault)
|
||||
return null
|
||||
|
||||
const { getNodes, setNodes } = reactFlowStore.getState()
|
||||
@ -231,15 +233,22 @@ const MixedVariableTextInput = ({
|
||||
const nextNodes = shouldReplace
|
||||
? currentNodes.filter(node => node.id !== payload.extractorNodeId)
|
||||
: currentNodes
|
||||
const mergedData = mergeNodeDefaultData({
|
||||
nodeType: payload.nodeType,
|
||||
metaDefault,
|
||||
appDefault,
|
||||
overrideData: payload.data,
|
||||
})
|
||||
const resolvedTitle = mergedData.title ?? metaDefault?.title ?? appDefault?.title ?? ''
|
||||
const resolvedDesc = mergedData.desc ?? metaDefault?.desc ?? appDefault?.desc ?? ''
|
||||
const { newNode } = generateNewNode({
|
||||
id: payload.extractorNodeId,
|
||||
type: getNodeCustomTypeByNodeDataType(payload.nodeType),
|
||||
data: {
|
||||
...defaultValue,
|
||||
...payload.data,
|
||||
...mergedData,
|
||||
type: payload.nodeType,
|
||||
title: defaultValue?.title ?? '',
|
||||
desc: defaultValue.desc || '',
|
||||
title: resolvedTitle,
|
||||
desc: resolvedDesc,
|
||||
parent_node_id: toolNodeId,
|
||||
},
|
||||
position: {
|
||||
@ -254,7 +263,7 @@ const MixedVariableTextInput = ({
|
||||
}
|
||||
|
||||
return existingNode
|
||||
}, [handleSyncWorkflowDraft, nodesMetaDataMap, reactFlowStore, toolNodeId])
|
||||
}, [handleSyncWorkflowDraft, nodesDefaultConfigs, nodesMetaDataMap, reactFlowStore, toolNodeId])
|
||||
|
||||
const ensureAssembleExtractorNode = useCallback(() => {
|
||||
if (!assembleExtractorNodeId)
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
import type { CodeNodeType, OutputVar } from '../nodes/code/types'
|
||||
import type { IterationNodeType } from '../nodes/iteration/types'
|
||||
import type { LoopNodeType } from '../nodes/loop/types'
|
||||
import type {
|
||||
CommonNodeType,
|
||||
Node,
|
||||
} from '../types'
|
||||
import {
|
||||
@ -20,6 +22,60 @@ import {
|
||||
BlockEnum,
|
||||
} from '../types'
|
||||
|
||||
type MergeNodeDefaultDataParams<T extends CommonNodeType<Record<string, unknown>>> = {
|
||||
nodeType: BlockEnum
|
||||
metaDefault?: Partial<T>
|
||||
appDefault?: Partial<T>
|
||||
baseData?: Partial<T>
|
||||
overrideData?: Partial<T>
|
||||
}
|
||||
|
||||
const pickNonEmptyArray = <T>(value?: T[]) => {
|
||||
return Array.isArray(value) && value.length > 0 ? value : undefined
|
||||
}
|
||||
|
||||
export const mergeNodeDefaultData = <T extends CommonNodeType<Record<string, unknown>>>({
|
||||
nodeType,
|
||||
metaDefault,
|
||||
appDefault,
|
||||
baseData,
|
||||
overrideData,
|
||||
}: MergeNodeDefaultDataParams<T>) => {
|
||||
const merged = {
|
||||
...(metaDefault || {}),
|
||||
...(appDefault || {}),
|
||||
...(baseData || {}),
|
||||
...(overrideData || {}),
|
||||
} as Partial<T>
|
||||
|
||||
if (nodeType === BlockEnum.Code) {
|
||||
const codeMetaDefault = (metaDefault || {}) as Partial<CodeNodeType>
|
||||
const codeAppDefault = (appDefault || {}) as Partial<CodeNodeType>
|
||||
const codeBase = (baseData || {}) as Partial<CodeNodeType>
|
||||
const codeOverride = (overrideData || {}) as Partial<CodeNodeType>
|
||||
const codeDefaults = {
|
||||
...codeMetaDefault,
|
||||
...codeAppDefault,
|
||||
}
|
||||
|
||||
const outputs: OutputVar = {
|
||||
...(codeDefaults.outputs || {}),
|
||||
...(codeBase.outputs || {}),
|
||||
...(codeOverride.outputs || {}),
|
||||
}
|
||||
if (Object.keys(outputs).length > 0)
|
||||
(merged as Partial<CodeNodeType>).outputs = outputs
|
||||
|
||||
const resolvedVariables = pickNonEmptyArray(codeBase.variables)
|
||||
?? pickNonEmptyArray(codeOverride.variables)
|
||||
?? pickNonEmptyArray(codeDefaults.variables)
|
||||
if (resolvedVariables)
|
||||
(merged as Partial<CodeNodeType>).variables = resolvedVariables
|
||||
}
|
||||
|
||||
return merged
|
||||
}
|
||||
|
||||
export function generateNewNode<T = {}>({ data, position, id, zIndex, type, ...rest }: Omit<Node<T>, 'id'> & { id?: string }): {
|
||||
newNode: Node
|
||||
newIterationStartNode?: Node
|
||||
|
||||
@ -4538,4 +4538,4 @@
|
||||
"count": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user