/* * @Author: ZhaoYing * @Date: 2026-02-03 16:25:37 * @Last Modified by: ZhaoYing * @Last Modified time: 2026-02-24 11:47:27 */ /** * Knowledge Configuration Modal * Configures retrieval settings for individual knowledge bases * Supports different retrieval modes: participle, semantic, and hybrid */ import { forwardRef, useEffect, useImperativeHandle, useState } from 'react'; import { Form, Select, InputNumber, Flex } from 'antd'; import { useTranslation } from 'react-i18next'; import type { KnowledgeConfigModalRef, KnowledgeBase, KnowledgeConfigForm, RetrieveType } from './types' import RbModal from '@/components/RbModal' import RbSlider from '@/components/RbSlider' import { formatDateTime } from '@/utils/format'; const FormItem = Form.Item; /** * Component props */ interface KnowledgeConfigModalProps { /** Callback to update knowledge configuration */ refresh: (values: KnowledgeConfigForm, type: 'knowledgeConfig') => void; } /** * Available retrieval types */ const retrieveTypes: RetrieveType[] = ['participle', 'semantic', 'hybrid', 'graph'] /** * Modal for configuring knowledge base retrieval settings */ const KnowledgeConfigModal = forwardRef(({ refresh, }, ref) => { const { t } = useTranslation(); const [visible, setVisible] = useState(false); const [form] = Form.useForm(); const [data, setData] = useState(null); const values = Form.useWatch([], form); /** Close modal and reset form */ const handleClose = () => { setVisible(false); form.resetFields(); setData(null) }; /** Open modal with knowledge base data */ const handleOpen = (data: KnowledgeBase) => { form.setFieldsValue({ retrieve_type: data?.config?.retrieve_type || retrieveTypes[0], kb_id: data.id, top_k: data?.config?.top_k || 5, similarity_threshold: data?.config?.similarity_threshold || 0.5, vector_similarity_weight: data?.config?.vector_similarity_weight || 0.5, ...(data || {}), ...(data?.config || {}), }) setData({...data}) setVisible(true); }; /** Save knowledge configuration */ const handleSave = () => { form .validateFields() .then(() => { refresh(values, 'knowledgeConfig') handleClose() }) .catch((err) => { console.log('err', err) }); } /** Expose methods to parent component */ useImperativeHandle(ref, () => ({ handleOpen, handleClose })); useEffect(() => { if (values?.retrieve_type) { const fieldsToReset = Object.keys(values).filter(key => key !== 'kb_id' && key !== 'retrieve_type' && key !== 'top_k' ) as (keyof KnowledgeConfigForm)[]; form.resetFields(fieldsToReset); } }, [values?.retrieve_type]) return (
{data && (
{data.name}
{t('application.contains', {include_count: data.doc_num})}
{formatDateTime(data.updated_at, 'YYYY-MM-DD HH:mm:ss')}
)}