feat: merge app and meta defaults when creating workflow nodes

This commit is contained in:
zhsama
2026-01-19 23:56:15 +08:00
parent 5e49b27dba
commit 92c54d3c9d
5 changed files with 84 additions and 15 deletions

View File

@ -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>

View File

@ -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}
/>
)
})}

View File

@ -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)