feat: application i18n (#2020)
parent
5cddada3be
commit
bedbeac9f7
|
|
@ -9,6 +9,7 @@
|
||||||
from abc import abstractmethod
|
from abc import abstractmethod
|
||||||
from typing import Type, List
|
from typing import Type, List
|
||||||
|
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
from langchain.chat_models.base import BaseChatModel
|
from langchain.chat_models.base import BaseChatModel
|
||||||
from langchain.schema import BaseMessage
|
from langchain.schema import BaseMessage
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
@ -23,7 +24,7 @@ from common.util.field_message import ErrMessage
|
||||||
class ModelField(serializers.Field):
|
class ModelField(serializers.Field):
|
||||||
def to_internal_value(self, data):
|
def to_internal_value(self, data):
|
||||||
if not isinstance(data, BaseChatModel):
|
if not isinstance(data, BaseChatModel):
|
||||||
self.fail('模型类型错误', value=data)
|
self.fail(_('Model type error'), value=data)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def to_representation(self, value):
|
def to_representation(self, value):
|
||||||
|
|
@ -33,7 +34,7 @@ class ModelField(serializers.Field):
|
||||||
class MessageField(serializers.Field):
|
class MessageField(serializers.Field):
|
||||||
def to_internal_value(self, data):
|
def to_internal_value(self, data):
|
||||||
if not isinstance(data, BaseMessage):
|
if not isinstance(data, BaseMessage):
|
||||||
self.fail('message类型错误', value=data)
|
self.fail(_('Message type error'), value=data)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def to_representation(self, value):
|
def to_representation(self, value):
|
||||||
|
|
@ -52,37 +53,37 @@ class IChatStep(IBaseChatPipelineStep):
|
||||||
class InstanceSerializer(serializers.Serializer):
|
class InstanceSerializer(serializers.Serializer):
|
||||||
# 对话列表
|
# 对话列表
|
||||||
message_list = serializers.ListField(required=True, child=MessageField(required=True),
|
message_list = serializers.ListField(required=True, child=MessageField(required=True),
|
||||||
error_messages=ErrMessage.list("对话列表"))
|
error_messages=ErrMessage.list(_("Conversation list")))
|
||||||
model_id = serializers.UUIDField(required=False, allow_null=True, error_messages=ErrMessage.uuid("模型id"))
|
model_id = serializers.UUIDField(required=False, allow_null=True, error_messages=ErrMessage.uuid(_("Model id")))
|
||||||
# 段落列表
|
# 段落列表
|
||||||
paragraph_list = serializers.ListField(error_messages=ErrMessage.list("段落列表"))
|
paragraph_list = serializers.ListField(error_messages=ErrMessage.list(_("Paragraph List")))
|
||||||
# 对话id
|
# 对话id
|
||||||
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话id"))
|
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Conversation ID")))
|
||||||
# 用户问题
|
# 用户问题
|
||||||
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.uuid("用户问题"))
|
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.uuid(_("User Questions")))
|
||||||
# 后置处理器
|
# 后置处理器
|
||||||
post_response_handler = InstanceField(model_type=PostResponseHandler,
|
post_response_handler = InstanceField(model_type=PostResponseHandler,
|
||||||
error_messages=ErrMessage.base("用户问题"))
|
error_messages=ErrMessage.base(_("Post-processor")))
|
||||||
# 补全问题
|
# 补全问题
|
||||||
padding_problem_text = serializers.CharField(required=False, error_messages=ErrMessage.base("补全问题"))
|
padding_problem_text = serializers.CharField(required=False, error_messages=ErrMessage.base(_("Completion Question")))
|
||||||
# 是否使用流的形式输出
|
# 是否使用流的形式输出
|
||||||
stream = serializers.BooleanField(required=False, error_messages=ErrMessage.base("流式输出"))
|
stream = serializers.BooleanField(required=False, error_messages=ErrMessage.base(_("Streaming Output")))
|
||||||
client_id = serializers.CharField(required=True, error_messages=ErrMessage.char("客户端id"))
|
client_id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Client id")))
|
||||||
client_type = serializers.CharField(required=True, error_messages=ErrMessage.char("客户端类型"))
|
client_type = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Client Type")))
|
||||||
# 未查询到引用分段
|
# 未查询到引用分段
|
||||||
no_references_setting = NoReferencesSetting(required=True, error_messages=ErrMessage.base("无引用分段设置"))
|
no_references_setting = NoReferencesSetting(required=True, error_messages=ErrMessage.base(_("No reference segment settings")))
|
||||||
|
|
||||||
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
|
||||||
|
|
||||||
model_params_setting = serializers.DictField(required=False, allow_null=True,
|
model_params_setting = serializers.DictField(required=False, allow_null=True,
|
||||||
error_messages=ErrMessage.dict("模型参数设置"))
|
error_messages=ErrMessage.dict(_("Model parameter settings")))
|
||||||
|
|
||||||
def is_valid(self, *, raise_exception=False):
|
def is_valid(self, *, raise_exception=False):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
message_list: List = self.initial_data.get('message_list')
|
message_list: List = self.initial_data.get('message_list')
|
||||||
for message in message_list:
|
for message in message_list:
|
||||||
if not isinstance(message, BaseMessage):
|
if not isinstance(message, BaseMessage):
|
||||||
raise Exception("message 类型错误")
|
raise Exception(_("message type error"))
|
||||||
|
|
||||||
def get_step_serializer(self, manage: PipelineManage) -> Type[serializers.Serializer]:
|
def get_step_serializer(self, manage: PipelineManage) -> Type[serializers.Serializer]:
|
||||||
return self.InstanceSerializer
|
return self.InstanceSerializer
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ from application.chat_pipeline.step.chat_step.i_chat_step import IChatStep, Post
|
||||||
from application.models.api_key_model import ApplicationPublicAccessClient
|
from application.models.api_key_model import ApplicationPublicAccessClient
|
||||||
from common.constants.authentication_type import AuthenticationType
|
from common.constants.authentication_type import AuthenticationType
|
||||||
from setting.models_provider.tools import get_model_instance_by_model_user_id
|
from setting.models_provider.tools import get_model_instance_by_model_user_id
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
def add_access_num(client_id=None, client_type=None, application_id=None):
|
def add_access_num(client_id=None, client_type=None, application_id=None):
|
||||||
|
|
@ -172,7 +173,8 @@ class BaseChatStep(IChatStep):
|
||||||
return iter(
|
return iter(
|
||||||
[AIMessageChunk(content=no_references_setting.get('value').replace('{question}', problem_text))]), False
|
[AIMessageChunk(content=no_references_setting.get('value').replace('{question}', problem_text))]), False
|
||||||
if chat_model is None:
|
if chat_model is None:
|
||||||
return iter([AIMessageChunk('抱歉,没有配置 AI 模型,请先去应用中设置 AI 模型。')]), False
|
return iter([AIMessageChunk(
|
||||||
|
_('Sorry, the AI model is not configured. Please go to the application to set up the AI model first.'))]), False
|
||||||
else:
|
else:
|
||||||
return chat_model.stream(message_list), True
|
return chat_model.stream(message_list), True
|
||||||
|
|
||||||
|
|
@ -216,7 +218,7 @@ class BaseChatStep(IChatStep):
|
||||||
'status') == 'designated_answer':
|
'status') == 'designated_answer':
|
||||||
return AIMessage(no_references_setting.get('value').replace('{question}', problem_text)), False
|
return AIMessage(no_references_setting.get('value').replace('{question}', problem_text)), False
|
||||||
if chat_model is None:
|
if chat_model is None:
|
||||||
return AIMessage('抱歉,没有配置 AI 模型,请先去应用中设置 AI 模型。'), False
|
return AIMessage(_('Sorry, the AI model is not configured. Please go to the application to set up the AI model first.')), False
|
||||||
else:
|
else:
|
||||||
return chat_model.invoke(message_list), True
|
return chat_model.invoke(message_list), True
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
from abc import abstractmethod
|
from abc import abstractmethod
|
||||||
from typing import Type, List
|
from typing import Type, List
|
||||||
|
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
from langchain.schema import BaseMessage
|
from langchain.schema import BaseMessage
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
|
@ -23,26 +24,26 @@ from common.util.field_message import ErrMessage
|
||||||
class IGenerateHumanMessageStep(IBaseChatPipelineStep):
|
class IGenerateHumanMessageStep(IBaseChatPipelineStep):
|
||||||
class InstanceSerializer(serializers.Serializer):
|
class InstanceSerializer(serializers.Serializer):
|
||||||
# 问题
|
# 问题
|
||||||
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.char("问题"))
|
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.char(_("question")))
|
||||||
# 段落列表
|
# 段落列表
|
||||||
paragraph_list = serializers.ListField(child=InstanceField(model_type=ParagraphPipelineModel, required=True),
|
paragraph_list = serializers.ListField(child=InstanceField(model_type=ParagraphPipelineModel, required=True),
|
||||||
error_messages=ErrMessage.list("段落列表"))
|
error_messages=ErrMessage.list(_("Paragraph List")))
|
||||||
# 历史对答
|
# 历史对答
|
||||||
history_chat_record = serializers.ListField(child=InstanceField(model_type=ChatRecord, required=True),
|
history_chat_record = serializers.ListField(child=InstanceField(model_type=ChatRecord, required=True),
|
||||||
error_messages=ErrMessage.list("历史对答"))
|
error_messages=ErrMessage.list(_("History Questions")))
|
||||||
# 多轮对话数量
|
# 多轮对话数量
|
||||||
dialogue_number = serializers.IntegerField(required=True, error_messages=ErrMessage.integer("多轮对话数量"))
|
dialogue_number = serializers.IntegerField(required=True, error_messages=ErrMessage.integer(_("Number of multi-round conversations")))
|
||||||
# 最大携带知识库段落长度
|
# 最大携带知识库段落长度
|
||||||
max_paragraph_char_number = serializers.IntegerField(required=True, error_messages=ErrMessage.integer(
|
max_paragraph_char_number = serializers.IntegerField(required=True, error_messages=ErrMessage.integer(
|
||||||
"最大携带知识库段落长度"))
|
_("Maximum length of the knowledge base paragraph")))
|
||||||
# 模板
|
# 模板
|
||||||
prompt = serializers.CharField(required=True, error_messages=ErrMessage.char("提示词"))
|
prompt = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Prompt word")))
|
||||||
system = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
system = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
||||||
error_messages=ErrMessage.char("系统提示词(角色)"))
|
error_messages=ErrMessage.char(_("System prompt words (role)")))
|
||||||
# 补齐问题
|
# 补齐问题
|
||||||
padding_problem_text = serializers.CharField(required=False, error_messages=ErrMessage.char("补齐问题"))
|
padding_problem_text = serializers.CharField(required=False, error_messages=ErrMessage.char(_("Completion problem")))
|
||||||
# 未查询到引用分段
|
# 未查询到引用分段
|
||||||
no_references_setting = NoReferencesSetting(required=True, error_messages=ErrMessage.base("无引用分段设置"))
|
no_references_setting = NoReferencesSetting(required=True, error_messages=ErrMessage.base(_("No reference segment settings")))
|
||||||
|
|
||||||
def get_step_serializer(self, manage: PipelineManage) -> Type[serializers.Serializer]:
|
def get_step_serializer(self, manage: PipelineManage) -> Type[serializers.Serializer]:
|
||||||
return self.InstanceSerializer
|
return self.InstanceSerializer
|
||||||
|
|
|
||||||
|
|
@ -9,12 +9,11 @@
|
||||||
from abc import abstractmethod
|
from abc import abstractmethod
|
||||||
from typing import Type, List
|
from typing import Type, List
|
||||||
|
|
||||||
from langchain.chat_models.base import BaseChatModel
|
from django.utils.translation import gettext_lazy as _
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from application.chat_pipeline.I_base_chat_pipeline import IBaseChatPipelineStep
|
from application.chat_pipeline.I_base_chat_pipeline import IBaseChatPipelineStep
|
||||||
from application.chat_pipeline.pipeline_manage import PipelineManage
|
from application.chat_pipeline.pipeline_manage import PipelineManage
|
||||||
from application.chat_pipeline.step.chat_step.i_chat_step import ModelField
|
|
||||||
from application.models import ChatRecord
|
from application.models import ChatRecord
|
||||||
from common.field.common import InstanceField
|
from common.field.common import InstanceField
|
||||||
from common.util.field_message import ErrMessage
|
from common.util.field_message import ErrMessage
|
||||||
|
|
@ -23,15 +22,16 @@ from common.util.field_message import ErrMessage
|
||||||
class IResetProblemStep(IBaseChatPipelineStep):
|
class IResetProblemStep(IBaseChatPipelineStep):
|
||||||
class InstanceSerializer(serializers.Serializer):
|
class InstanceSerializer(serializers.Serializer):
|
||||||
# 问题文本
|
# 问题文本
|
||||||
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.float("问题文本"))
|
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.float(_("question")))
|
||||||
# 历史对答
|
# 历史对答
|
||||||
history_chat_record = serializers.ListField(child=InstanceField(model_type=ChatRecord, required=True),
|
history_chat_record = serializers.ListField(child=InstanceField(model_type=ChatRecord, required=True),
|
||||||
error_messages=ErrMessage.list("历史对答"))
|
error_messages=ErrMessage.list(_("History Questions")))
|
||||||
# 大语言模型
|
# 大语言模型
|
||||||
model_id = serializers.UUIDField(required=False, allow_null=True, error_messages=ErrMessage.uuid("模型id"))
|
model_id = serializers.UUIDField(required=False, allow_null=True, error_messages=ErrMessage.uuid(_("Model id")))
|
||||||
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
|
||||||
problem_optimization_prompt = serializers.CharField(required=False, max_length=102400,
|
problem_optimization_prompt = serializers.CharField(required=False, max_length=102400,
|
||||||
error_messages=ErrMessage.char("问题补全提示词"))
|
error_messages=ErrMessage.char(
|
||||||
|
_("Question completion prompt")))
|
||||||
|
|
||||||
def get_step_serializer(self, manage: PipelineManage) -> Type[serializers.Serializer]:
|
def get_step_serializer(self, manage: PipelineManage) -> Type[serializers.Serializer]:
|
||||||
return self.InstanceSerializer
|
return self.InstanceSerializer
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,10 @@ from application.chat_pipeline.step.reset_problem_step.i_reset_problem_step impo
|
||||||
from application.models import ChatRecord
|
from application.models import ChatRecord
|
||||||
from common.util.split_model import flat_map
|
from common.util.split_model import flat_map
|
||||||
from setting.models_provider.tools import get_model_instance_by_model_user_id
|
from setting.models_provider.tools import get_model_instance_by_model_user_id
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
prompt = (
|
prompt = _(
|
||||||
'()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在<data></data>标签中')
|
"() contains the user's question. Answer the guessed user's question based on the context ({question}) Requirement: Output a complete question and put it in the <data></data> tag")
|
||||||
|
|
||||||
|
|
||||||
class BaseResetProblemStep(IResetProblemStep):
|
class BaseResetProblemStep(IResetProblemStep):
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ from abc import abstractmethod
|
||||||
from typing import List, Type
|
from typing import List, Type
|
||||||
|
|
||||||
from django.core import validators
|
from django.core import validators
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from application.chat_pipeline.I_base_chat_pipeline import IBaseChatPipelineStep, ParagraphPipelineModel
|
from application.chat_pipeline.I_base_chat_pipeline import IBaseChatPipelineStep, ParagraphPipelineModel
|
||||||
|
|
@ -21,29 +22,30 @@ from common.util.field_message import ErrMessage
|
||||||
class ISearchDatasetStep(IBaseChatPipelineStep):
|
class ISearchDatasetStep(IBaseChatPipelineStep):
|
||||||
class InstanceSerializer(serializers.Serializer):
|
class InstanceSerializer(serializers.Serializer):
|
||||||
# 原始问题文本
|
# 原始问题文本
|
||||||
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.char("问题"))
|
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.char(_("question")))
|
||||||
# 系统补全问题文本
|
# 系统补全问题文本
|
||||||
padding_problem_text = serializers.CharField(required=False, error_messages=ErrMessage.char("系统补全问题文本"))
|
padding_problem_text = serializers.CharField(required=False,
|
||||||
|
error_messages=ErrMessage.char(_("System completes question text")))
|
||||||
# 需要查询的数据集id列表
|
# 需要查询的数据集id列表
|
||||||
dataset_id_list = serializers.ListField(required=True, child=serializers.UUIDField(required=True),
|
dataset_id_list = serializers.ListField(required=True, child=serializers.UUIDField(required=True),
|
||||||
error_messages=ErrMessage.list("数据集id列表"))
|
error_messages=ErrMessage.list(_("Dataset id list")))
|
||||||
# 需要排除的文档id
|
# 需要排除的文档id
|
||||||
exclude_document_id_list = serializers.ListField(required=True, child=serializers.UUIDField(required=True),
|
exclude_document_id_list = serializers.ListField(required=True, child=serializers.UUIDField(required=True),
|
||||||
error_messages=ErrMessage.list("排除的文档id列表"))
|
error_messages=ErrMessage.list(_("List of document ids to exclude")))
|
||||||
# 需要排除向量id
|
# 需要排除向量id
|
||||||
exclude_paragraph_id_list = serializers.ListField(required=True, child=serializers.UUIDField(required=True),
|
exclude_paragraph_id_list = serializers.ListField(required=True, child=serializers.UUIDField(required=True),
|
||||||
error_messages=ErrMessage.list("排除向量id列表"))
|
error_messages=ErrMessage.list(_("List of exclusion vector ids")))
|
||||||
# 需要查询的条数
|
# 需要查询的条数
|
||||||
top_n = serializers.IntegerField(required=True,
|
top_n = serializers.IntegerField(required=True,
|
||||||
error_messages=ErrMessage.integer("引用分段数"))
|
error_messages=ErrMessage.integer(_("Reference segment number")))
|
||||||
# 相似度 0-1之间
|
# 相似度 0-1之间
|
||||||
similarity = serializers.FloatField(required=True, max_value=1, min_value=0,
|
similarity = serializers.FloatField(required=True, max_value=1, min_value=0,
|
||||||
error_messages=ErrMessage.float("引用分段数"))
|
error_messages=ErrMessage.float(_("Similarity")))
|
||||||
search_mode = serializers.CharField(required=True, validators=[
|
search_mode = serializers.CharField(required=True, validators=[
|
||||||
validators.RegexValidator(regex=re.compile("^embedding|keywords|blend$"),
|
validators.RegexValidator(regex=re.compile("^embedding|keywords|blend$"),
|
||||||
message="类型只支持register|reset_password", code=500)
|
message=_("The type only supports register|reset_password"), code=500)
|
||||||
], error_messages=ErrMessage.char("检索模式"))
|
], error_messages=ErrMessage.char(_("Retrieval Mode")))
|
||||||
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
|
||||||
|
|
||||||
def get_step_serializer(self, manage: PipelineManage) -> Type[InstanceSerializer]:
|
def get_step_serializer(self, manage: PipelineManage) -> Type[InstanceSerializer]:
|
||||||
return self.InstanceSerializer
|
return self.InstanceSerializer
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,8 @@ import os
|
||||||
from typing import List, Dict
|
from typing import List, Dict
|
||||||
|
|
||||||
from django.db.models import QuerySet
|
from django.db.models import QuerySet
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
from rest_framework.utils.formatting import lazy_format
|
||||||
|
|
||||||
from application.chat_pipeline.I_base_chat_pipeline import ParagraphPipelineModel
|
from application.chat_pipeline.I_base_chat_pipeline import ParagraphPipelineModel
|
||||||
from application.chat_pipeline.step.search_dataset_step.i_search_dataset_step import ISearchDatasetStep
|
from application.chat_pipeline.step.search_dataset_step.i_search_dataset_step import ISearchDatasetStep
|
||||||
|
|
@ -26,18 +28,19 @@ from smartdoc.conf import PROJECT_DIR
|
||||||
def get_model_by_id(_id, user_id):
|
def get_model_by_id(_id, user_id):
|
||||||
model = QuerySet(Model).filter(id=_id).first()
|
model = QuerySet(Model).filter(id=_id).first()
|
||||||
if model is None:
|
if model is None:
|
||||||
raise Exception("模型不存在")
|
raise Exception(_("Model does not exist"))
|
||||||
if model.permission_type == 'PRIVATE' and str(model.user_id) != str(user_id):
|
if model.permission_type == 'PRIVATE' and str(model.user_id) != str(user_id):
|
||||||
raise Exception(f"无权限使用此模型:{model.name}")
|
message = lazy_format(_('No permission to use this model {model_name}'), model_name=model.name)
|
||||||
|
raise Exception(message)
|
||||||
return model
|
return model
|
||||||
|
|
||||||
|
|
||||||
def get_embedding_id(dataset_id_list):
|
def get_embedding_id(dataset_id_list):
|
||||||
dataset_list = QuerySet(DataSet).filter(id__in=dataset_id_list)
|
dataset_list = QuerySet(DataSet).filter(id__in=dataset_id_list)
|
||||||
if len(set([dataset.embedding_mode_id for dataset in dataset_list])) > 1:
|
if len(set([dataset.embedding_mode_id for dataset in dataset_list])) > 1:
|
||||||
raise Exception("关联知识库的向量模型不一致,无法召回分段。")
|
raise Exception(_("The vector model of the associated knowledge base is inconsistent and the segmentation cannot be recalled."))
|
||||||
if len(dataset_list) == 0:
|
if len(dataset_list) == 0:
|
||||||
raise Exception("知识库设置错误,请重新设置知识库")
|
raise Exception(_("The knowledge base setting is wrong, please reset the knowledge base"))
|
||||||
return dataset_list[0].embedding_mode_id
|
return dataset_list[0].embedding_mode_id
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
"""
|
"""
|
||||||
from typing import Type
|
from typing import Type
|
||||||
|
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from application.flow.i_step_node import INode, NodeResult
|
from application.flow.i_step_node import INode, NodeResult
|
||||||
|
|
@ -15,19 +16,22 @@ from common.util.field_message import ErrMessage
|
||||||
|
|
||||||
|
|
||||||
class ChatNodeSerializer(serializers.Serializer):
|
class ChatNodeSerializer(serializers.Serializer):
|
||||||
model_id = serializers.CharField(required=True, error_messages=ErrMessage.char("模型id"))
|
model_id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Model id")))
|
||||||
system = serializers.CharField(required=False, allow_blank=True, allow_null=True,
|
system = serializers.CharField(required=False, allow_blank=True, allow_null=True,
|
||||||
error_messages=ErrMessage.char("角色设定"))
|
error_messages=ErrMessage.char(_("Role Setting")))
|
||||||
prompt = serializers.CharField(required=True, error_messages=ErrMessage.char("提示词"))
|
prompt = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Prompt word")))
|
||||||
# 多轮对话数量
|
# 多轮对话数量
|
||||||
dialogue_number = serializers.IntegerField(required=True, error_messages=ErrMessage.integer("多轮对话数量"))
|
dialogue_number = serializers.IntegerField(required=True, error_messages=ErrMessage.integer(
|
||||||
|
_("Number of multi-round conversations")))
|
||||||
|
|
||||||
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean('是否返回内容'))
|
is_result = serializers.BooleanField(required=False,
|
||||||
|
error_messages=ErrMessage.boolean(_('Whether to return content')))
|
||||||
|
|
||||||
model_params_setting = serializers.DictField(required=False, error_messages=ErrMessage.integer("模型参数相关设置"))
|
model_params_setting = serializers.DictField(required=False,
|
||||||
|
error_messages=ErrMessage.integer(_("Model parameter settings")))
|
||||||
|
|
||||||
dialogue_type = serializers.CharField(required=False, allow_blank=True, allow_null=True,
|
dialogue_type = serializers.CharField(required=False, allow_blank=True, allow_null=True,
|
||||||
error_messages=ErrMessage.char("上下文类型"))
|
error_messages=ErrMessage.char(_("Context Type")))
|
||||||
|
|
||||||
|
|
||||||
class IChatNode(INode):
|
class IChatNode(INode):
|
||||||
|
|
|
||||||
|
|
@ -6,17 +6,19 @@ from rest_framework import serializers
|
||||||
from application.flow.i_step_node import INode, NodeResult
|
from application.flow.i_step_node import INode, NodeResult
|
||||||
from common.util.field_message import ErrMessage
|
from common.util.field_message import ErrMessage
|
||||||
|
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class ApplicationNodeSerializer(serializers.Serializer):
|
class ApplicationNodeSerializer(serializers.Serializer):
|
||||||
application_id = serializers.CharField(required=True, error_messages=ErrMessage.char("应用id"))
|
application_id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Application ID")))
|
||||||
question_reference_address = serializers.ListField(required=True, error_messages=ErrMessage.list("用户问题"))
|
question_reference_address = serializers.ListField(required=True, error_messages=ErrMessage.list(_("User Questions")))
|
||||||
api_input_field_list = serializers.ListField(required=False, error_messages=ErrMessage.list("api输入字段"))
|
api_input_field_list = serializers.ListField(required=False, error_messages=ErrMessage.list(_("API Input Fields")))
|
||||||
user_input_field_list = serializers.ListField(required=False, error_messages=ErrMessage.uuid("用户输入字段"))
|
user_input_field_list = serializers.ListField(required=False, error_messages=ErrMessage.uuid(_("User Input Fields")))
|
||||||
image_list = serializers.ListField(required=False, error_messages=ErrMessage.list("图片"))
|
image_list = serializers.ListField(required=False, error_messages=ErrMessage.list(_("picture")))
|
||||||
document_list = serializers.ListField(required=False, error_messages=ErrMessage.list("文档"))
|
document_list = serializers.ListField(required=False, error_messages=ErrMessage.list(_("document")))
|
||||||
audio_list = serializers.ListField(required=False, error_messages=ErrMessage.list("音频"))
|
audio_list = serializers.ListField(required=False, error_messages=ErrMessage.list(_("Audio")))
|
||||||
child_node = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.dict("子节点"))
|
child_node = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.dict(_("Child Nodes")))
|
||||||
node_data = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.dict("表单数据"))
|
node_data = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.dict(_("Form Data")))
|
||||||
|
|
||||||
|
|
||||||
class IApplicationNode(INode):
|
class IApplicationNode(INode):
|
||||||
|
|
@ -44,7 +46,7 @@ class IApplicationNode(INode):
|
||||||
app_document_list[1:])
|
app_document_list[1:])
|
||||||
for document in app_document_list:
|
for document in app_document_list:
|
||||||
if 'file_id' not in document:
|
if 'file_id' not in document:
|
||||||
raise ValueError("参数值错误: 上传的文档中缺少file_id,文档上传失败")
|
raise ValueError(_("Parameter value error: The uploaded document lacks file_id, and the document upload fails"))
|
||||||
app_image_list = self.node_params_serializer.data.get('image_list', [])
|
app_image_list = self.node_params_serializer.data.get('image_list', [])
|
||||||
if app_image_list and len(app_image_list) > 0:
|
if app_image_list and len(app_image_list) > 0:
|
||||||
app_image_list = self.workflow_manage.get_reference_field(
|
app_image_list = self.workflow_manage.get_reference_field(
|
||||||
|
|
@ -52,7 +54,7 @@ class IApplicationNode(INode):
|
||||||
app_image_list[1:])
|
app_image_list[1:])
|
||||||
for image in app_image_list:
|
for image in app_image_list:
|
||||||
if 'file_id' not in image:
|
if 'file_id' not in image:
|
||||||
raise ValueError("参数值错误: 上传的图片中缺少file_id,图片上传失败")
|
raise ValueError(_("Parameter value error: The uploaded image lacks file_id, and the image upload fails"))
|
||||||
|
|
||||||
app_audio_list = self.node_params_serializer.data.get('audio_list', [])
|
app_audio_list = self.node_params_serializer.data.get('audio_list', [])
|
||||||
if app_audio_list and len(app_audio_list) > 0:
|
if app_audio_list and len(app_audio_list) > 0:
|
||||||
|
|
@ -61,7 +63,7 @@ class IApplicationNode(INode):
|
||||||
app_audio_list[1:])
|
app_audio_list[1:])
|
||||||
for audio in app_audio_list:
|
for audio in app_audio_list:
|
||||||
if 'file_id' not in audio:
|
if 'file_id' not in audio:
|
||||||
raise ValueError("参数值错误: 上传的图片中缺少file_id,音频上传失败")
|
raise ValueError(_("Parameter value error: The uploaded image lacks file_id, and the audio upload fails."))
|
||||||
return self.execute(**self.node_params_serializer.data, **self.flow_params_serializer.data,
|
return self.execute(**self.node_params_serializer.data, **self.flow_params_serializer.data,
|
||||||
app_document_list=app_document_list, app_image_list=app_image_list,
|
app_document_list=app_document_list, app_image_list=app_image_list,
|
||||||
app_audio_list=app_audio_list,
|
app_audio_list=app_audio_list,
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@
|
||||||
@date:2024/6/7 9:54
|
@date:2024/6/7 9:54
|
||||||
@desc:
|
@desc:
|
||||||
"""
|
"""
|
||||||
import json
|
|
||||||
from typing import Type
|
from typing import Type
|
||||||
|
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from application.flow.i_step_node import INode
|
from application.flow.i_step_node import INode
|
||||||
|
|
@ -16,15 +16,15 @@ from common.util.field_message import ErrMessage
|
||||||
|
|
||||||
|
|
||||||
class ConditionSerializer(serializers.Serializer):
|
class ConditionSerializer(serializers.Serializer):
|
||||||
compare = serializers.CharField(required=True, error_messages=ErrMessage.char("比较器"))
|
compare = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Comparator")))
|
||||||
value = serializers.CharField(required=True, error_messages=ErrMessage.char(""))
|
value = serializers.CharField(required=True, error_messages=ErrMessage.char(_("value")))
|
||||||
field = serializers.ListField(required=True, error_messages=ErrMessage.char("字段"))
|
field = serializers.ListField(required=True, error_messages=ErrMessage.char(_("Fields")))
|
||||||
|
|
||||||
|
|
||||||
class ConditionBranchSerializer(serializers.Serializer):
|
class ConditionBranchSerializer(serializers.Serializer):
|
||||||
id = serializers.CharField(required=True, error_messages=ErrMessage.char("分支id"))
|
id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Branch id")))
|
||||||
type = serializers.CharField(required=True, error_messages=ErrMessage.char("分支类型"))
|
type = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Branch Type")))
|
||||||
condition = serializers.CharField(required=True, error_messages=ErrMessage.char("条件or|and"))
|
condition = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Condition or|and")))
|
||||||
conditions = ConditionSerializer(many=True)
|
conditions = ConditionSerializer(many=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,25 +13,26 @@ from rest_framework import serializers
|
||||||
from application.flow.i_step_node import INode, NodeResult
|
from application.flow.i_step_node import INode, NodeResult
|
||||||
from common.exception.app_exception import AppApiException
|
from common.exception.app_exception import AppApiException
|
||||||
from common.util.field_message import ErrMessage
|
from common.util.field_message import ErrMessage
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class ReplyNodeParamsSerializer(serializers.Serializer):
|
class ReplyNodeParamsSerializer(serializers.Serializer):
|
||||||
reply_type = serializers.CharField(required=True, error_messages=ErrMessage.char("回复类型"))
|
reply_type = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Response Type")))
|
||||||
fields = serializers.ListField(required=False, error_messages=ErrMessage.list("引用字段"))
|
fields = serializers.ListField(required=False, error_messages=ErrMessage.list(_("Reference Field")))
|
||||||
content = serializers.CharField(required=False, allow_blank=True, allow_null=True,
|
content = serializers.CharField(required=False, allow_blank=True, allow_null=True,
|
||||||
error_messages=ErrMessage.char("直接回答内容"))
|
error_messages=ErrMessage.char(_("Direct answer content")))
|
||||||
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean('是否返回内容'))
|
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_('Whether to return content')))
|
||||||
|
|
||||||
def is_valid(self, *, raise_exception=False):
|
def is_valid(self, *, raise_exception=False):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
if self.data.get('reply_type') == 'referencing':
|
if self.data.get('reply_type') == 'referencing':
|
||||||
if 'fields' not in self.data:
|
if 'fields' not in self.data:
|
||||||
raise AppApiException(500, "引用字段不能为空")
|
raise AppApiException(500, _("Reference field cannot be empty"))
|
||||||
if len(self.data.get('fields')) < 2:
|
if len(self.data.get('fields')) < 2:
|
||||||
raise AppApiException(500, "引用字段错误")
|
raise AppApiException(500, _("Reference field error"))
|
||||||
else:
|
else:
|
||||||
if 'content' not in self.data or self.data.get('content') is None:
|
if 'content' not in self.data or self.data.get('content') is None:
|
||||||
raise AppApiException(500, "内容不能为空")
|
raise AppApiException(500, _("Content cannot be empty"))
|
||||||
|
|
||||||
|
|
||||||
class IReplyNode(INode):
|
class IReplyNode(INode):
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
from typing import Type
|
from typing import Type
|
||||||
|
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from application.flow.i_step_node import INode, NodeResult
|
from application.flow.i_step_node import INode, NodeResult
|
||||||
|
|
@ -9,7 +10,7 @@ from common.util.field_message import ErrMessage
|
||||||
|
|
||||||
|
|
||||||
class DocumentExtractNodeSerializer(serializers.Serializer):
|
class DocumentExtractNodeSerializer(serializers.Serializer):
|
||||||
document_list = serializers.ListField(required=False, error_messages=ErrMessage.list("文档"))
|
document_list = serializers.ListField(required=False, error_messages=ErrMessage.list(_("document")))
|
||||||
|
|
||||||
|
|
||||||
class IDocumentExtractNode(INode):
|
class IDocumentExtractNode(INode):
|
||||||
|
|
|
||||||
|
|
@ -12,12 +12,13 @@ from rest_framework import serializers
|
||||||
|
|
||||||
from application.flow.i_step_node import INode, NodeResult
|
from application.flow.i_step_node import INode, NodeResult
|
||||||
from common.util.field_message import ErrMessage
|
from common.util.field_message import ErrMessage
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class FormNodeParamsSerializer(serializers.Serializer):
|
class FormNodeParamsSerializer(serializers.Serializer):
|
||||||
form_field_list = serializers.ListField(required=True, error_messages=ErrMessage.list("表单配置"))
|
form_field_list = serializers.ListField(required=True, error_messages=ErrMessage.list(_("Form Configuration")))
|
||||||
form_content_format = serializers.CharField(required=True, error_messages=ErrMessage.char('表单输出内容'))
|
form_content_format = serializers.CharField(required=True, error_messages=ErrMessage.char(_('Form output content')))
|
||||||
form_data = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.dict("表单数据"))
|
form_data = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.dict(_("Form Data")))
|
||||||
|
|
||||||
|
|
||||||
class IFormNode(INode):
|
class IFormNode(INode):
|
||||||
|
|
|
||||||
|
|
@ -15,23 +15,24 @@ from application.flow.i_step_node import INode, NodeResult
|
||||||
from common.field.common import ObjectField
|
from common.field.common import ObjectField
|
||||||
from common.util.field_message import ErrMessage
|
from common.util.field_message import ErrMessage
|
||||||
from function_lib.models.function import FunctionLib
|
from function_lib.models.function import FunctionLib
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class InputField(serializers.Serializer):
|
class InputField(serializers.Serializer):
|
||||||
name = serializers.CharField(required=True, error_messages=ErrMessage.char('变量名'))
|
name = serializers.CharField(required=True, error_messages=ErrMessage.char(_('Variable Name')))
|
||||||
value = ObjectField(required=True, error_messages=ErrMessage.char("变量值"), model_type_list=[str, list])
|
value = ObjectField(required=True, error_messages=ErrMessage.char(_("Variable Value")), model_type_list=[str, list])
|
||||||
|
|
||||||
|
|
||||||
class FunctionLibNodeParamsSerializer(serializers.Serializer):
|
class FunctionLibNodeParamsSerializer(serializers.Serializer):
|
||||||
function_lib_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid('函数库id'))
|
function_lib_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('Library ID')))
|
||||||
input_field_list = InputField(required=True, many=True)
|
input_field_list = InputField(required=True, many=True)
|
||||||
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean('是否返回内容'))
|
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_('Whether to return content')))
|
||||||
|
|
||||||
def is_valid(self, *, raise_exception=False):
|
def is_valid(self, *, raise_exception=False):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
f_lib = QuerySet(FunctionLib).filter(id=self.data.get('function_lib_id')).first()
|
f_lib = QuerySet(FunctionLib).filter(id=self.data.get('function_lib_id')).first()
|
||||||
if f_lib is None:
|
if f_lib is None:
|
||||||
raise Exception('函数库已被删除')
|
raise Exception(_('The library has been deleted'))
|
||||||
|
|
||||||
|
|
||||||
class IFunctionLibNode(INode):
|
class IFunctionLibNode(INode):
|
||||||
|
|
|
||||||
|
|
@ -16,32 +16,35 @@ from application.flow.i_step_node import INode, NodeResult
|
||||||
from common.exception.app_exception import AppApiException
|
from common.exception.app_exception import AppApiException
|
||||||
from common.field.common import ObjectField
|
from common.field.common import ObjectField
|
||||||
from common.util.field_message import ErrMessage
|
from common.util.field_message import ErrMessage
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
from rest_framework.utils.formatting import lazy_format
|
||||||
|
|
||||||
|
|
||||||
class InputField(serializers.Serializer):
|
class InputField(serializers.Serializer):
|
||||||
name = serializers.CharField(required=True, error_messages=ErrMessage.char('变量名'))
|
name = serializers.CharField(required=True, error_messages=ErrMessage.char(_('Variable Name')))
|
||||||
is_required = serializers.BooleanField(required=True, error_messages=ErrMessage.boolean("是否必填"))
|
is_required = serializers.BooleanField(required=True, error_messages=ErrMessage.boolean(_("Is this field required")))
|
||||||
type = serializers.CharField(required=True, error_messages=ErrMessage.char("类型"), validators=[
|
type = serializers.CharField(required=True, error_messages=ErrMessage.char(_("type")), validators=[
|
||||||
validators.RegexValidator(regex=re.compile("^string|int|dict|array|float$"),
|
validators.RegexValidator(regex=re.compile("^string|int|dict|array|float$"),
|
||||||
message="字段只支持string|int|dict|array|float", code=500)
|
message=_("字段只支持string|int|dict|array|float"), code=500)
|
||||||
])
|
])
|
||||||
source = serializers.CharField(required=True, error_messages=ErrMessage.char("来源"), validators=[
|
source = serializers.CharField(required=True, error_messages=ErrMessage.char(_("source")), validators=[
|
||||||
validators.RegexValidator(regex=re.compile("^custom|reference$"),
|
validators.RegexValidator(regex=re.compile("^custom|reference$"),
|
||||||
message="字段只支持custom|reference", code=500)
|
message=_("The field only supports custom|reference"), code=500)
|
||||||
])
|
])
|
||||||
value = ObjectField(required=True, error_messages=ErrMessage.char("变量值"), model_type_list=[str, list])
|
value = ObjectField(required=True, error_messages=ErrMessage.char(_("Variable Value")), model_type_list=[str, list])
|
||||||
|
|
||||||
def is_valid(self, *, raise_exception=False):
|
def is_valid(self, *, raise_exception=False):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
is_required = self.data.get('is_required')
|
is_required = self.data.get('is_required')
|
||||||
if is_required and self.data.get('value') is None:
|
if is_required and self.data.get('value') is None:
|
||||||
raise AppApiException(500, f'{self.data.get("name")}必填')
|
message = lazy_format(_('{field}, this field is required.'), field=self.data.get("name"))
|
||||||
|
raise AppApiException(500, message)
|
||||||
|
|
||||||
|
|
||||||
class FunctionNodeParamsSerializer(serializers.Serializer):
|
class FunctionNodeParamsSerializer(serializers.Serializer):
|
||||||
input_field_list = InputField(required=True, many=True)
|
input_field_list = InputField(required=True, many=True)
|
||||||
code = serializers.CharField(required=True, error_messages=ErrMessage.char("函数"))
|
code = serializers.CharField(required=True, error_messages=ErrMessage.char(_("function")))
|
||||||
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean('是否返回内容'))
|
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_('Whether to return content')))
|
||||||
|
|
||||||
def is_valid(self, *, raise_exception=False):
|
def is_valid(self, *, raise_exception=False):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
|
|
|
||||||
|
|
@ -6,22 +6,27 @@ from rest_framework import serializers
|
||||||
|
|
||||||
from application.flow.i_step_node import INode, NodeResult
|
from application.flow.i_step_node import INode, NodeResult
|
||||||
from common.util.field_message import ErrMessage
|
from common.util.field_message import ErrMessage
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class ImageGenerateNodeSerializer(serializers.Serializer):
|
class ImageGenerateNodeSerializer(serializers.Serializer):
|
||||||
model_id = serializers.CharField(required=True, error_messages=ErrMessage.char("模型id"))
|
model_id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Model id")))
|
||||||
|
|
||||||
prompt = serializers.CharField(required=True, error_messages=ErrMessage.char("提示词(正向)"))
|
prompt = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Prompt word (positive)")))
|
||||||
|
|
||||||
negative_prompt = serializers.CharField(required=False, error_messages=ErrMessage.char("提示词(负向)"), allow_null=True, allow_blank=True,)
|
negative_prompt = serializers.CharField(required=False, error_messages=ErrMessage.char(_("Prompt word (negative)")),
|
||||||
|
allow_null=True, allow_blank=True, )
|
||||||
# 多轮对话数量
|
# 多轮对话数量
|
||||||
dialogue_number = serializers.IntegerField(required=False, default=0, error_messages=ErrMessage.integer("多轮对话数量"))
|
dialogue_number = serializers.IntegerField(required=False, default=0,
|
||||||
|
error_messages=ErrMessage.integer(_("Number of multi-round conversations")))
|
||||||
|
|
||||||
dialogue_type = serializers.CharField(required=False, default='NODE', error_messages=ErrMessage.char("对话存储类型"))
|
dialogue_type = serializers.CharField(required=False, default='NODE',
|
||||||
|
error_messages=ErrMessage.char(_("Conversation storage type")))
|
||||||
|
|
||||||
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean('是否返回内容'))
|
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_('Whether to return content')))
|
||||||
|
|
||||||
model_params_setting = serializers.JSONField(required=False, default=dict, error_messages=ErrMessage.json("模型参数设置"))
|
model_params_setting = serializers.JSONField(required=False, default=dict,
|
||||||
|
error_messages=ErrMessage.json(_("Model parameter settings")))
|
||||||
|
|
||||||
|
|
||||||
class IImageGenerateNode(INode):
|
class IImageGenerateNode(INode):
|
||||||
|
|
|
||||||
|
|
@ -6,24 +6,25 @@ from rest_framework import serializers
|
||||||
|
|
||||||
from application.flow.i_step_node import INode, NodeResult
|
from application.flow.i_step_node import INode, NodeResult
|
||||||
from common.util.field_message import ErrMessage
|
from common.util.field_message import ErrMessage
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class ImageUnderstandNodeSerializer(serializers.Serializer):
|
class ImageUnderstandNodeSerializer(serializers.Serializer):
|
||||||
model_id = serializers.CharField(required=True, error_messages=ErrMessage.char("模型id"))
|
model_id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Model id")))
|
||||||
system = serializers.CharField(required=False, allow_blank=True, allow_null=True,
|
system = serializers.CharField(required=False, allow_blank=True, allow_null=True,
|
||||||
error_messages=ErrMessage.char("角色设定"))
|
error_messages=ErrMessage.char(_("Role Setting")))
|
||||||
prompt = serializers.CharField(required=True, error_messages=ErrMessage.char("提示词"))
|
prompt = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Prompt word")))
|
||||||
# 多轮对话数量
|
# 多轮对话数量
|
||||||
dialogue_number = serializers.IntegerField(required=True, error_messages=ErrMessage.integer("多轮对话数量"))
|
dialogue_number = serializers.IntegerField(required=True, error_messages=ErrMessage.integer(_("Number of multi-round conversations")))
|
||||||
|
|
||||||
dialogue_type = serializers.CharField(required=True, error_messages=ErrMessage.char("对话存储类型"))
|
dialogue_type = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Conversation storage type")))
|
||||||
|
|
||||||
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean('是否返回内容'))
|
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_('Whether to return content')))
|
||||||
|
|
||||||
image_list = serializers.ListField(required=False, error_messages=ErrMessage.list("图片"))
|
image_list = serializers.ListField(required=False, error_messages=ErrMessage.list(_("picture")))
|
||||||
|
|
||||||
model_params_setting = serializers.JSONField(required=False, default=dict, error_messages=ErrMessage.json("模型参数设置"))
|
|
||||||
|
|
||||||
|
model_params_setting = serializers.JSONField(required=False, default=dict,
|
||||||
|
error_messages=ErrMessage.json(_("Model parameter settings")))
|
||||||
|
|
||||||
|
|
||||||
class IImageUnderstandNode(INode):
|
class IImageUnderstandNode(INode):
|
||||||
|
|
|
||||||
|
|
@ -12,18 +12,19 @@ from rest_framework import serializers
|
||||||
|
|
||||||
from application.flow.i_step_node import INode, NodeResult
|
from application.flow.i_step_node import INode, NodeResult
|
||||||
from common.util.field_message import ErrMessage
|
from common.util.field_message import ErrMessage
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class QuestionNodeSerializer(serializers.Serializer):
|
class QuestionNodeSerializer(serializers.Serializer):
|
||||||
model_id = serializers.CharField(required=True, error_messages=ErrMessage.char("模型id"))
|
model_id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Model id")))
|
||||||
system = serializers.CharField(required=False, allow_blank=True, allow_null=True,
|
system = serializers.CharField(required=False, allow_blank=True, allow_null=True,
|
||||||
error_messages=ErrMessage.char("角色设定"))
|
error_messages=ErrMessage.char(_("Role Setting")))
|
||||||
prompt = serializers.CharField(required=True, error_messages=ErrMessage.char("提示词"))
|
prompt = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Prompt word")))
|
||||||
# 多轮对话数量
|
# 多轮对话数量
|
||||||
dialogue_number = serializers.IntegerField(required=True, error_messages=ErrMessage.integer("多轮对话数量"))
|
dialogue_number = serializers.IntegerField(required=True, error_messages=ErrMessage.integer(_("Number of multi-round conversations")))
|
||||||
|
|
||||||
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean('是否返回内容'))
|
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_('Whether to return content')))
|
||||||
model_params_setting = serializers.DictField(required=False, error_messages=ErrMessage.integer("模型参数相关设置"))
|
model_params_setting = serializers.DictField(required=False, error_messages=ErrMessage.integer(_("Model parameter settings")))
|
||||||
|
|
||||||
|
|
||||||
class IQuestionNode(INode):
|
class IQuestionNode(INode):
|
||||||
|
|
|
||||||
|
|
@ -12,17 +12,18 @@ from rest_framework import serializers
|
||||||
|
|
||||||
from application.flow.i_step_node import INode, NodeResult
|
from application.flow.i_step_node import INode, NodeResult
|
||||||
from common.util.field_message import ErrMessage
|
from common.util.field_message import ErrMessage
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class RerankerSettingSerializer(serializers.Serializer):
|
class RerankerSettingSerializer(serializers.Serializer):
|
||||||
# 需要查询的条数
|
# 需要查询的条数
|
||||||
top_n = serializers.IntegerField(required=True,
|
top_n = serializers.IntegerField(required=True,
|
||||||
error_messages=ErrMessage.integer("引用分段数"))
|
error_messages=ErrMessage.integer(_("Reference segment number")))
|
||||||
# 相似度 0-1之间
|
# 相似度 0-1之间
|
||||||
similarity = serializers.FloatField(required=True, max_value=2, min_value=0,
|
similarity = serializers.FloatField(required=True, max_value=2, min_value=0,
|
||||||
error_messages=ErrMessage.float("引用分段数"))
|
error_messages=ErrMessage.float(_("Reference segment number")))
|
||||||
max_paragraph_char_number = serializers.IntegerField(required=True,
|
max_paragraph_char_number = serializers.IntegerField(required=True,
|
||||||
error_messages=ErrMessage.float("最大引用分段字数"))
|
error_messages=ErrMessage.float(_("Maximum number of words in a quoted segment")))
|
||||||
|
|
||||||
|
|
||||||
class RerankerStepNodeSerializer(serializers.Serializer):
|
class RerankerStepNodeSerializer(serializers.Serializer):
|
||||||
|
|
|
||||||
|
|
@ -15,30 +15,31 @@ from rest_framework import serializers
|
||||||
from application.flow.i_step_node import INode, NodeResult
|
from application.flow.i_step_node import INode, NodeResult
|
||||||
from common.util.common import flat_map
|
from common.util.common import flat_map
|
||||||
from common.util.field_message import ErrMessage
|
from common.util.field_message import ErrMessage
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class DatasetSettingSerializer(serializers.Serializer):
|
class DatasetSettingSerializer(serializers.Serializer):
|
||||||
# 需要查询的条数
|
# 需要查询的条数
|
||||||
top_n = serializers.IntegerField(required=True,
|
top_n = serializers.IntegerField(required=True,
|
||||||
error_messages=ErrMessage.integer("引用分段数"))
|
error_messages=ErrMessage.integer(_("Reference segment number")))
|
||||||
# 相似度 0-1之间
|
# 相似度 0-1之间
|
||||||
similarity = serializers.FloatField(required=True, max_value=2, min_value=0,
|
similarity = serializers.FloatField(required=True, max_value=2, min_value=0,
|
||||||
error_messages=ErrMessage.float("引用分段数"))
|
error_messages=ErrMessage.float(_("引用分段数")))
|
||||||
search_mode = serializers.CharField(required=True, validators=[
|
search_mode = serializers.CharField(required=True, validators=[
|
||||||
validators.RegexValidator(regex=re.compile("^embedding|keywords|blend$"),
|
validators.RegexValidator(regex=re.compile("^embedding|keywords|blend$"),
|
||||||
message="类型只支持register|reset_password", code=500)
|
message=_("The type only supports register|reset_password"), code=500)
|
||||||
], error_messages=ErrMessage.char("检索模式"))
|
], error_messages=ErrMessage.char(_("Retrieval Mode")))
|
||||||
max_paragraph_char_number = serializers.IntegerField(required=True,
|
max_paragraph_char_number = serializers.IntegerField(required=True,
|
||||||
error_messages=ErrMessage.float("最大引用分段字数"))
|
error_messages=ErrMessage.float(_("Maximum number of words in a quoted segment")))
|
||||||
|
|
||||||
|
|
||||||
class SearchDatasetStepNodeSerializer(serializers.Serializer):
|
class SearchDatasetStepNodeSerializer(serializers.Serializer):
|
||||||
# 需要查询的数据集id列表
|
# 需要查询的数据集id列表
|
||||||
dataset_id_list = serializers.ListField(required=True, child=serializers.UUIDField(required=True),
|
dataset_id_list = serializers.ListField(required=True, child=serializers.UUIDField(required=True),
|
||||||
error_messages=ErrMessage.list("数据集id列表"))
|
error_messages=ErrMessage.list(_("Dataset id list")))
|
||||||
dataset_setting = DatasetSettingSerializer(required=True)
|
dataset_setting = DatasetSettingSerializer(required=True)
|
||||||
|
|
||||||
question_reference_address = serializers.ListField(required=True, )
|
question_reference_address = serializers.ListField(required=True)
|
||||||
|
|
||||||
def is_valid(self, *, raise_exception=False):
|
def is_valid(self, *, raise_exception=False):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
|
|
|
||||||
|
|
@ -6,14 +6,15 @@ from rest_framework import serializers
|
||||||
|
|
||||||
from application.flow.i_step_node import INode, NodeResult
|
from application.flow.i_step_node import INode, NodeResult
|
||||||
from common.util.field_message import ErrMessage
|
from common.util.field_message import ErrMessage
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class SpeechToTextNodeSerializer(serializers.Serializer):
|
class SpeechToTextNodeSerializer(serializers.Serializer):
|
||||||
stt_model_id = serializers.CharField(required=True, error_messages=ErrMessage.char("模型id"))
|
stt_model_id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Model id")))
|
||||||
|
|
||||||
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean('是否返回内容'))
|
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_('Whether to return content')))
|
||||||
|
|
||||||
audio_list = serializers.ListField(required=True, error_messages=ErrMessage.list("音频文件不能为空", ))
|
audio_list = serializers.ListField(required=True, error_messages=ErrMessage.list(_("The audio file cannot be empty")))
|
||||||
|
|
||||||
|
|
||||||
class ISpeechToTextNode(INode):
|
class ISpeechToTextNode(INode):
|
||||||
|
|
@ -27,7 +28,7 @@ class ISpeechToTextNode(INode):
|
||||||
self.node_params_serializer.data.get('audio_list')[1:])
|
self.node_params_serializer.data.get('audio_list')[1:])
|
||||||
for audio in res:
|
for audio in res:
|
||||||
if 'file_id' not in audio:
|
if 'file_id' not in audio:
|
||||||
raise ValueError("参数值错误: 上传的音频中缺少file_id,音频上传失败")
|
raise ValueError(_("Parameter value error: The uploaded audio lacks file_id, and the audio upload fails"))
|
||||||
|
|
||||||
return self.execute(audio=res, **self.node_params_serializer.data, **self.flow_params_serializer.data)
|
return self.execute(audio=res, **self.node_params_serializer.data, **self.flow_params_serializer.data)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,16 +6,17 @@ from rest_framework import serializers
|
||||||
|
|
||||||
from application.flow.i_step_node import INode, NodeResult
|
from application.flow.i_step_node import INode, NodeResult
|
||||||
from common.util.field_message import ErrMessage
|
from common.util.field_message import ErrMessage
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class TextToSpeechNodeSerializer(serializers.Serializer):
|
class TextToSpeechNodeSerializer(serializers.Serializer):
|
||||||
tts_model_id = serializers.CharField(required=True, error_messages=ErrMessage.char("模型id"))
|
tts_model_id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Model id")))
|
||||||
|
|
||||||
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean('是否返回内容'))
|
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_('Whether to return content')))
|
||||||
|
|
||||||
content_list = serializers.ListField(required=True, error_messages=ErrMessage.list("文本内容"))
|
content_list = serializers.ListField(required=True, error_messages=ErrMessage.list(_("Text content")))
|
||||||
model_params_setting = serializers.DictField(required=False,
|
model_params_setting = serializers.DictField(required=False,
|
||||||
error_messages=ErrMessage.integer("模型参数相关设置"))
|
error_messages=ErrMessage.integer(_("Model parameter settings")))
|
||||||
|
|
||||||
|
|
||||||
class ITextToSpeechNode(INode):
|
class ITextToSpeechNode(INode):
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ from django.db.models.expressions import RawSQL
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.template import Template, Context
|
from django.template import Template, Context
|
||||||
from rest_framework import serializers, status
|
from rest_framework import serializers, status
|
||||||
|
from rest_framework.utils.formatting import lazy_format
|
||||||
|
|
||||||
from application.flow.workflow_manage import Flow
|
from application.flow.workflow_manage import Flow
|
||||||
from application.models import Application, ApplicationDatasetMapping, ApplicationTypeChoices, WorkFlowVersion
|
from application.models import Application, ApplicationDatasetMapping, ApplicationTypeChoices, WorkFlowVersion
|
||||||
|
|
@ -66,13 +67,13 @@ class MKInstance:
|
||||||
|
|
||||||
|
|
||||||
class ModelDatasetAssociation(serializers.Serializer):
|
class ModelDatasetAssociation(serializers.Serializer):
|
||||||
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
|
||||||
model_id = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
model_id = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
||||||
error_messages=ErrMessage.char("模型id"))
|
error_messages=ErrMessage.char(_("Model id")))
|
||||||
dataset_id_list = serializers.ListSerializer(required=False, child=serializers.UUIDField(required=True,
|
dataset_id_list = serializers.ListSerializer(required=False, child=serializers.UUIDField(required=True,
|
||||||
error_messages=ErrMessage.uuid(
|
error_messages=ErrMessage.uuid(
|
||||||
"知识库id")),
|
_("Knowledge base id"))),
|
||||||
error_messages=ErrMessage.list("知识库列表"))
|
error_messages=ErrMessage.list(_("Knowledge Base List")))
|
||||||
|
|
||||||
def is_valid(self, *, raise_exception=True):
|
def is_valid(self, *, raise_exception=True):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
|
|
@ -80,13 +81,13 @@ class ModelDatasetAssociation(serializers.Serializer):
|
||||||
user_id = self.data.get('user_id')
|
user_id = self.data.get('user_id')
|
||||||
if model_id is not None and len(model_id) > 0:
|
if model_id is not None and len(model_id) > 0:
|
||||||
if not QuerySet(Model).filter(id=model_id).exists():
|
if not QuerySet(Model).filter(id=model_id).exists():
|
||||||
raise AppApiException(500, f'模型不存在【{model_id}】')
|
raise AppApiException(500, f'{_("Model does not exist")}【{model_id}】')
|
||||||
dataset_id_list = list(set(self.data.get('dataset_id_list')))
|
dataset_id_list = list(set(self.data.get('dataset_id_list')))
|
||||||
exist_dataset_id_list = [str(dataset.id) for dataset in
|
exist_dataset_id_list = [str(dataset.id) for dataset in
|
||||||
QuerySet(DataSet).filter(id__in=dataset_id_list, user_id=user_id)]
|
QuerySet(DataSet).filter(id__in=dataset_id_list, user_id=user_id)]
|
||||||
for dataset_id in dataset_id_list:
|
for dataset_id in dataset_id_list:
|
||||||
if not exist_dataset_id_list.__contains__(dataset_id):
|
if not exist_dataset_id_list.__contains__(dataset_id):
|
||||||
raise AppApiException(500, f'知识库id不存在【{dataset_id}】')
|
raise AppApiException(500, f'{_("The knowledge base id does not exist")}【{dataset_id}】')
|
||||||
|
|
||||||
|
|
||||||
class ApplicationSerializerModel(serializers.ModelSerializer):
|
class ApplicationSerializerModel(serializers.ModelSerializer):
|
||||||
|
|
@ -103,8 +104,8 @@ class NoReferencesChoices(models.TextChoices):
|
||||||
|
|
||||||
class NoReferencesSetting(serializers.Serializer):
|
class NoReferencesSetting(serializers.Serializer):
|
||||||
status = serializers.ChoiceField(required=True, choices=NoReferencesChoices.choices,
|
status = serializers.ChoiceField(required=True, choices=NoReferencesChoices.choices,
|
||||||
error_messages=ErrMessage.char("无引用状态"))
|
error_messages=ErrMessage.char(_("No reference status")))
|
||||||
value = serializers.CharField(required=True, error_messages=ErrMessage.char("提示词"))
|
value = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Prompt word")))
|
||||||
|
|
||||||
|
|
||||||
def valid_model_params_setting(model_id, model_params_setting):
|
def valid_model_params_setting(model_id, model_params_setting):
|
||||||
|
|
@ -117,36 +118,39 @@ def valid_model_params_setting(model_id, model_params_setting):
|
||||||
|
|
||||||
class DatasetSettingSerializer(serializers.Serializer):
|
class DatasetSettingSerializer(serializers.Serializer):
|
||||||
top_n = serializers.FloatField(required=True, max_value=100, min_value=1,
|
top_n = serializers.FloatField(required=True, max_value=100, min_value=1,
|
||||||
error_messages=ErrMessage.float("引用分段数"))
|
error_messages=ErrMessage.float(_("Reference segment number")))
|
||||||
similarity = serializers.FloatField(required=True, max_value=1, min_value=0,
|
similarity = serializers.FloatField(required=True, max_value=1, min_value=0,
|
||||||
error_messages=ErrMessage.float("相识度"))
|
error_messages=ErrMessage.float(_("Acquaintance")))
|
||||||
max_paragraph_char_number = serializers.IntegerField(required=True, min_value=500, max_value=100000,
|
max_paragraph_char_number = serializers.IntegerField(required=True, min_value=500, max_value=100000,
|
||||||
error_messages=ErrMessage.integer("最多引用字符数"))
|
error_messages=ErrMessage.integer(
|
||||||
|
_("Maximum number of quoted characters")))
|
||||||
search_mode = serializers.CharField(required=True, validators=[
|
search_mode = serializers.CharField(required=True, validators=[
|
||||||
validators.RegexValidator(regex=re.compile("^embedding|keywords|blend$"),
|
validators.RegexValidator(regex=re.compile("^embedding|keywords|blend$"),
|
||||||
message="类型只支持register|reset_password", code=500)
|
message=_("The type only supports register|reset_password"), code=500)
|
||||||
], error_messages=ErrMessage.char("检索模式"))
|
], error_messages=ErrMessage.char(_("Retrieval Mode")))
|
||||||
|
|
||||||
no_references_setting = NoReferencesSetting(required=True, error_messages=ErrMessage.base("未引用分段设置"))
|
no_references_setting = NoReferencesSetting(required=True,
|
||||||
|
error_messages=ErrMessage.base(_("Segment settings not referenced")))
|
||||||
|
|
||||||
|
|
||||||
class ModelSettingSerializer(serializers.Serializer):
|
class ModelSettingSerializer(serializers.Serializer):
|
||||||
prompt = serializers.CharField(required=False, allow_null=True, allow_blank=True, max_length=102400,
|
prompt = serializers.CharField(required=False, allow_null=True, allow_blank=True, max_length=102400,
|
||||||
error_messages=ErrMessage.char("提示词"))
|
error_messages=ErrMessage.char(_("Prompt word")))
|
||||||
system = serializers.CharField(required=False, allow_null=True, allow_blank=True, max_length=102400,
|
system = serializers.CharField(required=False, allow_null=True, allow_blank=True, max_length=102400,
|
||||||
error_messages=ErrMessage.char("角色提示词"))
|
error_messages=ErrMessage.char(_("Role prompts")))
|
||||||
no_references_prompt = serializers.CharField(required=True, max_length=102400, allow_null=True, allow_blank=True,
|
no_references_prompt = serializers.CharField(required=True, max_length=102400, allow_null=True, allow_blank=True,
|
||||||
error_messages=ErrMessage.char("无引用分段提示词"))
|
error_messages=ErrMessage.char(_("No citation segmentation prompt")))
|
||||||
|
|
||||||
|
|
||||||
class ApplicationWorkflowSerializer(serializers.Serializer):
|
class ApplicationWorkflowSerializer(serializers.Serializer):
|
||||||
name = serializers.CharField(required=True, max_length=64, min_length=1, error_messages=ErrMessage.char("应用名称"))
|
name = serializers.CharField(required=True, max_length=64, min_length=1,
|
||||||
|
error_messages=ErrMessage.char(_("Application Name")))
|
||||||
desc = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
desc = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
||||||
max_length=256, min_length=1,
|
max_length=256, min_length=1,
|
||||||
error_messages=ErrMessage.char("应用描述"))
|
error_messages=ErrMessage.char(_("Application Description")))
|
||||||
work_flow = serializers.DictField(required=False, error_messages=ErrMessage.dict("工作流对象"))
|
work_flow = serializers.DictField(required=False, error_messages=ErrMessage.dict(_("Workflow Objects")))
|
||||||
prologue = serializers.CharField(required=False, allow_null=True, allow_blank=True, max_length=4096,
|
prologue = serializers.CharField(required=False, allow_null=True, allow_blank=True, max_length=4096,
|
||||||
error_messages=ErrMessage.char("开场白"))
|
error_messages=ErrMessage.char(_("Opening remarks")))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def to_application_model(user_id: str, application: Dict):
|
def to_application_model(user_id: str, application: Dict):
|
||||||
|
|
@ -198,31 +202,35 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
max_length=256, min_length=1,
|
max_length=256, min_length=1,
|
||||||
error_messages=ErrMessage.char(_("application describe")))
|
error_messages=ErrMessage.char(_("application describe")))
|
||||||
model_id = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
model_id = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
||||||
error_messages=ErrMessage.char("模型"))
|
error_messages=ErrMessage.char(_("Model")))
|
||||||
dialogue_number = serializers.IntegerField(required=True,
|
dialogue_number = serializers.IntegerField(required=True,
|
||||||
min_value=0,
|
min_value=0,
|
||||||
max_value=1024,
|
max_value=1024,
|
||||||
error_messages=ErrMessage.integer("历史聊天记录"))
|
error_messages=ErrMessage.integer(_("Historical chat records")))
|
||||||
prologue = serializers.CharField(required=False, allow_null=True, allow_blank=True, max_length=4096,
|
prologue = serializers.CharField(required=False, allow_null=True, allow_blank=True, max_length=4096,
|
||||||
error_messages=ErrMessage.char("开场白"))
|
error_messages=ErrMessage.char(_("Opening remarks")))
|
||||||
dataset_id_list = serializers.ListSerializer(required=False, child=serializers.UUIDField(required=True),
|
dataset_id_list = serializers.ListSerializer(required=False, child=serializers.UUIDField(required=True),
|
||||||
allow_null=True, error_messages=ErrMessage.list("关联知识库"))
|
allow_null=True,
|
||||||
|
error_messages=ErrMessage.list(_("Related Knowledge Base")))
|
||||||
# 数据集相关设置
|
# 数据集相关设置
|
||||||
dataset_setting = DatasetSettingSerializer(required=True)
|
dataset_setting = DatasetSettingSerializer(required=True)
|
||||||
# 模型相关设置
|
# 模型相关设置
|
||||||
model_setting = ModelSettingSerializer(required=True)
|
model_setting = ModelSettingSerializer(required=True)
|
||||||
# 问题补全
|
# 问题补全
|
||||||
problem_optimization = serializers.BooleanField(required=True, error_messages=ErrMessage.boolean("问题补全"))
|
problem_optimization = serializers.BooleanField(required=True,
|
||||||
|
error_messages=ErrMessage.boolean(_("Question completion")))
|
||||||
problem_optimization_prompt = serializers.CharField(required=False, max_length=102400,
|
problem_optimization_prompt = serializers.CharField(required=False, max_length=102400,
|
||||||
error_messages=ErrMessage.char("问题补全提示词"))
|
error_messages=ErrMessage.char(_("Question completion prompt")))
|
||||||
# 应用类型
|
# 应用类型
|
||||||
type = serializers.CharField(required=True, error_messages=ErrMessage.char("应用类型"),
|
type = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Application Type")),
|
||||||
validators=[
|
validators=[
|
||||||
validators.RegexValidator(regex=re.compile("^SIMPLE|WORK_FLOW$"),
|
validators.RegexValidator(regex=re.compile("^SIMPLE|WORK_FLOW$"),
|
||||||
message="应用类型只支持SIMPLE|WORK_FLOW", code=500)
|
message=_(
|
||||||
|
"Application type only supports SIMPLE|WORK_FLOW"),
|
||||||
|
code=500)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
model_params_setting = serializers.DictField(required=False, error_messages=ErrMessage.dict('模型参数'))
|
model_params_setting = serializers.DictField(required=False, error_messages=ErrMessage.dict(_('Model parameters')))
|
||||||
|
|
||||||
def is_valid(self, *, user_id=None, raise_exception=False):
|
def is_valid(self, *, user_id=None, raise_exception=False):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
|
|
@ -230,9 +238,9 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
'dataset_id_list': self.data.get('dataset_id_list')}).is_valid()
|
'dataset_id_list': self.data.get('dataset_id_list')}).is_valid()
|
||||||
|
|
||||||
class Embed(serializers.Serializer):
|
class Embed(serializers.Serializer):
|
||||||
host = serializers.CharField(required=True, error_messages=ErrMessage.char("主机"))
|
host = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Host")))
|
||||||
protocol = serializers.CharField(required=True, error_messages=ErrMessage.char("协议"))
|
protocol = serializers.CharField(required=True, error_messages=ErrMessage.char(_("protocol")))
|
||||||
token = serializers.CharField(required=True, error_messages=ErrMessage.char("token"))
|
token = serializers.CharField(required=True, error_messages=ErrMessage.char(_("token")))
|
||||||
|
|
||||||
def get_embed(self, with_valid=True, params=None):
|
def get_embed(self, with_valid=True, params=None):
|
||||||
if params is None:
|
if params is None:
|
||||||
|
|
@ -310,22 +318,24 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
return query
|
return query
|
||||||
|
|
||||||
class AccessTokenSerializer(serializers.Serializer):
|
class AccessTokenSerializer(serializers.Serializer):
|
||||||
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.boolean("应用id"))
|
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.boolean(_("Application ID")))
|
||||||
|
|
||||||
class AccessTokenEditSerializer(serializers.Serializer):
|
class AccessTokenEditSerializer(serializers.Serializer):
|
||||||
access_token_reset = serializers.BooleanField(required=False,
|
access_token_reset = serializers.BooleanField(required=False,
|
||||||
error_messages=ErrMessage.boolean("重置Token"))
|
error_messages=ErrMessage.boolean(_("Reset Token")))
|
||||||
is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean("是否开启"))
|
is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_("Is it enabled")))
|
||||||
access_num = serializers.IntegerField(required=False, max_value=10000,
|
access_num = serializers.IntegerField(required=False, max_value=10000,
|
||||||
min_value=0,
|
min_value=0,
|
||||||
error_messages=ErrMessage.integer("访问次数"))
|
error_messages=ErrMessage.integer(_("Number of visits")))
|
||||||
white_active = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean("是否开启白名单"))
|
white_active = serializers.BooleanField(required=False,
|
||||||
|
error_messages=ErrMessage.boolean(_("Whether to enable whitelist")))
|
||||||
white_list = serializers.ListSerializer(required=False, child=serializers.CharField(required=True,
|
white_list = serializers.ListSerializer(required=False, child=serializers.CharField(required=True,
|
||||||
error_messages=ErrMessage.char(
|
error_messages=ErrMessage.char(
|
||||||
"白名单")),
|
_("Whitelist"))),
|
||||||
error_messages=ErrMessage.list("白名单列表")),
|
error_messages=ErrMessage.list(_("Whitelist"))),
|
||||||
show_source = serializers.BooleanField(required=False,
|
show_source = serializers.BooleanField(required=False,
|
||||||
error_messages=ErrMessage.boolean("是否显示知识来源"))
|
error_messages=ErrMessage.boolean(
|
||||||
|
_("Whether to display knowledge sources")))
|
||||||
|
|
||||||
def edit(self, instance: Dict, with_valid=True):
|
def edit(self, instance: Dict, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
|
|
@ -389,9 +399,9 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
}
|
}
|
||||||
|
|
||||||
class Authentication(serializers.Serializer):
|
class Authentication(serializers.Serializer):
|
||||||
access_token = serializers.CharField(required=True, error_messages=ErrMessage.char("access_token"))
|
access_token = serializers.CharField(required=True, error_messages=ErrMessage.char(_("access_token")))
|
||||||
authentication_value = serializers.JSONField(required=False, allow_null=True,
|
authentication_value = serializers.JSONField(required=False, allow_null=True,
|
||||||
error_messages=ErrMessage.char("认证信息"))
|
error_messages=ErrMessage.char(_("Certification Information")))
|
||||||
|
|
||||||
def auth(self, request, with_valid=True):
|
def auth(self, request, with_valid=True):
|
||||||
token = request.META.get('HTTP_AUTHORIZATION')
|
token = request.META.get('HTTP_AUTHORIZATION')
|
||||||
|
|
@ -428,7 +438,7 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
'authentication': authentication})
|
'authentication': authentication})
|
||||||
return token
|
return token
|
||||||
else:
|
else:
|
||||||
raise NotFound404(404, "无效的access_token")
|
raise NotFound404(404, _("Invalid access_token"))
|
||||||
|
|
||||||
def auth_authentication_value(self, authentication_value, application_id):
|
def auth_authentication_value(self, authentication_value, application_id):
|
||||||
application_setting_model = DBModelManage.get_model('application_setting')
|
application_setting_model = DBModelManage.get_model('application_setting')
|
||||||
|
|
@ -439,7 +449,7 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
if application_setting.authentication and authentication_value is not None:
|
if application_setting.authentication and authentication_value is not None:
|
||||||
if authentication_value.get('type') == 'password':
|
if authentication_value.get('type') == 'password':
|
||||||
if not self.auth_password(authentication_value, application_setting.authentication_value):
|
if not self.auth_password(authentication_value, application_setting.authentication_value):
|
||||||
raise AppApiException(1005, "密码错误")
|
raise AppApiException(1005, _("Wrong password"))
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
@ -448,38 +458,40 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
|
|
||||||
class Edit(serializers.Serializer):
|
class Edit(serializers.Serializer):
|
||||||
name = serializers.CharField(required=False, max_length=64, min_length=1,
|
name = serializers.CharField(required=False, max_length=64, min_length=1,
|
||||||
error_messages=ErrMessage.char("应用名称"))
|
error_messages=ErrMessage.char(_("Application Name")))
|
||||||
desc = serializers.CharField(required=False, max_length=256, min_length=1, allow_null=True, allow_blank=True,
|
desc = serializers.CharField(required=False, max_length=256, min_length=1, allow_null=True, allow_blank=True,
|
||||||
error_messages=ErrMessage.char("应用描述"))
|
error_messages=ErrMessage.char(_("Application Description")))
|
||||||
model_id = serializers.CharField(required=False, allow_blank=True, allow_null=True,
|
model_id = serializers.CharField(required=False, allow_blank=True, allow_null=True,
|
||||||
error_messages=ErrMessage.char("模型"))
|
error_messages=ErrMessage.char(_("Model")))
|
||||||
dialogue_number = serializers.IntegerField(required=False,
|
dialogue_number = serializers.IntegerField(required=False,
|
||||||
min_value=0,
|
min_value=0,
|
||||||
max_value=1024,
|
max_value=1024,
|
||||||
error_messages=ErrMessage.integer("历史聊天记录"))
|
error_messages=ErrMessage.integer(_("Historical chat records")))
|
||||||
prologue = serializers.CharField(required=False, allow_null=True, allow_blank=True, max_length=4096,
|
prologue = serializers.CharField(required=False, allow_null=True, allow_blank=True, max_length=4096,
|
||||||
error_messages=ErrMessage.char("开场白"))
|
error_messages=ErrMessage.char(_("Opening remarks")))
|
||||||
dataset_id_list = serializers.ListSerializer(required=False, child=serializers.UUIDField(required=True),
|
dataset_id_list = serializers.ListSerializer(required=False, child=serializers.UUIDField(required=True),
|
||||||
error_messages=ErrMessage.list("关联知识库")
|
error_messages=ErrMessage.list(_("Related Knowledge Base"))
|
||||||
)
|
)
|
||||||
# 数据集相关设置
|
# 数据集相关设置
|
||||||
dataset_setting = DatasetSettingSerializer(required=False, allow_null=True,
|
dataset_setting = DatasetSettingSerializer(required=False, allow_null=True,
|
||||||
error_messages=ErrMessage.json("数据集设置"))
|
error_messages=ErrMessage.json(_("Dataset settings")))
|
||||||
# 模型相关设置
|
# 模型相关设置
|
||||||
model_setting = ModelSettingSerializer(required=False, allow_null=True,
|
model_setting = ModelSettingSerializer(required=False, allow_null=True,
|
||||||
error_messages=ErrMessage.json("模型设置"))
|
error_messages=ErrMessage.json(_("Model setup")))
|
||||||
# 问题补全
|
# 问题补全
|
||||||
problem_optimization = serializers.BooleanField(required=False, allow_null=True,
|
problem_optimization = serializers.BooleanField(required=False, allow_null=True,
|
||||||
error_messages=ErrMessage.boolean("问题补全"))
|
error_messages=ErrMessage.boolean(_("Question completion")))
|
||||||
icon = serializers.CharField(required=False, allow_null=True, error_messages=ErrMessage.char("icon图标"))
|
icon = serializers.CharField(required=False, allow_null=True, error_messages=ErrMessage.char(_("Icon")))
|
||||||
|
|
||||||
model_params_setting = serializers.DictField(required=False, error_messages=ErrMessage.dict('模型参数'))
|
model_params_setting = serializers.DictField(required=False,
|
||||||
|
error_messages=ErrMessage.dict(_('Model parameters')))
|
||||||
|
|
||||||
class Create(serializers.Serializer):
|
class Create(serializers.Serializer):
|
||||||
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
|
||||||
|
|
||||||
@valid_license(model=Application, count=5,
|
@valid_license(model=Application, count=5,
|
||||||
message='社区版最多支持 5 个应用,如需拥有更多应用,请联系我们(https://fit2cloud.com/)。')
|
message=_(
|
||||||
|
'The community version supports up to 5 applications. If you need more applications, please contact us (https://fit2cloud.com/).'))
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def insert(self, application: Dict):
|
def insert(self, application: Dict):
|
||||||
application_type = application.get('type')
|
application_type = application.get('type')
|
||||||
|
|
@ -545,22 +557,22 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
return ApplicationDatasetMapping(id=uuid.uuid1(), application_id=application_id, dataset_id=dataset_id)
|
return ApplicationDatasetMapping(id=uuid.uuid1(), application_id=application_id, dataset_id=dataset_id)
|
||||||
|
|
||||||
class HitTest(serializers.Serializer):
|
class HitTest(serializers.Serializer):
|
||||||
id = serializers.CharField(required=True, error_messages=ErrMessage.uuid("应用id"))
|
id = serializers.CharField(required=True, error_messages=ErrMessage.uuid(_("Application ID")))
|
||||||
user_id = serializers.UUIDField(required=False, error_messages=ErrMessage.uuid("用户id"))
|
user_id = serializers.UUIDField(required=False, error_messages=ErrMessage.uuid(_("User ID")))
|
||||||
query_text = serializers.CharField(required=True, error_messages=ErrMessage.char("查询文本"))
|
query_text = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Query text")))
|
||||||
top_number = serializers.IntegerField(required=True, max_value=100, min_value=1,
|
top_number = serializers.IntegerField(required=True, max_value=100, min_value=1,
|
||||||
error_messages=ErrMessage.integer("topN"))
|
error_messages=ErrMessage.integer(_("topN")))
|
||||||
similarity = serializers.FloatField(required=True, max_value=2, min_value=0,
|
similarity = serializers.FloatField(required=True, max_value=2, min_value=0,
|
||||||
error_messages=ErrMessage.float("相关度"))
|
error_messages=ErrMessage.float(_("Relevance")))
|
||||||
search_mode = serializers.CharField(required=True, validators=[
|
search_mode = serializers.CharField(required=True, validators=[
|
||||||
validators.RegexValidator(regex=re.compile("^embedding|keywords|blend$"),
|
validators.RegexValidator(regex=re.compile("^embedding|keywords|blend$"),
|
||||||
message="类型只支持register|reset_password", code=500)
|
message=_("The type only supports register|reset_password"), code=500)
|
||||||
], error_messages=ErrMessage.char("检索模式"))
|
], error_messages=ErrMessage.char(_("Retrieval Mode")))
|
||||||
|
|
||||||
def is_valid(self, *, raise_exception=False):
|
def is_valid(self, *, raise_exception=False):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
if not QuerySet(Application).filter(id=self.data.get('id')).exists():
|
if not QuerySet(Application).filter(id=self.data.get('id')).exists():
|
||||||
raise AppApiException(500, '不存在的应用id')
|
raise AppApiException(500, _('Application id does not exist'))
|
||||||
|
|
||||||
def hit_test(self):
|
def hit_test(self):
|
||||||
self.is_valid()
|
self.is_valid()
|
||||||
|
|
@ -587,12 +599,12 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
'comprehensive_score': hit_dict.get(p.get('id')).get('comprehensive_score')} for p in p_list]
|
'comprehensive_score': hit_dict.get(p.get('id')).get('comprehensive_score')} for p in p_list]
|
||||||
|
|
||||||
class Query(serializers.Serializer):
|
class Query(serializers.Serializer):
|
||||||
name = serializers.CharField(required=False, error_messages=ErrMessage.char("应用名称"))
|
name = serializers.CharField(required=False, error_messages=ErrMessage.char(_("Application Name")))
|
||||||
|
|
||||||
desc = serializers.CharField(required=False, error_messages=ErrMessage.char("应用描述"))
|
desc = serializers.CharField(required=False, error_messages=ErrMessage.char(_("Application Description")))
|
||||||
|
|
||||||
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
|
||||||
select_user_id = serializers.UUIDField(required=False, error_messages=ErrMessage.uuid("选择用户id"))
|
select_user_id = serializers.UUIDField(required=False, error_messages=ErrMessage.uuid(_("Select User ID")))
|
||||||
|
|
||||||
def get_query_set(self):
|
def get_query_set(self):
|
||||||
user_id = self.data.get("user_id")
|
user_id = self.data.get("user_id")
|
||||||
|
|
@ -620,8 +632,7 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
query_set_dict['team_member_permission_custom_sql'] = QuerySet(model=get_dynamics_model(
|
query_set_dict['team_member_permission_custom_sql'] = QuerySet(model=get_dynamics_model(
|
||||||
{'user_id': models.CharField(),
|
{'user_id': models.CharField(),
|
||||||
'team_member_permission.auth_target_type': models.CharField(),
|
'team_member_permission.auth_target_type': models.CharField(),
|
||||||
'team_member_permission.operate': ArrayField(verbose_name="权限操作列表",
|
'team_member_permission.operate': ArrayField(base_field=models.CharField(max_length=256,
|
||||||
base_field=models.CharField(max_length=256,
|
|
||||||
blank=True,
|
blank=True,
|
||||||
choices=AuthOperate.choices,
|
choices=AuthOperate.choices,
|
||||||
default=AuthOperate.USE)
|
default=AuthOperate.USE)
|
||||||
|
|
@ -661,16 +672,16 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
fields = ['id', 'name', 'desc', 'prologue', 'dialogue_number', 'icon', 'type']
|
fields = ['id', 'name', 'desc', 'prologue', 'dialogue_number', 'icon', 'type']
|
||||||
|
|
||||||
class IconOperate(serializers.Serializer):
|
class IconOperate(serializers.Serializer):
|
||||||
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
|
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Application ID")))
|
||||||
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
|
||||||
image = UploadedImageField(required=True, error_messages=ErrMessage.image("图片"))
|
image = UploadedImageField(required=True, error_messages=ErrMessage.image(_("picture")))
|
||||||
|
|
||||||
def edit(self, with_valid=True):
|
def edit(self, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
self.is_valid(raise_exception=True)
|
self.is_valid(raise_exception=True)
|
||||||
application = QuerySet(Application).filter(id=self.data.get('application_id')).first()
|
application = QuerySet(Application).filter(id=self.data.get('application_id')).first()
|
||||||
if application is None:
|
if application is None:
|
||||||
raise AppApiException(500, '不存在的应用id')
|
raise AppApiException(500, _('Application id does not exist'))
|
||||||
image_id = uuid.uuid1()
|
image_id = uuid.uuid1()
|
||||||
image = Image(id=image_id, image=self.data.get('image').read(), image_name=self.data.get('image').name)
|
image = Image(id=image_id, image=self.data.get('image').read(), image_name=self.data.get('image').name)
|
||||||
image.save()
|
image.save()
|
||||||
|
|
@ -682,11 +693,12 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
return {**ApplicationSerializer.Query.reset_application(ApplicationSerializerModel(application).data)}
|
return {**ApplicationSerializer.Query.reset_application(ApplicationSerializerModel(application).data)}
|
||||||
|
|
||||||
class Import(serializers.Serializer):
|
class Import(serializers.Serializer):
|
||||||
file = UploadedFileField(required=True, error_messages=ErrMessage.image("文件"))
|
file = UploadedFileField(required=True, error_messages=ErrMessage.image(_("file")))
|
||||||
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
|
||||||
|
|
||||||
@valid_license(model=Application, count=5,
|
@valid_license(model=Application, count=5,
|
||||||
message='社区版最多支持 5 个应用,如需拥有更多应用,请联系我们(https://fit2cloud.com/)。')
|
message=_(
|
||||||
|
'The community version supports up to 5 applications. If you need more applications, please contact us (https://fit2cloud.com/).'))
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def import_(self, with_valid=True):
|
def import_(self, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
|
|
@ -696,7 +708,7 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
try:
|
try:
|
||||||
mk_instance = pickle.loads(mk_instance_bytes)
|
mk_instance = pickle.loads(mk_instance_bytes)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise AppApiException(1001, "不支持的文件格式")
|
raise AppApiException(1001, _("Unsupported file format"))
|
||||||
application = mk_instance.application
|
application = mk_instance.application
|
||||||
function_lib_list = mk_instance.function_lib_list
|
function_lib_list = mk_instance.function_lib_list
|
||||||
if len(function_lib_list) > 0:
|
if len(function_lib_list) > 0:
|
||||||
|
|
@ -755,13 +767,13 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
permission_type=PermissionType.PRIVATE)
|
permission_type=PermissionType.PRIVATE)
|
||||||
|
|
||||||
class Operate(serializers.Serializer):
|
class Operate(serializers.Serializer):
|
||||||
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
|
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Application ID")))
|
||||||
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
|
||||||
|
|
||||||
def is_valid(self, *, raise_exception=False):
|
def is_valid(self, *, raise_exception=False):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
if not QuerySet(Application).filter(id=self.data.get('application_id')).exists():
|
if not QuerySet(Application).filter(id=self.data.get('application_id')).exists():
|
||||||
raise AppApiException(500, '不存在的应用id')
|
raise AppApiException(500, _('Application id does not exist'))
|
||||||
|
|
||||||
def list_model(self, model_type=None, with_valid=True):
|
def list_model(self, model_type=None, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
|
|
@ -834,7 +846,7 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
application = QuerySet(Application).filter(id=self.data.get("application_id")).first()
|
application = QuerySet(Application).filter(id=self.data.get("application_id")).first()
|
||||||
work_flow = instance.get('work_flow')
|
work_flow = instance.get('work_flow')
|
||||||
if work_flow is None:
|
if work_flow is None:
|
||||||
raise AppApiException(500, "work_flow是必填字段")
|
raise AppApiException(500, _("work_flow is a required field"))
|
||||||
Flow.new_instance(work_flow).is_valid()
|
Flow.new_instance(work_flow).is_valid()
|
||||||
base_node = get_base_node_work_flow(work_flow)
|
base_node = get_base_node_work_flow(work_flow)
|
||||||
if base_node is not None:
|
if base_node is not None:
|
||||||
|
|
@ -896,7 +908,9 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
dataset_id_list = node_data.get('dataset_id_list', [])
|
dataset_id_list = node_data.get('dataset_id_list', [])
|
||||||
for dataset_id in dataset_id_list:
|
for dataset_id in dataset_id_list:
|
||||||
if not user_dataset_id_list.__contains__(dataset_id):
|
if not user_dataset_id_list.__contains__(dataset_id):
|
||||||
raise AppApiException(500, f"未知的知识库id${dataset_id},无法关联")
|
message = lazy_format(_('Unknown knowledge base id {dataset_id}, unable to associate'),
|
||||||
|
dataset_id=dataset_id)
|
||||||
|
raise AppApiException(500, message)
|
||||||
|
|
||||||
source_dataset_id_list = node_data.get('source_dataset_id_list', [])
|
source_dataset_id_list = node_data.get('source_dataset_id_list', [])
|
||||||
source_dataset_id_list = [source_dataset_id for source_dataset_id in source_dataset_id_list if
|
source_dataset_id_list = [source_dataset_id for source_dataset_id in source_dataset_id_list if
|
||||||
|
|
@ -914,7 +928,7 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
application = QuerySet(Application).get(id=application_id)
|
application = QuerySet(Application).get(id=application_id)
|
||||||
application_access_token = QuerySet(ApplicationAccessToken).filter(application_id=application.id).first()
|
application_access_token = QuerySet(ApplicationAccessToken).filter(application_id=application.id).first()
|
||||||
if application_access_token is None:
|
if application_access_token is None:
|
||||||
raise AppUnauthorizedFailed(500, "非法用户")
|
raise AppUnauthorizedFailed(500, _("Illegal User"))
|
||||||
application_setting_model = DBModelManage.get_model('application_setting')
|
application_setting_model = DBModelManage.get_model('application_setting')
|
||||||
if application.type == ApplicationTypeChoices.WORK_FLOW:
|
if application.type == ApplicationTypeChoices.WORK_FLOW:
|
||||||
work_flow_version = QuerySet(WorkFlowVersion).filter(application_id=application.id).order_by(
|
work_flow_version = QuerySet(WorkFlowVersion).filter(application_id=application.id).order_by(
|
||||||
|
|
@ -983,27 +997,30 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
model = QuerySet(Model).filter(
|
model = QuerySet(Model).filter(
|
||||||
id=instance.get('model_id')).first()
|
id=instance.get('model_id')).first()
|
||||||
if model is None:
|
if model is None:
|
||||||
raise AppApiException(500, "模型不存在")
|
raise AppApiException(500, _("Model does not exist"))
|
||||||
if not model.is_permission(application.user_id):
|
if not model.is_permission(application.user_id):
|
||||||
raise AppApiException(500, f"沒有权限使用该模型:{model.name}")
|
message = lazy_format(_('No permission to use this model:{model_name}'), model_name=model.name)
|
||||||
|
raise AppApiException(500, message)
|
||||||
if instance.get('stt_model_id') is None or len(instance.get('stt_model_id')) == 0:
|
if instance.get('stt_model_id') is None or len(instance.get('stt_model_id')) == 0:
|
||||||
application.stt_model_id = None
|
application.stt_model_id = None
|
||||||
else:
|
else:
|
||||||
model = QuerySet(Model).filter(
|
model = QuerySet(Model).filter(
|
||||||
id=instance.get('stt_model_id')).first()
|
id=instance.get('stt_model_id')).first()
|
||||||
if model is None:
|
if model is None:
|
||||||
raise AppApiException(500, "模型不存在")
|
raise AppApiException(500, _("Model does not exist"))
|
||||||
if not model.is_permission(application.user_id):
|
if not model.is_permission(application.user_id):
|
||||||
raise AppApiException(500, f"沒有权限使用该模型:{model.name}")
|
message = lazy_format(_('No permission to use this model:{model_name}'), model_name=model.name)
|
||||||
|
raise AppApiException(500, message)
|
||||||
if instance.get('tts_model_id') is None or len(instance.get('tts_model_id')) == 0:
|
if instance.get('tts_model_id') is None or len(instance.get('tts_model_id')) == 0:
|
||||||
application.tts_model_id = None
|
application.tts_model_id = None
|
||||||
else:
|
else:
|
||||||
model = QuerySet(Model).filter(
|
model = QuerySet(Model).filter(
|
||||||
id=instance.get('tts_model_id')).first()
|
id=instance.get('tts_model_id')).first()
|
||||||
if model is None:
|
if model is None:
|
||||||
raise AppApiException(500, "模型不存在")
|
raise AppApiException(500, _("Model does not exist"))
|
||||||
if not model.is_permission(application.user_id):
|
if not model.is_permission(application.user_id):
|
||||||
raise AppApiException(500, f"沒有权限使用该模型:{model.name}")
|
message = lazy_format(_('No permission to use this model:{model_name}'), model_name=model.name)
|
||||||
|
raise AppApiException(500, message)
|
||||||
if 'work_flow' in instance:
|
if 'work_flow' in instance:
|
||||||
# 当前用户可修改关联的知识库列表
|
# 当前用户可修改关联的知识库列表
|
||||||
application_dataset_id_list = [str(dataset_dict.get('id')) for dataset_dict in
|
application_dataset_id_list = [str(dataset_dict.get('id')) for dataset_dict in
|
||||||
|
|
@ -1030,7 +1047,9 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
self.list_dataset(with_valid=False)]
|
self.list_dataset(with_valid=False)]
|
||||||
for dataset_id in dataset_id_list:
|
for dataset_id in dataset_id_list:
|
||||||
if not application_dataset_id_list.__contains__(dataset_id):
|
if not application_dataset_id_list.__contains__(dataset_id):
|
||||||
raise AppApiException(500, f"未知的知识库id${dataset_id},无法关联")
|
message = lazy_format(_('Unknown knowledge base id {dataset_id}, unable to associate'),
|
||||||
|
dataset_id=dataset_id)
|
||||||
|
raise AppApiException(500, message)
|
||||||
|
|
||||||
self.save_application_mapping(application_dataset_id_list, dataset_id_list, application_id)
|
self.save_application_mapping(application_dataset_id_list, dataset_id_list, application_id)
|
||||||
if application.type == ApplicationTypeChoices.SIMPLE:
|
if application.type == ApplicationTypeChoices.SIMPLE:
|
||||||
|
|
@ -1180,16 +1199,16 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
fields = "__all__"
|
fields = "__all__"
|
||||||
|
|
||||||
class ApplicationKeySerializer(serializers.Serializer):
|
class ApplicationKeySerializer(serializers.Serializer):
|
||||||
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
|
||||||
|
|
||||||
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
|
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Application ID")))
|
||||||
|
|
||||||
def is_valid(self, *, raise_exception=False):
|
def is_valid(self, *, raise_exception=False):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
application_id = self.data.get("application_id")
|
application_id = self.data.get("application_id")
|
||||||
application = QuerySet(Application).filter(id=application_id).first()
|
application = QuerySet(Application).filter(id=application_id).first()
|
||||||
if application is None:
|
if application is None:
|
||||||
raise AppApiException(1001, "应用不存在")
|
raise AppApiException(1001, _("Application does not exist"))
|
||||||
|
|
||||||
def generate(self, with_valid=True):
|
def generate(self, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
|
|
@ -1211,21 +1230,22 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
QuerySet(ApplicationApiKey).filter(application_id=application_id)]
|
QuerySet(ApplicationApiKey).filter(application_id=application_id)]
|
||||||
|
|
||||||
class Edit(serializers.Serializer):
|
class Edit(serializers.Serializer):
|
||||||
is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean("是否可用"))
|
is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_("Availability")))
|
||||||
|
|
||||||
allow_cross_domain = serializers.BooleanField(required=False,
|
allow_cross_domain = serializers.BooleanField(required=False,
|
||||||
error_messages=ErrMessage.boolean("是否允许跨域"))
|
error_messages=ErrMessage.boolean(
|
||||||
|
_("Is cross-domain allowed")))
|
||||||
|
|
||||||
cross_domain_list = serializers.ListSerializer(required=False,
|
cross_domain_list = serializers.ListSerializer(required=False,
|
||||||
child=serializers.CharField(required=True,
|
child=serializers.CharField(required=True,
|
||||||
error_messages=ErrMessage.char(
|
error_messages=ErrMessage.char(
|
||||||
"跨域列表")),
|
_("Cross-domain address"))),
|
||||||
error_messages=ErrMessage.char("跨域地址"))
|
error_messages=ErrMessage.char(_("Cross-domain list")))
|
||||||
|
|
||||||
class Operate(serializers.Serializer):
|
class Operate(serializers.Serializer):
|
||||||
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
|
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Application ID")))
|
||||||
|
|
||||||
api_key_id = serializers.CharField(required=True, error_messages=ErrMessage.char("ApiKeyid"))
|
api_key_id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("ApiKeyid")))
|
||||||
|
|
||||||
def delete(self, with_valid=True):
|
def delete(self, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
|
|
@ -1246,7 +1266,7 @@ class ApplicationSerializer(serializers.Serializer):
|
||||||
application_api_key = QuerySet(ApplicationApiKey).filter(id=api_key_id,
|
application_api_key = QuerySet(ApplicationApiKey).filter(id=api_key_id,
|
||||||
application_id=application_id).first()
|
application_id=application_id).first()
|
||||||
if application_api_key is None:
|
if application_api_key is None:
|
||||||
raise AppApiException(500, '不存在')
|
raise AppApiException(500, _('APIKey does not exist'))
|
||||||
if 'is_active' in instance and instance.get('is_active') is not None:
|
if 'is_active' in instance and instance.get('is_active') is not None:
|
||||||
application_api_key.is_active = instance.get('is_active')
|
application_api_key.is_active = instance.get('is_active')
|
||||||
if 'allow_cross_domain' in instance and instance.get('allow_cross_domain') is not None:
|
if 'allow_cross_domain' in instance and instance.get('allow_cross_domain') is not None:
|
||||||
|
|
|
||||||
|
|
@ -19,12 +19,13 @@ from common.db.search import native_search, get_dynamics_model
|
||||||
from common.util.field_message import ErrMessage
|
from common.util.field_message import ErrMessage
|
||||||
from common.util.file_util import get_file_content
|
from common.util.file_util import get_file_content
|
||||||
from smartdoc.conf import PROJECT_DIR
|
from smartdoc.conf import PROJECT_DIR
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class ApplicationStatisticsSerializer(serializers.Serializer):
|
class ApplicationStatisticsSerializer(serializers.Serializer):
|
||||||
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char("应用id"))
|
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char(_("Application ID")))
|
||||||
start_time = serializers.DateField(format='%Y-%m-%d', error_messages=ErrMessage.date("开始时间"))
|
start_time = serializers.DateField(format='%Y-%m-%d', error_messages=ErrMessage.date(_("Start time")))
|
||||||
end_time = serializers.DateField(format='%Y-%m-%d', error_messages=ErrMessage.date("结束时间"))
|
end_time = serializers.DateField(format='%Y-%m-%d', error_messages=ErrMessage.date(_("End time")))
|
||||||
|
|
||||||
def get_end_time(self):
|
def get_end_time(self):
|
||||||
return datetime.datetime.combine(
|
return datetime.datetime.combine(
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
|
||||||
from django.db.models import QuerySet
|
from django.db.models import QuerySet
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from application.models import WorkFlowVersion
|
from application.models import WorkFlowVersion
|
||||||
|
|
@ -26,14 +27,14 @@ class ApplicationVersionModelSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class ApplicationVersionEditSerializer(serializers.Serializer):
|
class ApplicationVersionEditSerializer(serializers.Serializer):
|
||||||
name = serializers.CharField(required=False, max_length=128, allow_null=True, allow_blank=True,
|
name = serializers.CharField(required=False, max_length=128, allow_null=True, allow_blank=True,
|
||||||
error_messages=ErrMessage.char("版本名称"))
|
error_messages=ErrMessage.char(_("Version Name")))
|
||||||
|
|
||||||
|
|
||||||
class ApplicationVersionSerializer(serializers.Serializer):
|
class ApplicationVersionSerializer(serializers.Serializer):
|
||||||
class Query(serializers.Serializer):
|
class Query(serializers.Serializer):
|
||||||
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char("应用id"))
|
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char(_("Application ID")))
|
||||||
name = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
name = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
||||||
error_messages=ErrMessage.char("摘要"))
|
error_messages=ErrMessage.char(_("summary")))
|
||||||
|
|
||||||
def get_query_set(self):
|
def get_query_set(self):
|
||||||
query_set = QuerySet(WorkFlowVersion).filter(application_id=self.data.get('application_id'))
|
query_set = QuerySet(WorkFlowVersion).filter(application_id=self.data.get('application_id'))
|
||||||
|
|
@ -55,8 +56,9 @@ class ApplicationVersionSerializer(serializers.Serializer):
|
||||||
post_records_handler=lambda v: ApplicationVersionModelSerializer(v).data)
|
post_records_handler=lambda v: ApplicationVersionModelSerializer(v).data)
|
||||||
|
|
||||||
class Operate(serializers.Serializer):
|
class Operate(serializers.Serializer):
|
||||||
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char("应用id"))
|
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char(_("Application ID")))
|
||||||
work_flow_version_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("工作流版本id"))
|
work_flow_version_id = serializers.UUIDField(required=True,
|
||||||
|
error_messages=ErrMessage.uuid(_("Workflow version id")))
|
||||||
|
|
||||||
def one(self, with_valid=True):
|
def one(self, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
|
|
@ -66,7 +68,7 @@ class ApplicationVersionSerializer(serializers.Serializer):
|
||||||
if work_flow_version is not None:
|
if work_flow_version is not None:
|
||||||
return ApplicationVersionModelSerializer(work_flow_version).data
|
return ApplicationVersionModelSerializer(work_flow_version).data
|
||||||
else:
|
else:
|
||||||
raise AppApiException(500, '不存在的工作流版本')
|
raise AppApiException(500, _('Workflow version does not exist'))
|
||||||
|
|
||||||
def edit(self, instance: Dict, with_valid=True):
|
def edit(self, instance: Dict, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
|
|
@ -81,4 +83,4 @@ class ApplicationVersionSerializer(serializers.Serializer):
|
||||||
work_flow_version.save()
|
work_flow_version.save()
|
||||||
return ApplicationVersionModelSerializer(work_flow_version).data
|
return ApplicationVersionModelSerializer(work_flow_version).data
|
||||||
else:
|
else:
|
||||||
raise AppApiException(500, '不存在的工作流版本')
|
raise AppApiException(500, _('Workflow version does not exist'))
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ from common.util.split_model import flat_map
|
||||||
from dataset.models import Paragraph, Document
|
from dataset.models import Paragraph, Document
|
||||||
from setting.models import Model, Status
|
from setting.models import Model, Status
|
||||||
from setting.models_provider import get_model_credential
|
from setting.models_provider import get_model_credential
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
chat_cache = caches['chat_cache']
|
chat_cache = caches['chat_cache']
|
||||||
|
|
||||||
|
|
@ -93,7 +94,8 @@ class ChatInfo:
|
||||||
'chat_id': self.chat_id,
|
'chat_id': self.chat_id,
|
||||||
'dialogue_number': self.application.dialogue_number,
|
'dialogue_number': self.application.dialogue_number,
|
||||||
'problem_optimization_prompt': self.application.problem_optimization_prompt if self.application.problem_optimization_prompt is not None and len(
|
'problem_optimization_prompt': self.application.problem_optimization_prompt if self.application.problem_optimization_prompt is not None and len(
|
||||||
self.application.problem_optimization_prompt) > 0 else '()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在<data></data>标签中',
|
self.application.problem_optimization_prompt) > 0 else _(
|
||||||
|
"() contains the user's question. Answer the guessed user's question based on the context ({question}) Requirement: Output a complete question and put it in the <data></data> tag"),
|
||||||
'prompt': model_setting.get(
|
'prompt': model_setting.get(
|
||||||
'prompt') if 'prompt' in model_setting and len(model_setting.get(
|
'prompt') if 'prompt' in model_setting and len(model_setting.get(
|
||||||
'prompt')) > 0 else Application.get_default_model_prompt(),
|
'prompt')) > 0 else Application.get_default_model_prompt(),
|
||||||
|
|
@ -174,21 +176,21 @@ def get_post_handler(chat_info: ChatInfo):
|
||||||
|
|
||||||
|
|
||||||
class OpenAIMessage(serializers.Serializer):
|
class OpenAIMessage(serializers.Serializer):
|
||||||
content = serializers.CharField(required=True, error_messages=ErrMessage.char('内容'))
|
content = serializers.CharField(required=True, error_messages=ErrMessage.char(_('content')))
|
||||||
role = serializers.CharField(required=True, error_messages=ErrMessage.char('角色'))
|
role = serializers.CharField(required=True, error_messages=ErrMessage.char(_('Role')))
|
||||||
|
|
||||||
|
|
||||||
class OpenAIInstanceSerializer(serializers.Serializer):
|
class OpenAIInstanceSerializer(serializers.Serializer):
|
||||||
messages = serializers.ListField(child=OpenAIMessage())
|
messages = serializers.ListField(child=OpenAIMessage())
|
||||||
chat_id = serializers.UUIDField(required=False, error_messages=ErrMessage.char("对话id"))
|
chat_id = serializers.UUIDField(required=False, error_messages=ErrMessage.char(_("Conversation ID")))
|
||||||
re_chat = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean("重新生成"))
|
re_chat = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_("Regenerate")))
|
||||||
stream = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean("流式输出"))
|
stream = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_("Streaming Output")))
|
||||||
|
|
||||||
|
|
||||||
class OpenAIChatSerializer(serializers.Serializer):
|
class OpenAIChatSerializer(serializers.Serializer):
|
||||||
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
|
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Application ID")))
|
||||||
client_id = serializers.CharField(required=True, error_messages=ErrMessage.char("客户端id"))
|
client_id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Client id")))
|
||||||
client_type = serializers.CharField(required=True, error_messages=ErrMessage.char("客户端类型"))
|
client_type = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Client Type")))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_message(instance):
|
def get_message(instance):
|
||||||
|
|
@ -226,28 +228,29 @@ class OpenAIChatSerializer(serializers.Serializer):
|
||||||
|
|
||||||
|
|
||||||
class ChatMessageSerializer(serializers.Serializer):
|
class ChatMessageSerializer(serializers.Serializer):
|
||||||
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话id"))
|
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Conversation ID")))
|
||||||
message = serializers.CharField(required=True, error_messages=ErrMessage.char("用户问题"))
|
message = serializers.CharField(required=True, error_messages=ErrMessage.char(_("User Questions")))
|
||||||
stream = serializers.BooleanField(required=True, error_messages=ErrMessage.char("是否流式回答"))
|
stream = serializers.BooleanField(required=True,
|
||||||
re_chat = serializers.BooleanField(required=True, error_messages=ErrMessage.char("是否重新回答"))
|
error_messages=ErrMessage.char(_("Is the answer in streaming mode")))
|
||||||
|
re_chat = serializers.BooleanField(required=True, error_messages=ErrMessage.char(_("Do you want to reply again")))
|
||||||
chat_record_id = serializers.UUIDField(required=False, allow_null=True,
|
chat_record_id = serializers.UUIDField(required=False, allow_null=True,
|
||||||
error_messages=ErrMessage.uuid("对话记录id"))
|
error_messages=ErrMessage.uuid(_("Conversation record id")))
|
||||||
|
|
||||||
node_id = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
node_id = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
||||||
error_messages=ErrMessage.char("节点id"))
|
error_messages=ErrMessage.char(_("Node id")))
|
||||||
|
|
||||||
runtime_node_id = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
runtime_node_id = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
||||||
error_messages=ErrMessage.char("运行时节点id"))
|
error_messages=ErrMessage.char(_("Runtime node id")))
|
||||||
|
|
||||||
node_data = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.char("节点参数"))
|
node_data = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.char(_("Node parameters")))
|
||||||
application_id = serializers.UUIDField(required=False, allow_null=True, error_messages=ErrMessage.uuid("应用id"))
|
application_id = serializers.UUIDField(required=False, allow_null=True, error_messages=ErrMessage.uuid(_("Application ID")))
|
||||||
client_id = serializers.CharField(required=True, error_messages=ErrMessage.char("客户端id"))
|
client_id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Client id")))
|
||||||
client_type = serializers.CharField(required=True, error_messages=ErrMessage.char("客户端类型"))
|
client_type = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Client Type")))
|
||||||
form_data = serializers.DictField(required=False, error_messages=ErrMessage.char("全局变量"))
|
form_data = serializers.DictField(required=False, error_messages=ErrMessage.char(_("Global variables")))
|
||||||
image_list = serializers.ListField(required=False, error_messages=ErrMessage.list("图片"))
|
image_list = serializers.ListField(required=False, error_messages=ErrMessage.list(_("picture")))
|
||||||
document_list = serializers.ListField(required=False, error_messages=ErrMessage.list("文档"))
|
document_list = serializers.ListField(required=False, error_messages=ErrMessage.list(_("document")))
|
||||||
audio_list = serializers.ListField(required=False, error_messages=ErrMessage.list("音频"))
|
audio_list = serializers.ListField(required=False, error_messages=ErrMessage.list(_("Audio")))
|
||||||
child_node = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.dict("子节点"))
|
child_node = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.dict(_("Child Nodes")))
|
||||||
|
|
||||||
def is_valid_application_workflow(self, *, raise_exception=False):
|
def is_valid_application_workflow(self, *, raise_exception=False):
|
||||||
self.is_valid_intraday_access_num()
|
self.is_valid_intraday_access_num()
|
||||||
|
|
@ -255,7 +258,7 @@ class ChatMessageSerializer(serializers.Serializer):
|
||||||
def is_valid_chat_id(self, chat_info: ChatInfo):
|
def is_valid_chat_id(self, chat_info: ChatInfo):
|
||||||
if self.data.get('application_id') is not None and self.data.get('application_id') != str(
|
if self.data.get('application_id') is not None and self.data.get('application_id') != str(
|
||||||
chat_info.application.id):
|
chat_info.application.id):
|
||||||
raise ChatException(500, "会话不存在")
|
raise ChatException(500, _("Conversation does not exist"))
|
||||||
|
|
||||||
def is_valid_intraday_access_num(self):
|
def is_valid_intraday_access_num(self):
|
||||||
if self.data.get('client_type') == AuthenticationType.APPLICATION_ACCESS_TOKEN.value:
|
if self.data.get('client_type') == AuthenticationType.APPLICATION_ACCESS_TOKEN.value:
|
||||||
|
|
@ -272,7 +275,7 @@ class ChatMessageSerializer(serializers.Serializer):
|
||||||
application_access_token = QuerySet(ApplicationAccessToken).filter(
|
application_access_token = QuerySet(ApplicationAccessToken).filter(
|
||||||
application_id=self.data.get('application_id')).first()
|
application_id=self.data.get('application_id')).first()
|
||||||
if application_access_token.access_num <= access_client.intraday_access_num:
|
if application_access_token.access_num <= access_client.intraday_access_num:
|
||||||
raise AppChatNumOutOfBoundsFailed(1002, "访问次数超过今日访问量")
|
raise AppChatNumOutOfBoundsFailed(1002, _("The number of visits exceeds today's visits"))
|
||||||
|
|
||||||
def is_valid_application_simple(self, *, chat_info: ChatInfo, raise_exception=False):
|
def is_valid_application_simple(self, *, chat_info: ChatInfo, raise_exception=False):
|
||||||
self.is_valid_intraday_access_num()
|
self.is_valid_intraday_access_num()
|
||||||
|
|
@ -283,9 +286,9 @@ class ChatMessageSerializer(serializers.Serializer):
|
||||||
if model is None:
|
if model is None:
|
||||||
return chat_info
|
return chat_info
|
||||||
if model.status == Status.ERROR:
|
if model.status == Status.ERROR:
|
||||||
raise ChatException(500, "当前模型不可用")
|
raise ChatException(500, _("The current model is not available"))
|
||||||
if model.status == Status.DOWNLOAD:
|
if model.status == Status.DOWNLOAD:
|
||||||
raise ChatException(500, "模型正在下载中,请稍后再发起对话")
|
raise ChatException(500, _("The model is downloading, please try again later"))
|
||||||
return chat_info
|
return chat_info
|
||||||
|
|
||||||
def chat_simple(self, chat_info: ChatInfo, base_to_response):
|
def chat_simple(self, chat_info: ChatInfo, base_to_response):
|
||||||
|
|
@ -329,7 +332,7 @@ class ChatMessageSerializer(serializers.Serializer):
|
||||||
return chat_record_list[-1]
|
return chat_record_list[-1]
|
||||||
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id, chat_id=chat_info.chat_id).first()
|
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id, chat_id=chat_info.chat_id).first()
|
||||||
if chat_record is None:
|
if chat_record is None:
|
||||||
raise ChatException(500, "对话纪要不存在")
|
raise ChatException(500, _("Conversation record does not exist"))
|
||||||
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id).first()
|
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id).first()
|
||||||
return chat_record
|
return chat_record
|
||||||
|
|
||||||
|
|
@ -389,10 +392,10 @@ class ChatMessageSerializer(serializers.Serializer):
|
||||||
def re_open_chat(self, chat_id: str):
|
def re_open_chat(self, chat_id: str):
|
||||||
chat = QuerySet(Chat).filter(id=chat_id).first()
|
chat = QuerySet(Chat).filter(id=chat_id).first()
|
||||||
if chat is None:
|
if chat is None:
|
||||||
raise ChatException(500, "会话不存在")
|
raise ChatException(500, _("Conversation does not exist"))
|
||||||
application = QuerySet(Application).filter(id=chat.application_id).first()
|
application = QuerySet(Application).filter(id=chat.application_id).first()
|
||||||
if application is None:
|
if application is None:
|
||||||
raise ChatException(500, "应用不存在")
|
raise ChatException(500, _("Application does not exist"))
|
||||||
if application.type == ApplicationTypeChoices.SIMPLE:
|
if application.type == ApplicationTypeChoices.SIMPLE:
|
||||||
return self.re_open_chat_simple(chat_id, application)
|
return self.re_open_chat_simple(chat_id, application)
|
||||||
else:
|
else:
|
||||||
|
|
@ -422,7 +425,7 @@ class ChatMessageSerializer(serializers.Serializer):
|
||||||
work_flow_version = QuerySet(WorkFlowVersion).filter(application_id=application.id).order_by(
|
work_flow_version = QuerySet(WorkFlowVersion).filter(application_id=application.id).order_by(
|
||||||
'-create_time')[0:1].first()
|
'-create_time')[0:1].first()
|
||||||
if work_flow_version is None:
|
if work_flow_version is None:
|
||||||
raise ChatException(500, "应用未发布,请发布后再使用")
|
raise ChatException(500, _("The application has not been published. Please use it after publishing."))
|
||||||
|
|
||||||
chat_info = ChatInfo(chat_id, [], [], application, work_flow_version)
|
chat_info = ChatInfo(chat_id, [], [], application, work_flow_version)
|
||||||
chat_record_list = list(QuerySet(ChatRecord).filter(chat_id=chat_id).order_by('-create_time')[0:5])
|
chat_record_list = list(QuerySet(ChatRecord).filter(chat_id=chat_id).order_by('-create_time')[0:5])
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ from django.db.models import QuerySet, Q
|
||||||
from django.http import StreamingHttpResponse
|
from django.http import StreamingHttpResponse
|
||||||
from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE
|
from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
from rest_framework.utils.formatting import lazy_format
|
||||||
|
|
||||||
from application.flow.workflow_manage import Flow
|
from application.flow.workflow_manage import Flow
|
||||||
from application.models import Chat, Application, ApplicationDatasetMapping, VoteChoices, ChatRecord, WorkFlowVersion, \
|
from application.models import Chat, Application, ApplicationDatasetMapping, VoteChoices, ChatRecord, WorkFlowVersion, \
|
||||||
|
|
@ -44,13 +45,14 @@ from embedding.task import embedding_by_paragraph, embedding_by_paragraph_list
|
||||||
from setting.models import Model
|
from setting.models import Model
|
||||||
from setting.models_provider import get_model_credential
|
from setting.models_provider import get_model_credential
|
||||||
from smartdoc.conf import PROJECT_DIR
|
from smartdoc.conf import PROJECT_DIR
|
||||||
|
from django.utils.translation import gettext_lazy as _, gettext as __
|
||||||
|
|
||||||
chat_cache = caches['chat_cache']
|
chat_cache = caches['chat_cache']
|
||||||
|
|
||||||
|
|
||||||
class WorkFlowSerializers(serializers.Serializer):
|
class WorkFlowSerializers(serializers.Serializer):
|
||||||
nodes = serializers.ListSerializer(child=serializers.DictField(), error_messages=ErrMessage.uuid("节点"))
|
nodes = serializers.ListSerializer(child=serializers.DictField(), error_messages=ErrMessage.uuid(_("node")))
|
||||||
edges = serializers.ListSerializer(child=serializers.DictField(), error_messages=ErrMessage.uuid("连线"))
|
edges = serializers.ListSerializer(child=serializers.DictField(), error_messages=ErrMessage.uuid(_("Connection")))
|
||||||
|
|
||||||
|
|
||||||
def valid_model_params_setting(model_id, model_params_setting):
|
def valid_model_params_setting(model_id, model_params_setting):
|
||||||
|
|
@ -66,8 +68,8 @@ def valid_model_params_setting(model_id, model_params_setting):
|
||||||
|
|
||||||
class ChatSerializers(serializers.Serializer):
|
class ChatSerializers(serializers.Serializer):
|
||||||
class Operate(serializers.Serializer):
|
class Operate(serializers.Serializer):
|
||||||
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话id"))
|
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Conversation ID")))
|
||||||
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
|
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Application ID")))
|
||||||
|
|
||||||
def logic_delete(self, with_valid=True):
|
def logic_delete(self, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
|
|
@ -83,8 +85,8 @@ class ChatSerializers(serializers.Serializer):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
class ClientChatHistory(serializers.Serializer):
|
class ClientChatHistory(serializers.Serializer):
|
||||||
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
|
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Application ID")))
|
||||||
client_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("客户端id"))
|
client_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Client id")))
|
||||||
|
|
||||||
def page(self, current_page: int, page_size: int, with_valid=True):
|
def page(self, current_page: int, page_size: int, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
|
|
@ -96,18 +98,18 @@ class ChatSerializers(serializers.Serializer):
|
||||||
return page_search(current_page, page_size, queryset, lambda row: ChatSerializerModel(row).data)
|
return page_search(current_page, page_size, queryset, lambda row: ChatSerializerModel(row).data)
|
||||||
|
|
||||||
class Query(serializers.Serializer):
|
class Query(serializers.Serializer):
|
||||||
abstract = serializers.CharField(required=False, error_messages=ErrMessage.char("摘要"))
|
abstract = serializers.CharField(required=False, error_messages=ErrMessage.char(_("summary")))
|
||||||
start_time = serializers.DateField(format='%Y-%m-%d', error_messages=ErrMessage.date("开始时间"))
|
start_time = serializers.DateField(format='%Y-%m-%d', error_messages=ErrMessage.date(_("Start time")))
|
||||||
end_time = serializers.DateField(format='%Y-%m-%d', error_messages=ErrMessage.date("结束时间"))
|
end_time = serializers.DateField(format='%Y-%m-%d', error_messages=ErrMessage.date(_("End time")))
|
||||||
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
|
||||||
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
|
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Application ID")))
|
||||||
min_star = serializers.IntegerField(required=False, min_value=0,
|
min_star = serializers.IntegerField(required=False, min_value=0,
|
||||||
error_messages=ErrMessage.integer("最小点赞数"))
|
error_messages=ErrMessage.integer(_("Minimum number of likes")))
|
||||||
min_trample = serializers.IntegerField(required=False, min_value=0,
|
min_trample = serializers.IntegerField(required=False, min_value=0,
|
||||||
error_messages=ErrMessage.integer("最小点踩数"))
|
error_messages=ErrMessage.integer(_("Minimum number of clicks")))
|
||||||
comparer = serializers.CharField(required=False, error_messages=ErrMessage.char("比较器"), validators=[
|
comparer = serializers.CharField(required=False, error_messages=ErrMessage.char(_("Comparator")), validators=[
|
||||||
validators.RegexValidator(regex=re.compile("^and|or$"),
|
validators.RegexValidator(regex=re.compile("^and|or$"),
|
||||||
message="只支持and|or", code=500)
|
message=_("Only supports and|or"), code=500)
|
||||||
])
|
])
|
||||||
|
|
||||||
def get_end_time(self):
|
def get_end_time(self):
|
||||||
|
|
@ -222,9 +224,11 @@ class ChatSerializers(serializers.Serializer):
|
||||||
worksheet = workbook.active
|
worksheet = workbook.active
|
||||||
worksheet.title = 'Sheet1'
|
worksheet.title = 'Sheet1'
|
||||||
|
|
||||||
headers = ['会话ID', '摘要', '用户问题', '优化后问题', '回答', '用户反馈', '引用分段数',
|
headers = [__('Conversation ID'), __('summary'), __('User Questions'), __('Problem after optimization'),
|
||||||
'分段标题+内容',
|
__('answer'), __('User feedback'),
|
||||||
'标注', '消耗tokens', '耗时(s)', '提问时间']
|
__('Reference segment number'),
|
||||||
|
__('Section title + content'),
|
||||||
|
__('Annotation'), __('Consuming tokens'), __('Time consumed (s)'), __('Question Time')]
|
||||||
for col_idx, header in enumerate(headers, 1):
|
for col_idx, header in enumerate(headers, 1):
|
||||||
cell = worksheet.cell(row=1, column=col_idx)
|
cell = worksheet.cell(row=1, column=col_idx)
|
||||||
cell.value = header
|
cell.value = header
|
||||||
|
|
@ -259,16 +263,16 @@ class ChatSerializers(serializers.Serializer):
|
||||||
with_table_name=False)
|
with_table_name=False)
|
||||||
|
|
||||||
class OpenChat(serializers.Serializer):
|
class OpenChat(serializers.Serializer):
|
||||||
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
|
||||||
|
|
||||||
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
|
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Application ID")))
|
||||||
|
|
||||||
def is_valid(self, *, raise_exception=False):
|
def is_valid(self, *, raise_exception=False):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
user_id = self.data.get('user_id')
|
user_id = self.data.get('user_id')
|
||||||
application_id = self.data.get('application_id')
|
application_id = self.data.get('application_id')
|
||||||
if not QuerySet(Application).filter(id=application_id, user_id=user_id).exists():
|
if not QuerySet(Application).filter(id=application_id, user_id=user_id).exists():
|
||||||
raise AppApiException(500, '应用不存在')
|
raise AppApiException(500, __('Application does not exist'))
|
||||||
|
|
||||||
def open(self):
|
def open(self):
|
||||||
self.is_valid(raise_exception=True)
|
self.is_valid(raise_exception=True)
|
||||||
|
|
@ -286,7 +290,8 @@ class ChatSerializers(serializers.Serializer):
|
||||||
work_flow_version = QuerySet(WorkFlowVersion).filter(application_id=application_id).order_by(
|
work_flow_version = QuerySet(WorkFlowVersion).filter(application_id=application_id).order_by(
|
||||||
'-create_time')[0:1].first()
|
'-create_time')[0:1].first()
|
||||||
if work_flow_version is None:
|
if work_flow_version is None:
|
||||||
raise AppApiException(500, "应用未发布,请发布后再使用")
|
raise AppApiException(500,
|
||||||
|
__("The application has not been published. Please use it after publishing."))
|
||||||
chat_cache.set(chat_id,
|
chat_cache.set(chat_id,
|
||||||
ChatInfo(chat_id, [],
|
ChatInfo(chat_id, [],
|
||||||
[],
|
[],
|
||||||
|
|
@ -309,8 +314,8 @@ class ChatSerializers(serializers.Serializer):
|
||||||
return chat_id
|
return chat_id
|
||||||
|
|
||||||
class OpenWorkFlowChat(serializers.Serializer):
|
class OpenWorkFlowChat(serializers.Serializer):
|
||||||
work_flow = WorkFlowSerializers(error_messages=ErrMessage.uuid("工作流"))
|
work_flow = WorkFlowSerializers(error_messages=ErrMessage.uuid(_("Workflow")))
|
||||||
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
|
||||||
|
|
||||||
def open(self):
|
def open(self):
|
||||||
self.is_valid(raise_exception=True)
|
self.is_valid(raise_exception=True)
|
||||||
|
|
@ -332,26 +337,29 @@ class ChatSerializers(serializers.Serializer):
|
||||||
return chat_id
|
return chat_id
|
||||||
|
|
||||||
class OpenTempChat(serializers.Serializer):
|
class OpenTempChat(serializers.Serializer):
|
||||||
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
|
||||||
|
|
||||||
id = serializers.UUIDField(required=False, allow_null=True,
|
id = serializers.UUIDField(required=False, allow_null=True,
|
||||||
error_messages=ErrMessage.uuid("应用id"))
|
error_messages=ErrMessage.uuid(_("Application ID")))
|
||||||
model_id = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
model_id = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
||||||
error_messages=ErrMessage.uuid("模型id"))
|
error_messages=ErrMessage.uuid(_("Model id")))
|
||||||
|
|
||||||
multiple_rounds_dialogue = serializers.BooleanField(required=True,
|
multiple_rounds_dialogue = serializers.BooleanField(required=True,
|
||||||
error_messages=ErrMessage.boolean("多轮会话"))
|
error_messages=ErrMessage.boolean(
|
||||||
|
_("Multi-round conversation")))
|
||||||
|
|
||||||
dataset_id_list = serializers.ListSerializer(required=False, child=serializers.UUIDField(required=True),
|
dataset_id_list = serializers.ListSerializer(required=False, child=serializers.UUIDField(required=True),
|
||||||
error_messages=ErrMessage.list("关联数据集"))
|
error_messages=ErrMessage.list(_("Related Datasets")))
|
||||||
# 数据集相关设置
|
# 数据集相关设置
|
||||||
dataset_setting = DatasetSettingSerializer(required=True)
|
dataset_setting = DatasetSettingSerializer(required=True)
|
||||||
# 模型相关设置
|
# 模型相关设置
|
||||||
model_setting = ModelSettingSerializer(required=True)
|
model_setting = ModelSettingSerializer(required=True)
|
||||||
# 问题补全
|
# 问题补全
|
||||||
problem_optimization = serializers.BooleanField(required=True, error_messages=ErrMessage.boolean("问题补全"))
|
problem_optimization = serializers.BooleanField(required=True,
|
||||||
|
error_messages=ErrMessage.boolean(_("Question completion")))
|
||||||
# 模型相关设置
|
# 模型相关设置
|
||||||
model_params_setting = serializers.JSONField(required=False, error_messages=ErrMessage.dict("模型参数相关设置"))
|
model_params_setting = serializers.JSONField(required=False,
|
||||||
|
error_messages=ErrMessage.dict(_("Model parameter settings")))
|
||||||
|
|
||||||
def is_valid(self, *, raise_exception=False):
|
def is_valid(self, *, raise_exception=False):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
|
|
@ -365,7 +373,7 @@ class ChatSerializers(serializers.Serializer):
|
||||||
if 'id' in self.data and self.data.get('id') is not None:
|
if 'id' in self.data and self.data.get('id') is not None:
|
||||||
application = QuerySet(Application).filter(id=self.data.get('id')).first()
|
application = QuerySet(Application).filter(id=self.data.get('id')).first()
|
||||||
if application is None:
|
if application is None:
|
||||||
raise AppApiException(500, "应用不存在")
|
raise AppApiException(500, __("Application does not exist"))
|
||||||
return application.user_id
|
return application.user_id
|
||||||
return self.data.get('user_id')
|
return self.data.get('user_id')
|
||||||
|
|
||||||
|
|
@ -408,18 +416,19 @@ class ChatSerializerModel(serializers.ModelSerializer):
|
||||||
|
|
||||||
class ChatRecordSerializer(serializers.Serializer):
|
class ChatRecordSerializer(serializers.Serializer):
|
||||||
class Operate(serializers.Serializer):
|
class Operate(serializers.Serializer):
|
||||||
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话id"))
|
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Conversation ID")))
|
||||||
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
|
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Application ID")))
|
||||||
chat_record_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话记录id"))
|
chat_record_id = serializers.UUIDField(required=True,
|
||||||
|
error_messages=ErrMessage.uuid(_("Conversation record id")))
|
||||||
|
|
||||||
def is_valid(self, *, current_role=None, raise_exception=False):
|
def is_valid(self, *, current_role=None, raise_exception=False):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
application_access_token = QuerySet(ApplicationAccessToken).filter(
|
application_access_token = QuerySet(ApplicationAccessToken).filter(
|
||||||
application_id=self.data.get('application_id')).first()
|
application_id=self.data.get('application_id')).first()
|
||||||
if application_access_token is None:
|
if application_access_token is None:
|
||||||
raise AppApiException(500, '不存在的应用认证信息')
|
raise AppApiException(500, __('Application authentication information does not exist'))
|
||||||
if not application_access_token.show_source and current_role == RoleConstants.APPLICATION_ACCESS_TOKEN.value:
|
if not application_access_token.show_source and current_role == RoleConstants.APPLICATION_ACCESS_TOKEN.value:
|
||||||
raise AppApiException(500, '未开启显示知识来源')
|
raise AppApiException(500, __('Displaying knowledge sources is not enabled'))
|
||||||
|
|
||||||
def get_chat_record(self):
|
def get_chat_record(self):
|
||||||
chat_record_id = self.data.get('chat_record_id')
|
chat_record_id = self.data.get('chat_record_id')
|
||||||
|
|
@ -437,7 +446,7 @@ class ChatRecordSerializer(serializers.Serializer):
|
||||||
self.is_valid(current_role=current_role, raise_exception=True)
|
self.is_valid(current_role=current_role, raise_exception=True)
|
||||||
chat_record = self.get_chat_record()
|
chat_record = self.get_chat_record()
|
||||||
if chat_record is None:
|
if chat_record is None:
|
||||||
raise AppApiException(500, "对话不存在")
|
raise AppApiException(500, __("Conversation does not exist"))
|
||||||
return ChatRecordSerializer.Query.reset_chat_record(chat_record)
|
return ChatRecordSerializer.Query.reset_chat_record(chat_record)
|
||||||
|
|
||||||
class Query(serializers.Serializer):
|
class Query(serializers.Serializer):
|
||||||
|
|
@ -499,23 +508,26 @@ class ChatRecordSerializer(serializers.Serializer):
|
||||||
return page
|
return page
|
||||||
|
|
||||||
class Vote(serializers.Serializer):
|
class Vote(serializers.Serializer):
|
||||||
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话id"))
|
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Conversation ID")))
|
||||||
|
|
||||||
chat_record_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话记录id"))
|
chat_record_id = serializers.UUIDField(required=True,
|
||||||
|
error_messages=ErrMessage.uuid(_("Conversation record id")))
|
||||||
|
|
||||||
vote_status = serializers.ChoiceField(choices=VoteChoices.choices, error_messages=ErrMessage.uuid("投标状态"))
|
vote_status = serializers.ChoiceField(choices=VoteChoices.choices,
|
||||||
|
error_messages=ErrMessage.uuid(_("Bidding Status")))
|
||||||
|
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def vote(self, with_valid=True):
|
def vote(self, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
self.is_valid(raise_exception=True)
|
self.is_valid(raise_exception=True)
|
||||||
if not try_lock(self.data.get('chat_record_id')):
|
if not try_lock(self.data.get('chat_record_id')):
|
||||||
raise AppApiException(500, "正在对当前会话纪要进行投票中,请勿重复发送请求")
|
raise AppApiException(500,
|
||||||
|
__("Voting on the current session minutes, please do not send repeated requests"))
|
||||||
try:
|
try:
|
||||||
chat_record_details_model = QuerySet(ChatRecord).get(id=self.data.get('chat_record_id'),
|
chat_record_details_model = QuerySet(ChatRecord).get(id=self.data.get('chat_record_id'),
|
||||||
chat_id=self.data.get('chat_id'))
|
chat_id=self.data.get('chat_id'))
|
||||||
if chat_record_details_model is None:
|
if chat_record_details_model is None:
|
||||||
raise AppApiException(500, "不存在的对话 chat_record_id")
|
raise AppApiException(500, __("Non-existent conversation chat_record_id"))
|
||||||
vote_status = self.data.get("vote_status")
|
vote_status = self.data.get("vote_status")
|
||||||
if chat_record_details_model.vote_status == VoteChoices.UN_VOTE:
|
if chat_record_details_model.vote_status == VoteChoices.UN_VOTE:
|
||||||
if vote_status == VoteChoices.STAR:
|
if vote_status == VoteChoices.STAR:
|
||||||
|
|
@ -532,18 +544,18 @@ class ChatRecordSerializer(serializers.Serializer):
|
||||||
chat_record_details_model.vote_status = VoteChoices.UN_VOTE
|
chat_record_details_model.vote_status = VoteChoices.UN_VOTE
|
||||||
chat_record_details_model.save()
|
chat_record_details_model.save()
|
||||||
else:
|
else:
|
||||||
raise AppApiException(500, "已经投票过,请先取消后再进行投票")
|
raise AppApiException(500, __("Already voted, please cancel first and then vote again"))
|
||||||
finally:
|
finally:
|
||||||
un_lock(self.data.get('chat_record_id'))
|
un_lock(self.data.get('chat_record_id'))
|
||||||
return True
|
return True
|
||||||
|
|
||||||
class ImproveSerializer(serializers.Serializer):
|
class ImproveSerializer(serializers.Serializer):
|
||||||
title = serializers.CharField(required=False, max_length=256, allow_null=True, allow_blank=True,
|
title = serializers.CharField(required=False, max_length=256, allow_null=True, allow_blank=True,
|
||||||
error_messages=ErrMessage.char("段落标题"))
|
error_messages=ErrMessage.char(_("Section title")))
|
||||||
content = serializers.CharField(required=True, error_messages=ErrMessage.char("段落内容"))
|
content = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Paragraph content")))
|
||||||
|
|
||||||
problem_text = serializers.CharField(required=False, max_length=256, allow_null=True, allow_blank=True,
|
problem_text = serializers.CharField(required=False, max_length=256, allow_null=True, allow_blank=True,
|
||||||
error_messages=ErrMessage.char("问题"))
|
error_messages=ErrMessage.char(_("question")))
|
||||||
|
|
||||||
class ParagraphModel(serializers.ModelSerializer):
|
class ParagraphModel(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
@ -551,9 +563,10 @@ class ChatRecordSerializer(serializers.Serializer):
|
||||||
fields = "__all__"
|
fields = "__all__"
|
||||||
|
|
||||||
class ChatRecordImprove(serializers.Serializer):
|
class ChatRecordImprove(serializers.Serializer):
|
||||||
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话id"))
|
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Conversation ID")))
|
||||||
|
|
||||||
chat_record_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话记录id"))
|
chat_record_id = serializers.UUIDField(required=True,
|
||||||
|
error_messages=ErrMessage.uuid(_("Conversation record id")))
|
||||||
|
|
||||||
def get(self, with_valid=True):
|
def get(self, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
|
|
@ -562,7 +575,7 @@ class ChatRecordSerializer(serializers.Serializer):
|
||||||
chat_id = self.data.get('chat_id')
|
chat_id = self.data.get('chat_id')
|
||||||
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id, chat_id=chat_id).first()
|
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id, chat_id=chat_id).first()
|
||||||
if chat_record is None:
|
if chat_record is None:
|
||||||
raise AppApiException(500, '不存在的对话记录')
|
raise AppApiException(500, __('Conversation record does not exist'))
|
||||||
if chat_record.improve_paragraph_id_list is None or len(chat_record.improve_paragraph_id_list) == 0:
|
if chat_record.improve_paragraph_id_list is None or len(chat_record.improve_paragraph_id_list) == 0:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
|
@ -576,19 +589,20 @@ class ChatRecordSerializer(serializers.Serializer):
|
||||||
return [ChatRecordSerializer.ParagraphModel(p).data for p in paragraph_model_list]
|
return [ChatRecordSerializer.ParagraphModel(p).data for p in paragraph_model_list]
|
||||||
|
|
||||||
class Improve(serializers.Serializer):
|
class Improve(serializers.Serializer):
|
||||||
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话id"))
|
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Conversation ID")))
|
||||||
|
|
||||||
chat_record_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话记录id"))
|
chat_record_id = serializers.UUIDField(required=True,
|
||||||
|
error_messages=ErrMessage.uuid(_("Conversation record id")))
|
||||||
|
|
||||||
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("知识库id"))
|
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Knowledge base id")))
|
||||||
|
|
||||||
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("文档id"))
|
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Document id")))
|
||||||
|
|
||||||
def is_valid(self, *, raise_exception=False):
|
def is_valid(self, *, raise_exception=False):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
if not QuerySet(Document).filter(id=self.data.get('document_id'),
|
if not QuerySet(Document).filter(id=self.data.get('document_id'),
|
||||||
dataset_id=self.data.get('dataset_id')).exists():
|
dataset_id=self.data.get('dataset_id')).exists():
|
||||||
raise AppApiException(500, "文档id不正确")
|
raise AppApiException(500, __("The document id is incorrect"))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def post_embedding_paragraph(chat_record, paragraph_id, dataset_id):
|
def post_embedding_paragraph(chat_record, paragraph_id, dataset_id):
|
||||||
|
|
@ -607,7 +621,7 @@ class ChatRecordSerializer(serializers.Serializer):
|
||||||
chat_id = self.data.get('chat_id')
|
chat_id = self.data.get('chat_id')
|
||||||
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id, chat_id=chat_id).first()
|
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id, chat_id=chat_id).first()
|
||||||
if chat_record is None:
|
if chat_record is None:
|
||||||
raise AppApiException(500, '不存在的对话记录')
|
raise AppApiException(500, __('Conversation record does not exist'))
|
||||||
|
|
||||||
document_id = self.data.get("document_id")
|
document_id = self.data.get("document_id")
|
||||||
dataset_id = self.data.get("dataset_id")
|
dataset_id = self.data.get("dataset_id")
|
||||||
|
|
@ -634,15 +648,16 @@ class ChatRecordSerializer(serializers.Serializer):
|
||||||
return ChatRecordSerializerModel(chat_record).data, paragraph.id, dataset_id
|
return ChatRecordSerializerModel(chat_record).data, paragraph.id, dataset_id
|
||||||
|
|
||||||
class Operate(serializers.Serializer):
|
class Operate(serializers.Serializer):
|
||||||
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话id"))
|
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Conversation ID")))
|
||||||
|
|
||||||
chat_record_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话记录id"))
|
chat_record_id = serializers.UUIDField(required=True,
|
||||||
|
error_messages=ErrMessage.uuid(_("Conversation record id")))
|
||||||
|
|
||||||
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("知识库id"))
|
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Knowledge base id")))
|
||||||
|
|
||||||
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("文档id"))
|
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Document id")))
|
||||||
|
|
||||||
paragraph_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("段落id"))
|
paragraph_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Paragraph id")))
|
||||||
|
|
||||||
def delete(self, with_valid=True):
|
def delete(self, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
|
|
@ -655,9 +670,12 @@ class ChatRecordSerializer(serializers.Serializer):
|
||||||
paragraph_id = self.data.get('paragraph_id')
|
paragraph_id = self.data.get('paragraph_id')
|
||||||
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id, chat_id=chat_id).first()
|
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id, chat_id=chat_id).first()
|
||||||
if chat_record is None:
|
if chat_record is None:
|
||||||
raise AppApiException(500, '不存在的对话记录')
|
raise AppApiException(500, __('不存在的对话记录'))
|
||||||
if not chat_record.improve_paragraph_id_list.__contains__(uuid.UUID(paragraph_id)):
|
if not chat_record.improve_paragraph_id_list.__contains__(uuid.UUID(paragraph_id)):
|
||||||
raise AppApiException(500, f'段落id错误,当前对话记录不存在【{paragraph_id}】段落id')
|
message = lazy_format(
|
||||||
|
_('The paragraph id is wrong. The current conversation record does not exist. [{paragraph_id}] paragraph id'),
|
||||||
|
paragraph_id=paragraph_id)
|
||||||
|
raise AppApiException(500, message)
|
||||||
chat_record.improve_paragraph_id_list = [row for row in chat_record.improve_paragraph_id_list if
|
chat_record.improve_paragraph_id_list = [row for row in chat_record.improve_paragraph_id_list if
|
||||||
str(row) != paragraph_id]
|
str(row) != paragraph_id]
|
||||||
chat_record.save()
|
chat_record.save()
|
||||||
|
|
@ -667,15 +685,15 @@ class ChatRecordSerializer(serializers.Serializer):
|
||||||
return o.delete()
|
return o.delete()
|
||||||
|
|
||||||
class PostImprove(serializers.Serializer):
|
class PostImprove(serializers.Serializer):
|
||||||
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("知识库id"))
|
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Knowledge base id")))
|
||||||
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("文档id"))
|
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Document id")))
|
||||||
chat_ids = serializers.ListSerializer(child=serializers.UUIDField(), required=True,
|
chat_ids = serializers.ListSerializer(child=serializers.UUIDField(), required=True,
|
||||||
error_messages=ErrMessage.list("对话id"))
|
error_messages=ErrMessage.list(_("Conversation ID")))
|
||||||
|
|
||||||
def is_valid(self, *, raise_exception=False):
|
def is_valid(self, *, raise_exception=False):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
if not Document.objects.filter(id=self.data['document_id'], dataset_id=self.data['dataset_id']).exists():
|
if not Document.objects.filter(id=self.data['document_id'], dataset_id=self.data['dataset_id']).exists():
|
||||||
raise AppApiException(500, "文档id不正确")
|
raise AppApiException(500, __("The document id is incorrect"))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def post_embedding_paragraph(paragraph_ids, dataset_id):
|
def post_embedding_paragraph(paragraph_ids, dataset_id):
|
||||||
|
|
@ -694,7 +712,7 @@ class ChatRecordSerializer(serializers.Serializer):
|
||||||
# 获取所有聊天记录
|
# 获取所有聊天记录
|
||||||
chat_record_list = list(ChatRecord.objects.filter(chat_id__in=chat_ids))
|
chat_record_list = list(ChatRecord.objects.filter(chat_id__in=chat_ids))
|
||||||
if len(chat_record_list) < len(chat_ids):
|
if len(chat_record_list) < len(chat_ids):
|
||||||
raise AppApiException(500, "存在不存在的对话记录")
|
raise AppApiException(500, __("Conversation records that do not exist"))
|
||||||
|
|
||||||
# 批量创建段落和问题映射
|
# 批量创建段落和问题映射
|
||||||
paragraphs = []
|
paragraphs = []
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
from drf_yasg import openapi
|
from drf_yasg import openapi
|
||||||
|
|
||||||
from common.mixins.api_mixin import ApiMixin
|
from common.mixins.api_mixin import ApiMixin
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class ApplicationApi(ApiMixin):
|
class ApplicationApi(ApiMixin):
|
||||||
|
|
@ -20,7 +21,7 @@ class ApplicationApi(ApiMixin):
|
||||||
in_=openapi.IN_FORM,
|
in_=openapi.IN_FORM,
|
||||||
type=openapi.TYPE_FILE,
|
type=openapi.TYPE_FILE,
|
||||||
required=True,
|
required=True,
|
||||||
description='上传文件')
|
description=_('Upload files'))
|
||||||
]
|
]
|
||||||
|
|
||||||
class Authentication(ApiMixin):
|
class Authentication(ApiMixin):
|
||||||
|
|
@ -30,8 +31,9 @@ class ApplicationApi(ApiMixin):
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=['access_token', ],
|
required=['access_token', ],
|
||||||
properties={
|
properties={
|
||||||
'access_token': openapi.Schema(type=openapi.TYPE_STRING, title="应用认证token",
|
'access_token': openapi.Schema(type=openapi.TYPE_STRING,
|
||||||
description="应用认证token"),
|
title=_("Application authentication token"),
|
||||||
|
description=_("Application authentication token")),
|
||||||
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
@ -43,27 +45,35 @@ class ApplicationApi(ApiMixin):
|
||||||
required=['id', 'name', 'desc', 'model_id', 'dialogue_number', 'user_id', 'status', 'create_time',
|
required=['id', 'name', 'desc', 'model_id', 'dialogue_number', 'user_id', 'status', 'create_time',
|
||||||
'update_time'],
|
'update_time'],
|
||||||
properties={
|
properties={
|
||||||
'id': openapi.Schema(type=openapi.TYPE_STRING, title="", description="主键id"),
|
'id': openapi.Schema(type=openapi.TYPE_STRING, title="", description=_("Primary key id")),
|
||||||
'name': openapi.Schema(type=openapi.TYPE_STRING, title="应用名称", description="应用名称"),
|
'name': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application Name"),
|
||||||
'desc': openapi.Schema(type=openapi.TYPE_STRING, title="应用描述", description="应用描述"),
|
description=_("Application Name")),
|
||||||
'model_id': openapi.Schema(type=openapi.TYPE_STRING, title="模型id", description="模型id"),
|
'desc': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application Description"),
|
||||||
"dialogue_number": openapi.Schema(type=openapi.TYPE_NUMBER, title="多轮对话次数",
|
description=_("Application Description")),
|
||||||
description="多轮对话次数"),
|
'model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Model id"), description=_("Model id")),
|
||||||
'prologue': openapi.Schema(type=openapi.TYPE_STRING, title="开场白", description="开场白"),
|
"dialogue_number": openapi.Schema(type=openapi.TYPE_NUMBER,
|
||||||
|
title=_("Number of multi-round conversations"),
|
||||||
|
description=_("Number of multi-round conversations")),
|
||||||
|
'prologue': openapi.Schema(type=openapi.TYPE_STRING, title=_("Opening remarks"),
|
||||||
|
description=_("Opening remarks")),
|
||||||
'example': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_STRING),
|
'example': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_STRING),
|
||||||
title="示例列表", description="示例列表"),
|
title=_("Example List"), description=_("Example List")),
|
||||||
'user_id': openapi.Schema(type=openapi.TYPE_STRING, title="所属用户", description="所属用户"),
|
'user_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Affiliation user"),
|
||||||
|
description=_("Affiliation user")),
|
||||||
|
|
||||||
'status': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否发布", description='是否发布'),
|
'status': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Is publish"), description=_('Is publish')),
|
||||||
|
|
||||||
'create_time': openapi.Schema(type=openapi.TYPE_STRING, title="创建时间", description='创建时间'),
|
'create_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Creation time"),
|
||||||
|
description=_('Creation time')),
|
||||||
|
|
||||||
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间", description='修改时间'),
|
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Modification time"),
|
||||||
|
description=_('Modification time')),
|
||||||
|
|
||||||
'dataset_id_list': openapi.Schema(type=openapi.TYPE_ARRAY,
|
'dataset_id_list': openapi.Schema(type=openapi.TYPE_ARRAY,
|
||||||
items=openapi.Schema(type=openapi.TYPE_STRING),
|
items=openapi.Schema(type=openapi.TYPE_STRING),
|
||||||
title="关联知识库Id列表",
|
title=_("List of associated knowledge base IDs"),
|
||||||
description="关联知识库Id列表(查询详情的时候返回)")
|
description=_(
|
||||||
|
"List of associated knowledge base IDs (returned when querying details)"))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -74,11 +84,11 @@ class ApplicationApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id'),
|
description=_('Application ID')),
|
||||||
openapi.Parameter(name='model_type', in_=openapi.IN_QUERY,
|
openapi.Parameter(name='model_type', in_=openapi.IN_QUERY,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=False,
|
required=False,
|
||||||
description='模型类型'),
|
description=_('Model Type')),
|
||||||
]
|
]
|
||||||
|
|
||||||
class ApiKey(ApiMixin):
|
class ApiKey(ApiMixin):
|
||||||
|
|
@ -88,7 +98,7 @@ class ApplicationApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id')
|
description=_('Application ID'))
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -99,12 +109,12 @@ class ApplicationApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id'),
|
description=_('Application ID')),
|
||||||
openapi.Parameter(name='api_key_id',
|
openapi.Parameter(name='api_key_id',
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用api_key id')
|
description=_('Application api_key id'))
|
||||||
]
|
]
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
@ -113,11 +123,12 @@ class ApplicationApi(ApiMixin):
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=[],
|
required=[],
|
||||||
properties={
|
properties={
|
||||||
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否激活",
|
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Is activation"),
|
||||||
description="是否激活"),
|
description=_("Is activation")),
|
||||||
'allow_cross_domain': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否允许跨域",
|
'allow_cross_domain': openapi.Schema(type=openapi.TYPE_BOOLEAN,
|
||||||
description="是否允许跨域"),
|
title=_("Is cross-domain allowed"),
|
||||||
'cross_domain_list': openapi.Schema(type=openapi.TYPE_ARRAY, title='跨域列表',
|
description=_("Is cross-domain allowed")),
|
||||||
|
'cross_domain_list': openapi.Schema(type=openapi.TYPE_ARRAY, title=_('Cross-domain list'),
|
||||||
items=openapi.Schema(type=openapi.TYPE_STRING))
|
items=openapi.Schema(type=openapi.TYPE_STRING))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
@ -129,7 +140,7 @@ class ApplicationApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id')
|
description=_('Application ID'))
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -139,18 +150,21 @@ class ApplicationApi(ApiMixin):
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=[],
|
required=[],
|
||||||
properties={
|
properties={
|
||||||
'access_token_reset': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="重置Token",
|
'access_token_reset': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Reset Token"),
|
||||||
description="重置Token"),
|
description=_("Reset Token")),
|
||||||
|
|
||||||
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否激活", description="是否激活"),
|
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Is activation"),
|
||||||
'access_num': openapi.Schema(type=openapi.TYPE_NUMBER, title="访问次数", description="访问次数"),
|
description=_("Is activation")),
|
||||||
'white_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否开启白名单",
|
'access_num': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of visits"),
|
||||||
description="是否开启白名单"),
|
description=_("Number of visits")),
|
||||||
|
'white_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Whether to enable whitelist"),
|
||||||
|
description=_("Whether to enable whitelist")),
|
||||||
'white_list': openapi.Schema(type=openapi.TYPE_ARRAY,
|
'white_list': openapi.Schema(type=openapi.TYPE_ARRAY,
|
||||||
items=openapi.Schema(type=openapi.TYPE_STRING), title="白名单列表",
|
items=openapi.Schema(type=openapi.TYPE_STRING), title=_("Whitelist"),
|
||||||
description="白名单列表"),
|
description=_("Whitelist")),
|
||||||
'show_source': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否显示知识来源",
|
'show_source': openapi.Schema(type=openapi.TYPE_BOOLEAN,
|
||||||
description="是否显示知识来源"),
|
title=_("Whether to display knowledge sources"),
|
||||||
|
description=_("Whether to display knowledge sources")),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -161,37 +175,46 @@ class ApplicationApi(ApiMixin):
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=[],
|
required=[],
|
||||||
properties={
|
properties={
|
||||||
'name': openapi.Schema(type=openapi.TYPE_STRING, title="应用名称", description="应用名称"),
|
'name': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application Name"),
|
||||||
'desc': openapi.Schema(type=openapi.TYPE_STRING, title="应用描述", description="应用描述"),
|
description=_("Application Name")),
|
||||||
'model_id': openapi.Schema(type=openapi.TYPE_STRING, title="模型id", description="模型id"),
|
'desc': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application Description"),
|
||||||
"dialogue_number": openapi.Schema(type=openapi.TYPE_NUMBER, title="多轮对话次数",
|
description=_("Application Description")),
|
||||||
description="多轮对话次数"),
|
'model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Model id"),
|
||||||
'prologue': openapi.Schema(type=openapi.TYPE_STRING, title="开场白", description="开场白"),
|
description=_("Model id")),
|
||||||
|
"dialogue_number": openapi.Schema(type=openapi.TYPE_NUMBER,
|
||||||
|
title=_("Number of multi-round conversations"),
|
||||||
|
description=_("Number of multi-round conversations")),
|
||||||
|
'prologue': openapi.Schema(type=openapi.TYPE_STRING, title=_("Opening remarks"),
|
||||||
|
description=_("Opening remarks")),
|
||||||
'dataset_id_list': openapi.Schema(type=openapi.TYPE_ARRAY,
|
'dataset_id_list': openapi.Schema(type=openapi.TYPE_ARRAY,
|
||||||
items=openapi.Schema(type=openapi.TYPE_STRING),
|
items=openapi.Schema(type=openapi.TYPE_STRING),
|
||||||
title="关联知识库Id列表", description="关联知识库Id列表"),
|
title=_("List of associated knowledge base IDs"),
|
||||||
|
description=_("List of associated knowledge base IDs")),
|
||||||
'dataset_setting': ApplicationApi.DatasetSetting.get_request_body_api(),
|
'dataset_setting': ApplicationApi.DatasetSetting.get_request_body_api(),
|
||||||
'model_setting': ApplicationApi.ModelSetting.get_request_body_api(),
|
'model_setting': ApplicationApi.ModelSetting.get_request_body_api(),
|
||||||
'problem_optimization': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="问题优化",
|
'problem_optimization': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Problem Optimization"),
|
||||||
description="是否开启问题优化", default=True),
|
description=_("Whether to enable problem optimization"),
|
||||||
|
default=True),
|
||||||
'icon': openapi.Schema(type=openapi.TYPE_STRING, title="icon",
|
'icon': openapi.Schema(type=openapi.TYPE_STRING, title="icon",
|
||||||
description="icon", default="/ui/favicon.ico"),
|
description="icon", default="/ui/favicon.ico"),
|
||||||
'type': openapi.Schema(type=openapi.TYPE_STRING, title="应用类型",
|
'type': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application Type"),
|
||||||
description="应用类型 简易:SIMPLE|工作流:WORK_FLOW"),
|
description=_("Application Type SIMPLE | WORK_FLOW")),
|
||||||
'work_flow': ApplicationApi.WorkFlow.get_request_body_api(),
|
'work_flow': ApplicationApi.WorkFlow.get_request_body_api(),
|
||||||
'problem_optimization_prompt': openapi.Schema(type=openapi.TYPE_STRING, title='问题优化提示词',
|
'problem_optimization_prompt': openapi.Schema(type=openapi.TYPE_STRING,
|
||||||
description="问题优化提示词",
|
title=_('Question optimization tips'),
|
||||||
default="()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在<data></data>标签中"),
|
description=_("Question optimization tips"),
|
||||||
'tts_model_id': openapi.Schema(type=openapi.TYPE_STRING, title="文字转语音模型ID",
|
default=_(
|
||||||
description="文字转语音模型ID"),
|
"() contains the user's question. Answer the guessed user's question based on the context ({question}) Requirement: Output a complete question and put it in the <data></data> tag")),
|
||||||
'stt_model_id': openapi.Schema(type=openapi.TYPE_STRING, title="语音转文字模型id",
|
'tts_model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Text-to-speech model ID"),
|
||||||
description="语音转文字模型id"),
|
description=_("Text-to-speech model ID")),
|
||||||
'stt_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title="语音转文字是否开启",
|
'stt_model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Speech-to-text model id"),
|
||||||
description="语音转文字是否开启"),
|
description=_("Speech-to-text model id")),
|
||||||
'tts_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title="语音转文字是否开启",
|
'stt_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title=_("Is speech-to-text enabled"),
|
||||||
description="语音转文字是否开启"),
|
description=_("Is speech-to-text enabled")),
|
||||||
'tts_type': openapi.Schema(type=openapi.TYPE_STRING, title="文字转语音类型",
|
'tts_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title=_("Is text-to-speech enabled"),
|
||||||
description="文字转语音类型")
|
description=_("Is text-to-speech enabled")),
|
||||||
|
'tts_type': openapi.Schema(type=openapi.TYPE_STRING, title=_("Text-to-speech type"),
|
||||||
|
description=_("Text-to-speech type"))
|
||||||
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
@ -204,10 +227,10 @@ class ApplicationApi(ApiMixin):
|
||||||
required=[''],
|
required=[''],
|
||||||
properties={
|
properties={
|
||||||
'nodes': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_OBJECT),
|
'nodes': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_OBJECT),
|
||||||
title="节点列表", description="节点列表",
|
title=_("Node List"), description=_("Node List"),
|
||||||
default=[]),
|
default=[]),
|
||||||
'edges': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_OBJECT),
|
'edges': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_OBJECT),
|
||||||
title='连线列表', description="连线列表",
|
title=_('Connection List'), description=_("Connection List"),
|
||||||
default={}),
|
default={}),
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -220,24 +243,31 @@ class ApplicationApi(ApiMixin):
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=[''],
|
required=[''],
|
||||||
properties={
|
properties={
|
||||||
'top_n': openapi.Schema(type=openapi.TYPE_NUMBER, title="引用分段数", description="引用分段数",
|
'top_n': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Reference segment number"),
|
||||||
|
description=_("Reference segment number"),
|
||||||
default=5),
|
default=5),
|
||||||
'similarity': openapi.Schema(type=openapi.TYPE_NUMBER, title='相似度', description="相似度",
|
'similarity': openapi.Schema(type=openapi.TYPE_NUMBER, title=_('Similarity'),
|
||||||
|
description=_("Similarity"),
|
||||||
default=0.6),
|
default=0.6),
|
||||||
'max_paragraph_char_number': openapi.Schema(type=openapi.TYPE_NUMBER, title='最多引用字符数',
|
'max_paragraph_char_number': openapi.Schema(type=openapi.TYPE_NUMBER,
|
||||||
description="最多引用字符数", default=3000),
|
title=_('Maximum number of quoted characters'),
|
||||||
'search_mode': openapi.Schema(type=openapi.TYPE_STRING, title='检索模式',
|
description=_("Maximum number of quoted characters"),
|
||||||
|
default=3000),
|
||||||
|
'search_mode': openapi.Schema(type=openapi.TYPE_STRING, title=_('Retrieval Mode'),
|
||||||
description="embedding|keywords|blend", default='embedding'),
|
description="embedding|keywords|blend", default='embedding'),
|
||||||
'no_references_setting': openapi.Schema(type=openapi.TYPE_OBJECT, title='检索模式',
|
'no_references_setting': openapi.Schema(type=openapi.TYPE_OBJECT,
|
||||||
|
title=_('No reference segment settings'),
|
||||||
required=['status', 'value'],
|
required=['status', 'value'],
|
||||||
properties={
|
properties={
|
||||||
'status': openapi.Schema(type=openapi.TYPE_STRING,
|
'status': openapi.Schema(type=openapi.TYPE_STRING,
|
||||||
title="状态",
|
title=_("state"),
|
||||||
description="ai作答:ai_questioning,指定回答:designated_answer",
|
description=_(
|
||||||
|
"ai_questioning|designated_answer"),
|
||||||
default='ai_questioning'),
|
default='ai_questioning'),
|
||||||
'value': openapi.Schema(type=openapi.TYPE_STRING,
|
'value': openapi.Schema(type=openapi.TYPE_STRING,
|
||||||
title="值",
|
title=_("value"),
|
||||||
description="ai作答:就是题词,指定回答:就是指定回答内容",
|
description=_(
|
||||||
|
"ai_questioning: is the title, designated_answer: is the designated answer content"),
|
||||||
default='{question}'),
|
default='{question}'),
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
|
|
@ -250,23 +280,26 @@ class ApplicationApi(ApiMixin):
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=['prompt'],
|
required=['prompt'],
|
||||||
properties={
|
properties={
|
||||||
'prompt': openapi.Schema(type=openapi.TYPE_STRING, title="提示词", description="提示词",
|
'prompt': openapi.Schema(type=openapi.TYPE_STRING, title=_("Prompt word"),
|
||||||
default=('已知信息:'
|
description=_("Prompt word"),
|
||||||
'\n{data}'
|
default=_("""
|
||||||
'\n回答要求:'
|
Known information:
|
||||||
'\n- 如果你不知道答案或者没有从获取答案,请回答“没有在知识库中查找到相关信息,建议咨询相关技术支持或参考官方文档进行操作”。'
|
{data}
|
||||||
'\n- 避免提及你是从<data></data>中获得的知识。'
|
Answer requirements:
|
||||||
'\n- 请保持答案与<data></data>中描述的一致。'
|
- If you don't know the answer or don't get the answer, please answer "No relevant information found in the knowledge base, it is recommended to consult relevant technical support or refer to official documents for operation".
|
||||||
'\n- 请使用markdown 语法优化答案的格式。'
|
- Avoid mentioning that you got the knowledge from <data></data>.
|
||||||
'\n- <data></data>中的图片链接、链接地址和脚本语言请完整返回。'
|
- Please keep the answer consistent with the description in <data></data>.
|
||||||
'\n- 请使用与问题相同的语言来回答。'
|
- Please use markdown syntax to optimize the format of the answer.
|
||||||
'\n问题:'
|
- Please return the image link, link address and script language in <data></data> completely.
|
||||||
'\n{question}')),
|
- Please answer in the same language as the question.
|
||||||
|
Question:
|
||||||
|
{question}
|
||||||
|
""")),
|
||||||
|
|
||||||
'system': openapi.Schema(type=openapi.TYPE_STRING, title="系统提示词(角色)",
|
'system': openapi.Schema(type=openapi.TYPE_STRING, title=_("System prompt words (role)"),
|
||||||
description="系统提示词(角色)"),
|
description=_("System prompt words (role)")),
|
||||||
'no_references_prompt': openapi.Schema(type=openapi.TYPE_STRING, title="无引用分段提示词",
|
'no_references_prompt': openapi.Schema(type=openapi.TYPE_STRING, title=_("No citation segmentation prompt"),
|
||||||
default="{question}", description="无引用分段提示词")
|
default="{question}", description=_("No citation segmentation prompt"))
|
||||||
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
@ -290,34 +323,35 @@ class ApplicationApi(ApiMixin):
|
||||||
required=['name', 'desc', 'model_id', 'dialogue_number', 'dataset_setting', 'model_setting',
|
required=['name', 'desc', 'model_id', 'dialogue_number', 'dataset_setting', 'model_setting',
|
||||||
'problem_optimization', 'stt_model_enable', 'stt_model_enable', 'tts_type'],
|
'problem_optimization', 'stt_model_enable', 'stt_model_enable', 'tts_type'],
|
||||||
properties={
|
properties={
|
||||||
'name': openapi.Schema(type=openapi.TYPE_STRING, title="应用名称", description="应用名称"),
|
'name': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application Name"), description=_("Application Name")),
|
||||||
'desc': openapi.Schema(type=openapi.TYPE_STRING, title="应用描述", description="应用描述"),
|
'desc': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application Description"), description=_("Application Description")),
|
||||||
'model_id': openapi.Schema(type=openapi.TYPE_STRING, title="模型id", description="模型id"),
|
'model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Model id"), description=_("Model id")),
|
||||||
"dialogue_number": openapi.Schema(type=openapi.TYPE_NUMBER, title="多轮对话次数",
|
"dialogue_number": openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of multi-round conversations"),
|
||||||
description="多轮对话次数"),
|
description=_("Number of multi-round conversations")),
|
||||||
'prologue': openapi.Schema(type=openapi.TYPE_STRING, title="开场白", description="开场白"),
|
'prologue': openapi.Schema(type=openapi.TYPE_STRING, title=_("Opening remarks"), description=_("Opening remarks")),
|
||||||
'dataset_id_list': openapi.Schema(type=openapi.TYPE_ARRAY,
|
'dataset_id_list': openapi.Schema(type=openapi.TYPE_ARRAY,
|
||||||
items=openapi.Schema(type=openapi.TYPE_STRING),
|
items=openapi.Schema(type=openapi.TYPE_STRING),
|
||||||
title="关联知识库Id列表", description="关联知识库Id列表"),
|
title=_("List of associated knowledge base IDs"), description=_("List of associated knowledge base IDs")),
|
||||||
'dataset_setting': ApplicationApi.DatasetSetting.get_request_body_api(),
|
'dataset_setting': ApplicationApi.DatasetSetting.get_request_body_api(),
|
||||||
'model_setting': ApplicationApi.ModelSetting.get_request_body_api(),
|
'model_setting': ApplicationApi.ModelSetting.get_request_body_api(),
|
||||||
'problem_optimization': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="问题优化",
|
'problem_optimization': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Problem Optimization"),
|
||||||
description="是否开启问题优化", default=True),
|
description=_("Problem Optimization"), default=True),
|
||||||
'type': openapi.Schema(type=openapi.TYPE_STRING, title="应用类型",
|
'type': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application Type"),
|
||||||
description="应用类型 简易:SIMPLE|工作流:WORK_FLOW"),
|
description=_("Application Type SIMPLE | WORK_FLOW")),
|
||||||
'problem_optimization_prompt': openapi.Schema(type=openapi.TYPE_STRING, title='问题优化提示词',
|
'problem_optimization_prompt': openapi.Schema(type=openapi.TYPE_STRING, title=_('Question optimization tips'),
|
||||||
description="问题优化提示词",
|
description=_("Question optimization tips"),
|
||||||
default="()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在<data></data>标签中"),
|
default=_(
|
||||||
'tts_model_id': openapi.Schema(type=openapi.TYPE_STRING, title="文字转语音模型ID",
|
"() contains the user's question. Answer the guessed user's question based on the context ({question}) Requirement: Output a complete question and put it in the <data></data> tag")),
|
||||||
description="文字转语音模型ID"),
|
'tts_model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Text-to-speech model ID"),
|
||||||
'stt_model_id': openapi.Schema(type=openapi.TYPE_STRING, title="语音转文字模型id",
|
description=_("Text-to-speech model ID")),
|
||||||
description="语音转文字模型id"),
|
'stt_model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Speech-to-text model id"),
|
||||||
'stt_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title="语音转文字是否开启",
|
description=_("Speech-to-text model id")),
|
||||||
description="语音转文字是否开启"),
|
'stt_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title=_("Is speech-to-text enabled"),
|
||||||
'tts_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title="语音转文字是否开启",
|
description=_("Is speech-to-text enabled")),
|
||||||
description="语音转文字是否开启"),
|
'tts_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title=_("Is text-to-speech enabled"),
|
||||||
'tts_type': openapi.Schema(type=openapi.TYPE_STRING, title="文字转语音类型",
|
description=_("Is text-to-speech enabled")),
|
||||||
description="文字转语音类型")
|
'tts_type': openapi.Schema(type=openapi.TYPE_STRING, title=_("Text-to-speech type"),
|
||||||
|
description=_("Text-to-speech type"))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -328,12 +362,12 @@ class ApplicationApi(ApiMixin):
|
||||||
in_=openapi.IN_QUERY,
|
in_=openapi.IN_QUERY,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=False,
|
required=False,
|
||||||
description='应用名称'),
|
description=_('Application Name')),
|
||||||
openapi.Parameter(name='desc',
|
openapi.Parameter(name='desc',
|
||||||
in_=openapi.IN_QUERY,
|
in_=openapi.IN_QUERY,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=False,
|
required=False,
|
||||||
description='应用描述')
|
description=_('Application Description'))
|
||||||
]
|
]
|
||||||
|
|
||||||
class Export(ApiMixin):
|
class Export(ApiMixin):
|
||||||
|
|
@ -343,7 +377,7 @@ class ApplicationApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id'),
|
description=_('Application ID')),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -354,7 +388,7 @@ class ApplicationApi(ApiMixin):
|
||||||
in_=openapi.IN_FORM,
|
in_=openapi.IN_FORM,
|
||||||
type=openapi.TYPE_FILE,
|
type=openapi.TYPE_FILE,
|
||||||
required=True,
|
required=True,
|
||||||
description='上传图片文件')
|
description=_('Upload image files'))
|
||||||
]
|
]
|
||||||
|
|
||||||
class Operate(ApiMixin):
|
class Operate(ApiMixin):
|
||||||
|
|
@ -364,6 +398,6 @@ class ApplicationApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id'),
|
description=_('Application ID')),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
from drf_yasg import openapi
|
from drf_yasg import openapi
|
||||||
|
|
||||||
from common.mixins.api_mixin import ApiMixin
|
from common.mixins.api_mixin import ApiMixin
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
class ApplicationStatisticsApi(ApiMixin):
|
class ApplicationStatisticsApi(ApiMixin):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
@ -18,17 +18,17 @@ class ApplicationStatisticsApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id'),
|
description=_('Application ID')),
|
||||||
openapi.Parameter(name='start_time',
|
openapi.Parameter(name='start_time',
|
||||||
in_=openapi.IN_QUERY,
|
in_=openapi.IN_QUERY,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='开始时间'),
|
description=_('Start time')),
|
||||||
openapi.Parameter(name='end_time',
|
openapi.Parameter(name='end_time',
|
||||||
in_=openapi.IN_QUERY,
|
in_=openapi.IN_QUERY,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='结束时间'),
|
description=_('End time')),
|
||||||
]
|
]
|
||||||
|
|
||||||
class ChatRecordAggregate(ApiMixin):
|
class ChatRecordAggregate(ApiMixin):
|
||||||
|
|
@ -38,21 +38,21 @@ class ApplicationStatisticsApi(ApiMixin):
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=['star_num', 'trample_num', 'tokens_num', 'chat_record_count'],
|
required=['star_num', 'trample_num', 'tokens_num', 'chat_record_count'],
|
||||||
properties={
|
properties={
|
||||||
'star_num': openapi.Schema(type=openapi.TYPE_NUMBER, title="点赞数量",
|
'star_num': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of Likes"),
|
||||||
description="点赞数量"),
|
description=_("Number of Likes")),
|
||||||
|
|
||||||
'trample_num': openapi.Schema(type=openapi.TYPE_NUMBER, title="点踩数量", description="点踩数量"),
|
'trample_num': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of thumbs-downs"), description=_("Number of thumbs-downs")),
|
||||||
'tokens_num': openapi.Schema(type=openapi.TYPE_NUMBER, title="token使用数量",
|
'tokens_num': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of tokens used"),
|
||||||
description="token使用数量"),
|
description=_("Number of tokens used")),
|
||||||
'chat_record_count': openapi.Schema(type=openapi.TYPE_NUMBER, title="对话次数",
|
'chat_record_count': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of conversations"),
|
||||||
description="对话次数"),
|
description=_("Number of conversations")),
|
||||||
'customer_num': openapi.Schema(type=openapi.TYPE_NUMBER, title="客户数量",
|
'customer_num': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of customers"),
|
||||||
description="客户数量"),
|
description=_("Number of customers")),
|
||||||
'customer_added_count': openapi.Schema(type=openapi.TYPE_NUMBER, title="客户新增数量",
|
'customer_added_count': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of new customers"),
|
||||||
description="客户新增数量"),
|
description=_("Number of new customers")),
|
||||||
'day': openapi.Schema(type=openapi.TYPE_STRING,
|
'day': openapi.Schema(type=openapi.TYPE_STRING,
|
||||||
title="日期",
|
title=_("time"),
|
||||||
description="日期,只有查询趋势的时候才有该字段"),
|
description=_("Time, this field is only available when querying trends")),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -63,11 +63,11 @@ class ApplicationStatisticsApi(ApiMixin):
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=['added_count'],
|
required=['added_count'],
|
||||||
properties={
|
properties={
|
||||||
'added_count': openapi.Schema(type=openapi.TYPE_NUMBER, title="新增数量", description="新增数量"),
|
'added_count': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("New quantity"), description=_("New quantity")),
|
||||||
|
|
||||||
'day': openapi.Schema(type=openapi.TYPE_STRING,
|
'day': openapi.Schema(type=openapi.TYPE_STRING,
|
||||||
title="时间",
|
title=_("time"),
|
||||||
description="时间"),
|
description=_("time")),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -78,9 +78,9 @@ class ApplicationStatisticsApi(ApiMixin):
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=['added_count'],
|
required=['added_count'],
|
||||||
properties={
|
properties={
|
||||||
'today_added_count': openapi.Schema(type=openapi.TYPE_NUMBER, title="今日新增数量",
|
'today_added_count': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Today's new quantity"),
|
||||||
description="今日新增数量"),
|
description=_("Today's new quantity")),
|
||||||
'added_count': openapi.Schema(type=openapi.TYPE_NUMBER, title="新增数量", description="新增数量"),
|
'added_count': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("New quantity"), description=_("New quantity")),
|
||||||
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
from drf_yasg import openapi
|
from drf_yasg import openapi
|
||||||
|
|
||||||
from common.mixins.api_mixin import ApiMixin
|
from common.mixins.api_mixin import ApiMixin
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class ApplicationVersionApi(ApiMixin):
|
class ApplicationVersionApi(ApiMixin):
|
||||||
|
|
@ -18,13 +19,16 @@ class ApplicationVersionApi(ApiMixin):
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=['id', 'name', 'work_flow', 'create_time', 'update_time'],
|
required=['id', 'name', 'work_flow', 'create_time', 'update_time'],
|
||||||
properties={
|
properties={
|
||||||
'id': openapi.Schema(type=openapi.TYPE_NUMBER, title="主键id",
|
'id': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Primary key id"),
|
||||||
description="主键id"),
|
description=_("Primary key id")),
|
||||||
'name': openapi.Schema(type=openapi.TYPE_NUMBER, title="版本名称",
|
'name': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Version Name"),
|
||||||
description="版本名称"),
|
description=_("Version Name")),
|
||||||
'work_flow': openapi.Schema(type=openapi.TYPE_STRING, title="工作流数据", description='工作流数据'),
|
'work_flow': openapi.Schema(type=openapi.TYPE_STRING, title=_("Workflow data"),
|
||||||
'create_time': openapi.Schema(type=openapi.TYPE_STRING, title="创建时间", description='创建时间'),
|
description=_('Workflow data')),
|
||||||
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间", description='修改时间')
|
'create_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Creation time"),
|
||||||
|
description=_('Creation time')),
|
||||||
|
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Modification time"),
|
||||||
|
description=_('Modification time'))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -35,12 +39,12 @@ class ApplicationVersionApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id'),
|
description=_('Application ID')),
|
||||||
openapi.Parameter(name='name',
|
openapi.Parameter(name='name',
|
||||||
in_=openapi.IN_QUERY,
|
in_=openapi.IN_QUERY,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=False,
|
required=False,
|
||||||
description='版本名称')]
|
description=_('Version Name'))]
|
||||||
|
|
||||||
class Operate(ApiMixin):
|
class Operate(ApiMixin):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
@ -49,12 +53,12 @@ class ApplicationVersionApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id'),
|
description=_('Application ID')),
|
||||||
openapi.Parameter(name='work_flow_version_id',
|
openapi.Parameter(name='work_flow_version_id',
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用版本id'), ]
|
description=_('Application version id')), ]
|
||||||
|
|
||||||
class Edit(ApiMixin):
|
class Edit(ApiMixin):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
@ -63,7 +67,7 @@ class ApplicationVersionApi(ApiMixin):
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=[],
|
required=[],
|
||||||
properties={
|
properties={
|
||||||
'name': openapi.Schema(type=openapi.TYPE_STRING, title="版本名称",
|
'name': openapi.Schema(type=openapi.TYPE_STRING, title=_("Version Name"),
|
||||||
description="版本名称")
|
description=_("Version Name"))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ from drf_yasg import openapi
|
||||||
|
|
||||||
from application.swagger_api.application_api import ApplicationApi
|
from application.swagger_api.application_api import ApplicationApi
|
||||||
from common.mixins.api_mixin import ApiMixin
|
from common.mixins.api_mixin import ApiMixin
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class ChatClientHistoryApi(ApiMixin):
|
class ChatClientHistoryApi(ApiMixin):
|
||||||
|
|
@ -19,7 +20,7 @@ class ChatClientHistoryApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id')
|
description=_('Application ID'))
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -29,21 +30,25 @@ class OpenAIChatApi(ApiMixin):
|
||||||
return openapi.Schema(type=openapi.TYPE_OBJECT,
|
return openapi.Schema(type=openapi.TYPE_OBJECT,
|
||||||
required=['message'],
|
required=['message'],
|
||||||
properties={
|
properties={
|
||||||
'messages': openapi.Schema(type=openapi.TYPE_ARRAY, title="问题", description="问题",
|
'messages': openapi.Schema(type=openapi.TYPE_ARRAY, title=_("problem"),
|
||||||
|
description=_("problem"),
|
||||||
items=openapi.Schema(type=openapi.TYPE_OBJECT,
|
items=openapi.Schema(type=openapi.TYPE_OBJECT,
|
||||||
required=['role', 'content'],
|
required=['role', 'content'],
|
||||||
properties={
|
properties={
|
||||||
'content': openapi.Schema(
|
'content': openapi.Schema(
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
title="问题内容", default=''),
|
title=_("Question content"),
|
||||||
|
default=''),
|
||||||
'role': openapi.Schema(
|
'role': openapi.Schema(
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
title='角色', default="user")
|
title=_('role'),
|
||||||
|
default="user")
|
||||||
}
|
}
|
||||||
)),
|
)),
|
||||||
'chat_id': openapi.Schema(type=openapi.TYPE_STRING, title="对话id"),
|
'chat_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Conversation ID")),
|
||||||
're_chat': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="重新生成", default=False),
|
're_chat': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("regenerate"),
|
||||||
'stream': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="流式输出", default=True)
|
default=False),
|
||||||
|
'stream': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Stream Output"), default=True)
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -55,9 +60,9 @@ class ChatApi(ApiMixin):
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=['message'],
|
required=['message'],
|
||||||
properties={
|
properties={
|
||||||
'message': openapi.Schema(type=openapi.TYPE_STRING, title="问题", description="问题"),
|
'message': openapi.Schema(type=openapi.TYPE_STRING, title=_("problem"), description=_("problem")),
|
||||||
're_chat': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="重新生成", default=False),
|
're_chat': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("regenerate"), default=False),
|
||||||
'stream': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="重新生成", default=True)
|
'stream': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Is it streaming output"), default=True)
|
||||||
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
@ -71,26 +76,26 @@ class ChatApi(ApiMixin):
|
||||||
properties={
|
properties={
|
||||||
'id': openapi.Schema(type=openapi.TYPE_STRING, title="id",
|
'id': openapi.Schema(type=openapi.TYPE_STRING, title="id",
|
||||||
description="id", default="xx"),
|
description="id", default="xx"),
|
||||||
'application_id': openapi.Schema(type=openapi.TYPE_STRING, title="应用id",
|
'application_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application ID"),
|
||||||
description="应用id", default='应用id'),
|
description=_("Application ID"), default=_('Application ID')),
|
||||||
'abstract': openapi.Schema(type=openapi.TYPE_STRING, title="摘要",
|
'abstract': openapi.Schema(type=openapi.TYPE_STRING, title=_("abstract"),
|
||||||
description="摘要", default='摘要'),
|
description=_("abstract"), default=_('abstract')),
|
||||||
'chat_id': openapi.Schema(type=openapi.TYPE_STRING, title="对话id",
|
'chat_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Conversation ID"),
|
||||||
description="对话id", default="对话id"),
|
description=_("Conversation ID"), default=_("Conversation ID")),
|
||||||
'chat_record_count': openapi.Schema(type=openapi.TYPE_STRING, title="对话提问数量",
|
'chat_record_count': openapi.Schema(type=openapi.TYPE_STRING, title=_("Number of dialogue questions"),
|
||||||
description="对话提问数量",
|
description=_("Number of dialogue questions"),
|
||||||
default="对话提问数量"),
|
default=0),
|
||||||
'mark_sum': openapi.Schema(type=openapi.TYPE_STRING, title="标记数量",
|
'mark_sum': openapi.Schema(type=openapi.TYPE_STRING, title=_("Number of tags"),
|
||||||
description="标记数量", default=1),
|
description=_("Number of tags"), default=1),
|
||||||
'star_num': openapi.Schema(type=openapi.TYPE_STRING, title="点赞数量",
|
'star_num': openapi.Schema(type=openapi.TYPE_STRING, title=_("Number of likes"),
|
||||||
description="点赞数量", default=1),
|
description=_("Number of likes"), default=1),
|
||||||
'trample_num': openapi.Schema(type=openapi.TYPE_NUMBER, title="点踩数量",
|
'trample_num': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of clicks"),
|
||||||
description="点踩数量", default=1),
|
description=_("Number of clicks"), default=1),
|
||||||
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间",
|
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Change time"),
|
||||||
description="修改时间",
|
description=_("Change time"),
|
||||||
default="1970-01-01 00:00:00"),
|
default="1970-01-01 00:00:00"),
|
||||||
'create_time': openapi.Schema(type=openapi.TYPE_STRING, title="创建时间",
|
'create_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Creation time"),
|
||||||
description="创建时间",
|
description=_("Creation time"),
|
||||||
default="1970-01-01 00:00:00"
|
default="1970-01-01 00:00:00"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -103,7 +108,7 @@ class ChatApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id'),
|
description=_('Application ID')),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -126,18 +131,18 @@ class ChatApi(ApiMixin):
|
||||||
required=['model_id', 'multiple_rounds_dialogue', 'dataset_setting', 'model_setting',
|
required=['model_id', 'multiple_rounds_dialogue', 'dataset_setting', 'model_setting',
|
||||||
'problem_optimization'],
|
'problem_optimization'],
|
||||||
properties={
|
properties={
|
||||||
'id': openapi.Schema(type=openapi.TYPE_STRING, title="应用id",
|
'id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application ID"),
|
||||||
description="应用id,修改的时候传,创建的时候不传"),
|
description=_("Application ID, pass when modifying, do not pass when creating")),
|
||||||
'model_id': openapi.Schema(type=openapi.TYPE_STRING, title="模型id", description="模型id"),
|
'model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Model ID"), description=_("Model ID")),
|
||||||
'dataset_id_list': openapi.Schema(type=openapi.TYPE_ARRAY,
|
'dataset_id_list': openapi.Schema(type=openapi.TYPE_ARRAY,
|
||||||
items=openapi.Schema(type=openapi.TYPE_STRING),
|
items=openapi.Schema(type=openapi.TYPE_STRING),
|
||||||
title="关联知识库Id列表", description="关联知识库Id列表"),
|
title=_("List of associated knowledge base IDs"), description=_("List of associated knowledge base IDs")),
|
||||||
'multiple_rounds_dialogue': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否开启多轮会话",
|
'multiple_rounds_dialogue': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Do you want to initiate multiple sessions"),
|
||||||
description="是否开启多轮会话"),
|
description=_("Do you want to initiate multiple sessions")),
|
||||||
'dataset_setting': ApplicationApi.DatasetSetting.get_request_body_api(),
|
'dataset_setting': ApplicationApi.DatasetSetting.get_request_body_api(),
|
||||||
'model_setting': ApplicationApi.ModelSetting.get_request_body_api(),
|
'model_setting': ApplicationApi.ModelSetting.get_request_body_api(),
|
||||||
'problem_optimization': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="问题优化",
|
'problem_optimization': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Problem optimization"),
|
||||||
description="是否开启问题优化", default=True)
|
description=_("Do you want to enable problem optimization"), default=True)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -147,20 +152,20 @@ class ChatApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id'),
|
description=_('Application ID')),
|
||||||
openapi.Parameter(name='history_day',
|
openapi.Parameter(name='history_day',
|
||||||
in_=openapi.IN_QUERY,
|
in_=openapi.IN_QUERY,
|
||||||
type=openapi.TYPE_NUMBER,
|
type=openapi.TYPE_NUMBER,
|
||||||
required=True,
|
required=True,
|
||||||
description='历史天数'),
|
description=_('Historical days')),
|
||||||
openapi.Parameter(name='abstract', in_=openapi.IN_QUERY, type=openapi.TYPE_STRING, required=False,
|
openapi.Parameter(name='abstract', in_=openapi.IN_QUERY, type=openapi.TYPE_STRING, required=False,
|
||||||
description="摘要"),
|
description=_("abstract")),
|
||||||
openapi.Parameter(name='min_star', in_=openapi.IN_QUERY, type=openapi.TYPE_INTEGER, required=False,
|
openapi.Parameter(name='min_star', in_=openapi.IN_QUERY, type=openapi.TYPE_INTEGER, required=False,
|
||||||
description="最小点赞数"),
|
description=_("Minimum number of likes")),
|
||||||
openapi.Parameter(name='min_trample', in_=openapi.IN_QUERY, type=openapi.TYPE_INTEGER, required=False,
|
openapi.Parameter(name='min_trample', in_=openapi.IN_QUERY, type=openapi.TYPE_INTEGER, required=False,
|
||||||
description="最小点踩数"),
|
description=_("Minimum number of clicks")),
|
||||||
openapi.Parameter(name='comparer', in_=openapi.IN_QUERY, type=openapi.TYPE_STRING, required=False,
|
openapi.Parameter(name='comparer', in_=openapi.IN_QUERY, type=openapi.TYPE_STRING, required=False,
|
||||||
description="or|and 比较器")
|
description=_("or|and comparator"))
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -171,12 +176,12 @@ class ChatRecordApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id'),
|
description=_('Application ID')),
|
||||||
openapi.Parameter(name='chat_id',
|
openapi.Parameter(name='chat_id',
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='对话id'),
|
description=_('Conversation ID')),
|
||||||
]
|
]
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
@ -189,34 +194,34 @@ class ChatRecordApi(ApiMixin):
|
||||||
properties={
|
properties={
|
||||||
'id': openapi.Schema(type=openapi.TYPE_STRING, title="id",
|
'id': openapi.Schema(type=openapi.TYPE_STRING, title="id",
|
||||||
description="id", default="xx"),
|
description="id", default="xx"),
|
||||||
'chat': openapi.Schema(type=openapi.TYPE_STRING, title="会话日志id",
|
'chat': openapi.Schema(type=openapi.TYPE_STRING, title=_("Session log id"),
|
||||||
description="会话日志id", default='会话日志id'),
|
description=_("Conversation log id"), default=_('Conversation log id')),
|
||||||
'vote_status': openapi.Schema(type=openapi.TYPE_STRING, title="投票状态",
|
'vote_status': openapi.Schema(type=openapi.TYPE_STRING, title=_("Voting Status"),
|
||||||
description="投票状态", default="投票状态"),
|
description=_("Voting Status"), default=_("Voting Status")),
|
||||||
'dataset': openapi.Schema(type=openapi.TYPE_STRING, title="数据集id", description="数据集id",
|
'dataset': openapi.Schema(type=openapi.TYPE_STRING, title=_("Dataset id"), description=_("Dataset id"),
|
||||||
default="数据集id"),
|
default=_("Dataset id")),
|
||||||
'paragraph': openapi.Schema(type=openapi.TYPE_STRING, title="段落id",
|
'paragraph': openapi.Schema(type=openapi.TYPE_STRING, title=_("Paragraph id"),
|
||||||
description="段落id", default=1),
|
description=_("Paragraph id"), default=1),
|
||||||
'source_id': openapi.Schema(type=openapi.TYPE_STRING, title="资源id",
|
'source_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Resource ID"),
|
||||||
description="资源id", default=1),
|
description=_("Resource ID"), default=1),
|
||||||
'source_type': openapi.Schema(type=openapi.TYPE_STRING, title="资源类型",
|
'source_type': openapi.Schema(type=openapi.TYPE_STRING, title=_("Resource Type"),
|
||||||
description="资源类型", default='xxx'),
|
description=_("Resource Type"), default='xxx'),
|
||||||
'message_tokens': openapi.Schema(type=openapi.TYPE_INTEGER, title="问题消耗token数量",
|
'message_tokens': openapi.Schema(type=openapi.TYPE_INTEGER, title=_("Number of tokens consumed by the question"),
|
||||||
description="问题消耗token数量", default=0),
|
description=_("Number of tokens consumed by the question"), default=0),
|
||||||
'answer_tokens': openapi.Schema(type=openapi.TYPE_INTEGER, title="答案消耗token数量",
|
'answer_tokens': openapi.Schema(type=openapi.TYPE_INTEGER, title=_("The number of tokens consumed by the answer"),
|
||||||
description="答案消耗token数量", default=0),
|
description=_("The number of tokens consumed by the answer"), default=0),
|
||||||
'improve_paragraph_id_list': openapi.Schema(type=openapi.TYPE_STRING, title="改进标注列表",
|
'improve_paragraph_id_list': openapi.Schema(type=openapi.TYPE_STRING, title=_("Improved annotation list"),
|
||||||
description="改进标注列表",
|
description=_("Improved annotation list"),
|
||||||
default=[]),
|
default=[]),
|
||||||
'index': openapi.Schema(type=openapi.TYPE_STRING, title="对应会话 对应下标",
|
'index': openapi.Schema(type=openapi.TYPE_STRING, title=_("Corresponding session Corresponding subscript"),
|
||||||
description="对应会话id对应下标",
|
description=_("Corresponding session id corresponding subscript"),
|
||||||
default="对应会话id对应下标"
|
default=0
|
||||||
),
|
),
|
||||||
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间",
|
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Modification time"),
|
||||||
description="修改时间",
|
description=_("Modification time"),
|
||||||
default="1970-01-01 00:00:00"),
|
default="1970-01-01 00:00:00"),
|
||||||
'create_time': openapi.Schema(type=openapi.TYPE_STRING, title="创建时间",
|
'create_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Creation time"),
|
||||||
description="创建时间",
|
description=_("Creation time"),
|
||||||
default="1970-01-01 00:00:00"
|
default="1970-01-01 00:00:00"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -230,27 +235,27 @@ class ImproveApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id'),
|
description=_('Application ID')),
|
||||||
openapi.Parameter(name='chat_id',
|
openapi.Parameter(name='chat_id',
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='会话id'),
|
description=_('Conversation ID')),
|
||||||
openapi.Parameter(name='chat_record_id',
|
openapi.Parameter(name='chat_record_id',
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='会话记录id'),
|
description=_('Conversation record id')),
|
||||||
openapi.Parameter(name='dataset_id',
|
openapi.Parameter(name='dataset_id',
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='知识库id'),
|
description=_('Knowledge base id')),
|
||||||
openapi.Parameter(name='document_id',
|
openapi.Parameter(name='document_id',
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='文档id'),
|
description=_('Document id')),
|
||||||
]
|
]
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
@ -259,10 +264,10 @@ class ImproveApi(ApiMixin):
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=['content'],
|
required=['content'],
|
||||||
properties={
|
properties={
|
||||||
'title': openapi.Schema(type=openapi.TYPE_STRING, title="段落标题",
|
'title': openapi.Schema(type=openapi.TYPE_STRING, title=_("Section title"),
|
||||||
description="段落标题"),
|
description=_("Section title")),
|
||||||
'content': openapi.Schema(type=openapi.TYPE_STRING, title="段落内容",
|
'content': openapi.Schema(type=openapi.TYPE_STRING, title=_("Paragraph content"),
|
||||||
description="段落内容")
|
description=_("Paragraph content"))
|
||||||
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
@ -273,12 +278,12 @@ class ImproveApi(ApiMixin):
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=['dataset_id', 'document_id', 'chat_ids'],
|
required=['dataset_id', 'document_id', 'chat_ids'],
|
||||||
properties={
|
properties={
|
||||||
'dataset_id': openapi.Schema(type=openapi.TYPE_STRING, title="知识库id",
|
'dataset_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Knowledge base id"),
|
||||||
description="知识库id"),
|
description=_("Knowledge base id")),
|
||||||
'document_id': openapi.Schema(type=openapi.TYPE_STRING, title="文档id",
|
'document_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Document id"),
|
||||||
description="文档id"),
|
description=_("Document id")),
|
||||||
'chat_ids': openapi.Schema(type=openapi.TYPE_ARRAY, title="会话id列表",
|
'chat_ids': openapi.Schema(type=openapi.TYPE_ARRAY, title=_("Conversation id list"),
|
||||||
description="会话id列表",
|
description=_("Conversation id list"),
|
||||||
items=openapi.Schema(type=openapi.TYPE_STRING))
|
items=openapi.Schema(type=openapi.TYPE_STRING))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -290,12 +295,12 @@ class ImproveApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id'),
|
description=_('Application ID')),
|
||||||
openapi.Parameter(name='dataset_id',
|
openapi.Parameter(name='dataset_id',
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='知识库id'),
|
description=_('Knowledge base id')),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -307,17 +312,17 @@ class VoteApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id'),
|
description=_('Application ID')),
|
||||||
openapi.Parameter(name='chat_id',
|
openapi.Parameter(name='chat_id',
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='会话id'),
|
description=_('Conversation ID')),
|
||||||
openapi.Parameter(name='chat_record_id',
|
openapi.Parameter(name='chat_record_id',
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='会话记录id')
|
description=_('Conversation record id'))
|
||||||
]
|
]
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
@ -326,8 +331,8 @@ class VoteApi(ApiMixin):
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=['vote_status'],
|
required=['vote_status'],
|
||||||
properties={
|
properties={
|
||||||
'vote_status': openapi.Schema(type=openapi.TYPE_STRING, title="投票状态",
|
'vote_status': openapi.Schema(type=openapi.TYPE_STRING, title=_("Voting Status"),
|
||||||
description="-1:取消投票|0:赞同|1:反对"),
|
description=_("-1: Cancel vote | 0: Agree | 1: Oppose")),
|
||||||
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
@ -340,17 +345,17 @@ class ChatRecordImproveApi(ApiMixin):
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='应用id'),
|
description=_('Application ID')),
|
||||||
openapi.Parameter(name='chat_id',
|
openapi.Parameter(name='chat_id',
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='会话id'),
|
description=_('Conversation ID')),
|
||||||
openapi.Parameter(name='chat_record_id',
|
openapi.Parameter(name='chat_record_id',
|
||||||
in_=openapi.IN_PATH,
|
in_=openapi.IN_PATH,
|
||||||
type=openapi.TYPE_STRING,
|
type=openapi.TYPE_STRING,
|
||||||
required=True,
|
required=True,
|
||||||
description='会话记录id')
|
description=_('Conversation record id'))
|
||||||
]
|
]
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
@ -363,27 +368,27 @@ class ChatRecordImproveApi(ApiMixin):
|
||||||
properties={
|
properties={
|
||||||
'id': openapi.Schema(type=openapi.TYPE_STRING, title="id",
|
'id': openapi.Schema(type=openapi.TYPE_STRING, title="id",
|
||||||
description="id", default="xx"),
|
description="id", default="xx"),
|
||||||
'content': openapi.Schema(type=openapi.TYPE_STRING, title="段落内容",
|
'content': openapi.Schema(type=openapi.TYPE_STRING, title=_("Paragraph content"),
|
||||||
description="段落内容", default='段落内容'),
|
description=_("Paragraph content"), default=_('Paragraph content')),
|
||||||
'title': openapi.Schema(type=openapi.TYPE_STRING, title="标题",
|
'title': openapi.Schema(type=openapi.TYPE_STRING, title=_("title"),
|
||||||
description="标题", default="xxx的描述"),
|
description=_("title"), default=_("Description of xxx")),
|
||||||
'hit_num': openapi.Schema(type=openapi.TYPE_INTEGER, title="命中数量", description="命中数量",
|
'hit_num': openapi.Schema(type=openapi.TYPE_INTEGER, title=_("Number of hits"), description=_("Number of hits"),
|
||||||
default=1),
|
default=1),
|
||||||
'star_num': openapi.Schema(type=openapi.TYPE_INTEGER, title="点赞数量",
|
'star_num': openapi.Schema(type=openapi.TYPE_INTEGER, title=_("Number of Likes"),
|
||||||
description="点赞数量", default=1),
|
description=_("Number of Likes"), default=1),
|
||||||
'trample_num': openapi.Schema(type=openapi.TYPE_INTEGER, title="点踩数量",
|
'trample_num': openapi.Schema(type=openapi.TYPE_INTEGER, title=_("Number of thumbs-downs"),
|
||||||
description="点踩数", default=1),
|
description=_("Number of thumbs-downs"), default=1),
|
||||||
'dataset_id': openapi.Schema(type=openapi.TYPE_STRING, title="知识库id",
|
'dataset_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Knowledge base id"),
|
||||||
description="知识库id", default='xxx'),
|
description=_("Knowledge base id"), default='xxx'),
|
||||||
'document_id': openapi.Schema(type=openapi.TYPE_STRING, title="文档id",
|
'document_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Document id"),
|
||||||
description="文档id", default='xxx'),
|
description=_("Document id"), default='xxx'),
|
||||||
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否可用",
|
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Availability"),
|
||||||
description="是否可用", default=True),
|
description=_("Availability"), default=True),
|
||||||
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间",
|
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Modification time"),
|
||||||
description="修改时间",
|
description=_("Modification time"),
|
||||||
default="1970-01-01 00:00:00"),
|
default="1970-01-01 00:00:00"),
|
||||||
'create_time': openapi.Schema(type=openapi.TYPE_STRING, title="创建时间",
|
'create_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Creation time"),
|
||||||
description="创建时间",
|
description=_("Creation time"),
|
||||||
default="1970-01-01 00:00:00"
|
default="1970-01-01 00:00:00"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,17 +17,18 @@ from common.auth import has_permissions, TokenAuth
|
||||||
from common.constants.permission_constants import PermissionConstants, CompareConstants, ViewPermission, RoleConstants, \
|
from common.constants.permission_constants import PermissionConstants, CompareConstants, ViewPermission, RoleConstants, \
|
||||||
Permission, Group, Operate
|
Permission, Group, Operate
|
||||||
from common.response import result
|
from common.response import result
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class ApplicationVersionView(APIView):
|
class ApplicationVersionView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取应用列表",
|
@swagger_auto_schema(operation_summary=_("Get the application list"),
|
||||||
operation_id="获取应用列表",
|
operation_id=_("Get the application list"),
|
||||||
manual_parameters=ApplicationVersionApi.Query.get_request_params_api(),
|
manual_parameters=ApplicationVersionApi.Query.get_request_params_api(),
|
||||||
responses=result.get_api_array_response(ApplicationVersionApi.get_response_body_api()),
|
responses=result.get_api_array_response(ApplicationVersionApi.get_response_body_api()),
|
||||||
tags=['应用/版本'])
|
tags=[_('Application/Version')])
|
||||||
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
|
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
|
||||||
def get(self, request: Request, application_id: str):
|
def get(self, request: Request, application_id: str):
|
||||||
return result.success(
|
return result.success(
|
||||||
|
|
@ -39,12 +40,12 @@ class ApplicationVersionView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="分页获取应用版本列表",
|
@swagger_auto_schema(operation_summary=_("Get the list of application versions by page"),
|
||||||
operation_id="分页获取应用版本列表",
|
operation_id=_("Get the list of application versions by page"),
|
||||||
manual_parameters=result.get_page_request_params(
|
manual_parameters=result.get_page_request_params(
|
||||||
ApplicationVersionApi.Query.get_request_params_api()),
|
ApplicationVersionApi.Query.get_request_params_api()),
|
||||||
responses=result.get_page_api_response(ApplicationVersionApi.get_response_body_api()),
|
responses=result.get_page_api_response(ApplicationVersionApi.get_response_body_api()),
|
||||||
tags=['应用/版本'])
|
tags=[_('Application/Version')])
|
||||||
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
|
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
|
||||||
def get(self, request: Request, application_id: str, current_page: int, page_size: int):
|
def get(self, request: Request, application_id: str, current_page: int, page_size: int):
|
||||||
return result.success(
|
return result.success(
|
||||||
|
|
@ -57,11 +58,11 @@ class ApplicationVersionView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取应用版本详情",
|
@swagger_auto_schema(operation_summary=_("Get application version details"),
|
||||||
operation_id="获取应用版本详情",
|
operation_id=_("Get application version details"),
|
||||||
manual_parameters=ApplicationVersionApi.Operate.get_request_params_api(),
|
manual_parameters=ApplicationVersionApi.Operate.get_request_params_api(),
|
||||||
responses=result.get_api_response(ApplicationVersionApi.get_response_body_api()),
|
responses=result.get_api_response(ApplicationVersionApi.get_response_body_api()),
|
||||||
tags=['应用/版本'])
|
tags=[_('Application/Version')])
|
||||||
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
|
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
|
||||||
def get(self, request: Request, application_id: str, work_flow_version_id: str):
|
def get(self, request: Request, application_id: str, work_flow_version_id: str):
|
||||||
return result.success(
|
return result.success(
|
||||||
|
|
@ -70,12 +71,12 @@ class ApplicationVersionView(APIView):
|
||||||
'application_id': application_id, 'work_flow_version_id': work_flow_version_id}).one())
|
'application_id': application_id, 'work_flow_version_id': work_flow_version_id}).one())
|
||||||
|
|
||||||
@action(methods=['PUT'], detail=False)
|
@action(methods=['PUT'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="修改应用版本信息",
|
@swagger_auto_schema(operation_summary=_("Modify application version information"),
|
||||||
operation_id="修改应用版本信息",
|
operation_id=_("Modify application version information"),
|
||||||
manual_parameters=ApplicationVersionApi.Operate.get_request_params_api(),
|
manual_parameters=ApplicationVersionApi.Operate.get_request_params_api(),
|
||||||
request_body=ApplicationVersionApi.Edit.get_request_body_api(),
|
request_body=ApplicationVersionApi.Edit.get_request_body_api(),
|
||||||
responses=result.get_api_response(ApplicationVersionApi.get_response_body_api()),
|
responses=result.get_api_response(ApplicationVersionApi.get_response_body_api()),
|
||||||
tags=['应用/版本'])
|
tags=[_('Application/Version')])
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER],
|
[RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
from django.core import cache
|
from django.core import cache
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
from drf_yasg.utils import swagger_auto_schema
|
from drf_yasg.utils import swagger_auto_schema
|
||||||
from rest_framework.decorators import action
|
from rest_framework.decorators import action
|
||||||
from rest_framework.parsers import MultiPartParser
|
from rest_framework.parsers import MultiPartParser
|
||||||
|
|
@ -36,9 +37,9 @@ class ApplicationStatistics(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=["GET"], detail=False)
|
@action(methods=["GET"], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="用户统计",
|
@swagger_auto_schema(operation_summary=_("User Statistics"),
|
||||||
operation_id="用户统计",
|
operation_id=_("User Statistics"),
|
||||||
tags=["应用/统计"],
|
tags=[_("Application/Statistics")],
|
||||||
manual_parameters=ApplicationStatisticsApi.get_request_params_api(),
|
manual_parameters=ApplicationStatisticsApi.get_request_params_api(),
|
||||||
responses=result.get_api_response(
|
responses=result.get_api_response(
|
||||||
ApplicationStatisticsApi.CustomerCount.get_response_body_api())
|
ApplicationStatisticsApi.CustomerCount.get_response_body_api())
|
||||||
|
|
@ -61,9 +62,9 @@ class ApplicationStatistics(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=["GET"], detail=False)
|
@action(methods=["GET"], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="用户统计趋势",
|
@swagger_auto_schema(operation_summary=_("User demographic trends"),
|
||||||
operation_id="用户统计趋势",
|
operation_id=_("User demographic trends"),
|
||||||
tags=["应用/统计"],
|
tags=[_("Application/Statistics")],
|
||||||
manual_parameters=ApplicationStatisticsApi.get_request_params_api(),
|
manual_parameters=ApplicationStatisticsApi.get_request_params_api(),
|
||||||
responses=result.get_api_array_response(
|
responses=result.get_api_array_response(
|
||||||
ApplicationStatisticsApi.CustomerCountTrend.get_response_body_api()))
|
ApplicationStatisticsApi.CustomerCountTrend.get_response_body_api()))
|
||||||
|
|
@ -85,9 +86,9 @@ class ApplicationStatistics(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=["GET"], detail=False)
|
@action(methods=["GET"], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="对话相关统计",
|
@swagger_auto_schema(operation_summary=_("Conversation statistics"),
|
||||||
operation_id="对话相关统计",
|
operation_id=_("Conversation statistics"),
|
||||||
tags=["应用/统计"],
|
tags=[_("Application/Statistics")],
|
||||||
manual_parameters=ApplicationStatisticsApi.get_request_params_api(),
|
manual_parameters=ApplicationStatisticsApi.get_request_params_api(),
|
||||||
responses=result.get_api_response(
|
responses=result.get_api_response(
|
||||||
ApplicationStatisticsApi.ChatRecordAggregate.get_response_body_api())
|
ApplicationStatisticsApi.ChatRecordAggregate.get_response_body_api())
|
||||||
|
|
@ -110,9 +111,9 @@ class ApplicationStatistics(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=["GET"], detail=False)
|
@action(methods=["GET"], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="对话相关统计趋势",
|
@swagger_auto_schema(operation_summary=_("Dialogue-related statistical trends"),
|
||||||
operation_id="对话相关统计趋势",
|
operation_id=_("Dialogue-related statistical trends"),
|
||||||
tags=["应用/统计"],
|
tags=[_("Application/Statistics")],
|
||||||
manual_parameters=ApplicationStatisticsApi.get_request_params_api(),
|
manual_parameters=ApplicationStatisticsApi.get_request_params_api(),
|
||||||
responses=result.get_api_array_response(
|
responses=result.get_api_array_response(
|
||||||
ApplicationStatisticsApi.ChatRecordAggregate.get_response_body_api())
|
ApplicationStatisticsApi.ChatRecordAggregate.get_response_body_api())
|
||||||
|
|
@ -140,9 +141,9 @@ class Application(APIView):
|
||||||
parser_classes = [MultiPartParser]
|
parser_classes = [MultiPartParser]
|
||||||
|
|
||||||
@action(methods=['PUT'], detail=False)
|
@action(methods=['PUT'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="修改应用icon",
|
@swagger_auto_schema(operation_summary=_("Modify application icon"),
|
||||||
operation_id="修改应用icon",
|
operation_id=_("Modify application icon"),
|
||||||
tags=['应用'],
|
tags=[_('Application')],
|
||||||
manual_parameters=ApplicationApi.EditApplicationIcon.get_request_params_api(),
|
manual_parameters=ApplicationApi.EditApplicationIcon.get_request_params_api(),
|
||||||
request_body=ApplicationApi.Operate.get_request_body_api())
|
request_body=ApplicationApi.Operate.get_request_body_api())
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
|
|
@ -161,10 +162,10 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
parser_classes = [MultiPartParser]
|
parser_classes = [MultiPartParser]
|
||||||
|
|
||||||
@action(methods="GET", detail=False)
|
@action(methods="POST", detail=False)
|
||||||
@swagger_auto_schema(operation_summary="导入应用", operation_id="导入应用",
|
@swagger_auto_schema(operation_summary=_("Import Application"), operation_id=_("Import Application"),
|
||||||
manual_parameters=ApplicationApi.Import.get_request_params_api(),
|
manual_parameters=ApplicationApi.Import.get_request_params_api(),
|
||||||
tags=["应用"]
|
tags=[_("Application")]
|
||||||
)
|
)
|
||||||
@has_permissions(RoleConstants.ADMIN, RoleConstants.USER)
|
@has_permissions(RoleConstants.ADMIN, RoleConstants.USER)
|
||||||
def post(self, request: Request):
|
def post(self, request: Request):
|
||||||
|
|
@ -175,9 +176,9 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods="GET", detail=False)
|
@action(methods="GET", detail=False)
|
||||||
@swagger_auto_schema(operation_summary="导出应用", operation_id="导出应用",
|
@swagger_auto_schema(operation_summary=_("Export Application"), operation_id=_("Export Application"),
|
||||||
manual_parameters=ApplicationApi.Export.get_request_params_api(),
|
manual_parameters=ApplicationApi.Export.get_request_params_api(),
|
||||||
tags=["应用"]
|
tags=[_("Application")]
|
||||||
)
|
)
|
||||||
@has_permissions(lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
|
@has_permissions(lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
|
||||||
dynamic_tag=keywords.get('application_id')))
|
dynamic_tag=keywords.get('application_id')))
|
||||||
|
|
@ -187,9 +188,9 @@ class Application(APIView):
|
||||||
|
|
||||||
class Embed(APIView):
|
class Embed(APIView):
|
||||||
@action(methods=["GET"], detail=False)
|
@action(methods=["GET"], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取嵌入js",
|
@swagger_auto_schema(operation_summary=_("Get embedded js"),
|
||||||
operation_id="获取嵌入js",
|
operation_id=_("Get embedded js"),
|
||||||
tags=["应用"],
|
tags=[_("Application")],
|
||||||
manual_parameters=ApplicationApi.ApiKey.get_request_params_api())
|
manual_parameters=ApplicationApi.ApiKey.get_request_params_api())
|
||||||
def get(self, request: Request):
|
def get(self, request: Request):
|
||||||
return ApplicationSerializer.Embed(
|
return ApplicationSerializer.Embed(
|
||||||
|
|
@ -200,9 +201,9 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=["GET"], detail=False)
|
@action(methods=["GET"], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取模型列表",
|
@swagger_auto_schema(operation_summary=_("Get a list of models"),
|
||||||
operation_id="获取模型列表",
|
operation_id=_("Get a list of models"),
|
||||||
tags=["应用"],
|
tags=[_("Application")],
|
||||||
manual_parameters=ApplicationApi.Model.get_request_params_api())
|
manual_parameters=ApplicationApi.Model.get_request_params_api())
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER],
|
[RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
|
|
@ -219,9 +220,9 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取模型参数表单",
|
@swagger_auto_schema(operation_summary=_("Get model parameter form"),
|
||||||
operation_id="获取模型参数表单",
|
operation_id=_("Get model parameter form"),
|
||||||
tags=["模型"])
|
tags=[_("Application")])
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER],
|
[RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
||||||
|
|
@ -237,9 +238,9 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=["GET"], detail=False)
|
@action(methods=["GET"], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取函数库列表",
|
@swagger_auto_schema(operation_summary=_("Get a list of function libraries"),
|
||||||
operation_id="获取函数库列表",
|
operation_id=_("Get a list of function libraries"),
|
||||||
tags=["应用"])
|
tags=[_("Application")])
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER],
|
[RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
||||||
|
|
@ -255,9 +256,9 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=["GET"], detail=False)
|
@action(methods=["GET"], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取函数库列表",
|
@swagger_auto_schema(operation_summary=_("Get library details"),
|
||||||
operation_id="获取函数库列表",
|
operation_id=_("Get library details"),
|
||||||
tags=["应用"],
|
tags=[_("Application")],
|
||||||
)
|
)
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER],
|
[RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
|
|
@ -274,9 +275,9 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取当前人创建的应用列表",
|
@swagger_auto_schema(operation_summary=_("Get the list of apps created by the current user"),
|
||||||
operation_id="获取当前人创建的应用列表",
|
operation_id=_("Get the list of apps created by the current user"),
|
||||||
tags=["应用/会话"])
|
tags=[_("Application/Chat")])
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER],
|
[RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
||||||
|
|
@ -292,9 +293,9 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=["GET"], detail=False)
|
@action(methods=["GET"], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取应用数据",
|
@swagger_auto_schema(operation_summary=_("Get application data"),
|
||||||
operation_id="获取应用数据",
|
operation_id=_("Get application data"),
|
||||||
tags=["应用"],
|
tags=[_("Application")],
|
||||||
)
|
)
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER],
|
[RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
|
|
@ -311,9 +312,9 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取应用相关信息",
|
@swagger_auto_schema(operation_summary=_("Get application related information"),
|
||||||
operation_id="获取应用相关信息",
|
operation_id=_("Get application related information"),
|
||||||
tags=["应用/会话"])
|
tags=[_("Application/Chat")])
|
||||||
def get(self, request: Request):
|
def get(self, request: Request):
|
||||||
if 'application_id' in request.auth.keywords:
|
if 'application_id' in request.auth.keywords:
|
||||||
return result.success(ApplicationSerializer.Operate(
|
return result.success(ApplicationSerializer.Operate(
|
||||||
|
|
@ -325,9 +326,9 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['POST'], detail=False)
|
@action(methods=['POST'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="新增ApiKey",
|
@swagger_auto_schema(operation_summary=_("Add ApiKey"),
|
||||||
operation_id="新增ApiKey",
|
operation_id=_("Add ApiKey"),
|
||||||
tags=['应用/API_KEY'],
|
tags=[_('Application/API_KEY')],
|
||||||
manual_parameters=ApplicationApi.ApiKey.get_request_params_api())
|
manual_parameters=ApplicationApi.ApiKey.get_request_params_api())
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER],
|
[RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
|
|
@ -340,9 +341,9 @@ class Application(APIView):
|
||||||
data={'application_id': application_id, 'user_id': request.user.id}).generate())
|
data={'application_id': application_id, 'user_id': request.user.id}).generate())
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取应用API_KEY列表",
|
@swagger_auto_schema(operation_summary=_("Get the application API_KEY list"),
|
||||||
operation_id="获取应用API_KEY列表",
|
operation_id=_("Get the application API_KEY list"),
|
||||||
tags=['应用/API_KEY'],
|
tags=[_('Application/API_KEY')],
|
||||||
manual_parameters=ApplicationApi.ApiKey.get_request_params_api()
|
manual_parameters=ApplicationApi.ApiKey.get_request_params_api()
|
||||||
)
|
)
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
|
|
@ -358,9 +359,9 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['PUT'], detail=False)
|
@action(methods=['PUT'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="修改应用API_KEY",
|
@swagger_auto_schema(operation_summary=_("Modify application API_KEY"),
|
||||||
operation_id="修改应用API_KEY",
|
operation_id=_("Modify application API_KEY"),
|
||||||
tags=['应用/API_KEY'],
|
tags=[_('Application/API_KEY')],
|
||||||
manual_parameters=ApplicationApi.ApiKey.Operate.get_request_params_api(),
|
manual_parameters=ApplicationApi.ApiKey.Operate.get_request_params_api(),
|
||||||
request_body=ApplicationApi.ApiKey.Operate.get_request_body_api())
|
request_body=ApplicationApi.ApiKey.Operate.get_request_body_api())
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
|
|
@ -376,9 +377,9 @@ class Application(APIView):
|
||||||
'api_key_id': api_key_id}).edit(request.data))
|
'api_key_id': api_key_id}).edit(request.data))
|
||||||
|
|
||||||
@action(methods=['DELETE'], detail=False)
|
@action(methods=['DELETE'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="删除应用API_KEY",
|
@swagger_auto_schema(operation_summary=_("Delete Application API_KEY"),
|
||||||
operation_id="删除应用API_KEY",
|
operation_id=_("Delete Application API_KEY"),
|
||||||
tags=['应用/API_KEY'],
|
tags=[_('Application/API_KEY')],
|
||||||
manual_parameters=ApplicationApi.ApiKey.Operate.get_request_params_api())
|
manual_parameters=ApplicationApi.ApiKey.Operate.get_request_params_api())
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER],
|
[RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
|
|
@ -396,9 +397,9 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['PUT'], detail=False)
|
@action(methods=['PUT'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="修改 应用AccessToken",
|
@swagger_auto_schema(operation_summary=_("Modify Application AccessToken"),
|
||||||
operation_id="修改 应用AccessToken",
|
operation_id=_("Modify Application AccessToken"),
|
||||||
tags=['应用/公开访问'],
|
tags=[_('Application/Public Access')],
|
||||||
manual_parameters=ApplicationApi.AccessToken.get_request_params_api(),
|
manual_parameters=ApplicationApi.AccessToken.get_request_params_api(),
|
||||||
request_body=ApplicationApi.AccessToken.get_request_body_api())
|
request_body=ApplicationApi.AccessToken.get_request_body_api())
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
|
|
@ -412,10 +413,10 @@ class Application(APIView):
|
||||||
request.data))
|
request.data))
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取应用 AccessToken信息",
|
@swagger_auto_schema(operation_summary=_("Get the application AccessToken information"),
|
||||||
operation_id="获取应用 AccessToken信息",
|
operation_id=_("Get the application AccessToken information"),
|
||||||
manual_parameters=ApplicationApi.AccessToken.get_request_params_api(),
|
manual_parameters=ApplicationApi.AccessToken.get_request_params_api(),
|
||||||
tags=['应用/公开访问'],
|
tags=[_('Application/Public Access')],
|
||||||
)
|
)
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER],
|
[RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
|
|
@ -435,10 +436,10 @@ class Application(APIView):
|
||||||
"Access-Control-Allow-Headers": "Origin,Content-Type,Cookie,Accept,Token"}, )
|
"Access-Control-Allow-Headers": "Origin,Content-Type,Cookie,Accept,Token"}, )
|
||||||
|
|
||||||
@action(methods=['POST'], detail=False)
|
@action(methods=['POST'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="应用认证",
|
@swagger_auto_schema(operation_summary=_("Application Certification"),
|
||||||
operation_id="应用认证",
|
operation_id=_("Application Certification"),
|
||||||
request_body=ApplicationApi.Authentication.get_request_body_api(),
|
request_body=ApplicationApi.Authentication.get_request_body_api(),
|
||||||
tags=["应用/认证"],
|
tags=[_("Application/Certification")],
|
||||||
security=[])
|
security=[])
|
||||||
def post(self, request: Request):
|
def post(self, request: Request):
|
||||||
return result.success(
|
return result.success(
|
||||||
|
|
@ -452,20 +453,20 @@ class Application(APIView):
|
||||||
)
|
)
|
||||||
|
|
||||||
@action(methods=['POST'], detail=False)
|
@action(methods=['POST'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="创建应用",
|
@swagger_auto_schema(operation_summary=_("Create an application"),
|
||||||
operation_id="创建应用",
|
operation_id=_("Create an application"),
|
||||||
request_body=ApplicationApi.Create.get_request_body_api(),
|
request_body=ApplicationApi.Create.get_request_body_api(),
|
||||||
tags=['应用'])
|
tags=[_('Application')])
|
||||||
@has_permissions(PermissionConstants.APPLICATION_CREATE, compare=CompareConstants.AND)
|
@has_permissions(PermissionConstants.APPLICATION_CREATE, compare=CompareConstants.AND)
|
||||||
def post(self, request: Request):
|
def post(self, request: Request):
|
||||||
return result.success(ApplicationSerializer.Create(data={'user_id': request.user.id}).insert(request.data))
|
return result.success(ApplicationSerializer.Create(data={'user_id': request.user.id}).insert(request.data))
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取应用列表",
|
@swagger_auto_schema(operation_summary=_("Get the application list"),
|
||||||
operation_id="获取应用列表",
|
operation_id=_("Get the application list"),
|
||||||
manual_parameters=ApplicationApi.Query.get_request_params_api(),
|
manual_parameters=ApplicationApi.Query.get_request_params_api(),
|
||||||
responses=result.get_api_array_response(ApplicationApi.get_response_body_api()),
|
responses=result.get_api_array_response(ApplicationApi.get_response_body_api()),
|
||||||
tags=['应用'])
|
tags=[_('Application')])
|
||||||
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
|
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
|
||||||
def get(self, request: Request):
|
def get(self, request: Request):
|
||||||
return result.success(
|
return result.success(
|
||||||
|
|
@ -476,10 +477,10 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods="GET", detail=False)
|
@action(methods="GET", detail=False)
|
||||||
@swagger_auto_schema(operation_summary="命中测试列表", operation_id="命中测试列表",
|
@swagger_auto_schema(operation_summary=_("Hit Test List"), operation_id=_("Hit Test List"),
|
||||||
manual_parameters=CommonApi.HitTestApi.get_request_params_api(),
|
manual_parameters=CommonApi.HitTestApi.get_request_params_api(),
|
||||||
responses=result.get_api_array_response(CommonApi.HitTestApi.get_response_body_api()),
|
responses=result.get_api_array_response(CommonApi.HitTestApi.get_response_body_api()),
|
||||||
tags=["应用"])
|
tags=[_("Application")])
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_ACCESS_TOKEN,
|
[RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_ACCESS_TOKEN,
|
||||||
RoleConstants.APPLICATION_KEY],
|
RoleConstants.APPLICATION_KEY],
|
||||||
|
|
@ -500,12 +501,12 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['PUT'], detail=False)
|
@action(methods=['PUT'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="发布应用",
|
@swagger_auto_schema(operation_summary=_("Publishing an application"),
|
||||||
operation_id="发布应用",
|
operation_id=_("Publishing an application"),
|
||||||
manual_parameters=ApplicationApi.Operate.get_request_params_api(),
|
manual_parameters=ApplicationApi.Operate.get_request_params_api(),
|
||||||
request_body=ApplicationApi.Publish.get_request_body_api(),
|
request_body=ApplicationApi.Publish.get_request_body_api(),
|
||||||
responses=result.get_default_response(),
|
responses=result.get_default_response(),
|
||||||
tags=['应用'])
|
tags=[_('Application')])
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER],
|
[RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
|
||||||
|
|
@ -520,11 +521,11 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['DELETE'], detail=False)
|
@action(methods=['DELETE'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="删除应用",
|
@swagger_auto_schema(operation_summary=_("Deleting application"),
|
||||||
operation_id="删除应用",
|
operation_id=_("Deleting application"),
|
||||||
manual_parameters=ApplicationApi.Operate.get_request_params_api(),
|
manual_parameters=ApplicationApi.Operate.get_request_params_api(),
|
||||||
responses=result.get_default_response(),
|
responses=result.get_default_response(),
|
||||||
tags=['应用'])
|
tags=[_('Application')])
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER],
|
[RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
|
||||||
|
|
@ -538,12 +539,12 @@ class Application(APIView):
|
||||||
with_valid=True))
|
with_valid=True))
|
||||||
|
|
||||||
@action(methods=['PUT'], detail=False)
|
@action(methods=['PUT'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="修改应用",
|
@swagger_auto_schema(operation_summary=_("Modify the application"),
|
||||||
operation_id="修改应用",
|
operation_id=_("Modify the application"),
|
||||||
manual_parameters=ApplicationApi.Operate.get_request_params_api(),
|
manual_parameters=ApplicationApi.Operate.get_request_params_api(),
|
||||||
request_body=ApplicationApi.Edit.get_request_body_api(),
|
request_body=ApplicationApi.Edit.get_request_body_api(),
|
||||||
responses=result.get_api_array_response(ApplicationApi.get_response_body_api()),
|
responses=result.get_api_array_response(ApplicationApi.get_response_body_api()),
|
||||||
tags=['应用'])
|
tags=[_('Application')])
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER],
|
[RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
|
||||||
|
|
@ -556,11 +557,11 @@ class Application(APIView):
|
||||||
request.data))
|
request.data))
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取应用详情",
|
@swagger_auto_schema(operation_summary=_("Get application details"),
|
||||||
operation_id="获取应用详情",
|
operation_id=_("Get application details"),
|
||||||
manual_parameters=ApplicationApi.Operate.get_request_params_api(),
|
manual_parameters=ApplicationApi.Operate.get_request_params_api(),
|
||||||
responses=result.get_api_array_response(ApplicationApi.get_response_body_api()),
|
responses=result.get_api_array_response(ApplicationApi.get_response_body_api()),
|
||||||
tags=['应用'])
|
tags=[_('Application')])
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_ACCESS_TOKEN,
|
[RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_ACCESS_TOKEN,
|
||||||
RoleConstants.APPLICATION_KEY],
|
RoleConstants.APPLICATION_KEY],
|
||||||
|
|
@ -575,12 +576,12 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取当前应用可使用的知识库",
|
@swagger_auto_schema(operation_summary=_("Get the knowledge base available to the current application"),
|
||||||
operation_id="获取当前应用可使用的知识库",
|
operation_id=_("Get the knowledge base available to the current application"),
|
||||||
manual_parameters=ApplicationApi.Operate.get_request_params_api(),
|
manual_parameters=ApplicationApi.Operate.get_request_params_api(),
|
||||||
responses=result.get_api_array_response(
|
responses=result.get_api_array_response(
|
||||||
DataSetSerializers.Query.get_response_body_api()),
|
DataSetSerializers.Query.get_response_body_api()),
|
||||||
tags=['应用'])
|
tags=[_('Application')])
|
||||||
@has_permissions(ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
@has_permissions(ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
[lambda r, keywords: Permission(group=Group.APPLICATION,
|
[lambda r, keywords: Permission(group=Group.APPLICATION,
|
||||||
operate=Operate.USE,
|
operate=Operate.USE,
|
||||||
|
|
@ -595,12 +596,12 @@ class Application(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="分页获取应用列表",
|
@swagger_auto_schema(operation_summary=_("Get the application list by page"),
|
||||||
operation_id="分页获取应用列表",
|
operation_id=_("Get the application list by page"),
|
||||||
manual_parameters=result.get_page_request_params(
|
manual_parameters=result.get_page_request_params(
|
||||||
ApplicationApi.Query.get_request_params_api()),
|
ApplicationApi.Query.get_request_params_api()),
|
||||||
responses=result.get_page_api_response(ApplicationApi.get_response_body_api()),
|
responses=result.get_page_api_response(ApplicationApi.get_response_body_api()),
|
||||||
tags=['应用'])
|
tags=[_('Application')])
|
||||||
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
|
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
|
||||||
def get(self, request: Request, current_page: int, page_size: int):
|
def get(self, request: Request, current_page: int, page_size: int):
|
||||||
return result.success(
|
return result.success(
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
@desc:
|
@desc:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
from drf_yasg.utils import swagger_auto_schema
|
from drf_yasg.utils import swagger_auto_schema
|
||||||
from rest_framework.decorators import action
|
from rest_framework.decorators import action
|
||||||
from rest_framework.request import Request
|
from rest_framework.request import Request
|
||||||
|
|
@ -29,10 +30,10 @@ class Openai(APIView):
|
||||||
authentication_classes = [OpenAIKeyAuth]
|
authentication_classes = [OpenAIKeyAuth]
|
||||||
|
|
||||||
@action(methods=['POST'], detail=False)
|
@action(methods=['POST'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="openai接口对话",
|
@swagger_auto_schema(operation_summary=_("OpenAI Interface Dialogue"),
|
||||||
operation_id="openai接口对话",
|
operation_id=_("OpenAI Interface Dialogue"),
|
||||||
request_body=OpenAIChatApi.get_request_body_api(),
|
request_body=OpenAIChatApi.get_request_body_api(),
|
||||||
tags=["openai对话"])
|
tags=[_("OpenAI Dialogue")])
|
||||||
def post(self, request: Request, application_id: str):
|
def post(self, request: Request, application_id: str):
|
||||||
return OpenAIChatSerializer(data={'application_id': application_id, 'client_id': request.auth.client_id,
|
return OpenAIChatSerializer(data={'application_id': application_id, 'client_id': request.auth.client_id,
|
||||||
'client_type': request.auth.client_type}).chat(request.data)
|
'client_type': request.auth.client_type}).chat(request.data)
|
||||||
|
|
@ -45,10 +46,10 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['POST'], detail=False)
|
@action(methods=['POST'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="导出对话",
|
@swagger_auto_schema(operation_summary=_("Export conversation"),
|
||||||
operation_id="导出对话",
|
operation_id=_("Export conversation"),
|
||||||
manual_parameters=ChatApi.get_request_params_api(),
|
manual_parameters=ChatApi.get_request_params_api(),
|
||||||
tags=["应用/对话日志"]
|
tags=[_("Application/Conversation Log")]
|
||||||
)
|
)
|
||||||
@has_permissions(
|
@has_permissions(
|
||||||
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
|
||||||
|
|
@ -64,10 +65,10 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取会话id,根据应用id",
|
@swagger_auto_schema(operation_summary=_("Get the session id according to the application id"),
|
||||||
operation_id="获取会话id,根据应用id",
|
operation_id=_("Get the session id according to the application id"),
|
||||||
manual_parameters=ChatApi.OpenChat.get_request_params_api(),
|
manual_parameters=ChatApi.OpenChat.get_request_params_api(),
|
||||||
tags=["应用/会话"])
|
tags=[_("Application/Chat")])
|
||||||
@has_permissions(
|
@has_permissions(
|
||||||
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_ACCESS_TOKEN,
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_ACCESS_TOKEN,
|
||||||
RoleConstants.APPLICATION_KEY],
|
RoleConstants.APPLICATION_KEY],
|
||||||
|
|
@ -83,10 +84,10 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['POST'], detail=False)
|
@action(methods=['POST'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取工作流临时会话id",
|
@swagger_auto_schema(operation_summary=_("Get the workflow temporary session id"),
|
||||||
operation_id="获取工作流临时会话id",
|
operation_id=_("Get the workflow temporary session id"),
|
||||||
request_body=ChatApi.OpenWorkFlowTemp.get_request_body_api(),
|
request_body=ChatApi.OpenWorkFlowTemp.get_request_body_api(),
|
||||||
tags=["应用/会话"])
|
tags=[_("Application/Chat")])
|
||||||
def post(self, request: Request):
|
def post(self, request: Request):
|
||||||
return result.success(ChatSerializers.OpenWorkFlowChat(
|
return result.success(ChatSerializers.OpenWorkFlowChat(
|
||||||
data={**request.data, 'user_id': request.user.id}).open())
|
data={**request.data, 'user_id': request.user.id}).open())
|
||||||
|
|
@ -95,10 +96,10 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['POST'], detail=False)
|
@action(methods=['POST'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取会话id(根据模型id,知识库列表,是否多轮会话)",
|
@swagger_auto_schema(operation_summary=_("Get a temporary session id"),
|
||||||
operation_id="获取会话id",
|
operation_id=_("Get a temporary session id"),
|
||||||
request_body=ChatApi.OpenTempChat.get_request_body_api(),
|
request_body=ChatApi.OpenTempChat.get_request_body_api(),
|
||||||
tags=["应用/会话"])
|
tags=[_("Application/Chat")])
|
||||||
@has_permissions(RoleConstants.ADMIN, RoleConstants.USER)
|
@has_permissions(RoleConstants.ADMIN, RoleConstants.USER)
|
||||||
def post(self, request: Request):
|
def post(self, request: Request):
|
||||||
return result.success(ChatSerializers.OpenTempChat(
|
return result.success(ChatSerializers.OpenTempChat(
|
||||||
|
|
@ -108,10 +109,10 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['POST'], detail=False)
|
@action(methods=['POST'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="对话",
|
@swagger_auto_schema(operation_summary=_("dialogue"),
|
||||||
operation_id="对话",
|
operation_id=_("dialogue"),
|
||||||
request_body=ChatApi.get_request_body_api(),
|
request_body=ChatApi.get_request_body_api(),
|
||||||
tags=["应用/会话"])
|
tags=[_("Application/Chat")])
|
||||||
@has_permissions(
|
@has_permissions(
|
||||||
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY,
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY,
|
||||||
RoleConstants.APPLICATION_ACCESS_TOKEN],
|
RoleConstants.APPLICATION_ACCESS_TOKEN],
|
||||||
|
|
@ -145,11 +146,11 @@ class ChatView(APIView):
|
||||||
).chat()
|
).chat()
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取对话列表",
|
@swagger_auto_schema(operation_summary=_("Get the conversation list"),
|
||||||
operation_id="获取对话列表",
|
operation_id=_("Get the conversation list"),
|
||||||
manual_parameters=ChatApi.get_request_params_api(),
|
manual_parameters=ChatApi.get_request_params_api(),
|
||||||
responses=result.get_api_array_response(ChatApi.get_response_body_api()),
|
responses=result.get_api_array_response(ChatApi.get_response_body_api()),
|
||||||
tags=["应用/对话日志"]
|
tags=[_("Application/Conversation Log")]
|
||||||
)
|
)
|
||||||
@has_permissions(
|
@has_permissions(
|
||||||
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
|
||||||
|
|
@ -165,9 +166,9 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['DELETE'], detail=False)
|
@action(methods=['DELETE'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="删除对话",
|
@swagger_auto_schema(operation_summary=_("Delete a conversation"),
|
||||||
operation_id="删除对话",
|
operation_id=_("Delete a conversation"),
|
||||||
tags=["应用/对话日志"])
|
tags=[_("Application/Conversation Log")])
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.ADMIN, RoleConstants.USER],
|
[RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
|
||||||
|
|
@ -184,12 +185,12 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="分页获取客户端对话列表",
|
@swagger_auto_schema(operation_summary=_("Get client conversation list by paging"),
|
||||||
operation_id="分页获取客户端对话列表",
|
operation_id=_("Get client conversation list by paging"),
|
||||||
manual_parameters=result.get_page_request_params(
|
manual_parameters=result.get_page_request_params(
|
||||||
ChatClientHistoryApi.get_request_params_api()),
|
ChatClientHistoryApi.get_request_params_api()),
|
||||||
responses=result.get_page_api_response(ChatApi.get_response_body_api()),
|
responses=result.get_page_api_response(ChatApi.get_response_body_api()),
|
||||||
tags=["应用/对话日志"]
|
tags=[_("Application/Conversation Log")]
|
||||||
)
|
)
|
||||||
@has_permissions(
|
@has_permissions(
|
||||||
ViewPermission([RoleConstants.APPLICATION_ACCESS_TOKEN],
|
ViewPermission([RoleConstants.APPLICATION_ACCESS_TOKEN],
|
||||||
|
|
@ -206,9 +207,9 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['DELETE'], detail=False)
|
@action(methods=['DELETE'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="客户端删除对话",
|
@swagger_auto_schema(operation_summary=_("Client deletes conversation"),
|
||||||
operation_id="客户端删除对话",
|
operation_id=_("Client deletes conversation"),
|
||||||
tags=["应用/对话日志"])
|
tags=[_("Application/Conversation Log")])
|
||||||
@has_permissions(ViewPermission(
|
@has_permissions(ViewPermission(
|
||||||
[RoleConstants.APPLICATION_ACCESS_TOKEN],
|
[RoleConstants.APPLICATION_ACCESS_TOKEN],
|
||||||
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
||||||
|
|
@ -225,11 +226,11 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="分页获取对话列表",
|
@swagger_auto_schema(operation_summary=_("Get the conversation list by page"),
|
||||||
operation_id="分页获取对话列表",
|
operation_id=_("Get the conversation list by page"),
|
||||||
manual_parameters=result.get_page_request_params(ChatApi.get_request_params_api()),
|
manual_parameters=result.get_page_request_params(ChatApi.get_request_params_api()),
|
||||||
responses=result.get_page_api_response(ChatApi.get_response_body_api()),
|
responses=result.get_page_api_response(ChatApi.get_response_body_api()),
|
||||||
tags=["应用/对话日志"]
|
tags=[_("Application/Conversation Log")]
|
||||||
)
|
)
|
||||||
@has_permissions(
|
@has_permissions(
|
||||||
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
|
||||||
|
|
@ -249,11 +250,11 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取对话记录详情",
|
@swagger_auto_schema(operation_summary=_("Get conversation record details"),
|
||||||
operation_id="获取对话记录详情",
|
operation_id=_("Get conversation record details"),
|
||||||
manual_parameters=ChatRecordApi.get_request_params_api(),
|
manual_parameters=ChatRecordApi.get_request_params_api(),
|
||||||
responses=result.get_api_array_response(ChatRecordApi.get_response_body_api()),
|
responses=result.get_api_array_response(ChatRecordApi.get_response_body_api()),
|
||||||
tags=["应用/对话日志"]
|
tags=[_("Application/Conversation Log")]
|
||||||
)
|
)
|
||||||
@has_permissions(
|
@has_permissions(
|
||||||
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY,
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY,
|
||||||
|
|
@ -268,11 +269,11 @@ class ChatView(APIView):
|
||||||
'chat_record_id': chat_record_id}).one(request.auth.current_role))
|
'chat_record_id': chat_record_id}).one(request.auth.current_role))
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取对话记录列表",
|
@swagger_auto_schema(operation_summary=_("Get a list of conversation records"),
|
||||||
operation_id="获取对话记录列表",
|
operation_id=_("Get a list of conversation records"),
|
||||||
manual_parameters=ChatRecordApi.get_request_params_api(),
|
manual_parameters=ChatRecordApi.get_request_params_api(),
|
||||||
responses=result.get_api_array_response(ChatRecordApi.get_response_body_api()),
|
responses=result.get_api_array_response(ChatRecordApi.get_response_body_api()),
|
||||||
tags=["应用/对话日志"]
|
tags=[_("Application/Conversation Log")]
|
||||||
)
|
)
|
||||||
@has_permissions(
|
@has_permissions(
|
||||||
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
|
||||||
|
|
@ -288,12 +289,12 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取对话记录列表",
|
@swagger_auto_schema(operation_summary=_("Get the conversation history list by page"),
|
||||||
operation_id="获取对话记录列表",
|
operation_id=_("Get the conversation history list by page"),
|
||||||
manual_parameters=result.get_page_request_params(
|
manual_parameters=result.get_page_request_params(
|
||||||
ChatRecordApi.get_request_params_api()),
|
ChatRecordApi.get_request_params_api()),
|
||||||
responses=result.get_page_api_response(ChatRecordApi.get_response_body_api()),
|
responses=result.get_page_api_response(ChatRecordApi.get_response_body_api()),
|
||||||
tags=["应用/对话日志"]
|
tags=[_("Application/Conversation Log")]
|
||||||
)
|
)
|
||||||
@has_permissions(
|
@has_permissions(
|
||||||
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
|
||||||
|
|
@ -310,12 +311,12 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['PUT'], detail=False)
|
@action(methods=['PUT'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="点赞,点踩",
|
@swagger_auto_schema(operation_summary=_("Like, Dislike"),
|
||||||
operation_id="点赞,点踩",
|
operation_id=_("Like, Dislike"),
|
||||||
manual_parameters=VoteApi.get_request_params_api(),
|
manual_parameters=VoteApi.get_request_params_api(),
|
||||||
request_body=VoteApi.get_request_body_api(),
|
request_body=VoteApi.get_request_body_api(),
|
||||||
responses=result.get_default_response(),
|
responses=result.get_default_response(),
|
||||||
tags=["应用/会话"]
|
tags=[_("Application/Chat")]
|
||||||
)
|
)
|
||||||
@has_permissions(
|
@has_permissions(
|
||||||
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY,
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY,
|
||||||
|
|
@ -332,11 +333,11 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['GET'], detail=False)
|
@action(methods=['GET'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="获取标注段落列表信息",
|
@swagger_auto_schema(operation_summary=_("Get the list of marked paragraphs"),
|
||||||
operation_id="获取标注段落列表信息",
|
operation_id=_("Get the list of marked paragraphs"),
|
||||||
manual_parameters=ChatRecordImproveApi.get_request_params_api(),
|
manual_parameters=ChatRecordImproveApi.get_request_params_api(),
|
||||||
responses=result.get_api_response(ChatRecordImproveApi.get_response_body_api()),
|
responses=result.get_api_response(ChatRecordImproveApi.get_response_body_api()),
|
||||||
tags=["应用/对话日志/标注"]
|
tags=[_("Application/Conversation Log/Annotation")]
|
||||||
)
|
)
|
||||||
@has_permissions(
|
@has_permissions(
|
||||||
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
|
|
@ -351,12 +352,12 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['PUT'], detail=False)
|
@action(methods=['PUT'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="标注",
|
@swagger_auto_schema(operation_summary=_("Annotation"),
|
||||||
operation_id="标注",
|
operation_id=_("Annotation"),
|
||||||
manual_parameters=ImproveApi.get_request_params_api(),
|
manual_parameters=ImproveApi.get_request_params_api(),
|
||||||
request_body=ImproveApi.get_request_body_api(),
|
request_body=ImproveApi.get_request_body_api(),
|
||||||
responses=result.get_api_response(ChatRecordApi.get_response_body_api()),
|
responses=result.get_api_response(ChatRecordApi.get_response_body_api()),
|
||||||
tags=["应用/对话日志/标注"]
|
tags=[_("Application/Conversation Log/Annotation")]
|
||||||
)
|
)
|
||||||
@has_permissions(
|
@has_permissions(
|
||||||
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
|
|
@ -377,11 +378,11 @@ class ChatView(APIView):
|
||||||
'dataset_id': dataset_id, 'document_id': document_id}).improve(request.data))
|
'dataset_id': dataset_id, 'document_id': document_id}).improve(request.data))
|
||||||
|
|
||||||
@action(methods=['POST'], detail=False)
|
@action(methods=['POST'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="添加至知识库",
|
@swagger_auto_schema(operation_summary=_("Add to Knowledge Base"),
|
||||||
operation_id="添加至知识库",
|
operation_id=_("Add to Knowledge Base"),
|
||||||
manual_parameters=ImproveApi.get_request_params_api_post(),
|
manual_parameters=ImproveApi.get_request_params_api_post(),
|
||||||
request_body=ImproveApi.get_request_body_api_post(),
|
request_body=ImproveApi.get_request_body_api_post(),
|
||||||
tags=["应用/对话日志/添加至知识库"]
|
tags=[_("Application/Conversation Log/Add to Knowledge Base")]
|
||||||
)
|
)
|
||||||
@has_permissions(
|
@has_permissions(
|
||||||
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
|
|
@ -402,11 +403,11 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['DELETE'], detail=False)
|
@action(methods=['DELETE'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="标注",
|
@swagger_auto_schema(operation_summary=_("Delete a Annotation"),
|
||||||
operation_id="标注",
|
operation_id=_("Delete a Annotation"),
|
||||||
manual_parameters=ImproveApi.get_request_params_api(),
|
manual_parameters=ImproveApi.get_request_params_api(),
|
||||||
responses=result.get_api_response(ChatRecordApi.get_response_body_api()),
|
responses=result.get_api_response(ChatRecordApi.get_response_body_api()),
|
||||||
tags=["应用/对话日志/标注"]
|
tags=[_("Application/Conversation Log/Annotation")]
|
||||||
)
|
)
|
||||||
@has_permissions(
|
@has_permissions(
|
||||||
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
|
||||||
|
|
@ -432,10 +433,10 @@ class ChatView(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
@action(methods=['POST'], detail=False)
|
@action(methods=['POST'], detail=False)
|
||||||
@swagger_auto_schema(operation_summary="上传文件",
|
@swagger_auto_schema(operation_summary=_("Upload files"),
|
||||||
operation_id="上传文件",
|
operation_id=_("Upload files"),
|
||||||
manual_parameters=ChatRecordApi.get_request_params_api(),
|
manual_parameters=ChatRecordApi.get_request_params_api(),
|
||||||
tags=["应用/对话日志"]
|
tags=[_("Application/Conversation Log")]
|
||||||
)
|
)
|
||||||
@has_permissions(
|
@has_permissions(
|
||||||
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY,
|
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue