From a84c287963bb5a29b416dcf1d25fff047400f797 Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud Date: Wed, 4 Jun 2025 18:08:52 +0800 Subject: [PATCH] feat: knowledge --- ui/src/api/knowledge/knowledge.ts | 54 +++ ui/src/api/type/knowledge.ts | 4 +- ui/src/assets/knowledge/logo_yuque.svg | 17 + ui/src/components/index.ts | 4 + ui/src/components/infinite-scroll/index.vue | 73 ++++ ui/src/components/model-select/index.vue | 161 +++++++++ ui/src/locales/lang/en-US/components.ts | 3 + ui/src/locales/lang/en-US/views/dataset.ts | 86 ----- ui/src/locales/lang/en-US/views/index.ts | 4 +- ui/src/locales/lang/en-US/views/knowledge.ts | 89 +++++ ui/src/locales/lang/zh-CN/components.ts | 3 + ui/src/locales/lang/zh-CN/views/knowledge.ts | 80 ++++ ui/src/locales/lang/zh-Hant/components.ts | 3 + ui/src/locales/lang/zh-Hant/views/dataset.ts | 83 ----- ui/src/locales/lang/zh-Hant/views/index.ts | 4 +- .../locales/lang/zh-Hant/views/knowledge.ts | 83 +++++ ui/src/stores/index.ts | 2 + ui/src/stores/modules/model.ts | 34 ++ ui/src/styles/element-plus.scss | 13 + ui/src/utils/common.ts | 8 + ui/src/views/knowledge/component/BaseForm.vue | 61 ++-- .../knowledge/component/KnowledgeIcon.vue | 25 ++ .../CreateKnowledgeDialog copy.vue} | 115 +----- .../CreateKnowledgeDialog.vue | 69 ++++ ui/src/views/knowledge/index.vue | 342 ++++++++++++------ ui/src/views/model/index.vue | 12 +- 26 files changed, 990 insertions(+), 442 deletions(-) create mode 100644 ui/src/assets/knowledge/logo_yuque.svg create mode 100644 ui/src/components/infinite-scroll/index.vue create mode 100644 ui/src/components/model-select/index.vue delete mode 100644 ui/src/locales/lang/en-US/views/dataset.ts create mode 100644 ui/src/locales/lang/en-US/views/knowledge.ts delete mode 100644 ui/src/locales/lang/zh-Hant/views/dataset.ts create mode 100644 ui/src/locales/lang/zh-Hant/views/knowledge.ts create mode 100644 ui/src/stores/modules/model.ts create mode 100644 ui/src/views/knowledge/component/KnowledgeIcon.vue rename ui/src/views/knowledge/{component/CreateDatasetDialog.vue => create-component/CreateKnowledgeDialog copy.vue} (55%) create mode 100644 ui/src/views/knowledge/create-component/CreateKnowledgeDialog.vue diff --git a/ui/src/api/knowledge/knowledge.ts b/ui/src/api/knowledge/knowledge.ts index 6f23fa035..1dafb38c7 100644 --- a/ui/src/api/knowledge/knowledge.ts +++ b/ui/src/api/knowledge/knowledge.ts @@ -2,6 +2,7 @@ import { Result } from '@/request/Result' import { get, post, del, put } from '@/request/index' import { type Ref } from 'vue' import type { pageRequest } from '@/api/type/common' +import type { knowledgeData } from '@/api/type/knowledge' const prefix = '/workspace' /** @@ -99,10 +100,63 @@ const getKnowledgeDetail: ( return get(`${prefix}/${wordspace_id}/knowledge/${knowledge_id}`, undefined, loading) } +/** + * 创建知识库 + * @param 参数 + * { + "name": "string", + "folder_id": "string", + "desc": "string", + "embedding": "string" + } + */ +const postDataset: ( + wordspace_id: string, + data: knowledgeData, + loading?: Ref, +) => Promise> = (wordspace_id, data, loading) => { + return post(`${prefix}/${wordspace_id}/knowledge/base`, data, undefined, loading, 1000 * 60 * 5) +} + +/** + * 创建Web知识库 + * @param 参数 + * { + "name": "string", + "desc": "string", + "source_url": "string", + "selector": "string", + } + */ +const postWebDataset: (data: any, loading?: Ref) => Promise> = ( + data, + loading, +) => { + return post(`${prefix}/web`, data, undefined, loading) +} +/** + * 创建Lark知识库 + * @param 参数 + * { + "name": "string", + "desc": "string", + "app_id": "string", + "app_secret": "string", + "folder_token": "string", + } + */ +const postLarkDataset: (data: any, loading?: Ref) => Promise> = ( + data, + loading, +) => { + return post(`${prefix}/lark/save`, data, undefined, loading) +} + export default { getKnowledgeByFolder, getKnowledgeList, putReEmbeddingDataset, putSyncWebKnowledge, getKnowledgeDetail, + postDataset, } diff --git a/ui/src/api/type/knowledge.ts b/ui/src/api/type/knowledge.ts index 29a22b2d9..f5002d97b 100644 --- a/ui/src/api/type/knowledge.ts +++ b/ui/src/api/type/knowledge.ts @@ -1,9 +1,9 @@ interface knowledgeData { name: String + folder_id?: String desc: String + embedding?: String documents?: Array - type?: String - embedding_model_id?: String } export type { knowledgeData } diff --git a/ui/src/assets/knowledge/logo_yuque.svg b/ui/src/assets/knowledge/logo_yuque.svg new file mode 100644 index 000000000..b301fe9e9 --- /dev/null +++ b/ui/src/assets/knowledge/logo_yuque.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/ui/src/components/index.ts b/ui/src/components/index.ts index 213de8ab6..436d703a0 100644 --- a/ui/src/components/index.ts +++ b/ui/src/components/index.ts @@ -12,6 +12,8 @@ import CommonList from './common-list/index.vue' import BackButton from './back-button/index.vue' import AppTable from './app-table/index.vue' import CodemirrorEditor from './codemirror-editor/index.vue' +import InfiniteScroll from './infinite-scroll/index.vue' +import ModelSelect from './model-select/index.vue' export default { install(app: App) { app.component('LogoFull', LogoFull) @@ -27,5 +29,7 @@ export default { app.component('BackButton', BackButton) app.component('AppTable', AppTable) app.component('CodemirrorEditor', CodemirrorEditor) + app.component('InfiniteScroll', InfiniteScroll) + app.component('ModelSelect', ModelSelect) }, } diff --git a/ui/src/components/infinite-scroll/index.vue b/ui/src/components/infinite-scroll/index.vue new file mode 100644 index 000000000..b8c8ec095 --- /dev/null +++ b/ui/src/components/infinite-scroll/index.vue @@ -0,0 +1,73 @@ + + + diff --git a/ui/src/components/model-select/index.vue b/ui/src/components/model-select/index.vue new file mode 100644 index 000000000..41a4fa00f --- /dev/null +++ b/ui/src/components/model-select/index.vue @@ -0,0 +1,161 @@ + + + diff --git a/ui/src/locales/lang/en-US/components.ts b/ui/src/locales/lang/en-US/components.ts index 7f794e1a1..ee840bb04 100644 --- a/ui/src/locales/lang/en-US/components.ts +++ b/ui/src/locales/lang/en-US/components.ts @@ -8,5 +8,8 @@ export default { title: 'Select Segments', error: 'Process only the failed segments', all: 'All Segments' + }, + folder: { + addFolder:'Add Folder' } } diff --git a/ui/src/locales/lang/en-US/views/dataset.ts b/ui/src/locales/lang/en-US/views/dataset.ts deleted file mode 100644 index 7764c7c54..000000000 --- a/ui/src/locales/lang/en-US/views/dataset.ts +++ /dev/null @@ -1,86 +0,0 @@ -export default { - title: 'Knowledge', - createDataset: 'Create Knowledge', - general: 'General', - web: 'Web Site', - relatedApplications: 'Linked App', - document_count: 'docs', - relatedApp_count: 'linked apps', - searchBar: { - placeholder: 'Search by name' - }, - setting: { - vectorization: 'Vectorization', - sync: 'Sync' - }, - tip: { - professionalMessage: - 'The community edition supports up to 50 knowledge. For more knowledge, please upgrade to the professional edition.', - syncSuccess: 'Sync task sent successfully', - updateModeMessage: - 'After modifying the knowledge vector model, you need to vectorize the knowledge. Do you want to continue saving?' - }, - delete: { - confirmTitle: 'Confirm deletion of knowledge:', - confirmMessage1: 'This knowledge is related with', - confirmMessage2: 'APP. Deleting it will be irreversible, please proceed with caution.' - }, - datasetForm: { - title: { - info: 'Knowledge Settings' - }, - form: { - datasetName: { - label: 'Name', - placeholder: 'Please enter the knowledge name', - requiredMessage: 'Please enter the knowledge name' - }, - datasetDescription: { - label: 'Description', - placeholder: - 'Describe the content of the knowledge. A detailed description will help AI understand the content better, improving the accuracy of content retrieval and hit rate.', - requiredMessage: 'Please enter the knowledge description' - }, - EmbeddingModel: { - label: 'Embedding Model', - placeholder: 'Please select a embedding model', - requiredMessage: 'Please select the embedding model' - }, - datasetType: { - label: 'Type', - generalInfo: 'Upload local documents', - webInfo: 'Sync text data from a web site' - }, - source_url: { - label: 'Web Root URL', - placeholder: 'Please enter the web root URL', - requiredMessage: 'Please enter the web root URL' - }, - selector: { - label: 'Selector', - placeholder: 'Default is body, can input .classname/#idname/tagname' - } - } - }, - ResultSuccess: { - title: 'Knowledge Created Successfully', - paragraph: 'Segments', - paragraph_count: 'Segments', - documentList: 'Document List', - loading: 'Importing', - buttons: { - toDataset: 'Return to Knowledge List', - toDocument: 'Go to Document' - } - }, - syncWeb: { - title: 'Sync Knowledge', - syncMethod: 'Sync Method', - replace: 'Replace Sync', - replaceText: 'Re-fetch Web site documents, replacing the documents in the local knowledge', - complete: 'Full Sync', - completeText: - 'Delete all documents in the local knowledge and re-fetch web site documents', - tip: 'Note: All syncs will delete existing data and re-fetch new data. Please proceed with caution.' - } -} diff --git a/ui/src/locales/lang/en-US/views/index.ts b/ui/src/locales/lang/en-US/views/index.ts index 2c9018f48..7d154bf3f 100644 --- a/ui/src/locales/lang/en-US/views/index.ts +++ b/ui/src/locales/lang/en-US/views/index.ts @@ -1,7 +1,7 @@ import notFound from './404' import application from './application' import applicationOverview from './application-overview' -import dataset from './dataset' +import knowledge from './knowledge' import system from './system' import tool from './tool' import userManage from './user-manage' @@ -25,7 +25,7 @@ export default { resourceAuthorization, team, model, - dataset, + knowledge, applicationWorkflow, document, paragraph, diff --git a/ui/src/locales/lang/en-US/views/knowledge.ts b/ui/src/locales/lang/en-US/views/knowledge.ts new file mode 100644 index 000000000..95736261e --- /dev/null +++ b/ui/src/locales/lang/en-US/views/knowledge.ts @@ -0,0 +1,89 @@ +export default { + title: 'Knowledge', + relatedApplications: 'Linked App', + document_count: 'docs', + relatedApp_count: 'linked apps', + searchBar: { + placeholder: 'Search by name', + }, + setting: { + vectorization: 'Vectorization', + sync: 'Sync', + }, + tip: { + professionalMessage: + 'The community edition supports up to 50 knowledge. For more knowledge, please upgrade to the professional edition.', + syncSuccess: 'Sync task sent successfully', + updateModeMessage: + 'After modifying the knowledge vector model, you need to vectorize the knowledge. Do you want to continue saving?', + }, + delete: { + confirmTitle: 'Confirm deletion of knowledge:', + confirmMessage1: 'This knowledge is related with', + confirmMessage2: 'APP. Deleting it will be irreversible, please proceed with caution.', + }, + knowledgeType: { + label: 'Type', + generalKnowledge: 'General Knowledge', + webKnowledge: 'Web Knowledge', + larkKnowledge: 'Lark Knowledge', + yuqueKnowledge: 'Yuque Knowledge', + generalInfo: 'Upload local documents', + webInfo: 'Sync text data from a web site', + larkInfo: 'Build knowledge through Lark documents', + yuqueInfo: 'Build knowledge through Yuque documents', + createGeneralKnowledge: 'Create General Knowledge', + createWebKnowledge: 'Create Web Knowledge', + createLarkKnowledge: 'Create Lark Knowledge', + createYuqueKnowledge: 'Create Yuque Knowledge', + }, + form: { + knowledgeName: { + label: 'Name', + placeholder: 'Please enter the knowledge name', + requiredMessage: 'Please enter the knowledge name', + }, + knowledgeDescription: { + label: 'Description', + placeholder: + 'Describe the content of the knowledge. A detailed description will help AI understand the content better, improving the accuracy of content retrieval and hit rate.', + requiredMessage: 'Please enter the knowledge description', + }, + EmbeddingModel: { + label: 'Embedding Model', + placeholder: 'Please select a embedding model', + requiredMessage: 'Please select the embedding model', + }, + + source_url: { + label: 'Web Root URL', + placeholder: 'Please enter the web root URL', + requiredMessage: 'Please enter the web root URL', + }, + selector: { + label: 'Selector', + placeholder: 'Default is body, can input .classname/#idname/tagname', + }, + }, + + ResultSuccess: { + title: 'Knowledge Created Successfully', + paragraph: 'Segments', + paragraph_count: 'Segments', + documentList: 'Document List', + loading: 'Importing', + buttons: { + toKnowledge: 'Return to Knowledge List', + toDocument: 'Go to Document', + }, + }, + syncWeb: { + title: 'Sync Knowledge', + syncMethod: 'Sync Method', + replace: 'Replace Sync', + replaceText: 'Re-fetch Web site documents, replacing the documents in the local knowledge', + complete: 'Full Sync', + completeText: 'Delete all documents in the local knowledge and re-fetch web site documents', + tip: 'Note: All syncs will delete existing data and re-fetch new data. Please proceed with caution.', + }, +} diff --git a/ui/src/locales/lang/zh-CN/components.ts b/ui/src/locales/lang/zh-CN/components.ts index 5b871daf1..64699afa0 100644 --- a/ui/src/locales/lang/zh-CN/components.ts +++ b/ui/src/locales/lang/zh-CN/components.ts @@ -8,5 +8,8 @@ export default { title: '选择分段', error: '仅执行未成功分段', all: '全部分段' + }, + folder: { + addFolder:'添加文件夹' } } diff --git a/ui/src/locales/lang/zh-CN/views/knowledge.ts b/ui/src/locales/lang/zh-CN/views/knowledge.ts index 54e640041..8f0e67fe4 100644 --- a/ui/src/locales/lang/zh-CN/views/knowledge.ts +++ b/ui/src/locales/lang/zh-CN/views/knowledge.ts @@ -6,4 +6,84 @@ export default { vectorization: '向量化', sync: '同步', }, + tip: { + professionalMessage: '社区版最多支持 50 个知识库,如需拥有更多知识库,请升级为专业版。', + syncSuccess: '同步任务发送成功', + updateModeMessage: '修改知识库向量模型后,需要对知识库向量化,是否继续保存?', + }, + delete: { + confirmTitle: '是否删除知识库:', + confirmMessage1: '此知识库关联', + confirmMessage2: '个应用,删除后无法恢复,请谨慎操作。', + }, + knowledgeType: { + label: '知识库类型', + generalKnowledge: '通用知识库', + webKnowledge: 'web知识库', + larkKnowledge: '飞书知识库', + yuqueKnowledge: '语雀知识库', + generalInfo: '通过上传文件或手动录入构建知识库', + webInfo: '通过网站链接构建知识库', + larkInfo: '通过飞书文档构建知识库', + yuqueInfo: '通过语雀文档构建知识库', + createGeneralKnowledge: '创建通用知识库', + createWebKnowledge: '创建 web 知识库', + createLarkKnowledge: '创建飞书知识库', + createYuqueKnowledge: '创建语雀知识库', + }, + form: { + knowledgeName: { + label: '知识库名称', + placeholder: '请输入知识库名称', + requiredMessage: '请输入知识库名称', + }, + knowledgeDescription: { + label: '知识库描述', + placeholder: + '描述知识库的内容,详尽的描述将帮助AI能深入理解该知识库的内容,能更准确的检索到内容,提高该知识库的命中率。', + requiredMessage: '请输入知识库描述', + }, + EmbeddingModel: { + label: '向量模型', + placeholder: '请选择向量模型', + requiredMessage: '请输入Embedding模型', + }, + + source_url: { + label: 'Web 根地址', + placeholder: '请输入 Web 根地址', + requiredMessage: ' 请输入 Web 根地址', + }, + user_id: { + requiredMessage: '请输入User ID', + }, + token: { + requiredMessage: '请输入Token', + }, + selector: { + label: '选择器', + placeholder: '默认为 body,可输入 .classname/#idname/tagname', + }, + }, + + ResultSuccess: { + title: '知识库创建成功', + paragraph: '分段', + paragraph_count: '个分段', + documentList: '文档列表', + loading: '导入中', + buttons: { + toKnowledge: '返回知识库列表', + toDocument: '前往文档', + }, + }, + syncWeb: { + title: '同步知识库', + syncMethod: '同步方式', + replace: '替换同步', + replaceText: '重新获取 Web 站点文档,覆盖替换本地知识库中的文档', + complete: '整体同步', + completeText: '先删除本地知识库所有文档,重新获取 Web 站点文档', + tip: '注意:所有同步都会删除已有数据重新获取新数据,请谨慎操作。', + }, } diff --git a/ui/src/locales/lang/zh-Hant/components.ts b/ui/src/locales/lang/zh-Hant/components.ts index da25a3709..c8af911af 100644 --- a/ui/src/locales/lang/zh-Hant/components.ts +++ b/ui/src/locales/lang/zh-Hant/components.ts @@ -8,5 +8,8 @@ export default { title: '選擇分段', error: '僅執行未成功分段', all: '全部分段' + }, + folder: { + addFolder:'添加文件夾' } } diff --git a/ui/src/locales/lang/zh-Hant/views/dataset.ts b/ui/src/locales/lang/zh-Hant/views/dataset.ts deleted file mode 100644 index 0eace754b..000000000 --- a/ui/src/locales/lang/zh-Hant/views/dataset.ts +++ /dev/null @@ -1,83 +0,0 @@ -export default { - title: '知識庫', - createDataset: '建立知識庫', - general: '通用型', - web: 'Web 站點', - relatedApplications: '關聯應用', - document_count: '文檔數', - relatedApp_count: '關聯應用', - searchBar: { - placeholder: '按名稱搜尋' - }, - setting: { - vectorization: '向量化', - sync: '同步' - }, - tip: { - professionalMessage: '社群版最多支援 50 個知識庫,如需擁有更多知識庫,請升級為專業版。', - syncSuccess: '同步任務發送成功', - updateModeMessage: '修改知識庫向量模型後,需要對知識庫向量化,是否繼續保存?' - }, - delete: { - confirmTitle: '是否刪除知識庫:', - confirmMessage1: '此知識庫關聯', - confirmMessage2: '個應用,刪除後無法恢復,請謹慎操作。' - }, - datasetForm: { - title: { - info: '基本資訊' - }, - form: { - datasetName: { - label: '知識庫名稱', - placeholder: '請輸入知識庫名稱', - requiredMessage: '請輸入應用名稱' - }, - datasetDescription: { - label: '知識庫描述', - placeholder: - '描述知識庫的內容,詳盡的描述將幫助AI能深入理解該知識庫的內容,能更準確的檢索到內容,提高該知識庫的命中率。', - requiredMessage: '請輸入知識庫描述' - }, - EmbeddingModel: { - label: '向量模型', - placeholder: '請選擇向量模型', - requiredMessage: '請輸入Embedding模型' - }, - datasetType: { - label: '知識庫類型', - generalInfo: '上傳本地檔案', - webInfo: '同步Web網站文字資料' - }, - source_url: { - label: 'Web 根位址', - placeholder: '請輸入 Web 根位址', - requiredMessage: '請輸入 Web 根位址' - }, - selector: { - label: '選擇器', - placeholder: '預設為 body,可輸入 .classname/#idname/tagname' - } - } - }, - ResultSuccess: { - title: '知識庫建立成功', - paragraph: '段落', - paragraph_count: '個段落', - documentList: '文件列表', - loading: '正在導入', - buttons: { - toDataset: '返回知識庫列表', - toDocument: '前往文件' - } - }, - syncWeb: { - title: '同步知識庫', - syncMethod: '同步方式', - replace: '替換同步', - replaceText: '重新獲取 Web 站點文件,覆蓋替換本地知識庫中的文件', - complete: '完整同步', - completeText: '先刪除本地知識庫所有文件,重新獲取 Web 站點文件', - tip: '注意:所有同步都會刪除現有數據並重新獲取新數據,請謹慎操作。' - } -} diff --git a/ui/src/locales/lang/zh-Hant/views/index.ts b/ui/src/locales/lang/zh-Hant/views/index.ts index 2c9018f48..7d154bf3f 100644 --- a/ui/src/locales/lang/zh-Hant/views/index.ts +++ b/ui/src/locales/lang/zh-Hant/views/index.ts @@ -1,7 +1,7 @@ import notFound from './404' import application from './application' import applicationOverview from './application-overview' -import dataset from './dataset' +import knowledge from './knowledge' import system from './system' import tool from './tool' import userManage from './user-manage' @@ -25,7 +25,7 @@ export default { resourceAuthorization, team, model, - dataset, + knowledge, applicationWorkflow, document, paragraph, diff --git a/ui/src/locales/lang/zh-Hant/views/knowledge.ts b/ui/src/locales/lang/zh-Hant/views/knowledge.ts new file mode 100644 index 000000000..425169854 --- /dev/null +++ b/ui/src/locales/lang/zh-Hant/views/knowledge.ts @@ -0,0 +1,83 @@ +export default { + title: '知識庫', + relatedApplications: '關聯應用', + document_count: '文檔數', + relatedApp_count: '關聯應用', + searchBar: { + placeholder: '按名稱搜尋', + }, + setting: { + vectorization: '向量化', + sync: '同步', + }, + tip: { + professionalMessage: '社群版最多支援 50 個知識庫,如需擁有更多知識庫,請升級為專業版。', + syncSuccess: '同步任務發送成功', + updateModeMessage: '修改知識庫向量模型後,需要對知識庫向量化,是否繼續保存?', + }, + delete: { + confirmTitle: '是否刪除知識庫:', + confirmMessage1: '此知識庫關聯', + confirmMessage2: '個應用,刪除後無法恢復,請謹慎操作。', + }, + knowledgeType: { + label: '知識庫類型', + generalKnowledge: '通用知識庫', + webKnowledge: 'Web 知識庫', + larkKnowledge: '飛書知識庫', + yuqueKnowledge: '語雀知識庫', + generalInfo: '上傳本地檔案', + webInfo: '同步Web網站文字資料', + larkInfo: '通過飛書文檔構建知識庫', + yuqueInfo: '通過語雀文檔構建知識庫', + }, + form: { + knowledgeName: { + label: '知識庫名稱', + placeholder: '請輸入知識庫名稱', + requiredMessage: '請輸入應用名稱', + }, + knowledgeDescription: { + label: '知識庫描述', + placeholder: + '描述知識庫的內容,詳盡的描述將幫助AI能深入理解該知識庫的內容,能更準確的檢索到內容,提高該知識庫的命中率。', + requiredMessage: '請輸入知識庫描述', + }, + EmbeddingModel: { + label: '向量模型', + placeholder: '請選擇向量模型', + requiredMessage: '請輸入Embedding模型', + }, + + source_url: { + label: 'Web 根位址', + placeholder: '請輸入 Web 根位址', + requiredMessage: '請輸入 Web 根位址', + }, + selector: { + label: '選擇器', + placeholder: '預設為 body,可輸入 .classname/#idname/tagname', + }, + }, + + ResultSuccess: { + title: '知識庫建立成功', + paragraph: '段落', + paragraph_count: '個段落', + documentList: '文件列表', + loading: '正在導入', + buttons: { + toKnowledge: '返回知識庫列表', + toDocument: '前往文件', + }, + }, + syncWeb: { + title: '同步知識庫', + syncMethod: '同步方式', + replace: '替換同步', + replaceText: '重新獲取 Web 站點文件,覆蓋替換本地知識庫中的文件', + complete: '完整同步', + completeText: '先刪除本地知識庫所有文件,重新獲取 Web 站點文件', + tip: '注意:所有同步都會刪除現有數據並重新獲取新數據,請謹慎操作。', + }, +} diff --git a/ui/src/stores/index.ts b/ui/src/stores/index.ts index f8f3ce620..f9eb95186 100644 --- a/ui/src/stores/index.ts +++ b/ui/src/stores/index.ts @@ -4,6 +4,7 @@ import useUserStore from './modules/user' import useFolderStore from './modules/folder' import useThemeStore from './modules/theme' import useKnowledgeStore from './modules/knowledge' +import useModelStore from './modules/model' const useStore = () => ({ common: useCommonStore(), @@ -12,6 +13,7 @@ const useStore = () => ({ folder: useFolderStore(), theme: useThemeStore(), knowledge: useKnowledgeStore(), + model: useModelStore(), }) export default useStore diff --git a/ui/src/stores/modules/model.ts b/ui/src/stores/modules/model.ts new file mode 100644 index 000000000..3c4e2a8ef --- /dev/null +++ b/ui/src/stores/modules/model.ts @@ -0,0 +1,34 @@ +import { defineStore } from 'pinia' +import { type Ref } from 'vue' +import ModelApi from '@/api/model/model' +import ProviderApi from '@/api/model/provider' +import type { ListModelRequest } from '@/api/type/model' +const useModelStore = defineStore('model', { + state: () => ({}), + actions: { + async asyncGetModel(wordspace_id: string, data?: ListModelRequest, loading?: Ref) { + return new Promise((resolve, reject) => { + ModelApi.getModel(wordspace_id, data, loading) + .then((res) => { + resolve(res) + }) + .catch((error) => { + reject(error) + }) + }) + }, + async asyncGetProvider(loading?: Ref) { + return new Promise((resolve, reject) => { + ProviderApi.getProvider(loading) + .then((res) => { + resolve(res) + }) + .catch((error) => { + reject(error) + }) + }) + }, + }, +}) + +export default useModelStore diff --git a/ui/src/styles/element-plus.scss b/ui/src/styles/element-plus.scss index 73b326f1d..9323fb8fb 100644 --- a/ui/src/styles/element-plus.scss +++ b/ui/src/styles/element-plus.scss @@ -195,3 +195,16 @@ background: var(--el-table-current-row-bg-color); } } + +// dialog +.el-dialog { + --el-dialog-padding-primary: 24px; + --el-dialog-border-radius: 8px; +} +.el-dialog__headerbtn { + top: 8px; + right: 8px; + .el-dialog__close { + font-size: 20px; + } +} diff --git a/ui/src/utils/common.ts b/ui/src/utils/common.ts index 7a6fb7289..64020a88e 100644 --- a/ui/src/utils/common.ts +++ b/ui/src/utils/common.ts @@ -1,3 +1,11 @@ +/* + 从指定数组中过滤出对应的对象 +*/ +export function relatedObject(list: any, val: any, attr: string) { + const filterData: any = list.filter((item: any) => item[attr] === val)?.[0] + return filterData || null +} + // 排序 export function arraySort(list: Array, property: any, desc?: boolean) { return list.sort((a: any, b: any) => { diff --git a/ui/src/views/knowledge/component/BaseForm.vue b/ui/src/views/knowledge/component/BaseForm.vue index 0fcfa5470..334ca578c 100644 --- a/ui/src/views/knowledge/component/BaseForm.vue +++ b/ui/src/views/knowledge/component/BaseForm.vue @@ -7,23 +7,20 @@ require-asterisk-position="right" v-loading="loading" > - + - + {} - } + default: () => {}, + }, }) const { model } = useStore() -const form = ref({ +const form = ref({ name: '', desc: '', - embedding_model_id: '' + embedding: '', }) const rules = reactive({ name: [ { required: true, - message: t('views.dataset.datasetForm.form.datasetName.requiredMessage'), - trigger: 'blur' - } + message: t('views.knowledge.form.knowledgeName.requiredMessage'), + trigger: 'blur', + }, ], desc: [ { required: true, - message: t('views.dataset.datasetForm.form.datasetDescription.requiredMessage'), - trigger: 'blur' - } + message: t('views.knowledge.form.knowledgeDescription.requiredMessage'), + trigger: 'blur', + }, ], - embedding_model_id: [ + embedding: [ { required: true, - message: t('views.dataset.datasetForm.form.EmbeddingModel.requiredMessage'), - trigger: 'change' - } - ] + message: t('views.knowledge.form.EmbeddingModel.requiredMessage'), + trigger: 'change', + }, + ], }) const FormRef = ref() @@ -97,12 +94,12 @@ watch( if (value && JSON.stringify(value) !== '{}') { form.value.name = value.name form.value.desc = value.desc - form.value.embedding_model_id = value.embedding_model_id + form.value.embedding = value.embedding } }, { - immediate: true - } + immediate: true, + }, ) /* 表单校验 @@ -117,7 +114,7 @@ function validate() { function getModel() { loading.value = true model - .asyncGetModel({ model_type: 'EMBEDDING' }) + .asyncGetModel('default', { model_type: 'EMBEDDING' }) .then((res: any) => { modelOptions.value = groupBy(res?.data, 'provider') loading.value = false @@ -134,14 +131,14 @@ onUnmounted(() => { form.value = { name: '', desc: '', - embedding_model_id: '' + embedding: '', } FormRef.value?.clearValidate() }) defineExpose({ validate, - form + form, }) diff --git a/ui/src/views/knowledge/component/KnowledgeIcon.vue b/ui/src/views/knowledge/component/KnowledgeIcon.vue new file mode 100644 index 000000000..7c06e3bd7 --- /dev/null +++ b/ui/src/views/knowledge/component/KnowledgeIcon.vue @@ -0,0 +1,25 @@ + + diff --git a/ui/src/views/knowledge/component/CreateDatasetDialog.vue b/ui/src/views/knowledge/create-component/CreateKnowledgeDialog copy.vue similarity index 55% rename from ui/src/views/knowledge/component/CreateDatasetDialog.vue rename to ui/src/views/knowledge/create-component/CreateKnowledgeDialog copy.vue index 1a799b837..d9d7b8429 100644 --- a/ui/src/views/knowledge/component/CreateDatasetDialog.vue +++ b/ui/src/views/knowledge/create-component/CreateKnowledgeDialog copy.vue @@ -1,6 +1,6 @@ -
- - + +
+ + + + + + + + +