style(web): translate the comments in the src/views directory into English
This commit is contained in:
@@ -1,6 +1,19 @@
|
||||
/*
|
||||
* @Author: ZhaoYing
|
||||
* @Date: 2026-02-03 16:25:32
|
||||
* @Last Modified by: ZhaoYing
|
||||
* @Last Modified time: 2026-02-03 16:25:32
|
||||
*/
|
||||
/**
|
||||
* Knowledge Base Component
|
||||
* Manages knowledge base associations for the application
|
||||
* Allows adding, configuring, and removing knowledge bases
|
||||
*/
|
||||
|
||||
import { type FC, useRef, useState, useEffect } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { Space, Button, List } from 'antd'
|
||||
|
||||
import knowledgeEmpty from '@/assets/images/application/knowledgeEmpty.svg'
|
||||
import type {
|
||||
KnowledgeConfigForm,
|
||||
@@ -19,6 +32,11 @@ import Tag from '@/components/Tag'
|
||||
import { getKnowledgeBaseList } from '@/api/knowledgeBase'
|
||||
import Card from '../Card'
|
||||
|
||||
/**
|
||||
* Knowledge base management component
|
||||
* @param value - Current knowledge configuration
|
||||
* @param onChange - Callback when configuration changes
|
||||
*/
|
||||
const Knowledge: FC<{value?: KnowledgeConfig; onChange?: (config: KnowledgeConfig) => void}> = ({value = {knowledge_bases: []}, onChange}) => {
|
||||
const { t } = useTranslation()
|
||||
const knowledgeModalRef = useRef<KnowledgeModalRef>(null)
|
||||
@@ -32,10 +50,10 @@ const Knowledge: FC<{value?: KnowledgeConfig; onChange?: (config: KnowledgeConfi
|
||||
setEditConfig({ ...(value || {}) })
|
||||
const knowledge_bases = [...(value.knowledge_bases || [])]
|
||||
|
||||
// 检查是否有knowledge_bases缺少name字段
|
||||
// Check if knowledge_bases are missing name field
|
||||
const basesWithoutName = knowledge_bases.filter(base => !base.name)
|
||||
if (basesWithoutName.length > 0) {
|
||||
// 调用接口获取完整的知识库信息
|
||||
// Call API to get complete knowledge base information
|
||||
getKnowledgeBaseList().then(res => {
|
||||
const fullBases = knowledge_bases.map(base => {
|
||||
if (!base.name) {
|
||||
@@ -54,12 +72,15 @@ const Knowledge: FC<{value?: KnowledgeConfig; onChange?: (config: KnowledgeConfi
|
||||
}
|
||||
}, [value])
|
||||
|
||||
/** Open global knowledge configuration modal */
|
||||
const handleKnowledgeConfig = () => {
|
||||
knowledgeGlobalConfigModalRef.current?.handleOpen()
|
||||
}
|
||||
/** Open knowledge base selection modal */
|
||||
const handleAddKnowledge = () => {
|
||||
knowledgeModalRef.current?.handleOpen()
|
||||
}
|
||||
/** Remove knowledge base from list */
|
||||
const handleDeleteKnowledge = (id: string) => {
|
||||
const list = knowledgeList.filter(item => item.id !== id)
|
||||
setKnowledgeList([...list])
|
||||
@@ -68,9 +89,11 @@ const Knowledge: FC<{value?: KnowledgeConfig; onChange?: (config: KnowledgeConfi
|
||||
knowledge_bases: [...list],
|
||||
})
|
||||
}
|
||||
/** Open knowledge base configuration modal */
|
||||
const handleEditKnowledge = (item: KnowledgeBase) => {
|
||||
knowledgeConfigModalRef.current?.handleOpen(item)
|
||||
}
|
||||
/** Update knowledge configuration */
|
||||
const refresh = (values: KnowledgeBase[] | KnowledgeConfigForm | RerankerConfig, type: 'knowledge' | 'knowledgeConfig' | 'rerankerConfig') => {
|
||||
if (type === 'knowledge') {
|
||||
let list = [...knowledgeList]
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
/*
|
||||
* @Author: ZhaoYing
|
||||
* @Date: 2026-02-03 16:25:37
|
||||
* @Last Modified by: ZhaoYing
|
||||
* @Last Modified time: 2026-02-03 16:25:37
|
||||
*/
|
||||
/**
|
||||
* 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 } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
@@ -9,11 +21,22 @@ 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']
|
||||
|
||||
/**
|
||||
* Modal for configuring knowledge base retrieval settings
|
||||
*/
|
||||
const KnowledgeConfigModal = forwardRef<KnowledgeConfigModalRef, KnowledgeConfigModalProps>(({
|
||||
refresh,
|
||||
}, ref) => {
|
||||
@@ -24,13 +47,14 @@ const KnowledgeConfigModal = forwardRef<KnowledgeConfigModalRef, KnowledgeConfig
|
||||
|
||||
const values = Form.useWatch<KnowledgeConfigForm>([], 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],
|
||||
@@ -44,7 +68,7 @@ const KnowledgeConfigModal = forwardRef<KnowledgeConfigModalRef, KnowledgeConfig
|
||||
setData({...data})
|
||||
setVisible(true);
|
||||
};
|
||||
// 封装保存方法,添加提交逻辑
|
||||
/** Save knowledge configuration */
|
||||
const handleSave = () => {
|
||||
form
|
||||
.validateFields()
|
||||
@@ -57,7 +81,7 @@ const KnowledgeConfigModal = forwardRef<KnowledgeConfigModalRef, KnowledgeConfig
|
||||
});
|
||||
}
|
||||
|
||||
// 暴露给父组件的方法
|
||||
/** Expose methods to parent component */
|
||||
useImperativeHandle(ref, () => ({
|
||||
handleOpen,
|
||||
handleClose
|
||||
@@ -94,7 +118,7 @@ const KnowledgeConfigModal = forwardRef<KnowledgeConfigModalRef, KnowledgeConfig
|
||||
</div>
|
||||
)}
|
||||
<FormItem name="kb_id" hidden />
|
||||
{/* 检索模式 */}
|
||||
{/* Retrieval mode */}
|
||||
<FormItem
|
||||
name="retrieve_type"
|
||||
label={t('application.retrieve_type')}
|
||||
@@ -124,7 +148,7 @@ const KnowledgeConfigModal = forwardRef<KnowledgeConfigModalRef, KnowledgeConfig
|
||||
onChange={(value) => form.setFieldValue('top_k', value)}
|
||||
/>
|
||||
</FormItem>
|
||||
{/* 语义相似度阈值 similarity_threshold */}
|
||||
{/* Semantic similarity threshold */}
|
||||
{values?.retrieve_type === 'semantic' && (
|
||||
<FormItem
|
||||
name="similarity_threshold"
|
||||
@@ -139,7 +163,7 @@ const KnowledgeConfigModal = forwardRef<KnowledgeConfigModalRef, KnowledgeConfig
|
||||
/>
|
||||
</FormItem>
|
||||
)}
|
||||
{/* 分词匹配度阈值 vector_similarity_weight */}
|
||||
{/* Word segmentation matching threshold */}
|
||||
{values?.retrieve_type === 'participle' && (
|
||||
<FormItem
|
||||
name="vector_similarity_weight"
|
||||
@@ -154,7 +178,7 @@ const KnowledgeConfigModal = forwardRef<KnowledgeConfigModalRef, KnowledgeConfig
|
||||
/>
|
||||
</FormItem>
|
||||
)}
|
||||
{/* 混合检索权重 */}
|
||||
{/* Hybrid retrieval weight */}
|
||||
{values?.retrieve_type === 'hybrid' && (
|
||||
<>
|
||||
<FormItem
|
||||
|
||||
@@ -1,3 +1,14 @@
|
||||
/*
|
||||
* @Author: ZhaoYing
|
||||
* @Date: 2026-02-03 16:25:42
|
||||
* @Last Modified by: ZhaoYing
|
||||
* @Last Modified time: 2026-02-03 16:25:42
|
||||
*/
|
||||
/**
|
||||
* Knowledge Global Configuration Modal
|
||||
* Configures global reranker settings for all knowledge bases
|
||||
*/
|
||||
|
||||
import { forwardRef, useImperativeHandle, useState, useEffect } from 'react';
|
||||
import { Form, InputNumber, Switch } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
@@ -9,11 +20,19 @@ import { getModelListUrl } from '@/api/models'
|
||||
|
||||
const FormItem = Form.Item;
|
||||
|
||||
/**
|
||||
* Component props
|
||||
*/
|
||||
interface KnowledgeGlobalConfigModalProps {
|
||||
/** Current reranker configuration */
|
||||
data: RerankerConfig;
|
||||
/** Callback to update reranker configuration */
|
||||
refresh: (values: RerankerConfig, type: 'rerankerConfig') => void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Modal for configuring global reranker settings
|
||||
*/
|
||||
const KnowledgeGlobalConfigModal = forwardRef<KnowledgeGlobalConfigModalRef, KnowledgeGlobalConfigModalProps>(({
|
||||
refresh,
|
||||
data,
|
||||
@@ -23,17 +42,18 @@ const KnowledgeGlobalConfigModal = forwardRef<KnowledgeGlobalConfigModalRef, Kno
|
||||
const [form] = Form.useForm<RerankerConfig>();
|
||||
const values = Form.useWatch<RerankerConfig>([], form);
|
||||
|
||||
// 封装取消方法,添加关闭弹窗逻辑
|
||||
/** Close modal and reset form */
|
||||
const handleClose = () => {
|
||||
setVisible(false);
|
||||
form.resetFields();
|
||||
};
|
||||
|
||||
/** Open modal with current configuration */
|
||||
const handleOpen = () => {
|
||||
form.setFieldsValue({ ...data, rerank_model: !!data?.reranker_id })
|
||||
setVisible(true);
|
||||
};
|
||||
// 封装保存方法,添加提交逻辑
|
||||
/** Save reranker configuration */
|
||||
const handleSave = () => {
|
||||
form
|
||||
.validateFields()
|
||||
@@ -54,7 +74,7 @@ const KnowledgeGlobalConfigModal = forwardRef<KnowledgeGlobalConfigModalRef, Kno
|
||||
}
|
||||
}, [values?.rerank_model])
|
||||
|
||||
// 暴露给父组件的方法
|
||||
/** Expose methods to parent component */
|
||||
useImperativeHandle(ref, () => ({
|
||||
handleOpen,
|
||||
}));
|
||||
@@ -73,7 +93,7 @@ const KnowledgeGlobalConfigModal = forwardRef<KnowledgeGlobalConfigModalRef, Kno
|
||||
>
|
||||
<div className="rb:text-[#5B6167] rb:mb-6">{t('application.globalConfigDesc')}</div>
|
||||
|
||||
{/* 结果重排 */}
|
||||
{/* Result reranking */}
|
||||
<div className="rb:flex rb:items-center rb:justify-between rb:my-6">
|
||||
<div className="rb:text-[14px] rb:font-medium rb:leading-5">
|
||||
{t('application.rerankModel')}
|
||||
|
||||
@@ -1,7 +1,19 @@
|
||||
/*
|
||||
* @Author: ZhaoYing
|
||||
* @Date: 2026-02-03 16:25:49
|
||||
* @Last Modified by: ZhaoYing
|
||||
* @Last Modified time: 2026-02-03 16:25:49
|
||||
*/
|
||||
/**
|
||||
* Knowledge List Modal
|
||||
* Displays and allows selection of knowledge bases to associate with the application
|
||||
*/
|
||||
|
||||
import { forwardRef, useEffect, useImperativeHandle, useState } from 'react';
|
||||
import { Space, List } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import clsx from 'clsx'
|
||||
|
||||
import type { KnowledgeModalRef, KnowledgeBase } from './types'
|
||||
import type { KnowledgeBaseListItem } from '@/views/KnowledgeBase/types'
|
||||
import RbModal from '@/components/RbModal'
|
||||
@@ -9,11 +21,19 @@ import { getKnowledgeBaseList } from '@/api/knowledgeBase'
|
||||
import SearchInput from '@/components/SearchInput'
|
||||
import Empty from '@/components/Empty'
|
||||
import { formatDateTime } from '@/utils/format';
|
||||
/**
|
||||
* Component props
|
||||
*/
|
||||
interface KnowledgeModalProps {
|
||||
/** Callback to add selected knowledge bases */
|
||||
refresh: (rows: KnowledgeBase[], type: 'knowledge') => void;
|
||||
/** Currently selected knowledge bases */
|
||||
selectedList: KnowledgeBase[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Modal for selecting knowledge bases
|
||||
*/
|
||||
const KnowledgeListModal = forwardRef<KnowledgeModalRef, KnowledgeModalProps>(({
|
||||
refresh,
|
||||
selectedList
|
||||
@@ -26,7 +46,7 @@ const KnowledgeListModal = forwardRef<KnowledgeModalRef, KnowledgeModalProps>(({
|
||||
const [selectedIds, setSelectedIds] = useState<string[]>([])
|
||||
const [selectedRows, setSelectedRows] = useState<KnowledgeBase[]>([])
|
||||
|
||||
// 封装取消方法,添加关闭弹窗逻辑
|
||||
/** Close modal and reset state */
|
||||
const handleClose = () => {
|
||||
setVisible(false);
|
||||
setQuery({})
|
||||
@@ -34,6 +54,7 @@ const KnowledgeListModal = forwardRef<KnowledgeModalRef, KnowledgeModalProps>(({
|
||||
setSelectedRows([])
|
||||
};
|
||||
|
||||
/** Open modal */
|
||||
const handleOpen = () => {
|
||||
setVisible(true);
|
||||
setQuery({})
|
||||
@@ -46,6 +67,7 @@ const KnowledgeListModal = forwardRef<KnowledgeModalRef, KnowledgeModalProps>(({
|
||||
getList()
|
||||
}
|
||||
}, [query.keywords, visible])
|
||||
/** Fetch knowledge base list */
|
||||
const getList = () => {
|
||||
getKnowledgeBaseList(undefined, {
|
||||
...query,
|
||||
@@ -58,7 +80,7 @@ const KnowledgeListModal = forwardRef<KnowledgeModalRef, KnowledgeModalProps>(({
|
||||
setList(response.items || [])
|
||||
})
|
||||
}
|
||||
// 封装保存方法,添加提交逻辑
|
||||
/** Save selected knowledge bases */
|
||||
const handleSave = () => {
|
||||
refresh(selectedRows.map(item => ({
|
||||
...item,
|
||||
@@ -72,16 +94,18 @@ const KnowledgeListModal = forwardRef<KnowledgeModalRef, KnowledgeModalProps>(({
|
||||
setVisible(false);
|
||||
}
|
||||
|
||||
// 暴露给父组件的方法
|
||||
/** Expose methods to parent component */
|
||||
useImperativeHandle(ref, () => ({
|
||||
handleOpen,
|
||||
handleClose
|
||||
}));
|
||||
/** Search knowledge bases */
|
||||
const handleSearch = (value?: string) => {
|
||||
setQuery({keywords: value})
|
||||
setSelectedIds([])
|
||||
setSelectedRows([])
|
||||
}
|
||||
/** Toggle knowledge base selection */
|
||||
const handleSelect = (item: KnowledgeBase) => {
|
||||
const index = selectedIds.indexOf(item.id)
|
||||
if (index === -1) {
|
||||
|
||||
@@ -1,30 +1,87 @@
|
||||
/*
|
||||
* @Author: ZhaoYing
|
||||
* @Date: 2026-02-03 16:25:53
|
||||
* @Last Modified by: ZhaoYing
|
||||
* @Last Modified time: 2026-02-03 16:25:53
|
||||
*/
|
||||
/**
|
||||
* Type definitions for knowledge base configuration in application settings
|
||||
*/
|
||||
|
||||
import type { KnowledgeBaseListItem } from '@/views/KnowledgeBase/types'
|
||||
|
||||
/**
|
||||
* Reranker configuration for knowledge retrieval
|
||||
*/
|
||||
export interface RerankerConfig {
|
||||
/** Whether to enable rerank model */
|
||||
rerank_model?: boolean | undefined;
|
||||
/** Reranker model ID */
|
||||
reranker_id?: string | undefined;
|
||||
/** Top K results for reranking */
|
||||
reranker_top_k?: number | undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Knowledge retrieval type
|
||||
* - participle: Word segmentation based retrieval
|
||||
* - semantic: Semantic similarity based retrieval
|
||||
* - hybrid: Combination of both methods
|
||||
*/
|
||||
export type RetrieveType = 'participle' | 'semantic' | 'hybrid'
|
||||
|
||||
/**
|
||||
* Knowledge base configuration form data
|
||||
*/
|
||||
export interface KnowledgeConfigForm {
|
||||
/** Knowledge base ID */
|
||||
kb_id?: string;
|
||||
/** Similarity threshold for retrieval (0-1) */
|
||||
similarity_threshold?: number;
|
||||
/** Weight for vector similarity in hybrid mode (0-1) */
|
||||
vector_similarity_weight?: number;
|
||||
/** Number of top results to retrieve */
|
||||
top_k?: number;
|
||||
/** Retrieval strategy type */
|
||||
retrieve_type?: RetrieveType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Knowledge base with configuration
|
||||
*/
|
||||
export interface KnowledgeBase extends KnowledgeBaseListItem, KnowledgeConfigForm {
|
||||
/** Additional configuration object */
|
||||
config?: KnowledgeConfigForm
|
||||
}
|
||||
|
||||
/**
|
||||
* Complete knowledge configuration including reranker settings
|
||||
*/
|
||||
export interface KnowledgeConfig extends RerankerConfig {
|
||||
/** List of configured knowledge bases */
|
||||
knowledge_bases: KnowledgeBase[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Modal ref for individual knowledge base configuration
|
||||
*/
|
||||
export interface KnowledgeConfigModalRef {
|
||||
/** Open modal with knowledge base data */
|
||||
handleOpen: (data: KnowledgeBase) => void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Modal ref for global knowledge configuration
|
||||
*/
|
||||
export interface KnowledgeGlobalConfigModalRef {
|
||||
/** Open global configuration modal */
|
||||
handleOpen: () => void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Modal ref for knowledge base selection
|
||||
*/
|
||||
export interface KnowledgeModalRef {
|
||||
/** Open modal with optional existing configuration */
|
||||
handleOpen: (config?: KnowledgeConfig[]) => void;
|
||||
}
|
||||
Reference in New Issue
Block a user