From f3d0ebd29318cc33458295b9b52b024436ae6899 Mon Sep 17 00:00:00 2001 From: balibabu Date: Sun, 18 Feb 2024 18:18:20 +0800 Subject: [PATCH] feat: remove KnowledgeSearching and add knowledge configuration page and add a run button to the document (#64) * feat: add a run button to the document * feat: add knowledge configuration page * feat: remove KnowledgeSearching --- web/src/assets/svg/refresh.svg | 5 + web/src/assets/svg/run.svg | 15 + web/src/constants/knowledge.ts | 11 +- web/src/hooks/knowledgeHook.ts | 51 +++- web/src/interfaces/database/llm.ts | 16 + .../components/knowledge-chunk/index.less | 1 + .../knowledge-upload-file/index.tsx | 38 +-- .../components/knowledge-file/index.tsx | 44 +-- .../components/knowledge-file/model.ts | 58 ++-- .../parsing-status-cell/index.less | 9 + .../parsing-status-cell/index.tsx | 63 +++- .../components/knowledge-search/index.less | 79 ----- .../components/knowledge-search/index.tsx | 276 ------------------ .../components/knowledge-search/model.ts | 160 ---------- .../knowledge-setting/configuration.tsx | 217 ++++++++++++++ .../components/knowledge-setting/index.less | 42 +-- .../components/knowledge-setting/index.tsx | 12 +- .../components/knowledge-setting/model.ts | 22 +- .../components/knowledge-sidebar/index.tsx | 24 +- web/src/pages/setting/model.ts | 7 +- web/src/routes.ts | 4 - web/src/utils/fileUtil.ts | 28 ++ 22 files changed, 495 insertions(+), 687 deletions(-) create mode 100644 web/src/assets/svg/refresh.svg create mode 100644 web/src/assets/svg/run.svg create mode 100644 web/src/interfaces/database/llm.ts delete mode 100644 web/src/pages/add-knowledge/components/knowledge-search/index.less delete mode 100644 web/src/pages/add-knowledge/components/knowledge-search/index.tsx delete mode 100644 web/src/pages/add-knowledge/components/knowledge-search/model.ts create mode 100644 web/src/pages/add-knowledge/components/knowledge-setting/configuration.tsx create mode 100644 web/src/utils/fileUtil.ts diff --git a/web/src/assets/svg/refresh.svg b/web/src/assets/svg/refresh.svg new file mode 100644 index 000000000..0b5757161 --- /dev/null +++ b/web/src/assets/svg/refresh.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/web/src/assets/svg/run.svg b/web/src/assets/svg/run.svg new file mode 100644 index 000000000..e33c897cc --- /dev/null +++ b/web/src/assets/svg/run.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/constants/knowledge.ts b/web/src/constants/knowledge.ts index 043c445e2..06870f31a 100644 --- a/web/src/constants/knowledge.ts +++ b/web/src/constants/knowledge.ts @@ -2,13 +2,12 @@ export enum KnowledgeRouteKey { Dataset = 'dataset', Testing = 'testing', Configuration = 'configuration', - TempTesting = 'tempTesting', } export enum RunningStatus { - UNSTART = '0', - RUNNING = '1', - CANCEL = '2', - DONE = '3', - FAIL = '4', + UNSTART = '0', // need to run + RUNNING = '1', // need to cancel + CANCEL = '2', // need to refresh + DONE = '3', // need to refresh + FAIL = '4', // need to refresh } diff --git a/web/src/hooks/knowledgeHook.ts b/web/src/hooks/knowledgeHook.ts index 9e023a9cf..c9a4b7316 100644 --- a/web/src/hooks/knowledgeHook.ts +++ b/web/src/hooks/knowledgeHook.ts @@ -1,6 +1,6 @@ import showDeleteConfirm from '@/components/deleting-confirm'; -import { IKnowledge } from '@/interfaces/database/knowledge'; -import { useCallback } from 'react'; +import { IKnowledge, ITenantInfo } from '@/interfaces/database/knowledge'; +import { useCallback, useEffect, useMemo } from 'react'; import { useDispatch, useSearchParams, useSelector } from 'umi'; export const useKnowledgeBaseId = (): string => { @@ -77,3 +77,50 @@ export const useDeleteChunkByIds = (): { removeChunk: onRemoveChunk, }; }; + +export const useSelectParserList = (): Array<{ + value: string; + label: string; +}> => { + const tenantIfo: Nullable = useSelector( + (state: any) => state.settingModel.tenantIfo, + ); + + const parserList = useMemo(() => { + const parserArray: Array = tenantIfo?.parser_ids.split(',') ?? []; + return parserArray.map((x) => { + const arr = x.split(':'); + return { value: arr[0], label: arr[1] }; + }); + }, [tenantIfo]); + + return parserList; +}; + +export const useFetchParserList = () => { + const dispatch = useDispatch(); + + useEffect(() => { + dispatch({ + type: 'settingModel/getTenantInfo', + }); + }, [dispatch]); +}; + +export const useFetchKnowledgeBaseConfiguration = () => { + const dispatch = useDispatch(); + const knowledgeBaseId = useKnowledgeBaseId(); + + const fetchKnowledgeBaseConfiguration = useCallback(() => { + dispatch({ + type: 'kSModel/getKbDetail', + payload: { + kb_id: knowledgeBaseId, + }, + }); + }, [dispatch, knowledgeBaseId]); + + useEffect(() => { + fetchKnowledgeBaseConfiguration(); + }, [fetchKnowledgeBaseConfiguration]); +}; diff --git a/web/src/interfaces/database/llm.ts b/web/src/interfaces/database/llm.ts new file mode 100644 index 000000000..6e8c7a919 --- /dev/null +++ b/web/src/interfaces/database/llm.ts @@ -0,0 +1,16 @@ +export interface IThirdOAIModel { + available: boolean; + create_date: string; + create_time: number; + fid: string; + id: number; + llm_name: string; + max_tokens: number; + model_type: string; + status: string; + tags: string; + update_date: string; + update_time: number; +} + +export type IThirdOAIModelCollection = Record; diff --git a/web/src/pages/add-knowledge/components/knowledge-chunk/index.less b/web/src/pages/add-knowledge/components/knowledge-chunk/index.less index a798eb9e2..4eb426b08 100644 --- a/web/src/pages/add-knowledge/components/knowledge-chunk/index.less +++ b/web/src/pages/add-knowledge/components/knowledge-chunk/index.less @@ -26,6 +26,7 @@ .chunkContainer { height: calc(100vh - 320px); overflow: auto; + width: 100%; } .pageFooter { diff --git a/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.tsx b/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.tsx index db475e22d..b836ece32 100644 --- a/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.tsx +++ b/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.tsx @@ -2,10 +2,11 @@ import { ReactComponent as SelectFilesEndIcon } from '@/assets/svg/select-files- import { ReactComponent as SelectFilesStartIcon } from '@/assets/svg/select-files-start.svg'; import { useDeleteDocumentById, + useFetchParserList, useGetDocumentDefaultParser, useKnowledgeBaseId, + useSelectParserList, } from '@/hooks/knowledgeHook'; -import { ITenantInfo } from '@/interfaces/database/knowledge'; import uploadService from '@/services/uploadService'; import { ArrowLeftOutlined, @@ -28,9 +29,8 @@ import { UploadProps, } from 'antd'; import classNames from 'classnames'; -import { ReactElement, useEffect, useMemo, useRef, useState } from 'react'; -import { Nullable } from 'typings'; -import { Link, useDispatch, useNavigate, useSelector } from 'umi'; +import { ReactElement, useEffect, useRef, useState } from 'react'; +import { Link, useDispatch, useNavigate } from 'umi'; import { KnowledgeRouteKey } from '@/constants/knowledge'; import styles from './index.less'; @@ -45,13 +45,11 @@ const UploaderItem = ({ file, actions, isUpload, - parserArray, }: { isUpload: boolean; originNode: ReactElement; file: UploadFile; fileList: object[]; - parserArray: string[]; actions: { download: Function; preview: Function; remove: any }; }) => { const { parserConfig, defaultParserId } = useGetDocumentDefaultParser( @@ -63,12 +61,7 @@ const UploaderItem = ({ const documentId = file?.response?.id; - const parserList = useMemo(() => { - return parserArray.map((x) => { - const arr = x.split(':'); - return { value: arr[0], label: arr[1] }; - }); - }, [parserArray]); + const parserList = useSelectParserList(); const saveParser = (parserId: string) => { dispatch({ @@ -154,14 +147,10 @@ const KnowledgeUploadFile = () => { const knowledgeBaseId = useKnowledgeBaseId(); const [isUpload, setIsUpload] = useState(true); const dispatch = useDispatch(); - const tenantIfo: Nullable = useSelector( - (state: any) => state.settingModel.tenantIfo, - ); + const navigate = useNavigate(); const fileListRef = useRef([]); - const parserArray = tenantIfo?.parser_ids.split(',') ?? []; - const createRequest: (props: UploadRequestOption) => void = async function ({ file, onSuccess, @@ -170,9 +159,13 @@ const KnowledgeUploadFile = () => { }) { const { data } = await uploadService.uploadFile(file, knowledgeBaseId); if (data.retcode === 0) { - onSuccess && onSuccess(data.data); + if (onSuccess) { + onSuccess(data.data); + } } else { - onError && onError(data.data); + if (onError) { + onError(data.data); + } } }; @@ -188,7 +181,6 @@ const KnowledgeUploadFile = () => { fileList={fileList} originNode={originNode} actions={actions} - parserArray={parserArray} > ); }, @@ -215,11 +207,7 @@ const KnowledgeUploadFile = () => { } }; - useEffect(() => { - dispatch({ - type: 'settingModel/getTenantInfo', - }); - }, []); + useFetchParserList(); return (
diff --git a/web/src/pages/add-knowledge/components/knowledge-file/index.tsx b/web/src/pages/add-knowledge/components/knowledge-file/index.tsx index 6d8c78452..a61d8fc54 100644 --- a/web/src/pages/add-knowledge/components/knowledge-file/index.tsx +++ b/web/src/pages/add-knowledge/components/knowledge-file/index.tsx @@ -1,8 +1,5 @@ import { KnowledgeRouteKey } from '@/constants/knowledge'; -import { - useDeleteDocumentById, - useKnowledgeBaseId, -} from '@/hooks/knowledgeHook'; +import { useKnowledgeBaseId } from '@/hooks/knowledgeHook'; import { Pagination } from '@/interfaces/common'; import { IKnowledgeFile } from '@/interfaces/database/knowledge'; import { getOneNamespaceEffectsLoading } from '@/utils/storeUtil'; @@ -40,7 +37,6 @@ const KnowledgeFile = () => { const effects = useSelector((state: any) => state.loading.effects); const { data, total } = kFModel; const knowledgeBaseId = useKnowledgeBaseId(); - const { removeDocument } = useDeleteDocumentById(); const loading = getOneNamespaceEffectsLoading('kFModel', effects, [ 'getKfList', @@ -132,9 +128,7 @@ const KnowledgeFile = () => { }, }); }; - const onRmDocument = () => { - removeDocument(doc_id); - }; + const showCEFModal = () => { dispatch({ type: 'kFModel/updateState', @@ -144,15 +138,6 @@ const KnowledgeFile = () => { }); }; - const showSegmentSetModal = () => { - dispatch({ - type: 'kFModel/updateState', - payload: { - isShowSegmentSetModal: true, - }, - }); - }; - const actionItems: MenuProps['items'] = useMemo(() => { return [ { @@ -185,31 +170,6 @@ const KnowledgeFile = () => { }, ]; }, []); - const chunkItems: MenuProps['items'] = [ - { - key: '1', - label: ( -
- -
- ), - }, - { - key: '2', - label: ( -
- -
- ), - // disabled: true, - }, - ]; const toChunk = (id: string) => { navigate( diff --git a/web/src/pages/add-knowledge/components/knowledge-file/model.ts b/web/src/pages/add-knowledge/components/knowledge-file/model.ts index 1b673355e..ac7f0e38c 100644 --- a/web/src/pages/add-knowledge/components/knowledge-file/model.ts +++ b/web/src/pages/add-knowledge/components/knowledge-file/model.ts @@ -55,33 +55,23 @@ const model: DvaModel = { return { ...state, pagination: { ...state.pagination, ...payload } }; }, }, - subscriptions: { - setup({ dispatch, history }) { - history.listen((location) => {}); - }, - }, effects: { - *createKf({ payload = {} }, { call, put }) { - const { data, response } = yield call(kbService.createKb, payload); - const { retcode, data: res, retmsg } = data; + *createKf({ payload = {} }, { call }) { + const { data } = yield call(kbService.createKb, payload); + const { retcode } = data; if (retcode === 0) { message.success('创建成功!'); } }, - *updateKf({ payload = {} }, { call, put }) { - const { data, response } = yield call(kbService.updateKb, payload); - const { retcode, data: res, retmsg } = data; + *updateKf({ payload = {} }, { call }) { + const { data } = yield call(kbService.updateKb, payload); + const { retcode } = data; if (retcode === 0) { message.success('修改成功!'); } }, - *getKfDetail({ payload = {}, callback }, { call, put }) { - const { data, response } = yield call(kbService.get_kb_detail, payload); - const { retcode, data: res, retmsg } = data; - if (retcode === 0) { - // localStorage.setItem('userInfo',res.) - callback && callback(res); - } + *getKfDetail({ payload = {} }, { call }) { + const { data } = yield call(kbService.get_kb_detail, payload); }, *getKfList({ payload = {} }, { call, put, select }) { const state: KFModelState = yield select((state: any) => state.kFModel); @@ -119,11 +109,11 @@ const model: DvaModel = { { type: 'poll', delay: 5000 }, // TODO: Provide type support for this effect ], *updateDocumentStatus({ payload = {} }, { call, put }) { - const { data, response } = yield call( + const { data } = yield call( kbService.document_change_status, pick(payload, ['doc_id', 'status']), ); - const { retcode, data: res, retmsg } = data; + const { retcode } = data; if (retcode === 0) { message.success('修改成功!'); put({ @@ -133,10 +123,10 @@ const model: DvaModel = { } }, *document_rm({ payload = {} }, { call, put }) { - const { data, response } = yield call(kbService.document_rm, { + const { data } = yield call(kbService.document_rm, { doc_id: payload.doc_id, }); - const { retcode, data: res, retmsg } = data; + const { retcode } = data; if (retcode === 0) { message.success('删除成功!'); yield put({ @@ -151,7 +141,7 @@ const model: DvaModel = { kbService.document_rename, omit(payload, ['kb_id']), ); - const { retcode, data: res, retmsg } = data; + const { retcode } = data; if (retcode === 0) { message.success('rename success!'); yield put({ @@ -168,7 +158,7 @@ const model: DvaModel = { }, *document_create({ payload = {} }, { call, put }) { const { data } = yield call(kbService.document_create, payload); - const { retcode, data: res } = data; + const { retcode } = data; if (retcode === 0) { put({ type: 'kFModel/updateState', @@ -181,19 +171,25 @@ const model: DvaModel = { return retcode; }, *document_run({ payload = {} }, { call, put }) { - const { data } = yield call(kbService.document_run, payload); + const { data } = yield call( + kbService.document_run, + omit(payload, ['knowledgeBaseId']), + ); const { retcode } = data; if (retcode === 0) { - message.success('Run successfully !'); + if (payload.knowledgeBaseId) { + yield put({ + type: 'getKfList', + payload: { kb_id: payload.knowledgeBaseId }, + }); + } + message.success('Operation successfully !'); } return retcode; }, *document_change_parser({ payload = {} }, { call, put }) { - const { data, response } = yield call( - kbService.document_change_parser, - payload, - ); - const { retcode, data: res, retmsg } = data; + const { data } = yield call(kbService.document_change_parser, payload); + const { retcode } = data; if (retcode === 0) { put({ type: 'updateState', diff --git a/web/src/pages/add-knowledge/components/knowledge-file/parsing-status-cell/index.less b/web/src/pages/add-knowledge/components/knowledge-file/parsing-status-cell/index.less index b595d95b1..ada0866af 100644 --- a/web/src/pages/add-knowledge/components/knowledge-file/parsing-status-cell/index.less +++ b/web/src/pages/add-knowledge/components/knowledge-file/parsing-status-cell/index.less @@ -1,3 +1,12 @@ .popover-content { width: 300px; } + +.operationIcon { + text-align: center; + margin-right: 20%; + width: 20px; + &:hover { + cursor: pointer; + } +} diff --git a/web/src/pages/add-knowledge/components/knowledge-file/parsing-status-cell/index.tsx b/web/src/pages/add-knowledge/components/knowledge-file/parsing-status-cell/index.tsx index 7c2784ca2..5c0711a45 100644 --- a/web/src/pages/add-knowledge/components/knowledge-file/parsing-status-cell/index.tsx +++ b/web/src/pages/add-knowledge/components/knowledge-file/parsing-status-cell/index.tsx @@ -1,9 +1,21 @@ +import { ReactComponent as RefreshIcon } from '@/assets/svg/refresh.svg'; +import { ReactComponent as RunIcon } from '@/assets/svg/run.svg'; import { IKnowledgeFile } from '@/interfaces/database/knowledge'; import { Badge, DescriptionsProps, Flex, Popover, Space, Tag } from 'antd'; import { RunningStatus, RunningStatusMap } from '../constant'; +import { CloseCircleOutlined } from '@ant-design/icons'; +import { useDispatch } from 'umi'; import styles from './index.less'; +const iconMap = { + [RunningStatus.UNSTART]: RunIcon, + [RunningStatus.RUNNING]: CloseCircleOutlined, + [RunningStatus.CANCEL]: RefreshIcon, + [RunningStatus.DONE]: RefreshIcon, + [RunningStatus.FAIL]: RefreshIcon, +}; + interface IProps { record: IKnowledgeFile; } @@ -31,7 +43,7 @@ const PopoverContent = ({ record }: IProps) => { {items.map((x) => { return ( -
+
{x.label}:

{x.children}

@@ -42,27 +54,46 @@ const PopoverContent = ({ record }: IProps) => { }; export const ParsingStatusCell = ({ record }: IProps) => { + const dispatch = useDispatch(); const text = record.run; const runningStatus = RunningStatusMap[text]; const isRunning = text === RunningStatus.RUNNING; + const OperationIcon = iconMap[text]; + + const handleOperationIconClick = () => { + dispatch({ + type: 'kFModel/document_run', + payload: { + doc_ids: [record.id], + run: isRunning ? 2 : 1, + knowledgeBaseId: record.kb_id, + }, + }); + }; + return ( - } - > - - {isRunning ? ( - - - {runningStatus.label} - {record.progress * 100}% - - ) : ( - runningStatus.label - )} - - + + } + > + + {isRunning ? ( + + + {runningStatus.label} + {(record.progress * 100).toFixed(2)}% + + ) : ( + runningStatus.label + )} + + +
+ +
+
); }; diff --git a/web/src/pages/add-knowledge/components/knowledge-search/index.less b/web/src/pages/add-knowledge/components/knowledge-search/index.less deleted file mode 100644 index 4f51079ac..000000000 --- a/web/src/pages/add-knowledge/components/knowledge-search/index.less +++ /dev/null @@ -1,79 +0,0 @@ -.chunkPage { - padding: 24px; - display: flex; - height: calc(100vh - 112px); - // flex-direction: column; - - .filter { - margin-right: 20px; - display: flex; - height: 32px; - width: 300px; - flex-wrap: wrap; - justify-content: space-between; - } - - .pageContainer { - flex: 1; - display: flex; - flex-direction: column; - - .pageContent { - flex: 1; - width: 100%; - padding-right: 12px; - overflow-y: auto; - - .spin { - min-height: 400px; - } - } - - .pageFooter { - height: 32px; - float: right; - } - } - -} - -.container { - height: 100px; - display: flex; - flex-direction: column; - justify-content: space-between; - - .content { - display: flex; - justify-content: space-between; - - .context { - flex: 1; - // width: 207px; - height: 88px; - overflow: hidden; - } - } - - .footer { - height: 20px; - - .text { - margin-left: 10px; - } - } -} - -.card { - :global { - .ant-card-body { - padding: 10px; - margin: 0; - } - - margin-bottom: 10px; - } - - cursor: pointer; - -} \ No newline at end of file diff --git a/web/src/pages/add-knowledge/components/knowledge-search/index.tsx b/web/src/pages/add-knowledge/components/knowledge-search/index.tsx deleted file mode 100644 index 6c17135ce..000000000 --- a/web/src/pages/add-knowledge/components/knowledge-search/index.tsx +++ /dev/null @@ -1,276 +0,0 @@ -import { useKnowledgeBaseId } from '@/hooks/knowledgeHook'; -import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks'; -import { api_host } from '@/utils/api'; -import { DeleteOutlined, MinusSquareOutlined } from '@ant-design/icons'; -import type { PaginationProps } from 'antd'; -import { - Card, - Col, - Input, - Pagination, - Popconfirm, - Row, - Select, - Spin, - Switch, -} from 'antd'; -import { debounce } from 'lodash'; -import React, { useCallback, useEffect } from 'react'; -import { useDispatch, useSelector } from 'umi'; -import CreateModal from '../knowledge-chunk/components/chunk-creating-modal'; - -import styles from './index.less'; - -const KnowledgeSearching = () => { - const dispatch = useDispatch(); - const kSearchModel = useSelector((state: any) => state.kSearchModel); - const chunkModel = useSelector((state: any) => state.chunkModel); - const loading = useOneNamespaceEffectsLoading('kSearchModel', [ - 'chunk_list', - 'switch_chunk', - ]); - const knowledgeBaseId = useKnowledgeBaseId(); - - const { - data = [], - total, - d_list = [], - question, - doc_ids, - pagination, - } = kSearchModel; - const { chunk_id, doc_id, isShowCreateModal } = chunkModel; - - const getChunkList = () => { - dispatch({ - type: 'kSearchModel/chunk_list', - payload: { - kb_id: knowledgeBaseId, - }, - }); - }; - const confirm = (id: string) => { - dispatch({ - type: 'kSearchModel/rm_chunk', - payload: { - chunk_ids: [id], - kb_id: knowledgeBaseId, - }, - }); - }; - const handleEditchunk = (item: any) => { - const { chunk_id, doc_id } = item; - dispatch({ - type: 'chunkModel/updateState', - payload: { - isShowCreateModal: true, - chunk_id, - doc_id, - }, - }); - getChunkList(); - }; - const onShowSizeChange: PaginationProps['onShowSizeChange'] = ( - page, - size, - ) => { - dispatch({ - type: 'kSearchModel/updateState', - payload: { - pagination: { page, size }, - }, - }); - }; - useEffect(() => { - dispatch({ - type: 'kSearchModel/updateState', - payload: { - doc_ids: [], - question: '', - }, - }); - dispatch({ - type: 'kSearchModel/getKfList', - payload: { - kb_id: knowledgeBaseId, - }, - }); - }, []); - const switchChunk = (item: any, available_int: boolean) => { - const { chunk_id, doc_id } = item; - - dispatch({ - type: 'kSearchModel/switch_chunk', - payload: { - chunk_ids: [chunk_id], - doc_id, - available_int, - kb_id: knowledgeBaseId, - }, - }); - }; - - useEffect(() => { - getChunkList(); - }, [doc_ids, pagination, question]); - const debounceChange = debounce((value) => { - dispatch({ - type: 'kSearchModel/updateState', - payload: { - question: value, - }, - }); - }, 300); - - const debounceCallback = useCallback( - (value: string) => debounceChange(value), - [], - ); - const handleInputChange = ( - e: React.ChangeEvent, - ) => { - const value = e.target.value; - debounceCallback(value); - }; - const handleSelectChange = (value: any[]) => { - dispatch({ - type: 'kSearchModel/updateState', - payload: { - doc_ids: value, - }, - }); - }; - - return ( - <> -
-
- + + + + + + + + + + + + Only me + Team + + + + + + + + + +
+ + + + +
+
+ +
+ ); +}; + +export default Configuration; diff --git a/web/src/pages/add-knowledge/components/knowledge-setting/index.less b/web/src/pages/add-knowledge/components/knowledge-setting/index.less index 1c06588d5..0691fd904 100644 --- a/web/src/pages/add-knowledge/components/knowledge-setting/index.less +++ b/web/src/pages/add-knowledge/components/knowledge-setting/index.less @@ -1,24 +1,30 @@ .tags { - margin-bottom: 24px; + margin-bottom: 24px; } .preset { - display: flex; - height: 80px; - background-color: rgba(0, 0, 0, 0.1); - border-radius: 5px; + display: flex; + height: 80px; + background-color: rgba(0, 0, 0, 0.1); + border-radius: 5px; + padding: 5px; + margin-bottom: 24px; + + .left { + flex: 1; + } + + .right { + width: 100px; + border-left: 1px solid rgba(0, 0, 0, 0.4); + margin: 10px 0px; padding: 5px; - margin-bottom: 24px; + } +} - .left { - flex: 1; - - } - - .right { - width: 100px; - border-left: 1px solid rgba(0, 0, 0, 0.4); - margin: 10px 0px; - padding: 5px; - } -} \ No newline at end of file +.configurationWrapper { + padding: 0 52px; + .buttonWrapper { + text-align: right; + } +} diff --git a/web/src/pages/add-knowledge/components/knowledge-setting/index.tsx b/web/src/pages/add-knowledge/components/knowledge-setting/index.tsx index 1926acb2a..74a0712d8 100644 --- a/web/src/pages/add-knowledge/components/knowledge-setting/index.tsx +++ b/web/src/pages/add-knowledge/components/knowledge-setting/index.tsx @@ -3,6 +3,8 @@ import { useKnowledgeBaseId } from '@/hooks/knowledgeHook'; import { Button, Form, Input, Radio, Select, Space, Tag } from 'antd'; import { useCallback, useEffect, useState } from 'react'; import { useDispatch, useNavigate, useSelector } from 'umi'; +import Configuration from './configuration'; + import styles from './index.less'; const { CheckableTag } = Tag; @@ -12,7 +14,6 @@ const layout = { labelAlign: 'left' as const, }; const { Option } = Select; -/* eslint-disable no-template-curly-in-string */ const KnowledgeSetting = () => { const dispatch = useDispatch(); @@ -44,7 +45,7 @@ const KnowledgeSetting = () => { setSelectedTag(data.data.parser_id); } } - }, [knowledgeBaseId]); + }, [knowledgeBaseId, dispatch, form]); const onFinish = async () => { try { @@ -68,10 +69,11 @@ const KnowledgeSetting = () => { parser_id: selectedTag, }, }); - retcode === 0 && + if (retcode === 0) { navigate( `/knowledge/${KnowledgeRouteKey.Dataset}?id=${knowledgeBaseId}`, ); + } } } catch (error) { console.warn(error); @@ -158,4 +160,6 @@ const KnowledgeSetting = () => { ); }; -export default KnowledgeSetting; +// export default KnowledgeSetting; + +export default Configuration; diff --git a/web/src/pages/add-knowledge/components/knowledge-setting/model.ts b/web/src/pages/add-knowledge/components/knowledge-setting/model.ts index 0cd548827..1f4499631 100644 --- a/web/src/pages/add-knowledge/components/knowledge-setting/model.ts +++ b/web/src/pages/add-knowledge/components/knowledge-setting/model.ts @@ -1,3 +1,4 @@ +import { IKnowledge } from '@/interfaces/database/knowledge'; import kbService from '@/services/kbService'; import { message } from 'antd'; import { DvaModel } from 'umi'; @@ -6,6 +7,7 @@ export interface KSModelState { isShowPSwModal: boolean; isShowTntModal: boolean; tenantIfo: any; + knowledgeDetails: IKnowledge; } const model: DvaModel = { @@ -14,6 +16,7 @@ const model: DvaModel = { isShowPSwModal: false, isShowTntModal: false, tenantIfo: {}, + knowledgeDetails: {} as any, }, reducers: { updateState(state, { payload }) { @@ -22,31 +25,32 @@ const model: DvaModel = { ...payload, }; }, - }, - subscriptions: { - setup({ dispatch, history }) { - history.listen((location) => {}); + setKnowledgeDetails(state, { payload }) { + return { ...state, knowledgeDetails: payload }; }, }, effects: { - *createKb({ payload = {} }, { call, put }) { + *createKb({ payload = {} }, { call }) { const { data } = yield call(kbService.createKb, payload); const { retcode } = data; if (retcode === 0) { - message.success('创建知识库成功!'); + message.success('Created successfully!'); } return data; }, *updateKb({ payload = {} }, { call, put }) { const { data } = yield call(kbService.updateKb, payload); - const { retcode, data: res, retmsg } = data; + const { retcode } = data; if (retcode === 0) { - message.success('更新知识库成功!'); + yield put({ type: 'getKbDetail', payload: { kb_id: payload.kb_id } }); + message.success('Updated successfully!'); } }, *getKbDetail({ payload = {} }, { call, put }) { const { data } = yield call(kbService.get_kb_detail, payload); - + if (data.retcode === 0) { + yield put({ type: 'setKnowledgeDetails', payload: data.data }); + } return data; }, }, diff --git a/web/src/pages/add-knowledge/components/knowledge-sidebar/index.tsx b/web/src/pages/add-knowledge/components/knowledge-sidebar/index.tsx index e24e0bf32..44805fd52 100644 --- a/web/src/pages/add-knowledge/components/knowledge-sidebar/index.tsx +++ b/web/src/pages/add-knowledge/components/knowledge-sidebar/index.tsx @@ -1,9 +1,10 @@ -import { ReactComponent as ConfigrationIcon } from '@/assets/svg/knowledge-configration.svg'; +import { ReactComponent as ConfigurationIcon } from '@/assets/svg/knowledge-configration.svg'; import { ReactComponent as DatasetIcon } from '@/assets/svg/knowledge-dataset.svg'; import { ReactComponent as TestingIcon } from '@/assets/svg/knowledge-testing.svg'; +import { useFetchKnowledgeBaseConfiguration } from '@/hooks/knowledgeHook'; import { useSecondPathName } from '@/hooks/routeHook'; +import { IKnowledge } from '@/interfaces/database/knowledge'; import { getWidth } from '@/utils'; -import { AntDesignOutlined } from '@ant-design/icons'; import { Avatar, Menu, MenuProps, Space } from 'antd'; import classNames from 'classnames'; import { useCallback, useEffect, useMemo, useState } from 'react'; @@ -16,6 +17,9 @@ const KnowledgeSidebar = () => { const { id } = kAModel; let navigate = useNavigate(); const activeKey = useSecondPathName(); + const knowledgeDetails: IKnowledge = useSelector( + (state: any) => state.kSModel.knowledgeDetails, + ); const [windowWidth, setWindowWidth] = useState(getWidth()); const [collapsed, setCollapsed] = useState(false); @@ -62,12 +66,7 @@ const KnowledgeSidebar = () => { getItem( routeMap[KnowledgeRouteKey.Configuration], KnowledgeRouteKey.Configuration, - , - ), - getItem( - routeMap[KnowledgeRouteKey.TempTesting], - KnowledgeRouteKey.TempTesting, - , + , ), ]; }, [getItem]); @@ -93,16 +92,17 @@ const KnowledgeSidebar = () => { }; }, []); + useFetchKnowledgeBaseConfiguration(); + return (
- } /> -
Cloud Computing
+ +
{knowledgeDetails.name}

- A scalable, secure cloud-based database optimized for high-performance - computing and data storage. + {knowledgeDetails.description}

diff --git a/web/src/pages/setting/model.ts b/web/src/pages/setting/model.ts index 4a843e9df..643ed5e71 100644 --- a/web/src/pages/setting/model.ts +++ b/web/src/pages/setting/model.ts @@ -1,4 +1,5 @@ import { ITenantInfo } from '@/interfaces/database/knowledge'; +import { IThirdOAIModelCollection as IThirdAiModelCollection } from '@/interfaces/database/llm'; import userService from '@/services/userService'; import authorizationUtil from '@/utils/authorizationUtil'; import { message } from 'antd'; @@ -12,7 +13,7 @@ export interface SettingModelState { isShowSSModal: boolean; llm_factory: string; tenantIfo: Nullable; - llmInfo: any; + llmInfo: IThirdAiModelCollection; myLlm: any[]; factoriesList: any[]; } @@ -126,8 +127,8 @@ const model: DvaModel = { } }, *llm_list({ payload = {} }, { call, put }) { - const { data, response } = yield call(userService.llm_list, payload); - const { retcode, data: res, retmsg } = data; + const { data } = yield call(userService.llm_list, payload); + const { retcode, data: res } = data; if (retcode === 0) { yield put({ type: 'updateState', diff --git a/web/src/routes.ts b/web/src/routes.ts index c2f8aebcf..aff5178c4 100644 --- a/web/src/routes.ts +++ b/web/src/routes.ts @@ -44,10 +44,6 @@ const routes = [ }, { path: '/knowledge/testing', - component: '@/pages/add-knowledge/components/knowledge-search', - }, - { - path: '/knowledge/tempTesting', component: '@/pages/add-knowledge/components/knowledge-testing', }, ], diff --git a/web/src/utils/fileUtil.ts b/web/src/utils/fileUtil.ts new file mode 100644 index 000000000..ab9cced01 --- /dev/null +++ b/web/src/utils/fileUtil.ts @@ -0,0 +1,28 @@ +export const transformFile2Base64 = (val: any): Promise => { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(val); + reader.onload = (): void => { + resolve(reader.result); + }; + reader.onerror = reject; + }); +}; + +export const transformBase64ToFile = ( + dataUrl: string, + filename: string = 'file', +) => { + let arr = dataUrl.split(','), + bstr = atob(arr[1]), + n = bstr.length, + u8arr = new Uint8Array(n); + + const mime = arr[0].match(/:(.*?);/); + const mimeType = mime ? mime[1] : 'image/png'; + + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + return new File([u8arr], filename, { type: mimeType }); +};