feat: support var auto rename in prompt editor (#3510)

This commit is contained in:
Joel 2024-04-16 12:00:45 +08:00 committed by GitHub
parent c52b59dcea
commit 570a5c72a9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 57 additions and 29 deletions

View File

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

View File

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