application_chat.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. # coding=utf-8
  2. """
  3. @project: MaxKB
  4. @Author:虎虎
  5. @file: application_chat.py
  6. @date:2025/6/10 11:00
  7. @desc:
  8. """
  9. import uuid_utils.compat as uuid
  10. from django.db.models import QuerySet
  11. from django.utils.translation import gettext_lazy as _
  12. from drf_spectacular.utils import extend_schema
  13. from rest_framework.request import Request
  14. from rest_framework.views import APIView
  15. from application.api.application_chat import ApplicationChatQueryAPI, ApplicationChatQueryPageAPI, \
  16. ApplicationChatExportAPI
  17. from application.models import ChatUserType, Application
  18. from application.serializers.application_chat import ApplicationChatQuerySerializers
  19. from chat.api.chat_api import ChatAPI, PromptGenerateAPI
  20. from chat.api.chat_authentication_api import ChatOpenAPI
  21. from chat.serializers.chat import OpenChatSerializers, ChatSerializers, DebugChatSerializers, PromptGenerateSerializer
  22. from common.auth import TokenAuth
  23. from common.auth.authentication import has_permissions
  24. from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants
  25. from common.log.log import log
  26. from common.result import result
  27. from common.utils.common import query_params_to_single_dict
  28. def get_application_operation_object(application_id):
  29. application_model = QuerySet(model=Application).filter(id=application_id).first()
  30. if application_model is not None:
  31. return {
  32. 'name': application_model.name
  33. }
  34. return {}
  35. class ApplicationChat(APIView):
  36. authentication_classes = [TokenAuth]
  37. @extend_schema(
  38. methods=['GET'],
  39. description=_("Get the conversation list"),
  40. summary=_("Get the conversation list"),
  41. operation_id=_("Get the conversation list"), # type: ignore
  42. request=ApplicationChatQueryAPI.get_request(),
  43. parameters=ApplicationChatQueryAPI.get_parameters(),
  44. responses=ApplicationChatQueryAPI.get_response(),
  45. tags=[_("Application/Conversation Log")] # type: ignore
  46. )
  47. @has_permissions(PermissionConstants.APPLICATION_CHAT_LOG_READ.get_workspace_application_permission(),
  48. PermissionConstants.APPLICATION_CHAT_LOG_READ.get_workspace_permission_workspace_manage_role(),
  49. ViewPermission([RoleConstants.USER.get_workspace_role()],
  50. [PermissionConstants.APPLICATION.get_workspace_application_permission()],
  51. CompareConstants.AND),
  52. RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  53. def get(self, request: Request, workspace_id: str, application_id: str):
  54. return result.success(ApplicationChatQuerySerializers(
  55. data={**query_params_to_single_dict(request.query_params), 'workspace_id': workspace_id,
  56. 'application_id': application_id,
  57. }).list())
  58. class Page(APIView):
  59. authentication_classes = [TokenAuth]
  60. @extend_schema(
  61. methods=['GET'],
  62. description=_("Get the conversation list by page"),
  63. summary=_("Get the conversation list by page"),
  64. operation_id=_("Get the conversation list by page"), # type: ignore
  65. request=ApplicationChatQueryPageAPI.get_request(),
  66. parameters=ApplicationChatQueryPageAPI.get_parameters(),
  67. responses=ApplicationChatQueryPageAPI.get_response(),
  68. tags=[_("Application/Conversation Log")] # type: ignore
  69. )
  70. @has_permissions(PermissionConstants.APPLICATION_CHAT_LOG_READ.get_workspace_application_permission(),
  71. PermissionConstants.APPLICATION_CHAT_LOG_READ.get_workspace_permission_workspace_manage_role(),
  72. ViewPermission([RoleConstants.USER.get_workspace_role()],
  73. [PermissionConstants.APPLICATION.get_workspace_application_permission()],
  74. CompareConstants.AND),
  75. RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  76. def get(self, request: Request, workspace_id: str, application_id: str, current_page: int, page_size: int):
  77. return result.success(ApplicationChatQuerySerializers(
  78. data={**query_params_to_single_dict(request.query_params), 'workspace_id': workspace_id,
  79. 'application_id': application_id,
  80. }).page(current_page=current_page,
  81. page_size=page_size))
  82. class Export(APIView):
  83. authentication_classes = [TokenAuth]
  84. @extend_schema(
  85. methods=['POST'],
  86. description=_("Export conversation"),
  87. summary=_("Export conversation"),
  88. operation_id=_("Export conversation"), # type: ignore
  89. request=ApplicationChatExportAPI.get_request(),
  90. parameters=ApplicationChatExportAPI.get_parameters(),
  91. responses=ApplicationChatExportAPI.get_response(),
  92. tags=[_("Application/Conversation Log")] # type: ignore
  93. )
  94. @has_permissions(PermissionConstants.APPLICATION_CHAT_LOG_EXPORT.get_workspace_application_permission(),
  95. PermissionConstants.APPLICATION_CHAT_LOG_EXPORT.get_workspace_permission_workspace_manage_role(),
  96. ViewPermission([RoleConstants.USER.get_workspace_role()],
  97. [PermissionConstants.APPLICATION.get_workspace_application_permission()],
  98. CompareConstants.AND),
  99. RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  100. def post(self, request: Request, workspace_id: str, application_id: str):
  101. return ApplicationChatQuerySerializers(
  102. data={**query_params_to_single_dict(request.query_params), 'workspace_id': workspace_id,
  103. 'application_id': application_id,
  104. }).export(request.data)
  105. class OpenView(APIView):
  106. authentication_classes = [TokenAuth]
  107. @extend_schema(
  108. methods=['GET'],
  109. description=_("Get a temporary session id based on the application id"),
  110. summary=_("Get a temporary session id based on the application id"),
  111. operation_id=_("Get a temporary session id based on the application id"), # type: ignore
  112. parameters=ChatOpenAPI.get_parameters(),
  113. responses=None,
  114. tags=[_('Application')] # type: ignore
  115. )
  116. @has_permissions(PermissionConstants.APPLICATION_READ.get_workspace_application_permission(),
  117. PermissionConstants.APPLICATION_READ.get_workspace_permission_workspace_manage_role(),
  118. ViewPermission([RoleConstants.USER.get_workspace_role()],
  119. [PermissionConstants.APPLICATION.get_workspace_application_permission()],
  120. CompareConstants.AND),
  121. RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  122. def get(self, request: Request, workspace_id: str, application_id: str):
  123. return result.success(OpenChatSerializers(
  124. data={'workspace_id': workspace_id, 'application_id': application_id,
  125. 'chat_user_id': str(uuid.uuid7()), 'chat_user_type': ChatUserType.ANONYMOUS_USER,
  126. 'debug': True}).open())
  127. class ChatView(APIView):
  128. authentication_classes = [TokenAuth]
  129. @extend_schema(
  130. methods=['POST'],
  131. description=_("dialogue"),
  132. summary=_("dialogue"),
  133. operation_id=_("dialogue"), # type: ignore
  134. request=ChatAPI.get_request(),
  135. parameters=ChatAPI.get_parameters(),
  136. responses=None,
  137. tags=[_('Application')] # type: ignore
  138. )
  139. def post(self, request: Request, chat_id: str):
  140. return DebugChatSerializers(data={'chat_id': chat_id}).chat(request.data)
  141. class PromptGenerateView(APIView):
  142. authentication_classes = [TokenAuth]
  143. @extend_schema(
  144. methods=['POST'],
  145. description=_("generate prompt"),
  146. summary=_("generate prompt"),
  147. operation_id=_("generate prompt"), # type: ignore
  148. request=PromptGenerateAPI.get_request(),
  149. parameters=PromptGenerateAPI.get_parameters(),
  150. responses=None,
  151. tags=[_('Application')] # type: ignore
  152. )
  153. @has_permissions(PermissionConstants.APPLICATION_READ.get_workspace_application_permission(),
  154. PermissionConstants.APPLICATION_READ.get_workspace_permission_workspace_manage_role(),
  155. ViewPermission([RoleConstants.USER.get_workspace_role()],
  156. [PermissionConstants.APPLICATION.get_workspace_application_permission()],
  157. CompareConstants.AND),
  158. RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  159. @log(menu='Application', operate='Generate prompt',
  160. get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
  161. def post(self, request: Request, workspace_id: str, model_id:str, application_id: str):
  162. return PromptGenerateSerializer(data={'workspace_id': workspace_id, 'model_id': model_id, 'application_id': application_id}).generate_prompt(instance=request.data)