2023-11-16 05:16:27 +00:00
|
|
|
|
# coding=utf-8
|
|
|
|
|
|
"""
|
|
|
|
|
|
@project: maxkb
|
|
|
|
|
|
@Author:虎
|
|
|
|
|
|
@file: chat_views.py
|
|
|
|
|
|
@date:2023/11/14 9:53
|
|
|
|
|
|
@desc:
|
|
|
|
|
|
"""
|
2024-09-09 06:47:25 +00:00
|
|
|
|
|
2025-01-13 11:05:08 +00:00
|
|
|
|
from django.utils.translation import gettext_lazy as _
|
2025-02-28 03:51:14 +00:00
|
|
|
|
from drf_yasg import openapi
|
2023-11-16 05:16:27 +00:00
|
|
|
|
from drf_yasg.utils import swagger_auto_schema
|
|
|
|
|
|
from rest_framework.decorators import action
|
2025-02-28 03:51:14 +00:00
|
|
|
|
from rest_framework.parsers import MultiPartParser
|
2023-11-16 05:16:27 +00:00
|
|
|
|
from rest_framework.request import Request
|
|
|
|
|
|
from rest_framework.views import APIView
|
|
|
|
|
|
|
2024-09-09 06:47:25 +00:00
|
|
|
|
from application.serializers.chat_message_serializers import ChatMessageSerializer, OpenAIChatSerializer
|
2023-11-16 05:16:27 +00:00
|
|
|
|
from application.serializers.chat_serializers import ChatSerializers, ChatRecordSerializer
|
2024-05-20 09:50:14 +00:00
|
|
|
|
from application.swagger_api.chat_api import ChatApi, VoteApi, ChatRecordApi, ImproveApi, ChatRecordImproveApi, \
|
2024-09-09 06:47:25 +00:00
|
|
|
|
ChatClientHistoryApi, OpenAIChatApi
|
|
|
|
|
|
from common.auth import TokenAuth, has_permissions, OpenAIKeyAuth
|
2024-03-13 21:43:01 +00:00
|
|
|
|
from common.constants.authentication_type import AuthenticationType
|
2023-11-16 05:16:27 +00:00
|
|
|
|
from common.constants.permission_constants import Permission, Group, Operate, \
|
|
|
|
|
|
RoleConstants, ViewPermission, CompareConstants
|
2025-03-19 07:45:10 +00:00
|
|
|
|
from common.log.log import log
|
2023-11-16 05:16:27 +00:00
|
|
|
|
from common.response import result
|
2024-03-13 13:50:57 +00:00
|
|
|
|
from common.util.common import query_params_to_single_dict
|
2024-11-11 07:48:56 +00:00
|
|
|
|
from dataset.serializers.file_serializers import FileSerializer
|
2023-11-16 05:16:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
2024-09-09 06:47:25 +00:00
|
|
|
|
class Openai(APIView):
|
|
|
|
|
|
authentication_classes = [OpenAIKeyAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@action(methods=['POST'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("OpenAI Interface Dialogue"),
|
|
|
|
|
|
operation_id=_("OpenAI Interface Dialogue"),
|
2024-09-09 06:47:25 +00:00
|
|
|
|
request_body=OpenAIChatApi.get_request_body_api(),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("OpenAI Dialogue")])
|
2024-09-09 06:47:25 +00:00
|
|
|
|
def post(self, request: Request, application_id: str):
|
|
|
|
|
|
return OpenAIChatSerializer(data={'application_id': application_id, 'client_id': request.auth.client_id,
|
|
|
|
|
|
'client_type': request.auth.client_type}).chat(request.data)
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-11-16 05:16:27 +00:00
|
|
|
|
class ChatView(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
2024-04-02 08:19:36 +00:00
|
|
|
|
class Export(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
2024-11-11 10:34:54 +00:00
|
|
|
|
@action(methods=['POST'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Export conversation"),
|
|
|
|
|
|
operation_id=_("Export conversation"),
|
2024-04-02 08:19:36 +00:00
|
|
|
|
manual_parameters=ChatApi.get_request_params_api(),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Conversation Log")]
|
2024-04-02 08:19:36 +00:00
|
|
|
|
)
|
|
|
|
|
|
@has_permissions(
|
|
|
|
|
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))])
|
|
|
|
|
|
)
|
2024-10-15 10:47:07 +00:00
|
|
|
|
def post(self, request: Request, application_id: str):
|
2024-04-02 08:19:36 +00:00
|
|
|
|
return ChatSerializers.Query(
|
|
|
|
|
|
data={**query_params_to_single_dict(request.query_params), 'application_id': application_id,
|
2024-10-15 10:47:07 +00:00
|
|
|
|
'user_id': request.user.id}).export(request.data)
|
2024-04-02 08:19:36 +00:00
|
|
|
|
|
2023-11-16 05:16:27 +00:00
|
|
|
|
class Open(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@action(methods=['GET'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Get the session id according to the application id"),
|
|
|
|
|
|
operation_id=_("Get the session id according to the application id"),
|
2023-11-16 05:16:27 +00:00
|
|
|
|
manual_parameters=ChatApi.OpenChat.get_request_params_api(),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Chat")])
|
2023-11-16 05:16:27 +00:00
|
|
|
|
@has_permissions(
|
|
|
|
|
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_ACCESS_TOKEN,
|
|
|
|
|
|
RoleConstants.APPLICATION_KEY],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))],
|
|
|
|
|
|
compare=CompareConstants.AND)
|
|
|
|
|
|
)
|
|
|
|
|
|
def get(self, request: Request, application_id: str):
|
|
|
|
|
|
return result.success(ChatSerializers.OpenChat(
|
|
|
|
|
|
data={'user_id': request.user.id, 'application_id': application_id}).open())
|
|
|
|
|
|
|
2024-07-01 01:45:59 +00:00
|
|
|
|
class OpenWorkFlowTemp(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@action(methods=['POST'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Get the workflow temporary session id"),
|
|
|
|
|
|
operation_id=_("Get the workflow temporary session id"),
|
2024-07-01 01:45:59 +00:00
|
|
|
|
request_body=ChatApi.OpenWorkFlowTemp.get_request_body_api(),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Chat")])
|
2024-07-01 01:45:59 +00:00
|
|
|
|
def post(self, request: Request):
|
|
|
|
|
|
return result.success(ChatSerializers.OpenWorkFlowChat(
|
|
|
|
|
|
data={**request.data, 'user_id': request.user.id}).open())
|
|
|
|
|
|
|
2023-11-16 05:16:27 +00:00
|
|
|
|
class OpenTemp(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@action(methods=['POST'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Get a temporary session id"),
|
|
|
|
|
|
operation_id=_("Get a temporary session id"),
|
2023-11-16 05:16:27 +00:00
|
|
|
|
request_body=ChatApi.OpenTempChat.get_request_body_api(),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Chat")])
|
2023-11-16 05:16:27 +00:00
|
|
|
|
@has_permissions(RoleConstants.ADMIN, RoleConstants.USER)
|
|
|
|
|
|
def post(self, request: Request):
|
|
|
|
|
|
return result.success(ChatSerializers.OpenTempChat(
|
|
|
|
|
|
data={**request.data, 'user_id': request.user.id}).open())
|
|
|
|
|
|
|
|
|
|
|
|
class Message(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@action(methods=['POST'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("dialogue"),
|
|
|
|
|
|
operation_id=_("dialogue"),
|
2023-11-16 05:16:27 +00:00
|
|
|
|
request_body=ChatApi.get_request_body_api(),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Chat")])
|
2023-11-16 05:16:27 +00:00
|
|
|
|
@has_permissions(
|
|
|
|
|
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY,
|
|
|
|
|
|
RoleConstants.APPLICATION_ACCESS_TOKEN],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))])
|
|
|
|
|
|
)
|
|
|
|
|
|
def post(self, request: Request, chat_id: str):
|
2024-03-13 21:43:01 +00:00
|
|
|
|
return ChatMessageSerializer(data={'chat_id': chat_id, 'message': request.data.get('message'),
|
|
|
|
|
|
're_chat': (request.data.get(
|
|
|
|
|
|
're_chat') if 're_chat' in request.data else False),
|
|
|
|
|
|
'stream': (request.data.get(
|
|
|
|
|
|
'stream') if 'stream' in request.data else True),
|
|
|
|
|
|
'application_id': (request.auth.keywords.get(
|
|
|
|
|
|
'application_id') if request.auth.client_type == AuthenticationType.APPLICATION_ACCESS_TOKEN.value else None),
|
|
|
|
|
|
'client_id': request.auth.client_id,
|
2024-09-25 09:21:23 +00:00
|
|
|
|
'form_data': (request.data.get(
|
|
|
|
|
|
'form_data') if 'form_data' in request.data else {}),
|
2024-11-13 02:37:16 +00:00
|
|
|
|
|
2024-11-12 09:49:22 +00:00
|
|
|
|
'image_list': request.data.get(
|
|
|
|
|
|
'image_list') if 'image_list' in request.data else [],
|
2024-11-13 06:48:01 +00:00
|
|
|
|
'document_list': request.data.get(
|
|
|
|
|
|
'document_list') if 'document_list' in request.data else [],
|
2024-12-12 02:04:46 +00:00
|
|
|
|
'audio_list': request.data.get(
|
|
|
|
|
|
'audio_list') if 'audio_list' in request.data else [],
|
2024-11-13 02:37:16 +00:00
|
|
|
|
'client_type': request.auth.client_type,
|
2024-11-29 11:26:16 +00:00
|
|
|
|
'node_id': request.data.get('node_id', None),
|
2024-11-13 02:37:16 +00:00
|
|
|
|
'runtime_node_id': request.data.get('runtime_node_id', None),
|
|
|
|
|
|
'node_data': request.data.get('node_data', {}),
|
2024-12-03 07:23:53 +00:00
|
|
|
|
'chat_record_id': request.data.get('chat_record_id'),
|
|
|
|
|
|
'child_node': request.data.get('child_node')}
|
2024-11-13 02:37:16 +00:00
|
|
|
|
).chat()
|
2023-11-16 05:16:27 +00:00
|
|
|
|
|
|
|
|
|
|
@action(methods=['GET'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Get the conversation list"),
|
|
|
|
|
|
operation_id=_("Get the conversation list"),
|
2023-11-16 05:16:27 +00:00
|
|
|
|
manual_parameters=ChatApi.get_request_params_api(),
|
2023-12-21 10:31:58 +00:00
|
|
|
|
responses=result.get_api_array_response(ChatApi.get_response_body_api()),
|
2025-02-24 10:53:21 +00:00
|
|
|
|
tags=[_("Application/Conversation Log")]
|
2023-11-16 05:16:27 +00:00
|
|
|
|
)
|
|
|
|
|
|
@has_permissions(
|
|
|
|
|
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))])
|
|
|
|
|
|
)
|
|
|
|
|
|
def get(self, request: Request, application_id: str):
|
|
|
|
|
|
return result.success(ChatSerializers.Query(
|
|
|
|
|
|
data={**query_params_to_single_dict(request.query_params), 'application_id': application_id,
|
|
|
|
|
|
'user_id': request.user.id}).list())
|
|
|
|
|
|
|
2023-12-06 08:29:14 +00:00
|
|
|
|
class Operate(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@action(methods=['DELETE'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Delete a conversation"),
|
|
|
|
|
|
operation_id=_("Delete a conversation"),
|
|
|
|
|
|
tags=[_("Application/Conversation Log")])
|
2023-12-06 08:29:14 +00:00
|
|
|
|
@has_permissions(ViewPermission(
|
|
|
|
|
|
[RoleConstants.ADMIN, RoleConstants.USER],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))],
|
2024-03-06 10:43:00 +00:00
|
|
|
|
compare=CompareConstants.AND),
|
2023-12-06 08:29:14 +00:00
|
|
|
|
compare=CompareConstants.AND)
|
2025-03-19 07:45:10 +00:00
|
|
|
|
@log(menu='Application/Conversation Log', operate="Delete a conversation")
|
2023-12-06 08:29:14 +00:00
|
|
|
|
def delete(self, request: Request, application_id: str, chat_id: str):
|
|
|
|
|
|
return result.success(
|
|
|
|
|
|
ChatSerializers.Operate(
|
|
|
|
|
|
data={'application_id': application_id, 'user_id': request.user.id,
|
|
|
|
|
|
'chat_id': chat_id}).delete())
|
|
|
|
|
|
|
2024-05-20 09:50:14 +00:00
|
|
|
|
class ClientChatHistoryPage(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@action(methods=['GET'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Get client conversation list by paging"),
|
|
|
|
|
|
operation_id=_("Get client conversation list by paging"),
|
2024-05-20 09:50:14 +00:00
|
|
|
|
manual_parameters=result.get_page_request_params(
|
|
|
|
|
|
ChatClientHistoryApi.get_request_params_api()),
|
|
|
|
|
|
responses=result.get_page_api_response(ChatApi.get_response_body_api()),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Conversation Log")]
|
2024-05-20 09:50:14 +00:00
|
|
|
|
)
|
|
|
|
|
|
@has_permissions(
|
|
|
|
|
|
ViewPermission([RoleConstants.APPLICATION_ACCESS_TOKEN],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))])
|
|
|
|
|
|
)
|
2025-03-19 07:45:10 +00:00
|
|
|
|
@log(menu='Application/Conversation Log', operate="Get client conversation list by paging")
|
2024-05-20 09:50:14 +00:00
|
|
|
|
def get(self, request: Request, application_id: str, current_page: int, page_size: int):
|
|
|
|
|
|
return result.success(ChatSerializers.ClientChatHistory(
|
|
|
|
|
|
data={'client_id': request.auth.client_id, 'application_id': application_id}).page(
|
|
|
|
|
|
current_page=current_page,
|
|
|
|
|
|
page_size=page_size))
|
|
|
|
|
|
|
2024-06-13 07:17:36 +00:00
|
|
|
|
class Operate(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@action(methods=['DELETE'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Client deletes conversation"),
|
|
|
|
|
|
operation_id=_("Client deletes conversation"),
|
|
|
|
|
|
tags=[_("Application/Conversation Log")])
|
2024-06-13 07:17:36 +00:00
|
|
|
|
@has_permissions(ViewPermission(
|
|
|
|
|
|
[RoleConstants.APPLICATION_ACCESS_TOKEN],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))],
|
|
|
|
|
|
compare=CompareConstants.AND),
|
|
|
|
|
|
compare=CompareConstants.AND)
|
2025-03-19 07:45:10 +00:00
|
|
|
|
@log(menu='Application/Conversation Log', operate="Client deletes conversation")
|
2024-06-13 07:17:36 +00:00
|
|
|
|
def delete(self, request: Request, application_id: str, chat_id: str):
|
|
|
|
|
|
return result.success(
|
|
|
|
|
|
ChatSerializers.Operate(
|
|
|
|
|
|
data={'application_id': application_id, 'user_id': request.user.id,
|
|
|
|
|
|
'chat_id': chat_id}).logic_delete())
|
|
|
|
|
|
|
2025-02-24 10:53:21 +00:00
|
|
|
|
@action(methods=['PUT'], detail=False)
|
|
|
|
|
|
@swagger_auto_schema(operation_summary=_("Client modifies dialogue summary"),
|
|
|
|
|
|
operation_id=_("Client modifies dialogue summary"),
|
|
|
|
|
|
request_body=ChatClientHistoryApi.Operate.ReAbstract.get_request_body_api(),
|
|
|
|
|
|
tags=[_("Application/Conversation Log")])
|
|
|
|
|
|
@has_permissions(ViewPermission(
|
|
|
|
|
|
[RoleConstants.APPLICATION_ACCESS_TOKEN],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))],
|
|
|
|
|
|
compare=CompareConstants.AND),
|
|
|
|
|
|
compare=CompareConstants.AND)
|
2025-03-19 07:45:10 +00:00
|
|
|
|
@log(menu='Application/Conversation Log', operate="Client modifies dialogue summary")
|
2025-02-24 10:53:21 +00:00
|
|
|
|
def put(self, request: Request, application_id: str, chat_id: str):
|
|
|
|
|
|
return result.success(
|
|
|
|
|
|
ChatSerializers.Operate(
|
|
|
|
|
|
data={'application_id': application_id, 'user_id': request.user.id,
|
|
|
|
|
|
'chat_id': chat_id}).re_abstract(request.data))
|
|
|
|
|
|
|
2023-11-16 05:16:27 +00:00
|
|
|
|
class Page(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@action(methods=['GET'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Get the conversation list by page"),
|
|
|
|
|
|
operation_id=_("Get the conversation list by page"),
|
2023-11-16 05:16:27 +00:00
|
|
|
|
manual_parameters=result.get_page_request_params(ChatApi.get_request_params_api()),
|
2023-12-21 10:31:58 +00:00
|
|
|
|
responses=result.get_page_api_response(ChatApi.get_response_body_api()),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Conversation Log")]
|
2023-11-16 05:16:27 +00:00
|
|
|
|
)
|
|
|
|
|
|
@has_permissions(
|
|
|
|
|
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))])
|
|
|
|
|
|
)
|
2025-03-19 07:45:10 +00:00
|
|
|
|
@log(menu='Application/Conversation Log', operate="Get the conversation list by page")
|
2023-11-16 05:16:27 +00:00
|
|
|
|
def get(self, request: Request, application_id: str, current_page: int, page_size: int):
|
|
|
|
|
|
return result.success(ChatSerializers.Query(
|
|
|
|
|
|
data={**query_params_to_single_dict(request.query_params), 'application_id': application_id,
|
|
|
|
|
|
'user_id': request.user.id}).page(current_page=current_page,
|
|
|
|
|
|
page_size=page_size))
|
|
|
|
|
|
|
|
|
|
|
|
class ChatRecord(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
2024-01-16 08:46:54 +00:00
|
|
|
|
class Operate(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@action(methods=['GET'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Get conversation record details"),
|
|
|
|
|
|
operation_id=_("Get conversation record details"),
|
2024-01-16 08:46:54 +00:00
|
|
|
|
manual_parameters=ChatRecordApi.get_request_params_api(),
|
|
|
|
|
|
responses=result.get_api_array_response(ChatRecordApi.get_response_body_api()),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Conversation Log")]
|
2024-01-16 08:46:54 +00:00
|
|
|
|
)
|
|
|
|
|
|
@has_permissions(
|
2024-04-25 06:05:59 +00:00
|
|
|
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY,
|
|
|
|
|
|
RoleConstants.APPLICATION_ACCESS_TOKEN],
|
2024-01-16 08:46:54 +00:00
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))])
|
|
|
|
|
|
)
|
2025-03-19 07:45:10 +00:00
|
|
|
|
@log(menu='Application/Conversation Log', operate="Get conversation record details")
|
2024-01-16 08:46:54 +00:00
|
|
|
|
def get(self, request: Request, application_id: str, chat_id: str, chat_record_id: str):
|
|
|
|
|
|
return result.success(ChatRecordSerializer.Operate(
|
|
|
|
|
|
data={'application_id': application_id,
|
|
|
|
|
|
'chat_id': chat_id,
|
2024-04-25 08:17:29 +00:00
|
|
|
|
'chat_record_id': chat_record_id}).one(request.auth.current_role))
|
2024-01-16 08:46:54 +00:00
|
|
|
|
|
2023-11-16 05:16:27 +00:00
|
|
|
|
@action(methods=['GET'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Get a list of conversation records"),
|
|
|
|
|
|
operation_id=_("Get a list of conversation records"),
|
2023-11-16 05:16:27 +00:00
|
|
|
|
manual_parameters=ChatRecordApi.get_request_params_api(),
|
2023-12-21 10:31:58 +00:00
|
|
|
|
responses=result.get_api_array_response(ChatRecordApi.get_response_body_api()),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Conversation Log")]
|
2023-11-16 05:16:27 +00:00
|
|
|
|
)
|
|
|
|
|
|
@has_permissions(
|
|
|
|
|
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))])
|
|
|
|
|
|
)
|
2025-03-19 07:45:10 +00:00
|
|
|
|
@log(menu='Application/Conversation Log', operate="Get a list of conversation records")
|
2023-11-16 05:16:27 +00:00
|
|
|
|
def get(self, request: Request, application_id: str, chat_id: str):
|
|
|
|
|
|
return result.success(ChatRecordSerializer.Query(
|
|
|
|
|
|
data={'application_id': application_id,
|
2024-05-20 09:50:14 +00:00
|
|
|
|
'chat_id': chat_id, 'order_asc': request.query_params.get('order_asc')}).list())
|
2023-11-16 05:16:27 +00:00
|
|
|
|
|
|
|
|
|
|
class Page(APIView):
|
2023-12-07 07:30:02 +00:00
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
2023-11-16 05:16:27 +00:00
|
|
|
|
@action(methods=['GET'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Get the conversation history list by page"),
|
|
|
|
|
|
operation_id=_("Get the conversation history list by page"),
|
2023-11-16 05:16:27 +00:00
|
|
|
|
manual_parameters=result.get_page_request_params(
|
|
|
|
|
|
ChatRecordApi.get_request_params_api()),
|
2023-12-21 10:31:58 +00:00
|
|
|
|
responses=result.get_page_api_response(ChatRecordApi.get_response_body_api()),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Conversation Log")]
|
2023-11-16 05:16:27 +00:00
|
|
|
|
)
|
|
|
|
|
|
@has_permissions(
|
|
|
|
|
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))])
|
|
|
|
|
|
)
|
2025-03-19 07:45:10 +00:00
|
|
|
|
@log(menu='Application/Conversation Log', operate="Get the conversation history list by page")
|
2023-11-16 05:16:27 +00:00
|
|
|
|
def get(self, request: Request, application_id: str, chat_id: str, current_page: int, page_size: int):
|
|
|
|
|
|
return result.success(ChatRecordSerializer.Query(
|
|
|
|
|
|
data={'application_id': application_id,
|
2024-05-20 09:50:14 +00:00
|
|
|
|
'chat_id': chat_id, 'order_asc': request.query_params.get('order_asc')}).page(current_page,
|
|
|
|
|
|
page_size))
|
2023-11-16 05:16:27 +00:00
|
|
|
|
|
|
|
|
|
|
class Vote(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@action(methods=['PUT'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Like, Dislike"),
|
|
|
|
|
|
operation_id=_("Like, Dislike"),
|
2023-11-16 05:16:27 +00:00
|
|
|
|
manual_parameters=VoteApi.get_request_params_api(),
|
|
|
|
|
|
request_body=VoteApi.get_request_body_api(),
|
|
|
|
|
|
responses=result.get_default_response(),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Chat")]
|
2023-11-16 05:16:27 +00:00
|
|
|
|
)
|
|
|
|
|
|
@has_permissions(
|
|
|
|
|
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY,
|
|
|
|
|
|
RoleConstants.APPLICATION_ACCESS_TOKEN],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))])
|
|
|
|
|
|
)
|
2025-03-19 07:45:10 +00:00
|
|
|
|
@log(menu='Application/Conversation Log', operate="Like, Dislike")
|
2023-11-16 05:16:27 +00:00
|
|
|
|
def put(self, request: Request, application_id: str, chat_id: str, chat_record_id: str):
|
|
|
|
|
|
return result.success(ChatRecordSerializer.Vote(
|
|
|
|
|
|
data={'vote_status': request.data.get('vote_status'), 'chat_id': chat_id,
|
|
|
|
|
|
'chat_record_id': chat_record_id}).vote())
|
|
|
|
|
|
|
2023-12-13 09:14:43 +00:00
|
|
|
|
class ChatRecordImprove(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@action(methods=['GET'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Get the list of marked paragraphs"),
|
|
|
|
|
|
operation_id=_("Get the list of marked paragraphs"),
|
2023-12-13 09:14:43 +00:00
|
|
|
|
manual_parameters=ChatRecordImproveApi.get_request_params_api(),
|
|
|
|
|
|
responses=result.get_api_response(ChatRecordImproveApi.get_response_body_api()),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Conversation Log/Annotation")]
|
2023-12-13 09:14:43 +00:00
|
|
|
|
)
|
|
|
|
|
|
@has_permissions(
|
|
|
|
|
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))]
|
|
|
|
|
|
))
|
2025-03-19 07:45:10 +00:00
|
|
|
|
@log(menu='Application/Conversation Log', operate="Get the list of marked paragraphs")
|
2023-12-13 09:14:43 +00:00
|
|
|
|
def get(self, request: Request, application_id: str, chat_id: str, chat_record_id: str):
|
|
|
|
|
|
return result.success(ChatRecordSerializer.ChatRecordImprove(
|
|
|
|
|
|
data={'chat_id': chat_id, 'chat_record_id': chat_record_id}).get())
|
|
|
|
|
|
|
2023-11-16 05:16:27 +00:00
|
|
|
|
class Improve(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@action(methods=['PUT'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Annotation"),
|
|
|
|
|
|
operation_id=_("Annotation"),
|
2023-11-16 05:16:27 +00:00
|
|
|
|
manual_parameters=ImproveApi.get_request_params_api(),
|
|
|
|
|
|
request_body=ImproveApi.get_request_body_api(),
|
2023-12-21 10:31:58 +00:00
|
|
|
|
responses=result.get_api_response(ChatRecordApi.get_response_body_api()),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Conversation Log/Annotation")]
|
2023-11-16 05:16:27 +00:00
|
|
|
|
)
|
|
|
|
|
|
@has_permissions(
|
|
|
|
|
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))],
|
2024-03-04 03:29:18 +00:00
|
|
|
|
|
|
|
|
|
|
), ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.DATASET,
|
|
|
|
|
|
operate=Operate.MANAGE,
|
|
|
|
|
|
dynamic_tag=keywords.get(
|
|
|
|
|
|
'dataset_id'))],
|
|
|
|
|
|
compare=CompareConstants.AND
|
|
|
|
|
|
), compare=CompareConstants.AND)
|
2025-03-19 07:45:10 +00:00
|
|
|
|
@log(menu='Application/Conversation Log', operate="Annotation")
|
2023-11-16 05:16:27 +00:00
|
|
|
|
def put(self, request: Request, application_id: str, chat_id: str, chat_record_id: str, dataset_id: str,
|
|
|
|
|
|
document_id: str):
|
|
|
|
|
|
return result.success(ChatRecordSerializer.Improve(
|
|
|
|
|
|
data={'chat_id': chat_id, 'chat_record_id': chat_record_id,
|
|
|
|
|
|
'dataset_id': dataset_id, 'document_id': document_id}).improve(request.data))
|
2024-03-04 09:01:16 +00:00
|
|
|
|
|
2024-11-12 09:49:22 +00:00
|
|
|
|
@action(methods=['POST'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Add to Knowledge Base"),
|
|
|
|
|
|
operation_id=_("Add to Knowledge Base"),
|
2024-11-12 09:49:22 +00:00
|
|
|
|
manual_parameters=ImproveApi.get_request_params_api_post(),
|
|
|
|
|
|
request_body=ImproveApi.get_request_body_api_post(),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Conversation Log/Add to Knowledge Base")]
|
2024-11-12 09:49:22 +00:00
|
|
|
|
)
|
|
|
|
|
|
@has_permissions(
|
|
|
|
|
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))],
|
|
|
|
|
|
|
|
|
|
|
|
), ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.DATASET,
|
|
|
|
|
|
operate=Operate.MANAGE,
|
|
|
|
|
|
dynamic_tag=keywords.get(
|
|
|
|
|
|
'dataset_id'))],
|
|
|
|
|
|
compare=CompareConstants.AND
|
|
|
|
|
|
), compare=CompareConstants.AND)
|
2025-03-19 07:45:10 +00:00
|
|
|
|
@log(menu='Application/Conversation Log', operate="Add to Knowledge Base")
|
2024-11-12 09:49:22 +00:00
|
|
|
|
def post(self, request: Request, application_id: str, dataset_id: str):
|
|
|
|
|
|
return result.success(ChatRecordSerializer.PostImprove().post_improve(request.data))
|
|
|
|
|
|
|
2024-03-04 09:01:16 +00:00
|
|
|
|
class Operate(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@action(methods=['DELETE'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Delete a Annotation"),
|
|
|
|
|
|
operation_id=_("Delete a Annotation"),
|
2024-03-04 09:01:16 +00:00
|
|
|
|
manual_parameters=ImproveApi.get_request_params_api(),
|
|
|
|
|
|
responses=result.get_api_response(ChatRecordApi.get_response_body_api()),
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Conversation Log/Annotation")]
|
2024-03-04 09:01:16 +00:00
|
|
|
|
)
|
|
|
|
|
|
@has_permissions(
|
|
|
|
|
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))],
|
|
|
|
|
|
|
|
|
|
|
|
), ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.DATASET,
|
|
|
|
|
|
operate=Operate.MANAGE,
|
|
|
|
|
|
dynamic_tag=keywords.get(
|
|
|
|
|
|
'dataset_id'))],
|
|
|
|
|
|
compare=CompareConstants.AND
|
|
|
|
|
|
), compare=CompareConstants.AND)
|
2025-03-19 07:45:10 +00:00
|
|
|
|
@log(menu='Application/Conversation Log', operate="Delete a Annotation")
|
2024-03-04 09:01:16 +00:00
|
|
|
|
def delete(self, request: Request, application_id: str, chat_id: str, chat_record_id: str,
|
|
|
|
|
|
dataset_id: str,
|
|
|
|
|
|
document_id: str, paragraph_id: str):
|
|
|
|
|
|
return result.success(ChatRecordSerializer.Improve.Operate(
|
|
|
|
|
|
data={'chat_id': chat_id, 'chat_record_id': chat_record_id,
|
|
|
|
|
|
'dataset_id': dataset_id, 'document_id': document_id,
|
|
|
|
|
|
'paragraph_id': paragraph_id}).delete())
|
2024-11-11 07:48:56 +00:00
|
|
|
|
|
|
|
|
|
|
class UploadFile(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
2025-02-28 03:51:14 +00:00
|
|
|
|
parser_classes = [MultiPartParser]
|
2024-11-11 07:48:56 +00:00
|
|
|
|
|
|
|
|
|
|
@action(methods=['POST'], detail=False)
|
2025-01-13 11:05:08 +00:00
|
|
|
|
@swagger_auto_schema(operation_summary=_("Upload files"),
|
|
|
|
|
|
operation_id=_("Upload files"),
|
2025-02-28 03:51:14 +00:00
|
|
|
|
manual_parameters=[
|
|
|
|
|
|
openapi.Parameter(name='application_id',
|
|
|
|
|
|
in_=openapi.IN_PATH,
|
|
|
|
|
|
type=openapi.TYPE_STRING,
|
|
|
|
|
|
required=True,
|
|
|
|
|
|
description=_('Application ID')),
|
|
|
|
|
|
openapi.Parameter(name='chat_id',
|
|
|
|
|
|
in_=openapi.IN_PATH,
|
|
|
|
|
|
type=openapi.TYPE_STRING,
|
|
|
|
|
|
required=True,
|
|
|
|
|
|
description=_('Conversation ID')),
|
|
|
|
|
|
openapi.Parameter(name='file',
|
|
|
|
|
|
in_=openapi.IN_FORM,
|
|
|
|
|
|
type=openapi.TYPE_FILE,
|
|
|
|
|
|
required=True,
|
|
|
|
|
|
description=_('Upload file'))
|
|
|
|
|
|
],
|
2025-01-13 11:05:08 +00:00
|
|
|
|
tags=[_("Application/Conversation Log")]
|
2024-11-11 07:48:56 +00:00
|
|
|
|
)
|
|
|
|
|
|
@has_permissions(
|
|
|
|
|
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY,
|
|
|
|
|
|
RoleConstants.APPLICATION_ACCESS_TOKEN],
|
|
|
|
|
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
|
|
|
|
|
dynamic_tag=keywords.get('application_id'))])
|
|
|
|
|
|
)
|
|
|
|
|
|
def post(self, request: Request, application_id: str, chat_id: str):
|
|
|
|
|
|
files = request.FILES.getlist('file')
|
|
|
|
|
|
file_ids = []
|
2024-11-14 07:28:15 +00:00
|
|
|
|
debug = request.data.get("debug", "false").lower() == "true"
|
|
|
|
|
|
meta = {'application_id': application_id, 'chat_id': chat_id, 'debug': debug}
|
2024-11-11 07:48:56 +00:00
|
|
|
|
for file in files:
|
|
|
|
|
|
file_url = FileSerializer(data={'file': file, 'meta': meta}).upload()
|
|
|
|
|
|
file_ids.append({'name': file.name, 'url': file_url, 'file_id': file_url.split('/')[-1]})
|
|
|
|
|
|
return result.success(file_ids)
|