From 32600650d3272515a1d0b34074bdeeb7eeedb2f6 Mon Sep 17 00:00:00 2001 From: wangzongming Date: Tue, 4 Jun 2024 11:09:31 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9F=A5=E8=AF=86=E5=BA=93=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5=EF=BC=9A=E7=9F=A5=E8=AF=86=E5=BA=93=E6=89=80?= =?UTF-8?q?=E6=9C=89=E6=8E=A5=E5=8F=A3=E5=AF=B9=E6=8E=A5=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BC=96=E5=86=99=E5=AE=8C=E6=AF=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/api/knowledge/reAddVectorDB/route.ts | 2 +- .../src/app/api/knowledge/update/route.ts | 15 +++ .../(desktop)/features/KnowledgeCard.tsx | 18 ++- .../src/app/knowledge/(desktop)/index.tsx | 3 +- .../[id]/base/features/ModalAddFile.tsx | 116 ++++++++++-------- frontend/src/app/knowledge/[id]/base/page.tsx | 30 +++-- .../src/app/knowledge/[id]/config/page.tsx | 88 +++++++------ frontend/src/app/knowledge/[id]/layout.tsx | 19 ++- frontend/src/services/_url.ts | 2 + frontend/src/services/knowledge.ts | 69 +++++++---- frontend/src/store/knowledge/action.ts | 42 +++++-- frontend/src/types/knowledge.ts | 39 ++++-- 12 files changed, 290 insertions(+), 153 deletions(-) create mode 100644 frontend/src/app/api/knowledge/update/route.ts diff --git a/frontend/src/app/api/knowledge/reAddVectorDB/route.ts b/frontend/src/app/api/knowledge/reAddVectorDB/route.ts index cc59e1d5..da805580 100644 --- a/frontend/src/app/api/knowledge/reAddVectorDB/route.ts +++ b/frontend/src/app/api/knowledge/reAddVectorDB/route.ts @@ -3,7 +3,7 @@ import { getServerConfig } from '@/config/server'; const { KNOWLEDGE_PROXY_URL } = getServerConfig(); export const POST = async (request: Request) => { const params = await request.json(); - const fetchRes = await fetch(`${KNOWLEDGE_PROXY_URL}/recreate_vector_store`, { + const fetchRes = await fetch(`${KNOWLEDGE_PROXY_URL}/update_docs`, { body: JSON.stringify(params), headers: { 'Content-Type': 'application/json', diff --git a/frontend/src/app/api/knowledge/update/route.ts b/frontend/src/app/api/knowledge/update/route.ts new file mode 100644 index 00000000..b9c04cf7 --- /dev/null +++ b/frontend/src/app/api/knowledge/update/route.ts @@ -0,0 +1,15 @@ + +import { getServerConfig } from '@/config/server'; +const { KNOWLEDGE_PROXY_URL } = getServerConfig(); + +export const POST = async (request: Request) => { + const params = await request.json(); + const fetchRes = await fetch(`${KNOWLEDGE_PROXY_URL}/update_info`, { + body: JSON.stringify(params), + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + }); + return fetchRes +}; diff --git a/frontend/src/app/knowledge/(desktop)/features/KnowledgeCard.tsx b/frontend/src/app/knowledge/(desktop)/features/KnowledgeCard.tsx index 506dba07..4a7bba15 100644 --- a/frontend/src/app/knowledge/(desktop)/features/KnowledgeCard.tsx +++ b/frontend/src/app/knowledge/(desktop)/features/KnowledgeCard.tsx @@ -2,19 +2,21 @@ import { DeleteOutlined, EditOutlined, ExclamationCircleOutlined } from '@ant-de import { Card, Skeleton, message, Modal } from 'antd'; import { useRouter } from 'next/navigation'; import React, { useState } from 'react'; -import { useKnowledgeStore } from '@/store/knowledge'; +import { useKnowledgeStore } from '@/store/knowledge'; const { Meta } = Card; interface KnowLedgeCardProps { intro: string; name: string; + vector_store_type?: string; + embed_model?: string; } const KnowledgeCard: React.FC = (props: KnowLedgeCardProps) => { - - const [useFetchKnowledgeDel, useFetchKnowledgeList] = useKnowledgeStore((s) => [ - s.useFetchKnowledgeDel, s.useFetchKnowledgeList + + const [useFetchKnowledgeDel, useFetchKnowledgeList, setEditKnowledge] = useKnowledgeStore((s) => [ + s.useFetchKnowledgeDel, s.useFetchKnowledgeList, s.setEditKnowledge ]); const { mutate } = useFetchKnowledgeList() @@ -22,6 +24,12 @@ const KnowledgeCard: React.FC = (props: KnowLedgeCardProps) const { name, intro } = props; const router = useRouter(); const handleCardEditClick = () => { + setEditKnowledge({ + knowledge_base_name: props.name, + kb_info: props.intro, + vector_store_type: props.vector_store_type, + embed_model:props.embed_model, + }); router.push(`/knowledge/${encodeURIComponent(name)}/base`); }; const delClick = async () => { @@ -33,7 +41,7 @@ const KnowledgeCard: React.FC = (props: KnowLedgeCardProps) if (resCode !== 200) { message.error(resMsg) } else { - message.success(resMsg) + message.success(resMsg) mutate() } return Promise.resolve(); diff --git a/frontend/src/app/knowledge/(desktop)/index.tsx b/frontend/src/app/knowledge/(desktop)/index.tsx index bc9357a9..3699fe6e 100644 --- a/frontend/src/app/knowledge/(desktop)/index.tsx +++ b/frontend/src/app/knowledge/(desktop)/index.tsx @@ -17,7 +17,8 @@ const DesktopPage = memo(() => { <> - } onClick={() => setShowModal(true)}> + } onClick={() => setShowModal(true)}> 新建知识库 diff --git a/frontend/src/app/knowledge/[id]/base/features/ModalAddFile.tsx b/frontend/src/app/knowledge/[id]/base/features/ModalAddFile.tsx index 7e03b13d..e1f04ad6 100644 --- a/frontend/src/app/knowledge/[id]/base/features/ModalAddFile.tsx +++ b/frontend/src/app/knowledge/[id]/base/features/ModalAddFile.tsx @@ -1,22 +1,29 @@ -import { InboxOutlined } from '@ant-design/icons'; -import { Form, Modal, Upload, InputNumber, Radio, message } from 'antd'; +import { InboxOutlined } from '@ant-design/icons'; +import { Form, Modal, Upload, InputNumber, Radio, message, Input } from 'antd'; import React, { memo, useState } from 'react'; import { useKnowledgeStore } from '@/store/knowledge'; import type { GetProp, UploadFile, UploadProps } from 'antd'; - +import type { KnowledgeUplodDocsParams } from '@/types/knowledge'; + type ModalAddFileProps = { kbName: string; open: boolean; setModalOpen: (open: boolean) => void; + setSelectedRowKeys: React.Dispatch>; + + selectedRowKeys: string[]; + isRebuildVectorDB?: boolean; + initialValue?: KnowledgeUplodDocsParams; }; - + type FileType = Parameters>[0]; -const ModalAddFile = memo(({ open, setModalOpen, kbName }) => { +const ModalAddFile = memo(({ open, setModalOpen, setSelectedRowKeys, selectedRowKeys, kbName, initialValue, isRebuildVectorDB }) => { const [confirmLoading, setConfirmLoading] = useState(false); const [antdFormInstance] = Form.useForm(); - const [useFetchKnowledgeUploadDocs, useFetchKnowledgeFilesList] = useKnowledgeStore((s) => [ - s.useFetchKnowledgeUploadDocs, s.useFetchKnowledgeFilesList + const [useFetchKnowledgeUploadDocs, useFetchKnowledgeFilesList, useFetcReAddVectorDB] = useKnowledgeStore((s) => [ + s.useFetchKnowledgeUploadDocs, s.useFetchKnowledgeFilesList, + s.useFetcReAddVectorDB ]); const { mutate } = useFetchKnowledgeFilesList(kbName) const [fileList, setFileList] = useState([]); @@ -41,7 +48,23 @@ const ModalAddFile = memo(({ open, setModalOpen, kbName }) => const fieldsError = await antdFormInstance.validateFields(); if (fieldsError.length) return; const values = antdFormInstance.getFieldsValue(true); - if(!fileList.length){ + + if (isRebuildVectorDB) { + // Re-add to vector library + setConfirmLoading(true); + await useFetcReAddVectorDB({ + ...values, + "knowledge_base_name": kbName, + "file_names": selectedRowKeys, + }).catch(() => { + message.error(`更新知识库失败`); + }) + setConfirmLoading(false); + setSelectedRowKeys([]); + return; + } + + if (!fileList.length) { message.error('请选择文件') return; } @@ -50,13 +73,13 @@ const ModalAddFile = memo(({ open, setModalOpen, kbName }) => fileList.forEach((file) => { formData.append('files', file as FileType); }); - for (const key in values) { + for (const key in values) { formData.append(key, values[key]); } - formData.append('knowledge_base_name', kbName); - + formData.append('knowledge_base_name', kbName); + setConfirmLoading(true); - const { code: resCode, data: resData, msg: resMsg } = await useFetchKnowledgeUploadDocs(formData) + const { code: resCode, msg: resMsg } = await useFetchKnowledgeUploadDocs(formData) setConfirmLoading(true); if (resCode !== 200) { @@ -67,7 +90,7 @@ const ModalAddFile = memo(({ open, setModalOpen, kbName }) => mutate(); setModalOpen(false); } - + const layout = { labelCol: { span: 10 }, @@ -77,11 +100,12 @@ const ModalAddFile = memo(({ open, setModalOpen, kbName }) => return ( setModalOpen(false)} - open={open} title="添加文件" + open={open} + title={isRebuildVectorDB ? "重新添加至向量库" : "添加文件"} onOk={onSubmit} confirmLoading={confirmLoading} width={600} - > + >
(({ open, setModalOpen, kbName }) => chunk_size: 0, chunk_overlap: 0, to_vector_store: true, + ...initialValue }} form={antdFormInstance} > - -
- -

- -

-

单击或拖动文件到此区域进行上传

-

支持单个或批量上传。

-
-
- + {!isRebuildVectorDB && <> +
+ +

+ +

+

单击或拖动文件到此区域进行上传

+

支持单个或批量上传。

+
+
+ + + + + + + } + + - - - - - - - - + @@ -130,24 +156,16 @@ const ModalAddFile = memo(({ open, setModalOpen, kbName }) => - - - - - + + - - - - + + + + + - {/* - - - - */} -
); diff --git a/frontend/src/app/knowledge/[id]/base/page.tsx b/frontend/src/app/knowledge/[id]/base/page.tsx index 248509df..18be1d98 100644 --- a/frontend/src/app/knowledge/[id]/base/page.tsx +++ b/frontend/src/app/knowledge/[id]/base/page.tsx @@ -27,14 +27,15 @@ const App: React.FC<{ params: { id: string } }> = ({ params }) => { useFetchKnowledgeFilesList, useFetchKnowledgeDownloadDocs, useFetcDelInknowledgeDB, + useFetcDelInVectorDB, useFetcRebuildVectorDB, useFetchKnowledgeDel - ] = useKnowledgeStore((s) => [ s.filesData, s.useFetchKnowledgeFilesList, s.useFetchKnowledgeDownloadDocs, s.useFetcDelInknowledgeDB, + s.useFetcDelInVectorDB, s.useFetcRebuildVectorDB, s.useFetchKnowledgeDel ]); @@ -42,6 +43,7 @@ const App: React.FC<{ params: { id: string } }> = ({ params }) => { const [downloadLoading, setDownloadLoading] = useState(false); const [delDocsLoading, setDelDocsLoading] = useState(false); + const [delVSLoading, setDelVSLoading] = useState(false); const [rebuildVectorDBLoading, setRebuildVectorDBLoading] = useState(false); // rebuild progress @@ -63,8 +65,8 @@ const App: React.FC<{ params: { id: string } }> = ({ params }) => { const [selectedRowKeys, setSelectedRowKeys] = useState([]); const [loading, setLoading] = useState(false); const [isShowModal, setModal] = useState(false); + const [isRebuildVectorDB, setIsRebuildVectorDB] = useState(false); const onSelectChange = (newSelectedRowKeys: string[]) => { - console.log('selectedRowKeys changed:', newSelectedRowKeys); setSelectedRowKeys(newSelectedRowKeys); }; const columns: TableColumnsType = [ @@ -110,10 +112,10 @@ const App: React.FC<{ params: { id: string } }> = ({ params }) => { setDownloadLoading(false); }; const reAddVectorDB = async () => { - console.log('reAddShapeDB: ', selectedRowKeys); + setIsRebuildVectorDB(true); + setModal(true) } const rebuildVectorDB = async () => { - console.log('rebuildVectorDB '); setRebuildVectorDBLoading(true); try { useFetcRebuildVectorDB({ @@ -140,8 +142,16 @@ const App: React.FC<{ params: { id: string } }> = ({ params }) => { setRebuildVectorDBLoading(false); } const delInVectorDB = async () => { - console.log('delInShapeDB: ', selectedRowKeys); - + setDelVSLoading(true); + await useFetcDelInVectorDB({ + "knowledge_base_name": params.id, + "file_names": [...selectedRowKeys], + "delete_content": false, // 不删除文件 + "not_refresh_vs_cache": false + }).catch(() => { + message.error(`删除失败`); + }) + setDelVSLoading(false); setSelectedRowKeys([]); } const delInknowledgeDB = async () => { @@ -149,7 +159,7 @@ const App: React.FC<{ params: { id: string } }> = ({ params }) => { await useFetcDelInknowledgeDB({ "knowledge_base_name": params.id, "file_names": [...selectedRowKeys], - "delete_content": false, + "delete_content": true, "not_refresh_vs_cache": false }).catch(() => { message.error(`删除失败`); @@ -185,7 +195,7 @@ const App: React.FC<{ params: { id: string } }> = ({ params }) => { - - @@ -218,7 +228,7 @@ const App: React.FC<{ params: { id: string } }> = ({ params }) => { /> - + ); }; diff --git a/frontend/src/app/knowledge/[id]/config/page.tsx b/frontend/src/app/knowledge/[id]/config/page.tsx index ac67ac9e..4e21b7b9 100644 --- a/frontend/src/app/knowledge/[id]/config/page.tsx +++ b/frontend/src/app/knowledge/[id]/config/page.tsx @@ -1,61 +1,79 @@ 'use client'; import { Form, type ItemGroup } from '@lobehub/ui'; -import { Form as AntForm, Button, Input, InputNumber, Switch } from 'antd'; +import { Form as AntForm, Button, Input, InputNumber, Switch, message } from 'antd'; import { Settings } from 'lucide-react'; -import { memo, useCallback } from 'react'; +import { memo, useCallback, useState } from 'react'; import { Flexbox } from 'react-layout-kit'; - +import { useKnowledgeStore } from '@/store/knowledge'; import { FORM_STYLE } from '@/const/layoutTokens'; -const KnowledgeBaseConfig = memo(() => { - const [form] = AntForm.useForm(); +const KnowledgeBaseConfig = memo(({ params }: { params: { id: string } }) => { + const [form] = AntForm.useForm(); + const [submitLoading, setSubmitLoading] = useState(false); + const [ + editKnowledgeInfo, + useFetchKnowledgeUpdate + ] = useKnowledgeStore((s) => [ + s.editKnowledgeInfo, + s.useFetchKnowledgeUpdate + ]); + // console.log("editKnowledgeInfo===", editKnowledgeInfo); const handleConfigChange = useCallback(async () => { try { const values = await form.validateFields(); - console.log('Success:', values); + // console.log('Success:', values); + setSubmitLoading(true); + const { msg, code } = await useFetchKnowledgeUpdate(values); + if (code === 200) { + message.success(msg); + } else { + message.error(msg); + } + setSubmitLoading(false); } catch (errorInfo) { console.log('Failed:', errorInfo); } }, [form]); + const system: ItemGroup = { children: [ { - children: , + children: , label: '知识库名称', - name: 'name', - rules: [{ message: '请输入知识库名称', required: true }], + name: 'knowledge_base_name', + rules: [{ message: '请输入知识库名称', required: true }], }, { children: , label: '知识库简介', - name: 'intro', + name: 'kb_info', rules: [{ message: '请输入知识库简介', required: true }], }, - { - children: , - label: '单段文本最大长度', - name: 'paragraphMaxLength', - rules: [{ message: '请输入知识库名称', required: true }], - }, - { - children: , - label: '相邻文本重合长度', - name: 'paragraphOverlapLength', - rules: [{ message: '请输入知识库名称', required: true }], - }, - { - children: , - label: '文本匹配条数', - name: 'paragraphMatchCount', - rules: [{ message: '请输入知识库名称', required: true }], - }, - { - children: , - label: '开启中文标题加强', - name: 'chineseTitleEnhance', - }, + // { + // children: , + // label: '单段文本最大长度', + // name: 'paragraphMaxLength', + // rules: [{ message: '请输入知识库名称', required: true }], + // }, + // { + // children: , + // label: '相邻文本重合长度', + // name: 'paragraphOverlapLength', + // rules: [{ message: '请输入知识库名称', required: true }], + // }, + // { + // children: , + // label: '文本匹配条数', + // name: 'paragraphMatchCount', + // rules: [{ message: '请输入知识库名称', required: true }], + // }, + // { + // children: , + // label: '开启中文标题加强', + // name: 'chineseTitleEnhance', + // }, ], icon: Settings, title: '知识库设置', @@ -63,9 +81,9 @@ const KnowledgeBaseConfig = memo(() => { return ( <> -
+ - diff --git a/frontend/src/app/knowledge/[id]/layout.tsx b/frontend/src/app/knowledge/[id]/layout.tsx index 9cbb1cd8..9154eb53 100644 --- a/frontend/src/app/knowledge/[id]/layout.tsx +++ b/frontend/src/app/knowledge/[id]/layout.tsx @@ -2,18 +2,23 @@ import { PropsWithChildren, memo } from 'react'; import { Center, Flexbox } from 'react-layout-kit'; - import AppLayoutDesktop from '@/layout/AppLayout.desktop'; import { SidebarTabKey } from '@/store/global/initialState'; - +import { LeftOutlined } from "@ant-design/icons" +import { Button } from "antd" import KnowledgeTabs from './tabs'; +import { useRouter } from 'next/navigation'; interface LayoutProps extends PropsWithChildren { params: Record; } export default memo(({ children, params }) => { - // console.log(params); - + // console.log(params); + const router = useRouter(); + + function goBack(){ + router.push('/knowledge') + } return ( @@ -24,8 +29,10 @@ export default memo(({ children, params }) => { style={{ borderInlineEnd: '1px solid #333333' }} > -
图标占位
-
知识库名称
+
+ +
+ {/*
{params.id}
*/}
diff --git a/frontend/src/services/_url.ts b/frontend/src/services/_url.ts index c6fde4ce..9750104e 100644 --- a/frontend/src/services/_url.ts +++ b/frontend/src/services/_url.ts @@ -48,12 +48,14 @@ export const API_ENDPOINTS = mapWithBasePath({ // knowledge knowledgeList: '/api/knowledge/list', knowledgeAdd: '/api/knowledge/add', + knowledgeUpdate: '/api/knowledge/update', knowledgeDel: '/api/knowledge/del', // knowledge files knowledgeFilesList: '/api/knowledge/listFiles', knowledgeUploadDocs: '/api/knowledge/uploadDocs', knowledgeDownloadDocs: '/api/knowledge/downloadDocs', knowledgeDelInknowledgeDB: '/api/knowledge/deleteDocs', + knowledgeDelVectorDB:'/api/knowledge/delVectorDocs', knowledgeRebuildVectorDB: '/api/knowledge/rebuildVectorDB', knowledgeReAddVectorDB: '/api/knowledge/reAddVectorDB', diff --git a/frontend/src/services/knowledge.ts b/frontend/src/services/knowledge.ts index 80d016e8..030c9b4e 100644 --- a/frontend/src/services/knowledge.ts +++ b/frontend/src/services/knowledge.ts @@ -2,12 +2,14 @@ import type { KnowledgeList, KnowledgeFormFields, Reseponse, KnowledgeFilesList, KnowledgeDelDocsParams, KnowledgeDelDocsRes, - KnowledgeRebuildVectorParams, KnowledgeRebuildVectorRes + KnowledgeRebuildVectorParams, + ReAddVectorDBParams, ReAddVectorDBRes, + KnowledgeUplodDocsParams, KnowledgeUplodDocsRes } from '@/types/knowledge'; import { fetchSSE, FetchSSEOptions } from '@/utils/fetch'; import { API_ENDPOINTS } from './_url'; - + class KnowledgeService { getList = async (): Promise> => { const res = await fetch(`${API_ENDPOINTS.knowledgeList}`); @@ -25,6 +27,16 @@ class KnowledgeService { }); return res.json(); }; + update = async (formValues: Partial) => { + const res = await fetch(`${API_ENDPOINTS.knowledgeUpdate}`, { + body: JSON.stringify(formValues), + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + }); + return res.json(); + }; del = async (name: string) => { const res = await fetch(`${API_ENDPOINTS.knowledgeDel}`, { @@ -69,11 +81,11 @@ class KnowledgeService { return res.json(); }; - rebuildVectorDB = async (params: KnowledgeRebuildVectorParams, opts: - { onFinish: FetchSSEOptions["onFinish"]; onMessageHandle: FetchSSEOptions["onMessageHandle"] } - ) => { + rebuildVectorDB = async (params: KnowledgeRebuildVectorParams, opts: + { onFinish: FetchSSEOptions["onFinish"]; onMessageHandle: FetchSSEOptions["onMessageHandle"] } + ) => { const { onFinish, onMessageHandle } = opts; - fetchSSE(async ()=> await fetch(`${API_ENDPOINTS.knowledgeRebuildVectorDB}`, { + fetchSSE(async () => await fetch(`${API_ENDPOINTS.knowledgeRebuildVectorDB}`, { body: JSON.stringify({ ...params, }), @@ -90,16 +102,18 @@ class KnowledgeService { }) }; - // delVectorDocs = async (formData: FormData): Promise> => { - // // const res = await fetch(`${API_ENDPOINTS.knowledgeUploadDocs}`, { - // // body: formData, - // // // headers: { - // // // 'Content-Type': 'application/json', - // // // }, - // // method: 'POST', - // // }); - // // return res.json(); - // }; + delVectorDocs = async (params: KnowledgeDelDocsParams): Promise> => { + const res = await fetch(`${API_ENDPOINTS.knowledgeDelVectorDB}`, { + body: JSON.stringify({ + ...params, + }), + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + }); + return res.json(); + }; downloadDocs = async (kbName: string, docName: string): Promise> => { const queryString = new URLSearchParams({ @@ -111,19 +125,20 @@ class KnowledgeService { console.log('res', res) const data = await res.json(); return data; + }; + reAddVectorDB = async (params: ReAddVectorDBParams): Promise> => { + const res = await fetch(`${API_ENDPOINTS.knowledgeReAddVectorDB}`, { + body: JSON.stringify({ + ...params, + }), + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + }); + return res.json(); }; - // reAddVectorDB = async (formData: FormData): Promise> => { - // // const res = await fetch(`${API_ENDPOINTS.knowledgeUploadDocs}`, { - // // body: formData, - // // // headers: { - // // // 'Content-Type': 'application/json', - // // // }, - // // method: 'POST', - // // }); - // // return res.json(); - // }; - } diff --git a/frontend/src/store/knowledge/action.ts b/frontend/src/store/knowledge/action.ts index 134ed9ac..e7e7de8b 100644 --- a/frontend/src/store/knowledge/action.ts +++ b/frontend/src/store/knowledge/action.ts @@ -1,24 +1,30 @@ import useSWR, { SWRResponse } from 'swr'; import type { StateCreator } from 'zustand/vanilla'; - import { knowledgeService } from '@/services/knowledge'; - import { globalHelpers } from '@/store/global/helpers'; -import { + +import type { KnowledgeFormFields, KnowledgeList, Reseponse, KnowledgeFilesList, KnowledgeDelDocsParams, KnowledgeDelDocsRes, - KnowledgeRebuildVectorParams, KnowledgeRebuildVectorRes - + KnowledgeRebuildVectorParams, KnowledgeUplodDocsParams, KnowledgeUplodDocsRes, + ReAddVectorDBParams, ReAddVectorDBRes, } from '@/types/knowledge'; import type { FetchSSEOptions } from '@/utils/fetch'; import type { Store } from './store'; export interface StoreAction { + // 知识库数据列表 listData: KnowledgeList; + + // 当前编辑的知识库 + editKnowledgeInfo: null | KnowledgeFormFields; + setEditKnowledge: (data: KnowledgeFormFields) => void; + useFetchKnowledgeList: () => SWRResponse>; useFetchKnowledgeAdd: (arg: KnowledgeFormFields) => Promise>; + useFetchKnowledgeUpdate: (arg: Partial) => Promise>; useFetchKnowledgeDel: (name: string) => Promise>; // files @@ -27,11 +33,12 @@ export interface StoreAction { useFetchKnowledgeUploadDocs: (arg: FormData) => Promise>; useFetchKnowledgeDownloadDocs: (kbName: string, docName: string) => Promise>; useFetcDelInknowledgeDB: (arg: KnowledgeDelDocsParams) => Promise>; - useFetcRebuildVectorDB: (arg: KnowledgeRebuildVectorParams, options: { - onFinish: FetchSSEOptions["onFinish"]; - onMessageHandle: FetchSSEOptions["onMessageHandle"] + useFetcDelInVectorDB: (arg: KnowledgeDelDocsParams) => Promise>; + useFetcRebuildVectorDB: (arg: KnowledgeRebuildVectorParams, options: { + onFinish: FetchSSEOptions["onFinish"]; + onMessageHandle: FetchSSEOptions["onMessageHandle"] }) => void; - + useFetcReAddVectorDB: (arg: ReAddVectorDBParams) => Promise>; } export const createKnowledgeAction: StateCreator< @@ -55,11 +62,12 @@ export const createKnowledgeAction: StateCreator< useFetchKnowledgeAdd: async (formValues) => { return await knowledgeService.add(formValues) }, + useFetchKnowledgeUpdate: async (formValues) => { + return await knowledgeService.update(formValues) + }, useFetchKnowledgeDel: async (name) => { return await knowledgeService.del(name) }, - - filesData: [], useFetchKnowledgeFilesList: (knowledge_base_name) => { return useSWR>( @@ -81,8 +89,20 @@ export const createKnowledgeAction: StateCreator< useFetcDelInknowledgeDB: (params) => { return knowledgeService.delInknowledgeDB(params); }, + useFetcDelInVectorDB: async (name) => { + return await knowledgeService.delVectorDocs(name) + }, useFetcRebuildVectorDB: (params, options) => { return knowledgeService.rebuildVectorDB(params, options); + }, + useFetcReAddVectorDB: (params) => { + return knowledgeService.reAddVectorDB(params); + }, + + + editKnowledgeInfo: null, + setEditKnowledge: (data) => { + set({ editKnowledgeInfo: data }) } }); diff --git a/frontend/src/types/knowledge.ts b/frontend/src/types/knowledge.ts index 1898f612..c0a6980b 100644 --- a/frontend/src/types/knowledge.ts +++ b/frontend/src/types/knowledge.ts @@ -4,9 +4,9 @@ export interface Reseponse { code: number; msg: string; data: T } // create Knowledge fields export interface KnowledgeFormFields { knowledge_base_name: string; - vector_store_type: string; + vector_store_type?: string; kb_info?: string; - embed_model: string; + embed_model?: string; } // Knowledge base list @@ -32,14 +32,37 @@ export interface KnowledgeDelDocsParams { delete_content: boolean; not_refresh_vs_cache: boolean; } -export interface KnowledgeDelDocsRes { - knowledge_base_name: string; - file_names: string[]; - delete_content: boolean; - not_refresh_vs_cache: boolean; -} +export interface KnowledgeDelDocsRes {} +// upload docs +export interface KnowledgeUplodDocsParams { + knowledge_base_name: string; + files: File[]; + override?: boolean; + to_vector_store?: string; + chunk_size?: string; + chunk_overlap?: string; + zh_title_enhance?: string; + docs?: string; + docsnot_refresh_vs_cache?: string; +} +export interface KnowledgeUplodDocsRes { } + + +// re add docs +export interface ReAddVectorDBParams { + "knowledge_base_name": string, + "file_names":string[]; + "chunk_size": number; + "chunk_overlap": number; + "zh_title_enhance": boolean; + "override_custom_docs": boolean; + "docs": string; + "not_refresh_vs_cache": boolean +} +export interface ReAddVectorDBRes { } + // Rebuild the vector library export interface KnowledgeRebuildVectorParams {