diff --git a/src/frontend/src/locales/de.json b/src/frontend/src/locales/de.json index 23799d73b0..cf62bfa644 100644 --- a/src/frontend/src/locales/de.json +++ b/src/frontend/src/locales/de.json @@ -951,7 +951,6 @@ "memory.noChunksYet": "Noch keine Brocken", "memory.noId": "(keine ID)", "memory.preprocessing": "Vorverarbeitung:", - "memory.preprocessingPromptPlaceholder": "Erstellen Sie eine prägnante Zusammenfassung, die die wichtigsten Fakten und den Kontext erfasst.", "memory.processedMessages": "Verarbeitete Nachrichten", "memory.providerLabel": "Leistungserbringer:", "memory.reloadSessions": "Sitzungen und Nachrichten neu laden", diff --git a/src/frontend/src/locales/en.json b/src/frontend/src/locales/en.json index ff552d14bc..151bd80b73 100644 --- a/src/frontend/src/locales/en.json +++ b/src/frontend/src/locales/en.json @@ -1563,6 +1563,7 @@ "memory.selectPreprocessingModel": "Select preprocessing model", "memory.preprocessingModel": "Preprocessing model:", "memory.preprocessingInstructions": "Preprocessing instructions:", + "memory.preprocessingInstructionsHint": "Summarize the key context, facts, and user preferences from this chat to remember for future conversations, skipping the casual chitchat.", "memory.senderLabel": "Sender:", "memory.sessionFilter": "Session filter", "memory.sessionLabel": "Session:", diff --git a/src/frontend/src/locales/es.json b/src/frontend/src/locales/es.json index 4ca9f8c6ed..f48e0f4374 100644 --- a/src/frontend/src/locales/es.json +++ b/src/frontend/src/locales/es.json @@ -951,7 +951,6 @@ "memory.noChunksYet": "Todavía no hay fragmentos", "memory.noId": "(sin ID)", "memory.preprocessing": "Preprocesamiento:", - "memory.preprocessingPromptPlaceholder": "Elabora un resumen conciso que recoja los datos clave y el contexto.", "memory.processedMessages": "Mensajes procesados", "memory.providerLabel": "Proveedor:", "memory.reloadSessions": "Actualizar sesiones y mensajes", diff --git a/src/frontend/src/locales/fr.json b/src/frontend/src/locales/fr.json index e548fec8e4..67761bc30a 100644 --- a/src/frontend/src/locales/fr.json +++ b/src/frontend/src/locales/fr.json @@ -951,7 +951,6 @@ "memory.noChunksYet": "Pas encore de morceaux", "memory.noId": "(sans identifiant)", "memory.preprocessing": "Prétraitement :", - "memory.preprocessingPromptPlaceholder": "Rédigez un résumé concis qui résume les faits essentiels et le contexte.", "memory.processedMessages": "Messages traités", "memory.providerLabel": "Fournisseur :", "memory.reloadSessions": "Actualiser les sessions et les messages", diff --git a/src/frontend/src/locales/ja.json b/src/frontend/src/locales/ja.json index 572ec3d764..79a92f44be 100644 --- a/src/frontend/src/locales/ja.json +++ b/src/frontend/src/locales/ja.json @@ -951,7 +951,6 @@ "memory.noChunksYet": "まだチャンクはありません", "memory.noId": "(IDなし)", "memory.preprocessing": "前処理:", - "memory.preprocessingPromptPlaceholder": "重要な事実と背景を捉えた簡潔な要約を作成してください。", "memory.processedMessages": "処理済みのメッセージ", "memory.providerLabel": "プロバイダー:", "memory.reloadSessions": "セッションとメッセージを再読み込みする", diff --git a/src/frontend/src/locales/pt.json b/src/frontend/src/locales/pt.json index e52cbf87c6..46d371a760 100644 --- a/src/frontend/src/locales/pt.json +++ b/src/frontend/src/locales/pt.json @@ -951,7 +951,6 @@ "memory.noChunksYet": "Ainda não há trechos", "memory.noId": "(sem ID)", "memory.preprocessing": "Pré-processamento:", - "memory.preprocessingPromptPlaceholder": "Elabore um resumo conciso que resuma os principais fatos e o contexto.", "memory.processedMessages": "Mensagens processadas", "memory.providerLabel": "Provedor:", "memory.reloadSessions": "Atualizar sessões e mensagens", diff --git a/src/frontend/src/locales/zh-Hans.json b/src/frontend/src/locales/zh-Hans.json index b593553388..944080aeb4 100644 --- a/src/frontend/src/locales/zh-Hans.json +++ b/src/frontend/src/locales/zh-Hans.json @@ -951,7 +951,6 @@ "memory.noChunksYet": "目前还没有块", "memory.noId": "(无ID)", "memory.preprocessing": "预处理:", - "memory.preprocessingPromptPlaceholder": "撰写一份简明扼要的摘要,概括关键事实和背景。", "memory.processedMessages": "已处理的消息", "memory.providerLabel": "提供商:", "memory.reloadSessions": "重新加载会话和消息", diff --git a/src/frontend/src/modals/createMemoryModal/__tests__/useCreateMemoryModal.test.tsx b/src/frontend/src/modals/createMemoryModal/__tests__/useCreateMemoryModal.test.tsx index fb45a95f5b..45b92b32ac 100644 --- a/src/frontend/src/modals/createMemoryModal/__tests__/useCreateMemoryModal.test.tsx +++ b/src/frontend/src/modals/createMemoryModal/__tests__/useCreateMemoryModal.test.tsx @@ -1,4 +1,5 @@ import { act, renderHook } from "@testing-library/react"; +import type { ModelOption } from "@/components/core/parameterRenderComponent/components/modelInputComponent/types"; import { useCreateMemoryModal } from "../useCreateMemoryModal"; const mockSetErrorData = jest.fn(); @@ -7,7 +8,12 @@ const mockMutate = jest.fn(); jest.mock("@/stores/alertStore", () => ({ __esModule: true, - default: (selector: any) => + default: ( + selector: (s: { + setErrorData: jest.Mock; + setSuccessData: jest.Mock; + }) => unknown, + ) => selector({ setErrorData: mockSetErrorData, setSuccessData: mockSetSuccessData, @@ -66,6 +72,44 @@ describe("useCreateMemoryModal", () => { expect(mockMutate).not.toHaveBeenCalled(); }); + it("requires preprocessing instructions when preprocessing is enabled", () => { + const { result } = renderHook(() => + useCreateMemoryModal({ flowId: "flow-1", onClose: jest.fn() }), + ); + + act(() => { + result.current.setName("My Memory"); + result.current.setSelectedEmbeddingModel([ + { + id: "text-embedding-3-small", + name: "text-embedding-3-small", + provider: "OpenAI", + } as ModelOption, + ]); + result.current.setPreprocessingEnabled(true); + result.current.setSelectedPreprocessingModel([ + { + id: "gpt-4o-mini", + name: "gpt-4o-mini", + provider: "OpenAI", + } as ModelOption, + ]); + // deliberately leave preprocessingPrompt empty + }); + + act(() => { + result.current.handleSubmit(); + }); + + expect(mockSetErrorData).toHaveBeenCalledWith( + expect.objectContaining({ + title: "Validation error", + list: ["Please provide preprocessing instructions"], + }), + ); + expect(mockMutate).not.toHaveBeenCalled(); + }); + it("submits valid payload", () => { const { result } = renderHook(() => useCreateMemoryModal({ flowId: "flow-1", onClose: jest.fn() }), @@ -78,12 +122,16 @@ describe("useCreateMemoryModal", () => { id: "text-embedding-3-small", name: "text-embedding-3-small", provider: "OpenAI", - } as any, + } as ModelOption, ]); result.current.setBatchSizeInput("5"); result.current.setPreprocessingEnabled(true); result.current.setSelectedPreprocessingModel([ - { id: "gpt-4o-mini", name: "gpt-4o-mini", provider: "OpenAI" } as any, + { + id: "gpt-4o-mini", + name: "gpt-4o-mini", + provider: "OpenAI", + } as ModelOption, ]); result.current.setPreprocessingPrompt("summarize"); }); diff --git a/src/frontend/src/modals/createMemoryModal/index.tsx b/src/frontend/src/modals/createMemoryModal/index.tsx index e8a3dcb207..f24ea2f658 100644 --- a/src/frontend/src/modals/createMemoryModal/index.tsx +++ b/src/frontend/src/modals/createMemoryModal/index.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import ForwardedIconComponent from "@/components/common/genericIconComponent"; import ShadTooltip from "@/components/common/shadTooltipComponent"; import ModelInputComponent from "@/components/core/parameterRenderComponent/components/modelInputComponent"; @@ -6,7 +7,6 @@ import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { Textarea } from "@/components/ui/textarea"; import { cn } from "@/utils/utils"; -import { useTranslation } from "react-i18next"; import BaseModal from "../baseModal"; import { useCreateMemoryModal } from "./useCreateMemoryModal"; @@ -183,14 +183,32 @@ export default function CreateMemoryModal({ )}
- {memory.preproc_instructions} -
-+ {memory.preproc_instructions} +
+