mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-01-30 23:26:36 +08:00
Feature:memory function complete (#11982)
### What problem does this PR solve? memory function complete ### Type of change - [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
@ -30,7 +30,7 @@ export const useFetchMemoryMessageList = () => {
|
||||
queryFn: async () => {
|
||||
if (memoryBaseId) {
|
||||
const { data } = await getMemoryDetailById(memoryBaseId as string, {
|
||||
keyword: searchString,
|
||||
keywords: searchString,
|
||||
page: pagination.current,
|
||||
page_size: pagination.pageSize,
|
||||
});
|
||||
@ -53,27 +53,61 @@ export const useFetchMemoryMessageList = () => {
|
||||
|
||||
export const useMessageAction = () => {
|
||||
const queryClient = useQueryClient();
|
||||
const { id: memoryId } = useParams();
|
||||
const [selectedMessage, setSelectedMessage] = useState<IMessageInfo>(
|
||||
{} as IMessageInfo,
|
||||
);
|
||||
const [showDeleteDialog, setShowDeleteDialog] = useState(false);
|
||||
const handleClickDeleteMessage = useCallback((message: IMessageInfo) => {
|
||||
console.log('handleClickDeleteMessage', message);
|
||||
setSelectedMessage(message);
|
||||
setShowDeleteDialog(true);
|
||||
}, []);
|
||||
|
||||
const handleDeleteMessage = useCallback(() => {
|
||||
// delete message
|
||||
memoryService.deleteMemoryMessage(selectedMessage.message_id).then(() => {
|
||||
message.success(t('message.deleted'));
|
||||
queryClient.invalidateQueries({
|
||||
queryKey: [MemoryApiAction.FetchMemoryMessage],
|
||||
memoryService
|
||||
.deleteMemoryMessage({
|
||||
memory_id: memoryId,
|
||||
message_id: selectedMessage.message_id,
|
||||
})
|
||||
.then(() => {
|
||||
message.success(t('message.deleted'));
|
||||
queryClient.invalidateQueries({
|
||||
queryKey: [MemoryApiAction.FetchMemoryMessage],
|
||||
});
|
||||
});
|
||||
});
|
||||
setShowDeleteDialog(false);
|
||||
}, [selectedMessage.message_id, queryClient]);
|
||||
|
||||
const handleUpdateMessageState = useCallback(
|
||||
(messageInfo: IMessageInfo, enable: boolean) => {
|
||||
// delete message
|
||||
const selectedMessageInfo = messageInfo || selectedMessage;
|
||||
memoryService
|
||||
.updateMessageState({
|
||||
memory_id: memoryId,
|
||||
message_id: selectedMessageInfo.message_id,
|
||||
status: enable || false,
|
||||
})
|
||||
.then(() => {
|
||||
message.success(t('message.updated'));
|
||||
queryClient.invalidateQueries({
|
||||
queryKey: [MemoryApiAction.FetchMemoryMessage],
|
||||
});
|
||||
});
|
||||
setShowDeleteDialog(false);
|
||||
},
|
||||
[selectedMessage, queryClient, memoryId],
|
||||
);
|
||||
|
||||
const handleClickUpdateMessageState = useCallback(
|
||||
(message: IMessageInfo, enable: boolean) => {
|
||||
setSelectedMessage(message);
|
||||
handleUpdateMessageState(message, enable);
|
||||
},
|
||||
[handleUpdateMessageState],
|
||||
);
|
||||
|
||||
const [showMessageContentDialog, setShowMessageContentDialog] =
|
||||
useState(false);
|
||||
const [selectedMessageContent, setSelectedMessageContent] =
|
||||
@ -90,9 +124,10 @@ export const useMessageAction = () => {
|
||||
],
|
||||
mutationFn: async () => {
|
||||
setShowMessageContentDialog(true);
|
||||
const res = await memoryService.getMessageContent(
|
||||
selectedMessage.message_id,
|
||||
);
|
||||
const res = await memoryService.getMessageContent({
|
||||
memory_id: memoryId,
|
||||
message_id: selectedMessage.message_id,
|
||||
});
|
||||
if (res.data.code === 0) {
|
||||
setSelectedMessageContent(res.data.data);
|
||||
} else {
|
||||
@ -117,6 +152,7 @@ export const useMessageAction = () => {
|
||||
setShowDeleteDialog,
|
||||
handleClickDeleteMessage,
|
||||
handleDeleteMessage,
|
||||
handleUpdateMessageState,
|
||||
messageContent,
|
||||
fetchMessageContentLoading,
|
||||
fetchMessageContent,
|
||||
@ -124,5 +160,6 @@ export const useMessageAction = () => {
|
||||
showMessageContentDialog,
|
||||
setShowMessageContentDialog,
|
||||
handleClickMessageContentDialog,
|
||||
handleClickUpdateMessageState,
|
||||
};
|
||||
};
|
||||
|
||||
@ -21,15 +21,16 @@ export default function MemoryMessage() {
|
||||
title="Dataset"
|
||||
onSearchChange={handleInputChange}
|
||||
searchString={searchString}
|
||||
showFilter={false}
|
||||
// value={filterValue}
|
||||
// onChange={handleFilterSubmit}
|
||||
// onOpenChange={onOpenChange}
|
||||
// filters={filters}
|
||||
leftPanel={
|
||||
<div className="items-start">
|
||||
<div className="pb-1">{t('knowledgeDetails.subbarFiles')}</div>
|
||||
<div className="pb-1">{t('memory.sideBar.messages')}</div>
|
||||
<div className="text-text-secondary text-sm">
|
||||
{t('knowledgeDetails.datasetDescription')}
|
||||
{t('memory.messages.messageDescription')}
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@ -66,7 +66,7 @@ export function MemoryTable({
|
||||
selectedMessage,
|
||||
handleDeleteMessage,
|
||||
|
||||
fetchMessageContent,
|
||||
handleClickUpdateMessageState,
|
||||
selectedMessageContent,
|
||||
showMessageContentDialog,
|
||||
setShowMessageContentDialog,
|
||||
@ -131,7 +131,12 @@ export function MemoryTable({
|
||||
const isEnabled = row.getValue('status') as boolean;
|
||||
return (
|
||||
<div className="flex items-center">
|
||||
<Switch defaultChecked={isEnabled} onChange={() => {}} />
|
||||
<Switch
|
||||
defaultChecked={isEnabled}
|
||||
onCheckedChange={(val) => {
|
||||
handleClickUpdateMessageState(row.original, val);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
|
||||
@ -94,7 +94,7 @@ export const AdvancedSettingsForm = () => {
|
||||
horizontal: true,
|
||||
// placeholder: t('memory.config.storageTypePlaceholder'),
|
||||
options: [
|
||||
{ label: 'lru', value: 'lru' },
|
||||
// { label: 'lru', value: 'lru' },
|
||||
{ label: 'fifo', value: 'fifo' },
|
||||
],
|
||||
required: false,
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
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 { t } from 'i18next';
|
||||
import { MemoryType } from '@/pages/memories/constants';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { z } from 'zod';
|
||||
|
||||
export const memoryModelFormSchema = {
|
||||
@ -13,11 +14,12 @@ export const memoryModelFormSchema = {
|
||||
export const defaultMemoryModelForm = {
|
||||
embd_id: '',
|
||||
llm_id: '',
|
||||
memory_type: [],
|
||||
memory_type: [MemoryType.Raw],
|
||||
memory_size: 0,
|
||||
};
|
||||
export const MemoryModelForm = () => {
|
||||
const { modelOptions } = useModelOptions();
|
||||
const { t } = useTranslation();
|
||||
return (
|
||||
<>
|
||||
<RenderField
|
||||
@ -29,7 +31,12 @@ export const MemoryModelForm = () => {
|
||||
horizontal: true,
|
||||
// hideLabel: true,
|
||||
type: FormFieldType.Custom,
|
||||
render: (field) => <EmbeddingSelect field={field} isEdit={false} />,
|
||||
disabled: true,
|
||||
render: (field) => (
|
||||
<EmbeddingSelect field={field} isEdit={false} disabled={true} />
|
||||
),
|
||||
|
||||
tooltip: t('memories.embeddingModelTooltip'),
|
||||
}}
|
||||
/>
|
||||
<RenderField
|
||||
@ -41,6 +48,7 @@ export const MemoryModelForm = () => {
|
||||
horizontal: true,
|
||||
type: FormFieldType.Select,
|
||||
options: modelOptions as { value: string; label: string }[],
|
||||
tooltip: t('memories.llmTooltip'),
|
||||
}}
|
||||
/>
|
||||
<RenderField
|
||||
@ -50,6 +58,8 @@ export const MemoryModelForm = () => {
|
||||
type: FormFieldType.MultiSelect,
|
||||
horizontal: true,
|
||||
placeholder: t('memories.memoryTypePlaceholder'),
|
||||
tooltip: t('memories.memoryTypeTooltip'),
|
||||
disabled: true,
|
||||
options: [
|
||||
{ label: 'Raw', value: 'raw' },
|
||||
{ label: 'Semantic', value: 'semantic' },
|
||||
|
||||
@ -3,7 +3,8 @@ import { Button } from '@/components/ui/button';
|
||||
import { useSecondPathName } from '@/hooks/route-hook';
|
||||
import { cn } from '@/lib/utils';
|
||||
import { Routes } from '@/routes';
|
||||
import { Banknote, Logs } from 'lucide-react';
|
||||
import { formatPureDate } from '@/utils/date';
|
||||
import { MemoryStick, Settings } from 'lucide-react';
|
||||
import { useMemo } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { useFetchMemoryBaseConfiguration } from '../hooks/use-memory-setting';
|
||||
@ -19,12 +20,12 @@ export function SideBar() {
|
||||
const items = useMemo(() => {
|
||||
const list = [
|
||||
{
|
||||
icon: <Logs className="size-4" />,
|
||||
icon: <MemoryStick className="size-4" />,
|
||||
label: t(`memory.sideBar.messages`),
|
||||
key: Routes.MemoryMessage,
|
||||
},
|
||||
{
|
||||
icon: <Banknote className="size-4" />,
|
||||
icon: <Settings className="size-4" />,
|
||||
label: t(`memory.sideBar.configuration`),
|
||||
key: Routes.MemorySetting,
|
||||
},
|
||||
@ -44,15 +45,13 @@ export function SideBar() {
|
||||
<h3 className="text-lg font-semibold line-clamp-1 text-text-primary text-ellipsis overflow-hidden">
|
||||
{data.name}
|
||||
</h3>
|
||||
{/* <div className="flex justify-between">
|
||||
<span>
|
||||
{data.doc_num} {t('knowledgeDetails.files')}
|
||||
</span>
|
||||
<span>{formatBytes(data.size)}</span>
|
||||
<div className="flex justify-between">
|
||||
<span className="truncate ">{data.description}</span>
|
||||
{/* <span>{formatBytes(data.size)}</span> */}
|
||||
</div>
|
||||
<div>
|
||||
{t('knowledgeDetails.created')} {formatPureDate(data.)}
|
||||
</div> */}
|
||||
{t('knowledgeDetails.created')} {formatPureDate(data.create_time)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user