diff --git a/apps/dataset/serializers/common_serializers.py b/apps/dataset/serializers/common_serializers.py index f908ca6bf..679a7db96 100644 --- a/apps/dataset/serializers/common_serializers.py +++ b/apps/dataset/serializers/common_serializers.py @@ -27,6 +27,7 @@ from common.util.fork import Fork from dataset.models import Paragraph, Problem, ProblemParagraphMapping, DataSet, File, Image from setting.models_provider import get_model from smartdoc.conf import PROJECT_DIR +from django.utils.translation import gettext_lazy as _ def zip_dir(zip_path, output=None): @@ -83,16 +84,16 @@ def list_paragraph(paragraph_list: List[str]): class MetaSerializer(serializers.Serializer): class WebMeta(serializers.Serializer): - source_url = serializers.CharField(required=True, error_messages=ErrMessage.char("文档地址")) + source_url = serializers.CharField(required=True, error_messages=ErrMessage.char(_('source url'))) selector = serializers.CharField(required=False, allow_null=True, allow_blank=True, - error_messages=ErrMessage.char("选择器")) + error_messages=ErrMessage.char(_('selector'))) def is_valid(self, *, raise_exception=False): super().is_valid(raise_exception=True) source_url = self.data.get('source_url') response = Fork(source_url, []).fork() if response.status == 500: - raise AppApiException(500, f"url错误,无法解析【{source_url}】") + raise AppApiException(500, _('URL error, cannot parse [{source_url}]').format(source_url=source_url)) class BaseMeta(serializers.Serializer): def is_valid(self, *, raise_exception=False): @@ -101,7 +102,7 @@ class MetaSerializer(serializers.Serializer): class BatchSerializer(ApiMixin, serializers.Serializer): id_list = serializers.ListField(required=True, child=serializers.UUIDField(required=True), - error_messages=ErrMessage.char("id列表")) + error_messages=ErrMessage.char(_('id list'))) def is_valid(self, *, model=None, raise_exception=False): super().is_valid(raise_exception=True) @@ -111,7 +112,8 @@ class BatchSerializer(ApiMixin, serializers.Serializer): if len(model_list) != len(id_list): model_id_list = [str(m.id) for m in model_list] error_id_list = list(filter(lambda row_id: not model_id_list.__contains__(row_id), id_list)) - raise AppApiException(500, f"id不正确:{error_id_list}") + raise AppApiException(500, _('The following id does not exist: {error_id_list}').format( + error_id_list=error_id_list)) @staticmethod def get_request_body_api(): @@ -119,8 +121,8 @@ class BatchSerializer(ApiMixin, serializers.Serializer): type=openapi.TYPE_OBJECT, properties={ 'id_list': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_STRING), - title="主键id列表", - description="主键id列表") + title=_('id list'), + description=_('id list')) } ) @@ -178,9 +180,9 @@ class ProblemParagraphManage: def get_embedding_model_by_dataset_id_list(dataset_id_list: 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 knowledge base is inconsistent with the vector model')) if len(dataset_list) == 0: - raise Exception("知识库设置错误,请重新设置知识库") + raise Exception(_('Knowledge base setting error, please reset the knowledge base')) return ModelManage.get_model(str(dataset_list[0].embedding_mode_id), lambda _id: get_model(dataset_list[0].embedding_mode)) @@ -202,7 +204,7 @@ def get_embedding_model_id_by_dataset_id(dataset_id): def get_embedding_model_id_by_dataset_id_list(dataset_id_list: 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 knowledge base is inconsistent with the vector model')) if len(dataset_list) == 0: - raise Exception("知识库设置错误,请重新设置知识库") + raise Exception(_('Knowledge base setting error, please reset the knowledge base')) return str(dataset_list[0].embedding_mode_id) diff --git a/apps/dataset/serializers/dataset_serializers.py b/apps/dataset/serializers/dataset_serializers.py index adb6d3d4f..fcf126e7c 100644 --- a/apps/dataset/serializers/dataset_serializers.py +++ b/apps/dataset/serializers/dataset_serializers.py @@ -49,6 +49,7 @@ from embedding.models import SearchMode from embedding.task import embedding_by_dataset, delete_embedding_by_dataset from setting.models import AuthOperate from smartdoc.conf import PROJECT_DIR +from django.utils.translation import gettext_lazy as _ """ # __exact 精确等于 like ‘aaa’ @@ -78,9 +79,9 @@ class DataSetSerializers(serializers.ModelSerializer): fields = ['id', 'name', 'desc', 'meta', 'create_time', 'update_time'] class Application(ApiMixin, serializers.Serializer): - user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char("用户id")) + user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char(_('user id'))) - dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char("数据集id")) + dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char(_('dataset id'))) @staticmethod def get_request_params_api(): @@ -89,7 +90,7 @@ class DataSetSerializers(serializers.ModelSerializer): in_=openapi.IN_PATH, type=openapi.TYPE_STRING, required=True, - description='知识库id') + description=_('dataset id')), ] @staticmethod @@ -100,22 +101,31 @@ class DataSetSerializers(serializers.ModelSerializer): '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"), - "multiple_rounds_dialogue": openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否开启多轮对话", - description="是否开启多轮对话"), - 'prologue': openapi.Schema(type=openapi.TYPE_STRING, title="开场白", description="开场白"), + 'id': openapi.Schema(type=openapi.TYPE_STRING, title="", description=_('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')), + "multiple_rounds_dialogue": openapi.Schema(type=openapi.TYPE_BOOLEAN, + title=_('Whether to start multiple rounds of dialogue'), + description=_( + 'Whether to start multiple rounds of dialogue')), + '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'), description=_('example')), + 'user_id': openapi.Schema(type=openapi.TYPE_STRING, title=_('User id'), description=_('User id')), - 'status': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否发布", description='是否发布'), + 'status': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_('Whether to publish'), + description=_('Whether to publish')), - 'create_time': openapi.Schema(type=openapi.TYPE_STRING, title="创建时间", description='创建时间'), + 'create_time': openapi.Schema(type=openapi.TYPE_STRING, title=_('create time'), + description=_('create time')), - 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间", description='修改时间') + 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title=_('update time'), + description=_('update time')) } ) @@ -124,12 +134,12 @@ class DataSetSerializers(serializers.ModelSerializer): 查询对象 """ name = serializers.CharField(required=False, - error_messages=ErrMessage.char("知识库名称"), + error_messages=ErrMessage.char(_('dataset name')), max_length=64, min_length=1) desc = serializers.CharField(required=False, - error_messages=ErrMessage.char("知识库描述"), + error_messages=ErrMessage.char(_('dataset description')), max_length=256, min_length=1, ) @@ -162,7 +172,7 @@ class DataSetSerializers(serializers.ModelSerializer): 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="权限操作列表", + 'team_member_permission.operate': ArrayField(verbose_name=_('permission'), base_field=models.CharField(max_length=256, blank=True, choices=AuthOperate.choices, @@ -188,12 +198,12 @@ class DataSetSerializers(serializers.ModelSerializer): in_=openapi.IN_QUERY, type=openapi.TYPE_STRING, required=False, - description='知识库名称'), + description=_('dataset name')), openapi.Parameter(name='desc', in_=openapi.IN_QUERY, type=openapi.TYPE_STRING, required=False, - description='知识库描述') + description=_('dataset description')) ] @staticmethod @@ -201,23 +211,24 @@ class DataSetSerializers(serializers.ModelSerializer): return DataSetSerializers.Operate.get_response_body_api() class Create(ApiMixin, serializers.Serializer): - user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char("用户id"), ) + user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char(_('user id')), ) class CreateBaseSerializers(ApiMixin, serializers.Serializer): """ 创建通用数据集序列化对象 """ name = serializers.CharField(required=True, - error_messages=ErrMessage.char("知识库名称"), + error_messages=ErrMessage.char(_('dataset name')), max_length=64, min_length=1) desc = serializers.CharField(required=True, - error_messages=ErrMessage.char("知识库描述"), + error_messages=ErrMessage.char(_('dataset description')), max_length=256, min_length=1) - embedding_mode_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("向量模型")) + embedding_mode_id = serializers.UUIDField(required=True, + error_messages=ErrMessage.uuid(_('embedding mode'))) documents = DocumentInstanceSerializer(required=False, many=True) @@ -230,21 +241,23 @@ class DataSetSerializers(serializers.ModelSerializer): 创建web站点序列化对象 """ name = serializers.CharField(required=True, - error_messages=ErrMessage.char("知识库名称"), + error_messages=ErrMessage.char(_('dataset name')), max_length=64, min_length=1) desc = serializers.CharField(required=True, - error_messages=ErrMessage.char("知识库描述"), + error_messages=ErrMessage.char(_('dataset description')), max_length=256, min_length=1) - embedding_mode_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("向量模型")) + embedding_mode_id = serializers.UUIDField(required=True, + error_messages=ErrMessage.uuid(_('embedding mode'))) file_list = serializers.ListSerializer(required=True, - error_messages=ErrMessage.list("文件列表"), + error_messages=ErrMessage.list(_('file list')), child=serializers.FileField(required=True, - error_messages=ErrMessage.file("文件"))) + error_messages=ErrMessage.file( + _('file list')))) @staticmethod def get_request_params_api(): @@ -253,15 +266,17 @@ class DataSetSerializers(serializers.ModelSerializer): type=openapi.TYPE_ARRAY, items=openapi.Items(type=openapi.TYPE_FILE), required=True, - description='上传文件'), + description=_('upload files ')), openapi.Parameter(name='name', in_=openapi.IN_FORM, required=True, - type=openapi.TYPE_STRING, title="知识库名称", description="知识库名称"), + type=openapi.TYPE_STRING, title=_('dataset name'), + description=_('dataset name')), openapi.Parameter(name='desc', in_=openapi.IN_FORM, required=True, - type=openapi.TYPE_STRING, title="知识库描述", description="知识库描述"), + type=openapi.TYPE_STRING, title=_('dataset description'), + description=_('dataset description')), ] @staticmethod @@ -273,25 +288,25 @@ class DataSetSerializers(serializers.ModelSerializer): properties={ 'id': openapi.Schema(type=openapi.TYPE_STRING, title="id", description="id", default="xx"), - 'name': openapi.Schema(type=openapi.TYPE_STRING, title="名称", - description="名称", default="测试知识库"), - 'desc': openapi.Schema(type=openapi.TYPE_STRING, title="描述", - description="描述", default="测试知识库描述"), - 'user_id': openapi.Schema(type=openapi.TYPE_STRING, title="所属用户id", - description="所属用户id", default="user_xxxx"), - 'char_length': openapi.Schema(type=openapi.TYPE_STRING, title="字符数", - description="字符数", default=10), - 'document_count': openapi.Schema(type=openapi.TYPE_STRING, title="文档数量", - description="文档数量", default=1), - 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间", - description="修改时间", + 'name': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset name'), + description=_('dataset name'), default=_('dataset name')), + 'desc': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset description'), + description=_('dataset description'), default=_('dataset description')), + 'user_id': openapi.Schema(type=openapi.TYPE_STRING, title=_('user id'), + description=_('user id'), default="user_xxxx"), + 'char_length': openapi.Schema(type=openapi.TYPE_STRING, title=_('char length'), + description=_('char length'), default=10), + 'document_count': openapi.Schema(type=openapi.TYPE_STRING, title=_('document count'), + description=_('document count'), default=1), + 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title=_('update time'), + description=_('update 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=_('create time'), + description=_('create time'), default="1970-01-01 00:00:00" ), - 'document_list': openapi.Schema(type=openapi.TYPE_ARRAY, title="文档列表", - description="文档列表", + 'document_list': openapi.Schema(type=openapi.TYPE_ARRAY, title=_('document list'), + description=_('document list'), items=DocumentSerializers.Operate.get_response_body_api()) } ) @@ -301,27 +316,29 @@ class DataSetSerializers(serializers.ModelSerializer): 创建web站点序列化对象 """ name = serializers.CharField(required=True, - error_messages=ErrMessage.char("知识库名称"), + error_messages=ErrMessage.char(_('dataset name')), max_length=64, min_length=1) desc = serializers.CharField(required=True, - error_messages=ErrMessage.char("知识库描述"), + error_messages=ErrMessage.char(_('dataset description')), max_length=256, min_length=1) - source_url = serializers.CharField(required=True, error_messages=ErrMessage.char("Web 根地址"), ) + source_url = serializers.CharField(required=True, error_messages=ErrMessage.char(_('web source url')), ) - embedding_mode_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("向量模型")) + embedding_mode_id = serializers.UUIDField(required=True, + error_messages=ErrMessage.uuid(_('embedding mode'))) selector = serializers.CharField(required=False, allow_null=True, allow_blank=True, - error_messages=ErrMessage.char("选择器")) + error_messages=ErrMessage.char(_('selector'))) def is_valid(self, *, raise_exception=False): super().is_valid(raise_exception=True) source_url = self.data.get('source_url') response = Fork(source_url, []).fork() if response.status == 500: - raise AppApiException(500, f"url错误,无法解析【{source_url}】") + raise AppApiException(500, + _('URL error, cannot parse [{source_url}]').format(source_url=source_url)) return True @staticmethod @@ -333,25 +350,25 @@ class DataSetSerializers(serializers.ModelSerializer): properties={ 'id': openapi.Schema(type=openapi.TYPE_STRING, title="id", description="id", default="xx"), - 'name': openapi.Schema(type=openapi.TYPE_STRING, title="名称", - description="名称", default="测试知识库"), - 'desc': openapi.Schema(type=openapi.TYPE_STRING, title="描述", - description="描述", default="测试知识库描述"), - 'user_id': openapi.Schema(type=openapi.TYPE_STRING, title="所属用户id", - description="所属用户id", default="user_xxxx"), - 'char_length': openapi.Schema(type=openapi.TYPE_STRING, title="字符数", - description="字符数", default=10), - 'document_count': openapi.Schema(type=openapi.TYPE_STRING, title="文档数量", - description="文档数量", default=1), - 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间", - description="修改时间", + 'name': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset name'), + description=_('dataset name'), default=_('dataset name')), + 'desc': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset description'), + description=_('dataset description'), default=_('dataset description')), + 'user_id': openapi.Schema(type=openapi.TYPE_STRING, title=_('user id'), + description=_('user id'), default="user_xxxx"), + 'char_length': openapi.Schema(type=openapi.TYPE_STRING, title=_('char length'), + description=_('char length'), default=10), + 'document_count': openapi.Schema(type=openapi.TYPE_STRING, title=_('document count'), + description=_('document count'), default=1), + 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title=_('update time'), + description=_('update 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=_('create time'), + description=_('create time'), default="1970-01-01 00:00:00" ), - 'document_list': openapi.Schema(type=openapi.TYPE_ARRAY, title="文档列表", - description="文档列表", + 'document_list': openapi.Schema(type=openapi.TYPE_ARRAY, title=_('document list'), + description=_('document list'), items=DocumentSerializers.Operate.get_response_body_api()) } ) @@ -362,13 +379,16 @@ class DataSetSerializers(serializers.ModelSerializer): type=openapi.TYPE_OBJECT, required=['name', 'desc', 'url'], properties={ - 'name': openapi.Schema(type=openapi.TYPE_STRING, title="知识库名称", description="知识库名称"), - 'desc': openapi.Schema(type=openapi.TYPE_STRING, title="知识库描述", description="知识库描述"), - 'embedding_mode_id': openapi.Schema(type=openapi.TYPE_STRING, title="向量模型id", - description="向量模型id"), - 'source_url': openapi.Schema(type=openapi.TYPE_STRING, title="web站点url", - description="web站点url"), - 'selector': openapi.Schema(type=openapi.TYPE_STRING, title="选择器", description="选择器") + 'name': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset name'), + description=_('dataset name')), + 'desc': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset description'), + description=_('dataset description')), + 'embedding_mode_id': openapi.Schema(type=openapi.TYPE_STRING, title=_('embedding mode'), + description=_('embedding mode')), + 'source_url': openapi.Schema(type=openapi.TYPE_STRING, title=_('web source url'), + description=_('web source url')), + 'selector': openapi.Schema(type=openapi.TYPE_STRING, title=_('selector'), + description=_('selector')) } ) @@ -390,7 +410,8 @@ class DataSetSerializers(serializers.ModelSerializer): return self.save(dataset_instance, with_valid=True) @valid_license(model=DataSet, count=50, - message='社区版最多支持 50 个知识库,如需拥有更多知识库,请联系我们(https://fit2cloud.com/)。') + message=_( + 'The community version supports up to 50 knowledge bases. If you need more knowledge bases, please contact us (https://fit2cloud.com/).')) @post(post_function=post_embedding_dataset) @transaction.atomic def save(self, instance: Dict, with_valid=True): @@ -400,7 +421,7 @@ class DataSetSerializers(serializers.ModelSerializer): dataset_id = uuid.uuid1() user_id = self.data.get('user_id') if QuerySet(DataSet).filter(user_id=user_id, name=instance.get('name')).exists(): - raise AppApiException(500, "知识库名称重复!") + raise AppApiException(500, _('Knowledge base name duplicate!')) dataset = DataSet( **{'id': dataset_id, 'name': instance.get("name"), 'desc': instance.get('desc'), 'user_id': user_id, 'embedding_mode_id': instance.get('embedding_mode_id')}) @@ -452,7 +473,7 @@ class DataSetSerializers(serializers.ModelSerializer): self.CreateWebSerializers(data=instance).is_valid(raise_exception=True) user_id = self.data.get('user_id') if QuerySet(DataSet).filter(user_id=user_id, name=instance.get('name')).exists(): - raise AppApiException(500, "知识库名称重复!") + raise AppApiException(500, _('Knowledge base name duplicate!')) dataset_id = uuid.uuid1() dataset = DataSet( **{'id': dataset_id, 'name': instance.get("name"), 'desc': instance.get('desc'), 'user_id': user_id, @@ -474,25 +495,25 @@ class DataSetSerializers(serializers.ModelSerializer): properties={ 'id': openapi.Schema(type=openapi.TYPE_STRING, title="id", description="id", default="xx"), - 'name': openapi.Schema(type=openapi.TYPE_STRING, title="名称", - description="名称", default="测试知识库"), - 'desc': openapi.Schema(type=openapi.TYPE_STRING, title="描述", - description="描述", default="测试知识库描述"), - 'user_id': openapi.Schema(type=openapi.TYPE_STRING, title="所属用户id", - description="所属用户id", default="user_xxxx"), - 'char_length': openapi.Schema(type=openapi.TYPE_STRING, title="字符数", - description="字符数", default=10), - 'document_count': openapi.Schema(type=openapi.TYPE_STRING, title="文档数量", - description="文档数量", default=1), - 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间", - description="修改时间", + 'name': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset name'), + description=_('dataset name'), default=_('dataset name')), + 'desc': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset description'), + description=_('dataset description'), default=_('dataset description')), + 'user_id': openapi.Schema(type=openapi.TYPE_STRING, title=_('user id'), + description=_('user id'), default="user_xxxx"), + 'char_length': openapi.Schema(type=openapi.TYPE_STRING, title=_('char length'), + description=_('char length'), default=10), + 'document_count': openapi.Schema(type=openapi.TYPE_STRING, title=_('document count'), + description=_('document count'), default=1), + 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title=_('update time'), + description=_('update 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=_('create time'), + description=_('create time'), default="1970-01-01 00:00:00" ), - 'document_list': openapi.Schema(type=openapi.TYPE_ARRAY, title="文档列表", - description="文档列表", + 'document_list': openapi.Schema(type=openapi.TYPE_ARRAY, title=_('document list'), + description=_('document list'), items=DocumentSerializers.Operate.get_response_body_api()) } ) @@ -503,11 +524,14 @@ class DataSetSerializers(serializers.ModelSerializer): type=openapi.TYPE_OBJECT, required=['name', 'desc'], properties={ - 'name': openapi.Schema(type=openapi.TYPE_STRING, title="知识库名称", description="知识库名称"), - 'desc': openapi.Schema(type=openapi.TYPE_STRING, title="知识库描述", description="知识库描述"), - 'embedding_mode_id': openapi.Schema(type=openapi.TYPE_STRING, title='向量模型', - description='向量模型'), - 'documents': openapi.Schema(type=openapi.TYPE_ARRAY, title="文档数据", description="文档数据", + 'name': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset name'), + description=_('dataset name')), + 'desc': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset description'), + description=_('dataset description')), + 'embedding_mode_id': openapi.Schema(type=openapi.TYPE_STRING, title=_('embedding mode'), + description=_('embedding mode')), + 'documents': openapi.Schema(type=openapi.TYPE_ARRAY, title=_('documents'), + description=_('documents'), items=DocumentSerializers().Create.get_request_body_api() ) } @@ -515,14 +539,14 @@ class DataSetSerializers(serializers.ModelSerializer): class Edit(serializers.Serializer): name = serializers.CharField(required=False, max_length=64, min_length=1, - error_messages=ErrMessage.char("知识库名称")) + error_messages=ErrMessage.char(_('dataset name'))) desc = serializers.CharField(required=False, max_length=256, min_length=1, - error_messages=ErrMessage.char("知识库描述")) + error_messages=ErrMessage.char(_('dataset description'))) meta = serializers.DictField(required=False) application_id_list = serializers.ListSerializer(required=False, child=serializers.UUIDField(required=True, error_messages=ErrMessage.char( - "应用id")), - error_messages=ErrMessage.char("应用列表")) + _('application id'))), + error_messages=ErrMessage.char(_('application id list'))) @staticmethod def get_dataset_meta_valid_map(): @@ -541,21 +565,21 @@ class DataSetSerializers(serializers.ModelSerializer): class HitTest(ApiMixin, serializers.Serializer): id = serializers.CharField(required=True, error_messages=ErrMessage.char("id")) - user_id = serializers.UUIDField(required=False, error_messages=ErrMessage.char("用户id")) - query_text = serializers.CharField(required=True, error_messages=ErrMessage.char("查询文本")) + user_id = serializers.UUIDField(required=False, error_messages=ErrMessage.char(_('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.char("响应Top")) + error_messages=ErrMessage.char("top number")) similarity = serializers.FloatField(required=True, max_value=2, min_value=0, - error_messages=ErrMessage.char("相似度")) + error_messages=ErrMessage.char(_('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("检索模式")) + message=_('The type only supports register|reset_password'), code=500) + ], error_messages=ErrMessage.char(_('search mode'))) def is_valid(self, *, raise_exception=True): super().is_valid(raise_exception=True) if not QuerySet(DataSet).filter(id=self.data.get("id")).exists(): - raise AppApiException(300, "id不存在") + raise AppApiException(300, _('id does not exist')) def hit_test(self): self.is_valid() @@ -578,22 +602,22 @@ class DataSetSerializers(serializers.ModelSerializer): class SyncWeb(ApiMixin, serializers.Serializer): id = serializers.CharField(required=True, error_messages=ErrMessage.char( - "知识库id")) + _('dataset id'))) user_id = serializers.UUIDField(required=False, error_messages=ErrMessage.char( - "用户id")) + _('user id'))) sync_type = serializers.CharField(required=True, error_messages=ErrMessage.char( - "同步类型"), validators=[ + _(_('sync type'))), validators=[ validators.RegexValidator(regex=re.compile("^replace|complete$"), - message="同步类型只支持:replace|complete", code=500) + message=_('The synchronization type only supports:replace|complete'), code=500) ]) def is_valid(self, *, raise_exception=False): super().is_valid(raise_exception=True) first = QuerySet(DataSet).filter(id=self.data.get("id")).first() if first is None: - raise AppApiException(300, "id不存在") + raise AppApiException(300, _('id does not exist')) if first.type != Type.web: - raise AppApiException(500, "只有web站点类型才支持同步") + raise AppApiException(500, _('Synchronization is only supported for web site types')) def sync(self, with_valid=True): if with_valid: @@ -661,24 +685,25 @@ class DataSetSerializers(serializers.ModelSerializer): in_=openapi.IN_PATH, type=openapi.TYPE_STRING, required=True, - description='知识库id'), + description=_('dataset id')), openapi.Parameter(name='sync_type', in_=openapi.IN_QUERY, type=openapi.TYPE_STRING, required=True, - description='同步类型->replace:替换同步,complete:完整同步') + description=_( + 'Synchronization type->replace: replacement synchronization, complete: complete synchronization')) ] class Operate(ApiMixin, serializers.Serializer): id = serializers.CharField(required=True, error_messages=ErrMessage.char( - "知识库id")) + _('dataset id'))) user_id = serializers.UUIDField(required=False, error_messages=ErrMessage.char( - "用户id")) + _('user id'))) def is_valid(self, *, raise_exception=True): super().is_valid(raise_exception=True) if not QuerySet(DataSet).filter(id=self.data.get("id")).exists(): - raise AppApiException(300, "id不存在") + raise AppApiException(300, _('id does not exist')) def export_excel(self, with_valid=True): if with_valid: @@ -778,7 +803,7 @@ class DataSetSerializers(serializers.ModelSerializer): try: embedding_by_dataset.delay(self.data.get('id'), embedding_model_id) except AlreadyQueued as e: - raise AppApiException(500, "向量化任务发送失败,请稍后再试!") + raise AppApiException(500, _('Failed to send the vectorization task, please try again later!')) def list_application(self, with_valid=True): if with_valid: @@ -800,7 +825,7 @@ class DataSetSerializers(serializers.ModelSerializer): ), 'team_member_permission_custom_sql': QuerySet( model=get_dynamics_model({'user_id': models.CharField(), 'team_member_permission.operate': ArrayField( - verbose_name="权限操作列表", + verbose_name=_('permission'), base_field=models.CharField(max_length=256, blank=True, choices=AuthOperate.choices, @@ -828,7 +853,7 @@ class DataSetSerializers(serializers.ModelSerializer): self.is_valid() if QuerySet(DataSet).filter(user_id=user_id, name=dataset.get('name')).exclude( id=self.data.get('id')).exists(): - raise AppApiException(500, "知识库名称重复!") + raise AppApiException(500, _('Knowledge base name duplicate!')) _dataset = QuerySet(DataSet).get(id=self.data.get("id")) DataSetSerializers.Edit(data=dataset).is_valid(dataset=_dataset) if 'embedding_mode_id' in dataset: @@ -846,7 +871,9 @@ class DataSetSerializers(serializers.ModelSerializer): self.list_application(with_valid=False)] for dataset_id in application_id_list: if not application_dataset_id_list.__contains__(dataset_id): - raise AppApiException(500, f"未知的应用id${dataset_id},无法关联") + raise AppApiException(500, + _('Unknown application id {dataset_id}, cannot be associated').format( + dataset_id=dataset_id)) # 删除已经关联的id QuerySet(ApplicationDatasetMapping).filter(application_id__in=application_dataset_id_list, @@ -868,12 +895,15 @@ class DataSetSerializers(serializers.ModelSerializer): type=openapi.TYPE_OBJECT, required=['name', 'desc'], properties={ - 'name': openapi.Schema(type=openapi.TYPE_STRING, title="知识库名称", description="知识库名称"), - 'desc': openapi.Schema(type=openapi.TYPE_STRING, title="知识库描述", description="知识库描述"), - 'meta': openapi.Schema(type=openapi.TYPE_OBJECT, title="知识库元数据", - description="知识库元数据->web:{source_url:xxx,selector:'xxx'},base:{}"), - 'application_id_list': openapi.Schema(type=openapi.TYPE_ARRAY, title="应用id列表", - description="应用id列表", + 'name': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset name'), + description=_('dataset name')), + 'desc': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset description'), + description=_('dataset description')), + 'meta': openapi.Schema(type=openapi.TYPE_OBJECT, title=_('meta'), + description=_( + 'Knowledge base metadata->web:{source_url:xxx,selector:\'xxx\'},base:{}')), + 'application_id_list': openapi.Schema(type=openapi.TYPE_ARRAY, title=_('application id list'), + description=_('application id list'), items=openapi.Schema(type=openapi.TYPE_STRING)) } ) @@ -887,21 +917,21 @@ class DataSetSerializers(serializers.ModelSerializer): properties={ 'id': openapi.Schema(type=openapi.TYPE_STRING, title="id", description="id", default="xx"), - 'name': openapi.Schema(type=openapi.TYPE_STRING, title="名称", - description="名称", default="测试知识库"), - 'desc': openapi.Schema(type=openapi.TYPE_STRING, title="描述", - description="描述", default="测试知识库描述"), - 'user_id': openapi.Schema(type=openapi.TYPE_STRING, title="所属用户id", - description="所属用户id", default="user_xxxx"), - 'char_length': openapi.Schema(type=openapi.TYPE_STRING, title="字符数", - description="字符数", default=10), - 'document_count': openapi.Schema(type=openapi.TYPE_STRING, title="文档数量", - description="文档数量", default=1), - 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间", - description="修改时间", + 'name': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset name'), + description=_('dataset name'), default=_('dataset name')), + 'desc': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset description'), + description=_('dataset description'), default=_('dataset description')), + 'user_id': openapi.Schema(type=openapi.TYPE_STRING, title=_('user id'), + description=_('user id'), default="user_xxxx"), + 'char_length': openapi.Schema(type=openapi.TYPE_STRING, title=_('char length'), + description=_('char length'), default=10), + 'document_count': openapi.Schema(type=openapi.TYPE_STRING, title=_('document count'), + description=_('document count'), default=1), + 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title=_('update time'), + description=_('update 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=_('create time'), + description=_('create time'), default="1970-01-01 00:00:00" ) } @@ -913,5 +943,5 @@ class DataSetSerializers(serializers.ModelSerializer): in_=openapi.IN_PATH, type=openapi.TYPE_STRING, required=True, - description='知识库id') + description=_('dataset id')), ] diff --git a/apps/dataset/serializers/document_serializers.py b/apps/dataset/serializers/document_serializers.py index 33b0838ba..cc37bc8a0 100644 --- a/apps/dataset/serializers/document_serializers.py +++ b/apps/dataset/serializers/document_serializers.py @@ -63,6 +63,7 @@ from embedding.task.embedding import embedding_by_document, delete_embedding_by_ delete_embedding_by_document, update_embedding_dataset_id, delete_embedding_by_paragraph_ids, \ embedding_by_document_list from smartdoc.conf import PROJECT_DIR +from django.utils.translation import gettext_lazy as _ parse_qa_handle_list = [XlsParseQAHandle(), CsvParseQAHandle(), XlsxParseQAHandle(), ZipParseQAHandle()] parse_table_handle_list = [CsvSplitTableHandle(), XlsSplitTableHandle(), XlsxSplitTableHandle()] @@ -79,9 +80,9 @@ class FileBufferHandle: class BatchCancelInstanceSerializer(serializers.Serializer): id_list = serializers.ListField(required=True, child=serializers.UUIDField(required=True), - error_messages=ErrMessage.char("id列表")) + error_messages=ErrMessage.char(_('id list'))) type = serializers.IntegerField(required=True, error_messages=ErrMessage.integer( - "任务类型")) + _('task type'))) def is_valid(self, *, raise_exception=False): super().is_valid(raise_exception=True) @@ -89,12 +90,12 @@ class BatchCancelInstanceSerializer(serializers.Serializer): try: TaskType(_type) except Exception as e: - raise AppApiException(500, '任务类型不支持') + raise AppApiException(500, _('task type not support')) class CancelInstanceSerializer(serializers.Serializer): type = serializers.IntegerField(required=True, error_messages=ErrMessage.integer( - "任务类型")) + _('task type'))) def is_valid(self, *, raise_exception=False): super().is_valid(raise_exception=True) @@ -102,28 +103,28 @@ class CancelInstanceSerializer(serializers.Serializer): try: TaskType(_type) except Exception as e: - raise AppApiException(500, '任务类型不支持') + raise AppApiException(500, _('task type not support')) class DocumentEditInstanceSerializer(ApiMixin, serializers.Serializer): meta = serializers.DictField(required=False) name = serializers.CharField(required=False, max_length=128, min_length=1, error_messages=ErrMessage.char( - "文档名称")) + _('document name'))) hit_handling_method = serializers.CharField(required=False, validators=[ validators.RegexValidator(regex=re.compile("^optimization|directly_return$"), - message="类型只支持optimization|directly_return", + message=_('The type only supports optimization|directly_return'), code=500) - ], error_messages=ErrMessage.char("命中处理方式")) + ], error_messages=ErrMessage.char(_('hit handling method'))) directly_return_similarity = serializers.FloatField(required=False, max_value=2, min_value=0, error_messages=ErrMessage.float( - "直接返回分数")) + _('directly return similarity'))) is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean( - "文档是否可用")) + _('document is active'))) @staticmethod def get_meta_valid_map(): @@ -144,12 +145,12 @@ class DocumentEditInstanceSerializer(ApiMixin, serializers.Serializer): class DocumentWebInstanceSerializer(ApiMixin, serializers.Serializer): source_url_list = serializers.ListField(required=True, child=serializers.CharField(required=True, error_messages=ErrMessage.char( - "文档地址")), + _('document url list'))), error_messages=ErrMessage.char( - "文档地址列表")) + _('document url list'))) selector = serializers.CharField(required=False, allow_null=True, allow_blank=True, error_messages=ErrMessage.char( - "选择器")) + _('selector'))) @staticmethod def get_request_params_api(): @@ -158,12 +159,12 @@ class DocumentWebInstanceSerializer(ApiMixin, serializers.Serializer): type=openapi.TYPE_ARRAY, items=openapi.Items(type=openapi.TYPE_FILE), required=True, - description='上传文件'), + description=_('file')), openapi.Parameter(name='dataset_id', in_=openapi.IN_PATH, type=openapi.TYPE_STRING, required=True, - description='知识库id'), + description=_('dataset id')), ] @staticmethod @@ -172,17 +173,17 @@ class DocumentWebInstanceSerializer(ApiMixin, serializers.Serializer): type=openapi.TYPE_OBJECT, required=['source_url_list'], properties={ - 'source_url_list': openapi.Schema(type=openapi.TYPE_ARRAY, title="文档地址列表", - description="文档地址列表", + 'source_url_list': openapi.Schema(type=openapi.TYPE_ARRAY, title=_('source url list'), + description=_('source url list'), items=openapi.Schema(type=openapi.TYPE_STRING)), - 'selector': openapi.Schema(type=openapi.TYPE_STRING, title="选择器", description="选择器") + 'selector': openapi.Schema(type=openapi.TYPE_STRING, title=_('selector'), description=_('selector')) } ) class DocumentInstanceSerializer(ApiMixin, serializers.Serializer): name = serializers.CharField(required=True, - error_messages=ErrMessage.char("文档名称"), + error_messages=ErrMessage.char(_('document name')), max_length=128, min_length=1) @@ -194,8 +195,10 @@ class DocumentInstanceSerializer(ApiMixin, serializers.Serializer): type=openapi.TYPE_OBJECT, required=['name', 'paragraphs'], properties={ - 'name': openapi.Schema(type=openapi.TYPE_STRING, title="文档名称", description="文档名称"), - 'paragraphs': openapi.Schema(type=openapi.TYPE_ARRAY, title="段落列表", description="段落列表", + 'name': openapi.Schema(type=openapi.TYPE_STRING, title=_('document name'), + description=_('document name')), + 'paragraphs': openapi.Schema(type=openapi.TYPE_ARRAY, title=_('paragraphs'), + description=_('paragraphs'), items=ParagraphSerializers.Create.get_request_body_api()) } ) @@ -203,25 +206,25 @@ class DocumentInstanceSerializer(ApiMixin, serializers.Serializer): class DocumentInstanceQASerializer(ApiMixin, serializers.Serializer): file_list = serializers.ListSerializer(required=True, - error_messages=ErrMessage.list("文件列表"), + error_messages=ErrMessage.list(_('file list')), child=serializers.FileField(required=True, - error_messages=ErrMessage.file("文件"))) + error_messages=ErrMessage.file(_('file')))) class DocumentInstanceTableSerializer(ApiMixin, serializers.Serializer): file_list = serializers.ListSerializer(required=True, - error_messages=ErrMessage.list("文件列表"), + error_messages=ErrMessage.list(_('file list')), child=serializers.FileField(required=True, - error_messages=ErrMessage.file("文件"))) + error_messages=ErrMessage.file(_('file')))) class DocumentSerializers(ApiMixin, serializers.Serializer): class Export(ApiMixin, serializers.Serializer): type = serializers.CharField(required=True, validators=[ validators.RegexValidator(regex=re.compile("^csv|excel$"), - message="模版类型只支持excel|csv", + message=_('The template type only supports excel|csv'), code=500) - ], error_messages=ErrMessage.char("模版类型")) + ], error_messages=ErrMessage.char(_('type'))) @staticmethod def get_request_params_api(): @@ -229,7 +232,7 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): in_=openapi.IN_QUERY, type=openapi.TYPE_STRING, required=True, - description='导出模板类型csv|excel'), + description=_('Export template type csv|excel')), ] @@ -255,13 +258,15 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): self.is_valid(raise_exception=True) if self.data.get('type') == 'csv': - file = open(os.path.join(PROJECT_DIR, "apps", "dataset", 'template', 'MaxKB表格模板.csv'), "rb") + file = open(os.path.join(PROJECT_DIR, "apps", "dataset", 'template', _('MaxKB table template.csv')), + "rb") content = file.read() file.close() return HttpResponse(content, status=200, headers={'Content-Type': 'text/cxv', 'Content-Disposition': 'attachment; filename="csv_template.csv"'}) elif self.data.get('type') == 'excel': - file = open(os.path.join(PROJECT_DIR, "apps", "dataset", 'template', 'MaxKB表格模板.xlsx'), "rb") + file = open(os.path.join(PROJECT_DIR, "apps", "dataset", 'template', _('MaxKB table template.xlsx')), + "rb") content = file.read() file.close() return HttpResponse(content, status=200, headers={'Content-Type': 'application/vnd.ms-excel', @@ -270,13 +275,14 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): class Migrate(ApiMixin, serializers.Serializer): dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char( - "知识库id")) + _('dataset id'))) target_dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char( - "目标知识库id")) - document_id_list = serializers.ListField(required=True, error_messages=ErrMessage.char("文档列表"), + _('target dataset id'))) + document_id_list = serializers.ListField(required=True, error_messages=ErrMessage.char(_('document list')), child=serializers.UUIDField(required=True, - error_messages=ErrMessage.uuid("文档id"))) + error_messages=ErrMessage.uuid( + _('document id')))) @transaction.atomic def migrate(self, with_valid=True): @@ -369,12 +375,12 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): in_=openapi.IN_PATH, type=openapi.TYPE_STRING, required=True, - description='知识库id'), + description=_('document id')), openapi.Parameter(name='target_dataset_id', in_=openapi.IN_PATH, type=openapi.TYPE_STRING, required=True, - description='目标知识库id') + description=_('target document id')) ] @staticmethod @@ -382,24 +388,25 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): return openapi.Schema( type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_STRING), - title='文档id列表', - description="文档id列表" + title=_('document id list'), + description=_('document id list') ) class Query(ApiMixin, serializers.Serializer): # 知识库id dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char( - "知识库id")) + _('dataset id'))) name = serializers.CharField(required=False, max_length=128, min_length=1, error_messages=ErrMessage.char( - "文档名称")) - hit_handling_method = serializers.CharField(required=False, error_messages=ErrMessage.char("命中处理方式")) - is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean("文档是否可用")) - task_type = serializers.IntegerField(required=False, error_messages=ErrMessage.integer("任务类型")) - status = serializers.CharField(required=False, error_messages=ErrMessage.char("文档状态")) + _('document name'))) + hit_handling_method = serializers.CharField(required=False, + error_messages=ErrMessage.char(_('hit handling method'))) + is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean(_('document is active'))) + task_type = serializers.IntegerField(required=False, error_messages=ErrMessage.integer(_('task type'))) + status = serializers.CharField(required=False, error_messages=ErrMessage.char(_('status'))) def get_query_set(self): query_set = QuerySet(model=Document) @@ -447,30 +454,30 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): in_=openapi.IN_QUERY, type=openapi.TYPE_STRING, required=False, - description='文档名称'), + description=_('document name')), openapi.Parameter(name='hit_handling_method', in_=openapi.IN_QUERY, type=openapi.TYPE_STRING, required=False, - description='文档命中处理方式')] + description=_('hit handling method')), ] @staticmethod def get_response_body_api(): return openapi.Schema(type=openapi.TYPE_ARRAY, - title="文档列表", description="文档列表", + title=_('document list'), description=_('document list'), items=DocumentSerializers.Operate.get_response_body_api()) class Sync(ApiMixin, serializers.Serializer): document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char( - "文档id")) + _('document id'))) def is_valid(self, *, raise_exception=False): super().is_valid(raise_exception=True) document_id = self.data.get('document_id') first = QuerySet(Document).filter(id=document_id).first() if first is None: - raise AppApiException(500, "文档id不存在") + raise AppApiException(500, _('document id not exist')) if first.type != Type.web: - raise AppApiException(500, "只有web站点类型才支持同步") + raise AppApiException(500, _('Synchronization is only supported for web site types')) def sync(self, with_valid=True, with_embedding=True): if with_valid: @@ -543,8 +550,8 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): class Operate(ApiMixin, serializers.Serializer): document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char( - "文档id")) - dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char("数据集id")) + _('document id'))) + dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char(_('dataset id'))) @staticmethod def get_request_params_api(): @@ -552,19 +559,19 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): in_=openapi.IN_PATH, type=openapi.TYPE_STRING, required=True, - description='知识库id'), + description=_('document id')), openapi.Parameter(name='document_id', in_=openapi.IN_PATH, type=openapi.TYPE_STRING, required=True, - description='文档id') + description=_('document id')) ] def is_valid(self, *, raise_exception=False): super().is_valid(raise_exception=True) document_id = self.data.get('document_id') if not QuerySet(Document).filter(id=document_id).exists(): - raise AppApiException(500, "文档id不存在") + raise AppApiException(500, _('document id not exist')) def export(self, with_valid=True): if with_valid: @@ -624,7 +631,9 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): # 添加工作表 worksheet = workbook.create_sheet(document_dict.get(sheet_id)) data = [ - ['分段标题(选填)', '分段内容(必填,问题答案,最长不超过4096个字符)', '问题(选填,单元格内一行一个)'], + [_('Section title (optional)', + 'Section content (required, question answer, no more than 4096 characters)', + 'Question (optional, one per line in the cell)')], *data_dict.get(sheet_id, []) ] # 写入数据到工作表 @@ -723,7 +732,7 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): try: embedding_by_document.delay(document_id, embedding_model_id, state_list) except AlreadyQueued as e: - raise AppApiException(500, "任务正在执行中,请勿重复下发") + raise AppApiException(500, _('The task is being executed, please do not send it repeatedly.')) def cancel(self, instance, with_valid=True): if with_valid: @@ -770,20 +779,20 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): properties={ 'id': openapi.Schema(type=openapi.TYPE_STRING, title="id", description="id", default="xx"), - 'name': openapi.Schema(type=openapi.TYPE_STRING, title="名称", - description="名称", default="测试知识库"), - 'char_length': openapi.Schema(type=openapi.TYPE_INTEGER, title="字符数", - description="字符数", default=10), - 'user_id': openapi.Schema(type=openapi.TYPE_STRING, title="用户id", description="用户id"), - 'paragraph_count': openapi.Schema(type=openapi.TYPE_INTEGER, title="文档数量", - description="文档数量", default=1), - 'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否可用", - description="是否可用", default=True), - 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间", - description="修改时间", + 'name': openapi.Schema(type=openapi.TYPE_STRING, title=_('name'), + description=_('name'), default="xx"), + 'char_length': openapi.Schema(type=openapi.TYPE_INTEGER, title=_('char length'), + description=_('char length'), default=10), + 'user_id': openapi.Schema(type=openapi.TYPE_STRING, title=_('user id'), description=_('user id')), + 'paragraph_count': openapi.Schema(type=openapi.TYPE_INTEGER, title="_('document count')", + description="_('document count')", default=1), + 'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_(''), + description=_('Is active'), default=True), + 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title=_('update time'), + description=_('update 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=_('create time'), + description=_('create time'), default="1970-01-01 00:00:00" ) } @@ -794,25 +803,30 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): return openapi.Schema( type=openapi.TYPE_OBJECT, properties={ - 'name': openapi.Schema(type=openapi.TYPE_STRING, title="文档名称", description="文档名称"), - 'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否可用", description="是否可用"), - 'hit_handling_method': openapi.Schema(type=openapi.TYPE_STRING, title="命中处理方式", - description="ai优化:optimization,直接返回:directly_return"), - 'directly_return_similarity': openapi.Schema(type=openapi.TYPE_NUMBER, title="直接返回分数", + 'name': openapi.Schema(type=openapi.TYPE_STRING, title=_('document name'), + description=_('document name')), + 'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_('Is active'), + description=_('Is active')), + 'hit_handling_method': openapi.Schema(type=openapi.TYPE_STRING, title=_('hit handling method'), + description=_( + 'ai optimization: optimization, direct return: directly_return')), + 'directly_return_similarity': openapi.Schema(type=openapi.TYPE_NUMBER, + title=_('directly return similarity'), default=0.9), - 'meta': openapi.Schema(type=openapi.TYPE_OBJECT, title="文档元数据", - description="文档元数据->web:{source_url:xxx,selector:'xxx'},base:{}"), + 'meta': openapi.Schema(type=openapi.TYPE_OBJECT, title=_('meta'), + description=_( + 'Document metadata->web:{source_url:xxx,selector:\'xxx\'},base:{}')), } ) class Create(ApiMixin, serializers.Serializer): dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char( - "文档id")) + _('document id'))) def is_valid(self, *, raise_exception=False): super().is_valid(raise_exception=True) if not QuerySet(DataSet).filter(id=self.data.get('dataset_id')).exists(): - raise AppApiException(10000, "知识库id不存在") + raise AppApiException(10000, _('dataset id not exist')) return True @staticmethod @@ -827,7 +841,7 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): for parse_qa_handle in parse_qa_handle_list: if parse_qa_handle.support(file, get_buffer): return parse_qa_handle.handle(file, get_buffer, save_image) - raise AppApiException(500, '不支持的文件格式') + raise AppApiException(500, _('Unsupported file format')) @staticmethod def parse_table_file(file): @@ -835,7 +849,7 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): for parse_table_handle in parse_table_handle_list: if parse_table_handle.support(file, get_buffer): return parse_table_handle.handle(file, get_buffer, save_image) - raise AppApiException(500, '不支持的文件格式') + raise AppApiException(500, _('Unsupported file format')) def save_qa(self, instance: Dict, with_valid=True): if with_valid: @@ -935,31 +949,31 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): in_=openapi.IN_PATH, type=openapi.TYPE_STRING, required=True, - description='知识库id') + description=_('document id')) ] class Split(ApiMixin, serializers.Serializer): file = serializers.ListField(required=True, error_messages=ErrMessage.list( - "文件列表")) + _('file list'))) limit = serializers.IntegerField(required=False, error_messages=ErrMessage.integer( - "分段长度")) + _('limit'))) patterns = serializers.ListField(required=False, child=serializers.CharField(required=True, error_messages=ErrMessage.char( - "分段标识")), - error_messages=ErrMessage.uuid( - "分段标识列表")) + _('patterns'))), + error_messages=ErrMessage.list( + _('patterns'))) with_filter = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean( - "自动清洗")) + _('Auto Clean'))) def is_valid(self, *, raise_exception=True): super().is_valid(raise_exception=True) files = self.data.get('file') for f in files: if f.size > 1024 * 1024 * 100: - raise AppApiException(500, "上传文件最大不能超过100MB") + raise AppApiException(500, _('The maximum size of the uploaded file cannot exceed 100MB')) @staticmethod def get_request_params_api(): @@ -969,20 +983,21 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): type=openapi.TYPE_ARRAY, items=openapi.Items(type=openapi.TYPE_FILE), required=True, - description='上传文件'), + description=_('file list')), openapi.Parameter(name='limit', in_=openapi.IN_FORM, required=False, - type=openapi.TYPE_INTEGER, title="分段长度", description="分段长度"), + type=openapi.TYPE_INTEGER, title=_('limit'), description=_('limit')), openapi.Parameter(name='patterns', in_=openapi.IN_FORM, required=False, type=openapi.TYPE_ARRAY, items=openapi.Items(type=openapi.TYPE_STRING), - title="分段正则列表", description="分段正则列表"), + title=_('Segmented regular list'), description=_('Segmented regular list')), openapi.Parameter(name='with_filter', in_=openapi.IN_FORM, required=False, - type=openapi.TYPE_BOOLEAN, title="是否清除特殊字符", description="是否清除特殊字符"), + type=openapi.TYPE_BOOLEAN, title=_('Whether to clear special characters'), + description=_('Whether to clear special characters')), ] def parse(self): @@ -1001,13 +1016,13 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): {'key': '#####', 'value': "(?<=\\n)(?生成问题:{document_id}") + max_kb.info(_('End--->Generate problem: {document_id}').format(document_id=document_id)) @celery_app.task(base=QueueOnce, once={'keys': ['paragraph_id_list']}, diff --git a/apps/dataset/task/sync.py b/apps/dataset/task/sync.py index b9af091f1..7b5c929ba 100644 --- a/apps/dataset/task/sync.py +++ b/apps/dataset/task/sync.py @@ -17,6 +17,7 @@ from common.util.fork import ForkManage, Fork from dataset.task.tools import get_save_handler, get_sync_web_document_handler, get_sync_handler from ops import celery_app +from django.utils.translation import gettext_lazy as _ max_kb_error = logging.getLogger("max_kb_error") max_kb = logging.getLogger("max_kb") @@ -25,25 +26,28 @@ max_kb = logging.getLogger("max_kb") @celery_app.task(base=QueueOnce, once={'keys': ['dataset_id']}, name='celery:sync_web_dataset') def sync_web_dataset(dataset_id: str, url: str, selector: str): try: - max_kb.info(f"开始--->开始同步web知识库:{dataset_id}") + max_kb.info(_('Start--->Start synchronization web knowledge base:{dataset_id}').format(dataset_id=dataset_id)) ForkManage(url, selector.split(" ") if selector is not None else []).fork(2, set(), get_save_handler(dataset_id, selector)) - max_kb.info(f"结束--->结束同步web知识库:{dataset_id}") + + max_kb.info(_('End--->End synchronization web knowledge base:{dataset_id}').format(dataset_id=dataset_id)) except Exception as e: - max_kb_error.error(f'同步web知识库:{dataset_id}出现错误{str(e)}{traceback.format_exc()}') + max_kb_error.error(_('Synchronize web knowledge base:{dataset_id} error{error}{traceback}').format( + dataset_id=dataset_id, error=str(e), traceback=traceback.format_exc())) @celery_app.task(base=QueueOnce, once={'keys': ['dataset_id']}, name='celery:sync_replace_web_dataset') def sync_replace_web_dataset(dataset_id: str, url: str, selector: str): try: - max_kb.info(f"开始--->开始同步web知识库:{dataset_id}") + max_kb.info(_('Start--->Start synchronization web knowledge base:{dataset_id}').format(dataset_id=dataset_id)) ForkManage(url, selector.split(" ") if selector is not None else []).fork(2, set(), get_sync_handler(dataset_id )) - max_kb.info(f"结束--->结束同步web知识库:{dataset_id}") + max_kb.info(_('End--->End synchronization web knowledge base:{dataset_id}').format(dataset_id=dataset_id)) except Exception as e: - max_kb_error.error(f'同步web知识库:{dataset_id}出现错误{str(e)}{traceback.format_exc()}') + max_kb_error.error(_('Synchronize web knowledge base:{dataset_id} error{error}{traceback}').format( + dataset_id=dataset_id, error=str(e), traceback=traceback.format_exc())) @celery_app.task(name='celery:sync_web_document') diff --git a/apps/dataset/task/tools.py b/apps/dataset/task/tools.py index 9838a755c..84d3ac8d3 100644 --- a/apps/dataset/task/tools.py +++ b/apps/dataset/task/tools.py @@ -16,6 +16,7 @@ from django.db.models import QuerySet from common.util.fork import ChildLink, Fork from common.util.split_model import get_split_model from dataset.models import Type, Document, DataSet, Status +from django.utils.translation import gettext_lazy as _ max_kb_error = logging.getLogger("max_kb_error") max_kb = logging.getLogger("max_kb") @@ -110,4 +111,4 @@ def save_problem(dataset_id, document_id, paragraph_id, problem): data={"dataset_id": dataset_id, 'document_id': document_id, 'paragraph_id': paragraph_id}).save(instance={"content": problem}, with_valid=True) except Exception as e: - max_kb_error.error(f'关联问题失败: {e}') + max_kb_error.error(_('Association problem failed {error}').format(error=str(e))) diff --git a/apps/dataset/views/dataset.py b/apps/dataset/views/dataset.py index e4293c219..269d5e288 100644 --- a/apps/dataset/views/dataset.py +++ b/apps/dataset/views/dataset.py @@ -21,6 +21,7 @@ from common.response.result import get_page_request_params, get_page_api_respons from common.swagger_api.common_api import CommonApi from dataset.serializers.dataset_serializers import DataSetSerializers from setting.serializers.provider_serializers import ModelSerializer +from django.utils.translation import gettext_lazy as _ class Dataset(APIView): @@ -34,7 +35,7 @@ class Dataset(APIView): operation_id="同步Web站点知识库", manual_parameters=DataSetSerializers.SyncWeb.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库"]) + tags=[_('Knowledge Base')]) @has_permissions(ViewPermission( [RoleConstants.ADMIN, RoleConstants.USER], [lambda r, keywords: Permission(group=Group.DATASET, operate=Operate.MANAGE, @@ -56,7 +57,7 @@ class Dataset(APIView): manual_parameters=DataSetSerializers.Create.CreateQASerializers.get_request_params_api(), responses=get_api_response( DataSetSerializers.Create.CreateQASerializers.get_response_body_api()), - tags=["知识库"] + tags=[_('Knowledge Base')] ) @has_permissions(PermissionConstants.DATASET_CREATE, compare=CompareConstants.AND) def post(self, request: Request): @@ -70,12 +71,12 @@ class Dataset(APIView): authentication_classes = [TokenAuth] @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="创建web站点知识库", - operation_id="创建web站点知识库", + @swagger_auto_schema(operation_summary=_('Create a web site knowledge base'), + operation_id=_('Create a web site knowledge base'), request_body=DataSetSerializers.Create.CreateWebSerializers.get_request_body_api(), responses=get_api_response( DataSetSerializers.Create.CreateWebSerializers.get_response_body_api()), - tags=["知识库"] + tags=[_('Knowledge Base')] ) @has_permissions(PermissionConstants.DATASET_CREATE, compare=CompareConstants.AND) def post(self, request: Request): @@ -85,22 +86,22 @@ class Dataset(APIView): authentication_classes = [TokenAuth] @action(methods=['GET'], detail=False) - @swagger_auto_schema(operation_summary="获取知识库可用应用列表", - operation_id="获取知识库可用应用列表", + @swagger_auto_schema(operation_summary=_('Get a list of applications available in the knowledge base'), + operation_id=_('Get a list of applications available in the knowledge base'), manual_parameters=DataSetSerializers.Application.get_request_params_api(), responses=result.get_api_array_response( DataSetSerializers.Application.get_response_body_api()), - tags=["知识库"]) + tags=[_('Knowledge Base')]) def get(self, request: Request, dataset_id: str): return result.success(DataSetSerializers.Operate( data={'id': dataset_id, 'user_id': str(request.user.id)}).list_application()) @action(methods=['GET'], detail=False) - @swagger_auto_schema(operation_summary="获取知识库列表", - operation_id="获取知识库列表", + @swagger_auto_schema(operation_summary=_('Get a list of knowledge bases'), + operation_id=_('Get a list of knowledge bases'), manual_parameters=DataSetSerializers.Query.get_request_params_api(), responses=result.get_api_array_response(DataSetSerializers.Query.get_response_body_api()), - tags=["知识库"]) + tags=[_('Knowledge Base')]) @has_permissions(PermissionConstants.DATASET_READ, compare=CompareConstants.AND) def get(self, request: Request): data = {key: str(value) for key, value in request.query_params.items()} @@ -109,11 +110,11 @@ class Dataset(APIView): return result.success(d.list()) @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="创建知识库", - operation_id="创建知识库", + @swagger_auto_schema(operation_summary=_('Create a knowledge base'), + operation_id=_('Create a knowledge base'), request_body=DataSetSerializers.Create.get_request_body_api(), responses=get_api_response(DataSetSerializers.Create.get_response_body_api()), - tags=["知识库"] + tags=[_('Knowledge Base')] ) @has_permissions(PermissionConstants.DATASET_CREATE, compare=CompareConstants.AND) def post(self, request: Request): @@ -123,10 +124,10 @@ class Dataset(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=[_('Knowledge Base')]) @has_permissions(lambda r, keywords: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=keywords.get('dataset_id'))) def get(self, request: Request, dataset_id: str): @@ -142,10 +143,10 @@ class Dataset(APIView): authentication_classes = [TokenAuth] @action(methods="PUT", detail=False) - @swagger_auto_schema(operation_summary="重新向量化", operation_id="重新向量化", + @swagger_auto_schema(operation_summary=_('Re-vectorize'), operation_id=_('Re-vectorize'), manual_parameters=DataSetSerializers.Operate.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库"] + tags=[_('Knowledge Base')] ) @has_permissions(lambda r, keywords: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=keywords.get('dataset_id'))) @@ -157,9 +158,9 @@ class Dataset(APIView): authentication_classes = [TokenAuth] @action(methods="GET", detail=False) - @swagger_auto_schema(operation_summary="导出知识库", operation_id="导出知识库", + @swagger_auto_schema(operation_summary=_('Export knowledge base'), operation_id=_('Export knowledge base'), manual_parameters=DataSetSerializers.Operate.get_request_params_api(), - tags=["知识库"] + tags=[_('Knowledge Base')] ) @has_permissions(lambda r, keywords: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=keywords.get('dataset_id'))) @@ -170,9 +171,10 @@ class Dataset(APIView): authentication_classes = [TokenAuth] @action(methods="GET", detail=False) - @swagger_auto_schema(operation_summary="导出知识库包含图片", operation_id="导出知识库包含图片", + @swagger_auto_schema(operation_summary=_('Export knowledge base containing images'), + operation_id=_('Export knowledge base containing images'), manual_parameters=DataSetSerializers.Operate.get_request_params_api(), - tags=["知识库"] + tags=[_('Knowledge Base')] ) @has_permissions(lambda r, keywords: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=keywords.get('dataset_id'))) @@ -183,10 +185,10 @@ class Dataset(APIView): authentication_classes = [TokenAuth] @action(methods="DELETE", detail=False) - @swagger_auto_schema(operation_summary="删除知识库", operation_id="删除知识库", + @swagger_auto_schema(operation_summary=_('Delete knowledge base'), operation_id=_('Delete knowledge base'), manual_parameters=DataSetSerializers.Operate.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库"]) + tags=[_('Knowledge Base')]) @has_permissions(lambda r, keywords: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=keywords.get('dataset_id')), lambda r, k: Permission(group=Group.DATASET, operate=Operate.DELETE, @@ -196,10 +198,11 @@ class Dataset(APIView): return result.success(operate.delete()) @action(methods="GET", detail=False) - @swagger_auto_schema(operation_summary="查询知识库详情根据知识库id", operation_id="查询知识库详情根据知识库id", + @swagger_auto_schema(operation_summary=_('Query knowledge base details based on knowledge base id'), + operation_id=_('Query knowledge base details based on knowledge base id'), manual_parameters=DataSetSerializers.Operate.get_request_params_api(), responses=get_api_response(DataSetSerializers.Operate.get_response_body_api()), - tags=["知识库"]) + tags=[_('Knowledge Base')]) @has_permissions(lambda r, keywords: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=keywords.get('dataset_id'))) def get(self, request: Request, dataset_id: str): @@ -207,11 +210,12 @@ class Dataset(APIView): user_id=request.user.id)) @action(methods="PUT", detail=False) - @swagger_auto_schema(operation_summary="修改知识库信息", operation_id="修改知识库信息", + @swagger_auto_schema(operation_summary=_('Modify knowledge base information'), + operation_id=_('Modify knowledge base information'), manual_parameters=DataSetSerializers.Operate.get_request_params_api(), request_body=DataSetSerializers.Operate.get_request_body_api(), responses=get_api_response(DataSetSerializers.Operate.get_response_body_api()), - tags=["知识库"] + tags=[_('Knowledge Base')] ) @has_permissions(lambda r, keywords: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=keywords.get('dataset_id'))) @@ -224,12 +228,12 @@ class Dataset(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 paginated list'), + operation_id=_('Get the knowledge base paginated list'), manual_parameters=get_page_request_params( DataSetSerializers.Query.get_request_params_api()), responses=get_page_api_response(DataSetSerializers.Query.get_response_body_api()), - tags=["知识库"] + tags=[_('Knowledge Base')] ) @has_permissions(PermissionConstants.DATASET_READ, compare=CompareConstants.AND) def get(self, request: Request, current_page, page_size): diff --git a/apps/dataset/views/document.py b/apps/dataset/views/document.py index c074fc543..7d1136730 100644 --- a/apps/dataset/views/document.py +++ b/apps/dataset/views/document.py @@ -20,16 +20,17 @@ from common.util.common import query_params_to_single_dict from dataset.serializers.common_serializers import BatchSerializer from dataset.serializers.document_serializers import DocumentSerializers, DocumentWebInstanceSerializer from dataset.swagger_api.document_api import DocumentApi +from django.utils.translation import gettext_lazy as _ class Template(APIView): authentication_classes = [TokenAuth] @action(methods=['GET'], detail=False) - @swagger_auto_schema(operation_summary="获取QA模版", - operation_id="获取QA模版", + @swagger_auto_schema(operation_summary=_('Get QA template'), + operation_id=_('Get QA template'), manual_parameters=DocumentSerializers.Export.get_request_params_api(), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) def get(self, request: Request): return DocumentSerializers.Export(data={'type': request.query_params.get('type')}).export(with_valid=True) @@ -38,10 +39,10 @@ class TableTemplate(APIView): authentication_classes = [TokenAuth] @action(methods=['GET'], detail=False) - @swagger_auto_schema(operation_summary="获取表格模版", - operation_id="获取表格模版", + @swagger_auto_schema(operation_summary=_('Get form template'), + operation_id=_('Get form template'), manual_parameters=DocumentSerializers.Export.get_request_params_api(), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) def get(self, request: Request): return DocumentSerializers.Export(data={'type': request.query_params.get('type')}).table_export(with_valid=True) @@ -50,12 +51,12 @@ class WebDocument(APIView): authentication_classes = [TokenAuth] @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="创建Web站点文档", - operation_id="创建Web站点文档", + @swagger_auto_schema(operation_summary=_('Create Web site documents'), + operation_id=_('Create Web site documents'), request_body=DocumentWebInstanceSerializer.get_request_body_api(), manual_parameters=DocumentSerializers.Create.get_request_params_api(), responses=result.get_api_response(DocumentSerializers.Operate.get_response_body_api()), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -69,11 +70,11 @@ class QaDocument(APIView): parser_classes = [MultiPartParser] @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="导入QA并创建文档", - operation_id="导入QA并创建文档", + @swagger_auto_schema(operation_summary=_('Import QA and create documentation'), + operation_id=_('Import QA and create documentation'), manual_parameters=DocumentWebInstanceSerializer.get_request_params_api(), responses=result.get_api_response(DocumentSerializers.Create.get_response_body_api()), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -89,11 +90,11 @@ class TableDocument(APIView): parser_classes = [MultiPartParser] @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="导入表格并创建文档", - operation_id="导入表格并创建文档", + @swagger_auto_schema(operation_summary=_('Import tables and create documents'), + operation_id=_('Import tables and create documents'), manual_parameters=DocumentWebInstanceSerializer.get_request_params_api(), responses=result.get_api_response(DocumentSerializers.Create.get_response_body_api()), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -108,12 +109,12 @@ class Document(APIView): authentication_classes = [TokenAuth] @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="创建文档", - operation_id="创建文档", + @swagger_auto_schema(operation_summary=_('Create document'), + operation_id=_('Create document'), request_body=DocumentSerializers.Create.get_request_body_api(), manual_parameters=DocumentSerializers.Create.get_request_params_api(), responses=result.get_api_response(DocumentSerializers.Operate.get_response_body_api()), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -122,11 +123,11 @@ class Document(APIView): DocumentSerializers.Create(data={'dataset_id': dataset_id}).save(request.data, with_valid=True)) @action(methods=['GET'], detail=False) - @swagger_auto_schema(operation_summary="文档列表", - operation_id="文档列表", + @swagger_auto_schema(operation_summary=_('Document list'), + operation_id=_('Document list'), manual_parameters=DocumentSerializers.Query.get_request_params_api(), responses=result.get_api_response(DocumentSerializers.Query.get_response_body_api()), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) @@ -140,13 +141,13 @@ class Document(APIView): authentication_classes = [TokenAuth] @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="批量修改文档命中处理方式", - operation_id="批量修改文档命中处理方式", + @swagger_auto_schema(operation_summary=_('Modify document hit processing methods in batches'), + operation_id=_('Modify document hit processing methods in batches'), request_body= DocumentApi.BatchEditHitHandlingApi.get_request_body_api(), manual_parameters=DocumentSerializers.Create.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -158,14 +159,14 @@ class Document(APIView): authentication_classes = [TokenAuth] @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="批量创建文档", - operation_id="批量创建文档", + @swagger_auto_schema(operation_summary=_('Create documents in batches'), + operation_id=_('Create documents in batches'), request_body= DocumentSerializers.Batch.get_request_body_api(), manual_parameters=DocumentSerializers.Create.get_request_params_api(), responses=result.get_api_array_response( DocumentSerializers.Operate.get_response_body_api()), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -173,13 +174,13 @@ class Document(APIView): return result.success(DocumentSerializers.Batch(data={'dataset_id': dataset_id}).batch_save(request.data)) @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="批量同步文档", - operation_id="批量同步文档", + @swagger_auto_schema(operation_summary=_('Batch sync documents'), + operation_id=_('Batch sync documents'), request_body= BatchSerializer.get_request_body_api(), manual_parameters=DocumentSerializers.Create.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -187,13 +188,13 @@ class Document(APIView): return result.success(DocumentSerializers.Batch(data={'dataset_id': dataset_id}).batch_sync(request.data)) @action(methods=['DELETE'], detail=False) - @swagger_auto_schema(operation_summary="批量删除文档", - operation_id="批量删除文档", + @swagger_auto_schema(operation_summary=_('Delete documents in batches'), + operation_id=_('Delete documents in batches'), request_body= BatchSerializer.get_request_body_api(), manual_parameters=DocumentSerializers.Create.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -204,11 +205,11 @@ class Document(APIView): authentication_classes = [TokenAuth] @action(methods=['PUT'], detail=False) - @swagger_auto_schema(operation_summary="同步web站点类型", - operation_id="同步web站点类型", + @swagger_auto_schema(operation_summary=_('Synchronize web site types'), + operation_id=_('Synchronize web site types'), manual_parameters=DocumentSerializers.Operate.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库/文档"] + tags=[_('Knowledge Base/Documentation')] ) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, @@ -222,12 +223,12 @@ class Document(APIView): authentication_classes = [TokenAuth] @action(methods=['PUT'], detail=False) - @swagger_auto_schema(operation_summary="取消任务", - operation_id="取消任务", + @swagger_auto_schema(operation_summary=_('Cancel task'), + operation_id=_('Cancel task'), manual_parameters=DocumentSerializers.Operate.get_request_params_api(), request_body=DocumentApi.Cancel.get_request_body_api(), responses=result.get_default_response(), - tags=["知识库/文档"] + tags=[_('Knowledge Base/Documentation')] ) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, @@ -242,12 +243,12 @@ class Document(APIView): authentication_classes = [TokenAuth] @action(methods=['PUT'], detail=False) - @swagger_auto_schema(operation_summary="批量取消任务", - operation_id="批量取消任务", + @swagger_auto_schema(operation_summary=_('Cancel tasks in batches'), + operation_id=_('Cancel tasks in batches'), request_body=DocumentApi.BatchCancel.get_request_body_api(), manual_parameters=DocumentSerializers.Create.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库/文档"] + tags=[_('Knowledge Base/Documentation')] ) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, @@ -260,12 +261,12 @@ class Document(APIView): authentication_classes = [TokenAuth] @action(methods=['PUT'], detail=False) - @swagger_auto_schema(operation_summary="刷新文档向量库", - operation_id="刷新文档向量库", + @swagger_auto_schema(operation_summary=_('Refresh document vector library'), + operation_id=_('Refresh document vector library'), request_body=DocumentApi.EmbeddingState.get_request_body_api(), manual_parameters=DocumentSerializers.Operate.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库/文档"] + tags=[_('Knowledge Base/Documentation')] ) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, @@ -280,13 +281,13 @@ class Document(APIView): authentication_classes = [TokenAuth] @action(methods=['PUT'], detail=False) - @swagger_auto_schema(operation_summary="批量刷新文档向量库", - operation_id="批量刷新文档向量库", + @swagger_auto_schema(operation_summary=_('Batch refresh document vector library'), + operation_id=_('Batch refresh document vector library'), request_body= DocumentApi.BatchEditHitHandlingApi.get_request_body_api(), manual_parameters=DocumentSerializers.Create.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -298,12 +299,12 @@ class Document(APIView): authentication_classes = [TokenAuth] @action(methods=['PUT'], detail=False) - @swagger_auto_schema(operation_summary="批量迁移文档", - operation_id="批量迁移文档", + @swagger_auto_schema(operation_summary=_('Migrate documents in batches'), + operation_id=_('Migrate documents in batches'), manual_parameters=DocumentSerializers.Migrate.get_request_params_api(), request_body=DocumentSerializers.Migrate.get_request_body_api(), responses=result.get_api_response(DocumentSerializers.Operate.get_response_body_api()), - tags=["知识库/文档"] + tags=[_('Knowledge Base/Documentation')] ) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, @@ -324,10 +325,10 @@ class Document(APIView): authentication_classes = [TokenAuth] @action(methods=['GET'], detail=False) - @swagger_auto_schema(operation_summary="导出文档", - operation_id="导出文档", + @swagger_auto_schema(operation_summary=_('Export document'), + operation_id=_('Export document'), manual_parameters=DocumentSerializers.Operate.get_request_params_api(), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -338,10 +339,10 @@ class Document(APIView): authentication_classes = [TokenAuth] @action(methods=['GET'], detail=False) - @swagger_auto_schema(operation_summary="导出Zip文档", - operation_id="导出Zip文档", + @swagger_auto_schema(operation_summary=_('Export Zip document'), + operation_id=_('Export Zip document'), manual_parameters=DocumentSerializers.Operate.get_request_params_api(), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -352,11 +353,11 @@ class Document(APIView): authentication_classes = [TokenAuth] @action(methods=['GET'], detail=False) - @swagger_auto_schema(operation_summary="获取文档详情", - operation_id="获取文档详情", + @swagger_auto_schema(operation_summary=_('Get document details'), + operation_id=_('Get document details'), manual_parameters=DocumentSerializers.Operate.get_request_params_api(), responses=result.get_api_response(DocumentSerializers.Operate.get_response_body_api()), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) @@ -366,12 +367,12 @@ class Document(APIView): return result.success(operate.one()) @action(methods=['PUT'], detail=False) - @swagger_auto_schema(operation_summary="修改文档", - operation_id="修改文档", + @swagger_auto_schema(operation_summary=_('Modify document'), + operation_id=_('Modify document'), manual_parameters=DocumentSerializers.Operate.get_request_params_api(), request_body=DocumentSerializers.Operate.get_request_body_api(), responses=result.get_api_response(DocumentSerializers.Operate.get_response_body_api()), - tags=["知识库/文档"] + tags=[_('Knowledge Base/Documentation')] ) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, @@ -383,11 +384,11 @@ class Document(APIView): with_valid=True)) @action(methods=['DELETE'], detail=False) - @swagger_auto_schema(operation_summary="删除文档", - operation_id="删除文档", + @swagger_auto_schema(operation_summary=_('Delete document'), + operation_id=_('Delete document'), manual_parameters=DocumentSerializers.Operate.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -400,9 +401,9 @@ class Document(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 segment IDs'), + operation_id=_('Get a list of segment IDs'), + tags=[_('Knowledge Base/Documentation')]) def get(self, request: Request): return result.success(DocumentSerializers.SplitPattern.list()) @@ -411,10 +412,10 @@ class Document(APIView): parser_classes = [MultiPartParser] @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="分段文档", - operation_id="分段文档", + @swagger_auto_schema(operation_summary=_('Segmented document'), + operation_id=_('Segmented document'), manual_parameters=DocumentSerializers.Split.get_request_params_api(), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) def post(self, request: Request): split_data = {'file': request.FILES.getlist('file')} request_data = request.data @@ -434,11 +435,11 @@ class Document(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 paginated list'), + operation_id=_('Get the knowledge base paginated list'), manual_parameters=DocumentSerializers.Query.get_request_params_api(), responses=result.get_page_api_response(DocumentSerializers.Query.get_response_body_api()), - tags=["知识库/文档"]) + tags=[_('Knowledge Base/Documentation')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) diff --git a/apps/dataset/views/file.py b/apps/dataset/views/file.py index 395d9418f..7bed30abb 100644 --- a/apps/dataset/views/file.py +++ b/apps/dataset/views/file.py @@ -16,6 +16,7 @@ from rest_framework.views import Request from common.auth import TokenAuth from common.response import result from dataset.serializers.file_serializers import FileSerializer +from django.utils.translation import gettext_lazy as _ class FileView(APIView): @@ -23,21 +24,21 @@ class FileView(APIView): parser_classes = [MultiPartParser] @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="上传文件", - operation_id="上传文件", + @swagger_auto_schema(operation_summary=_(''), + operation_id=_('Upload file'), manual_parameters=[openapi.Parameter(name='file', in_=openapi.IN_FORM, type=openapi.TYPE_FILE, required=True, - description='上传文件')], - tags=["文件"]) + description=_('Upload file'))], + tags=[_('file')]) def post(self, request: Request): return result.success(FileSerializer(data={'file': request.FILES.get('file')}).upload()) class Operate(APIView): @action(methods=['GET'], detail=False) - @swagger_auto_schema(operation_summary="获取文件", - operation_id="获取文件", - tags=["文件"]) + @swagger_auto_schema(operation_summary=_('Get file'), + operation_id=_('Get file'), + tags=[_('file')]) def get(self, request: Request, file_id: str): return FileSerializer.Operate(data={'id': file_id}).get() diff --git a/apps/dataset/views/image.py b/apps/dataset/views/image.py index 124336f87..5c9751678 100644 --- a/apps/dataset/views/image.py +++ b/apps/dataset/views/image.py @@ -16,6 +16,7 @@ from rest_framework.views import Request from common.auth import TokenAuth from common.response import result from dataset.serializers.image_serializers import ImageSerializer +from django.utils.translation import gettext_lazy as _ class Image(APIView): @@ -23,21 +24,21 @@ class Image(APIView): parser_classes = [MultiPartParser] @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="上传图片", - operation_id="上传图片", + @swagger_auto_schema(operation_summary=_('Upload image'), + operation_id=_('Upload image'), manual_parameters=[openapi.Parameter(name='file', in_=openapi.IN_FORM, type=openapi.TYPE_FILE, required=True, - description='上传文件')], - tags=["图片"]) + description=_('Upload image'))], + tags=[_('Image')]) def post(self, request: Request): return result.success(ImageSerializer(data={'image': request.FILES.get('file')}).upload()) class Operate(APIView): @action(methods=['GET'], detail=False) - @swagger_auto_schema(operation_summary="获取图片", - operation_id="获取图片", - tags=["图片"]) + @swagger_auto_schema(operation_summary=_('Get Image'), + operation_id=_('Get Image'), + tags=[_('Image')]) def get(self, request: Request, image_id: str): return ImageSerializer.Operate(data={'id': image_id}).get() diff --git a/apps/dataset/views/paragraph.py b/apps/dataset/views/paragraph.py index c1286c0d4..a4e06659b 100644 --- a/apps/dataset/views/paragraph.py +++ b/apps/dataset/views/paragraph.py @@ -17,17 +17,18 @@ from common.response import result from common.util.common import query_params_to_single_dict from dataset.serializers.common_serializers import BatchSerializer from dataset.serializers.paragraph_serializers import ParagraphSerializers +from django.utils.translation import gettext_lazy as _ class Paragraph(APIView): authentication_classes = [TokenAuth] @action(methods=['GET'], detail=False) - @swagger_auto_schema(operation_summary="段落列表", - operation_id="段落列表", + @swagger_auto_schema(operation_summary=_('Paragraph list'), + operation_id=_('Paragraph list'), manual_parameters=ParagraphSerializers.Query.get_request_params_api(), responses=result.get_api_array_response(ParagraphSerializers.Query.get_response_body_api()), - tags=["知识库/文档/段落"] + tags=[_('Knowledge Base/Documentation/Paragraph')] ) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, @@ -40,12 +41,12 @@ class Paragraph(APIView): return result.success(q.list()) @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="创建段落", - operation_id="创建段落", + @swagger_auto_schema(operation_summary=_('Create Paragraph'), + operation_id=_('Create Paragraph'), manual_parameters=ParagraphSerializers.Create.get_request_params_api(), request_body=ParagraphSerializers.Create.get_request_body_api(), responses=result.get_api_response(ParagraphSerializers.Query.get_response_body_api()), - tags=["知识库/文档/段落"]) + tags=[_('Knowledge Base/Documentation/Paragraph')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -57,12 +58,12 @@ class Paragraph(APIView): authentication_classes = [TokenAuth] @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="添加关联问题", - operation_id="添加段落关联问题", + @swagger_auto_schema(operation_summary=_('Add associated questions'), + operation_id=_('Add associated questions'), manual_parameters=ParagraphSerializers.Problem.get_request_params_api(), request_body=ParagraphSerializers.Problem.get_request_body_api(), responses=result.get_api_response(ParagraphSerializers.Problem.get_response_body_api()), - tags=["知识库/文档/段落"]) + tags=[_('Knowledge Base/Documentation/Paragraph')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -72,12 +73,12 @@ class Paragraph(APIView): request.data, with_valid=True)) @action(methods=['GET'], detail=False) - @swagger_auto_schema(operation_summary="获取段落问题列表", - operation_id="获取段落问题列表", + @swagger_auto_schema(operation_summary=_('Get a list of paragraph questions'), + operation_id=_('Get a list of paragraph questions'), manual_parameters=ParagraphSerializers.Problem.get_request_params_api(), responses=result.get_api_array_response( ParagraphSerializers.Problem.get_response_body_api()), - tags=["知识库/文档/段落"]) + tags=[_('Knowledge Base/Documentation/Paragraph')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) @@ -90,11 +91,11 @@ class Paragraph(APIView): authentication_classes = [TokenAuth] @action(methods=['PUT'], detail=False) - @swagger_auto_schema(operation_summary="解除关联问题", - operation_id="解除关联问题", + @swagger_auto_schema(operation_summary=_('Disassociation issue'), + operation_id=_('Disassociation issue'), manual_parameters=ParagraphSerializers.Association.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库/文档/段落"]) + tags=[_('Knowledge Base/Documentation/Paragraph')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -107,11 +108,11 @@ class Paragraph(APIView): authentication_classes = [TokenAuth] @action(methods=['PUT'], detail=False) - @swagger_auto_schema(operation_summary="关联问题", - operation_id="关联问题", + @swagger_auto_schema(operation_summary=_('Related questions'), + operation_id=_('Related questions'), manual_parameters=ParagraphSerializers.Association.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库/文档/段落"]) + tags=[_('Knowledge Base/Documentation/Paragraph')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -124,12 +125,12 @@ class Paragraph(APIView): authentication_classes = [TokenAuth] @action(methods=['UPDATE'], detail=False) - @swagger_auto_schema(operation_summary="修改段落数据", - operation_id="修改段落数据", + @swagger_auto_schema(operation_summary=_('Modify paragraph data'), + operation_id=_('Modify paragraph data'), manual_parameters=ParagraphSerializers.Operate.get_request_params_api(), request_body=ParagraphSerializers.Operate.get_request_body_api(), responses=result.get_api_response(ParagraphSerializers.Operate.get_response_body_api()) - , tags=["知识库/文档/段落"]) + , tags=[_('Knowledge Base/Documentation/Paragraph')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -140,11 +141,11 @@ class Paragraph(APIView): return result.success(o.edit(request.data)) @action(methods=['UPDATE'], detail=False) - @swagger_auto_schema(operation_summary="获取段落详情", - operation_id="获取段落详情", + @swagger_auto_schema(operation_summary=_('Get paragraph details'), + operation_id=_('Get paragraph details'), manual_parameters=ParagraphSerializers.Operate.get_request_params_api(), responses=result.get_api_response(ParagraphSerializers.Operate.get_response_body_api()), - tags=["知识库/文档/段落"]) + tags=[_('Knowledge Base/Documentation/Paragraph')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) @@ -155,11 +156,11 @@ class Paragraph(APIView): return result.success(o.one()) @action(methods=['DELETE'], detail=False) - @swagger_auto_schema(operation_summary="删除段落", - operation_id="删除段落", + @swagger_auto_schema(operation_summary=_('Delete paragraph'), + operation_id=_('Delete paragraph'), manual_parameters=ParagraphSerializers.Operate.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库/文档/段落"]) + tags=[_('Knowledge Base/Documentation/Paragraph')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -173,13 +174,13 @@ class Paragraph(APIView): authentication_classes = [TokenAuth] @action(methods=['DELETE'], detail=False) - @swagger_auto_schema(operation_summary="批量删除段落", - operation_id="批量删除段落", + @swagger_auto_schema(operation_summary=_('Delete paragraphs in batches'), + operation_id=_('Delete paragraphs in batches'), request_body= BatchSerializer.get_request_body_api(), manual_parameters=ParagraphSerializers.Create.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库/文档/段落"]) + tags=[_('Knowledge Base/Documentation/Paragraph')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -191,12 +192,12 @@ class Paragraph(APIView): authentication_classes = [TokenAuth] @action(methods=['PUT'], detail=False) - @swagger_auto_schema(operation_summary="批量迁移段落", - operation_id="批量迁移段落", + @swagger_auto_schema(operation_summary=_('Migrate paragraphs in batches'), + operation_id=_('Migrate paragraphs in batches'), manual_parameters=ParagraphSerializers.Migrate.get_request_params_api(), request_body=ParagraphSerializers.Migrate.get_request_body_api(), responses=result.get_default_response(), - tags=["知识库/文档/段落"] + tags=[_('Knowledge Base/Documentation/Paragraph')] ) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, @@ -217,12 +218,12 @@ class Paragraph(APIView): authentication_classes = [TokenAuth] @action(methods=['GET'], detail=False) - @swagger_auto_schema(operation_summary="分页获取段落列表", - operation_id="分页获取段落列表", + @swagger_auto_schema(operation_summary=_('Get paragraph list by pagination'), + operation_id=_('Get paragraph list by pagination'), manual_parameters=result.get_page_request_params( ParagraphSerializers.Query.get_request_params_api()), responses=result.get_page_api_response(ParagraphSerializers.Query.get_response_body_api()), - tags=["知识库/文档/段落"]) + tags=[_('Knowledge Base/Documentation/Paragraph')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) diff --git a/apps/dataset/views/problem.py b/apps/dataset/views/problem.py index 1d0ccb53b..64e1be461 100644 --- a/apps/dataset/views/problem.py +++ b/apps/dataset/views/problem.py @@ -17,17 +17,18 @@ from common.response import result from common.util.common import query_params_to_single_dict from dataset.serializers.problem_serializers import ProblemSerializers from dataset.swagger_api.problem_api import ProblemApi +from django.utils.translation import gettext_lazy as _ class Problem(APIView): authentication_classes = [TokenAuth] @action(methods=['GET'], detail=False) - @swagger_auto_schema(operation_summary="问题列表", - operation_id="问题列表", + @swagger_auto_schema(operation_summary=_('Question list'), + operation_id=_('Question list'), manual_parameters=ProblemApi.Query.get_request_params_api(), responses=result.get_api_array_response(ProblemApi.get_response_body_api()), - tags=["知识库/文档/段落/问题"] + tags=[_('Knowledge Base/Documentation/Paragraph/Question')] ) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, @@ -39,12 +40,12 @@ class Problem(APIView): return result.success(q.list()) @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="创建问题", - operation_id="创建问题", + @swagger_auto_schema(operation_summary=_('Create question'), + operation_id=_('Create question'), manual_parameters=ProblemApi.BatchCreate.get_request_params_api(), request_body=ProblemApi.BatchCreate.get_request_body_api(), responses=result.get_api_response(ProblemApi.Query.get_response_body_api()), - tags=["知识库/文档/段落/问题"]) + tags=[_('Knowledge Base/Documentation/Paragraph/Question')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -57,11 +58,11 @@ class Problem(APIView): authentication_classes = [TokenAuth] @action(methods=['GET'], detail=False) - @swagger_auto_schema(operation_summary="获取关联段落列表", - operation_id="获取关联段落列表", + @swagger_auto_schema(operation_summary=_('Get a list of associated paragraphs'), + operation_id=_('Get a list of associated paragraphs'), manual_parameters=ProblemApi.Paragraph.get_request_params_api(), responses=result.get_api_array_response(ProblemApi.Paragraph.get_response_body_api()), - tags=["知识库/文档/段落/问题"]) + tags=[_('Knowledge Base/Documentation/Paragraph/Question')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) @@ -74,13 +75,13 @@ class Problem(APIView): authentication_classes = [TokenAuth] @action(methods=['DELETE'], detail=False) - @swagger_auto_schema(operation_summary="批量删除问题", - operation_id="批量删除问题", + @swagger_auto_schema(operation_summary=_('Batch deletion issues'), + operation_id=_('Batch deletion issues'), request_body= ProblemApi.BatchOperate.get_request_body_api(), manual_parameters=ProblemApi.BatchOperate.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库/文档/段落/问题"]) + tags=[_('Knowledge Base/Documentation/Paragraph/Question')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -89,12 +90,12 @@ class Problem(APIView): ProblemSerializers.BatchOperate(data={'dataset_id': dataset_id}).delete(request.data)) @action(methods=['POST'], detail=False) - @swagger_auto_schema(operation_summary="批量关联段落", - operation_id="批量关联段落", + @swagger_auto_schema(operation_summary=_('Batch associated paragraphs'), + operation_id=_('Batch associated paragraphs'), request_body=ProblemApi.BatchAssociation.get_request_body_api(), manual_parameters=ProblemApi.BatchOperate.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库/文档/段落/问题"]) + tags=[_('Knowledge Base/Documentation/Paragraph/Question')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -106,11 +107,11 @@ class Problem(APIView): authentication_classes = [TokenAuth] @action(methods=['DELETE'], detail=False) - @swagger_auto_schema(operation_summary="删除问题", - operation_id="删除问题", + @swagger_auto_schema(operation_summary=_('Delete question'), + operation_id=_('Delete question'), manual_parameters=ProblemApi.Operate.get_request_params_api(), responses=result.get_default_response(), - tags=["知识库/文档/段落/问题"]) + tags=[_('Knowledge Base/Documentation/Paragraph/Question')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -120,12 +121,12 @@ class Problem(APIView): 'problem_id': problem_id}).delete()) @action(methods=['PUT'], detail=False) - @swagger_auto_schema(operation_summary="修改问题", - operation_id="修改问题", + @swagger_auto_schema(operation_summary=_('Modify question'), + operation_id=_('Modify question'), manual_parameters=ProblemApi.Operate.get_request_params_api(), request_body=ProblemApi.Operate.get_request_body_api(), responses=result.get_api_response(ProblemApi.get_response_body_api()), - tags=["知识库/文档/段落/问题"]) + tags=[_('Knowledge Base/Documentation/Paragraph/Question')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) @@ -138,12 +139,12 @@ class Problem(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 questions by page'), + operation_id=_('Get the list of questions by page'), manual_parameters=result.get_page_request_params( ProblemApi.Query.get_request_params_api()), responses=result.get_page_api_response(ProblemApi.get_response_body_api()), - tags=["知识库/文档/段落/问题"]) + tags=[_('Knowledge Base/Documentation/Paragraph/Question')]) @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) diff --git a/apps/setting/models_provider/impl/anthropic_model_provider/credential/image.py b/apps/setting/models_provider/impl/anthropic_model_provider/credential/image.py index 0a380acbb..a8342d861 100644 --- a/apps/setting/models_provider/impl/anthropic_model_provider/credential/image.py +++ b/apps/setting/models_provider/impl/anthropic_model_provider/credential/image.py @@ -9,9 +9,12 @@ from common import forms from common.exception.app_exception import AppApiException from common.forms import BaseForm, TooltipLabel from setting.models_provider.base_model_provider import BaseModelCredential, ValidCode +from django.utils.translation import gettext_lazy as _ + class AnthropicImageModelParams(BaseForm): - temperature = forms.SliderField(TooltipLabel('温度', '较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定'), + temperature = forms.SliderField(TooltipLabel(_('Temperature'), + _('Higher values make the output more random, while lower values make it more focused and deterministic')), required=True, default_value=0.7, _min=0.1, _max=1.0, @@ -19,7 +22,8 @@ class AnthropicImageModelParams(BaseForm): precision=2) max_tokens = forms.SliderField( - TooltipLabel('输出最大Tokens', '指定模型可生成的最大token个数'), + TooltipLabel(_('Output the maximum Tokens'), + _('Specify the maximum number of tokens that the model can generate')), required=True, default_value=800, _min=1, _max=100000, @@ -27,33 +31,33 @@ class AnthropicImageModelParams(BaseForm): precision=0) - class AnthropicImageModelCredential(BaseForm, BaseModelCredential): - api_base = forms.TextInputField('API 域名', required=True) - api_key = forms.PasswordInputField('API Key', required=True) + api_base = forms.TextInputField(_('API Url'), required=True) + api_key = forms.PasswordInputField(_('API Key'), required=True) def is_valid(self, model_type: str, model_name, model_credential: Dict[str, object], model_params, provider, raise_exception=False): model_type_list = provider.get_model_type_list() if not any(list(filter(lambda mt: mt.get('value') == model_type, model_type_list))): - raise AppApiException(ValidCode.valid_error.value, f'{model_type} 模型类型不支持') + raise AppApiException(ValidCode.valid_error.value, _('{model_type} Model type is not supported').format(model_type=model_type)) for key in ['api_base', 'api_key']: if key not in model_credential: if raise_exception: - raise AppApiException(ValidCode.valid_error.value, f'{key} 字段为必填字段') + raise AppApiException(ValidCode.valid_error.value, _('{key} is required').format(key=key)) else: return False try: model = provider.get_model(model_type, model_name, model_credential) - res = model.stream([HumanMessage(content=[{"type": "text", "text": "你好"}])]) + res = model.stream([HumanMessage(content=[{"type": "text", "text": _("Hello")}])]) for chunk in res: print(chunk) except Exception as e: if isinstance(e, AppApiException): raise e if raise_exception: - raise AppApiException(ValidCode.valid_error.value, f'校验失败,请检查参数是否正确: {str(e)}') + raise AppApiException(ValidCode.valid_error.value, _('Verification failed, please check whether the parameters are correct: {error}').format( + error=str(e))) else: return False return True diff --git a/apps/setting/models_provider/impl/anthropic_model_provider/credential/llm.py b/apps/setting/models_provider/impl/anthropic_model_provider/credential/llm.py index 2abf1ff77..46f21931e 100644 --- a/apps/setting/models_provider/impl/anthropic_model_provider/credential/llm.py +++ b/apps/setting/models_provider/impl/anthropic_model_provider/credential/llm.py @@ -14,10 +14,12 @@ from common import forms from common.exception.app_exception import AppApiException from common.forms import BaseForm, TooltipLabel from setting.models_provider.base_model_provider import BaseModelCredential, ValidCode +from django.utils.translation import gettext_lazy as _ class AnthropicLLMModelParams(BaseForm): - temperature = forms.SliderField(TooltipLabel('温度', '较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定'), + temperature = forms.SliderField(TooltipLabel(_('Temperature'), + _('Higher values make the output more random, while lower values make it more focused and deterministic')), required=True, default_value=0.7, _min=0.1, _max=1.0, @@ -25,7 +27,8 @@ class AnthropicLLMModelParams(BaseForm): precision=2) max_tokens = forms.SliderField( - TooltipLabel('输出最大Tokens', '指定模型可生成的最大token个数'), + TooltipLabel(_('Output the maximum Tokens'), + _('Specify the maximum number of tokens that the model can generate')), required=True, default_value=800, _min=1, _max=100000, @@ -39,22 +42,25 @@ class AnthropicLLMModelCredential(BaseForm, BaseModelCredential): raise_exception=False): model_type_list = provider.get_model_type_list() if not any(list(filter(lambda mt: mt.get('value') == model_type, model_type_list))): - raise AppApiException(ValidCode.valid_error.value, f'{model_type} 模型类型不支持') + raise AppApiException(ValidCode.valid_error.value, + _('{model_type} Model type is not supported').format(model_type=model_type)) for key in ['api_base', 'api_key']: if key not in model_credential: if raise_exception: - raise AppApiException(ValidCode.valid_error.value, f'{key} 字段为必填字段') + raise AppApiException(ValidCode.valid_error.value, _('{key} is required').format(key=key)) else: return False try: model = provider.get_model(model_type, model_name, model_credential) - model.invoke([HumanMessage(content='你好')]) + model.invoke([HumanMessage(content=_('Hello'))]) except Exception as e: if isinstance(e, AppApiException): raise e if raise_exception: - raise AppApiException(ValidCode.valid_error.value, f'校验失败,请检查参数是否正确: {str(e)}') + raise AppApiException(ValidCode.valid_error.value, + _('Verification failed, please check whether the parameters are correct: {error}').format( + error=str(e))) else: return False return True @@ -62,8 +68,8 @@ class AnthropicLLMModelCredential(BaseForm, BaseModelCredential): def encryption_dict(self, model: Dict[str, object]): return {**model, 'api_key': super().encryption(model.get('api_key', ''))} - api_base = forms.TextInputField('API 域名', required=True) - api_key = forms.PasswordInputField('API Key', required=True) + api_base = forms.TextInputField(_('API Url'), required=True) + api_key = forms.PasswordInputField(_('API Key'), required=True) def get_model_params_setting_form(self, model_name): return AnthropicLLMModelParams()