From dd2f27d6a375f0be2b20639c00aee1bdd4c0898b Mon Sep 17 00:00:00 2001 From: chanx <1243304602@qq.com> Date: Tue, 7 Jul 2026 16:28:58 +0800 Subject: [PATCH] fix: Restrict the agent to using memory compatible with the embedding model. (#16699) --- web/src/components/memories-form-field.tsx | 86 +++++++++++++++++++--- web/src/interfaces/database/memory.ts | 2 + 2 files changed, 79 insertions(+), 9 deletions(-) diff --git a/web/src/components/memories-form-field.tsx b/web/src/components/memories-form-field.tsx index 2d04a4921..61c5ab047 100644 --- a/web/src/components/memories-form-field.tsx +++ b/web/src/components/memories-form-field.tsx @@ -1,26 +1,94 @@ import { useFetchAllMemoryList } from '@/hooks/use-memory-request'; +import { IMemory } from '@/interfaces/database/memory'; +import { useMemo, useRef } from 'react'; +import { useFormContext, useWatch } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; +import { RAGFlowAvatar } from './ragflow-avatar'; import { RAGFlowFormItem } from './ragflow-form'; import { MultiSelect } from './ui/multi-select'; type MemoriesFormFieldProps = { label: string; + name?: string; }; -export function MemoriesFormField({ label }: MemoriesFormFieldProps) { - const { t } = useTranslation(); - const memoryList = useFetchAllMemoryList(); +function MemoryLabel({ text }: { text: string }) { + return ( +
+ {text} +
+ ); +} - const options = memoryList.data?.map((memory) => ({ - label: memory.name, - value: memory.id, - })); +export function useDisableDifferenceEmbeddingMemory(name: string) { + const form = useFormContext(); + const memoryIds = useWatch({ name, control: form.control }); + const { data: memoryListOrigin } = useFetchAllMemoryList(); + const memoryCacheRef = useRef(new Map()); + + const memoryList = useMemo(() => { + memoryListOrigin?.forEach((memory) => { + memoryCacheRef.current.set(memory.id, memory); + }); + + const selectedIds = Array.isArray(memoryIds) ? memoryIds : []; + const selectedMemories = selectedIds + .map((id) => memoryCacheRef.current.get(id)) + .filter(Boolean) as IMemory[]; + + return Array.from( + new Map( + [...(memoryListOrigin ?? []), ...selectedMemories].map((memory) => [ + memory.id, + memory, + ]), + ).values(), + ); + }, [memoryIds, memoryListOrigin]); + + const selectedEmbedId = useMemo(() => { + const data = memoryList?.find((item) => item.id === memoryIds?.[0]); + return data?.embd_id ?? ''; + }, [memoryIds, memoryList]); + + const options = useMemo(() => { + return memoryList + .filter(Boolean) + .map((item: IMemory) => { + return { + label: item.name, + icon: () => ( + + ), + suffix: , + value: item.id, + disabled: + item.embd_id !== selectedEmbedId && selectedEmbedId !== '', + }; + }); + }, [memoryList, selectedEmbedId]); + + return { + options, + }; +} + +export function MemoriesFormField({ + label, + name = 'memory_ids', +}: MemoriesFormFieldProps) { + const { t } = useTranslation(); + const { options } = useDisableDifferenceEmbeddingMemory(name); return ( - + {(field) => (