From c4a66204f0a5c2fd3d7757eb080bf5f179476249 Mon Sep 17 00:00:00 2001 From: chanx <1243304602@qq.com> Date: Fri, 26 Dec 2025 15:56:41 +0800 Subject: [PATCH] Fix: Memory-related bug fixes (#12238) ### What problem does this PR solve? Fix: Memory-related bug fixes - Forget memory button text - Adjust memory storage interface ### Type of change - [x] Bug Fix (non-breaking change which fixes an issue) --- web/src/components/confirm-delete-dialog.tsx | 4 +-- web/src/locales/en.ts | 4 +++ web/src/locales/zh.ts | 6 +++- web/src/pages/memories/constants/index.tsx | 13 +++---- .../memory/memory-message/message-table.tsx | 1 + .../memory-setting/advanced-settings-form.tsx | 2 +- web/src/pages/memory/memory-setting/hook.ts | 6 ++-- web/src/pages/memory/memory-setting/index.tsx | 18 +++++----- .../memory-setting/memory-model-form.tsx | 34 ++++++++++++------- web/src/services/memory-service.ts | 2 +- 10 files changed, 56 insertions(+), 34 deletions(-) diff --git a/web/src/components/confirm-delete-dialog.tsx b/web/src/components/confirm-delete-dialog.tsx index 22ac73fcb..99859ccc7 100644 --- a/web/src/components/confirm-delete-dialog.tsx +++ b/web/src/components/confirm-delete-dialog.tsx @@ -91,13 +91,13 @@ export function ConfirmDeleteDialog({ - {okButtonText || t('common.cancel')} + {cancelButtonText || t('common.cancel')} - {cancelButtonText || t('common.delete')} + {okButtonText || t('common.delete')} diff --git a/web/src/locales/en.ts b/web/src/locales/en.ts index 335e17ad6..9407cc7b4 100644 --- a/web/src/locales/en.ts +++ b/web/src/locales/en.ts @@ -112,6 +112,10 @@ export default { Semantic Memory: General knowledge and facts about the user and world. Episodic Memory: Time-stamped records of specific events and experiences. Procedural Memory: Learned skills, habits, and automated procedures.`, + raw: 'raw', + semantic: 'semantic', + episodic: 'episodic', + procedural: 'procedural', editName: 'Edit name', memory: 'Memory', createMemory: 'Create memory', diff --git a/web/src/locales/zh.ts b/web/src/locales/zh.ts index da3874bc0..de129bc8f 100644 --- a/web/src/locales/zh.ts +++ b/web/src/locales/zh.ts @@ -99,11 +99,15 @@ export default { llmTooltip: '分析对话内容,提取关键信息,并生成结构化的记忆摘要。', embeddingModelTooltip: '将文本转换为数值向量,用于语义相似度搜索和记忆检索。', - embeddingModelError: '记忆类型为必填项,且"原始"类型不可删除。', + embeddingModelError: '记忆类型为必填项,且"row"类型不可删除。', memoryTypeTooltip: `原始: 用户与代理之间的原始对话内容(默认必需)。 语义记忆: 关于用户和世界的通用知识和事实。 情景记忆: 带时间戳的特定事件和经历记录。 程序记忆: 学习的技能、习惯和自动化程序。`, + raw: '原始', + semantic: '语义', + episodic: '情景', + procedural: '程序', editName: '编辑名称', memory: '记忆', createMemory: '创建记忆', diff --git a/web/src/pages/memories/constants/index.tsx b/web/src/pages/memories/constants/index.tsx index 6b72cca81..8b4cfaa33 100644 --- a/web/src/pages/memories/constants/index.tsx +++ b/web/src/pages/memories/constants/index.tsx @@ -10,6 +10,12 @@ export enum MemoryType { Episodic = 'episodic', Procedural = 'procedural', } +export const MemoryOptions = (t: TFunction) => [ + { label: t('memories.raw'), value: MemoryType.Raw }, + { label: t('memories.semantic'), value: MemoryType.Semantic }, + { label: t('memories.episodic'), value: MemoryType.Episodic }, + { label: t('memories.procedural'), value: MemoryType.Procedural }, +]; export const createMemoryFields = (t: TFunction) => [ { @@ -24,12 +30,7 @@ export const createMemoryFields = (t: TFunction) => type: FormFieldType.MultiSelect, placeholder: t('memories.descriptionPlaceholder'), tooltip: t('memories.memoryTypeTooltip'), - options: [ - { label: 'Raw', value: MemoryType.Raw }, - { label: 'Semantic', value: MemoryType.Semantic }, - { label: 'Episodic', value: MemoryType.Episodic }, - { label: 'Procedural', value: MemoryType.Procedural }, - ], + options: MemoryOptions(t), required: true, customValidate: (value) => { if (!value.includes(MemoryType.Raw) || !value.length) { diff --git a/web/src/pages/memory/memory-message/message-table.tsx b/web/src/pages/memory/memory-message/message-table.tsx index 1d9c486fb..237e20b66 100644 --- a/web/src/pages/memory/memory-message/message-table.tsx +++ b/web/src/pages/memory/memory-message/message-table.tsx @@ -251,6 +251,7 @@ export function MemoryTable({ title={t('memory.messages.forgetMessage')} open={showDeleteDialog} onOpenChange={setShowDeleteDialog} + okButtonText={t('common.confirm')} content={{ title: t('memory.messages.forgetMessageTip'), node: ( diff --git a/web/src/pages/memory/memory-setting/advanced-settings-form.tsx b/web/src/pages/memory/memory-setting/advanced-settings-form.tsx index 088102cd6..fc2b1b48a 100644 --- a/web/src/pages/memory/memory-setting/advanced-settings-form.tsx +++ b/web/src/pages/memory/memory-setting/advanced-settings-form.tsx @@ -95,7 +95,7 @@ export const AdvancedSettingsForm = () => { // placeholder: t('memory.config.storageTypePlaceholder'), options: [ // { label: 'LRU', value: 'LRU' }, - { label: 'FIFO', value: 'FIFO' }, + { label: 'FIFO', value: 'fifo' }, ], required: false, }} diff --git a/web/src/pages/memory/memory-setting/hook.ts b/web/src/pages/memory/memory-setting/hook.ts index ed54d40b6..b838d0136 100644 --- a/web/src/pages/memory/memory-setting/hook.ts +++ b/web/src/pages/memory/memory-setting/hook.ts @@ -15,9 +15,9 @@ export const useUpdateMemoryConfig = () => { try { const params = omit(data, [ 'id', - 'memory_type', - 'embd_id', - 'storage_type', + // 'memory_type', + // 'embd_id', + // 'storage_type', ]); res = await updateMemory({ // ...memoryDataTemp, diff --git a/web/src/pages/memory/memory-setting/index.tsx b/web/src/pages/memory/memory-setting/index.tsx index c0b82f97d..e290574a8 100644 --- a/web/src/pages/memory/memory-setting/index.tsx +++ b/web/src/pages/memory/memory-setting/index.tsx @@ -6,9 +6,9 @@ import { MainContainer } from '@/pages/dataset/dataset-setting/configuration-for import { TopTitle } from '@/pages/dataset/dataset-title'; import { IMemory } from '@/pages/memories/interface'; import { zodResolver } from '@hookform/resolvers/zod'; -import { t } from 'i18next'; import { useEffect } from 'react'; import { useForm } from 'react-hook-form'; +import { useTranslation } from 'react-i18next'; import { z } from 'zod'; import { useFetchMemoryBaseConfiguration } from '../hooks/use-memory-setting'; import { @@ -24,14 +24,15 @@ import { memoryModelFormSchema, } from './memory-model-form'; -const MemoryMessageSchema = z.object({ - id: z.string(), - ...basicInfoSchema, - ...memoryModelFormSchema, - ...advancedSettingsFormSchema, -}); // type MemoryMessageForm = z.infer; export default function MemoryMessage() { + const { t } = useTranslation(); + const MemoryMessageSchema = z.object({ + id: z.string(), + ...basicInfoSchema, + ...memoryModelFormSchema(t), + ...advancedSettingsFormSchema, + }); const form = useForm({ resolver: zodResolver(MemoryMessageSchema), defaultValues: { @@ -58,11 +59,12 @@ export default function MemoryMessage() { system_prompt: data?.system_prompt || '', user_prompt: data?.user_prompt || '', forgetting_policy: data?.forgetting_policy || 'FIFO', - storage_type: data?.storage_type || 'table', + storage_type: data?.storage_type || 'Table', permissions: data?.permissions || 'me', }); }, [data, form]); const onSubmit = (data: IMemory) => { + console.log('data', data); onMemoryRenameOk(data); }; return ( diff --git a/web/src/pages/memory/memory-setting/memory-model-form.tsx b/web/src/pages/memory/memory-setting/memory-model-form.tsx index 97c64208b..353784733 100644 --- a/web/src/pages/memory/memory-setting/memory-model-form.tsx +++ b/web/src/pages/memory/memory-setting/memory-model-form.tsx @@ -1,21 +1,30 @@ import { FormFieldType, RenderField } from '@/components/dynamic-form'; import { useModelOptions } from '@/components/llm-setting-items/llm-form-field'; import { EmbeddingSelect } from '@/pages/dataset/dataset-setting/configuration/common-item'; -import { MemoryType } from '@/pages/memories/constants'; +import { MemoryOptions, MemoryType } from '@/pages/memories/constants'; +import { TFunction } from 'i18next'; import { useTranslation } from 'react-i18next'; import { z } from 'zod'; import { useFetchMemoryMessageList } from '../memory-message/hook'; -export const memoryModelFormSchema = { +export const memoryModelFormSchema = (t: TFunction) => ({ embd_id: z.string(), llm_id: z.string(), - memory_type: z.array(z.string()).optional(), + memory_type: z.array(z.string()).superRefine((data, ctx) => { + if (!data.includes(MemoryType.Raw) || !data.length) { + ctx.addIssue({ + // path: ['memory_type'], + message: t('memories.embeddingModelError'), + code: 'custom', + }); + } + }), memory_size: z.number().optional(), -}; +}); export const defaultMemoryModelForm = { embd_id: '', llm_id: '', - memory_type: [MemoryType.Raw], + memory_type: [], memory_size: 0, }; export const MemoryModelForm = () => { @@ -66,13 +75,14 @@ export const MemoryModelForm = () => { horizontal: true, placeholder: t('memories.memoryTypePlaceholder'), tooltip: t('memories.memoryTypeTooltip'), - disabled: true, - options: [ - { label: 'Raw', value: 'raw' }, - { label: 'Semantic', value: 'semantic' }, - { label: 'Episodic', value: 'episodic' }, - { label: 'Procedural', value: 'procedural' }, - ], + disabled: data?.messages?.total_count > 0, + options: MemoryOptions(t), + customValidate: (value) => { + if (!value.includes(MemoryType.Raw) || !value.length) { + return t('memories.embeddingModelError'); + } + return true; + }, required: true, }} /> diff --git a/web/src/services/memory-service.ts b/web/src/services/memory-service.ts index dcb6df479..5cef6d6f3 100644 --- a/web/src/services/memory-service.ts +++ b/web/src/services/memory-service.ts @@ -34,7 +34,7 @@ const methods = { } as const; const memoryService = registerNextServer(methods); export const updateMemoryById = (id: string, data: any) => { - return request.put(updateMemorySetting(id), { data }); + return request.put(updateMemorySetting(id), { ...data }); }; export const getMemoryDetailById = (id: string, data: any) => { return request.get(getMemoryDetail(id), { params: data });