feat(knowledge): add parse type enum and refactor configuration components

refactor(configuration): replace buildMode with parseType in all config components
This commit is contained in:
2025-11-07 13:30:59 +08:00
parent b2d4d32375
commit b610ee0a8f
25 changed files with 307 additions and 224 deletions

View File

@@ -106,3 +106,8 @@ export const KNOWLEDGE_SEARCH_PARAMS_KEYS = Object.freeze({
export type KnowledgeSearchParams = (typeof KNOWLEDGE_SEARCH_PARAMS_KEYS)[keyof typeof KNOWLEDGE_SEARCH_PARAMS_KEYS]
export const DATABASE_BASE_KEY = 'dataset';
export enum ParseType {
BuildIn = '1',
Pipeline = '2',
}

View File

@@ -92,6 +92,8 @@ export default {
knowledgeBase: 'Knowledge Base',
knowledgeBaseDetail: 'Knowledge Base Detail',
settings: 'Settings',
overview: 'Overview',
fileLogs: 'File Logs',
knowledgeBaseSettings: 'Knowledge Base Settings',
settingsTabs: 'Settings Tabs',
backToKnowledgeDetail: 'Back to Knowledge Base Detail',
@@ -652,7 +654,7 @@ export default {
dataFlowPlaceholder: 'Please select a pipeline.',
buildItFromScratch: 'Build it from scratch',
dataFlow: 'Pipeline',
parseType: 'Parse Type',
parseType: 'Ingestion pipeline',
manualSetup: 'Manual Setup',
builtIn: 'Built-in',
titleDescription:
@@ -1227,6 +1229,8 @@ This auto-tagging feature enhances retrieval by adding another layer of domain-s
editAgent: 'Edit Agent',
deleteAgent: 'Delete Agent',
searchAgent: 'Search Agent',
forms: {
title: 'Title',
avatar: 'Avatar',

View File

@@ -393,6 +393,8 @@ export default {
knowledgeBase: '知识库',
knowledgeBaseDetail: '知识库详情',
settings: '设置',
overview: '概览',
fileLogs: '文件日志',
knowledgeBaseSettings: '知识库设置',
settingsTabs: '设置选项卡',
backToKnowledgeDetail: '返回知识库详情',
@@ -1194,6 +1196,8 @@ General实体和关系提取提示来自 GitHub - microsoft/graphrag基于
editAgent: '编辑智能体',
deleteAgent: '删除智能体',
searchAgent: '搜索智能体',
forms: {
title: '标题',
avatar: '头像',

View File

@@ -85,7 +85,7 @@ function AgentListPage() {
<TextField
value={searchValue}
onChange={(e) => handleSearch(e.target.value)}
placeholder="搜索名称或描述"
placeholder={t('agent.searchAgent')}
size="small"
InputProps={{
startAdornment: (
@@ -95,7 +95,9 @@ function AgentListPage() {
)
}}
/>
<Button variant="outlined" startIcon={<RefreshIcon />} onClick={refresh}></Button>
<Button variant="outlined" startIcon={<RefreshIcon />} onClick={refresh}>
{t('common.refresh')}
</Button>
</Box>
</Paper>

View File

@@ -8,7 +8,7 @@ import {
Card,
CardContent,
} from '@mui/material';
import { DOCUMENT_PARSER_TYPES, type DocumentParserType } from '@/constants/knowledge';
import { DOCUMENT_PARSER_TYPES, ParseType, type DocumentParserType } from '@/constants/knowledge';
import { type IParserConfig } from '@/interfaces/database/knowledge';
import {
NaiveConfiguration,
@@ -77,6 +77,7 @@ interface ChunkMethodFormProps {
cancelButtonText?: string;
}
function ChunkMethodForm({
form: propForm,
onSubmit,
@@ -120,9 +121,10 @@ function ChunkMethodForm({
control,
name: 'pipeline_id',
});
const [buildMode, setBuildMode] = useState<'buildIn' | 'pipeline'>(pipeline_id ? 'pipeline' : 'buildIn');
const [parseType, setParseType] = useState<ParseType>(pipeline_id ? ParseType.Pipeline : ParseType.BuildIn);
useEffect(() => {
setBuildMode(pipeline_id ? 'pipeline' : 'buildIn');
setParseType(pipeline_id ? ParseType.Pipeline : ParseType.BuildIn);
}, [pipeline_id]);
// 根据parser_id动态选择配置组件
@@ -135,21 +137,21 @@ function ChunkMethodForm({
return (
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 构建模式选择与联动 */}
<Card sx={{ p: 3 }}>
<Card sx={{ px: 3, marginX: 3 }}>
<CardContent>
<RadioFormField
name="build_mode"
label={t('knowledge.config.buildMode')}
defaultValue={buildMode}
name="parseType"
label={t('knowledgeConfiguration.parseType')}
defaultValue={parseType}
options={[
{ value: 'buildIn', label: 'Built-in' },
{ value: 'pipeline', label: 'Pipeline' },
{ value: ParseType.BuildIn, label: 'Built-in' },
{ value: ParseType.Pipeline, label: 'Pipeline' },
]}
onChangeValue={(v) => setBuildMode(String(v) as 'buildIn' | 'pipeline')}
onChangeValue={(v) => setParseType(v as ParseType)}
/>
{/* 基于模式内置显示切片方法Pipeline 显示选择器 */}
{buildMode === 'buildIn' ? (
{parseType === ParseType.BuildIn ? (
<ChunkMethodItem />
) : (
<PipelineSelectorItem />
@@ -157,8 +159,8 @@ function ChunkMethodForm({
</CardContent>
</Card>
{/* 动态配置内容:始终渲染,内部按 buildMode 控制基础配置显示 */}
<ConfigurationComponent buildMode={buildMode} />
{/* 动态配置内容:始终渲染,内部按 parseType 控制基础配置显示 */}
<ConfigurationComponent parseType={parseType} />
{/* 表单操作按钮 - 仅在有onSubmit回调时显示 */}
{onSubmit && (

View File

@@ -0,0 +1,132 @@
import React, { useEffect, useMemo, useState } from 'react';
import {
Dialog,
DialogTitle,
DialogContent,
DialogActions,
Button,
Box,
Divider,
} from '@mui/material';
import { useTranslation } from 'react-i18next';
import { useForm, FormProvider } from 'react-hook-form';
import GeneralForm from './GeneralForm';
import { RadioFormField } from '@/components/FormField';
import { ChunkMethodItem, PipelineSelectorItem } from '../configuration';
import { DOCUMENT_PARSER_TYPES, ParseType } from '@/constants/knowledge';
import { useKnowledgeOperations } from '@/hooks/knowledge-hooks';
import { useSnackbar } from '@/components/Provider/SnackbarProvider';
export interface CreateKnowledgeDialogProps {
open: boolean;
onClose: () => void;
onSuccess?: () => void;
}
function CreateKnowledgeDialog({ open, onClose, onSuccess }: CreateKnowledgeDialogProps) {
const { t } = useTranslation();
const { showMessage } = useSnackbar();
const { createKnowledge, loading, clearError } = useKnowledgeOperations();
// 表单实例与默认值
const form = useForm<any>({
defaultValues: {
name: '',
description: '',
permission: 'me',
avatar: undefined,
pagerank: 0,
embd_id: '',
// 解析相关
parser_id: DOCUMENT_PARSER_TYPES.Naive,
pipeline_id: '',
parseType: ParseType.BuildIn,
},
});
const [parseType, setParseType] = useState<ParseType>(ParseType.BuildIn);
// 同步 parseType 到表单并清理互斥字段
useEffect(() => {
form.setValue('parseType', parseType);
if (parseType === ParseType.BuildIn) {
// 选择内置解析时清空 pipeline_id
form.setValue('pipeline_id', '');
}
}, [parseType]);
const handleSubmit = async (data: any) => {
clearError();
try {
// 构建创建数据basicData + 解析选择)
const requestData = {
name: data.name,
description: data.description,
permission: data.permission,
avatar: data.avatar,
pagerank: data.pagerank,
embd_id: data.embd_id,
// 解析相关字段:后端已支持 parser_id / pipeline_id
parser_id: data.parser_id,
pipeline_id: data.pipeline_id,
};
await createKnowledge(requestData);
showMessage.success(t('knowledgeConfiguration.createSuccess'));
onSuccess?.();
onClose();
} catch (err) {
// 错误提示由 hook 内部处理,这里保底提示
showMessage.error(t('knowledgeConfiguration.createFailed'));
}
};
const handleCancel = () => {
onClose();
};
return (
<Dialog open={open} onClose={onClose} maxWidth="md" fullWidth>
<DialogTitle>{t('knowledgeList.createKnowledgeBase')}</DialogTitle>
<FormProvider {...form}>
<DialogContent>
{/* 基础信息表单名称、描述、权限、头像、嵌入模型、Pagerank 等) */}
<GeneralForm />
<Divider sx={{ my: 2 }} />
{/* 解析方式选择与联动(来自 ChunkMethodForm */}
<Box sx={{ px: 1 }}>
<RadioFormField
name="parseType"
label={t('knowledgeConfiguration.parseType')}
defaultValue={parseType}
options={[
{ value: ParseType.BuildIn, label: 'Built-in' },
{ value: ParseType.Pipeline, label: 'Pipeline' },
]}
onChangeValue={(v) => setParseType(v as ParseType)}
/>
{/* 基于模式内置显示切片方法Pipeline 显示选择器 */}
<Box sx={{ mt: 2 }}>
{parseType === ParseType.BuildIn ? (
<ChunkMethodItem />
) : (
<PipelineSelectorItem />
)}
</Box>
</Box>
</DialogContent>
</FormProvider>
<DialogActions>
<Button onClick={handleCancel} disabled={loading}>{t('common.cancel')}</Button>
<Button onClick={form.handleSubmit(handleSubmit)} variant="contained" disabled={loading}>
{loading ? t('knowledgeConfiguration.creating') : t('knowledgeConfiguration.createAndNext')}
</Button>
</DialogActions>
</Dialog>
);
}
export default CreateKnowledgeDialog;

View File

@@ -32,11 +32,11 @@ const FloatingActionButtons: React.FC<FloatingActionButtonsProps> = ({
name: t('knowledge.configSettings'),
onClick: onConfigClick,
},
{
icon: <OverviewIcon />,
name: t('knowledgeDetails.overview'),
onClick: onOverviewClick,
},
// {
// icon: <OverviewIcon />,
// name: t('knowledgeDetails.overview'),
// onClick: onOverviewClick,
// },
];
return (

View File

@@ -12,14 +12,14 @@ import { useFormContext } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer, MainContainer } from './configuration-form-container';
import {
ChunkMethodItem,
AutoKeywordsItem,
AutoQuestionsItem,
RaptorConfigItems,
KnowledgeGraphConfigItems,
} from './common-items';
import { ParseType } from '@/constants/knowledge';
export function AudioConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) {
export function AudioConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { formState: { errors } } = useFormContext();
const { t } = useTranslation();
@@ -27,18 +27,12 @@ export function AudioConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'bui
<ConfigurationFormContainer>
<MainContainer>
{/* 第一部分basicConfig 基础配置 */}
{buildMode === 'buildIn' && (
{parseType === ParseType.BuildIn && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
{/* 切片方法 */}
<Box sx={{ mb: 3 }}>
<ChunkMethodItem />
</Box>
<Divider />
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}>
{/* 自动关键词提取 */}
<AutoKeywordsItem />

View File

@@ -4,30 +4,28 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container';
import {
ChunkMethodItem,
ChunkTokenNumberItem,
DelimiterItem,
TOCEnhanceItem,
RaptorConfigItems,
KnowledgeGraphConfigItems
} from './common-items';
import { ParseType } from '@/constants/knowledge';
export function BookConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) {
export function BookConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation();
return (
<ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */}
{buildMode === 'buildIn' && (
{parseType === ParseType.BuildIn && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 分块方法 */}
<ChunkMethodItem />
{/* 分块token数 */}
<ChunkTokenNumberItem />
{/* 分隔符 */}

View File

@@ -4,31 +4,18 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container';
import {
ChunkMethodItem,
RaptorConfigItems,
KnowledgeGraphConfigItems
} from './common-items';
import { ParseType } from '@/constants/knowledge';
export function EmailConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) {
export function EmailConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation();
return (
<ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */}
{buildMode === 'buildIn' && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 分块方法 */}
<ChunkMethodItem />
</Box>
</AccordionDetails>
</Accordion>
)}
{/* 基础配置:已在 ChunkMethodForm 中处理,且仅在 buildIn 时显示 */}
{/* 第二部分RAPTOR策略 */}
<Accordion>

View File

@@ -12,7 +12,6 @@ import { useFormContext } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer, MainContainer } from './configuration-form-container';
import {
ChunkMethodItem,
EmbeddingModelItem,
AutoKeywordsItem,
AutoQuestionsItem,
@@ -28,8 +27,9 @@ import {
EntityNormalizeItem,
CommunityReportItem,
} from './common-items';
import { ParseType } from '@/constants/knowledge';
export function KnowledgeGraphConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) {
export function KnowledgeGraphConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { formState: { errors } } = useFormContext();
const { t } = useTranslation();
@@ -37,16 +37,12 @@ export function KnowledgeGraphConfiguration({ buildMode = 'buildIn' }: { buildMo
<ConfigurationFormContainer>
<MainContainer>
{/* 第一部分basicConfig 基础配置 */}
{buildMode === 'buildIn' && (
{parseType === ParseType.BuildIn && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
{/* 切片方法 */}
<Box sx={{ mb: 3 }}>
<ChunkMethodItem />
</Box>
<Divider />
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}>

View File

@@ -4,31 +4,18 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container';
import {
ChunkMethodItem,
RaptorConfigItems,
KnowledgeGraphConfigItems
} from './common-items';
import { ParseType } from '@/constants/knowledge';
export function LawsConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) {
export function LawsConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation();
return (
<ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */}
{buildMode === 'buildIn' && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 分块方法 */}
<ChunkMethodItem />
</Box>
</AccordionDetails>
</Accordion>
)}
{/* 基础配置:已在 ChunkMethodForm 中处理,且仅在 buildIn 时显示 */}
{/* 第二部分RAPTOR策略 */}
<Accordion>

View File

@@ -12,7 +12,6 @@ import { useFormContext } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer, MainContainer } from './configuration-form-container';
import {
ChunkMethodItem,
ChunkTokenNumberItem,
DelimiterItem,
LayoutRecognizeItem,
@@ -33,8 +32,9 @@ import {
RaptorConfigItems,
KnowledgeGraphConfigItems,
} from './common-items';
import { ParseType } from '@/constants/knowledge';
export function ManualConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) {
export function ManualConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { formState: { errors } } = useFormContext();
const { t } = useTranslation();
@@ -42,16 +42,12 @@ export function ManualConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'bu
<ConfigurationFormContainer>
<MainContainer>
{/* 第一部分basicConfig 基础配置 */}
{buildMode === 'buildIn' && (
{parseType === ParseType.BuildIn && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
{/* 切片方法 */}
<Box sx={{ mb: 3 }}>
<ChunkMethodItem />
</Box>
<Divider />
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}>

View File

@@ -12,9 +12,10 @@ import { useFormContext } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer, MainContainer } from './configuration-form-container';
import { RaptorConfigItems, KnowledgeGraphConfigItems, BasicConfigItems } from './common-items';
import { ParseType } from '@/constants/knowledge';
// import { RadioFormField } from '@/components/FormField';
export function NaiveConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) {
export function NaiveConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { formState: { errors } } = useFormContext();
const { t } = useTranslation();
@@ -22,7 +23,7 @@ export function NaiveConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'bui
<ConfigurationFormContainer>
<MainContainer>
{/* 第一部分basicConfig 基础配置 */}
{buildMode === 'buildIn' && (
{parseType === ParseType.BuildIn && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>

View File

@@ -12,7 +12,6 @@ import { useFormContext } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer, MainContainer } from './configuration-form-container';
import {
ChunkMethodItem,
ChunkTokenNumberItem,
DelimiterItem,
LayoutRecognizeItem,
@@ -22,8 +21,9 @@ import {
RaptorConfigItems,
KnowledgeGraphConfigItems,
} from './common-items';
import { ParseType } from '@/constants/knowledge';
export function OneConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) {
export function OneConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { formState: { errors } } = useFormContext();
const { t } = useTranslation();
@@ -31,16 +31,12 @@ export function OneConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'build
<ConfigurationFormContainer>
<MainContainer>
{/* 第一部分basicConfig 基础配置 */}
{buildMode === 'buildIn' && (
{parseType === ParseType.BuildIn && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
{/* 切片方法 */}
<Box sx={{ mb: 3 }}>
<ChunkMethodItem />
</Box>
<Divider />
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}>

View File

@@ -12,15 +12,15 @@ import { useFormContext } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer, MainContainer } from './configuration-form-container';
import {
ChunkMethodItem,
LayoutRecognizeItem,
AutoKeywordsItem,
AutoQuestionsItem,
RaptorConfigItems,
KnowledgeGraphConfigItems,
} from './common-items';
import { ParseType } from '@/constants/knowledge';
export function PaperConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) {
export function PaperConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { formState: { errors } } = useFormContext();
const { t } = useTranslation();
@@ -28,16 +28,12 @@ export function PaperConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'bui
<ConfigurationFormContainer>
<MainContainer>
{/* 第一部分basicConfig 基础配置 */}
{buildMode === 'buildIn' && (
{parseType === ParseType.BuildIn && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
{/* 切片方法 */}
<Box sx={{ mb: 3 }}>
<ChunkMethodItem />
</Box>
<Divider />
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}>

View File

@@ -4,31 +4,18 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container';
import {
ChunkMethodItem,
RaptorConfigItems,
KnowledgeGraphConfigItems
} from './common-items';
import { ParseType } from '@/constants/knowledge';
export function PictureConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) {
export function PictureConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation();
return (
<ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */}
{buildMode === 'buildIn' && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 分块方法 */}
<ChunkMethodItem />
</Box>
</AccordionDetails>
</Accordion>
)}
{/* 基础配置:已在 ChunkMethodForm 中处理,且仅在 buildIn 时显示 */}
{/* 第二部分RAPTOR策略 */}
<Accordion>

View File

@@ -4,32 +4,28 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container';
import {
ChunkMethodItem,
RaptorConfigItems,
KnowledgeGraphConfigItems,
LayoutRecognizeItem,
AutoKeywordsItem,
AutoQuestionsItem
} from './common-items';
import { ParseType } from '@/constants/knowledge';
export function PresentationConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) {
export function PresentationConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation();
return (
<ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */}
{buildMode === 'buildIn' && (
{parseType === ParseType.BuildIn && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
{/* 切片方法 */}
<Box sx={{ mb: 3 }}>
<ChunkMethodItem />
</Box>
<Divider />
<Divider />
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}>
{/* 版面识别 */}

View File

@@ -4,31 +4,18 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container';
import {
ChunkMethodItem,
RaptorConfigItems,
KnowledgeGraphConfigItems
} from './common-items';
import { ParseType } from '@/constants/knowledge';
export function QAConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) {
export function QAConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation();
return (
<ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */}
{buildMode === 'buildIn' && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 分块方法 */}
<ChunkMethodItem />
</Box>
</AccordionDetails>
</Accordion>
)}
{/* 基础配置:已在 ChunkMethodForm 中处理,且仅在 buildIn 时显示 */}
{/* 第二部分RAPTOR策略 */}
<Accordion>

View File

@@ -4,31 +4,18 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container';
import {
ChunkMethodItem,
RaptorConfigItems,
KnowledgeGraphConfigItems
} from './common-items';
import { ParseType } from '@/constants/knowledge';
export function ResumeConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) {
export function ResumeConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation();
return (
<ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */}
{buildMode === 'buildIn' && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 分块方法 */}
<ChunkMethodItem />
</Box>
</AccordionDetails>
</Accordion>
)}
{/* 基础配置:已在 ChunkMethodForm 中处理,且仅在 buildIn 时显示 */}
{/* 第二部分RAPTOR策略 */}
<Accordion>

View File

@@ -4,31 +4,18 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container';
import {
ChunkMethodItem,
RaptorConfigItems,
KnowledgeGraphConfigItems
} from './common-items';
import { ParseType } from '@/constants/knowledge';
export function TableConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) {
export function TableConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation();
return (
<ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */}
{buildMode === 'buildIn' && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 分块方法 */}
<ChunkMethodItem />
</Box>
</AccordionDetails>
</Accordion>
)}
{/* 基础配置:已在 ChunkMethodForm 中处理,且仅在 buildIn 时显示 */}
{/* 第二部分RAPTOR策略 */}
<Accordion>

View File

@@ -1,38 +1,24 @@
import React from 'react';
import { Box, Typography, Accordion, AccordionSummary, AccordionDetails, Divider } from '@mui/material';
import { Box, Typography, Accordion, AccordionSummary, AccordionDetails } from '@mui/material';
import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container';
import {
RaptorConfigItems,
KnowledgeGraphConfigItems,
ChunkMethodItem,
LayoutRecognizeItem,
AutoKeywordsItem,
AutoQuestionsItem
} from './common-items';
import { ParseType } from '@/constants/knowledge';
export function TagConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) {
export function TagConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation();
return (
<ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */}
{buildMode === 'buildIn' && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
{/* 切片方法 */}
<Box sx={{ mb: 3 }}>
<ChunkMethodItem />
</Box>
<Divider />
</AccordionDetails>
</Accordion>
)}
{/* 基础配置:已在 ChunkMethodForm 中处理,且仅在 buildIn 时显示 */}
{/* 第二部分RAPTOR策略 */}
<Accordion>

View File

@@ -26,6 +26,7 @@ import type { IKnowledge } from '@/interfaces/database/knowledge';
import { useDialog } from '@/hooks/useDialog';
import logger from '@/utils/logger';
import { useTranslation } from 'react-i18next';
import CreateKnowledgeDialog from './components/CreateKnowledgeDialog';
const KnowledgeBaseList: React.FC = () => {
@@ -88,10 +89,13 @@ const KnowledgeBaseList: React.FC = () => {
refresh();
}, [refresh]);
// 处理创建知识库
// 创建知识库对话框
const [createDialogOpen, setCreateDialogOpen] = useState(false);
// 处理创建知识库:打开对话框
const handleCreateKnowledge = useCallback(() => {
navigate('/knowledge/create');
}, [navigate]);
setCreateDialogOpen(true);
}, []);
const dialog = useDialog();
@@ -239,6 +243,16 @@ const KnowledgeBaseList: React.FC = () => {
onCreateKnowledge={handleCreateKnowledge}
/>
{/* 创建知识库对话框 */}
<CreateKnowledgeDialog
open={createDialogOpen}
onClose={() => setCreateDialogOpen(false)}
onSuccess={() => {
setCreateDialogOpen(false);
refresh();
}}
/>
{/* 分页组件 */}
{totalPages > 1 && (
<Box sx={{ display: 'flex', justifyContent: 'center', mt: 4 }}>

View File

@@ -1,15 +1,17 @@
import React from 'react';
import { Box, Grid, Paper, Typography, IconButton, TextField, Tabs, Tab } from '@mui/material';
import { Box, Grid, Paper, Typography, IconButton, TextField, Tabs, Tab, Fab } from '@mui/material';
import { DataGrid, type GridColDef } from '@mui/x-data-grid';
import FilterListIcon from '@mui/icons-material/FilterList';
import SearchIcon from '@mui/icons-material/Search';
import {
ArrowBack as ArrowBackIcon,
Search as SearchIcon,
} from '@mui/icons-material';
import { useTranslation } from 'react-i18next';
import { useParams } from 'react-router-dom';
import { useKnowledgeOverview } from '@/hooks/knowledge-hooks';
import type { IDocumentLog, IFileLogItem } from '@/interfaces/database/knowledge';
import { useNavigate, useParams } from 'react-router-dom';
import { useKnowledgeOverview, useKnowledgeDetail } from '@/hooks/knowledge-hooks';
import logger from '@/utils/logger';
import i18n, { LanguageAbbreviation } from '@/locales';
import { enUS, zhCN } from '@mui/x-data-grid/locales';
import KnowledgeBreadcrumbs from './components/KnowledgeBreadcrumbs';
const PROCESSING_TYPES = {
@@ -34,7 +36,6 @@ function KnowledgeLogsPage() {
return currentLanguage === LanguageAbbreviation.Zh ? zhCN : enUS;
};
// 路由参数与数据Hook
const { id: kbId = '' } = useParams();
const {
@@ -52,6 +53,9 @@ function KnowledgeLogsPage() {
setKeywords,
} = useKnowledgeOverview(kbId);
// 获取知识库详情以用于面包屑显示名称
const { knowledge } = useKnowledgeDetail(kbId);
// 同步分页模型到Hook
React.useEffect(() => {
setPaginationModel({ page: Math.max(currentPage - 1, 0), pageSize });
@@ -94,8 +98,29 @@ function KnowledgeLogsPage() {
(datasetLogs?.total || 0)),
[activeTab, fileLogs, datasetLogs]);
const navigate = useNavigate();
const handleNavigateBack = () => {
navigate(`/knowledge/${kbId}`);
};
return (
<Box sx={{ p: 3 }}>
{/* 面包屑导航 */}
<KnowledgeBreadcrumbs
kbItems={[
{
label: t('knowledgeSettings.knowledgeBase'),
path: '/knowledge'
},
{
label: knowledge?.name || t('knowledgeSettings.knowledgeBaseDetail'),
path: `/knowledge/${kbId}`
},
{
label: t('knowledgeSettings.fileLogs')
}
]}
/>
{/* 顶部统计卡片占位 */}
<Grid container spacing={2} sx={{ mb: 2 }}>
<Grid size={{ xs: 12, md: 4 }}>
@@ -124,8 +149,8 @@ function KnowledgeLogsPage() {
{/* Tabs & Filter/Search */}
<Box display="flex" alignItems="center" gap={2} sx={{ mb: 2 }}>
<Tabs value={activeTab} onChange={(_, v) => setActiveTab(v)}>
<Tab value="file" label={t('knowledgeDetails.file')} />
<Tab value="dataset" label={t('knowledgeDetails.dataset')} />
<Tab value="fileLogs" label={t('knowledgeDetails.file')} />
<Tab value="datasetLogs" label={t('knowledgeDetails.dataset')} />
</Tabs>
{/* <IconButton aria-label="filter"><FilterListIcon /></IconButton> */}
<Box display="flex" alignItems="center" gap={1} sx={{ ml: 'auto' }}>
@@ -155,6 +180,20 @@ function KnowledgeLogsPage() {
localeText={getDataGridLocale().components.MuiDataGrid.defaultProps.localeText}
/>
</Paper>
{/* 返回按钮 */}
<Fab
color="primary"
aria-label={t('knowledgeSettings.backToKnowledgeDetail')}
onClick={handleNavigateBack}
sx={{
position: 'fixed',
bottom: 128,
right: 64,
}}
>
<ArrowBackIcon />
</Fab>
</Box>
);
}

View File

@@ -106,10 +106,10 @@ function KnowledgeBaseSetting() {
setTabValue(newValue);
};
const handleSubmit = async ({data}: {data: any}) => {
const handleSubmit = async ({ data }: { data: any }) => {
if (!knowledge) return;
console.log(t('knowledgeSettings.submitData'), data);
try {
// 分别处理基础信息和配置信息
if (tabValue === 'generalForm') {
@@ -142,12 +142,12 @@ function KnowledgeBaseSetting() {
await updateKnowledgeModelConfig(configData);
showMessage.success(t('knowledgeSettings.parseConfigUpdateSuccess'));
}
// 刷新知识库详情
refresh();
} catch (error) {
showMessage.error(t('knowledgeSettings.updateFailed', {
type: tabValue === 'generalForm' ? t('knowledgeSettings.basicInfo') : t('knowledgeSettings.parseConfig')
showMessage.error(t('knowledgeSettings.updateFailed', {
type: tabValue === 'generalForm' ? t('knowledgeSettings.basicInfo') : t('knowledgeSettings.parseConfig')
}));
}
};
@@ -167,7 +167,7 @@ function KnowledgeBaseSetting() {
return (
<MainContainer>
{/* 面包屑导航 */}
<KnowledgeBreadcrumbs
<KnowledgeBreadcrumbs
kbItems={[
{
label: t('knowledgeSettings.knowledgeBase'),
@@ -194,27 +194,27 @@ function KnowledgeBaseSetting() {
<FormProvider {...form}>
<Form onSubmit={handleSubmit}>
<Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
<Tabs value={tabValue} onChange={handleTabChange} aria-label={t('knowledgeSettings.settingsTabs')}>
<Tab label={t('knowledgeSettings.basicInfo')} value="generalForm" />
<Tab label={t('knowledgeSettings.parseConfig')} value="chunkMethodForm" />
</Tabs>
</Box>
<Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
<Tabs value={tabValue} onChange={handleTabChange} aria-label={t('knowledgeSettings.settingsTabs')}>
<Tab label={t('knowledgeSettings.basicInfo')} value="generalForm" />
<Tab label={t('knowledgeSettings.parseConfig')} value="chunkMethodForm" />
</Tabs>
</Box>
<Box sx={{ mt: 3 }}>
{tabValue === 'generalForm' && (
<GeneralForm />
)}
{tabValue === 'chunkMethodForm' && (
<ChunkMethodForm />
)}
</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">
{t('common.save')}
</Button>
</Box>
<Box sx={{ mt: 3, display: 'flex', justifyContent: 'flex-end' }}>
<Button type="submit" variant="contained">
{t('common.save')}
</Button>
</Box>
</Form>
</FormProvider>