|  | @@ -3,7 +3,7 @@ import logging
 | 
	
		
			
				|  |  |  import threading
 | 
	
		
			
				|  |  |  import time
 | 
	
		
			
				|  |  |  import uuid
 | 
	
		
			
				|  |  | -from typing import Generator, Union, Any
 | 
	
		
			
				|  |  | +from typing import Generator, Union, Any, Optional
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  from flask import current_app, Flask
 | 
	
		
			
				|  |  |  from redis.client import PubSub
 | 
	
	
		
			
				|  | @@ -141,12 +141,12 @@ class CompletionService:
 | 
	
		
			
				|  |  |          generate_worker_thread = threading.Thread(target=cls.generate_worker, kwargs={
 | 
	
		
			
				|  |  |              'flask_app': current_app._get_current_object(),
 | 
	
		
			
				|  |  |              'generate_task_id': generate_task_id,
 | 
	
		
			
				|  |  | -            'app_model': app_model,
 | 
	
		
			
				|  |  | +            'detached_app_model': app_model,
 | 
	
		
			
				|  |  |              'app_model_config': app_model_config,
 | 
	
		
			
				|  |  |              'query': query,
 | 
	
		
			
				|  |  |              'inputs': inputs,
 | 
	
		
			
				|  |  | -            'user': user,
 | 
	
		
			
				|  |  | -            'conversation': conversation,
 | 
	
		
			
				|  |  | +            'detached_user': user,
 | 
	
		
			
				|  |  | +            'detached_conversation': conversation,
 | 
	
		
			
				|  |  |              'streaming': streaming,
 | 
	
		
			
				|  |  |              'is_model_config_override': is_model_config_override,
 | 
	
		
			
				|  |  |              'retriever_from': args['retriever_from'] if 'retriever_from' in args else 'dev'
 | 
	
	
		
			
				|  | @@ -171,18 +171,22 @@ class CompletionService:
 | 
	
		
			
				|  |  |          return user
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @classmethod
 | 
	
		
			
				|  |  | -    def generate_worker(cls, flask_app: Flask, generate_task_id: str, app_model: App, app_model_config: AppModelConfig,
 | 
	
		
			
				|  |  | -                        query: str, inputs: dict, user: Union[Account, EndUser],
 | 
	
		
			
				|  |  | -                        conversation: Conversation, streaming: bool, is_model_config_override: bool,
 | 
	
		
			
				|  |  | +    def generate_worker(cls, flask_app: Flask, generate_task_id: str, detached_app_model: App, app_model_config: AppModelConfig,
 | 
	
		
			
				|  |  | +                        query: str, inputs: dict, detached_user: Union[Account, EndUser],
 | 
	
		
			
				|  |  | +                        detached_conversation: Optional[Conversation], streaming: bool, is_model_config_override: bool,
 | 
	
		
			
				|  |  |                          retriever_from: str = 'dev'):
 | 
	
		
			
				|  |  |          with flask_app.app_context():
 | 
	
		
			
				|  |  | -            try:
 | 
	
		
			
				|  |  | -                if conversation:
 | 
	
		
			
				|  |  | -                    # fixed the state of the conversation object when it detached from the original session
 | 
	
		
			
				|  |  | -                    conversation = db.session.query(Conversation).filter_by(id=conversation.id).first()
 | 
	
		
			
				|  |  | +            # fixed the state of the model object when it detached from the original session
 | 
	
		
			
				|  |  | +            user = db.session.merge(detached_user)
 | 
	
		
			
				|  |  | +            app_model = db.session.merge(detached_app_model)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                # run
 | 
	
		
			
				|  |  | +            if detached_conversation:
 | 
	
		
			
				|  |  | +                conversation = db.session.merge(detached_conversation)
 | 
	
		
			
				|  |  | +            else:
 | 
	
		
			
				|  |  | +                conversation = None
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            try:
 | 
	
		
			
				|  |  | +                # run
 | 
	
		
			
				|  |  |                  Completion.generate(
 | 
	
		
			
				|  |  |                      task_id=generate_task_id,
 | 
	
		
			
				|  |  |                      app=app_model,
 | 
	
	
		
			
				|  | @@ -210,12 +214,14 @@ class CompletionService:
 | 
	
		
			
				|  |  |                  db.session.commit()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @classmethod
 | 
	
		
			
				|  |  | -    def countdown_and_close(cls, flask_app: Flask, worker_thread, pubsub, user, generate_task_id) -> threading.Thread:
 | 
	
		
			
				|  |  | +    def countdown_and_close(cls, flask_app: Flask, worker_thread, pubsub, detached_user, generate_task_id) -> threading.Thread:
 | 
	
		
			
				|  |  |          # wait for 10 minutes to close the thread
 | 
	
		
			
				|  |  |          timeout = 600
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          def close_pubsub():
 | 
	
		
			
				|  |  |              with flask_app.app_context():
 | 
	
		
			
				|  |  | +                user = db.session.merge(detached_user)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  sleep_iterations = 0
 | 
	
		
			
				|  |  |                  while sleep_iterations < timeout and worker_thread.is_alive():
 | 
	
		
			
				|  |  |                      if sleep_iterations > 0 and sleep_iterations % 10 == 0:
 | 
	
	
		
			
				|  | @@ -279,11 +285,11 @@ class CompletionService:
 | 
	
		
			
				|  |  |          generate_worker_thread = threading.Thread(target=cls.generate_more_like_this_worker, kwargs={
 | 
	
		
			
				|  |  |              'flask_app': current_app._get_current_object(),
 | 
	
		
			
				|  |  |              'generate_task_id': generate_task_id,
 | 
	
		
			
				|  |  | -            'app_model': app_model,
 | 
	
		
			
				|  |  | +            'detached_app_model': app_model,
 | 
	
		
			
				|  |  |              'app_model_config': app_model_config,
 | 
	
		
			
				|  |  | -            'message': message,
 | 
	
		
			
				|  |  | +            'detached_message': message,
 | 
	
		
			
				|  |  |              'pre_prompt': pre_prompt,
 | 
	
		
			
				|  |  | -            'user': user,
 | 
	
		
			
				|  |  | +            'detached_user': user,
 | 
	
		
			
				|  |  |              'streaming': streaming
 | 
	
		
			
				|  |  |          })
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -294,10 +300,15 @@ class CompletionService:
 | 
	
		
			
				|  |  |          return cls.compact_response(pubsub, streaming)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @classmethod
 | 
	
		
			
				|  |  | -    def generate_more_like_this_worker(cls, flask_app: Flask, generate_task_id: str, app_model: App,
 | 
	
		
			
				|  |  | -                                       app_model_config: AppModelConfig, message: Message, pre_prompt: str,
 | 
	
		
			
				|  |  | -                                       user: Union[Account, EndUser], streaming: bool):
 | 
	
		
			
				|  |  | +    def generate_more_like_this_worker(cls, flask_app: Flask, generate_task_id: str, detached_app_model: App,
 | 
	
		
			
				|  |  | +                                       app_model_config: AppModelConfig, detached_message: Message, pre_prompt: str,
 | 
	
		
			
				|  |  | +                                       detached_user: Union[Account, EndUser], streaming: bool):
 | 
	
		
			
				|  |  |          with flask_app.app_context():
 | 
	
		
			
				|  |  | +            # fixed the state of the model object when it detached from the original session
 | 
	
		
			
				|  |  | +            user = db.session.merge(detached_user)
 | 
	
		
			
				|  |  | +            app_model = db.session.merge(detached_app_model)
 | 
	
		
			
				|  |  | +            message = db.session.merge(detached_message)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              try:
 | 
	
		
			
				|  |  |                  # run
 | 
	
		
			
				|  |  |                  Completion.generate_more_like_this(
 |