Fix delete duplicate assistant (#6888)

### 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 <wenju.li@deepctr.cn>
This commit is contained in:
liwenju0 2025-04-09 19:10:08 +08:00 committed by GitHub
parent ae107f31d9
commit aa99c6b896
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 86 additions and 6 deletions

View File

@ -23,8 +23,7 @@ from api.db.services.knowledgebase_service import KnowledgebaseService
from api.db.services.llm_service import TenantLLMService from api.db.services.llm_service import TenantLLMService
from api.db.services.user_service import TenantService from api.db.services.user_service import TenantService
from api.utils import get_uuid 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_error_data_result, token_required, get_result, check_duplicate_ids
from api.utils.api_utils import get_result
@manager.route('/chats', methods=['POST']) # noqa: F821 @manager.route('/chats', methods=['POST']) # noqa: F821
@ -252,6 +251,8 @@ def update(tenant_id, chat_id):
@manager.route('/chats', methods=['DELETE']) # noqa: F821 @manager.route('/chats', methods=['DELETE']) # noqa: F821
@token_required @token_required
def delete(tenant_id): def delete(tenant_id):
errors = []
success_count = 0
req = request.json req = request.json
if not req: if not req:
ids = None ids = None
@ -264,11 +265,36 @@ def delete(tenant_id):
id_list.append(dia.id) id_list.append(dia.id)
else: else:
id_list = ids id_list = ids
unique_id_list, duplicate_messages = check_duplicate_ids(id_list, "chat")
id_list = unique_id_list
for id in id_list: for id in id_list:
if not DialogService.query(tenant_id=tenant_id, id=id, status=StatusEnum.VALID.value): 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} temp_dict = {"status": StatusEnum.INVALID.value}
DialogService.update_by_id(id, temp_dict) 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() return get_result()

View File

@ -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.file_service import FileService
from api.db.services.knowledgebase_service import KnowledgebaseService from api.db.services.knowledgebase_service import KnowledgebaseService
from api.utils import get_uuid 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 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): def delete(tenant_id, chat_id):
if not DialogService.query(id=chat_id, tenant_id=tenant_id, status=StatusEnum.VALID.value): 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") return get_error_data_result(message="You don't own the chat")
errors = []
success_count = 0
req = request.json req = request.json
convs = ConversationService.query(dialog_id=chat_id) convs = ConversationService.query(dialog_id=chat_id)
if not req: if not req:
@ -560,17 +563,44 @@ def delete(tenant_id, chat_id):
conv_list.append(conv.id) conv_list.append(conv.id)
else: else:
conv_list = ids conv_list = ids
unique_conv_ids, duplicate_messages = check_duplicate_ids(conv_list, "session")
conv_list = unique_conv_ids
for id in conv_list: for id in conv_list:
conv = ConversationService.query(id=id, dialog_id=chat_id) conv = ConversationService.query(id=id, dialog_id=chat_id)
if not conv: 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) 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() return get_result()
@manager.route("/agents/<agent_id>/sessions", methods=["DELETE"]) # noqa: F821 @manager.route("/agents/<agent_id>/sessions", methods=["DELETE"]) # noqa: F821
@token_required @token_required
def delete_agent_session(tenant_id, agent_id): def delete_agent_session(tenant_id, agent_id):
errors = []
success_count = 0
req = request.json req = request.json
cvs = UserCanvasService.query(user_id=tenant_id, id=agent_id) cvs = UserCanvasService.query(user_id=tenant_id, id=agent_id)
if not cvs: if not cvs:
@ -592,11 +622,35 @@ def delete_agent_session(tenant_id, agent_id):
else: else:
conv_list = ids 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: for session_id in conv_list:
conv = API4ConversationService.query(id=session_id, dialog_id=agent_id) conv = API4ConversationService.query(id=session_id, dialog_id=agent_id)
if not conv: 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) 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() return get_result()