2025-10-14 18:06:12 +08:00
|
|
|
|
|
|
|
|
import React, { useState, useEffect } from 'react';
|
|
|
|
|
import { useParams, useNavigate } from 'react-router-dom';
|
2025-10-15 16:24:53 +08:00
|
|
|
import { useForm, FormProvider, useWatch, Form } from 'react-hook-form';
|
2025-10-14 18:06:12 +08:00
|
|
|
import {
|
|
|
|
|
Box,
|
|
|
|
|
Typography,
|
|
|
|
|
Paper,
|
|
|
|
|
Tabs,
|
|
|
|
|
Tab,
|
|
|
|
|
Fab,
|
2025-10-15 16:24:53 +08:00
|
|
|
Button,
|
2025-10-14 18:06:12 +08:00
|
|
|
} from '@mui/material';
|
|
|
|
|
import {
|
|
|
|
|
ArrowBack as ArrowBackIcon,
|
|
|
|
|
} from '@mui/icons-material';
|
|
|
|
|
import { useKnowledgeDetail, useKnowledgeOperations } from '@/hooks/knowledge-hooks';
|
2025-10-15 16:24:53 +08:00
|
|
|
import GeneralForm from './components/GeneralForm';
|
2025-10-14 18:06:12 +08:00
|
|
|
import ChunkMethodForm, { type ConfigFormData } from './components/ChunkMethodForm';
|
|
|
|
|
import KnowledgeBreadcrumbs from './components/KnowledgeBreadcrumbs';
|
|
|
|
|
import { useSnackbar } from '@/components/Provider/SnackbarProvider';
|
2025-10-15 16:24:53 +08:00
|
|
|
import { DOCUMENT_PARSER_TYPES } from '@/constants/knowledge';
|
|
|
|
|
import { MainContainer } from './configuration';
|
|
|
|
|
|
|
|
|
|
// 统一表单数据类型
|
|
|
|
|
interface BaseFormData {
|
|
|
|
|
name: string;
|
|
|
|
|
description: string;
|
|
|
|
|
permission: string;
|
|
|
|
|
avatar?: string;
|
2025-10-14 18:06:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function KnowledgeBaseSetting() {
|
|
|
|
|
const { id } = useParams<{ id: string }>();
|
|
|
|
|
const navigate = useNavigate();
|
2025-10-15 16:24:53 +08:00
|
|
|
const [tabValue, setTabValue] = useState<'generalForm' | 'chunkMethodForm'>('generalForm');
|
2025-10-14 18:06:12 +08:00
|
|
|
|
|
|
|
|
// 获取知识库详情
|
|
|
|
|
const { knowledge, loading: detailLoading, refresh } = useKnowledgeDetail(id || '');
|
|
|
|
|
const { showMessage } = useSnackbar();
|
2025-10-15 16:24:53 +08:00
|
|
|
|
2025-10-14 18:06:12 +08:00
|
|
|
// 知识库操作hooks
|
2025-10-15 16:24:53 +08:00
|
|
|
const {
|
|
|
|
|
updateKnowledgeBasicInfo,
|
|
|
|
|
updateKnowledgeModelConfig,
|
|
|
|
|
loading: operationLoading
|
2025-10-14 18:06:12 +08:00
|
|
|
} = useKnowledgeOperations();
|
|
|
|
|
|
2025-10-15 16:24:53 +08:00
|
|
|
// 统一表单管理
|
|
|
|
|
const form = useForm<any>({
|
2025-10-14 18:06:12 +08:00
|
|
|
defaultValues: {
|
|
|
|
|
name: '',
|
|
|
|
|
description: '',
|
|
|
|
|
permission: 'me',
|
|
|
|
|
avatar: undefined,
|
2025-10-15 16:24:53 +08:00
|
|
|
}
|
2025-10-14 18:06:12 +08:00
|
|
|
});
|
|
|
|
|
|
2025-10-15 16:24:53 +08:00
|
|
|
// 监听parser_id变化
|
|
|
|
|
const parserId = useWatch({
|
|
|
|
|
control: form.control,
|
|
|
|
|
name: 'parser_id',
|
2025-10-14 18:06:12 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 当知识库数据加载完成时,更新表单默认值
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (knowledge) {
|
2025-10-15 16:24:53 +08:00
|
|
|
form.reset({
|
2025-10-14 18:06:12 +08:00
|
|
|
name: knowledge.name || '',
|
|
|
|
|
description: knowledge.description || '',
|
|
|
|
|
permission: knowledge.permission || 'me',
|
|
|
|
|
avatar: knowledge.avatar,
|
2025-10-15 16:24:53 +08:00
|
|
|
parser_id: knowledge.parser_id || DOCUMENT_PARSER_TYPES.Naive,
|
2025-10-15 18:48:48 +08:00
|
|
|
embd_id: knowledge.embd_id || '',
|
2025-10-15 16:24:53 +08:00
|
|
|
parser_config: {
|
|
|
|
|
chunk_token_num: knowledge.parser_config?.chunk_token_num || 512,
|
|
|
|
|
delimiter: knowledge.parser_config?.delimiter || '\n',
|
|
|
|
|
auto_keywords: knowledge.parser_config?.auto_keywords || 0,
|
|
|
|
|
auto_questions: knowledge.parser_config?.auto_questions || 0,
|
|
|
|
|
html4excel: knowledge.parser_config?.html4excel || false,
|
|
|
|
|
topn_tags: knowledge.parser_config?.topn_tags || 3,
|
|
|
|
|
raptor: {
|
|
|
|
|
use_raptor: knowledge.parser_config?.raptor?.use_raptor || false,
|
|
|
|
|
prompt: knowledge.parser_config?.raptor?.prompt || '请总结以下段落。小心数字,不要编造。段落如下:\n {cluster_content}\n以上就是你需要总结的内容。',
|
|
|
|
|
max_token: knowledge.parser_config?.raptor?.max_token || 256,
|
|
|
|
|
threshold: knowledge.parser_config?.raptor?.threshold || 0.1,
|
|
|
|
|
max_cluster: knowledge.parser_config?.raptor?.max_cluster || 64,
|
|
|
|
|
random_seed: knowledge.parser_config?.raptor?.random_seed || 0,
|
|
|
|
|
},
|
|
|
|
|
graphrag: {
|
|
|
|
|
use_graphrag: knowledge.parser_config?.graphrag?.use_graphrag || false,
|
|
|
|
|
entity_types: knowledge.parser_config?.graphrag?.entity_types || ['organization', 'person', 'geo', 'event', 'category'],
|
|
|
|
|
method: knowledge.parser_config?.graphrag?.method || 'light',
|
|
|
|
|
},
|
|
|
|
|
},
|
2025-10-14 18:06:12 +08:00
|
|
|
});
|
|
|
|
|
}
|
2025-10-15 16:24:53 +08:00
|
|
|
}, [knowledge, form]);
|
2025-10-14 18:06:12 +08:00
|
|
|
|
2025-10-15 16:24:53 +08:00
|
|
|
const handleTabChange = (event: React.SyntheticEvent, newValue: 'generalForm' | 'chunkMethodForm') => {
|
2025-10-14 18:06:12 +08:00
|
|
|
setTabValue(newValue);
|
|
|
|
|
};
|
|
|
|
|
|
2025-10-15 16:24:53 +08:00
|
|
|
const handleSubmit = async ({data}: {data: any}) => {
|
2025-10-14 18:06:12 +08:00
|
|
|
if (!knowledge) return;
|
2025-10-15 16:24:53 +08:00
|
|
|
console.log('提交数据:', data);
|
|
|
|
|
|
2025-10-14 18:06:12 +08:00
|
|
|
try {
|
2025-10-15 16:24:53 +08:00
|
|
|
// 分别处理基础信息和配置信息
|
|
|
|
|
if (tabValue === 'generalForm') {
|
|
|
|
|
const basicData = {
|
|
|
|
|
name: data.name,
|
|
|
|
|
description: data.description,
|
|
|
|
|
permission: data.permission,
|
|
|
|
|
avatar: data.avatar,
|
|
|
|
|
kb_id: knowledge.id,
|
|
|
|
|
parser_id: knowledge.parser_id,
|
|
|
|
|
} as any;
|
|
|
|
|
|
|
|
|
|
await updateKnowledgeBasicInfo(basicData);
|
|
|
|
|
showMessage.success('基础信息更新成功');
|
|
|
|
|
} else {
|
|
|
|
|
const configData = {
|
|
|
|
|
kb_id: knowledge.id,
|
|
|
|
|
name: knowledge.name,
|
|
|
|
|
description: knowledge.description,
|
|
|
|
|
permission: knowledge.permission,
|
|
|
|
|
avatar: knowledge.avatar,
|
|
|
|
|
parser_id: data.parser_id,
|
|
|
|
|
embd_id: data.embd_id,
|
|
|
|
|
parser_config: data.parser_config,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
await updateKnowledgeModelConfig(configData);
|
|
|
|
|
showMessage.success('解析配置更新成功');
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-14 18:06:12 +08:00
|
|
|
// 刷新知识库详情
|
|
|
|
|
refresh();
|
|
|
|
|
} catch (error) {
|
2025-10-15 16:24:53 +08:00
|
|
|
showMessage.error(`${tabValue === 'generalForm' ? '基础信息' : '解析配置'}更新失败`);
|
2025-10-14 18:06:12 +08:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2025-10-15 16:24:53 +08:00
|
|
|
const handleNavigateBack = () => {
|
2025-10-14 18:06:12 +08:00
|
|
|
navigate(`/knowledge/${id}`);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (detailLoading) {
|
|
|
|
|
return (
|
2025-10-15 16:24:53 +08:00
|
|
|
<MainContainer>
|
2025-10-14 18:06:12 +08:00
|
|
|
<Typography>加载中...</Typography>
|
2025-10-15 16:24:53 +08:00
|
|
|
</MainContainer>
|
2025-10-14 18:06:12 +08:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
2025-10-15 16:24:53 +08:00
|
|
|
<MainContainer>
|
2025-10-14 18:06:12 +08:00
|
|
|
{/* 面包屑导航 */}
|
|
|
|
|
<KnowledgeBreadcrumbs knowledge={knowledge} />
|
2025-10-15 16:24:53 +08:00
|
|
|
|
2025-10-14 18:06:12 +08:00
|
|
|
<Box sx={{ mb: 3 }}>
|
|
|
|
|
<Typography variant="h4" gutterBottom>
|
|
|
|
|
知识库设置
|
|
|
|
|
</Typography>
|
|
|
|
|
<Typography variant="subtitle1" color="text.secondary">
|
|
|
|
|
{knowledge?.name}
|
|
|
|
|
</Typography>
|
|
|
|
|
</Box>
|
|
|
|
|
|
2025-10-15 16:24:53 +08:00
|
|
|
<FormProvider {...form}>
|
|
|
|
|
<Form onSubmit={handleSubmit}>
|
|
|
|
|
<Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
|
|
|
|
|
<Tabs value={tabValue} onChange={handleTabChange} aria-label="设置选项卡">
|
|
|
|
|
<Tab label="基础信息" value="generalForm" />
|
|
|
|
|
<Tab label="解析配置" value="chunkMethodForm" />
|
|
|
|
|
</Tabs>
|
|
|
|
|
</Box>
|
|
|
|
|
|
|
|
|
|
<Box sx={{ mt: 3 }}>
|
|
|
|
|
{tabValue === 'generalForm' && (
|
|
|
|
|
<GeneralForm />
|
|
|
|
|
)}
|
|
|
|
|
{tabValue === 'chunkMethodForm' && (
|
|
|
|
|
<ChunkMethodForm />
|
|
|
|
|
)}
|
|
|
|
|
</Box>
|
|
|
|
|
|
|
|
|
|
<Box sx={{ mt: 3, display: 'flex', justifyContent: 'flex-end' }}>
|
|
|
|
|
<Button type="submit" variant="contained">
|
|
|
|
|
保存
|
|
|
|
|
</Button>
|
|
|
|
|
</Box>
|
|
|
|
|
</Form>
|
|
|
|
|
</FormProvider>
|
2025-10-14 18:06:12 +08:00
|
|
|
|
|
|
|
|
{/* 返回按钮 */}
|
|
|
|
|
<Fab
|
|
|
|
|
color="primary"
|
|
|
|
|
aria-label="返回知识库详情"
|
2025-10-15 16:24:53 +08:00
|
|
|
onClick={handleNavigateBack}
|
2025-10-14 18:06:12 +08:00
|
|
|
sx={{
|
|
|
|
|
position: 'fixed',
|
|
|
|
|
bottom: 128,
|
|
|
|
|
right: 64,
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<ArrowBackIcon />
|
|
|
|
|
</Fab>
|
2025-10-15 16:24:53 +08:00
|
|
|
</MainContainer>
|
2025-10-14 18:06:12 +08:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default KnowledgeBaseSetting;
|