{row.getValue('agent_name')}
@@ -75,7 +96,7 @@ export function MemoryTable({
},
{
accessorKey: 'message_type',
- header: () =>
{row.getValue('message_type')}
@@ -84,28 +105,28 @@ export function MemoryTable({
},
{
accessorKey: 'valid_at',
- header: () =>
{t('memoryDetail.messages.validDate')},
+ header: () =>
{t('memory.messages.validDate')},
cell: ({ row }) => (
{row.getValue('valid_at')}
),
},
{
accessorKey: 'forget_at',
- header: () =>
{t('memoryDetail.messages.forgetAt')},
+ header: () =>
{t('memory.messages.forgetAt')},
cell: ({ row }) => (
{row.getValue('forget_at')}
),
},
{
accessorKey: 'source_id',
- header: () =>
{t('memoryDetail.messages.source')},
+ header: () =>
{t('memory.messages.source')},
cell: ({ row }) => (
{row.getValue('source_id')}
),
},
{
accessorKey: 'status',
- header: () =>
{t('memoryDetail.messages.enable')},
+ header: () =>
{t('memory.messages.enable')},
cell: ({ row }) => {
const isEnabled = row.getValue('status') as boolean;
return (
@@ -117,19 +138,28 @@ export function MemoryTable({
},
{
accessorKey: 'action',
- header: () =>
{t('memoryDetail.messages.action')},
+ header: () =>
{t('memory.messages.action')},
meta: {
cellClassName: 'w-12',
},
- cell: () => (
+ cell: ({ row }) => (
-
+ }
+ >
+
+
+ {t('memory.messages.sessionId')}:
+ {selectedMessage.session_id}
+
+ {selectedMessageContent?.content && (
+
+ {replaceText(selectedMessageContent?.content || '')}
+
+ )}
+ {selectedMessageContent?.content_embed && (
+
+ {
+ setCopied(true);
+ setTimeout(() => setCopied(false), 1000);
+ }}
+ >
+
+ {t('memory.messages.contentEmbed')}
+
+
+
+ {copied && (
+
+ {t('memory.messages.copied')}
+
+ )}
+
+ )}
+
+
+ )}
{
+ const [showAdvancedSettings, setShowAdvancedSettings] = useState(false);
+ return (
+ <>
+ setShowAdvancedSettings(!showAdvancedSettings)}
+ >
+ {showAdvancedSettings ? (
+
+ ) : (
+
+ )}
+ {t('memory.config.advancedSettings')}
+
+ {/* {showAdvancedSettings && ( */}
+ <>
+ (
+ {
+ console.log(value);
+ field.onChange(value);
+ }}
+ >
+
+
+
+
+
+
+
+
+
+ ),
+ }}
+ />
+
+
+ (
+
+ {
+ field.onChange(value);
+ }}
+ max={1}
+ step={0.01}
+ min={0}
+ disabled={false}
+ >
+
+
+ ),
+ }}
+ />
+
+
+ >
+ {/* )} */}
+ >
+ );
+};
diff --git a/web/src/pages/memory/memory-setting/basic-form.tsx b/web/src/pages/memory/memory-setting/basic-form.tsx
new file mode 100644
index 000000000..edaaec23a
--- /dev/null
+++ b/web/src/pages/memory/memory-setting/basic-form.tsx
@@ -0,0 +1,53 @@
+import { AvatarUpload } from '@/components/avatar-upload';
+import { RAGFlowFormItem } from '@/components/ragflow-form';
+import { Input } from '@/components/ui/input';
+import { t } from 'i18next';
+import { z } from 'zod';
+export const basicInfoSchema = {
+ name: z.string().min(1, { message: t('setting.nameRequired') }),
+ avatar: z.string().optional(),
+ description: z.string().optional(),
+};
+export const defaultBasicInfo = { name: '', avatar: '', description: '' };
+export const BasicInfo = () => {
+ return (
+ <>
+
+ {(field) => {
+ return ;
+ }}
+
+
+ {(field) => {
+ return ;
+ }}
+
+
+ {(field) => {
+ return ;
+ }}
+
+ >
+ );
+};
diff --git a/web/src/pages/memory/memory-setting/hook.ts b/web/src/pages/memory/memory-setting/hook.ts
new file mode 100644
index 000000000..ed54d40b6
--- /dev/null
+++ b/web/src/pages/memory/memory-setting/hook.ts
@@ -0,0 +1,42 @@
+import { useUpdateMemory } from '@/pages/memories/hooks';
+import { IMemory, IMemoryAppDetailProps } from '@/pages/memories/interface';
+import { omit } from 'lodash';
+import { useCallback, useState } from 'react';
+
+export const useUpdateMemoryConfig = () => {
+ const { updateMemory } = useUpdateMemory();
+ const [loading, setLoading] = useState(false);
+ const onMemoryRenameOk = useCallback(
+ async (data: IMemory) => {
+ let res;
+ setLoading(true);
+ if (data?.id) {
+ // console.log('memory-->', memory, data);
+ try {
+ const params = omit(data, [
+ 'id',
+ 'memory_type',
+ 'embd_id',
+ 'storage_type',
+ ]);
+ res = await updateMemory({
+ // ...memoryDataTemp,
+ // data: data,
+ id: data.id,
+ ...params,
+ } as unknown as IMemoryAppDetailProps);
+ // if (res && res.data.code === 0) {
+ // message.success(t('message.update_success'));
+ // } else {
+ // message.error(t('message.update_fail'));
+ // }
+ } catch (e) {
+ console.error('error', e);
+ }
+ }
+ setLoading(false);
+ },
+ [updateMemory],
+ );
+ return { onMemoryRenameOk, loading };
+};
diff --git a/web/src/pages/memory/memory-setting/index.tsx b/web/src/pages/memory/memory-setting/index.tsx
index 27be86cfd..0eae5eaf4 100644
--- a/web/src/pages/memory/memory-setting/index.tsx
+++ b/web/src/pages/memory/memory-setting/index.tsx
@@ -1,13 +1,110 @@
+import { DynamicForm } from '@/components/dynamic-form';
+import { Button } from '@/components/ui/button';
+import Divider from '@/components/ui/divider';
+import { Form } from '@/components/ui/form';
+import { MainContainer } from '@/pages/dataset/dataset-setting/configuration-form-container';
+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 { z } from 'zod';
+import { useFetchMemoryBaseConfiguration } from '../hooks/use-memory-setting';
+import {
+ AdvancedSettingsForm,
+ advancedSettingsFormSchema,
+ defaultAdvancedSettingsForm,
+} from './advanced-settings-form';
+import { BasicInfo, basicInfoSchema, defaultBasicInfo } from './basic-form';
+import { useUpdateMemoryConfig } from './hook';
+import {
+ MemoryModelForm,
+ defaultMemoryModelForm,
+ memoryModelFormSchema,
+} from './memory-model-form';
+
+const MemoryMessageSchema = z.object({
+ id: z.string(),
+ ...basicInfoSchema,
+ ...memoryModelFormSchema,
+ ...advancedSettingsFormSchema,
+});
+// type MemoryMessageForm = z.infer;
export default function MemoryMessage() {
+ const form = useForm({
+ resolver: zodResolver(MemoryMessageSchema),
+ defaultValues: {
+ id: '',
+ ...defaultBasicInfo,
+ ...defaultMemoryModelForm,
+ ...defaultAdvancedSettingsForm,
+ } as unknown as IMemory,
+ });
+ const { data } = useFetchMemoryBaseConfiguration();
+ const { onMemoryRenameOk, loading } = useUpdateMemoryConfig();
+
+ useEffect(() => {
+ form.reset({
+ id: data?.id,
+ embd_id: data?.embd_id,
+ llm_id: data?.llm_id,
+ name: data?.name || '',
+ description: data?.description || '',
+ avatar: data?.avatar || '',
+ memory_size: data?.memory_size,
+ memory_type: data?.memory_type,
+ temperature: data?.temperature,
+ system_prompt: data?.system_prompt || '',
+ user_prompt: data?.user_prompt || '',
+ forgetting_policy: data?.forgetting_policy || 'fifo',
+ permissions: data?.permissions || 'me',
+ });
+ }, [data, form]);
+ const onSubmit = (data: IMemory) => {
+ 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
new file mode 100644
index 000000000..fb27496c4
--- /dev/null
+++ b/web/src/pages/memory/memory-setting/memory-model-form.tsx
@@ -0,0 +1,74 @@
+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 { z } from 'zod';
+
+export const memoryModelFormSchema = {
+ embd_id: z.string(),
+ llm_id: z.string(),
+ memory_type: z.array(z.string()).optional(),
+ memory_size: z.number().optional(),
+};
+export const defaultMemoryModelForm = {
+ embd_id: '',
+ llm_id: '',
+ memory_type: [],
+ memory_size: 0,
+};
+export const MemoryModelForm = () => {
+ const { modelOptions } = useModelOptions();
+ return (
+ <>
+
,
+ }}
+ />
+
+
+
+ >
+ );
+};
diff --git a/web/src/pages/memory/sidebar/index.tsx b/web/src/pages/memory/sidebar/index.tsx
index 98928fe43..13c766649 100644
--- a/web/src/pages/memory/sidebar/index.tsx
+++ b/web/src/pages/memory/sidebar/index.tsx
@@ -1,36 +1,31 @@
import { RAGFlowAvatar } from '@/components/ragflow-avatar';
import { Button } from '@/components/ui/button';
import { useSecondPathName } from '@/hooks/route-hook';
-import { cn, formatBytes } from '@/lib/utils';
+import { cn } from '@/lib/utils';
import { Routes } from '@/routes';
-import { formatPureDate } from '@/utils/date';
import { Banknote, Logs } from 'lucide-react';
import { useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { useFetchMemoryBaseConfiguration } from '../hooks/use-memory-setting';
import { useHandleMenuClick } from './hooks';
-type PropType = {
- refreshCount?: number;
-};
-
-export function SideBar({ refreshCount }: PropType) {
+export function SideBar() {
const pathName = useSecondPathName();
const { handleMenuClick } = useHandleMenuClick();
// refreshCount: be for avatar img sync update on top left
- const { data } = useFetchMemoryBaseConfiguration({ refreshCount });
+ const { data } = useFetchMemoryBaseConfiguration();
const { t } = useTranslation();
const items = useMemo(() => {
const list = [
{
icon: ,
- label: t(`knowledgeDetails.overview`),
+ label: t(`memory.sideBar.messages`),
key: Routes.MemoryMessage,
},
{
icon: ,
- label: t(`knowledgeDetails.configuration`),
+ label: t(`memory.sideBar.configuration`),
key: Routes.MemorySetting,
},
];
@@ -49,15 +44,15 @@ export function SideBar({ refreshCount }: PropType) {
{data.name}
-
+ {/*
{data.doc_num} {t('knowledgeDetails.files')}
{formatBytes(data.size)}
- {t('knowledgeDetails.created')} {formatPureDate(data.create_time)}
-
+ {t('knowledgeDetails.created')} {formatPureDate(data.)}
+
*/}
diff --git a/web/src/services/memory-service.ts b/web/src/services/memory-service.ts
index f2e0053af..cf73a0a67 100644
--- a/web/src/services/memory-service.ts
+++ b/web/src/services/memory-service.ts
@@ -8,6 +8,9 @@ const {
deleteMemory,
getMemoryDetail,
updateMemorySetting,
+ getMemoryConfig,
+ deleteMemoryMessage,
+ getMessageContent,
// getMemoryDetailShare,
} = api;
const methods = {
@@ -17,27 +20,21 @@ const methods = {
},
getMemoryList: {
url: getMemoryList,
- method: 'post',
+ method: 'get',
},
- deleteMemory: { url: deleteMemory, method: 'post' },
- // getMemoryDetail: {
- // url: getMemoryDetail,
- // method: 'get',
- // },
- // updateMemorySetting: {
- // url: updateMemorySetting,
- // method: 'post',
- // },
- // getMemoryDetailShare: {
- // url: getMemoryDetailShare,
- // method: 'get',
- // },
+ deleteMemory: { url: deleteMemory, method: 'delete' },
+ getMemoryConfig: {
+ url: getMemoryConfig,
+ method: 'get',
+ },
+ deleteMemoryMessage: { url: deleteMemoryMessage, method: 'delete' },
+ getMessageContent: { url: getMessageContent, method: 'get' },
} as const;
const memoryService = registerNextServer
(methods);
export const updateMemoryById = (id: string, data: any) => {
- return request.post(updateMemorySetting(id), { data });
+ return request.put(updateMemorySetting(id), { data });
};
export const getMemoryDetailById = (id: string, data: any) => {
- return request.post(getMemoryDetail(id), { data });
+ return request.get(getMemoryDetail(id), { params: data });
};
export default memoryService;
diff --git a/web/src/utils/api.ts b/web/src/utils/api.ts
index 1c7f0bc51..953016abf 100644
--- a/web/src/utils/api.ts
+++ b/web/src/utils/api.ts
@@ -227,11 +227,15 @@ export default {
retrievalTestShare: `${ExternalApi}${api_host}/searchbots/retrieval_test`,
// memory
- createMemory: `${api_host}/memory/create`,
- getMemoryList: `${api_host}/memory/list`,
+ createMemory: `${api_host}/memories`,
+ getMemoryList: `${api_host}/memories`,
+ getMemoryConfig: (id: string) => `${api_host}/memories/${id}/config`,
deleteMemory: (id: string) => `${api_host}/memory/rm/${id}`,
- getMemoryDetail: (id: string) => `${api_host}/memory/detail/${id}`,
- updateMemorySetting: (id: string) => `${api_host}/memory/update/${id}`,
+ getMemoryDetail: (id: string) => `${api_host}/memories/${id}`,
+ updateMemorySetting: (id: string) => `${api_host}/memories/${id}`,
+ deleteMemoryMessage: (id: string) => `${api_host}/message/rm/${id}`,
+ getMessageContent: (message_id: string) =>
+ `${api_host}/messages/${message_id}/content`,
// data pipeline
fetchDataflow: (id: string) => `${api_host}/dataflow/get/${id}`,