Skip to content

Commit a755017

Browse files
committed
feat: add BatchGenerateRelated API for batch processing of related paragraphs
1 parent ac698e0 commit a755017

File tree

4 files changed

+69
-3
lines changed

4 files changed

+69
-3
lines changed

apps/knowledge/api/paragraph.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from common.mixins.api_mixin import APIMixin
55
from common.result import DefaultResultSerializer, ResultSerializer
66
from knowledge.serializers.common import BatchSerializer
7-
from knowledge.serializers.paragraph import ParagraphSerializer
7+
from knowledge.serializers.paragraph import ParagraphSerializer, ParagraphBatchGenerateRelatedSerializer
88
from knowledge.serializers.problem import ProblemSerializer
99

1010

@@ -106,6 +106,16 @@ def get_response():
106106
return DefaultResultSerializer
107107

108108

109+
class ParagraphBatchGenerateRelatedAPI(ParagraphCreateAPI):
110+
@staticmethod
111+
def get_request():
112+
return ParagraphBatchGenerateRelatedSerializer
113+
114+
@staticmethod
115+
def get_response():
116+
return DefaultResultSerializer
117+
118+
109119
class ParagraphGetAPI(APIMixin):
110120
@staticmethod
111121
def get_parameters():

apps/knowledge/serializers/paragraph.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,25 @@
33
from typing import Dict
44

55
import uuid_utils.compat as uuid
6+
from celery_once import AlreadyQueued
67
from django.db import transaction
78
from django.db.models import QuerySet, Count
89
from django.utils.translation import gettext_lazy as _
910
from rest_framework import serializers
1011

1112
from common.db.search import page_search
13+
from common.event import ListenerManagement
1214
from common.exception.app_exception import AppApiException
1315
from common.utils.common import post
14-
from knowledge.models import Paragraph, Problem, Document, ProblemParagraphMapping, SourceType
16+
from knowledge.models import Paragraph, Problem, Document, ProblemParagraphMapping, SourceType, TaskType, State
1517
from knowledge.serializers.common import ProblemParagraphObject, ProblemParagraphManage, \
1618
get_embedding_model_id_by_knowledge_id, update_document_char_length, BatchSerializer
1719
from knowledge.serializers.problem import ProblemInstanceSerializer, ProblemSerializer, ProblemSerializers
1820
from knowledge.task.embedding import embedding_by_paragraph, enable_embedding_by_paragraph, \
1921
disable_embedding_by_paragraph, \
2022
delete_embedding_by_paragraph, embedding_by_problem as embedding_by_problem_task, delete_embedding_by_paragraph_ids, \
2123
embedding_by_problem, delete_embedding_by_source
24+
from knowledge.task.generate import generate_related_by_paragraph_id_list
2225

2326

2427
class ParagraphSerializer(serializers.ModelSerializer):
@@ -47,6 +50,15 @@ class EditParagraphSerializers(serializers.Serializer):
4750
problem_list = ProblemInstanceSerializer(required=False, many=True)
4851

4952

53+
class ParagraphBatchGenerateRelatedSerializer(serializers.Serializer):
54+
paragraph_id_list = serializers.ListField(required=True, label=_('paragraph id list'),
55+
child=serializers.UUIDField(required=True, label=_('paragraph id')))
56+
model_id = serializers.UUIDField(required=True, label=_('model id'))
57+
prompt = serializers.CharField(required=True, label=_('prompt'), max_length=102400, allow_null=True,
58+
allow_blank=True)
59+
document_id = serializers.UUIDField(required=True, label=_('document id'))
60+
61+
5062
class ParagraphSerializers(serializers.Serializer):
5163
title = serializers.CharField(required=False, max_length=256, label=_('section title'), allow_null=True,
5264
allow_blank=True)
@@ -379,6 +391,29 @@ def batch_delete(self, instance: Dict, with_valid=True):
379391
delete_embedding_by_paragraph_ids(paragraph_id_list)
380392
return True
381393

394+
def batch_generate_related(self, instance: Dict, with_valid=True):
395+
if with_valid:
396+
self.is_valid(raise_exception=True)
397+
paragraph_id_list = instance.get("paragraph_id_list")
398+
model_id = instance.get("model_id")
399+
prompt = instance.get("prompt")
400+
document_id = self.data.get('document_id')
401+
ListenerManagement.update_status(
402+
QuerySet(Document).filter(id=document_id),
403+
TaskType.GENERATE_PROBLEM,
404+
State.PENDING
405+
)
406+
ListenerManagement.update_status(
407+
QuerySet(Paragraph).filter(id__in=paragraph_id_list),
408+
TaskType.GENERATE_PROBLEM,
409+
State.PENDING
410+
)
411+
ListenerManagement.get_aggregation_document_status(document_id)()
412+
try:
413+
generate_related_by_paragraph_id_list.delay(document_id, paragraph_id_list, model_id, prompt)
414+
except AlreadyQueued as e:
415+
raise AppApiException(500, _('The task is being executed, please do not send it again.'))
416+
382417

383418
def delete_problems_and_mappings(paragraph_ids):
384419
problem_paragraph_mappings = ProblemParagraphMapping.objects.filter(paragraph_id__in=paragraph_ids)

apps/knowledge/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/document/<str:document_id>/batch_cancel_task', views.DocumentView.BatchCancelTask.as_view()),
3232
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/document/<str:document_id>/paragraph', views.ParagraphView.as_view()),
3333
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/document/<str:document_id>/paragraph/batch_delete', views.ParagraphView.BatchDelete.as_view()),
34+
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/document/<str:document_id>/paragraph/batch_generate_related', views.ParagraphView.BatchGenerateRelated.as_view()),
3435
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/document/<str:document_id>/paragraph/<str:paragraph_id>', views.ParagraphView.Operate.as_view()),
3536
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/document/<str:document_id>/paragraph/<str:paragraph_id>/problem', views.ParagraphView.Problem.as_view()),
3637
path( 'workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/document/<str:document_id>/paragraph/<int:current_page>/<int:page_size>', views.ParagraphView.Page.as_view()),

apps/knowledge/views/paragraph.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
from common.result import result
1010
from common.utils.common import query_params_to_single_dict
1111
from knowledge.api.paragraph import ParagraphReadAPI, ParagraphCreateAPI, ParagraphBatchDeleteAPI, ParagraphEditAPI, \
12-
ParagraphGetAPI, ProblemCreateAPI, UnAssociationAPI, AssociationAPI, ParagraphPageAPI
12+
ParagraphGetAPI, ProblemCreateAPI, UnAssociationAPI, AssociationAPI, ParagraphPageAPI, \
13+
ParagraphBatchGenerateRelatedAPI
1314
from knowledge.serializers.paragraph import ParagraphSerializers
1415

1516

@@ -70,6 +71,25 @@ def put(self, request: Request, workspace_id: str, knowledge_id: str, document_i
7071
data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'document_id': document_id}
7172
).batch_delete(request.data))
7273

74+
class BatchGenerateRelated(APIView):
75+
authentication_classes = [TokenAuth]
76+
77+
@extend_schema(
78+
methods=['PUT'],
79+
summary=_('Batch Generate Related'),
80+
description=_('Batch Generate Related'),
81+
operation_id=_('Batch Generate Related'),
82+
parameters=ParagraphBatchGenerateRelatedAPI.get_parameters(),
83+
request=ParagraphBatchGenerateRelatedAPI.get_request(),
84+
responses=ParagraphBatchGenerateRelatedAPI.get_response(),
85+
tags=[_('Knowledge Base/Documentation/Paragraph')]
86+
)
87+
@has_permissions(PermissionConstants.DOCUMENT_EDIT.get_workspace_permission())
88+
def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
89+
return result.success(ParagraphSerializers.Batch(
90+
data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'document_id': document_id}
91+
).batch_generate_related(request.data))
92+
7393
class Operate(APIView):
7494
authentication_classes = [TokenAuth]
7595

0 commit comments

Comments
 (0)