diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index fc663a3e2a..92fb983053 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -129,6 +129,7 @@ let imageGenerationEnabled = false; let webSearchEnabled = false; let codeInterpreterEnabled = false; + let memoryEnabled = true; let showCommands = false; @@ -166,6 +167,7 @@ selectedFilterIds = []; webSearchEnabled = false; imageGenerationEnabled = false; + memoryEnabled = true; const storageChatInput = sessionStorage.getItem( `chat-input${chatIdProp ? `-${chatIdProp}` : ''}` @@ -190,6 +192,7 @@ webSearchEnabled = input.webSearchEnabled; imageGenerationEnabled = input.imageGenerationEnabled; codeInterpreterEnabled = input.codeInterpreterEnabled; + memoryEnabled = input.memoryEnabled; } } catch (e) {} } @@ -250,6 +253,7 @@ webSearchEnabled = false; imageGenerationEnabled = false; codeInterpreterEnabled = false; + memoryEnabled = true; setDefaults(); }; @@ -296,6 +300,10 @@ if (model.info?.meta?.capabilities?.['code_interpreter']) { codeInterpreterEnabled = model.info.meta.defaultFeatureIds.includes('code_interpreter'); } + + if (model.info?.meta?.capabilities?.['memory']) { + memoryEnabled = model.info.meta.defaultFeatureIds.includes('memory'); + } } } }; @@ -559,6 +567,7 @@ webSearchEnabled = false; imageGenerationEnabled = false; codeInterpreterEnabled = false; + memoryEnabled = true; try { const input = JSON.parse(storageChatInput); @@ -571,6 +580,7 @@ webSearchEnabled = input.webSearchEnabled; imageGenerationEnabled = input.imageGenerationEnabled; codeInterpreterEnabled = input.codeInterpreterEnabled; + memoryEnabled = input.memoryEnabled; } } catch (e) {} } @@ -1749,6 +1759,11 @@ features = { ...features, memory: true }; } + // 如果用户手动切换了记忆开关,覆盖全局设置 + if (memoryEnabled !== undefined && memoryEnabled !== ($settings?.memory ?? false)) { + features = { ...features, memory: memoryEnabled }; + } + return features; }; @@ -2454,6 +2469,7 @@ bind:imageGenerationEnabled bind:codeInterpreterEnabled bind:webSearchEnabled + bind:memoryEnabled bind:atSelectedModel bind:showCommands toolServers={$toolServers} @@ -2506,6 +2522,7 @@ bind:imageGenerationEnabled bind:codeInterpreterEnabled bind:webSearchEnabled + bind:memoryEnabled bind:atSelectedModel bind:showCommands toolServers={$toolServers} diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index c525dcf34c..cc5d8b10ff 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -58,6 +58,7 @@ import Tooltip from '../common/Tooltip.svelte'; import FileItem from '../common/FileItem.svelte'; import Image from '../common/Image.svelte'; + import Switch from '../common/Switch.svelte'; import XMark from '../icons/XMark.svelte'; import Headphone from '../icons/Headphone.svelte'; @@ -108,6 +109,7 @@ export let imageGenerationEnabled = false; export let webSearchEnabled = false; export let codeInterpreterEnabled = false; + export let memoryEnabled = false; let showInputVariablesModal = false; let inputVariablesModalCallback = (variableValues) => {}; @@ -138,7 +140,8 @@ selectedFilterIds, imageGenerationEnabled, webSearchEnabled, - codeInterpreterEnabled + codeInterpreterEnabled, + memoryEnabled }); const inputVariableHandler = async (text: string): Promise => { @@ -475,6 +478,9 @@ $config?.features?.enable_code_interpreter && ($_user.role === 'admin' || $_user?.permissions?.features?.code_interpreter); + let showMemoryButton = false; + $: showMemoryButton = $settings?.memory !== undefined; + const scrollToBottom = () => { const element = document.getElementById('messages-container'); element.scrollTo({ @@ -1330,6 +1336,7 @@ webSearchEnabled = false; imageGenerationEnabled = false; codeInterpreterEnabled = false; + memoryEnabled = false; } }} on:paste={async (e) => { @@ -1471,6 +1478,7 @@ bind:webSearchEnabled bind:imageGenerationEnabled bind:codeInterpreterEnabled + bind:memoryEnabled closeOnOutsideClick={integrationsMenuCloseOnOutsideClick} onShowValves={(e) => { const { type, id } = e; @@ -1495,6 +1503,23 @@ {/if} + {#if showMemoryButton} +
+
+ + {$i18n.t('Memory')} +
+ { + await tick(); + }} + /> +
+ {/if} + {#if selectedModelIds.length === 1 && $models.find((m) => m.id === selectedModelIds[0])?.has_user_valves}
diff --git a/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte b/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte index ffa7e72958..79e8bfd215 100644 --- a/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte +++ b/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte @@ -39,6 +39,7 @@ export let imageGenerationEnabled = false; export let showCodeInterpreterButton = false; export let codeInterpreterEnabled = false; + export let memoryEnabled = false; export let onShowValves: Function; export let onClose: Function; diff --git a/src/lib/components/chat/Placeholder.svelte b/src/lib/components/chat/Placeholder.svelte index 509ef9f2ba..a6e54c2f21 100644 --- a/src/lib/components/chat/Placeholder.svelte +++ b/src/lib/components/chat/Placeholder.svelte @@ -53,6 +53,7 @@ export let imageGenerationEnabled = false; export let codeInterpreterEnabled = false; export let webSearchEnabled = false; + export let memoryEnabled = false; export let onSelect = (e) => {}; export let onChange = (e) => {}; @@ -213,6 +214,7 @@ bind:imageGenerationEnabled bind:codeInterpreterEnabled bind:webSearchEnabled + bind:memoryEnabled bind:atSelectedModel bind:showCommands {toolServers}