From aa99c6b896a67684c7f67663da1bf6825012ddbd Mon Sep 17 00:00:00 2001 From: liwenju0 Date: Wed, 9 Apr 2025 19:10:08 +0800 Subject: [PATCH] Fix delete duplicate assistant (#6888) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### What problem does this PR solve? resolve this issue:https://github.com/infiniflow/ragflow/issues/6876 ### Type of change - [x] Bug Fix (non-breaking change which fixes an issue) --------- Co-authored-by: wenju.li --- api/apps/sdk/chat.py | 32 +++++++++++++++++++--- api/apps/sdk/session.py | 60 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 86 insertions(+), 6 deletions(-) diff --git a/api/apps/sdk/chat.py b/api/apps/sdk/chat.py index 1fd099c4..14c9f40d 100644 --- a/api/apps/sdk/chat.py +++ b/api/apps/sdk/chat.py @@ -23,8 +23,7 @@ from api.db.services.knowledgebase_service import KnowledgebaseService from api.db.services.llm_service import TenantLLMService from api.db.services.user_service import TenantService from api.utils import get_uuid -from api.utils.api_utils import get_error_data_result, token_required -from api.utils.api_utils import get_result +from api.utils.api_utils import get_error_data_result, token_required, get_result, check_duplicate_ids @manager.route('/chats', methods=['POST']) # noqa: F821 @@ -252,6 +251,8 @@ def update(tenant_id, chat_id): @manager.route('/chats', methods=['DELETE']) # noqa: F821 @token_required def delete(tenant_id): + errors = [] + success_count = 0 req = request.json if not req: ids = None @@ -264,11 +265,36 @@ def delete(tenant_id): id_list.append(dia.id) else: id_list = ids + + unique_id_list, duplicate_messages = check_duplicate_ids(id_list, "chat") + id_list = unique_id_list + for id in id_list: if not DialogService.query(tenant_id=tenant_id, id=id, status=StatusEnum.VALID.value): - return get_error_data_result(message=f"You don't own the chat {id}") + errors.append(f"You don't own the chat {id}") + continue temp_dict = {"status": StatusEnum.INVALID.value} DialogService.update_by_id(id, temp_dict) + success_count += 1 + + if errors: + if success_count > 0: + return get_result( + data={"success_count": success_count, "errors": errors}, + message=f"Partially deleted {success_count} chats with {len(errors)} errors" + ) + else: + return get_error_data_result(message="; ".join(errors)) + + if duplicate_messages: + if success_count > 0: + return get_result( + message=f"Partially deleted {success_count} chats with {len(duplicate_messages)} errors", + data={"success_count": success_count, "errors": duplicate_messages} + ) + else: + return get_error_data_result(message=";".join(duplicate_messages)) + return get_result() diff --git a/api/apps/sdk/session.py b/api/apps/sdk/session.py index 1498a1c5..05e5bb83 100644 --- a/api/apps/sdk/session.py +++ b/api/apps/sdk/session.py @@ -31,7 +31,7 @@ from api.db.services.dialog_service import DialogService, ask, chat from api.db.services.file_service import FileService from api.db.services.knowledgebase_service import KnowledgebaseService from api.utils import get_uuid -from api.utils.api_utils import get_result, token_required, get_data_openai, get_error_data_result, validate_request +from api.utils.api_utils import get_result, token_required, get_data_openai, get_error_data_result, validate_request, check_duplicate_ids from api.db.services.llm_service import LLMBundle @@ -547,6 +547,9 @@ def list_agent_session(tenant_id, agent_id): def delete(tenant_id, chat_id): if not DialogService.query(id=chat_id, tenant_id=tenant_id, status=StatusEnum.VALID.value): return get_error_data_result(message="You don't own the chat") + + errors = [] + success_count = 0 req = request.json convs = ConversationService.query(dialog_id=chat_id) if not req: @@ -560,17 +563,44 @@ def delete(tenant_id, chat_id): conv_list.append(conv.id) else: conv_list = ids + + unique_conv_ids, duplicate_messages = check_duplicate_ids(conv_list, "session") + conv_list = unique_conv_ids + for id in conv_list: conv = ConversationService.query(id=id, dialog_id=chat_id) if not conv: - return get_error_data_result(message="The chat doesn't own the session") + errors.append(f"The chat doesn't own the session {id}") + continue ConversationService.delete_by_id(id) + success_count += 1 + + if errors: + if success_count > 0: + return get_result( + data={"success_count": success_count, "errors": errors}, + message=f"Partially deleted {success_count} sessions with {len(errors)} errors" + ) + else: + return get_error_data_result(message="; ".join(errors)) + + if duplicate_messages: + if success_count > 0: + return get_result( + message=f"Partially deleted {success_count} sessions with {len(duplicate_messages)} errors", + data={"success_count": success_count, "errors": duplicate_messages} + ) + else: + return get_error_data_result(message=";".join(duplicate_messages)) + return get_result() @manager.route("/agents//sessions", methods=["DELETE"]) # noqa: F821 @token_required def delete_agent_session(tenant_id, agent_id): + errors = [] + success_count = 0 req = request.json cvs = UserCanvasService.query(user_id=tenant_id, id=agent_id) if not cvs: @@ -592,11 +622,35 @@ def delete_agent_session(tenant_id, agent_id): else: conv_list = ids + unique_conv_ids, duplicate_messages = check_duplicate_ids(conv_list, "session") + conv_list = unique_conv_ids + for session_id in conv_list: conv = API4ConversationService.query(id=session_id, dialog_id=agent_id) if not conv: - return get_error_data_result(f"The agent doesn't own the session ${session_id}") + errors.append(f"The agent doesn't own the session {session_id}") + continue API4ConversationService.delete_by_id(session_id) + success_count += 1 + + if errors: + if success_count > 0: + return get_result( + data={"success_count": success_count, "errors": errors}, + message=f"Partially deleted {success_count} sessions with {len(errors)} errors" + ) + else: + return get_error_data_result(message="; ".join(errors)) + + if duplicate_messages: + if success_count > 0: + return get_result( + message=f"Partially deleted {success_count} sessions with {len(duplicate_messages)} errors", + data={"success_count": success_count, "errors": duplicate_messages} + ) + else: + return get_error_data_result(message=";".join(duplicate_messages)) + return get_result()