| 
									
										
										
										
											2024-11-18 16:57:39 +08:00
										 |  |  | import datetime | 
					
						
							| 
									
										
										
										
											2025-05-13 09:13:12 +08:00
										 |  |  | import logging | 
					
						
							| 
									
										
										
										
											2024-11-18 16:57:39 +08:00
										 |  |  | import time | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import click | 
					
						
							|  |  |  | from werkzeug.exceptions import NotFound | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import app | 
					
						
							|  |  |  | from configs import dify_config | 
					
						
							|  |  |  | from extensions.ext_database import db | 
					
						
							|  |  |  | from extensions.ext_redis import redis_client | 
					
						
							|  |  |  | from models.model import ( | 
					
						
							|  |  |  |     App, | 
					
						
							|  |  |  |     Message, | 
					
						
							|  |  |  |     MessageAgentThought, | 
					
						
							|  |  |  |     MessageAnnotation, | 
					
						
							|  |  |  |     MessageChain, | 
					
						
							|  |  |  |     MessageFeedback, | 
					
						
							|  |  |  |     MessageFile, | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | from models.web import SavedMessage | 
					
						
							|  |  |  | from services.feature_service import FeatureService | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-13 09:13:12 +08:00
										 |  |  | _logger = logging.getLogger(__name__) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-18 16:57:39 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | @app.celery.task(queue="dataset") | 
					
						
							|  |  |  | def clean_messages(): | 
					
						
							|  |  |  |     click.echo(click.style("Start clean messages.", fg="green")) | 
					
						
							|  |  |  |     start_at = time.perf_counter() | 
					
						
							|  |  |  |     plan_sandbox_clean_message_day = datetime.datetime.now() - datetime.timedelta( | 
					
						
							|  |  |  |         days=dify_config.PLAN_SANDBOX_CLEAN_MESSAGE_DAY_SETTING | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     while True: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             # Main query with join and filter | 
					
						
							|  |  |  |             messages = ( | 
					
						
							| 
									
										
										
										
											2025-05-30 14:10:09 +08:00
										 |  |  |                 db.session.query(Message) | 
					
						
							| 
									
										
										
										
											2024-11-18 16:57:39 +08:00
										 |  |  |                 .filter(Message.created_at < plan_sandbox_clean_message_day) | 
					
						
							|  |  |  |                 .order_by(Message.created_at.desc()) | 
					
						
							| 
									
										
										
										
											2024-12-09 16:12:30 +08:00
										 |  |  |                 .limit(100) | 
					
						
							|  |  |  |                 .all() | 
					
						
							| 
									
										
										
										
											2024-11-18 16:57:39 +08:00
										 |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         except NotFound: | 
					
						
							|  |  |  |             break | 
					
						
							| 
									
										
										
										
											2024-12-09 16:12:30 +08:00
										 |  |  |         if not messages: | 
					
						
							| 
									
										
										
										
											2024-11-18 16:57:39 +08:00
										 |  |  |             break | 
					
						
							| 
									
										
										
										
											2024-12-09 16:12:30 +08:00
										 |  |  |         for message in messages: | 
					
						
							|  |  |  |             plan_sandbox_clean_message_day = message.created_at | 
					
						
							| 
									
										
										
										
											2025-05-13 09:13:12 +08:00
										 |  |  |             app = db.session.query(App).filter_by(id=message.app_id).first() | 
					
						
							|  |  |  |             if not app: | 
					
						
							|  |  |  |                 _logger.warning( | 
					
						
							|  |  |  |                     "Expected App record to exist, but none was found, app_id=%s, message_id=%s", | 
					
						
							|  |  |  |                     message.app_id, | 
					
						
							|  |  |  |                     message.id, | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2024-11-18 16:57:39 +08:00
										 |  |  |             features_cache_key = f"features:{app.tenant_id}" | 
					
						
							|  |  |  |             plan_cache = redis_client.get(features_cache_key) | 
					
						
							|  |  |  |             if plan_cache is None: | 
					
						
							|  |  |  |                 features = FeatureService.get_features(app.tenant_id) | 
					
						
							|  |  |  |                 redis_client.setex(features_cache_key, 600, features.billing.subscription.plan) | 
					
						
							|  |  |  |                 plan = features.billing.subscription.plan | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 plan = plan_cache.decode() | 
					
						
							|  |  |  |             if plan == "sandbox": | 
					
						
							|  |  |  |                 # clean related message | 
					
						
							|  |  |  |                 db.session.query(MessageFeedback).filter(MessageFeedback.message_id == message.id).delete( | 
					
						
							|  |  |  |                     synchronize_session=False | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 db.session.query(MessageAnnotation).filter(MessageAnnotation.message_id == message.id).delete( | 
					
						
							|  |  |  |                     synchronize_session=False | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 db.session.query(MessageChain).filter(MessageChain.message_id == message.id).delete( | 
					
						
							|  |  |  |                     synchronize_session=False | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 db.session.query(MessageAgentThought).filter(MessageAgentThought.message_id == message.id).delete( | 
					
						
							|  |  |  |                     synchronize_session=False | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 db.session.query(MessageFile).filter(MessageFile.message_id == message.id).delete( | 
					
						
							|  |  |  |                     synchronize_session=False | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 db.session.query(SavedMessage).filter(SavedMessage.message_id == message.id).delete( | 
					
						
							|  |  |  |                     synchronize_session=False | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 db.session.query(Message).filter(Message.id == message.id).delete() | 
					
						
							|  |  |  |                 db.session.commit() | 
					
						
							|  |  |  |     end_at = time.perf_counter() | 
					
						
							| 
									
										
										
										
											2024-12-26 17:42:32 +08:00
										 |  |  |     click.echo(click.style("Cleaned messages from db success latency: {}".format(end_at - start_at), fg="green")) |