3131from knowledge .task .generate import generate_related_by_knowledge_id
3232from knowledge .task .sync import sync_web_knowledge , sync_replace_web_knowledge
3333from maxkb .conf import PROJECT_DIR
34+ from models_provider .models import Model
3435
3536
3637class KnowledgeModelSerializer (serializers .ModelSerializer ):
@@ -80,6 +81,7 @@ def is_valid(self, *, knowledge: Knowledge = None):
8081 valid_class = knowledge_meta_valid_map .get (knowledge .type )
8182 valid_class (data = self .data .get ('meta' )).is_valid (raise_exception = True )
8283
84+
8385class HitTestSerializer (serializers .Serializer ):
8486 query_text = serializers .CharField (required = True , label = _ ('query text' ))
8587 top_number = serializers .IntegerField (required = True , max_value = 10000 , min_value = 1 , label = _ ("top number" ))
@@ -89,6 +91,7 @@ class HitTestSerializer(serializers.Serializer):
8991 message = _ ('The type only supports embedding|keywords|blend' ), code = 500 )
9092 ])
9193
94+
9295class KnowledgeSerializer (serializers .Serializer ):
9396 class Query (serializers .Serializer ):
9497 workspace_id = serializers .CharField (required = True )
@@ -157,6 +160,36 @@ class Operate(serializers.Serializer):
157160 workspace_id = serializers .CharField (required = True , label = _ ('workspace id' ))
158161 knowledge_id = serializers .UUIDField (required = True , label = _ ('knowledge id' ))
159162
163+ @transaction .atomic
164+ def embedding (self , with_valid = True ):
165+ if with_valid :
166+ self .is_valid (raise_exception = True )
167+ knowledge_id = self .data .get ('knowledge_id' )
168+ knowledge = QuerySet (Knowledge ).filter (id = knowledge_id ).first ()
169+ embedding_model_id = knowledge .embedding_mode_id
170+ knowledge_user_id = knowledge .user_id
171+ embedding_model = QuerySet (Model ).filter (id = embedding_model_id ).first ()
172+ if embedding_model is None :
173+ raise AppApiException (500 , _ ('Model does not exist' ))
174+ if embedding_model .permission_type == 'PRIVATE' and knowledge_user_id != embedding_model .user_id :
175+ raise AppApiException (500 , _ ('No permission to use this model' ) + f"{ embedding_model .name } " )
176+ ListenerManagement .update_status (
177+ QuerySet (Document ).filter (knowledge_id = self .data .get ('knowledge_id' )),
178+ TaskType .EMBEDDING ,
179+ State .PENDING
180+ )
181+ ListenerManagement .update_status (
182+ QuerySet (Paragraph ).filter (knowledge_id = self .data .get ('knowledge_id' )),
183+ TaskType .EMBEDDING ,
184+ State .PENDING
185+ )
186+ ListenerManagement .get_aggregation_document_status_by_knowledge_id (self .data .get ('knowledge_id' ))()
187+ embedding_model_id = get_embedding_model_id_by_knowledge_id (self .data .get ('knowledge_id' ))
188+ try :
189+ embedding_by_knowledge .delay (knowledge_id , embedding_model_id )
190+ except AlreadyQueued as e :
191+ raise AppApiException (500 , _ ('Failed to send the vectorization task, please try again later!' ))
192+
160193 def generate_related (self , instance : Dict , with_valid = True ):
161194 if with_valid :
162195 self .is_valid (raise_exception = True )
0 commit comments