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:
chanx
2025-12-17 12:35:26 +08:00
committed by GitHub
parent 2595644dfd
commit 205a6483f5
20 changed files with 226 additions and 142 deletions

View File

@ -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,
};
};

View File

@ -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>
}

View File

@ -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>
);
},

View File

@ -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,

View File

@ -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' },

View File

@ -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>