From 204b2b260fbe275bc8b25a031a8a07fb92eff660 Mon Sep 17 00:00:00 2001 From: xsfx20 <15558128926@qq.com> Date: Thu, 2 Apr 2026 23:55:55 +0800 Subject: [PATCH 1/3] fix(ui): persist follow-up prompt defaults --- .../ui-component/extended/FollowUpPrompts.jsx | 86 ++++++++++--------- 1 file changed, 45 insertions(+), 41 deletions(-) diff --git a/packages/ui/src/ui-component/extended/FollowUpPrompts.jsx b/packages/ui/src/ui-component/extended/FollowUpPrompts.jsx index bc0d95bc1a5..bc07914a51d 100644 --- a/packages/ui/src/ui-component/extended/FollowUpPrompts.jsx +++ b/packages/ui/src/ui-component/extended/FollowUpPrompts.jsx @@ -314,6 +314,35 @@ const FollowUpPrompts = ({ dialogProps }) => { const [chatbotConfig, setChatbotConfig] = useState({}) const [selectedProvider, setSelectedProvider] = useState('none') + const getProviderInputKey = (inputParam) => (inputParam.name === 'credential' ? 'credentialId' : inputParam.name) + + const getProviderInputValue = (config, providerName, inputParam) => { + const providerConfig = config?.[providerName] ?? {} + const key = getProviderInputKey(inputParam) + const value = providerConfig[key] + + return value !== undefined && value !== null && value !== '' ? value : inputParam.default + } + + const withProviderDefaults = (config, providerName) => { + if (!providerName || providerName === 'none' || !followUpPromptsOptions[providerName]) { + return config + } + + const providerConfig = { ...(config?.[providerName] ?? {}) } + followUpPromptsOptions[providerName].inputs.forEach((inputParam) => { + const key = getProviderInputKey(inputParam) + if ((providerConfig[key] === undefined || providerConfig[key] === null || providerConfig[key] === '') && inputParam.default !== undefined) { + providerConfig[key] = inputParam.default + } + }) + + return { + ...config, + [providerName]: providerConfig + } + } + const handleChange = (key, value) => { setFollowUpPromptsConfig({ ...followUpPromptsConfig, @@ -350,35 +379,23 @@ const FollowUpPrompts = ({ dialogProps }) => { } const onSave = async () => { - // TODO: saving without changing the prompt will not save the prompt try { + const normalizedFollowUpPromptsConfig = withProviderDefaults(followUpPromptsConfig, selectedProvider) let value = { - followUpPrompts: { status: followUpPromptsConfig.status } + followUpPrompts: { status: normalizedFollowUpPromptsConfig.status } } - chatbotConfig.followUpPrompts = value.followUpPrompts - - // if the prompt is not set, save the default prompt - const selectedProvider = followUpPromptsConfig.selectedProvider - - if (selectedProvider && followUpPromptsConfig[selectedProvider] && followUpPromptsOptions[selectedProvider]) { - if (!followUpPromptsConfig[selectedProvider].prompt) { - followUpPromptsConfig[selectedProvider].prompt = followUpPromptsOptions[selectedProvider].inputs.find( - (input) => input.name === 'prompt' - )?.default - } - - if (!followUpPromptsConfig[selectedProvider].temperature) { - followUpPromptsConfig[selectedProvider].temperature = followUpPromptsOptions[selectedProvider].inputs.find( - (input) => input.name === 'temperature' - )?.default - } + const nextChatbotConfig = { + ...chatbotConfig, + followUpPrompts: value.followUpPrompts } const saveResp = await chatflowsApi.updateChatflow(dialogProps.chatflow.id, { - chatbotConfig: JSON.stringify(chatbotConfig), - followUpPrompts: JSON.stringify(followUpPromptsConfig) + chatbotConfig: JSON.stringify(nextChatbotConfig), + followUpPrompts: JSON.stringify(normalizedFollowUpPromptsConfig) }) if (saveResp.data) { + setChatbotConfig(nextChatbotConfig) + setFollowUpPromptsConfig(normalizedFollowUpPromptsConfig) enqueueSnackbar({ message: 'Follow-up Prompts configuration saved', options: { @@ -433,12 +450,8 @@ const FollowUpPrompts = ({ dialogProps }) => { const provider = followUpPromptsOptions[selectedProvider] for (let inputParam of provider.inputs) { if (!inputParam.optional) { - const param = inputParam.name === 'credential' ? 'credentialId' : inputParam.name - if ( - !followUpPromptsConfig[selectedProvider] || - !followUpPromptsConfig[selectedProvider][param] || - followUpPromptsConfig[selectedProvider][param] === '' - ) { + const value = getProviderInputValue(followUpPromptsConfig, selectedProvider, inputParam) + if (!value || value === '') { return true } } @@ -550,12 +563,7 @@ const FollowUpPrompts = ({ dialogProps }) => { key={`${selectedProvider}-${inputParam.name}`} inputParam={inputParam} onChange={(newValue) => setValue(newValue, selectedProvider, inputParam.name)} - value={ - followUpPromptsConfig[selectedProvider] && - followUpPromptsConfig[selectedProvider][inputParam.name] - ? followUpPromptsConfig[selectedProvider][inputParam.name] - : inputParam.default ?? '' - } + value={getProviderInputValue(followUpPromptsConfig, selectedProvider, inputParam) ?? ''} /> )} @@ -570,10 +578,8 @@ const FollowUpPrompts = ({ dialogProps }) => { inputParams: followUpPromptsOptions[selectedProvider].inputs }} value={ - followUpPromptsConfig[selectedProvider] && - followUpPromptsConfig[selectedProvider][inputParam.name] - ? followUpPromptsConfig[selectedProvider][inputParam.name] - : inputParam.default ?? 'choose an option' + getProviderInputValue(followUpPromptsConfig, selectedProvider, inputParam) ?? + 'choose an option' } onSelect={(newValue) => setValue(newValue, selectedProvider, inputParam.name)} /> @@ -587,10 +593,8 @@ const FollowUpPrompts = ({ dialogProps }) => { options={inputParam.options} onSelect={(newValue) => setValue(newValue, selectedProvider, inputParam.name)} value={ - followUpPromptsConfig[selectedProvider] && - followUpPromptsConfig[selectedProvider][inputParam.name] - ? followUpPromptsConfig[selectedProvider][inputParam] - : inputParam.default ?? 'choose an option' + getProviderInputValue(followUpPromptsConfig, selectedProvider, inputParam) ?? + 'choose an option' } /> )} From 1843e519b22ce5908fd7258d5fc409d26f2f307c Mon Sep 17 00:00:00 2001 From: xsfx20 <15558128926@qq.com> Date: Fri, 3 Apr 2026 00:07:36 +0800 Subject: [PATCH 2/3] fix(ui): allow zero-valued follow-up settings --- packages/ui/src/ui-component/extended/FollowUpPrompts.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/ui-component/extended/FollowUpPrompts.jsx b/packages/ui/src/ui-component/extended/FollowUpPrompts.jsx index bc07914a51d..48627671225 100644 --- a/packages/ui/src/ui-component/extended/FollowUpPrompts.jsx +++ b/packages/ui/src/ui-component/extended/FollowUpPrompts.jsx @@ -451,7 +451,7 @@ const FollowUpPrompts = ({ dialogProps }) => { for (let inputParam of provider.inputs) { if (!inputParam.optional) { const value = getProviderInputValue(followUpPromptsConfig, selectedProvider, inputParam) - if (!value || value === '') { + if (value == null || value === '') { return true } } From 48a0e372bcea2ef68bc09af8036203bf90851dbd Mon Sep 17 00:00:00 2001 From: xsfx20 <15558128926@qq.com> Date: Fri, 3 Apr 2026 00:17:14 +0800 Subject: [PATCH 3/3] refactor(ui): simplify follow-up prompt nullish checks --- packages/ui/src/ui-component/extended/FollowUpPrompts.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/ui-component/extended/FollowUpPrompts.jsx b/packages/ui/src/ui-component/extended/FollowUpPrompts.jsx index 48627671225..69d47e51362 100644 --- a/packages/ui/src/ui-component/extended/FollowUpPrompts.jsx +++ b/packages/ui/src/ui-component/extended/FollowUpPrompts.jsx @@ -321,7 +321,7 @@ const FollowUpPrompts = ({ dialogProps }) => { const key = getProviderInputKey(inputParam) const value = providerConfig[key] - return value !== undefined && value !== null && value !== '' ? value : inputParam.default + return value != null && value !== '' ? value : inputParam.default } const withProviderDefaults = (config, providerName) => { @@ -332,7 +332,7 @@ const FollowUpPrompts = ({ dialogProps }) => { const providerConfig = { ...(config?.[providerName] ?? {}) } followUpPromptsOptions[providerName].inputs.forEach((inputParam) => { const key = getProviderInputKey(inputParam) - if ((providerConfig[key] === undefined || providerConfig[key] === null || providerConfig[key] === '') && inputParam.default !== undefined) { + if ((providerConfig[key] == null || providerConfig[key] === '') && inputParam.default !== undefined) { providerConfig[key] = inputParam.default } })