| 
					
				 | 
			
			
				@@ -1,5 +1,8 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from threading import Thread 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from typing import Optional, Union 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from flask import Flask, current_app 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from core.app.entities.app_invoke_entities import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     AdvancedChatAppGenerateEntity, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     AgentChatAppGenerateEntity, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -19,9 +22,10 @@ from core.app.entities.task_entities import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     MessageReplaceStreamResponse, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     MessageStreamResponse, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from core.llm_generator.llm_generator import LLMGenerator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from core.tools.tool_file_manager import ToolFileManager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from extensions.ext_database import db 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from models.model import MessageAnnotation, MessageFile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from models.model import AppMode, Conversation, MessageAnnotation, MessageFile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from services.annotation_service import AppAnnotationService 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -34,6 +38,59 @@ class MessageCycleManage: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     _task_state: Union[EasyUITaskState, AdvancedChatTaskState] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def _generate_conversation_name(self, conversation: Conversation, query: str) -> Optional[Thread]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Generate conversation name. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        :param conversation: conversation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        :param query: query 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        :return: thread 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        is_first_message = self._application_generate_entity.conversation_id is None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        extras = self._application_generate_entity.extras 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        auto_generate_conversation_name = extras.get('auto_generate_conversation_name', True) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if auto_generate_conversation_name and is_first_message: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # start generate thread 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            thread = Thread(target=self._generate_conversation_name_worker, kwargs={ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                'flask_app': current_app._get_current_object(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                'conversation_id': conversation.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                'query': query 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            thread.start() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return thread 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def _generate_conversation_name_worker(self, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                           flask_app: Flask, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                           conversation_id: str, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                           query: str): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        with flask_app.app_context(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # get conversation and message 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            conversation = ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                db.session.query(Conversation) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .filter(Conversation.id == conversation_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .first() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if conversation.mode != AppMode.COMPLETION.value: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                app_model = conversation.app 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if not app_model: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                # generate conversation name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    name = LLMGenerator.generate_conversation_name(app_model.tenant_id, query) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    conversation.name = name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                except: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    pass 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                db.session.merge(conversation) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                db.session.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                db.session.close() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def _handle_annotation_reply(self, event: QueueAnnotationReplyEvent) -> Optional[MessageAnnotation]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Handle annotation reply. 
			 |