From d4f362164f9afdeba708e06116bb0b106c110525 Mon Sep 17 00:00:00 2001 From: Joel Date: Wed, 20 Mar 2024 20:50:07 +0800 Subject: [PATCH] fix: memory support switch --- .../nodes/_base/components/memory-config.tsx | 141 ++++++++++-------- .../components/workflow/nodes/llm/default.ts | 7 - .../components/workflow/nodes/llm/panel.tsx | 4 +- .../components/workflow/nodes/llm/types.ts | 2 +- .../workflow/nodes/llm/use-config.ts | 33 ++-- .../components/advanced-setting.tsx | 6 +- .../nodes/question-classifier/types.ts | 2 +- .../nodes/question-classifier/use-config.ts | 2 +- 8 files changed, 105 insertions(+), 92 deletions(-) diff --git a/web/app/components/workflow/nodes/_base/components/memory-config.tsx b/web/app/components/workflow/nodes/_base/components/memory-config.tsx index fa2f541210..359f265fdd 100644 --- a/web/app/components/workflow/nodes/_base/components/memory-config.tsx +++ b/web/app/components/workflow/nodes/_base/components/memory-config.tsx @@ -45,31 +45,38 @@ const RoleItem: FC = ({ type Props = { className?: string readonly: boolean - payload: Memory - onChange: (memory: Memory) => void + config: { data?: Memory } + onChange: (memory?: Memory) => void canSetRoleName?: boolean } +const MEMORY_DEFAULT: Memory = { window: { enabled: false, size: WINDOW_SIZE_DEFAULT } } + const MemoryConfig: FC = ({ className, readonly, - payload = { window: { enabled: false, size: WINDOW_SIZE_DEFAULT } }, + config = { data: MEMORY_DEFAULT }, onChange, canSetRoleName = false, }) => { const { t } = useTranslation() + const payload = config.data + const handleMemoryEnabledChange = useCallback((enabled: boolean) => { + onChange(enabled ? MEMORY_DEFAULT : undefined) + }, [onChange]) const handleWindowEnabledChange = useCallback((enabled: boolean) => { - const newPayload = produce(payload, (draft) => { + const newPayload = produce(config.data || MEMORY_DEFAULT, (draft) => { if (!draft.window) draft.window = { enabled: false, size: WINDOW_SIZE_DEFAULT } draft.window.enabled = enabled }) + onChange(newPayload) - }, [payload, onChange]) + }, [config, onChange]) const handleWindowSizeChange = useCallback((size: number | string) => { - const newPayload = produce(payload, (draft) => { + const newPayload = produce(payload || MEMORY_DEFAULT, (draft) => { if (!draft.window) draft.window = { enabled: true, size: WINDOW_SIZE_DEFAULT } let limitedSize: null | string | number = size @@ -94,13 +101,17 @@ const MemoryConfig: FC = ({ }, [payload, onChange]) const handleBlur = useCallback(() => { + const payload = config.data + if (!payload) + return + if (payload.window.size === '' || payload.window.size === null) handleWindowSizeChange(WINDOW_SIZE_DEFAULT) - }, [handleWindowSizeChange, payload.window?.size]) + }, [handleWindowSizeChange, config]) const handleRolePrefixChange = useCallback((role: MemoryRole) => { return (value: string) => { - const newPayload = produce(payload, (draft) => { + const newPayload = produce(config.data || MEMORY_DEFAULT, (draft) => { if (!draft.role_prefix) { draft.role_prefix = { user: '', @@ -111,69 +122,79 @@ const MemoryConfig: FC = ({ }) onChange(newPayload) } - }, [payload, onChange]) + }, [config, onChange]) return (
+ } > - <> - {/* window size */} -
-
- -
{t(`${i18nPrefix}.windowSize`)}
-
-
- - handleWindowSizeChange(e.target.value)} - onBlur={handleBlur} - disabled={readonly} - /> -
-
- {canSetRoleName && ( -
-
{t(`${i18nPrefix}.conversationRoleName`)}
-
- + {/* window size */} +
+
+ - {t(`${i18nPrefix}.windowSize`)}
+
+
+ + handleWindowSizeChange(e.target.value)} + onBlur={handleBlur} + disabled={readonly} />
+ {canSetRoleName && ( +
+
{t(`${i18nPrefix}.conversationRoleName`)}
+
+ + +
+
+ )} + + )} - )} -
) diff --git a/web/app/components/workflow/nodes/llm/default.ts b/web/app/components/workflow/nodes/llm/default.ts index 4f0b79ed1e..b224178c94 100644 --- a/web/app/components/workflow/nodes/llm/default.ts +++ b/web/app/components/workflow/nodes/llm/default.ts @@ -16,13 +16,6 @@ const nodeDefault: NodeDefault = { }, }, variables: [], - memory: { - role_prefix: undefined, - window: { - enabled: false, - size: 50, - }, - }, prompt_template: [{ role: PromptRole.system, text: '', diff --git a/web/app/components/workflow/nodes/llm/panel.tsx b/web/app/components/workflow/nodes/llm/panel.tsx index 7c7a744da3..84dd9dee55 100644 --- a/web/app/components/workflow/nodes/llm/panel.tsx +++ b/web/app/components/workflow/nodes/llm/panel.tsx @@ -180,11 +180,11 @@ const Panel: FC> = ({
Memory examples(Designing)
)} */} {/* Memory */} - {isChatModel && ( + {isChatMode && ( <> diff --git a/web/app/components/workflow/nodes/llm/types.ts b/web/app/components/workflow/nodes/llm/types.ts index 248db3a063..97261ca95a 100644 --- a/web/app/components/workflow/nodes/llm/types.ts +++ b/web/app/components/workflow/nodes/llm/types.ts @@ -5,7 +5,7 @@ export type LLMNodeType = CommonNodeType & { model: ModelConfig variables: Variable[] prompt_template: PromptItem[] | PromptItem - memory: Memory + memory?: Memory context: { enabled: boolean variable_selector: ValueSelector diff --git a/web/app/components/workflow/nodes/llm/use-config.ts b/web/app/components/workflow/nodes/llm/use-config.ts index bf5dbec284..fd174f5507 100644 --- a/web/app/components/workflow/nodes/llm/use-config.ts +++ b/web/app/components/workflow/nodes/llm/use-config.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useRef } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import produce from 'immer' import useVarList from '../_base/hooks/use-var-list' import { VarType } from '../../types' @@ -23,7 +23,18 @@ const useConfig = (id: string, payload: LLMNodeType) => { const isChatMode = useIsChatMode() const defaultConfig = useStore(s => s.nodesDefaultConfigs)[payload.type] - const { inputs, setInputs } = useNodeCrud(id, payload) + const [defaultRolePrefix, setDefaultRolePrefix] = useState<{ user: string; assistant: string }>({ user: '', assistant: '' }) + const { inputs, setInputs: doSetInputs } = useNodeCrud(id, payload) + const setInputs = useCallback((newInputs: LLMNodeType) => { + if (newInputs.memory && !newInputs.memory.role_prefix) { + const newPayload = produce(newInputs, (draft) => { + draft.memory!.role_prefix = defaultRolePrefix + }) + doSetInputs(newPayload) + return + } + doSetInputs(newInputs) + }, [doSetInputs, defaultRolePrefix]) const inputRef = useRef(inputs) useEffect(() => { inputRef.current = inputs @@ -68,23 +79,11 @@ const useConfig = (id: string, payload: LLMNodeType) => { } else { draft.prompt_template = promptTemplates.completion_model.prompt - if (!draft.memory) { - draft.memory = { - role_prefix: { - user: '', - assistant: '', - }, - window: { - enabled: false, - size: '', - }, - } - } - draft.memory.role_prefix = { + setDefaultRolePrefix({ user: promptTemplates.completion_model.conversation_histories_role.user_prefix, assistant: promptTemplates.completion_model.conversation_histories_role.assistant_prefix, - } + }) } }, [isChatModel]) useEffect(() => { @@ -165,7 +164,7 @@ const useConfig = (id: string, payload: LLMNodeType) => { setInputs(newInputs) }, [inputs, setInputs]) - const handleMemoryChange = useCallback((newMemory: Memory) => { + const handleMemoryChange = useCallback((newMemory?: Memory) => { const newInputs = produce(inputs, (draft) => { draft.memory = newMemory }) diff --git a/web/app/components/workflow/nodes/question-classifier/components/advanced-setting.tsx b/web/app/components/workflow/nodes/question-classifier/components/advanced-setting.tsx index 4c70ee7f3b..ec6abd66c8 100644 --- a/web/app/components/workflow/nodes/question-classifier/components/advanced-setting.tsx +++ b/web/app/components/workflow/nodes/question-classifier/components/advanced-setting.tsx @@ -11,8 +11,8 @@ type Props = { instruction: string onInstructionChange: (instruction: string) => void hideMemorySetting: boolean - memory: Memory - onMemoryChange: (memory: Memory) => void + memory?: Memory + onMemoryChange: (memory?: Memory) => void readonly?: boolean } @@ -46,7 +46,7 @@ const AdvancedSetting: FC = ({ diff --git a/web/app/components/workflow/nodes/question-classifier/types.ts b/web/app/components/workflow/nodes/question-classifier/types.ts index ec447c7242..08d9135586 100644 --- a/web/app/components/workflow/nodes/question-classifier/types.ts +++ b/web/app/components/workflow/nodes/question-classifier/types.ts @@ -10,5 +10,5 @@ export type QuestionClassifierNodeType = CommonNodeType & { model: ModelConfig classes: Topic[] instruction: string - memory: Memory + memory?: Memory } diff --git a/web/app/components/workflow/nodes/question-classifier/use-config.ts b/web/app/components/workflow/nodes/question-classifier/use-config.ts index c70663fb34..90cd316b8b 100644 --- a/web/app/components/workflow/nodes/question-classifier/use-config.ts +++ b/web/app/components/workflow/nodes/question-classifier/use-config.ts @@ -99,7 +99,7 @@ const useConfig = (id: string, payload: QuestionClassifierNodeType) => { setInputs(newInputs) }, [inputs, setInputs]) - const handleMemoryChange = useCallback((memory: Memory) => { + const handleMemoryChange = useCallback((memory?: Memory) => { const newInputs = produce(inputs, (draft) => { draft.memory = memory })