From b08650bc4c10024dd9bf6322a7256417b513039a Mon Sep 17 00:00:00 2001 From: balibabu Date: Mon, 18 Aug 2025 12:03:33 +0800 Subject: [PATCH] Feat: Fixed the chat model setting echo issue (#9521) ### What problem does this PR solve? Feat: Fixed the chat model setting echo issue ### Type of change - [x] New Feature (non-breaking change which adds functionality) --- web/src/components/llm-setting-items/next.tsx | 22 +++++++++++---- .../llm-setting-items/use-watch-change.ts | 27 +++++++++++++------ .../hooks/use-agent-tool-initial-values.ts | 2 ++ .../chat/app-settings/chat-settings.tsx | 18 +++++++++++-- .../app-settings/use-chat-setting-schema.tsx | 25 ++++++++++------- web/src/utils/form.ts | 19 +++++++++++++ 6 files changed, 88 insertions(+), 25 deletions(-) diff --git a/web/src/components/llm-setting-items/next.tsx b/web/src/components/llm-setting-items/next.tsx index 64c837393..e6455b727 100644 --- a/web/src/components/llm-setting-items/next.tsx +++ b/web/src/components/llm-setting-items/next.tsx @@ -28,20 +28,32 @@ interface LlmSettingFieldItemsProps { options?: any[]; } -export const LlmSettingSchema = { +export const LLMIdFormField = { llm_id: z.string(), - temperature: z.coerce.number().optional(), - top_p: z.number().optional(), - presence_penalty: z.coerce.number().optional(), - frequency_penalty: z.coerce.number().optional(), +}; + +export const LlmSettingEnabledSchema = { temperatureEnabled: z.boolean().optional(), topPEnabled: z.boolean().optional(), presencePenaltyEnabled: z.boolean().optional(), frequencyPenaltyEnabled: z.boolean().optional(), maxTokensEnabled: z.boolean().optional(), +}; + +export const LlmSettingFieldSchema = { + temperature: z.coerce.number().optional(), + top_p: z.number().optional(), + presence_penalty: z.coerce.number().optional(), + frequency_penalty: z.coerce.number().optional(), max_tokens: z.number().optional(), }; +export const LlmSettingSchema = { + ...LLMIdFormField, + ...LlmSettingFieldSchema, + ...LlmSettingEnabledSchema, +}; + export function LlmSettingFieldItems({ prefix, options, diff --git a/web/src/components/llm-setting-items/use-watch-change.ts b/web/src/components/llm-setting-items/use-watch-change.ts index 5731a98ef..c2e8af020 100644 --- a/web/src/components/llm-setting-items/use-watch-change.ts +++ b/web/src/components/llm-setting-items/use-watch-change.ts @@ -1,6 +1,7 @@ import { settledModelVariableMap } from '@/constants/knowledge'; import { AgentFormContext } from '@/pages/agent/context'; import useGraphStore from '@/pages/agent/store'; +import { setChatVariableEnabledFieldValuePage } from '@/utils/chat'; import { useCallback, useContext } from 'react'; import { useFormContext } from 'react-hook-form'; @@ -11,6 +12,20 @@ export function useHandleFreedomChange( const node = useContext(AgentFormContext); const updateNodeForm = useGraphStore((state) => state.updateNodeForm); + const setLLMParameters = useCallback( + (values: Record, withPrefix: boolean) => { + for (const key in values) { + if (Object.prototype.hasOwnProperty.call(values, key)) { + const realKey = getFieldWithPrefix(key); + const element = values[key as keyof typeof values]; + + form.setValue(withPrefix ? realKey : key, element); + } + } + }, + [form, getFieldWithPrefix], + ); + const handleChange = useCallback( (parameter: string) => { const currentValues = { ...form.getValues() }; @@ -25,16 +40,12 @@ export function useHandleFreedomChange( updateNodeForm(node?.id, nextValues); } - for (const key in values) { - if (Object.prototype.hasOwnProperty.call(values, key)) { - const realKey = getFieldWithPrefix(key); - const element = values[key as keyof typeof values]; + const variableCheckBoxFieldMap = setChatVariableEnabledFieldValuePage(); - form.setValue(realKey, element); - } - } + setLLMParameters(values, true); + setLLMParameters(variableCheckBoxFieldMap, false); }, - [form, getFieldWithPrefix, node?.id, updateNodeForm], + [form, node?.id, setLLMParameters, updateNodeForm], ); return handleChange; diff --git a/web/src/pages/agent/hooks/use-agent-tool-initial-values.ts b/web/src/pages/agent/hooks/use-agent-tool-initial-values.ts index 184079d5d..b841eded5 100644 --- a/web/src/pages/agent/hooks/use-agent-tool-initial-values.ts +++ b/web/src/pages/agent/hooks/use-agent-tool-initial-values.ts @@ -54,6 +54,8 @@ export function useAgentToolInitialValues() { return pick(initialValues, 'top_n'); case Operator.WenCai: return pick(initialValues, 'top_n', 'query_type'); + case Operator.Code: + return {}; default: return initialValues; diff --git a/web/src/pages/next-chats/chat/app-settings/chat-settings.tsx b/web/src/pages/next-chats/chat/app-settings/chat-settings.tsx index ad076e452..87b064759 100644 --- a/web/src/pages/next-chats/chat/app-settings/chat-settings.tsx +++ b/web/src/pages/next-chats/chat/app-settings/chat-settings.tsx @@ -3,6 +3,10 @@ import { Form } from '@/components/ui/form'; import { Separator } from '@/components/ui/separator'; import { useFetchDialog, useSetDialog } from '@/hooks/use-chat-request'; import { transformBase64ToFile, transformFile2Base64 } from '@/utils/file-util'; +import { + removeUselessFieldsFromValues, + setLLMSettingEnabledValues, +} from '@/utils/form'; import { zodResolver } from '@hookform/resolvers/zod'; import { X } from 'lucide-react'; import { useEffect } from 'react'; @@ -26,6 +30,7 @@ export function ChatSettings({ switchSettingVisible }: ChatSettingsProps) { const form = useForm({ resolver: zodResolver(formSchema), + shouldUnregister: true, defaultValues: { name: '', language: 'English', @@ -47,14 +52,18 @@ export function ChatSettings({ switchSettingVisible }: ChatSettingsProps) { }); async function onSubmit(values: FormSchemaType) { - const icon = values.icon; + const nextValues: Record = removeUselessFieldsFromValues( + values, + 'llm_setting.', + ); + const icon = nextValues.icon; const avatar = Array.isArray(icon) && icon.length > 0 ? await transformFile2Base64(icon[0]) : ''; setDialog({ ...data, - ...values, + ...nextValues, icon: avatar, dialog_id: id, }); @@ -65,9 +74,14 @@ export function ChatSettings({ switchSettingVisible }: ChatSettingsProps) { } useEffect(() => { + const llmSettingEnabledValues = setLLMSettingEnabledValues( + data.llm_setting, + ); + const nextData = { ...data, icon: data.icon ? [transformBase64ToFile(data.icon)] : [], + ...llmSettingEnabledValues, }; form.reset(nextData as FormSchemaType); }, [data, form]); diff --git a/web/src/pages/next-chats/chat/app-settings/use-chat-setting-schema.tsx b/web/src/pages/next-chats/chat/app-settings/use-chat-setting-schema.tsx index 053dd1472..1fc244445 100644 --- a/web/src/pages/next-chats/chat/app-settings/use-chat-setting-schema.tsx +++ b/web/src/pages/next-chats/chat/app-settings/use-chat-setting-schema.tsx @@ -1,9 +1,11 @@ -import { LlmSettingSchema } from '@/components/llm-setting-items/next'; +import { + LlmSettingEnabledSchema, + LlmSettingFieldSchema, +} from '@/components/llm-setting-items/next'; import { rerankFormSchema } from '@/components/rerank'; import { vectorSimilarityWeightSchema } from '@/components/similarity-slider'; import { topnSchema } from '@/components/top-n-item'; import { useTranslate } from '@/hooks/common-hooks'; -import { omit } from 'lodash'; import { z } from 'zod'; export function useChatSettingSchema() { @@ -39,20 +41,23 @@ export function useChatSettingSchema() { }), prompt_config: promptConfigSchema, ...rerankFormSchema, - llm_setting: z.object(omit(LlmSettingSchema, 'llm_id')), + llm_setting: z.object(LlmSettingFieldSchema), + ...LlmSettingEnabledSchema, llm_id: z.string().optional(), ...vectorSimilarityWeightSchema, ...topnSchema, meta_data_filter: z .object({ method: z.string().optional(), - manual: z.array( - z.object({ - key: z.string(), - op: z.string(), - value: z.string(), - }), - ), + manual: z + .array( + z.object({ + key: z.string(), + op: z.string(), + value: z.string(), + }), + ) + .optional(), }) .optional(), }); diff --git a/web/src/utils/form.ts b/web/src/utils/form.ts index 9487e5f60..9828f48f2 100644 --- a/web/src/utils/form.ts +++ b/web/src/utils/form.ts @@ -30,3 +30,22 @@ export const removeUselessFieldsFromValues = (values: any, prefix?: string) => { export function buildOptions(data: Record) { return Object.values(data).map((val) => ({ label: val, value: val })); } + +export function setLLMSettingEnabledValues( + initialLlmSetting?: Record, +) { + const values = Object.keys(variableEnabledFieldMap).reduce< + Record + >((pre, field) => { + pre[field] = + initialLlmSetting === undefined + ? false + : !!initialLlmSetting[ + variableEnabledFieldMap[ + field as keyof typeof variableEnabledFieldMap + ] + ]; + return pre; + }, {}); + return values; +}