Skip to content

Commit 5d8fc60

Browse files
committed
feat: Knowledge export and import
1 parent dcedc87 commit 5d8fc60

File tree

13 files changed

+694
-9
lines changed

13 files changed

+694
-9
lines changed

apps/knowledge/api/knowledge.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from knowledge.serializers.common import BatchSerializer, BatchMoveSerializer
77
from knowledge.serializers.common import GenerateRelatedSerializer
88
from knowledge.serializers.knowledge import KnowledgeBaseCreateRequest, KnowledgeModelSerializer, KnowledgeEditRequest, \
9-
KnowledgeWebCreateRequest, HitTestSerializer
9+
KnowledgeWebCreateRequest, HitTestSerializer, KnowledgeImportRequest
1010

1111

1212
class KnowledgeCreateResponse(ResultSerializer):
@@ -306,3 +306,26 @@ def get_request():
306306
@staticmethod
307307
def get_move_request():
308308
return BatchMoveSerializer
309+
310+
311+
class KnowledgeImportAPI(APIMixin):
312+
@staticmethod
313+
def get_parameters():
314+
return [
315+
OpenApiParameter(
316+
name="workspace_id",
317+
description="工作空间id",
318+
type=OpenApiTypes.STR,
319+
location='path',
320+
required=True,
321+
),
322+
]
323+
324+
@staticmethod
325+
def get_request():
326+
return KnowledgeImportRequest
327+
328+
@staticmethod
329+
def get_response():
330+
return DefaultResultSerializer
331+

apps/knowledge/serializers/knowledge.py

Lines changed: 385 additions & 5 deletions
Large diffs are not rendered by default.

apps/knowledge/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
path('workspace/<str:workspace_id>/knowledge/tags', views.KnowledgeView.Tags.as_view()),
1818
path('workspace/<str:workspace_id>/knowledge/batch_delete', views.KnowledgeView.BatchDelete.as_view()),
1919
path('workspace/<str:workspace_id>/knowledge/batch_move', views.KnowledgeView.BatchMove.as_view()),
20+
path('workspace/<str:workspace_id>/knowledge/import_knowledge', views.KnowledgeView.ImportKnowledge.as_view()),
2021
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>', views.KnowledgeView.Operate.as_view()),
2122
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/sync', views.KnowledgeView.SyncWeb.as_view()),
2223
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/workflow', views.KnowledgeWorkflowView.Operate.as_view()),
@@ -27,6 +28,7 @@
2728
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/hit_test', views.KnowledgeView.HitTest.as_view()),
2829
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/export', views.KnowledgeView.Export.as_view()),
2930
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/export_zip', views.KnowledgeView.ExportZip.as_view()),
31+
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/export_knowledge', views.KnowledgeView.ExportKnowledge.as_view()),
3032
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/transform_workflow', views.KnowledgeView.TransformWorkflow.as_view()),
3133
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/tags', views.KnowledgeTagView.as_view()),
3234
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/tags/batch_delete', views.KnowledgeTagView.BatchDelete.as_view()),

apps/knowledge/views/knowledge.py

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
from django.utils.translation import gettext_lazy as _
22
from drf_spectacular.utils import extend_schema
3+
from rest_framework.parsers import MultiPartParser
34
from rest_framework.request import Request
45
from rest_framework.views import APIView
56

67
from common.auth import TokenAuth
7-
from common.auth.authentication import has_permissions, check_batch_permissions
8+
from common.auth.authentication import has_permissions, check_batch_permissions, get_is_permissions
89
from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants
910
from common.log.log import log
1011
from common import result
1112
from knowledge.api.knowledge import KnowledgeBaseCreateAPI, KnowledgeWebCreateAPI, KnowledgeTreeReadAPI, \
1213
KnowledgeEditAPI, KnowledgeReadAPI, KnowledgePageAPI, SyncWebAPI, GenerateRelatedAPI, HitTestAPI, EmbeddingAPI, \
13-
GetModelAPI, KnowledgeExportAPI, KnowledgeBatchOperateAPI
14+
GetModelAPI, KnowledgeExportAPI, KnowledgeBatchOperateAPI, KnowledgeImportAPI
1415
from knowledge.models import KnowledgeScope
1516
from knowledge.serializers.common import get_knowledge_operation_object
1617
from knowledge.serializers.knowledge import KnowledgeSerializer, KnowledgeBatchOperateSerializer
@@ -409,6 +410,68 @@ def get(self, request: Request, workspace_id: str, knowledge_id: str):
409410
'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'user_id': request.user.id
410411
}).export_zip()
411412

413+
class ExportKnowledge(APIView):
414+
authentication_classes = [TokenAuth]
415+
416+
@extend_schema(
417+
summary=_('Export knowledge bundle'),
418+
operation_id=_('Export knowledge bundle'), # type: ignore
419+
parameters=KnowledgeExportAPI.get_parameters(),
420+
responses=KnowledgeExportAPI.get_response(),
421+
tags=[_('Knowledge Base')] # type: ignore
422+
)
423+
@has_permissions(
424+
PermissionConstants.KNOWLEDGE_EXPORT.get_workspace_knowledge_permission(),
425+
PermissionConstants.KNOWLEDGE_EXPORT.get_workspace_permission_workspace_manage_role(),
426+
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
427+
ViewPermission([RoleConstants.USER.get_workspace_role()],
428+
[PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
429+
)
430+
@log(
431+
menu='Knowledge Base', operate="Export knowledge bundle",
432+
get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')),
433+
)
434+
def get(self, request: Request, workspace_id: str, knowledge_id: str):
435+
return KnowledgeSerializer.Operate(data={
436+
'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'user_id': request.user.id
437+
}).export_knowledge()
438+
439+
440+
class ImportKnowledge(APIView):
441+
authentication_classes = [TokenAuth]
442+
parser_classes = [MultiPartParser]
443+
444+
@extend_schema(
445+
methods=['POST'],
446+
description=_('Import knowledge bundle'),
447+
summary=_('Import knowledge bundle'),
448+
operation_id=_('Import knowledge bundle'),
449+
parameters=KnowledgeImportAPI.get_parameters(),
450+
request=KnowledgeImportAPI.get_request(),
451+
responses=KnowledgeImportAPI.get_response(),
452+
tags=[_('Knowledge Base')]
453+
)
454+
@has_permissions(
455+
PermissionConstants.KNOWLEDGE_CREATE.get_workspace_permission(),
456+
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
457+
RoleConstants.USER.get_workspace_role()
458+
)
459+
@log(
460+
menu='Knowledge Base', operate="Import knowledge bundle",
461+
)
462+
def post(self, request: Request, workspace_id: str):
463+
is_import_tool = get_is_permissions(request, workspace_id=workspace_id)(
464+
PermissionConstants.TOOL_IMPORT.get_workspace_permission(),
465+
PermissionConstants.TOOL_IMPORT.get_workspace_permission_workspace_manage_role(),
466+
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
467+
)
468+
return result.success(
469+
KnowledgeSerializer.ImportKnowledge(
470+
data={'workspace_id': workspace_id, 'user_id': request.user.id, 'folder_id': request.data.get('folder_id',workspace_id)}
471+
).import_knowledge(request.FILES.get('file'), is_import_tool)
472+
)
473+
474+
412475
class GenerateRelated(APIView):
413476
authentication_classes = [TokenAuth]
414477

apps/locales/en_US/LC_MESSAGES/django.po

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9191,3 +9191,38 @@ msgstr "Batch move tools"
91919191
msgid "Model is not allowed to be empty"
91929192
msgstr ""
91939193

9194+
msgid "Not a valid zip file"
9195+
msgstr "Not a valid zip file"
9196+
9197+
msgid "Not a valid KB export file, missing knowledge.json"
9198+
msgstr "Not a valid KB export file, missing knowledge.json"
9199+
9200+
msgid "Not a valid KB export file, missing knowledge.xlsx"
9201+
msgstr "Not a valid KB export file, missing knowledge.xlsx"
9202+
9203+
msgid "Tags"
9204+
msgstr "Tags"
9205+
9206+
msgid "Hit handling method"
9207+
msgstr "Hit handling method"
9208+
9209+
msgid "Directly return similarity"
9210+
msgstr "Directly return similarity"
9211+
9212+
msgid "Paragraph is active"
9213+
msgstr "Paragraph is active"
9214+
9215+
msgid "Document type"
9216+
msgstr "Document type"
9217+
9218+
msgid "Document meta"
9219+
msgstr "Document meta"
9220+
9221+
msgid "Export knowledge bundle"
9222+
msgstr "Export knowledge bundle"
9223+
9224+
msgid "Import knowledge bundle"
9225+
msgstr "Import knowledge bundle"
9226+
9227+
9228+

apps/locales/zh_CN/LC_MESSAGES/django.po

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9314,3 +9314,36 @@ msgstr "批量移动工具"
93149314
msgid "Model is not allowed to be empty"
93159315
msgstr "模型不能为空"
93169316

9317+
msgid "Not a valid zip file"
9318+
msgstr "不是有效的 zip 文件"
9319+
9320+
msgid "Not a valid KB export file, missing knowledge.json"
9321+
msgstr "不是有效的知识库导出文件,缺少 knowledge.json"
9322+
9323+
msgid "Not a valid KB export file, missing knowledge.xlsx"
9324+
msgstr "不是有效的知识库导出文件,缺少 knowledge.xlsx"
9325+
9326+
msgid "Tags"
9327+
msgstr "标签"
9328+
9329+
msgid "Hit handling method"
9330+
msgstr "命中处理方式"
9331+
9332+
msgid "Directly return similarity"
9333+
msgstr "直接返回相似度"
9334+
9335+
msgid "Paragraph is active"
9336+
msgstr "分段是否启用"
9337+
9338+
msgid "Document type"
9339+
msgstr "文档类型"
9340+
9341+
msgid "Document meta"
9342+
msgstr "文档元数据"
9343+
9344+
msgid "Export knowledge bundle"
9345+
msgstr "导出知识库"
9346+
9347+
msgid "Import knowledge bundle"
9348+
msgstr "导入知识库"
9349+

apps/locales/zh_Hant/LC_MESSAGES/django.po

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9311,3 +9311,36 @@ msgstr "批量移動工具"
93119311
msgid "Model is not allowed to be empty"
93129312
msgstr "模型不能为空"
93139313

9314+
msgid "Not a valid zip file"
9315+
msgstr "不是有效的 zip 檔案"
9316+
9317+
msgid "Not a valid KB export file, missing knowledge.json"
9318+
msgstr "不是有效的知識庫匯出檔案,缺少 knowledge.json"
9319+
9320+
msgid "Not a valid KB export file, missing knowledge.xlsx"
9321+
msgstr "不是有效的知識庫匯出檔案,缺少 knowledge.xlsx"
9322+
9323+
msgid "Tags"
9324+
msgstr "標籤"
9325+
9326+
msgid "Hit handling method"
9327+
msgstr "命中處理方式"
9328+
9329+
msgid "Directly return similarity"
9330+
msgstr "直接回傳相似度"
9331+
9332+
msgid "Paragraph is active"
9333+
msgstr "段落是否啟用"
9334+
9335+
msgid "Document type"
9336+
msgstr "文件類型"
9337+
9338+
msgid "Document meta"
9339+
msgstr "文件元資料"
9340+
9341+
msgid "Export knowledge bundle"
9342+
msgstr "匯出知識庫"
9343+
9344+
msgid "Import knowledge bundle"
9345+
msgstr "匯入知識庫"
9346+

ui/src/api/knowledge/knowledge.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,39 @@ const postTransformWorkflow: (
494494
return post(`${prefix.value}/${knowledge_id}/transform_workflow`, data, undefined, loading)
495495
}
496496

497+
/**
498+
* 导出知识库
499+
* @param knowledge_name
500+
* @param knowledge_id
501+
* @param loading
502+
* @returns
503+
*/
504+
const exportKnowledgeBundle: (
505+
knowledge_name: string,
506+
knowledge_id: string,
507+
loading?: Ref<boolean>
508+
) => Promise<any> = (knowledge_name, knowledge_id, loading) => {
509+
return exportFile(
510+
knowledge_name + '.zip',
511+
`${prefix.value}/${knowledge_id}/export_knowledge`,undefined, loading
512+
)
513+
}
514+
515+
/**
516+
* 导入知识库
517+
* @param data
518+
* @param loading
519+
* @returns
520+
*/
521+
const importKnowledgeBundle: (
522+
data: any,
523+
loading: Ref<boolean>
524+
) => Promise<Result<any>> = (data, loading) => {
525+
return post(`${prefix.value}/import_knowledge`, data, undefined, loading)
526+
}
527+
528+
529+
497530

498531
export default {
499532
getKnowledgeList,
@@ -534,4 +567,6 @@ export default {
534567
exportKnowledgeWorkflow,
535568
importKnowledgeWorkflow,
536569
postTransformWorkflow,
570+
exportKnowledgeBundle,
571+
importKnowledgeBundle
537572
}

ui/src/locales/lang/en-US/common.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,5 @@ export default {
151151
subTitle: 'View Execution Record',
152152
},
153153
sourceType: 'Source type',
154+
knowledgeImportTip: 'Knowledge base imported successfully. Documents have not been vectorized yet. Please configure the embedding model and vectorize the documents.'
154155
}

ui/src/locales/lang/zh-CN/common.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,5 @@ export default {
151151
subTitle: '查看执行记录',
152152
},
153153
sourceType: '资源类型',
154+
knowledgeImportTip: '导入创建知识库成功,文档数据未向量化,请先设置知识库的向量模型,并对文档进行向量化操作'
154155
}

0 commit comments

Comments
 (0)