diff --git a/apps/application/chat_pipeline/step/chat_step/i_chat_step.py b/apps/application/chat_pipeline/step/chat_step/i_chat_step.py
index e1a860d43..1267f4336 100644
--- a/apps/application/chat_pipeline/step/chat_step/i_chat_step.py
+++ b/apps/application/chat_pipeline/step/chat_step/i_chat_step.py
@@ -9,6 +9,7 @@
from abc import abstractmethod
from typing import Type, List
+from django.utils.translation import gettext_lazy as _
from langchain.chat_models.base import BaseChatModel
from langchain.schema import BaseMessage
from rest_framework import serializers
@@ -23,7 +24,7 @@ from common.util.field_message import ErrMessage
class ModelField(serializers.Field):
def to_internal_value(self, data):
if not isinstance(data, BaseChatModel):
- self.fail('模型类型错误', value=data)
+ self.fail(_('Model type error'), value=data)
return data
def to_representation(self, value):
@@ -33,7 +34,7 @@ class ModelField(serializers.Field):
class MessageField(serializers.Field):
def to_internal_value(self, data):
if not isinstance(data, BaseMessage):
- self.fail('message类型错误', value=data)
+ self.fail(_('Message type error'), value=data)
return data
def to_representation(self, value):
@@ -52,37 +53,37 @@ class IChatStep(IBaseChatPipelineStep):
class InstanceSerializer(serializers.Serializer):
# 对话列表
message_list = serializers.ListField(required=True, child=MessageField(required=True),
- error_messages=ErrMessage.list("对话列表"))
- model_id = serializers.UUIDField(required=False, allow_null=True, error_messages=ErrMessage.uuid("模型id"))
+ error_messages=ErrMessage.list(_("Conversation list")))
+ 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
- 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,
- 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("流式输出"))
- client_id = serializers.CharField(required=True, error_messages=ErrMessage.char("客户端id"))
- client_type = serializers.CharField(required=True, error_messages=ErrMessage.char("客户端类型"))
+ stream = serializers.BooleanField(required=False, error_messages=ErrMessage.base(_("Streaming Output")))
+ client_id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Client id")))
+ 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,
- error_messages=ErrMessage.dict("模型参数设置"))
+ error_messages=ErrMessage.dict(_("Model parameter settings")))
def is_valid(self, *, raise_exception=False):
super().is_valid(raise_exception=True)
message_list: List = self.initial_data.get('message_list')
for message in message_list:
if not isinstance(message, BaseMessage):
- raise Exception("message 类型错误")
+ raise Exception(_("message type error"))
def get_step_serializer(self, manage: PipelineManage) -> Type[serializers.Serializer]:
return self.InstanceSerializer
diff --git a/apps/application/chat_pipeline/step/chat_step/impl/base_chat_step.py b/apps/application/chat_pipeline/step/chat_step/impl/base_chat_step.py
index 6adff00c4..77718df1c 100644
--- a/apps/application/chat_pipeline/step/chat_step/impl/base_chat_step.py
+++ b/apps/application/chat_pipeline/step/chat_step/impl/base_chat_step.py
@@ -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 common.constants.authentication_type import AuthenticationType
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):
@@ -172,7 +173,8 @@ class BaseChatStep(IChatStep):
return iter(
[AIMessageChunk(content=no_references_setting.get('value').replace('{question}', problem_text))]), False
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:
return chat_model.stream(message_list), True
@@ -216,7 +218,7 @@ class BaseChatStep(IChatStep):
'status') == 'designated_answer':
return AIMessage(no_references_setting.get('value').replace('{question}', problem_text)), False
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:
return chat_model.invoke(message_list), True
diff --git a/apps/application/chat_pipeline/step/generate_human_message_step/i_generate_human_message_step.py b/apps/application/chat_pipeline/step/generate_human_message_step/i_generate_human_message_step.py
index fe6be7d2e..9e23f2d6c 100644
--- a/apps/application/chat_pipeline/step/generate_human_message_step/i_generate_human_message_step.py
+++ b/apps/application/chat_pipeline/step/generate_human_message_step/i_generate_human_message_step.py
@@ -9,6 +9,7 @@
from abc import abstractmethod
from typing import Type, List
+from django.utils.translation import gettext_lazy as _
from langchain.schema import BaseMessage
from rest_framework import serializers
@@ -23,26 +24,26 @@ from common.util.field_message import ErrMessage
class IGenerateHumanMessageStep(IBaseChatPipelineStep):
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),
- error_messages=ErrMessage.list("段落列表"))
+ error_messages=ErrMessage.list(_("Paragraph List")))
# 历史对答
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(
- "最大携带知识库段落长度"))
+ _("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,
- 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]:
return self.InstanceSerializer
diff --git a/apps/application/chat_pipeline/step/reset_problem_step/i_reset_problem_step.py b/apps/application/chat_pipeline/step/reset_problem_step/i_reset_problem_step.py
index 920cf626f..f48f5c804 100644
--- a/apps/application/chat_pipeline/step/reset_problem_step/i_reset_problem_step.py
+++ b/apps/application/chat_pipeline/step/reset_problem_step/i_reset_problem_step.py
@@ -9,12 +9,11 @@
from abc import abstractmethod
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 application.chat_pipeline.I_base_chat_pipeline import IBaseChatPipelineStep
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 common.field.common import InstanceField
from common.util.field_message import ErrMessage
@@ -23,15 +22,16 @@ from common.util.field_message import ErrMessage
class IResetProblemStep(IBaseChatPipelineStep):
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),
- error_messages=ErrMessage.list("历史对答"))
+ error_messages=ErrMessage.list(_("History Questions")))
# 大语言模型
- model_id = serializers.UUIDField(required=False, allow_null=True, error_messages=ErrMessage.uuid("模型id"))
- user_id = serializers.UUIDField(required=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(_("User ID")))
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]:
return self.InstanceSerializer
diff --git a/apps/application/chat_pipeline/step/reset_problem_step/impl/base_reset_problem_step.py b/apps/application/chat_pipeline/step/reset_problem_step/impl/base_reset_problem_step.py
index 5e64f8b1f..b5124ccc4 100644
--- a/apps/application/chat_pipeline/step/reset_problem_step/impl/base_reset_problem_step.py
+++ b/apps/application/chat_pipeline/step/reset_problem_step/impl/base_reset_problem_step.py
@@ -14,9 +14,10 @@ from application.chat_pipeline.step.reset_problem_step.i_reset_problem_step impo
from application.models import ChatRecord
from common.util.split_model import flat_map
from setting.models_provider.tools import get_model_instance_by_model_user_id
+from django.utils.translation import gettext_lazy as _
-prompt = (
- '()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在标签中')
+prompt = _(
+ "() 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 tag")
class BaseResetProblemStep(IResetProblemStep):
diff --git a/apps/application/chat_pipeline/step/search_dataset_step/i_search_dataset_step.py b/apps/application/chat_pipeline/step/search_dataset_step/i_search_dataset_step.py
index 97da29643..4213a3c5e 100644
--- a/apps/application/chat_pipeline/step/search_dataset_step/i_search_dataset_step.py
+++ b/apps/application/chat_pipeline/step/search_dataset_step/i_search_dataset_step.py
@@ -11,6 +11,7 @@ from abc import abstractmethod
from typing import List, Type
from django.core import validators
+from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
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 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列表
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
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
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,
- error_messages=ErrMessage.integer("引用分段数"))
+ error_messages=ErrMessage.integer(_("Reference segment number")))
# 相似度 0-1之间
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=[
validators.RegexValidator(regex=re.compile("^embedding|keywords|blend$"),
- message="类型只支持register|reset_password", code=500)
- ], error_messages=ErrMessage.char("检索模式"))
- user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
+ message=_("The type only supports register|reset_password"), code=500)
+ ], error_messages=ErrMessage.char(_("Retrieval Mode")))
+ user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
def get_step_serializer(self, manage: PipelineManage) -> Type[InstanceSerializer]:
return self.InstanceSerializer
diff --git a/apps/application/chat_pipeline/step/search_dataset_step/impl/base_search_dataset_step.py b/apps/application/chat_pipeline/step/search_dataset_step/impl/base_search_dataset_step.py
index 69d1ee501..6591f6d24 100644
--- a/apps/application/chat_pipeline/step/search_dataset_step/impl/base_search_dataset_step.py
+++ b/apps/application/chat_pipeline/step/search_dataset_step/impl/base_search_dataset_step.py
@@ -10,6 +10,8 @@ import os
from typing import List, Dict
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.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):
model = QuerySet(Model).filter(id=_id).first()
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):
- 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
def get_embedding_id(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:
- 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:
- raise Exception("知识库设置错误,请重新设置知识库")
+ raise Exception(_("The knowledge base setting is wrong, please reset the knowledge base"))
return dataset_list[0].embedding_mode_id
diff --git a/apps/application/flow/step_node/ai_chat_step_node/i_chat_node.py b/apps/application/flow/step_node/ai_chat_step_node/i_chat_node.py
index b6a322c2e..9475079af 100644
--- a/apps/application/flow/step_node/ai_chat_step_node/i_chat_node.py
+++ b/apps/application/flow/step_node/ai_chat_step_node/i_chat_node.py
@@ -8,6 +8,7 @@
"""
from typing import Type
+from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from application.flow.i_step_node import INode, NodeResult
@@ -15,19 +16,22 @@ from common.util.field_message import ErrMessage
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,
- error_messages=ErrMessage.char("角色设定"))
- prompt = serializers.CharField(required=True, error_messages=ErrMessage.char("提示词"))
+ error_messages=ErrMessage.char(_("Role Setting")))
+ 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,
- error_messages=ErrMessage.char("上下文类型"))
+ error_messages=ErrMessage.char(_("Context Type")))
class IChatNode(INode):
diff --git a/apps/application/flow/step_node/application_node/i_application_node.py b/apps/application/flow/step_node/application_node/i_application_node.py
index c0fb158fd..c59ce371f 100644
--- a/apps/application/flow/step_node/application_node/i_application_node.py
+++ b/apps/application/flow/step_node/application_node/i_application_node.py
@@ -6,17 +6,19 @@ from rest_framework import serializers
from application.flow.i_step_node import INode, NodeResult
from common.util.field_message import ErrMessage
+from django.utils.translation import gettext_lazy as _
+
class ApplicationNodeSerializer(serializers.Serializer):
- application_id = serializers.CharField(required=True, error_messages=ErrMessage.char("应用id"))
- question_reference_address = serializers.ListField(required=True, error_messages=ErrMessage.list("用户问题"))
- api_input_field_list = serializers.ListField(required=False, error_messages=ErrMessage.list("api输入字段"))
- user_input_field_list = serializers.ListField(required=False, error_messages=ErrMessage.uuid("用户输入字段"))
- image_list = serializers.ListField(required=False, error_messages=ErrMessage.list("图片"))
- document_list = serializers.ListField(required=False, error_messages=ErrMessage.list("文档"))
- audio_list = serializers.ListField(required=False, error_messages=ErrMessage.list("音频"))
- child_node = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.dict("子节点"))
- node_data = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.dict("表单数据"))
+ application_id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Application ID")))
+ 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 Input Fields")))
+ 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(_("picture")))
+ document_list = serializers.ListField(required=False, error_messages=ErrMessage.list(_("document")))
+ 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 Nodes")))
+ node_data = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.dict(_("Form Data")))
class IApplicationNode(INode):
@@ -44,7 +46,7 @@ class IApplicationNode(INode):
app_document_list[1:])
for document in app_document_list:
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', [])
if app_image_list and len(app_image_list) > 0:
app_image_list = self.workflow_manage.get_reference_field(
@@ -52,7 +54,7 @@ class IApplicationNode(INode):
app_image_list[1:])
for image in app_image_list:
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', [])
if app_audio_list and len(app_audio_list) > 0:
@@ -61,7 +63,7 @@ class IApplicationNode(INode):
app_audio_list[1:])
for audio in app_audio_list:
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,
app_document_list=app_document_list, app_image_list=app_image_list,
app_audio_list=app_audio_list,
diff --git a/apps/application/flow/step_node/condition_node/i_condition_node.py b/apps/application/flow/step_node/condition_node/i_condition_node.py
index ffb975a98..a0e9814ff 100644
--- a/apps/application/flow/step_node/condition_node/i_condition_node.py
+++ b/apps/application/flow/step_node/condition_node/i_condition_node.py
@@ -6,9 +6,9 @@
@date:2024/6/7 9:54
@desc:
"""
-import json
from typing import Type
+from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from application.flow.i_step_node import INode
@@ -16,15 +16,15 @@ from common.util.field_message import ErrMessage
class ConditionSerializer(serializers.Serializer):
- compare = serializers.CharField(required=True, error_messages=ErrMessage.char("比较器"))
- value = serializers.CharField(required=True, error_messages=ErrMessage.char(""))
- field = serializers.ListField(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")))
+ field = serializers.ListField(required=True, error_messages=ErrMessage.char(_("Fields")))
class ConditionBranchSerializer(serializers.Serializer):
- id = serializers.CharField(required=True, error_messages=ErrMessage.char("分支id"))
- type = serializers.CharField(required=True, error_messages=ErrMessage.char("分支类型"))
- condition = serializers.CharField(required=True, error_messages=ErrMessage.char("条件or|and"))
+ id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Branch id")))
+ type = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Branch Type")))
+ condition = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Condition or|and")))
conditions = ConditionSerializer(many=True)
diff --git a/apps/application/flow/step_node/direct_reply_node/i_reply_node.py b/apps/application/flow/step_node/direct_reply_node/i_reply_node.py
index 3c0f35875..d60541b18 100644
--- a/apps/application/flow/step_node/direct_reply_node/i_reply_node.py
+++ b/apps/application/flow/step_node/direct_reply_node/i_reply_node.py
@@ -13,25 +13,26 @@ from rest_framework import serializers
from application.flow.i_step_node import INode, NodeResult
from common.exception.app_exception import AppApiException
from common.util.field_message import ErrMessage
+from django.utils.translation import gettext_lazy as _
class ReplyNodeParamsSerializer(serializers.Serializer):
- reply_type = serializers.CharField(required=True, error_messages=ErrMessage.char("回复类型"))
- fields = serializers.ListField(required=False, error_messages=ErrMessage.list("引用字段"))
+ reply_type = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Response Type")))
+ fields = serializers.ListField(required=False, error_messages=ErrMessage.list(_("Reference Field")))
content = serializers.CharField(required=False, allow_blank=True, allow_null=True,
- error_messages=ErrMessage.char("直接回答内容"))
- is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean('是否返回内容'))
+ error_messages=ErrMessage.char(_("Direct answer content")))
+ is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_('Whether to return content')))
def is_valid(self, *, raise_exception=False):
super().is_valid(raise_exception=True)
if self.data.get('reply_type') == 'referencing':
if 'fields' not in self.data:
- raise AppApiException(500, "引用字段不能为空")
+ raise AppApiException(500, _("Reference field cannot be empty"))
if len(self.data.get('fields')) < 2:
- raise AppApiException(500, "引用字段错误")
+ raise AppApiException(500, _("Reference field error"))
else:
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):
diff --git a/apps/application/flow/step_node/document_extract_node/i_document_extract_node.py b/apps/application/flow/step_node/document_extract_node/i_document_extract_node.py
index 727267c33..93d2b5b98 100644
--- a/apps/application/flow/step_node/document_extract_node/i_document_extract_node.py
+++ b/apps/application/flow/step_node/document_extract_node/i_document_extract_node.py
@@ -2,6 +2,7 @@
from typing import Type
+from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from application.flow.i_step_node import INode, NodeResult
@@ -9,7 +10,7 @@ from common.util.field_message import ErrMessage
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):
diff --git a/apps/application/flow/step_node/form_node/i_form_node.py b/apps/application/flow/step_node/form_node/i_form_node.py
index cfd178ded..7e8249429 100644
--- a/apps/application/flow/step_node/form_node/i_form_node.py
+++ b/apps/application/flow/step_node/form_node/i_form_node.py
@@ -12,12 +12,13 @@ from rest_framework import serializers
from application.flow.i_step_node import INode, NodeResult
from common.util.field_message import ErrMessage
+from django.utils.translation import gettext_lazy as _
class FormNodeParamsSerializer(serializers.Serializer):
- form_field_list = serializers.ListField(required=True, error_messages=ErrMessage.list("表单配置"))
- form_content_format = serializers.CharField(required=True, error_messages=ErrMessage.char('表单输出内容'))
- form_data = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.dict("表单数据"))
+ 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 output content')))
+ form_data = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.dict(_("Form Data")))
class IFormNode(INode):
diff --git a/apps/application/flow/step_node/function_lib_node/i_function_lib_node.py b/apps/application/flow/step_node/function_lib_node/i_function_lib_node.py
index e69d40a1d..c187a4fe8 100644
--- a/apps/application/flow/step_node/function_lib_node/i_function_lib_node.py
+++ b/apps/application/flow/step_node/function_lib_node/i_function_lib_node.py
@@ -15,23 +15,24 @@ from application.flow.i_step_node import INode, NodeResult
from common.field.common import ObjectField
from common.util.field_message import ErrMessage
from function_lib.models.function import FunctionLib
+from django.utils.translation import gettext_lazy as _
class InputField(serializers.Serializer):
- name = serializers.CharField(required=True, error_messages=ErrMessage.char('变量名'))
- value = ObjectField(required=True, error_messages=ErrMessage.char("变量值"), model_type_list=[str, list])
+ name = serializers.CharField(required=True, error_messages=ErrMessage.char(_('Variable Name')))
+ value = ObjectField(required=True, error_messages=ErrMessage.char(_("Variable Value")), model_type_list=[str, list])
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)
- 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):
super().is_valid(raise_exception=True)
f_lib = QuerySet(FunctionLib).filter(id=self.data.get('function_lib_id')).first()
if f_lib is None:
- raise Exception('函数库已被删除')
+ raise Exception(_('The library has been deleted'))
class IFunctionLibNode(INode):
diff --git a/apps/application/flow/step_node/function_node/i_function_node.py b/apps/application/flow/step_node/function_node/i_function_node.py
index 30e6c96e9..38ce164bc 100644
--- a/apps/application/flow/step_node/function_node/i_function_node.py
+++ b/apps/application/flow/step_node/function_node/i_function_node.py
@@ -16,32 +16,35 @@ from application.flow.i_step_node import INode, NodeResult
from common.exception.app_exception import AppApiException
from common.field.common import ObjectField
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):
- name = serializers.CharField(required=True, error_messages=ErrMessage.char('变量名'))
- is_required = serializers.BooleanField(required=True, error_messages=ErrMessage.boolean("是否必填"))
- type = serializers.CharField(required=True, error_messages=ErrMessage.char("类型"), validators=[
+ name = serializers.CharField(required=True, error_messages=ErrMessage.char(_('Variable Name')))
+ is_required = serializers.BooleanField(required=True, error_messages=ErrMessage.boolean(_("Is this field required")))
+ type = serializers.CharField(required=True, error_messages=ErrMessage.char(_("type")), validators=[
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$"),
- 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):
super().is_valid(raise_exception=True)
is_required = self.data.get('is_required')
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):
input_field_list = InputField(required=True, many=True)
- code = serializers.CharField(required=True, error_messages=ErrMessage.char("函数"))
- is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean('是否返回内容'))
+ code = serializers.CharField(required=True, error_messages=ErrMessage.char(_("function")))
+ is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_('Whether to return content')))
def is_valid(self, *, raise_exception=False):
super().is_valid(raise_exception=True)
diff --git a/apps/application/flow/step_node/image_generate_step_node/i_image_generate_node.py b/apps/application/flow/step_node/image_generate_step_node/i_image_generate_node.py
index 30f8667b5..56a214cf9 100644
--- a/apps/application/flow/step_node/image_generate_step_node/i_image_generate_node.py
+++ b/apps/application/flow/step_node/image_generate_step_node/i_image_generate_node.py
@@ -6,22 +6,27 @@ from rest_framework import serializers
from application.flow.i_step_node import INode, NodeResult
from common.util.field_message import ErrMessage
+from django.utils.translation import gettext_lazy as _
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):
diff --git a/apps/application/flow/step_node/image_understand_step_node/i_image_understand_node.py b/apps/application/flow/step_node/image_understand_step_node/i_image_understand_node.py
index 8fce0b176..5ef4c1017 100644
--- a/apps/application/flow/step_node/image_understand_step_node/i_image_understand_node.py
+++ b/apps/application/flow/step_node/image_understand_step_node/i_image_understand_node.py
@@ -6,24 +6,25 @@ from rest_framework import serializers
from application.flow.i_step_node import INode, NodeResult
from common.util.field_message import ErrMessage
+from django.utils.translation import gettext_lazy as _
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,
- error_messages=ErrMessage.char("角色设定"))
- prompt = serializers.CharField(required=True, error_messages=ErrMessage.char("提示词"))
+ error_messages=ErrMessage.char(_("Role Setting")))
+ 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("图片"))
-
- model_params_setting = serializers.JSONField(required=False, default=dict, error_messages=ErrMessage.json("模型参数设置"))
+ 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 parameter settings")))
class IImageUnderstandNode(INode):
diff --git a/apps/application/flow/step_node/question_node/i_question_node.py b/apps/application/flow/step_node/question_node/i_question_node.py
index 054a7ad9e..57898bf22 100644
--- a/apps/application/flow/step_node/question_node/i_question_node.py
+++ b/apps/application/flow/step_node/question_node/i_question_node.py
@@ -12,18 +12,19 @@ from rest_framework import serializers
from application.flow.i_step_node import INode, NodeResult
from common.util.field_message import ErrMessage
+from django.utils.translation import gettext_lazy as _
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,
- error_messages=ErrMessage.char("角色设定"))
- prompt = serializers.CharField(required=True, error_messages=ErrMessage.char("提示词"))
+ error_messages=ErrMessage.char(_("Role Setting")))
+ 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('是否返回内容'))
- model_params_setting = serializers.DictField(required=False, error_messages=ErrMessage.integer("模型参数相关设置"))
+ 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 parameter settings")))
class IQuestionNode(INode):
diff --git a/apps/application/flow/step_node/reranker_node/i_reranker_node.py b/apps/application/flow/step_node/reranker_node/i_reranker_node.py
index fec3ec021..3b95e4dd6 100644
--- a/apps/application/flow/step_node/reranker_node/i_reranker_node.py
+++ b/apps/application/flow/step_node/reranker_node/i_reranker_node.py
@@ -12,17 +12,18 @@ from rest_framework import serializers
from application.flow.i_step_node import INode, NodeResult
from common.util.field_message import ErrMessage
+from django.utils.translation import gettext_lazy as _
class RerankerSettingSerializer(serializers.Serializer):
# 需要查询的条数
top_n = serializers.IntegerField(required=True,
- error_messages=ErrMessage.integer("引用分段数"))
+ error_messages=ErrMessage.integer(_("Reference segment number")))
# 相似度 0-1之间
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,
- error_messages=ErrMessage.float("最大引用分段字数"))
+ error_messages=ErrMessage.float(_("Maximum number of words in a quoted segment")))
class RerankerStepNodeSerializer(serializers.Serializer):
diff --git a/apps/application/flow/step_node/search_dataset_node/i_search_dataset_node.py b/apps/application/flow/step_node/search_dataset_node/i_search_dataset_node.py
index 0de4e65a0..0ca70c027 100644
--- a/apps/application/flow/step_node/search_dataset_node/i_search_dataset_node.py
+++ b/apps/application/flow/step_node/search_dataset_node/i_search_dataset_node.py
@@ -15,30 +15,31 @@ from rest_framework import serializers
from application.flow.i_step_node import INode, NodeResult
from common.util.common import flat_map
from common.util.field_message import ErrMessage
+from django.utils.translation import gettext_lazy as _
class DatasetSettingSerializer(serializers.Serializer):
# 需要查询的条数
top_n = serializers.IntegerField(required=True,
- error_messages=ErrMessage.integer("引用分段数"))
+ error_messages=ErrMessage.integer(_("Reference segment number")))
# 相似度 0-1之间
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=[
validators.RegexValidator(regex=re.compile("^embedding|keywords|blend$"),
- message="类型只支持register|reset_password", code=500)
- ], error_messages=ErrMessage.char("检索模式"))
+ message=_("The type only supports register|reset_password"), code=500)
+ ], error_messages=ErrMessage.char(_("Retrieval Mode")))
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):
# 需要查询的数据集id列表
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)
- question_reference_address = serializers.ListField(required=True, )
+ question_reference_address = serializers.ListField(required=True)
def is_valid(self, *, raise_exception=False):
super().is_valid(raise_exception=True)
diff --git a/apps/application/flow/step_node/speech_to_text_step_node/i_speech_to_text_node.py b/apps/application/flow/step_node/speech_to_text_step_node/i_speech_to_text_node.py
index 1df3d273d..154762dca 100644
--- a/apps/application/flow/step_node/speech_to_text_step_node/i_speech_to_text_node.py
+++ b/apps/application/flow/step_node/speech_to_text_step_node/i_speech_to_text_node.py
@@ -6,14 +6,15 @@ from rest_framework import serializers
from application.flow.i_step_node import INode, NodeResult
from common.util.field_message import ErrMessage
+from django.utils.translation import gettext_lazy as _
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):
@@ -27,7 +28,7 @@ class ISpeechToTextNode(INode):
self.node_params_serializer.data.get('audio_list')[1:])
for audio in res:
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)
diff --git a/apps/application/flow/step_node/text_to_speech_step_node/i_text_to_speech_node.py b/apps/application/flow/step_node/text_to_speech_step_node/i_text_to_speech_node.py
index 1b31f992f..68b53ea92 100644
--- a/apps/application/flow/step_node/text_to_speech_step_node/i_text_to_speech_node.py
+++ b/apps/application/flow/step_node/text_to_speech_step_node/i_text_to_speech_node.py
@@ -6,16 +6,17 @@ from rest_framework import serializers
from application.flow.i_step_node import INode, NodeResult
from common.util.field_message import ErrMessage
+from django.utils.translation import gettext_lazy as _
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,
- error_messages=ErrMessage.integer("模型参数相关设置"))
+ error_messages=ErrMessage.integer(_("Model parameter settings")))
class ITextToSpeechNode(INode):
diff --git a/apps/application/serializers/application_serializers.py b/apps/application/serializers/application_serializers.py
index cbd3b105a..ff6d0be68 100644
--- a/apps/application/serializers/application_serializers.py
+++ b/apps/application/serializers/application_serializers.py
@@ -24,6 +24,7 @@ from django.db.models.expressions import RawSQL
from django.http import HttpResponse
from django.template import Template, Context
from rest_framework import serializers, status
+from rest_framework.utils.formatting import lazy_format
from application.flow.workflow_manage import Flow
from application.models import Application, ApplicationDatasetMapping, ApplicationTypeChoices, WorkFlowVersion
@@ -66,13 +67,13 @@ class MKInstance:
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,
- error_messages=ErrMessage.char("模型id"))
+ error_messages=ErrMessage.char(_("Model id")))
dataset_id_list = serializers.ListSerializer(required=False, child=serializers.UUIDField(required=True,
error_messages=ErrMessage.uuid(
- "知识库id")),
- error_messages=ErrMessage.list("知识库列表"))
+ _("Knowledge base id"))),
+ error_messages=ErrMessage.list(_("Knowledge Base List")))
def is_valid(self, *, raise_exception=True):
super().is_valid(raise_exception=True)
@@ -80,13 +81,13 @@ class ModelDatasetAssociation(serializers.Serializer):
user_id = self.data.get('user_id')
if model_id is not None and len(model_id) > 0:
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')))
exist_dataset_id_list = [str(dataset.id) for dataset in
QuerySet(DataSet).filter(id__in=dataset_id_list, user_id=user_id)]
for dataset_id in dataset_id_list:
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):
@@ -103,8 +104,8 @@ class NoReferencesChoices(models.TextChoices):
class NoReferencesSetting(serializers.Serializer):
status = serializers.ChoiceField(required=True, choices=NoReferencesChoices.choices,
- error_messages=ErrMessage.char("无引用状态"))
- value = serializers.CharField(required=True, error_messages=ErrMessage.char("提示词"))
+ error_messages=ErrMessage.char(_("No reference status")))
+ value = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Prompt word")))
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):
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,
- error_messages=ErrMessage.float("相识度"))
+ error_messages=ErrMessage.float(_("Acquaintance")))
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=[
validators.RegexValidator(regex=re.compile("^embedding|keywords|blend$"),
- message="类型只支持register|reset_password", code=500)
- ], error_messages=ErrMessage.char("检索模式"))
+ message=_("The type only supports register|reset_password"), code=500)
+ ], 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):
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,
- 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,
- error_messages=ErrMessage.char("无引用分段提示词"))
+ error_messages=ErrMessage.char(_("No citation segmentation prompt")))
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,
max_length=256, min_length=1,
- error_messages=ErrMessage.char("应用描述"))
- work_flow = serializers.DictField(required=False, error_messages=ErrMessage.dict("工作流对象"))
+ error_messages=ErrMessage.char(_("Application Description")))
+ 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,
- error_messages=ErrMessage.char("开场白"))
+ error_messages=ErrMessage.char(_("Opening remarks")))
@staticmethod
def to_application_model(user_id: str, application: Dict):
@@ -198,31 +202,35 @@ class ApplicationSerializer(serializers.Serializer):
max_length=256, min_length=1,
error_messages=ErrMessage.char(_("application describe")))
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,
min_value=0,
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,
- error_messages=ErrMessage.char("开场白"))
+ error_messages=ErrMessage.char(_("Opening remarks")))
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)
# 模型相关设置
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,
- 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.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):
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()
class Embed(serializers.Serializer):
- host = serializers.CharField(required=True, error_messages=ErrMessage.char("主机"))
- protocol = serializers.CharField(required=True, error_messages=ErrMessage.char("协议"))
- token = serializers.CharField(required=True, error_messages=ErrMessage.char("token"))
+ host = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Host")))
+ protocol = serializers.CharField(required=True, error_messages=ErrMessage.char(_("protocol")))
+ token = serializers.CharField(required=True, error_messages=ErrMessage.char(_("token")))
def get_embed(self, with_valid=True, params=None):
if params is None:
@@ -310,22 +318,24 @@ class ApplicationSerializer(serializers.Serializer):
return query
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):
access_token_reset = serializers.BooleanField(required=False,
- error_messages=ErrMessage.boolean("重置Token"))
- is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean("是否开启"))
+ error_messages=ErrMessage.boolean(_("Reset Token")))
+ is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_("Is it enabled")))
access_num = serializers.IntegerField(required=False, max_value=10000,
min_value=0,
- error_messages=ErrMessage.integer("访问次数"))
- white_active = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean("是否开启白名单"))
+ error_messages=ErrMessage.integer(_("Number of visits")))
+ 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,
error_messages=ErrMessage.char(
- "白名单")),
- error_messages=ErrMessage.list("白名单列表")),
+ _("Whitelist"))),
+ error_messages=ErrMessage.list(_("Whitelist"))),
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):
if with_valid:
@@ -389,9 +399,9 @@ class ApplicationSerializer(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,
- error_messages=ErrMessage.char("认证信息"))
+ error_messages=ErrMessage.char(_("Certification Information")))
def auth(self, request, with_valid=True):
token = request.META.get('HTTP_AUTHORIZATION')
@@ -428,7 +438,7 @@ class ApplicationSerializer(serializers.Serializer):
'authentication': authentication})
return token
else:
- raise NotFound404(404, "无效的access_token")
+ raise NotFound404(404, _("Invalid access_token"))
def auth_authentication_value(self, authentication_value, application_id):
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 authentication_value.get('type') == 'password':
if not self.auth_password(authentication_value, application_setting.authentication_value):
- raise AppApiException(1005, "密码错误")
+ raise AppApiException(1005, _("Wrong password"))
return True
@staticmethod
@@ -448,38 +458,40 @@ class ApplicationSerializer(serializers.Serializer):
class Edit(serializers.Serializer):
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,
- error_messages=ErrMessage.char("应用描述"))
+ error_messages=ErrMessage.char(_("Application Description")))
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,
min_value=0,
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,
- error_messages=ErrMessage.char("开场白"))
+ error_messages=ErrMessage.char(_("Opening remarks")))
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,
- error_messages=ErrMessage.json("数据集设置"))
+ error_messages=ErrMessage.json(_("Dataset settings")))
# 模型相关设置
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,
- error_messages=ErrMessage.boolean("问题补全"))
- icon = serializers.CharField(required=False, allow_null=True, error_messages=ErrMessage.char("icon图标"))
+ error_messages=ErrMessage.boolean(_("Question completion")))
+ 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):
- 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,
- 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
def insert(self, application: Dict):
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)
class HitTest(serializers.Serializer):
- id = serializers.CharField(required=True, error_messages=ErrMessage.uuid("应用id"))
- user_id = serializers.UUIDField(required=False, error_messages=ErrMessage.uuid("用户id"))
- query_text = serializers.CharField(required=True, error_messages=ErrMessage.char("查询文本"))
+ id = serializers.CharField(required=True, error_messages=ErrMessage.uuid(_("Application 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")))
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,
- error_messages=ErrMessage.float("相关度"))
+ error_messages=ErrMessage.float(_("Relevance")))
search_mode = serializers.CharField(required=True, validators=[
validators.RegexValidator(regex=re.compile("^embedding|keywords|blend$"),
- message="类型只支持register|reset_password", code=500)
- ], error_messages=ErrMessage.char("检索模式"))
+ message=_("The type only supports register|reset_password"), code=500)
+ ], error_messages=ErrMessage.char(_("Retrieval Mode")))
def is_valid(self, *, raise_exception=False):
super().is_valid(raise_exception=True)
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):
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]
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"))
- select_user_id = serializers.UUIDField(required=False, 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(_("Select User ID")))
def get_query_set(self):
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(
{'user_id': models.CharField(),
'team_member_permission.auth_target_type': models.CharField(),
- 'team_member_permission.operate': ArrayField(verbose_name="权限操作列表",
- base_field=models.CharField(max_length=256,
+ 'team_member_permission.operate': ArrayField(base_field=models.CharField(max_length=256,
blank=True,
choices=AuthOperate.choices,
default=AuthOperate.USE)
@@ -661,16 +672,16 @@ class ApplicationSerializer(serializers.Serializer):
fields = ['id', 'name', 'desc', 'prologue', 'dialogue_number', 'icon', 'type']
class IconOperate(serializers.Serializer):
- application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
- user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
- image = UploadedImageField(required=True, error_messages=ErrMessage.image("图片"))
+ application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Application ID")))
+ user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
+ image = UploadedImageField(required=True, error_messages=ErrMessage.image(_("picture")))
def edit(self, with_valid=True):
if with_valid:
self.is_valid(raise_exception=True)
application = QuerySet(Application).filter(id=self.data.get('application_id')).first()
if application is None:
- raise AppApiException(500, '不存在的应用id')
+ raise AppApiException(500, _('Application id does not exist'))
image_id = uuid.uuid1()
image = Image(id=image_id, image=self.data.get('image').read(), image_name=self.data.get('image').name)
image.save()
@@ -682,11 +693,12 @@ class ApplicationSerializer(serializers.Serializer):
return {**ApplicationSerializer.Query.reset_application(ApplicationSerializerModel(application).data)}
class Import(serializers.Serializer):
- file = UploadedFileField(required=True, error_messages=ErrMessage.image("文件"))
- user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
+ file = UploadedFileField(required=True, error_messages=ErrMessage.image(_("file")))
+ user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
@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
def import_(self, with_valid=True):
if with_valid:
@@ -696,7 +708,7 @@ class ApplicationSerializer(serializers.Serializer):
try:
mk_instance = pickle.loads(mk_instance_bytes)
except Exception as e:
- raise AppApiException(1001, "不支持的文件格式")
+ raise AppApiException(1001, _("Unsupported file format"))
application = mk_instance.application
function_lib_list = mk_instance.function_lib_list
if len(function_lib_list) > 0:
@@ -755,13 +767,13 @@ class ApplicationSerializer(serializers.Serializer):
permission_type=PermissionType.PRIVATE)
class Operate(serializers.Serializer):
- application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
- user_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(_("User ID")))
def is_valid(self, *, raise_exception=False):
super().is_valid(raise_exception=True)
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):
if with_valid:
@@ -834,7 +846,7 @@ class ApplicationSerializer(serializers.Serializer):
application = QuerySet(Application).filter(id=self.data.get("application_id")).first()
work_flow = instance.get('work_flow')
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()
base_node = get_base_node_work_flow(work_flow)
if base_node is not None:
@@ -896,7 +908,9 @@ class ApplicationSerializer(serializers.Serializer):
dataset_id_list = node_data.get('dataset_id_list', [])
for dataset_id in dataset_id_list:
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 = [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_access_token = QuerySet(ApplicationAccessToken).filter(application_id=application.id).first()
if application_access_token is None:
- raise AppUnauthorizedFailed(500, "非法用户")
+ raise AppUnauthorizedFailed(500, _("Illegal User"))
application_setting_model = DBModelManage.get_model('application_setting')
if application.type == ApplicationTypeChoices.WORK_FLOW:
work_flow_version = QuerySet(WorkFlowVersion).filter(application_id=application.id).order_by(
@@ -983,27 +997,30 @@ class ApplicationSerializer(serializers.Serializer):
model = QuerySet(Model).filter(
id=instance.get('model_id')).first()
if model is None:
- raise AppApiException(500, "模型不存在")
+ raise AppApiException(500, _("Model does not exist"))
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:
application.stt_model_id = None
else:
model = QuerySet(Model).filter(
id=instance.get('stt_model_id')).first()
if model is None:
- raise AppApiException(500, "模型不存在")
+ raise AppApiException(500, _("Model does not exist"))
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:
application.tts_model_id = None
else:
model = QuerySet(Model).filter(
id=instance.get('tts_model_id')).first()
if model is None:
- raise AppApiException(500, "模型不存在")
+ raise AppApiException(500, _("Model does not exist"))
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:
# 当前用户可修改关联的知识库列表
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)]
for dataset_id in dataset_id_list:
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)
if application.type == ApplicationTypeChoices.SIMPLE:
@@ -1180,16 +1199,16 @@ class ApplicationSerializer(serializers.Serializer):
fields = "__all__"
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):
super().is_valid(raise_exception=True)
application_id = self.data.get("application_id")
application = QuerySet(Application).filter(id=application_id).first()
if application is None:
- raise AppApiException(1001, "应用不存在")
+ raise AppApiException(1001, _("Application does not exist"))
def generate(self, with_valid=True):
if with_valid:
@@ -1211,21 +1230,22 @@ class ApplicationSerializer(serializers.Serializer):
QuerySet(ApplicationApiKey).filter(application_id=application_id)]
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,
- error_messages=ErrMessage.boolean("是否允许跨域"))
+ error_messages=ErrMessage.boolean(
+ _("Is cross-domain allowed")))
cross_domain_list = serializers.ListSerializer(required=False,
child=serializers.CharField(required=True,
error_messages=ErrMessage.char(
- "跨域列表")),
- error_messages=ErrMessage.char("跨域地址"))
+ _("Cross-domain address"))),
+ error_messages=ErrMessage.char(_("Cross-domain list")))
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):
if with_valid:
@@ -1246,7 +1266,7 @@ class ApplicationSerializer(serializers.Serializer):
application_api_key = QuerySet(ApplicationApiKey).filter(id=api_key_id,
application_id=application_id).first()
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:
application_api_key.is_active = instance.get('is_active')
if 'allow_cross_domain' in instance and instance.get('allow_cross_domain') is not None:
diff --git a/apps/application/serializers/application_statistics_serializers.py b/apps/application/serializers/application_statistics_serializers.py
index e958cb34d..d60f3fe79 100644
--- a/apps/application/serializers/application_statistics_serializers.py
+++ b/apps/application/serializers/application_statistics_serializers.py
@@ -19,12 +19,13 @@ from common.db.search import native_search, get_dynamics_model
from common.util.field_message import ErrMessage
from common.util.file_util import get_file_content
from smartdoc.conf import PROJECT_DIR
+from django.utils.translation import gettext_lazy as _
class ApplicationStatisticsSerializer(serializers.Serializer):
- application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char("应用id"))
- start_time = serializers.DateField(format='%Y-%m-%d', error_messages=ErrMessage.date("开始时间"))
- end_time = serializers.DateField(format='%Y-%m-%d', error_messages=ErrMessage.date("结束时间"))
+ 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")))
+ end_time = serializers.DateField(format='%Y-%m-%d', error_messages=ErrMessage.date(_("End time")))
def get_end_time(self):
return datetime.datetime.combine(
diff --git a/apps/application/serializers/application_version_serializers.py b/apps/application/serializers/application_version_serializers.py
index 1fc701df6..6b8df0e84 100644
--- a/apps/application/serializers/application_version_serializers.py
+++ b/apps/application/serializers/application_version_serializers.py
@@ -9,6 +9,7 @@
from typing import Dict
from django.db.models import QuerySet
+from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from application.models import WorkFlowVersion
@@ -26,14 +27,14 @@ class ApplicationVersionModelSerializer(serializers.ModelSerializer):
class ApplicationVersionEditSerializer(serializers.Serializer):
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 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,
- error_messages=ErrMessage.char("摘要"))
+ error_messages=ErrMessage.char(_("summary")))
def get_query_set(self):
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)
class Operate(serializers.Serializer):
- application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char("应用id"))
- work_flow_version_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("工作流版本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(_("Workflow version id")))
def one(self, with_valid=True):
if with_valid:
@@ -66,7 +68,7 @@ class ApplicationVersionSerializer(serializers.Serializer):
if work_flow_version is not None:
return ApplicationVersionModelSerializer(work_flow_version).data
else:
- raise AppApiException(500, '不存在的工作流版本')
+ raise AppApiException(500, _('Workflow version does not exist'))
def edit(self, instance: Dict, with_valid=True):
if with_valid:
@@ -81,4 +83,4 @@ class ApplicationVersionSerializer(serializers.Serializer):
work_flow_version.save()
return ApplicationVersionModelSerializer(work_flow_version).data
else:
- raise AppApiException(500, '不存在的工作流版本')
+ raise AppApiException(500, _('Workflow version does not exist'))
diff --git a/apps/application/serializers/chat_message_serializers.py b/apps/application/serializers/chat_message_serializers.py
index 04d2d99ba..ca593c61c 100644
--- a/apps/application/serializers/chat_message_serializers.py
+++ b/apps/application/serializers/chat_message_serializers.py
@@ -37,6 +37,7 @@ from common.util.split_model import flat_map
from dataset.models import Paragraph, Document
from setting.models import Model, Status
from setting.models_provider import get_model_credential
+from django.utils.translation import gettext_lazy as _
chat_cache = caches['chat_cache']
@@ -93,7 +94,8 @@ class ChatInfo:
'chat_id': self.chat_id,
'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(
- self.application.problem_optimization_prompt) > 0 else '()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在标签中',
+ 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 tag"),
'prompt': model_setting.get(
'prompt') if 'prompt' in model_setting and len(model_setting.get(
'prompt')) > 0 else Application.get_default_model_prompt(),
@@ -174,21 +176,21 @@ def get_post_handler(chat_info: ChatInfo):
class OpenAIMessage(serializers.Serializer):
- content = serializers.CharField(required=True, error_messages=ErrMessage.char('内容'))
- role = 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')))
class OpenAIInstanceSerializer(serializers.Serializer):
messages = serializers.ListField(child=OpenAIMessage())
- chat_id = serializers.UUIDField(required=False, error_messages=ErrMessage.char("对话id"))
- re_chat = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean("重新生成"))
- stream = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean("流式输出"))
+ chat_id = serializers.UUIDField(required=False, error_messages=ErrMessage.char(_("Conversation ID")))
+ re_chat = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_("Regenerate")))
+ stream = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_("Streaming Output")))
class OpenAIChatSerializer(serializers.Serializer):
- application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
- client_id = serializers.CharField(required=True, error_messages=ErrMessage.char("客户端id"))
- client_type = serializers.CharField(required=True, error_messages=ErrMessage.char("客户端类型"))
+ application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Application 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")))
@staticmethod
def get_message(instance):
@@ -226,28 +228,29 @@ class OpenAIChatSerializer(serializers.Serializer):
class ChatMessageSerializer(serializers.Serializer):
- chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话id"))
- message = serializers.CharField(required=True, error_messages=ErrMessage.char("用户问题"))
- stream = serializers.BooleanField(required=True, error_messages=ErrMessage.char("是否流式回答"))
- re_chat = serializers.BooleanField(required=True, error_messages=ErrMessage.char("是否重新回答"))
+ chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Conversation ID")))
+ message = serializers.CharField(required=True, error_messages=ErrMessage.char(_("User Questions")))
+ stream = serializers.BooleanField(required=True,
+ 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,
- error_messages=ErrMessage.uuid("对话记录id"))
+ error_messages=ErrMessage.uuid(_("Conversation record id")))
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,
- 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("节点参数"))
- application_id = serializers.UUIDField(required=False, allow_null=True, error_messages=ErrMessage.uuid("应用id"))
- client_id = serializers.CharField(required=True, error_messages=ErrMessage.char("客户端id"))
- client_type = serializers.CharField(required=True, error_messages=ErrMessage.char("客户端类型"))
- form_data = serializers.DictField(required=False, error_messages=ErrMessage.char("全局变量"))
- image_list = serializers.ListField(required=False, error_messages=ErrMessage.list("图片"))
- document_list = serializers.ListField(required=False, error_messages=ErrMessage.list("文档"))
- audio_list = serializers.ListField(required=False, error_messages=ErrMessage.list("音频"))
- child_node = serializers.DictField(required=False, allow_null=True, error_messages=ErrMessage.dict("子节点"))
+ 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(_("Application 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")))
+ form_data = serializers.DictField(required=False, error_messages=ErrMessage.char(_("Global variables")))
+ image_list = serializers.ListField(required=False, error_messages=ErrMessage.list(_("picture")))
+ document_list = serializers.ListField(required=False, error_messages=ErrMessage.list(_("document")))
+ 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 Nodes")))
def is_valid_application_workflow(self, *, raise_exception=False):
self.is_valid_intraday_access_num()
@@ -255,7 +258,7 @@ class ChatMessageSerializer(serializers.Serializer):
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(
chat_info.application.id):
- raise ChatException(500, "会话不存在")
+ raise ChatException(500, _("Conversation does not exist"))
def is_valid_intraday_access_num(self):
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_id=self.data.get('application_id')).first()
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):
self.is_valid_intraday_access_num()
@@ -283,9 +286,9 @@ class ChatMessageSerializer(serializers.Serializer):
if model is None:
return chat_info
if model.status == Status.ERROR:
- raise ChatException(500, "当前模型不可用")
+ raise ChatException(500, _("The current model is not available"))
if model.status == Status.DOWNLOAD:
- raise ChatException(500, "模型正在下载中,请稍后再发起对话")
+ raise ChatException(500, _("The model is downloading, please try again later"))
return chat_info
def chat_simple(self, chat_info: ChatInfo, base_to_response):
@@ -329,7 +332,7 @@ class ChatMessageSerializer(serializers.Serializer):
return chat_record_list[-1]
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id, chat_id=chat_info.chat_id).first()
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()
return chat_record
@@ -389,10 +392,10 @@ class ChatMessageSerializer(serializers.Serializer):
def re_open_chat(self, chat_id: str):
chat = QuerySet(Chat).filter(id=chat_id).first()
if chat is None:
- raise ChatException(500, "会话不存在")
+ raise ChatException(500, _("Conversation does not exist"))
application = QuerySet(Application).filter(id=chat.application_id).first()
if application is None:
- raise ChatException(500, "应用不存在")
+ raise ChatException(500, _("Application does not exist"))
if application.type == ApplicationTypeChoices.SIMPLE:
return self.re_open_chat_simple(chat_id, application)
else:
@@ -422,7 +425,7 @@ class ChatMessageSerializer(serializers.Serializer):
work_flow_version = QuerySet(WorkFlowVersion).filter(application_id=application.id).order_by(
'-create_time')[0:1].first()
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_record_list = list(QuerySet(ChatRecord).filter(chat_id=chat_id).order_by('-create_time')[0:5])
diff --git a/apps/application/serializers/chat_serializers.py b/apps/application/serializers/chat_serializers.py
index f8c9467f3..5a13c82f3 100644
--- a/apps/application/serializers/chat_serializers.py
+++ b/apps/application/serializers/chat_serializers.py
@@ -22,6 +22,7 @@ from django.db.models import QuerySet, Q
from django.http import StreamingHttpResponse
from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE
from rest_framework import serializers
+from rest_framework.utils.formatting import lazy_format
from application.flow.workflow_manage import Flow
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_provider import get_model_credential
from smartdoc.conf import PROJECT_DIR
+from django.utils.translation import gettext_lazy as _, gettext as __
chat_cache = caches['chat_cache']
class WorkFlowSerializers(serializers.Serializer):
- nodes = serializers.ListSerializer(child=serializers.DictField(), error_messages=ErrMessage.uuid("节点"))
- edges = 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(_("Connection")))
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 Operate(serializers.Serializer):
- chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话id"))
- application_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(_("Application ID")))
def logic_delete(self, with_valid=True):
if with_valid:
@@ -83,8 +85,8 @@ class ChatSerializers(serializers.Serializer):
return True
class ClientChatHistory(serializers.Serializer):
- application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
- client_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(_("Client id")))
def page(self, current_page: int, page_size: int, with_valid=True):
if with_valid:
@@ -96,18 +98,18 @@ class ChatSerializers(serializers.Serializer):
return page_search(current_page, page_size, queryset, lambda row: ChatSerializerModel(row).data)
class Query(serializers.Serializer):
- abstract = serializers.CharField(required=False, error_messages=ErrMessage.char("摘要"))
- start_time = serializers.DateField(format='%Y-%m-%d', error_messages=ErrMessage.date("开始时间"))
- end_time = serializers.DateField(format='%Y-%m-%d', error_messages=ErrMessage.date("结束时间"))
- user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
- application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
+ abstract = serializers.CharField(required=False, error_messages=ErrMessage.char(_("summary")))
+ 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")))
+ user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
+ application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Application ID")))
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,
- error_messages=ErrMessage.integer("最小点踩数"))
- comparer = serializers.CharField(required=False, error_messages=ErrMessage.char("比较器"), validators=[
+ error_messages=ErrMessage.integer(_("Minimum number of clicks")))
+ comparer = serializers.CharField(required=False, error_messages=ErrMessage.char(_("Comparator")), validators=[
validators.RegexValidator(regex=re.compile("^and|or$"),
- message="只支持and|or", code=500)
+ message=_("Only supports and|or"), code=500)
])
def get_end_time(self):
@@ -222,9 +224,11 @@ class ChatSerializers(serializers.Serializer):
worksheet = workbook.active
worksheet.title = 'Sheet1'
- headers = ['会话ID', '摘要', '用户问题', '优化后问题', '回答', '用户反馈', '引用分段数',
- '分段标题+内容',
- '标注', '消耗tokens', '耗时(s)', '提问时间']
+ headers = [__('Conversation ID'), __('summary'), __('User Questions'), __('Problem after optimization'),
+ __('answer'), __('User feedback'),
+ __('Reference segment number'),
+ __('Section title + content'),
+ __('Annotation'), __('Consuming tokens'), __('Time consumed (s)'), __('Question Time')]
for col_idx, header in enumerate(headers, 1):
cell = worksheet.cell(row=1, column=col_idx)
cell.value = header
@@ -259,16 +263,16 @@ class ChatSerializers(serializers.Serializer):
with_table_name=False)
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):
super().is_valid(raise_exception=True)
user_id = self.data.get('user_id')
application_id = self.data.get('application_id')
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):
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(
'-create_time')[0:1].first()
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,
ChatInfo(chat_id, [],
[],
@@ -309,8 +314,8 @@ class ChatSerializers(serializers.Serializer):
return chat_id
class OpenWorkFlowChat(serializers.Serializer):
- work_flow = WorkFlowSerializers(error_messages=ErrMessage.uuid("工作流"))
- user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
+ work_flow = WorkFlowSerializers(error_messages=ErrMessage.uuid(_("Workflow")))
+ user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
def open(self):
self.is_valid(raise_exception=True)
@@ -332,26 +337,29 @@ class ChatSerializers(serializers.Serializer):
return chat_id
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,
- error_messages=ErrMessage.uuid("应用id"))
+ error_messages=ErrMessage.uuid(_("Application ID")))
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,
- error_messages=ErrMessage.boolean("多轮会话"))
+ error_messages=ErrMessage.boolean(
+ _("Multi-round conversation")))
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)
# 模型相关设置
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):
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:
application = QuerySet(Application).filter(id=self.data.get('id')).first()
if application is None:
- raise AppApiException(500, "应用不存在")
+ raise AppApiException(500, __("Application does not exist"))
return application.user_id
return self.data.get('user_id')
@@ -408,18 +416,19 @@ class ChatSerializerModel(serializers.ModelSerializer):
class ChatRecordSerializer(serializers.Serializer):
class Operate(serializers.Serializer):
- chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话id"))
- application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
- chat_record_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(_("Application 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):
super().is_valid(raise_exception=True)
application_access_token = QuerySet(ApplicationAccessToken).filter(
application_id=self.data.get('application_id')).first()
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:
- raise AppApiException(500, '未开启显示知识来源')
+ raise AppApiException(500, __('Displaying knowledge sources is not enabled'))
def get_chat_record(self):
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)
chat_record = self.get_chat_record()
if chat_record is None:
- raise AppApiException(500, "对话不存在")
+ raise AppApiException(500, __("Conversation does not exist"))
return ChatRecordSerializer.Query.reset_chat_record(chat_record)
class Query(serializers.Serializer):
@@ -499,23 +508,26 @@ class ChatRecordSerializer(serializers.Serializer):
return page
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
def vote(self, with_valid=True):
if with_valid:
self.is_valid(raise_exception=True)
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:
chat_record_details_model = QuerySet(ChatRecord).get(id=self.data.get('chat_record_id'),
chat_id=self.data.get('chat_id'))
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")
if chat_record_details_model.vote_status == VoteChoices.UN_VOTE:
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.save()
else:
- raise AppApiException(500, "已经投票过,请先取消后再进行投票")
+ raise AppApiException(500, __("Already voted, please cancel first and then vote again"))
finally:
un_lock(self.data.get('chat_record_id'))
return True
class ImproveSerializer(serializers.Serializer):
title = serializers.CharField(required=False, max_length=256, allow_null=True, allow_blank=True,
- error_messages=ErrMessage.char("段落标题"))
- content = serializers.CharField(required=True, error_messages=ErrMessage.char("段落内容"))
+ error_messages=ErrMessage.char(_("Section title")))
+ 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,
- error_messages=ErrMessage.char("问题"))
+ error_messages=ErrMessage.char(_("question")))
class ParagraphModel(serializers.ModelSerializer):
class Meta:
@@ -551,9 +563,10 @@ class ChatRecordSerializer(serializers.Serializer):
fields = "__all__"
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):
if with_valid:
@@ -562,7 +575,7 @@ class ChatRecordSerializer(serializers.Serializer):
chat_id = self.data.get('chat_id')
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id, chat_id=chat_id).first()
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:
return []
@@ -576,19 +589,20 @@ class ChatRecordSerializer(serializers.Serializer):
return [ChatRecordSerializer.ParagraphModel(p).data for p in paragraph_model_list]
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):
super().is_valid(raise_exception=True)
if not QuerySet(Document).filter(id=self.data.get('document_id'),
dataset_id=self.data.get('dataset_id')).exists():
- raise AppApiException(500, "文档id不正确")
+ raise AppApiException(500, __("The document id is incorrect"))
@staticmethod
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_record = QuerySet(ChatRecord).filter(id=chat_record_id, chat_id=chat_id).first()
if chat_record is None:
- raise AppApiException(500, '不存在的对话记录')
+ raise AppApiException(500, __('Conversation record does not exist'))
document_id = self.data.get("document_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
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):
if with_valid:
@@ -655,9 +670,12 @@ class ChatRecordSerializer(serializers.Serializer):
paragraph_id = self.data.get('paragraph_id')
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id, chat_id=chat_id).first()
if chat_record is None:
- raise AppApiException(500, '不存在的对话记录')
+ raise AppApiException(500, __('不存在的对话记录'))
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
str(row) != paragraph_id]
chat_record.save()
@@ -667,15 +685,15 @@ class ChatRecordSerializer(serializers.Serializer):
return o.delete()
class PostImprove(serializers.Serializer):
- dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("知识库id"))
- document_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(_("Document id")))
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):
super().is_valid(raise_exception=True)
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
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))
if len(chat_record_list) < len(chat_ids):
- raise AppApiException(500, "存在不存在的对话记录")
+ raise AppApiException(500, __("Conversation records that do not exist"))
# 批量创建段落和问题映射
paragraphs = []
diff --git a/apps/application/swagger_api/application_api.py b/apps/application/swagger_api/application_api.py
index d8bdf79b8..ecd7b0390 100644
--- a/apps/application/swagger_api/application_api.py
+++ b/apps/application/swagger_api/application_api.py
@@ -9,6 +9,7 @@
from drf_yasg import openapi
from common.mixins.api_mixin import ApiMixin
+from django.utils.translation import gettext_lazy as _
class ApplicationApi(ApiMixin):
@@ -20,7 +21,7 @@ class ApplicationApi(ApiMixin):
in_=openapi.IN_FORM,
type=openapi.TYPE_FILE,
required=True,
- description='上传文件')
+ description=_('Upload files'))
]
class Authentication(ApiMixin):
@@ -30,8 +31,9 @@ class ApplicationApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=['access_token', ],
properties={
- 'access_token': openapi.Schema(type=openapi.TYPE_STRING, title="应用认证token",
- description="应用认证token"),
+ 'access_token': openapi.Schema(type=openapi.TYPE_STRING,
+ 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',
'update_time'],
properties={
- 'id': openapi.Schema(type=openapi.TYPE_STRING, title="", description="主键id"),
- 'name': openapi.Schema(type=openapi.TYPE_STRING, title="应用名称", description="应用名称"),
- 'desc': openapi.Schema(type=openapi.TYPE_STRING, title="应用描述", description="应用描述"),
- 'model_id': openapi.Schema(type=openapi.TYPE_STRING, title="模型id", description="模型id"),
- "dialogue_number": openapi.Schema(type=openapi.TYPE_NUMBER, title="多轮对话次数",
- description="多轮对话次数"),
- 'prologue': openapi.Schema(type=openapi.TYPE_STRING, title="开场白", description="开场白"),
+ 'id': openapi.Schema(type=openapi.TYPE_STRING, title="", description=_("Primary key id")),
+ 'name': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application Name"),
+ description=_("Application Name")),
+ 'desc': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application Description"),
+ description=_("Application Description")),
+ 'model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Model id"), 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")),
'example': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_STRING),
- title="示例列表", description="示例列表"),
- 'user_id': openapi.Schema(type=openapi.TYPE_STRING, title="所属用户", description="所属用户"),
+ title=_("Example List"), description=_("Example List")),
+ '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,
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 (returned when querying details)"))
}
)
@@ -74,11 +84,11 @@ class ApplicationApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id'),
+ description=_('Application ID')),
openapi.Parameter(name='model_type', in_=openapi.IN_QUERY,
type=openapi.TYPE_STRING,
required=False,
- description='模型类型'),
+ description=_('Model Type')),
]
class ApiKey(ApiMixin):
@@ -88,7 +98,7 @@ class ApplicationApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id')
+ description=_('Application ID'))
]
@@ -99,12 +109,12 @@ class ApplicationApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id'),
+ description=_('Application ID')),
openapi.Parameter(name='api_key_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用api_key id')
+ description=_('Application api_key id'))
]
@staticmethod
@@ -113,11 +123,12 @@ class ApplicationApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=[],
properties={
- 'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否激活",
- description="是否激活"),
- 'allow_cross_domain': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否允许跨域",
- description="是否允许跨域"),
- 'cross_domain_list': openapi.Schema(type=openapi.TYPE_ARRAY, title='跨域列表',
+ 'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Is activation"),
+ description=_("Is activation")),
+ 'allow_cross_domain': openapi.Schema(type=openapi.TYPE_BOOLEAN,
+ title=_("Is cross-domain allowed"),
+ 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))
}
)
@@ -129,7 +140,7 @@ class ApplicationApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id')
+ description=_('Application ID'))
]
@@ -139,18 +150,21 @@ class ApplicationApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=[],
properties={
- 'access_token_reset': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="重置Token",
- description="重置Token"),
+ 'access_token_reset': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Reset Token"),
+ description=_("Reset Token")),
- 'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否激活", description="是否激活"),
- 'access_num': openapi.Schema(type=openapi.TYPE_NUMBER, title="访问次数", description="访问次数"),
- 'white_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否开启白名单",
- description="是否开启白名单"),
+ 'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Is activation"),
+ description=_("Is activation")),
+ 'access_num': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of visits"),
+ 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,
- items=openapi.Schema(type=openapi.TYPE_STRING), title="白名单列表",
- description="白名单列表"),
- 'show_source': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否显示知识来源",
- description="是否显示知识来源"),
+ items=openapi.Schema(type=openapi.TYPE_STRING), title=_("Whitelist"),
+ description=_("Whitelist")),
+ 'show_source': openapi.Schema(type=openapi.TYPE_BOOLEAN,
+ title=_("Whether to display knowledge sources"),
+ description=_("Whether to display knowledge sources")),
}
)
@@ -161,37 +175,46 @@ class ApplicationApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=[],
properties={
- 'name': openapi.Schema(type=openapi.TYPE_STRING, title="应用名称", description="应用名称"),
- 'desc': openapi.Schema(type=openapi.TYPE_STRING, title="应用描述", description="应用描述"),
- 'model_id': openapi.Schema(type=openapi.TYPE_STRING, title="模型id", description="模型id"),
- "dialogue_number": openapi.Schema(type=openapi.TYPE_NUMBER, title="多轮对话次数",
- description="多轮对话次数"),
- 'prologue': 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=_("Application Description"),
+ description=_("Application Description")),
+ 'model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Model id"),
+ 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,
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(),
'model_setting': ApplicationApi.ModelSetting.get_request_body_api(),
- 'problem_optimization': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="问题优化",
- description="是否开启问题优化", default=True),
+ 'problem_optimization': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Problem Optimization"),
+ description=_("Whether to enable problem optimization"),
+ default=True),
'icon': openapi.Schema(type=openapi.TYPE_STRING, title="icon",
description="icon", default="/ui/favicon.ico"),
- 'type': openapi.Schema(type=openapi.TYPE_STRING, title="应用类型",
- description="应用类型 简易:SIMPLE|工作流:WORK_FLOW"),
+ 'type': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application Type"),
+ description=_("Application Type SIMPLE | WORK_FLOW")),
'work_flow': ApplicationApi.WorkFlow.get_request_body_api(),
- 'problem_optimization_prompt': openapi.Schema(type=openapi.TYPE_STRING, title='问题优化提示词',
- description="问题优化提示词",
- default="()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在标签中"),
- 'tts_model_id': openapi.Schema(type=openapi.TYPE_STRING, title="文字转语音模型ID",
- description="文字转语音模型ID"),
- 'stt_model_id': openapi.Schema(type=openapi.TYPE_STRING, title="语音转文字模型id",
- description="语音转文字模型id"),
- 'stt_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title="语音转文字是否开启",
- description="语音转文字是否开启"),
- 'tts_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title="语音转文字是否开启",
- description="语音转文字是否开启"),
- 'tts_type': openapi.Schema(type=openapi.TYPE_STRING, title="文字转语音类型",
- description="文字转语音类型")
+ 'problem_optimization_prompt': openapi.Schema(type=openapi.TYPE_STRING,
+ title=_('Question optimization tips'),
+ description=_("Question optimization tips"),
+ default=_(
+ "() 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 tag")),
+ 'tts_model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Text-to-speech model ID"),
+ description=_("Text-to-speech model ID")),
+ 'stt_model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Speech-to-text model id"),
+ description=_("Speech-to-text model id")),
+ 'stt_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title=_("Is speech-to-text enabled"),
+ description=_("Is speech-to-text enabled")),
+ 'tts_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title=_("Is text-to-speech enabled"),
+ 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=[''],
properties={
'nodes': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_OBJECT),
- title="节点列表", description="节点列表",
+ title=_("Node List"), description=_("Node List"),
default=[]),
'edges': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_OBJECT),
- title='连线列表', description="连线列表",
+ title=_('Connection List'), description=_("Connection List"),
default={}),
}
@@ -220,24 +243,31 @@ class ApplicationApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=[''],
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),
- 'similarity': openapi.Schema(type=openapi.TYPE_NUMBER, title='相似度', description="相似度",
+ 'similarity': openapi.Schema(type=openapi.TYPE_NUMBER, title=_('Similarity'),
+ description=_("Similarity"),
default=0.6),
- 'max_paragraph_char_number': openapi.Schema(type=openapi.TYPE_NUMBER, title='最多引用字符数',
- description="最多引用字符数", default=3000),
- 'search_mode': openapi.Schema(type=openapi.TYPE_STRING, title='检索模式',
+ 'max_paragraph_char_number': openapi.Schema(type=openapi.TYPE_NUMBER,
+ title=_('Maximum number of quoted characters'),
+ 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'),
- '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'],
properties={
'status': openapi.Schema(type=openapi.TYPE_STRING,
- title="状态",
- description="ai作答:ai_questioning,指定回答:designated_answer",
+ title=_("state"),
+ description=_(
+ "ai_questioning|designated_answer"),
default='ai_questioning'),
'value': openapi.Schema(type=openapi.TYPE_STRING,
- title="值",
- description="ai作答:就是题词,指定回答:就是指定回答内容",
+ title=_("value"),
+ description=_(
+ "ai_questioning: is the title, designated_answer: is the designated answer content"),
default='{question}'),
}),
}
@@ -250,23 +280,26 @@ class ApplicationApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=['prompt'],
properties={
- 'prompt': openapi.Schema(type=openapi.TYPE_STRING, title="提示词", description="提示词",
- default=('已知信息:'
- '\n{data}'
- '\n回答要求:'
- '\n- 如果你不知道答案或者没有从获取答案,请回答“没有在知识库中查找到相关信息,建议咨询相关技术支持或参考官方文档进行操作”。'
- '\n- 避免提及你是从中获得的知识。'
- '\n- 请保持答案与中描述的一致。'
- '\n- 请使用markdown 语法优化答案的格式。'
- '\n- 中的图片链接、链接地址和脚本语言请完整返回。'
- '\n- 请使用与问题相同的语言来回答。'
- '\n问题:'
- '\n{question}')),
+ 'prompt': openapi.Schema(type=openapi.TYPE_STRING, title=_("Prompt word"),
+ description=_("Prompt word"),
+ default=_("""
+Known information:
+{data}
+Answer requirements:
+- 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".
+- Avoid mentioning that you got the knowledge from .
+- Please keep the answer consistent with the description in .
+- Please use markdown syntax to optimize the format of the answer.
+- Please return the image link, link address and script language in completely.
+- Please answer in the same language as the question.
+Question:
+{question}
+ """)),
- 'system': openapi.Schema(type=openapi.TYPE_STRING, title="系统提示词(角色)",
- description="系统提示词(角色)"),
- 'no_references_prompt': openapi.Schema(type=openapi.TYPE_STRING, title="无引用分段提示词",
- default="{question}", description="无引用分段提示词")
+ 'system': openapi.Schema(type=openapi.TYPE_STRING, title=_("System prompt words (role)"),
+ description=_("System prompt words (role)")),
+ 'no_references_prompt': openapi.Schema(type=openapi.TYPE_STRING, title=_("No citation segmentation prompt"),
+ 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',
'problem_optimization', 'stt_model_enable', 'stt_model_enable', 'tts_type'],
properties={
- 'name': openapi.Schema(type=openapi.TYPE_STRING, title="应用名称", description="应用名称"),
- 'desc': openapi.Schema(type=openapi.TYPE_STRING, title="应用描述", description="应用描述"),
- 'model_id': openapi.Schema(type=openapi.TYPE_STRING, title="模型id", description="模型id"),
- "dialogue_number": openapi.Schema(type=openapi.TYPE_NUMBER, title="多轮对话次数",
- description="多轮对话次数"),
- 'prologue': 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=_("Application Description"), description=_("Application Description")),
+ 'model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Model id"), 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,
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(),
'model_setting': ApplicationApi.ModelSetting.get_request_body_api(),
- 'problem_optimization': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="问题优化",
- description="是否开启问题优化", default=True),
- 'type': openapi.Schema(type=openapi.TYPE_STRING, title="应用类型",
- description="应用类型 简易:SIMPLE|工作流:WORK_FLOW"),
- 'problem_optimization_prompt': openapi.Schema(type=openapi.TYPE_STRING, title='问题优化提示词',
- description="问题优化提示词",
- default="()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在标签中"),
- 'tts_model_id': openapi.Schema(type=openapi.TYPE_STRING, title="文字转语音模型ID",
- description="文字转语音模型ID"),
- 'stt_model_id': openapi.Schema(type=openapi.TYPE_STRING, title="语音转文字模型id",
- description="语音转文字模型id"),
- 'stt_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title="语音转文字是否开启",
- description="语音转文字是否开启"),
- 'tts_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title="语音转文字是否开启",
- description="语音转文字是否开启"),
- 'tts_type': openapi.Schema(type=openapi.TYPE_STRING, title="文字转语音类型",
- description="文字转语音类型")
+ 'problem_optimization': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Problem Optimization"),
+ description=_("Problem Optimization"), default=True),
+ 'type': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application Type"),
+ description=_("Application Type SIMPLE | WORK_FLOW")),
+ 'problem_optimization_prompt': openapi.Schema(type=openapi.TYPE_STRING, title=_('Question optimization tips'),
+ description=_("Question optimization tips"),
+ default=_(
+ "() 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 tag")),
+ 'tts_model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Text-to-speech model ID"),
+ description=_("Text-to-speech model ID")),
+ 'stt_model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Speech-to-text model id"),
+ description=_("Speech-to-text model id")),
+ 'stt_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title=_("Is speech-to-text enabled"),
+ description=_("Is speech-to-text enabled")),
+ 'tts_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title=_("Is text-to-speech enabled"),
+ description=_("Is text-to-speech enabled")),
+ '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,
type=openapi.TYPE_STRING,
required=False,
- description='应用名称'),
+ description=_('Application Name')),
openapi.Parameter(name='desc',
in_=openapi.IN_QUERY,
type=openapi.TYPE_STRING,
required=False,
- description='应用描述')
+ description=_('Application Description'))
]
class Export(ApiMixin):
@@ -343,7 +377,7 @@ class ApplicationApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id'),
+ description=_('Application ID')),
]
@@ -354,7 +388,7 @@ class ApplicationApi(ApiMixin):
in_=openapi.IN_FORM,
type=openapi.TYPE_FILE,
required=True,
- description='上传图片文件')
+ description=_('Upload image files'))
]
class Operate(ApiMixin):
@@ -364,6 +398,6 @@ class ApplicationApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id'),
+ description=_('Application ID')),
]
diff --git a/apps/application/swagger_api/application_statistics_api.py b/apps/application/swagger_api/application_statistics_api.py
index 87fde1098..7824a34c5 100644
--- a/apps/application/swagger_api/application_statistics_api.py
+++ b/apps/application/swagger_api/application_statistics_api.py
@@ -9,7 +9,7 @@
from drf_yasg import openapi
from common.mixins.api_mixin import ApiMixin
-
+from django.utils.translation import gettext_lazy as _
class ApplicationStatisticsApi(ApiMixin):
@staticmethod
@@ -18,17 +18,17 @@ class ApplicationStatisticsApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id'),
+ description=_('Application ID')),
openapi.Parameter(name='start_time',
in_=openapi.IN_QUERY,
type=openapi.TYPE_STRING,
required=True,
- description='开始时间'),
+ description=_('Start time')),
openapi.Parameter(name='end_time',
in_=openapi.IN_QUERY,
type=openapi.TYPE_STRING,
required=True,
- description='结束时间'),
+ description=_('End time')),
]
class ChatRecordAggregate(ApiMixin):
@@ -38,21 +38,21 @@ class ApplicationStatisticsApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=['star_num', 'trample_num', 'tokens_num', 'chat_record_count'],
properties={
- 'star_num': openapi.Schema(type=openapi.TYPE_NUMBER, title="点赞数量",
- description="点赞数量"),
+ 'star_num': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of Likes"),
+ description=_("Number of Likes")),
- 'trample_num': openapi.Schema(type=openapi.TYPE_NUMBER, title="点踩数量", description="点踩数量"),
- 'tokens_num': openapi.Schema(type=openapi.TYPE_NUMBER, title="token使用数量",
- description="token使用数量"),
- 'chat_record_count': openapi.Schema(type=openapi.TYPE_NUMBER, title="对话次数",
- description="对话次数"),
- 'customer_num': openapi.Schema(type=openapi.TYPE_NUMBER, title="客户数量",
- description="客户数量"),
- 'customer_added_count': 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=_("Number of tokens used"),
+ description=_("Number of tokens used")),
+ 'chat_record_count': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of conversations"),
+ description=_("Number of conversations")),
+ 'customer_num': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of customers"),
+ description=_("Number of customers")),
+ 'customer_added_count': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of new customers"),
+ description=_("Number of new customers")),
'day': openapi.Schema(type=openapi.TYPE_STRING,
- title="日期",
- description="日期,只有查询趋势的时候才有该字段"),
+ title=_("time"),
+ description=_("Time, this field is only available when querying trends")),
}
)
@@ -63,11 +63,11 @@ class ApplicationStatisticsApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=['added_count'],
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,
- title="时间",
- description="时间"),
+ title=_("time"),
+ description=_("time")),
}
)
@@ -78,9 +78,9 @@ class ApplicationStatisticsApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=['added_count'],
properties={
- 'today_added_count': openapi.Schema(type=openapi.TYPE_NUMBER, title="今日新增数量",
- description="今日新增数量"),
- 'added_count': openapi.Schema(type=openapi.TYPE_NUMBER, title="新增数量", description="新增数量"),
+ 'today_added_count': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Today's new quantity"),
+ description=_("Today's new quantity")),
+ 'added_count': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("New quantity"), description=_("New quantity")),
}
)
diff --git a/apps/application/swagger_api/application_version_api.py b/apps/application/swagger_api/application_version_api.py
index 5335e1a87..d7edb9a7d 100644
--- a/apps/application/swagger_api/application_version_api.py
+++ b/apps/application/swagger_api/application_version_api.py
@@ -9,6 +9,7 @@
from drf_yasg import openapi
from common.mixins.api_mixin import ApiMixin
+from django.utils.translation import gettext_lazy as _
class ApplicationVersionApi(ApiMixin):
@@ -18,13 +19,16 @@ class ApplicationVersionApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=['id', 'name', 'work_flow', 'create_time', 'update_time'],
properties={
- 'id': openapi.Schema(type=openapi.TYPE_NUMBER, title="主键id",
- description="主键id"),
- 'name': openapi.Schema(type=openapi.TYPE_NUMBER, title="版本名称",
- description="版本名称"),
- 'work_flow': openapi.Schema(type=openapi.TYPE_STRING, title="工作流数据", description='工作流数据'),
- 'create_time': openapi.Schema(type=openapi.TYPE_STRING, title="创建时间", description='创建时间'),
- 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间", description='修改时间')
+ 'id': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Primary key id"),
+ description=_("Primary key id")),
+ 'name': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Version Name"),
+ description=_("Version Name")),
+ 'work_flow': openapi.Schema(type=openapi.TYPE_STRING, title=_("Workflow data"),
+ description=_('Workflow data')),
+ '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,
type=openapi.TYPE_STRING,
required=True,
- description='应用id'),
+ description=_('Application ID')),
openapi.Parameter(name='name',
in_=openapi.IN_QUERY,
type=openapi.TYPE_STRING,
required=False,
- description='版本名称')]
+ description=_('Version Name'))]
class Operate(ApiMixin):
@staticmethod
@@ -49,12 +53,12 @@ class ApplicationVersionApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id'),
+ description=_('Application ID')),
openapi.Parameter(name='work_flow_version_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用版本id'), ]
+ description=_('Application version id')), ]
class Edit(ApiMixin):
@staticmethod
@@ -63,7 +67,7 @@ class ApplicationVersionApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=[],
properties={
- 'name': openapi.Schema(type=openapi.TYPE_STRING, title="版本名称",
- description="版本名称")
+ 'name': openapi.Schema(type=openapi.TYPE_STRING, title=_("Version Name"),
+ description=_("Version Name"))
}
)
diff --git a/apps/application/swagger_api/chat_api.py b/apps/application/swagger_api/chat_api.py
index 0681f11d8..a5c56ca16 100644
--- a/apps/application/swagger_api/chat_api.py
+++ b/apps/application/swagger_api/chat_api.py
@@ -10,6 +10,7 @@ from drf_yasg import openapi
from application.swagger_api.application_api import ApplicationApi
from common.mixins.api_mixin import ApiMixin
+from django.utils.translation import gettext_lazy as _
class ChatClientHistoryApi(ApiMixin):
@@ -19,7 +20,7 @@ class ChatClientHistoryApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id')
+ description=_('Application ID'))
]
@@ -29,21 +30,25 @@ class OpenAIChatApi(ApiMixin):
return openapi.Schema(type=openapi.TYPE_OBJECT,
required=['message'],
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,
required=['role', 'content'],
properties={
'content': openapi.Schema(
type=openapi.TYPE_STRING,
- title="问题内容", default=''),
+ title=_("Question content"),
+ default=''),
'role': openapi.Schema(
type=openapi.TYPE_STRING,
- title='角色', default="user")
+ title=_('role'),
+ default="user")
}
)),
- 'chat_id': openapi.Schema(type=openapi.TYPE_STRING, title="对话id"),
- 're_chat': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="重新生成", default=False),
- 'stream': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="流式输出", default=True)
+ 'chat_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Conversation ID")),
+ 're_chat': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("regenerate"),
+ 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,
required=['message'],
properties={
- 'message': openapi.Schema(type=openapi.TYPE_STRING, title="问题", description="问题"),
- 're_chat': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="重新生成", default=False),
- 'stream': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="重新生成", default=True)
+ 'message': openapi.Schema(type=openapi.TYPE_STRING, title=_("problem"), description=_("problem")),
+ 're_chat': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("regenerate"), default=False),
+ 'stream': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Is it streaming output"), default=True)
}
)
@@ -71,26 +76,26 @@ class ChatApi(ApiMixin):
properties={
'id': openapi.Schema(type=openapi.TYPE_STRING, title="id",
description="id", default="xx"),
- 'application_id': openapi.Schema(type=openapi.TYPE_STRING, title="应用id",
- description="应用id", default='应用id'),
- 'abstract': openapi.Schema(type=openapi.TYPE_STRING, title="摘要",
- description="摘要", default='摘要'),
- 'chat_id': openapi.Schema(type=openapi.TYPE_STRING, title="对话id",
- description="对话id", default="对话id"),
- 'chat_record_count': openapi.Schema(type=openapi.TYPE_STRING, title="对话提问数量",
- description="对话提问数量",
- default="对话提问数量"),
- 'mark_sum': openapi.Schema(type=openapi.TYPE_STRING, title="标记数量",
- description="标记数量", default=1),
- 'star_num': openapi.Schema(type=openapi.TYPE_STRING, title="点赞数量",
- description="点赞数量", default=1),
- 'trample_num': openapi.Schema(type=openapi.TYPE_NUMBER, title="点踩数量",
- description="点踩数量", default=1),
- 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间",
- description="修改时间",
+ 'application_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application ID"),
+ description=_("Application ID"), default=_('Application ID')),
+ 'abstract': openapi.Schema(type=openapi.TYPE_STRING, title=_("abstract"),
+ description=_("abstract"), default=_('abstract')),
+ 'chat_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Conversation ID"),
+ description=_("Conversation ID"), default=_("Conversation ID")),
+ 'chat_record_count': openapi.Schema(type=openapi.TYPE_STRING, title=_("Number of dialogue questions"),
+ description=_("Number of dialogue questions"),
+ default=0),
+ 'mark_sum': openapi.Schema(type=openapi.TYPE_STRING, title=_("Number of tags"),
+ description=_("Number of tags"), default=1),
+ 'star_num': openapi.Schema(type=openapi.TYPE_STRING, title=_("Number of likes"),
+ description=_("Number of likes"), default=1),
+ 'trample_num': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of clicks"),
+ description=_("Number of clicks"), default=1),
+ 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Change time"),
+ description=_("Change time"),
default="1970-01-01 00:00:00"),
- 'create_time': openapi.Schema(type=openapi.TYPE_STRING, title="创建时间",
- description="创建时间",
+ 'create_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Creation time"),
+ description=_("Creation time"),
default="1970-01-01 00:00:00"
)
}
@@ -103,7 +108,7 @@ class ChatApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id'),
+ description=_('Application ID')),
]
@@ -126,18 +131,18 @@ class ChatApi(ApiMixin):
required=['model_id', 'multiple_rounds_dialogue', 'dataset_setting', 'model_setting',
'problem_optimization'],
properties={
- 'id': openapi.Schema(type=openapi.TYPE_STRING, title="应用id",
- description="应用id,修改的时候传,创建的时候不传"),
- 'model_id': openapi.Schema(type=openapi.TYPE_STRING, title="模型id", description="模型id"),
+ 'id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application ID"),
+ description=_("Application ID, pass when modifying, do not pass when creating")),
+ 'model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Model ID"), description=_("Model ID")),
'dataset_id_list': openapi.Schema(type=openapi.TYPE_ARRAY,
items=openapi.Schema(type=openapi.TYPE_STRING),
- title="关联知识库Id列表", description="关联知识库Id列表"),
- 'multiple_rounds_dialogue': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否开启多轮会话",
- description="是否开启多轮会话"),
+ title=_("List of associated knowledge base IDs"), description=_("List of associated knowledge base IDs")),
+ 'multiple_rounds_dialogue': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Do you want to initiate multiple sessions"),
+ description=_("Do you want to initiate multiple sessions")),
'dataset_setting': ApplicationApi.DatasetSetting.get_request_body_api(),
'model_setting': ApplicationApi.ModelSetting.get_request_body_api(),
- 'problem_optimization': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="问题优化",
- description="是否开启问题优化", default=True)
+ 'problem_optimization': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Problem optimization"),
+ description=_("Do you want to enable problem optimization"), default=True)
}
)
@@ -147,20 +152,20 @@ class ChatApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id'),
+ description=_('Application ID')),
openapi.Parameter(name='history_day',
in_=openapi.IN_QUERY,
type=openapi.TYPE_NUMBER,
required=True,
- description='历史天数'),
+ description=_('Historical days')),
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,
- description="最小点赞数"),
+ description=_("Minimum number of likes")),
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,
- description="or|and 比较器")
+ description=_("or|and comparator"))
]
@@ -171,12 +176,12 @@ class ChatRecordApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id'),
+ description=_('Application ID')),
openapi.Parameter(name='chat_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='对话id'),
+ description=_('Conversation ID')),
]
@staticmethod
@@ -189,34 +194,34 @@ class ChatRecordApi(ApiMixin):
properties={
'id': openapi.Schema(type=openapi.TYPE_STRING, title="id",
description="id", default="xx"),
- 'chat': openapi.Schema(type=openapi.TYPE_STRING, title="会话日志id",
- description="会话日志id", default='会话日志id'),
- 'vote_status': openapi.Schema(type=openapi.TYPE_STRING, title="投票状态",
- description="投票状态", default="投票状态"),
- 'dataset': openapi.Schema(type=openapi.TYPE_STRING, title="数据集id", description="数据集id",
- default="数据集id"),
- 'paragraph': openapi.Schema(type=openapi.TYPE_STRING, title="段落id",
- description="段落id", default=1),
- 'source_id': openapi.Schema(type=openapi.TYPE_STRING, title="资源id",
- description="资源id", default=1),
- 'source_type': openapi.Schema(type=openapi.TYPE_STRING, title="资源类型",
- description="资源类型", default='xxx'),
- 'message_tokens': openapi.Schema(type=openapi.TYPE_INTEGER, title="问题消耗token数量",
- description="问题消耗token数量", default=0),
- 'answer_tokens': openapi.Schema(type=openapi.TYPE_INTEGER, title="答案消耗token数量",
- description="答案消耗token数量", default=0),
- 'improve_paragraph_id_list': openapi.Schema(type=openapi.TYPE_STRING, title="改进标注列表",
- description="改进标注列表",
+ 'chat': openapi.Schema(type=openapi.TYPE_STRING, title=_("Session log id"),
+ description=_("Conversation log id"), default=_('Conversation log id')),
+ 'vote_status': openapi.Schema(type=openapi.TYPE_STRING, title=_("Voting Status"),
+ description=_("Voting Status"), default=_("Voting Status")),
+ 'dataset': openapi.Schema(type=openapi.TYPE_STRING, title=_("Dataset id"), description=_("Dataset id"),
+ default=_("Dataset id")),
+ 'paragraph': openapi.Schema(type=openapi.TYPE_STRING, title=_("Paragraph id"),
+ description=_("Paragraph id"), default=1),
+ 'source_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Resource ID"),
+ description=_("Resource ID"), default=1),
+ 'source_type': openapi.Schema(type=openapi.TYPE_STRING, title=_("Resource Type"),
+ description=_("Resource Type"), default='xxx'),
+ 'message_tokens': openapi.Schema(type=openapi.TYPE_INTEGER, title=_("Number of tokens consumed by the question"),
+ description=_("Number of tokens consumed by the question"), default=0),
+ 'answer_tokens': openapi.Schema(type=openapi.TYPE_INTEGER, title=_("The number of tokens consumed by the answer"),
+ description=_("The number of tokens consumed by the answer"), default=0),
+ 'improve_paragraph_id_list': openapi.Schema(type=openapi.TYPE_STRING, title=_("Improved annotation list"),
+ description=_("Improved annotation list"),
default=[]),
- 'index': openapi.Schema(type=openapi.TYPE_STRING, title="对应会话 对应下标",
- description="对应会话id对应下标",
- default="对应会话id对应下标"
+ 'index': openapi.Schema(type=openapi.TYPE_STRING, title=_("Corresponding session Corresponding subscript"),
+ description=_("Corresponding session id corresponding subscript"),
+ default=0
),
- 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间",
- description="修改时间",
+ 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Modification time"),
+ description=_("Modification time"),
default="1970-01-01 00:00:00"),
- 'create_time': openapi.Schema(type=openapi.TYPE_STRING, title="创建时间",
- description="创建时间",
+ 'create_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Creation time"),
+ description=_("Creation time"),
default="1970-01-01 00:00:00"
)
}
@@ -230,27 +235,27 @@ class ImproveApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id'),
+ description=_('Application ID')),
openapi.Parameter(name='chat_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='会话id'),
+ description=_('Conversation ID')),
openapi.Parameter(name='chat_record_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='会话记录id'),
+ description=_('Conversation record id')),
openapi.Parameter(name='dataset_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='知识库id'),
+ description=_('Knowledge base id')),
openapi.Parameter(name='document_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='文档id'),
+ description=_('Document id')),
]
@staticmethod
@@ -259,10 +264,10 @@ class ImproveApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=['content'],
properties={
- 'title': openapi.Schema(type=openapi.TYPE_STRING, title="段落标题",
- description="段落标题"),
- 'content': openapi.Schema(type=openapi.TYPE_STRING, title="段落内容",
- description="段落内容")
+ 'title': openapi.Schema(type=openapi.TYPE_STRING, title=_("Section title"),
+ description=_("Section title")),
+ 'content': openapi.Schema(type=openapi.TYPE_STRING, title=_("Paragraph content"),
+ description=_("Paragraph content"))
}
)
@@ -273,12 +278,12 @@ class ImproveApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=['dataset_id', 'document_id', 'chat_ids'],
properties={
- 'dataset_id': openapi.Schema(type=openapi.TYPE_STRING, title="知识库id",
- description="知识库id"),
- 'document_id': openapi.Schema(type=openapi.TYPE_STRING, title="文档id",
- description="文档id"),
- 'chat_ids': openapi.Schema(type=openapi.TYPE_ARRAY, title="会话id列表",
- description="会话id列表",
+ 'dataset_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Knowledge base id"),
+ description=_("Knowledge base id")),
+ 'document_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Document id"),
+ description=_("Document id")),
+ 'chat_ids': openapi.Schema(type=openapi.TYPE_ARRAY, title=_("Conversation id list"),
+ description=_("Conversation id list"),
items=openapi.Schema(type=openapi.TYPE_STRING))
}
@@ -290,12 +295,12 @@ class ImproveApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id'),
+ description=_('Application ID')),
openapi.Parameter(name='dataset_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='知识库id'),
+ description=_('Knowledge base id')),
]
@@ -307,17 +312,17 @@ class VoteApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id'),
+ description=_('Application ID')),
openapi.Parameter(name='chat_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='会话id'),
+ description=_('Conversation ID')),
openapi.Parameter(name='chat_record_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='会话记录id')
+ description=_('Conversation record id'))
]
@staticmethod
@@ -326,8 +331,8 @@ class VoteApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=['vote_status'],
properties={
- 'vote_status': openapi.Schema(type=openapi.TYPE_STRING, title="投票状态",
- description="-1:取消投票|0:赞同|1:反对"),
+ 'vote_status': openapi.Schema(type=openapi.TYPE_STRING, title=_("Voting Status"),
+ description=_("-1: Cancel vote | 0: Agree | 1: Oppose")),
}
)
@@ -340,17 +345,17 @@ class ChatRecordImproveApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='应用id'),
+ description=_('Application ID')),
openapi.Parameter(name='chat_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='会话id'),
+ description=_('Conversation ID')),
openapi.Parameter(name='chat_record_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
- description='会话记录id')
+ description=_('Conversation record id'))
]
@staticmethod
@@ -363,27 +368,27 @@ class ChatRecordImproveApi(ApiMixin):
properties={
'id': openapi.Schema(type=openapi.TYPE_STRING, title="id",
description="id", default="xx"),
- 'content': openapi.Schema(type=openapi.TYPE_STRING, title="段落内容",
- description="段落内容", default='段落内容'),
- 'title': openapi.Schema(type=openapi.TYPE_STRING, title="标题",
- description="标题", default="xxx的描述"),
- 'hit_num': openapi.Schema(type=openapi.TYPE_INTEGER, title="命中数量", description="命中数量",
+ 'content': openapi.Schema(type=openapi.TYPE_STRING, title=_("Paragraph content"),
+ description=_("Paragraph content"), default=_('Paragraph content')),
+ 'title': openapi.Schema(type=openapi.TYPE_STRING, title=_("title"),
+ description=_("title"), default=_("Description of xxx")),
+ 'hit_num': openapi.Schema(type=openapi.TYPE_INTEGER, title=_("Number of hits"), description=_("Number of hits"),
default=1),
- 'star_num': openapi.Schema(type=openapi.TYPE_INTEGER, title="点赞数量",
- description="点赞数量", default=1),
- 'trample_num': openapi.Schema(type=openapi.TYPE_INTEGER, title="点踩数量",
- description="点踩数", default=1),
- 'dataset_id': openapi.Schema(type=openapi.TYPE_STRING, title="知识库id",
- description="知识库id", default='xxx'),
- 'document_id': openapi.Schema(type=openapi.TYPE_STRING, title="文档id",
- description="文档id", default='xxx'),
- 'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否可用",
- description="是否可用", default=True),
- 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间",
- description="修改时间",
+ 'star_num': openapi.Schema(type=openapi.TYPE_INTEGER, title=_("Number of Likes"),
+ description=_("Number of Likes"), default=1),
+ 'trample_num': openapi.Schema(type=openapi.TYPE_INTEGER, title=_("Number of thumbs-downs"),
+ description=_("Number of thumbs-downs"), default=1),
+ 'dataset_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Knowledge base id"),
+ description=_("Knowledge base id"), default='xxx'),
+ 'document_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Document id"),
+ description=_("Document id"), default='xxx'),
+ 'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Availability"),
+ description=_("Availability"), default=True),
+ 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Modification time"),
+ description=_("Modification time"),
default="1970-01-01 00:00:00"),
- 'create_time': openapi.Schema(type=openapi.TYPE_STRING, title="创建时间",
- description="创建时间",
+ 'create_time': openapi.Schema(type=openapi.TYPE_STRING, title=_("Creation time"),
+ description=_("Creation time"),
default="1970-01-01 00:00:00"
)
}
diff --git a/apps/application/views/application_version_views.py b/apps/application/views/application_version_views.py
index 105f280b0..f50d7cb04 100644
--- a/apps/application/views/application_version_views.py
+++ b/apps/application/views/application_version_views.py
@@ -17,17 +17,18 @@ from common.auth import has_permissions, TokenAuth
from common.constants.permission_constants import PermissionConstants, CompareConstants, ViewPermission, RoleConstants, \
Permission, Group, Operate
from common.response import result
+from django.utils.translation import gettext_lazy as _
class ApplicationVersionView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取应用列表",
- operation_id="获取应用列表",
+ @swagger_auto_schema(operation_summary=_("Get the application list"),
+ operation_id=_("Get the application list"),
manual_parameters=ApplicationVersionApi.Query.get_request_params_api(),
responses=result.get_api_array_response(ApplicationVersionApi.get_response_body_api()),
- tags=['应用/版本'])
+ tags=[_('Application/Version')])
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
def get(self, request: Request, application_id: str):
return result.success(
@@ -39,12 +40,12 @@ class ApplicationVersionView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="分页获取应用版本列表",
- operation_id="分页获取应用版本列表",
+ @swagger_auto_schema(operation_summary=_("Get the list of application versions by page"),
+ operation_id=_("Get the list of application versions by page"),
manual_parameters=result.get_page_request_params(
ApplicationVersionApi.Query.get_request_params_api()),
responses=result.get_page_api_response(ApplicationVersionApi.get_response_body_api()),
- tags=['应用/版本'])
+ tags=[_('Application/Version')])
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
def get(self, request: Request, application_id: str, current_page: int, page_size: int):
return result.success(
@@ -57,11 +58,11 @@ class ApplicationVersionView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取应用版本详情",
- operation_id="获取应用版本详情",
+ @swagger_auto_schema(operation_summary=_("Get application version details"),
+ operation_id=_("Get application version details"),
manual_parameters=ApplicationVersionApi.Operate.get_request_params_api(),
responses=result.get_api_response(ApplicationVersionApi.get_response_body_api()),
- tags=['应用/版本'])
+ tags=[_('Application/Version')])
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
def get(self, request: Request, application_id: str, work_flow_version_id: str):
return result.success(
@@ -70,12 +71,12 @@ class ApplicationVersionView(APIView):
'application_id': application_id, 'work_flow_version_id': work_flow_version_id}).one())
@action(methods=['PUT'], detail=False)
- @swagger_auto_schema(operation_summary="修改应用版本信息",
- operation_id="修改应用版本信息",
+ @swagger_auto_schema(operation_summary=_("Modify application version information"),
+ operation_id=_("Modify application version information"),
manual_parameters=ApplicationVersionApi.Operate.get_request_params_api(),
request_body=ApplicationVersionApi.Edit.get_request_body_api(),
responses=result.get_api_response(ApplicationVersionApi.get_response_body_api()),
- tags=['应用/版本'])
+ tags=[_('Application/Version')])
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
diff --git a/apps/application/views/application_views.py b/apps/application/views/application_views.py
index 810d8d0a9..19e117e31 100644
--- a/apps/application/views/application_views.py
+++ b/apps/application/views/application_views.py
@@ -9,6 +9,7 @@
from django.core import cache
from django.http import HttpResponse
+from django.utils.translation import gettext_lazy as _
from drf_yasg.utils import swagger_auto_schema
from rest_framework.decorators import action
from rest_framework.parsers import MultiPartParser
@@ -36,9 +37,9 @@ class ApplicationStatistics(APIView):
authentication_classes = [TokenAuth]
@action(methods=["GET"], detail=False)
- @swagger_auto_schema(operation_summary="用户统计",
- operation_id="用户统计",
- tags=["应用/统计"],
+ @swagger_auto_schema(operation_summary=_("User Statistics"),
+ operation_id=_("User Statistics"),
+ tags=[_("Application/Statistics")],
manual_parameters=ApplicationStatisticsApi.get_request_params_api(),
responses=result.get_api_response(
ApplicationStatisticsApi.CustomerCount.get_response_body_api())
@@ -61,9 +62,9 @@ class ApplicationStatistics(APIView):
authentication_classes = [TokenAuth]
@action(methods=["GET"], detail=False)
- @swagger_auto_schema(operation_summary="用户统计趋势",
- operation_id="用户统计趋势",
- tags=["应用/统计"],
+ @swagger_auto_schema(operation_summary=_("User demographic trends"),
+ operation_id=_("User demographic trends"),
+ tags=[_("Application/Statistics")],
manual_parameters=ApplicationStatisticsApi.get_request_params_api(),
responses=result.get_api_array_response(
ApplicationStatisticsApi.CustomerCountTrend.get_response_body_api()))
@@ -85,9 +86,9 @@ class ApplicationStatistics(APIView):
authentication_classes = [TokenAuth]
@action(methods=["GET"], detail=False)
- @swagger_auto_schema(operation_summary="对话相关统计",
- operation_id="对话相关统计",
- tags=["应用/统计"],
+ @swagger_auto_schema(operation_summary=_("Conversation statistics"),
+ operation_id=_("Conversation statistics"),
+ tags=[_("Application/Statistics")],
manual_parameters=ApplicationStatisticsApi.get_request_params_api(),
responses=result.get_api_response(
ApplicationStatisticsApi.ChatRecordAggregate.get_response_body_api())
@@ -110,9 +111,9 @@ class ApplicationStatistics(APIView):
authentication_classes = [TokenAuth]
@action(methods=["GET"], detail=False)
- @swagger_auto_schema(operation_summary="对话相关统计趋势",
- operation_id="对话相关统计趋势",
- tags=["应用/统计"],
+ @swagger_auto_schema(operation_summary=_("Dialogue-related statistical trends"),
+ operation_id=_("Dialogue-related statistical trends"),
+ tags=[_("Application/Statistics")],
manual_parameters=ApplicationStatisticsApi.get_request_params_api(),
responses=result.get_api_array_response(
ApplicationStatisticsApi.ChatRecordAggregate.get_response_body_api())
@@ -140,9 +141,9 @@ class Application(APIView):
parser_classes = [MultiPartParser]
@action(methods=['PUT'], detail=False)
- @swagger_auto_schema(operation_summary="修改应用icon",
- operation_id="修改应用icon",
- tags=['应用'],
+ @swagger_auto_schema(operation_summary=_("Modify application icon"),
+ operation_id=_("Modify application icon"),
+ tags=[_('Application')],
manual_parameters=ApplicationApi.EditApplicationIcon.get_request_params_api(),
request_body=ApplicationApi.Operate.get_request_body_api())
@has_permissions(ViewPermission(
@@ -161,10 +162,10 @@ class Application(APIView):
authentication_classes = [TokenAuth]
parser_classes = [MultiPartParser]
- @action(methods="GET", detail=False)
- @swagger_auto_schema(operation_summary="导入应用", operation_id="导入应用",
+ @action(methods="POST", detail=False)
+ @swagger_auto_schema(operation_summary=_("Import Application"), operation_id=_("Import Application"),
manual_parameters=ApplicationApi.Import.get_request_params_api(),
- tags=["应用"]
+ tags=[_("Application")]
)
@has_permissions(RoleConstants.ADMIN, RoleConstants.USER)
def post(self, request: Request):
@@ -175,9 +176,9 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@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(),
- tags=["应用"]
+ tags=[_("Application")]
)
@has_permissions(lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
dynamic_tag=keywords.get('application_id')))
@@ -187,9 +188,9 @@ class Application(APIView):
class Embed(APIView):
@action(methods=["GET"], detail=False)
- @swagger_auto_schema(operation_summary="获取嵌入js",
- operation_id="获取嵌入js",
- tags=["应用"],
+ @swagger_auto_schema(operation_summary=_("Get embedded js"),
+ operation_id=_("Get embedded js"),
+ tags=[_("Application")],
manual_parameters=ApplicationApi.ApiKey.get_request_params_api())
def get(self, request: Request):
return ApplicationSerializer.Embed(
@@ -200,9 +201,9 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@action(methods=["GET"], detail=False)
- @swagger_auto_schema(operation_summary="获取模型列表",
- operation_id="获取模型列表",
- tags=["应用"],
+ @swagger_auto_schema(operation_summary=_("Get a list of models"),
+ operation_id=_("Get a list of models"),
+ tags=[_("Application")],
manual_parameters=ApplicationApi.Model.get_request_params_api())
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
@@ -219,9 +220,9 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取模型参数表单",
- operation_id="获取模型参数表单",
- tags=["模型"])
+ @swagger_auto_schema(operation_summary=_("Get model parameter form"),
+ operation_id=_("Get model parameter form"),
+ tags=[_("Application")])
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
@@ -237,9 +238,9 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@action(methods=["GET"], detail=False)
- @swagger_auto_schema(operation_summary="获取函数库列表",
- operation_id="获取函数库列表",
- tags=["应用"])
+ @swagger_auto_schema(operation_summary=_("Get a list of function libraries"),
+ operation_id=_("Get a list of function libraries"),
+ tags=[_("Application")])
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
@@ -255,9 +256,9 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@action(methods=["GET"], detail=False)
- @swagger_auto_schema(operation_summary="获取函数库列表",
- operation_id="获取函数库列表",
- tags=["应用"],
+ @swagger_auto_schema(operation_summary=_("Get library details"),
+ operation_id=_("Get library details"),
+ tags=[_("Application")],
)
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
@@ -274,9 +275,9 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取当前人创建的应用列表",
- operation_id="获取当前人创建的应用列表",
- tags=["应用/会话"])
+ @swagger_auto_schema(operation_summary=_("Get the list of apps created by the current user"),
+ operation_id=_("Get the list of apps created by the current user"),
+ tags=[_("Application/Chat")])
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
@@ -292,9 +293,9 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@action(methods=["GET"], detail=False)
- @swagger_auto_schema(operation_summary="获取应用数据",
- operation_id="获取应用数据",
- tags=["应用"],
+ @swagger_auto_schema(operation_summary=_("Get application data"),
+ operation_id=_("Get application data"),
+ tags=[_("Application")],
)
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
@@ -311,9 +312,9 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取应用相关信息",
- operation_id="获取应用相关信息",
- tags=["应用/会话"])
+ @swagger_auto_schema(operation_summary=_("Get application related information"),
+ operation_id=_("Get application related information"),
+ tags=[_("Application/Chat")])
def get(self, request: Request):
if 'application_id' in request.auth.keywords:
return result.success(ApplicationSerializer.Operate(
@@ -325,9 +326,9 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@action(methods=['POST'], detail=False)
- @swagger_auto_schema(operation_summary="新增ApiKey",
- operation_id="新增ApiKey",
- tags=['应用/API_KEY'],
+ @swagger_auto_schema(operation_summary=_("Add ApiKey"),
+ operation_id=_("Add ApiKey"),
+ tags=[_('Application/API_KEY')],
manual_parameters=ApplicationApi.ApiKey.get_request_params_api())
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
@@ -340,9 +341,9 @@ class Application(APIView):
data={'application_id': application_id, 'user_id': request.user.id}).generate())
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取应用API_KEY列表",
- operation_id="获取应用API_KEY列表",
- tags=['应用/API_KEY'],
+ @swagger_auto_schema(operation_summary=_("Get the application API_KEY list"),
+ operation_id=_("Get the application API_KEY list"),
+ tags=[_('Application/API_KEY')],
manual_parameters=ApplicationApi.ApiKey.get_request_params_api()
)
@has_permissions(ViewPermission(
@@ -358,9 +359,9 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@action(methods=['PUT'], detail=False)
- @swagger_auto_schema(operation_summary="修改应用API_KEY",
- operation_id="修改应用API_KEY",
- tags=['应用/API_KEY'],
+ @swagger_auto_schema(operation_summary=_("Modify application API_KEY"),
+ operation_id=_("Modify application API_KEY"),
+ tags=[_('Application/API_KEY')],
manual_parameters=ApplicationApi.ApiKey.Operate.get_request_params_api(),
request_body=ApplicationApi.ApiKey.Operate.get_request_body_api())
@has_permissions(ViewPermission(
@@ -376,9 +377,9 @@ class Application(APIView):
'api_key_id': api_key_id}).edit(request.data))
@action(methods=['DELETE'], detail=False)
- @swagger_auto_schema(operation_summary="删除应用API_KEY",
- operation_id="删除应用API_KEY",
- tags=['应用/API_KEY'],
+ @swagger_auto_schema(operation_summary=_("Delete Application API_KEY"),
+ operation_id=_("Delete Application API_KEY"),
+ tags=[_('Application/API_KEY')],
manual_parameters=ApplicationApi.ApiKey.Operate.get_request_params_api())
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
@@ -396,9 +397,9 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@action(methods=['PUT'], detail=False)
- @swagger_auto_schema(operation_summary="修改 应用AccessToken",
- operation_id="修改 应用AccessToken",
- tags=['应用/公开访问'],
+ @swagger_auto_schema(operation_summary=_("Modify Application AccessToken"),
+ operation_id=_("Modify Application AccessToken"),
+ tags=[_('Application/Public Access')],
manual_parameters=ApplicationApi.AccessToken.get_request_params_api(),
request_body=ApplicationApi.AccessToken.get_request_body_api())
@has_permissions(ViewPermission(
@@ -412,10 +413,10 @@ class Application(APIView):
request.data))
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取应用 AccessToken信息",
- operation_id="获取应用 AccessToken信息",
+ @swagger_auto_schema(operation_summary=_("Get the application AccessToken information"),
+ operation_id=_("Get the application AccessToken information"),
manual_parameters=ApplicationApi.AccessToken.get_request_params_api(),
- tags=['应用/公开访问'],
+ tags=[_('Application/Public Access')],
)
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
@@ -435,10 +436,10 @@ class Application(APIView):
"Access-Control-Allow-Headers": "Origin,Content-Type,Cookie,Accept,Token"}, )
@action(methods=['POST'], detail=False)
- @swagger_auto_schema(operation_summary="应用认证",
- operation_id="应用认证",
+ @swagger_auto_schema(operation_summary=_("Application Certification"),
+ operation_id=_("Application Certification"),
request_body=ApplicationApi.Authentication.get_request_body_api(),
- tags=["应用/认证"],
+ tags=[_("Application/Certification")],
security=[])
def post(self, request: Request):
return result.success(
@@ -452,20 +453,20 @@ class Application(APIView):
)
@action(methods=['POST'], detail=False)
- @swagger_auto_schema(operation_summary="创建应用",
- operation_id="创建应用",
+ @swagger_auto_schema(operation_summary=_("Create an application"),
+ operation_id=_("Create an application"),
request_body=ApplicationApi.Create.get_request_body_api(),
- tags=['应用'])
+ tags=[_('Application')])
@has_permissions(PermissionConstants.APPLICATION_CREATE, compare=CompareConstants.AND)
def post(self, request: Request):
return result.success(ApplicationSerializer.Create(data={'user_id': request.user.id}).insert(request.data))
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取应用列表",
- operation_id="获取应用列表",
+ @swagger_auto_schema(operation_summary=_("Get the application list"),
+ operation_id=_("Get the application list"),
manual_parameters=ApplicationApi.Query.get_request_params_api(),
responses=result.get_api_array_response(ApplicationApi.get_response_body_api()),
- tags=['应用'])
+ tags=[_('Application')])
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
def get(self, request: Request):
return result.success(
@@ -476,10 +477,10 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@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(),
responses=result.get_api_array_response(CommonApi.HitTestApi.get_response_body_api()),
- tags=["应用"])
+ tags=[_("Application")])
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_ACCESS_TOKEN,
RoleConstants.APPLICATION_KEY],
@@ -500,12 +501,12 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@action(methods=['PUT'], detail=False)
- @swagger_auto_schema(operation_summary="发布应用",
- operation_id="发布应用",
+ @swagger_auto_schema(operation_summary=_("Publishing an application"),
+ operation_id=_("Publishing an application"),
manual_parameters=ApplicationApi.Operate.get_request_params_api(),
request_body=ApplicationApi.Publish.get_request_body_api(),
responses=result.get_default_response(),
- tags=['应用'])
+ tags=[_('Application')])
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
@@ -520,11 +521,11 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@action(methods=['DELETE'], detail=False)
- @swagger_auto_schema(operation_summary="删除应用",
- operation_id="删除应用",
+ @swagger_auto_schema(operation_summary=_("Deleting application"),
+ operation_id=_("Deleting application"),
manual_parameters=ApplicationApi.Operate.get_request_params_api(),
responses=result.get_default_response(),
- tags=['应用'])
+ tags=[_('Application')])
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
@@ -538,12 +539,12 @@ class Application(APIView):
with_valid=True))
@action(methods=['PUT'], detail=False)
- @swagger_auto_schema(operation_summary="修改应用",
- operation_id="修改应用",
+ @swagger_auto_schema(operation_summary=_("Modify the application"),
+ operation_id=_("Modify the application"),
manual_parameters=ApplicationApi.Operate.get_request_params_api(),
request_body=ApplicationApi.Edit.get_request_body_api(),
responses=result.get_api_array_response(ApplicationApi.get_response_body_api()),
- tags=['应用'])
+ tags=[_('Application')])
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
@@ -556,11 +557,11 @@ class Application(APIView):
request.data))
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取应用详情",
- operation_id="获取应用详情",
+ @swagger_auto_schema(operation_summary=_("Get application details"),
+ operation_id=_("Get application details"),
manual_parameters=ApplicationApi.Operate.get_request_params_api(),
responses=result.get_api_array_response(ApplicationApi.get_response_body_api()),
- tags=['应用'])
+ tags=[_('Application')])
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_ACCESS_TOKEN,
RoleConstants.APPLICATION_KEY],
@@ -575,12 +576,12 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取当前应用可使用的知识库",
- operation_id="获取当前应用可使用的知识库",
+ @swagger_auto_schema(operation_summary=_("Get the knowledge base available to the current application"),
+ operation_id=_("Get the knowledge base available to the current application"),
manual_parameters=ApplicationApi.Operate.get_request_params_api(),
responses=result.get_api_array_response(
DataSetSerializers.Query.get_response_body_api()),
- tags=['应用'])
+ tags=[_('Application')])
@has_permissions(ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
[lambda r, keywords: Permission(group=Group.APPLICATION,
operate=Operate.USE,
@@ -595,12 +596,12 @@ class Application(APIView):
authentication_classes = [TokenAuth]
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="分页获取应用列表",
- operation_id="分页获取应用列表",
+ @swagger_auto_schema(operation_summary=_("Get the application list by page"),
+ operation_id=_("Get the application list by page"),
manual_parameters=result.get_page_request_params(
ApplicationApi.Query.get_request_params_api()),
responses=result.get_page_api_response(ApplicationApi.get_response_body_api()),
- tags=['应用'])
+ tags=[_('Application')])
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
def get(self, request: Request, current_page: int, page_size: int):
return result.success(
diff --git a/apps/application/views/chat_views.py b/apps/application/views/chat_views.py
index 54d8cf532..b87309bb2 100644
--- a/apps/application/views/chat_views.py
+++ b/apps/application/views/chat_views.py
@@ -7,6 +7,7 @@
@desc:
"""
+from django.utils.translation import gettext_lazy as _
from drf_yasg.utils import swagger_auto_schema
from rest_framework.decorators import action
from rest_framework.request import Request
@@ -29,10 +30,10 @@ class Openai(APIView):
authentication_classes = [OpenAIKeyAuth]
@action(methods=['POST'], detail=False)
- @swagger_auto_schema(operation_summary="openai接口对话",
- operation_id="openai接口对话",
+ @swagger_auto_schema(operation_summary=_("OpenAI Interface Dialogue"),
+ operation_id=_("OpenAI Interface Dialogue"),
request_body=OpenAIChatApi.get_request_body_api(),
- tags=["openai对话"])
+ tags=[_("OpenAI Dialogue")])
def post(self, request: Request, application_id: str):
return OpenAIChatSerializer(data={'application_id': application_id, 'client_id': request.auth.client_id,
'client_type': request.auth.client_type}).chat(request.data)
@@ -45,10 +46,10 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['POST'], detail=False)
- @swagger_auto_schema(operation_summary="导出对话",
- operation_id="导出对话",
+ @swagger_auto_schema(operation_summary=_("Export conversation"),
+ operation_id=_("Export conversation"),
manual_parameters=ChatApi.get_request_params_api(),
- tags=["应用/对话日志"]
+ tags=[_("Application/Conversation Log")]
)
@has_permissions(
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
@@ -64,10 +65,10 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取会话id,根据应用id",
- operation_id="获取会话id,根据应用id",
+ @swagger_auto_schema(operation_summary=_("Get the session id according to the application id"),
+ operation_id=_("Get the session id according to the application id"),
manual_parameters=ChatApi.OpenChat.get_request_params_api(),
- tags=["应用/会话"])
+ tags=[_("Application/Chat")])
@has_permissions(
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_ACCESS_TOKEN,
RoleConstants.APPLICATION_KEY],
@@ -83,10 +84,10 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['POST'], detail=False)
- @swagger_auto_schema(operation_summary="获取工作流临时会话id",
- operation_id="获取工作流临时会话id",
+ @swagger_auto_schema(operation_summary=_("Get the workflow temporary session id"),
+ operation_id=_("Get the workflow temporary session id"),
request_body=ChatApi.OpenWorkFlowTemp.get_request_body_api(),
- tags=["应用/会话"])
+ tags=[_("Application/Chat")])
def post(self, request: Request):
return result.success(ChatSerializers.OpenWorkFlowChat(
data={**request.data, 'user_id': request.user.id}).open())
@@ -95,10 +96,10 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['POST'], detail=False)
- @swagger_auto_schema(operation_summary="获取会话id(根据模型id,知识库列表,是否多轮会话)",
- operation_id="获取会话id",
+ @swagger_auto_schema(operation_summary=_("Get a temporary session id"),
+ operation_id=_("Get a temporary session id"),
request_body=ChatApi.OpenTempChat.get_request_body_api(),
- tags=["应用/会话"])
+ tags=[_("Application/Chat")])
@has_permissions(RoleConstants.ADMIN, RoleConstants.USER)
def post(self, request: Request):
return result.success(ChatSerializers.OpenTempChat(
@@ -108,10 +109,10 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['POST'], detail=False)
- @swagger_auto_schema(operation_summary="对话",
- operation_id="对话",
+ @swagger_auto_schema(operation_summary=_("dialogue"),
+ operation_id=_("dialogue"),
request_body=ChatApi.get_request_body_api(),
- tags=["应用/会话"])
+ tags=[_("Application/Chat")])
@has_permissions(
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY,
RoleConstants.APPLICATION_ACCESS_TOKEN],
@@ -145,11 +146,11 @@ class ChatView(APIView):
).chat()
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取对话列表",
- operation_id="获取对话列表",
+ @swagger_auto_schema(operation_summary=_("Get the conversation list"),
+ operation_id=_("Get the conversation list"),
manual_parameters=ChatApi.get_request_params_api(),
responses=result.get_api_array_response(ChatApi.get_response_body_api()),
- tags=["应用/对话日志"]
+ tags=[_("Application/Conversation Log")]
)
@has_permissions(
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
@@ -165,9 +166,9 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['DELETE'], detail=False)
- @swagger_auto_schema(operation_summary="删除对话",
- operation_id="删除对话",
- tags=["应用/对话日志"])
+ @swagger_auto_schema(operation_summary=_("Delete a conversation"),
+ operation_id=_("Delete a conversation"),
+ tags=[_("Application/Conversation Log")])
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
@@ -184,12 +185,12 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="分页获取客户端对话列表",
- operation_id="分页获取客户端对话列表",
+ @swagger_auto_schema(operation_summary=_("Get client conversation list by paging"),
+ operation_id=_("Get client conversation list by paging"),
manual_parameters=result.get_page_request_params(
ChatClientHistoryApi.get_request_params_api()),
responses=result.get_page_api_response(ChatApi.get_response_body_api()),
- tags=["应用/对话日志"]
+ tags=[_("Application/Conversation Log")]
)
@has_permissions(
ViewPermission([RoleConstants.APPLICATION_ACCESS_TOKEN],
@@ -206,9 +207,9 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['DELETE'], detail=False)
- @swagger_auto_schema(operation_summary="客户端删除对话",
- operation_id="客户端删除对话",
- tags=["应用/对话日志"])
+ @swagger_auto_schema(operation_summary=_("Client deletes conversation"),
+ operation_id=_("Client deletes conversation"),
+ tags=[_("Application/Conversation Log")])
@has_permissions(ViewPermission(
[RoleConstants.APPLICATION_ACCESS_TOKEN],
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
@@ -225,11 +226,11 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="分页获取对话列表",
- operation_id="分页获取对话列表",
+ @swagger_auto_schema(operation_summary=_("Get the conversation list by page"),
+ operation_id=_("Get the conversation list by page"),
manual_parameters=result.get_page_request_params(ChatApi.get_request_params_api()),
responses=result.get_page_api_response(ChatApi.get_response_body_api()),
- tags=["应用/对话日志"]
+ tags=[_("Application/Conversation Log")]
)
@has_permissions(
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
@@ -249,11 +250,11 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取对话记录详情",
- operation_id="获取对话记录详情",
+ @swagger_auto_schema(operation_summary=_("Get conversation record details"),
+ operation_id=_("Get conversation record details"),
manual_parameters=ChatRecordApi.get_request_params_api(),
responses=result.get_api_array_response(ChatRecordApi.get_response_body_api()),
- tags=["应用/对话日志"]
+ tags=[_("Application/Conversation Log")]
)
@has_permissions(
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))
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取对话记录列表",
- operation_id="获取对话记录列表",
+ @swagger_auto_schema(operation_summary=_("Get a list of conversation records"),
+ operation_id=_("Get a list of conversation records"),
manual_parameters=ChatRecordApi.get_request_params_api(),
responses=result.get_api_array_response(ChatRecordApi.get_response_body_api()),
- tags=["应用/对话日志"]
+ tags=[_("Application/Conversation Log")]
)
@has_permissions(
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
@@ -288,12 +289,12 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取对话记录列表",
- operation_id="获取对话记录列表",
+ @swagger_auto_schema(operation_summary=_("Get the conversation history list by page"),
+ operation_id=_("Get the conversation history list by page"),
manual_parameters=result.get_page_request_params(
ChatRecordApi.get_request_params_api()),
responses=result.get_page_api_response(ChatRecordApi.get_response_body_api()),
- tags=["应用/对话日志"]
+ tags=[_("Application/Conversation Log")]
)
@has_permissions(
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY],
@@ -310,12 +311,12 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['PUT'], detail=False)
- @swagger_auto_schema(operation_summary="点赞,点踩",
- operation_id="点赞,点踩",
+ @swagger_auto_schema(operation_summary=_("Like, Dislike"),
+ operation_id=_("Like, Dislike"),
manual_parameters=VoteApi.get_request_params_api(),
request_body=VoteApi.get_request_body_api(),
responses=result.get_default_response(),
- tags=["应用/会话"]
+ tags=[_("Application/Chat")]
)
@has_permissions(
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY,
@@ -332,11 +333,11 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['GET'], detail=False)
- @swagger_auto_schema(operation_summary="获取标注段落列表信息",
- operation_id="获取标注段落列表信息",
+ @swagger_auto_schema(operation_summary=_("Get the list of marked paragraphs"),
+ operation_id=_("Get the list of marked paragraphs"),
manual_parameters=ChatRecordImproveApi.get_request_params_api(),
responses=result.get_api_response(ChatRecordImproveApi.get_response_body_api()),
- tags=["应用/对话日志/标注"]
+ tags=[_("Application/Conversation Log/Annotation")]
)
@has_permissions(
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
@@ -351,12 +352,12 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['PUT'], detail=False)
- @swagger_auto_schema(operation_summary="标注",
- operation_id="标注",
+ @swagger_auto_schema(operation_summary=_("Annotation"),
+ operation_id=_("Annotation"),
manual_parameters=ImproveApi.get_request_params_api(),
request_body=ImproveApi.get_request_body_api(),
responses=result.get_api_response(ChatRecordApi.get_response_body_api()),
- tags=["应用/对话日志/标注"]
+ tags=[_("Application/Conversation Log/Annotation")]
)
@has_permissions(
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
@@ -377,11 +378,11 @@ class ChatView(APIView):
'dataset_id': dataset_id, 'document_id': document_id}).improve(request.data))
@action(methods=['POST'], detail=False)
- @swagger_auto_schema(operation_summary="添加至知识库",
- operation_id="添加至知识库",
+ @swagger_auto_schema(operation_summary=_("Add to Knowledge Base"),
+ operation_id=_("Add to Knowledge Base"),
manual_parameters=ImproveApi.get_request_params_api_post(),
request_body=ImproveApi.get_request_body_api_post(),
- tags=["应用/对话日志/添加至知识库"]
+ tags=[_("Application/Conversation Log/Add to Knowledge Base")]
)
@has_permissions(
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
@@ -402,11 +403,11 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['DELETE'], detail=False)
- @swagger_auto_schema(operation_summary="标注",
- operation_id="标注",
+ @swagger_auto_schema(operation_summary=_("Delete a Annotation"),
+ operation_id=_("Delete a Annotation"),
manual_parameters=ImproveApi.get_request_params_api(),
responses=result.get_api_response(ChatRecordApi.get_response_body_api()),
- tags=["应用/对话日志/标注"]
+ tags=[_("Application/Conversation Log/Annotation")]
)
@has_permissions(
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER],
@@ -432,10 +433,10 @@ class ChatView(APIView):
authentication_classes = [TokenAuth]
@action(methods=['POST'], detail=False)
- @swagger_auto_schema(operation_summary="上传文件",
- operation_id="上传文件",
+ @swagger_auto_schema(operation_summary=_("Upload files"),
+ operation_id=_("Upload files"),
manual_parameters=ChatRecordApi.get_request_params_api(),
- tags=["应用/对话日志"]
+ tags=[_("Application/Conversation Log")]
)
@has_permissions(
ViewPermission([RoleConstants.ADMIN, RoleConstants.USER, RoleConstants.APPLICATION_KEY,