Fix: Fixed the issue of empty memory parameters (#11988)

### What problem does this PR solve?

Fix: Fixed the issue of empty memory parameters

### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)
This commit is contained in:
chanx
2025-12-17 15:42:29 +08:00
committed by GitHub
parent 93ca1e0b91
commit d16643a53d
3 changed files with 127 additions and 150 deletions

View File

@ -3,7 +3,6 @@
import message from '@/components/ui/message'; import message from '@/components/ui/message';
import { useSetModalState } from '@/hooks/common-hooks'; import { useSetModalState } from '@/hooks/common-hooks';
import { useHandleSearchChange } from '@/hooks/logic-hooks'; import { useHandleSearchChange } from '@/hooks/logic-hooks';
import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks';
import memoryService, { updateMemoryById } from '@/services/memory-service'; import memoryService, { updateMemoryById } from '@/services/memory-service';
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { useDebounce } from 'ahooks'; import { useDebounce } from 'ahooks';
@ -25,35 +24,21 @@ import {
export const useCreateMemory = () => { export const useCreateMemory = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const { const createMemory = useCallback(
data, async (props: ICreateMemoryProps): Promise<CreateMemoryResponse> => {
isError,
mutateAsync: createMemoryMutation,
} = useMutation<CreateMemoryResponse, Error, ICreateMemoryProps>({
mutationKey: ['createMemory'],
mutationFn: async (props) => {
const { data: response } = await memoryService.createMemory(props); const { data: response } = await memoryService.createMemory(props);
if (response.code !== 0) { if (response.code !== 0) {
throw new Error(response.message || 'Failed to create memory'); throw new Error(response.message || 'Failed to create memory');
} }
if (response.code === 0) {
message.success(t('message.created'));
}
return response.data; return response.data;
}, },
onSuccess: () => { [t],
message.success(t('message.created'));
},
onError: (error) => {
message.error(t('message.error', { error: error.message }));
},
});
const createMemory = useCallback(
(props: ICreateMemoryProps) => {
return createMemoryMutation(props);
},
[createMemoryMutation],
); );
return { data, isError, createMemory }; return { createMemory };
}; };
export const useFetchMemoryList = () => { export const useFetchMemoryList = () => {
@ -223,7 +208,6 @@ export const useUpdateMemory = () => {
export const useRenameMemory = () => { export const useRenameMemory = () => {
const [memory, setMemory] = useState<IMemory>({} as IMemory); const [memory, setMemory] = useState<IMemory>({} as IMemory);
const { navigateToMemory } = useNavigatePage();
const { const {
visible: openCreateModal, visible: openCreateModal,
hideModal: hideChatRenameModal, hideModal: hideChatRenameModal,
@ -250,19 +234,11 @@ export const useRenameMemory = () => {
const onMemoryRenameOk = useCallback( const onMemoryRenameOk = useCallback(
async (data: ICreateMemoryProps, callBack?: () => void) => { async (data: ICreateMemoryProps, callBack?: () => void) => {
let res; // let res;
setLoading(true); setLoading(true);
if (memory?.id) { if (memory?.id) {
try { try {
// const reponse = await memoryService.getMemoryDetail({ await updateMemory({
// id: memory?.id,
// });
// const detail = reponse.data?.data;
// console.log('detail-->', detail);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
// const { id, created_by, update_time, ...memoryDataTemp } = detail;
res = await updateMemory({
// ...memoryDataTemp, // ...memoryDataTemp,
name: data.name, name: data.name,
id: memory?.id, id: memory?.id,
@ -271,7 +247,7 @@ export const useRenameMemory = () => {
console.error('error', e); console.error('error', e);
} }
} else { } else {
res = await createMemory(data); await createMemory(data);
} }
// if (res && !memory?.id) { // if (res && !memory?.id) {
// navigateToMemory(res?.id)(); // navigateToMemory(res?.id)();
@ -280,7 +256,7 @@ export const useRenameMemory = () => {
setLoading(false); setLoading(false);
handleHideModal(); handleHideModal();
}, },
[memory, createMemory, handleHideModal, navigateToMemory, updateMemory], [memory, createMemory, handleHideModal, updateMemory],
); );
return { return {
memoryRenameLoading: loading, memoryRenameLoading: loading,

View File

@ -10,17 +10,17 @@ import { useState } from 'react';
import { z } from 'zod'; import { z } from 'zod';
export const advancedSettingsFormSchema = { export const advancedSettingsFormSchema = {
permission: z.string().optional(), permissions: z.string().optional(),
storage_type: z.enum(['table', 'graph']).optional(), storage_type: z.enum(['table', 'graph']).optional(),
forget_policy: z.enum(['lru', 'fifo']).optional(), forgetting_policy: z.enum(['lru', 'fifo']).optional(),
temperature: z.number().optional(), temperature: z.number().optional(),
system_prompt: z.string().optional(), system_prompt: z.string().optional(),
user_prompt: z.string().optional(), user_prompt: z.string().optional(),
}; };
export const defaultAdvancedSettingsForm = { export const defaultAdvancedSettingsForm = {
permission: 'me', permissions: 'me',
storage_type: 'table', storage_type: 'table',
forget_policy: 'fifo', forgetting_policy: 'fifo',
temperature: 0.7, temperature: 0.7,
system_prompt: '', system_prompt: '',
user_prompt: '', user_prompt: '',
@ -40,120 +40,120 @@ export const AdvancedSettingsForm = () => {
)} )}
{t('memory.config.advancedSettings')} {t('memory.config.advancedSettings')}
</div> </div>
{/* {showAdvancedSettings && ( */} {showAdvancedSettings && (
<> <>
<RenderField <RenderField
field={{ field={{
name: 'permission', name: 'permissions',
label: t('memory.config.permission'), label: t('memory.config.permission'),
required: false, required: false,
horizontal: true, horizontal: true,
// hideLabel: true, // hideLabel: true,
type: FormFieldType.Custom, type: FormFieldType.Custom,
render: (field) => ( render: (field) => (
<RadioGroup <RadioGroup
defaultValue="me" defaultValue="me"
className="flex" className="flex"
{...field}
onValueChange={(value) => {
console.log(value);
field.onChange(value);
}}
>
<div className="flex items-center gap-3">
<RadioGroupItem value="me" id="r1" />
<Label htmlFor="r1">{t('memory.config.onlyMe')}</Label>
</div>
<div className="flex items-center gap-3">
<RadioGroupItem value="team" id="r2" />
<Label htmlFor="r2">{t('memory.config.team')}</Label>
</div>
</RadioGroup>
),
}}
/>
<RenderField
field={{
name: 'storage_type',
label: t('memory.config.storageType'),
type: FormFieldType.Select,
horizontal: true,
placeholder: t('memory.config.storageTypePlaceholder'),
options: [
{ label: 'table', value: 'table' },
// { label: 'graph', value: 'graph' },
],
required: false,
}}
/>
<RenderField
field={{
name: 'forget_policy',
label: t('memory.config.forgetPolicy'),
type: FormFieldType.Select,
horizontal: true,
// placeholder: t('memory.config.storageTypePlaceholder'),
options: [
// { label: 'lru', value: 'lru' },
{ label: 'fifo', value: 'fifo' },
],
required: false,
}}
/>
<RenderField
field={{
name: 'temperature',
label: t('memory.config.temperature'),
type: FormFieldType.Custom,
horizontal: true,
required: false,
render: (field) => (
<div className="flex gap-2 items-center">
<SingleFormSlider
{...field} {...field}
onChange={(value: number) => { onValueChange={(value) => {
console.log(value);
field.onChange(value); field.onChange(value);
}} }}
max={1} >
step={0.01} <div className="flex items-center gap-3">
min={0} <RadioGroupItem value="me" id="r1" />
disabled={false} <Label htmlFor="r1">{t('memory.config.onlyMe')}</Label>
></SingleFormSlider> </div>
<NumberInput <div className="flex items-center gap-3">
className={cn( <RadioGroupItem value="team" id="r2" />
'h-6 w-10 p-1 border border-border-button rounded-sm', <Label htmlFor="r2">{t('memory.config.team')}</Label>
)} </div>
max={1} </RadioGroup>
step={0.01} ),
min={0} }}
{...field} />
></NumberInput> <RenderField
</div> field={{
), name: 'storage_type',
}} label: t('memory.config.storageType'),
/> type: FormFieldType.Select,
<RenderField horizontal: true,
field={{ placeholder: t('memory.config.storageTypePlaceholder'),
name: 'system_prompt', options: [
label: t('memory.config.systemPrompt'), { label: 'table', value: 'table' },
type: FormFieldType.Textarea, // { label: 'graph', value: 'graph' },
horizontal: true, ],
placeholder: t('memory.config.systemPromptPlaceholder'), required: false,
required: false, }}
}} />
/> <RenderField
<RenderField field={{
field={{ name: 'forgetting_policy',
name: 'user_prompt', label: t('memory.config.forgetPolicy'),
label: t('memory.config.userPrompt'), type: FormFieldType.Select,
type: FormFieldType.Text, horizontal: true,
horizontal: true, // placeholder: t('memory.config.storageTypePlaceholder'),
placeholder: t('memory.config.userPromptPlaceholder'), options: [
required: false, // { label: 'lru', value: 'lru' },
}} { label: 'fifo', value: 'fifo' },
/> ],
</> required: false,
{/* )} */} }}
/>
<RenderField
field={{
name: 'temperature',
label: t('memory.config.temperature'),
type: FormFieldType.Custom,
horizontal: true,
required: false,
render: (field) => (
<div className="flex gap-2 items-center">
<SingleFormSlider
{...field}
onChange={(value: number) => {
field.onChange(value);
}}
max={1}
step={0.01}
min={0}
disabled={false}
></SingleFormSlider>
<NumberInput
className={cn(
'h-6 w-10 p-1 border border-border-button rounded-sm',
)}
max={1}
step={0.01}
min={0}
{...field}
></NumberInput>
</div>
),
}}
/>
<RenderField
field={{
name: 'system_prompt',
label: t('memory.config.systemPrompt'),
type: FormFieldType.Textarea,
horizontal: true,
placeholder: t('memory.config.systemPromptPlaceholder'),
required: false,
}}
/>
<RenderField
field={{
name: 'user_prompt',
label: t('memory.config.userPrompt'),
type: FormFieldType.Text,
horizontal: true,
placeholder: t('memory.config.userPromptPlaceholder'),
required: false,
}}
/>
</>
)}
</> </>
); );
}; };

View File

@ -58,6 +58,7 @@ export default function MemoryMessage() {
system_prompt: data?.system_prompt || '', system_prompt: data?.system_prompt || '',
user_prompt: data?.user_prompt || '', user_prompt: data?.user_prompt || '',
forgetting_policy: data?.forgetting_policy || 'fifo', forgetting_policy: data?.forgetting_policy || 'fifo',
storage_type: data?.storage_type || 'table',
permissions: data?.permissions || 'me', permissions: data?.permissions || 'me',
}); });
}, [data, form]); }, [data, form]);