feat(knowledge): add pipeline support and build mode selection

refactor(configuration): reorganize naive config form with pipeline selector
feat(form): add RadioFormField component for build mode selection
docs: add ahooks usage guide for common patterns
style: update app title and favicon
chore: clean up unused agent interfaces
This commit is contained in:
2025-11-06 23:06:23 +08:00
parent e325beea4b
commit d24b371929
16 changed files with 550 additions and 60 deletions

View File

@@ -13,7 +13,7 @@ export interface AgentTopbarProps {
onOpenSettings?: () => void;
}
export default function AgentTopbar({ title, id, onRefresh, subtitle, actionsRight, onOpenVersions, onOpenSettings }: AgentTopbarProps) {
export default function AgentTopbar({ title, onRefresh, subtitle, actionsRight, onOpenVersions, onOpenSettings }: AgentTopbarProps) {
const { t } = useTranslation();
return (
<Box sx={{

View File

@@ -1,4 +1,4 @@
import { useMemo } from 'react';
import { useMemo, useEffect, useState } from 'react';
import {
FormControl,
InputLabel,
@@ -15,6 +15,7 @@ import { useFormContext, Controller } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { t as translate } from 'i18next';
import { DOCUMENT_PARSER_TYPES, LLM_MODEL_TYPES, type LlmModelType } from '@/constants/knowledge';
import { AgentCategory } from '@/constants/agent';
import { useSelectChunkMethodList } from '../hooks';
import { useEmbeddingModelOptions, useLlmOptionsByModelType } from '@/hooks/llm-hooks';
import {
@@ -27,6 +28,7 @@ import {
TextFormField,
type SelectOption,
} from '@/components/FormField';
import agentService from '@/services/agent_service';
import { LlmSvgIcon } from '@/components/AppSvgIcon';
import {type LLMFactory } from '@/constants/llm';
import { getFactoryIconName } from '@/utils/common';
@@ -153,7 +155,6 @@ export function ChunkMethodItem() {
export function TagsItem() {
const { t } = useTranslation();
const tagsOptions: SelectOption[] = [
{ value: '', label: t('common.pleaseSelect') },
// 这里可以根据实际需求添加标签选项
];
@@ -162,8 +163,7 @@ export function TagsItem() {
name="parser_config.tags"
label={t('knowledge.config.tags')}
options={tagsOptions}
defaultValue=""
displayEmpty
displayEmpty={false}
/>
);
}
@@ -341,6 +341,42 @@ export function TOCEnhanceItem() {
);
}
// Pipeline 选择器
export function PipelineSelectorItem() {
const { t } = useTranslation();
const [options, setOptions] = useState<SelectOption[]>([]);
useEffect(() => {
const fetchPipelines = async () => {
try {
const envMode = import.meta.env.MODE;
const service = envMode === 'flask' ? agentService.teamlistCanvas : agentService.listCanvas;
const res = await service({ canvas_category: AgentCategory.DataflowCanvas, page_size: 100 });
const data = res?.data?.data || {};
const list = data.canvas || [];
const mapped: SelectOption[] = list.map((item: any) => ({
value: item.id,
label: item.title || item.name || item.id,
disabled: false,
}));
setOptions(mapped);
} catch (err) {
console.error('Failed to fetch pipelines:', err);
}
};
fetchPipelines();
}, []);
return (
<SelectFormField
name="pipeline_id"
label={t('knowledgeConfiguration.dataFlow')}
options={options}
displayEmpty={false}
/>
);
}
/* ============================================================================
* 第二部分RAPTOR策略 (RAPTOR Strategy)
* ============================================================================ */
@@ -510,7 +546,33 @@ export function CommunityReportItem() {
* 组合配置组件 (Composite Configuration Components)
* ============================================================================ */
// RAPTOR策略配置项组合
/*
* 基础配置项 (Basic Configuration Items)
*/
export function BasicConfigItems() {
return (
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* PDF解析器 */}
<LayoutRecognizeItem />
{/* 建议文本块大小 */}
<ChunkTokenNumberItem />
{/* 文本分段标识符 */}
<DelimiterItem />
{/* 目录增强 */}
<TOCEnhanceItem />
{/* 自动关键词提取 */}
<AutoKeywordsItem />
{/* 自动问题提取 */}
<AutoQuestionsItem />
{/* 表格转HTML */}
<HtmlForExcelItem />
</Box>
);
}
/**
* RAPTOR策略配置项组合
*/
export function RaptorConfigItems() {
return (
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
@@ -530,7 +592,9 @@ export function RaptorConfigItems() {
);
}
// 知识图谱配置项组合
/**
* 知识图谱配置项组合
*/
export function KnowledgeGraphConfigItems() {
return (
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>

View File

@@ -1,4 +1,4 @@
import React from 'react';
import React, { useEffect, useState } from 'react';
import {
Box,
Typography,
@@ -13,20 +13,23 @@ import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer, MainContainer } from './configuration-form-container';
import {
ChunkMethodItem,
ChunkTokenNumberItem,
AutoKeywordsItem,
AutoQuestionsItem,
HtmlForExcelItem,
LayoutRecognizeItem,
DelimiterItem,
TOCEnhanceItem,
RaptorConfigItems,
KnowledgeGraphConfigItems
KnowledgeGraphConfigItems,
PipelineSelectorItem,
BasicConfigItems,
} from './common-items';
import { RadioFormField } from '@/components/FormField';
export function NaiveConfiguration() {
const { formState: { errors } } = useFormContext();
const { formState: { errors }, watch } = useFormContext();
const { t } = useTranslation();
const [buildMode, setBuildMode] = useState<'buildIn' | 'pipeline'>('buildIn');
// 根据表单的 pipeline_id 自动切换 buildMode
const pipelineId = watch('pipeline_id');
useEffect(() => {
setBuildMode(pipelineId ? 'pipeline' : 'buildIn');
}, [pipelineId]);
return (
<ConfigurationFormContainer>
@@ -38,26 +41,27 @@ export function NaiveConfiguration() {
</AccordionSummary>
<AccordionDetails>
{/* 切片方法 */}
<Box sx={{ mb: 3 }}>
<ChunkMethodItem />
<Box sx={{ mb: 3, display: 'flex', flexDirection: 'column', gap: 3 }}>
<RadioFormField
name="build_mode"
defaultValue="buildIn"
options={[
{ value: 'buildIn', label: 'Built-in' },
{ value: 'pipeline', label: 'Pipeline' },
]}
onChangeValue={(v) => setBuildMode(String(v) as 'buildIn' | 'pipeline')}
/>
{buildMode === 'buildIn' ? (
<ChunkMethodItem />
) : (
<PipelineSelectorItem />
)}
</Box>
<Divider />
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}>
{/* PDF解析器 */}
<LayoutRecognizeItem />
{/* 建议文本块大小 */}
<ChunkTokenNumberItem />
{/* 文本分段标识符 */}
<DelimiterItem />
{/* 目录增强 */}
<TOCEnhanceItem />
{/* 自动关键词提取 */}
<AutoKeywordsItem />
{/* 自动问题提取 */}
<AutoQuestionsItem />
{/* 表格转HTML */}
<HtmlForExcelItem />
<Box sx={{ mt: 3 }}>
{buildMode === 'buildIn' && (
<BasicConfigItems />
)}
</Box>
</AccordionDetails>
</Accordion>

View File

@@ -136,6 +136,7 @@ function KnowledgeBaseSetting() {
parser_id: data.parser_id,
embd_id: data.embd_id,
parser_config: data.parser_config,
pipeline_id: data.pipeline_id,
};
await updateKnowledgeModelConfig(configData);