mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-08-14 01:36:14 +08:00
feat: support var auto rename in prompt editor (#3510)
This commit is contained in:
parent
c52b59dcea
commit
570a5c72a9
@ -233,6 +233,16 @@ const matchNotSystemVars = (prompts: string[]) => {
|
|||||||
return uniqVars
|
return uniqVars
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const replaceOldVarInText = (text: string, oldVar: ValueSelector, newVar: ValueSelector) => {
|
||||||
|
if (!text || typeof text !== 'string')
|
||||||
|
return text
|
||||||
|
|
||||||
|
if (!newVar || newVar.length === 0)
|
||||||
|
return text
|
||||||
|
|
||||||
|
return text.replaceAll(`{{#${oldVar.join('.')}#}}`, `{{#${newVar.join('.')}#}}`)
|
||||||
|
}
|
||||||
|
|
||||||
export const getNodeUsedVars = (node: Node): ValueSelector[] => {
|
export const getNodeUsedVars = (node: Node): ValueSelector[] => {
|
||||||
const { data } = node
|
const { data } = node
|
||||||
const { type } = data
|
const { type } = data
|
||||||
@ -349,14 +359,21 @@ export const updateNodeVars = (oldNode: Node, oldVarSelector: ValueSelector, new
|
|||||||
}
|
}
|
||||||
case BlockEnum.LLM: {
|
case BlockEnum.LLM: {
|
||||||
const payload = data as LLMNodeType
|
const payload = data as LLMNodeType
|
||||||
// TODO: update in inputs
|
const isChatModel = payload.model?.mode === 'chat'
|
||||||
// if (payload.variables) {
|
if (isChatModel) {
|
||||||
// payload.variables = payload.variables.map((v) => {
|
payload.prompt_template = (payload.prompt_template as PromptItem[]).map((prompt) => {
|
||||||
// if (v.value_selector.join('.') === oldVarSelector.join('.'))
|
return {
|
||||||
// v.value_selector = newVarSelector
|
...prompt,
|
||||||
// return v
|
text: replaceOldVarInText(prompt.text, oldVarSelector, newVarSelector),
|
||||||
// })
|
}
|
||||||
// }
|
})
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
payload.prompt_template = {
|
||||||
|
...payload.prompt_template,
|
||||||
|
text: replaceOldVarInText((payload.prompt_template as PromptItem).text, oldVarSelector, newVarSelector),
|
||||||
|
}
|
||||||
|
}
|
||||||
if (payload.context?.variable_selector?.join('.') === oldVarSelector.join('.'))
|
if (payload.context?.variable_selector?.join('.') === oldVarSelector.join('.'))
|
||||||
payload.context.variable_selector = newVarSelector
|
payload.context.variable_selector = newVarSelector
|
||||||
|
|
||||||
@ -408,30 +425,35 @@ export const updateNodeVars = (oldNode: Node, oldVarSelector: ValueSelector, new
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
case BlockEnum.HttpRequest: {
|
case BlockEnum.HttpRequest: {
|
||||||
// TODO: update in inputs
|
const payload = data as HttpNodeType
|
||||||
// const payload = data as HttpNodeType
|
payload.url = replaceOldVarInText(payload.url, oldVarSelector, newVarSelector)
|
||||||
// if (payload.variables) {
|
payload.headers = replaceOldVarInText(payload.headers, oldVarSelector, newVarSelector)
|
||||||
// payload.variables = payload.variables.map((v) => {
|
payload.params = replaceOldVarInText(payload.params, oldVarSelector, newVarSelector)
|
||||||
// if (v.value_selector.join('.') === oldVarSelector.join('.'))
|
payload.body.data = replaceOldVarInText(payload.body.data, oldVarSelector, newVarSelector)
|
||||||
// v.value_selector = newVarSelector
|
|
||||||
// return v
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
case BlockEnum.Tool: {
|
case BlockEnum.Tool: {
|
||||||
// TODO: update in inputs
|
const payload = data as ToolNodeType
|
||||||
// const payload = data as ToolNodeType
|
const hasShouldRenameVar = Object.keys(payload.tool_parameters)?.filter(key => payload.tool_parameters[key].type !== ToolVarType.constant)
|
||||||
// if (payload.tool_parameters) {
|
if (hasShouldRenameVar) {
|
||||||
// payload.tool_parameters = payload.tool_parameters.map((v) => {
|
Object.keys(payload.tool_parameters).forEach((key) => {
|
||||||
// if (v.type === VarKindType.static)
|
const value = payload.tool_parameters[key]
|
||||||
// return v
|
const { type } = value
|
||||||
|
if (type === ToolVarType.variable) {
|
||||||
|
payload.tool_parameters[key] = {
|
||||||
|
...value,
|
||||||
|
value: newVarSelector,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// if (v.value_selector?.join('.') === oldVarSelector.join('.'))
|
if (type === ToolVarType.mixed) {
|
||||||
// v.value_selector = newVarSelector
|
payload.tool_parameters[key] = {
|
||||||
// return v
|
...value,
|
||||||
// })
|
value: replaceOldVarInText(payload.tool_parameters[key].value as string, oldVarSelector, newVarSelector),
|
||||||
// }
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
case BlockEnum.VariableAssigner: {
|
case BlockEnum.VariableAssigner: {
|
||||||
|
@ -28,11 +28,13 @@ const useConfig = (id: string, payload: StartNodeType) => {
|
|||||||
setFalse: hideRemoveVarConfirm,
|
setFalse: hideRemoveVarConfirm,
|
||||||
}] = useBoolean(false)
|
}] = useBoolean(false)
|
||||||
const [removedVar, setRemovedVar] = useState<ValueSelector>([])
|
const [removedVar, setRemovedVar] = useState<ValueSelector>([])
|
||||||
|
const [removedIndex, setRemoveIndex] = useState(0)
|
||||||
const handleVarListChange = useCallback((newList: InputVar[], moreInfo?: { index: number; payload: MoreInfo }) => {
|
const handleVarListChange = useCallback((newList: InputVar[], moreInfo?: { index: number; payload: MoreInfo }) => {
|
||||||
if (moreInfo?.payload?.type === ChangeType.remove) {
|
if (moreInfo?.payload?.type === ChangeType.remove) {
|
||||||
if (isVarUsedInNodes([id, moreInfo?.payload?.payload?.beforeKey || ''])) {
|
if (isVarUsedInNodes([id, moreInfo?.payload?.payload?.beforeKey || ''])) {
|
||||||
showRemoveVarConfirm()
|
showRemoveVarConfirm()
|
||||||
setRemovedVar([id, moreInfo?.payload?.payload?.beforeKey || ''])
|
setRemovedVar([id, moreInfo?.payload?.payload?.beforeKey || ''])
|
||||||
|
setRemoveIndex(moreInfo?.index as number)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -48,9 +50,13 @@ const useConfig = (id: string, payload: StartNodeType) => {
|
|||||||
}, [handleOutVarRenameChange, id, inputs, isVarUsedInNodes, setInputs, showRemoveVarConfirm])
|
}, [handleOutVarRenameChange, id, inputs, isVarUsedInNodes, setInputs, showRemoveVarConfirm])
|
||||||
|
|
||||||
const removeVarInNode = useCallback(() => {
|
const removeVarInNode = useCallback(() => {
|
||||||
|
const newInputs = produce(inputs, (draft) => {
|
||||||
|
draft.variables.splice(removedIndex, 1)
|
||||||
|
})
|
||||||
|
setInputs(newInputs)
|
||||||
removeUsedVarInNodes(removedVar)
|
removeUsedVarInNodes(removedVar)
|
||||||
hideRemoveVarConfirm()
|
hideRemoveVarConfirm()
|
||||||
}, [hideRemoveVarConfirm, removeUsedVarInNodes, removedVar])
|
}, [hideRemoveVarConfirm, inputs, removeUsedVarInNodes, removedIndex, removedVar, setInputs])
|
||||||
|
|
||||||
const handleAddVariable = useCallback((payload: InputVar) => {
|
const handleAddVariable = useCallback((payload: InputVar) => {
|
||||||
const newInputs = produce(inputs, (draft: StartNodeType) => {
|
const newInputs = produce(inputs, (draft: StartNodeType) => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user