|  | @@ -14,8 +14,6 @@ from configs import dify_config
 | 
	
		
			
				|  |  |  from core.errors.error import LLMBadRequestError, ProviderTokenNotInitError
 | 
	
		
			
				|  |  |  from core.model_manager import ModelManager
 | 
	
		
			
				|  |  |  from core.model_runtime.entities.model_entities import ModelType
 | 
	
		
			
				|  |  | -from core.rag.datasource.keyword.keyword_factory import Keyword
 | 
	
		
			
				|  |  | -from core.rag.models.document import Document as RAGDocument
 | 
	
		
			
				|  |  |  from core.rag.retrieval.retrieval_methods import RetrievalMethod
 | 
	
		
			
				|  |  |  from events.dataset_event import dataset_was_deleted
 | 
	
		
			
				|  |  |  from events.document_event import document_was_deleted
 | 
	
	
		
			
				|  | @@ -37,6 +35,7 @@ from models.dataset import (
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  from models.model import UploadFile
 | 
	
		
			
				|  |  |  from models.source import DataSourceOauthBinding
 | 
	
		
			
				|  |  | +from services.entities.knowledge_entities.knowledge_entities import SegmentUpdateEntity
 | 
	
		
			
				|  |  |  from services.errors.account import NoPermissionError
 | 
	
		
			
				|  |  |  from services.errors.dataset import DatasetNameDuplicateError
 | 
	
		
			
				|  |  |  from services.errors.document import DocumentIndexingError
 | 
	
	
		
			
				|  | @@ -1503,12 +1502,13 @@ class SegmentService:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @classmethod
 | 
	
		
			
				|  |  |      def update_segment(cls, args: dict, segment: DocumentSegment, document: Document, dataset: Dataset):
 | 
	
		
			
				|  |  | +        segment_update_entity = SegmentUpdateEntity(**args)
 | 
	
		
			
				|  |  |          indexing_cache_key = "segment_{}_indexing".format(segment.id)
 | 
	
		
			
				|  |  |          cache_result = redis_client.get(indexing_cache_key)
 | 
	
		
			
				|  |  |          if cache_result is not None:
 | 
	
		
			
				|  |  |              raise ValueError("Segment is indexing, please try again later")
 | 
	
		
			
				|  |  | -        if "enabled" in args and args["enabled"] is not None:
 | 
	
		
			
				|  |  | -            action = args["enabled"]
 | 
	
		
			
				|  |  | +        if segment_update_entity.enabled is not None:
 | 
	
		
			
				|  |  | +            action = segment_update_entity.enabled
 | 
	
		
			
				|  |  |              if segment.enabled != action:
 | 
	
		
			
				|  |  |                  if not action:
 | 
	
		
			
				|  |  |                      segment.enabled = action
 | 
	
	
		
			
				|  | @@ -1521,37 +1521,26 @@ class SegmentService:
 | 
	
		
			
				|  |  |                      disable_segment_from_index_task.delay(segment.id)
 | 
	
		
			
				|  |  |                      return segment
 | 
	
		
			
				|  |  |          if not segment.enabled:
 | 
	
		
			
				|  |  | -            if "enabled" in args and args["enabled"] is not None:
 | 
	
		
			
				|  |  | -                if not args["enabled"]:
 | 
	
		
			
				|  |  | +            if segment_update_entity.enabled is not None:
 | 
	
		
			
				|  |  | +                if not segment_update_entity.enabled:
 | 
	
		
			
				|  |  |                      raise ValueError("Can't update disabled segment")
 | 
	
		
			
				|  |  |              else:
 | 
	
		
			
				|  |  |                  raise ValueError("Can't update disabled segment")
 | 
	
		
			
				|  |  |          try:
 | 
	
		
			
				|  |  | -            content = args["content"]
 | 
	
		
			
				|  |  | +            content = segment_update_entity.content
 | 
	
		
			
				|  |  |              if segment.content == content:
 | 
	
		
			
				|  |  |                  if document.doc_form == "qa_model":
 | 
	
		
			
				|  |  | -                    segment.answer = args["answer"]
 | 
	
		
			
				|  |  | -                if args.get("keywords"):
 | 
	
		
			
				|  |  | -                    segment.keywords = args["keywords"]
 | 
	
		
			
				|  |  | +                    segment.answer = segment_update_entity.answer
 | 
	
		
			
				|  |  | +                if segment_update_entity.keywords:
 | 
	
		
			
				|  |  | +                    segment.keywords = segment_update_entity.keywords
 | 
	
		
			
				|  |  |                  segment.enabled = True
 | 
	
		
			
				|  |  |                  segment.disabled_at = None
 | 
	
		
			
				|  |  |                  segment.disabled_by = None
 | 
	
		
			
				|  |  |                  db.session.add(segment)
 | 
	
		
			
				|  |  |                  db.session.commit()
 | 
	
		
			
				|  |  |                  # update segment index task
 | 
	
		
			
				|  |  | -                if "keywords" in args:
 | 
	
		
			
				|  |  | -                    keyword = Keyword(dataset)
 | 
	
		
			
				|  |  | -                    keyword.delete_by_ids([segment.index_node_id])
 | 
	
		
			
				|  |  | -                    document = RAGDocument(
 | 
	
		
			
				|  |  | -                        page_content=segment.content,
 | 
	
		
			
				|  |  | -                        metadata={
 | 
	
		
			
				|  |  | -                            "doc_id": segment.index_node_id,
 | 
	
		
			
				|  |  | -                            "doc_hash": segment.index_node_hash,
 | 
	
		
			
				|  |  | -                            "document_id": segment.document_id,
 | 
	
		
			
				|  |  | -                            "dataset_id": segment.dataset_id,
 | 
	
		
			
				|  |  | -                        },
 | 
	
		
			
				|  |  | -                    )
 | 
	
		
			
				|  |  | -                    keyword.add_texts([document], keywords_list=[args["keywords"]])
 | 
	
		
			
				|  |  | +                if segment_update_entity.enabled:
 | 
	
		
			
				|  |  | +                    VectorService.create_segments_vector([segment_update_entity.keywords], [segment], dataset)
 | 
	
		
			
				|  |  |              else:
 | 
	
		
			
				|  |  |                  segment_hash = helper.generate_text_hash(content)
 | 
	
		
			
				|  |  |                  tokens = 0
 | 
	
	
		
			
				|  | @@ -1579,11 +1568,11 @@ class SegmentService:
 | 
	
		
			
				|  |  |                  segment.disabled_at = None
 | 
	
		
			
				|  |  |                  segment.disabled_by = None
 | 
	
		
			
				|  |  |                  if document.doc_form == "qa_model":
 | 
	
		
			
				|  |  | -                    segment.answer = args["answer"]
 | 
	
		
			
				|  |  | +                    segment.answer = segment_update_entity.answer
 | 
	
		
			
				|  |  |                  db.session.add(segment)
 | 
	
		
			
				|  |  |                  db.session.commit()
 | 
	
		
			
				|  |  |                  # update segment vector index
 | 
	
		
			
				|  |  | -                VectorService.update_segment_vector(args["keywords"], segment, dataset)
 | 
	
		
			
				|  |  | +                VectorService.update_segment_vector(segment_update_entity.keywords, segment, dataset)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          except Exception as e:
 | 
	
		
			
				|  |  |              logging.exception("update segment index failed")
 |