diff --git a/apps/application/flow/step_node/search_document_node/impl/base_search_document_node.py b/apps/application/flow/step_node/search_document_node/impl/base_search_document_node.py index 9c15aef0d..980cc2fd1 100644 --- a/apps/application/flow/step_node/search_document_node/impl/base_search_document_node.py +++ b/apps/application/flow/step_node/search_document_node/impl/base_search_document_node.py @@ -7,6 +7,8 @@ from django.db.models import QuerySet from application.flow.i_step_node import NodeResult from application.flow.step_node.search_document_node.i_search_document_node import ISearchDocumentStepNode +from common.constants.permission_constants import RoleConstants +from common.database_model_manage.database_model_manage import DatabaseModelManage from knowledge.models import Document, DocumentTag, Knowledge @@ -39,6 +41,23 @@ class BaseSearchDocumentNode(ISearchDocumentStepNode): knowledge_id__in=self.get_reference_content(search_scope_reference) ).values_list('id', flat=True) + # 权限过滤 + get_knowledge_list_of_authorized = DatabaseModelManage.get_model('get_knowledge_list_of_authorized') + chat_user_type = self.workflow_manage.get_body().get('chat_user_type') + + if get_knowledge_list_of_authorized is not None and RoleConstants.CHAT_USER.value.name == chat_user_type: + # 获取授权的知识库ID列表 + authorized_knowledge_ids = get_knowledge_list_of_authorized( + self.workflow_manage.get_body().get('chat_user_id'), + knowledge_id_list + ) + + # 过滤出授权知识库下的文档 + document_id_list = QuerySet(Document).filter( + id__in=document_id_list, + knowledge_id__in=authorized_knowledge_ids + ).values_list('id', flat=True) + if search_mode == 'auto': # 通过问题自动检索 matched_doc_ids = self.handle_auto_tags(document_id_list, question_reference) diff --git a/apps/application/flow/step_node/search_knowledge_node/i_search_knowledge_node.py b/apps/application/flow/step_node/search_knowledge_node/i_search_knowledge_node.py index 9f07f327a..7f9311e2d 100644 --- a/apps/application/flow/step_node/search_knowledge_node/i_search_knowledge_node.py +++ b/apps/application/flow/step_node/search_knowledge_node/i_search_knowledge_node.py @@ -10,13 +10,12 @@ import re from typing import Type from django.core import validators +from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from application.flow.i_step_node import INode, NodeResult from common.utils.common import flat_map -from django.utils.translation import gettext_lazy as _ - class DatasetSettingSerializer(serializers.Serializer): # 需要查询的条数 @@ -43,6 +42,17 @@ class SearchDatasetStepNodeSerializer(serializers.Serializer): show_knowledge = serializers.BooleanField(required=True, label=_("The results are displayed in the knowledge sources")) + search_scope_type = serializers.ChoiceField( + required=False, choices=['custom', 'referencing'], label=_("search scope type"), + allow_null=True, default='custom' + ) + search_scope_source = serializers.ChoiceField( + required=False, choices=['document', 'knowledge'], + label=_("search scope variable type"), default='knowledge' + ) + search_scope_reference = serializers.ListField( + required=False, label=_("search scope variable"), default=list + ) def is_valid(self, *, raise_exception=False): super().is_valid(raise_exception=True) @@ -76,7 +86,9 @@ class ISearchKnowledgeStepNode(INode): return self.execute(**self.node_params_serializer.data, question=str(question), exclude_paragraph_id_list=exclude_paragraph_id_list) - def execute(self, dataset_id_list, dataset_setting, question, show_knowledge, + def execute(self, dataset_id_list, dataset_setting, question, show_knowledge, search_scope_type, + search_scope_source, + search_scope_reference, exclude_paragraph_id_list=None, **kwargs) -> NodeResult: pass diff --git a/apps/application/flow/step_node/search_knowledge_node/impl/base_search_knowledge_node.py b/apps/application/flow/step_node/search_knowledge_node/impl/base_search_knowledge_node.py index 176b7a99e..c1779d7e2 100644 --- a/apps/application/flow/step_node/search_knowledge_node/impl/base_search_knowledge_node.py +++ b/apps/application/flow/step_node/search_knowledge_node/impl/base_search_knowledge_node.py @@ -68,11 +68,27 @@ class BaseSearchKnowledgeNode(ISearchKnowledgeStepNode): result])[0:knowledge_setting.get('max_paragraph_char_number', 5000)] self.context['directly_return'] = directly_return - def execute(self, knowledge_id_list, knowledge_setting, question, show_knowledge, + def get_reference_content(self, fields: List[str]): + return self.workflow_manage.get_reference_field(fields[0], fields[1:]) + + def execute(self, knowledge_id_list, knowledge_setting, question, show_knowledge, search_scope_type, + search_scope_source, + search_scope_reference, exclude_paragraph_id_list=None, **kwargs) -> NodeResult: self.context['question'] = question self.context['show_knowledge'] = show_knowledge + + if search_scope_type == 'referencing': # 引用上一步知识库/文档 + if search_scope_source == 'knowledge': # 知识库 + knowledge_id_list = self.get_reference_content(search_scope_reference) + else: # 文档 + knowledge_id_list = QuerySet(Document).filter( + id__in=self.get_reference_content(search_scope_reference) + ).values_list( + 'knowledge_id', flat=True + ).distinct() + get_knowledge_list_of_authorized = DatabaseModelManage.get_model('get_knowledge_list_of_authorized') chat_user_type = self.workflow_manage.get_body().get('chat_user_type') if get_knowledge_list_of_authorized is not None and RoleConstants.CHAT_USER.value.name == chat_user_type: diff --git a/ui/src/workflow/nodes/search-document-node/index.vue b/ui/src/workflow/nodes/search-document-node/index.vue index e491f3b16..e4f2aa116 100644 --- a/ui/src/workflow/nodes/search-document-node/index.vue +++ b/ui/src/workflow/nodes/search-document-node/index.vue @@ -17,7 +17,9 @@ {{ $t('views.applicationWorkflow.nodes.searchDocumentNode.selectKnowledge') }} - + - - - diff --git a/ui/src/workflow/nodes/search-knowledge-node/index.vue b/ui/src/workflow/nodes/search-knowledge-node/index.vue index 81d7aef5a..348359284 100644 --- a/ui/src/workflow/nodes/search-knowledge-node/index.vue +++ b/ui/src/workflow/nodes/search-knowledge-node/index.vue @@ -14,12 +14,31 @@ -
+
{{ $t('views.application.form.relatedKnowledge.placeholder') }} @@ -42,6 +61,49 @@
+
+ + + + +
() const nodeCascaderRef = ref() @@ -155,6 +218,9 @@ const form = { }, question_reference_address: [], show_knowledge: false, + search_scope_type: 'custom', + search_scope_source: 'knowledge', + search_scope_reference: [], } const form_data = computed({ @@ -221,6 +287,15 @@ onMounted(() => { form_data.value.show_knowledge = form_data.value.show_knowledge ? form_data.value.show_knowledge : false + form_data.value.search_scope_type = form_data.value.search_scope_type + ? form_data.value.search_scope_type + : 'custom' + form_data.value.search_scope_source = form_data.value.search_scope_source + ? form_data.value.search_scope_source + : 'knowledge' + form_data.value.knowledge_id_list = form_data.value.knowledge_id_list + ? form_data.value.knowledge_id_list + : [] set(props.nodeModel, 'validate', validate) })