feat: dataset support i18n

This commit is contained in:
wxg0103 2025-01-13 16:38:28 +08:00 committed by wxg
parent c8dfe0fab0
commit 29688774c6
21 changed files with 718 additions and 635 deletions

View File

@ -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)

View File

@ -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')),
]

View File

@ -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)(?<!#)##### (?!#).*|(?<=^)(?<!#)##### (?!#).*"},
{'key': '######', 'value': "(?<=\\n)(?<!#)###### (?!#).*|(?<=^)(?<!#)###### (?!#).*"},
{'key': '-', 'value': '(?<! )- .*'},
{'key': '空格', 'value': '(?<! ) (?! )'},
{'key': '分号', 'value': '(?<!)(?!)'}, {'key': '逗号', 'value': '(?<!)(?!)'},
{'key': '句号', 'value': '(?<!。)。(?!。)'}, {'key': '回车', 'value': '(?<!\\n)\\n(?!\\n)'},
{'key': '空行', 'value': '(?<!\\n)\\n\\n(?!\\n)'}]
{'key': _('space'), 'value': '(?<! ) (?! )'},
{'key': _('semicolon'), 'value': '(?<!)(?!)'}, {'key': _('comma'), 'value': '(?<!)(?!)'},
{'key': _('period'), 'value': '(?<!。)。(?!。)'}, {'key': _('enter'), 'value': '(?<!\\n)\\n(?!\\n)'},
{'key': _('blank line'), 'value': '(?<!\\n)\\n\\n(?!\\n)'}]
class Batch(ApiMixin, serializers.Serializer):
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("知识库id"))
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('dataset id')))
@staticmethod
def get_request_body_api():
@ -1114,9 +1129,9 @@ class DocumentSerializers(ApiMixin, serializers.Serializer):
BatchSerializer(data=instance).is_valid(model=Document, raise_exception=True)
hit_handling_method = instance.get('hit_handling_method')
if hit_handling_method is None:
raise AppApiException(500, '命中处理方式必填')
raise AppApiException(500, _('Hit handling method is required'))
if hit_handling_method != 'optimization' and hit_handling_method != 'directly_return':
raise AppApiException(500, '命中处理方式必须为directly_return|optimization')
raise AppApiException(500, _('The hit processing method must be directly_return|optimization'))
self.is_valid(raise_exception=True)
document_id_list = instance.get("id_list")
hit_handling_method = instance.get('hit_handling_method')
@ -1140,13 +1155,13 @@ class DocumentSerializers(ApiMixin, serializers.Serializer):
pass
class GenerateRelated(ApiMixin, serializers.Serializer):
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("文档id"))
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('document id')))
def is_valid(self, *, raise_exception=False):
super().is_valid(raise_exception=True)
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 generate_related(self, model_id, prompt, with_valid=True):
if with_valid:
@ -1162,10 +1177,10 @@ class DocumentSerializers(ApiMixin, serializers.Serializer):
try:
generate_related_by_document_id.delay(document_id, model_id, prompt)
except AlreadyQueued as e:
raise AppApiException(500, "任务正在执行中,请勿重复下发")
raise AppApiException(500, _('The task is being executed, please do not send it again.'))
class BatchGenerateRelated(ApiMixin, serializers.Serializer):
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("知识库id"))
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('dataset id')))
def batch_generate_related(self, instance: Dict, with_valid=True):
if with_valid:

View File

@ -16,6 +16,7 @@ from common.exception.app_exception import NotFound404
from common.field.common import UploadedFileField
from common.util.field_message import ErrMessage
from dataset.models import File
from django.utils.translation import gettext_lazy as _
mime_types = {"html": "text/html", "htm": "text/html", "shtml": "text/html", "css": "text/css", "xml": "text/xml",
"gif": "image/gif", "jpeg": "image/jpeg", "jpg": "image/jpeg", "js": "application/javascript",
@ -55,7 +56,7 @@ mime_types = {"html": "text/html", "htm": "text/html", "shtml": "text/html", "cs
class FileSerializer(serializers.Serializer):
file = UploadedFileField(required=True, error_messages=ErrMessage.image("文件"))
file = UploadedFileField(required=True, error_messages=ErrMessage.image(_('file')))
meta = serializers.JSONField(required=False)
def upload(self, with_valid=True):
@ -76,7 +77,7 @@ class FileSerializer(serializers.Serializer):
file_id = self.data.get('id')
file = QuerySet(File).filter(id=file_id).first()
if file is None:
raise NotFound404(404, "不存在的文件")
raise NotFound404(404, _('File not found'))
# 如果是音频文件,直接返回文件流
file_type = file.file_name.split(".")[-1]
if file_type in ['mp3', 'wav', 'ogg', 'aac']:

View File

@ -16,10 +16,11 @@ from common.exception.app_exception import NotFound404
from common.field.common import UploadedImageField
from common.util.field_message import ErrMessage
from dataset.models import Image
from django.utils.translation import gettext_lazy as _
class ImageSerializer(serializers.Serializer):
image = UploadedImageField(required=True, error_messages=ErrMessage.image("图片"))
image = UploadedImageField(required=True, error_messages=ErrMessage.image(_('image')))
def upload(self, with_valid=True):
if with_valid:
@ -38,7 +39,7 @@ class ImageSerializer(serializers.Serializer):
image_id = self.data.get('id')
image = QuerySet(Image).filter(id=image_id).first()
if image is None:
raise NotFound404(404, "不存在的图片")
raise NotFound404(404, _('Image not found'))
if image.image_name.endswith('.svg'):
return HttpResponse(image.image, status=200, headers={'Content-Type': 'image/svg+xml'})
# gif

View File

@ -30,6 +30,7 @@ from embedding.task.embedding import embedding_by_problem as embedding_by_proble
delete_embedding_by_source, enable_embedding_by_paragraph, disable_embedding_by_paragraph, embedding_by_paragraph, \
delete_embedding_by_paragraph, delete_embedding_by_paragraph_ids, update_embedding_document_id
from dataset.task import generate_related_by_paragraph_id_list
from django.utils.translation import gettext_lazy as _
class ParagraphSerializer(serializers.ModelSerializer):
@ -43,17 +44,17 @@ class ParagraphInstanceSerializer(ApiMixin, serializers.Serializer):
"""
段落实例对象
"""
content = serializers.CharField(required=True, error_messages=ErrMessage.char("段落内容"),
content = serializers.CharField(required=True, error_messages=ErrMessage.char(_('content')),
max_length=102400,
min_length=1,
allow_null=True, allow_blank=True)
title = serializers.CharField(required=False, max_length=256, error_messages=ErrMessage.char("段落标题"),
title = serializers.CharField(required=False, max_length=256, error_messages=ErrMessage.char(_('section title')),
allow_null=True, allow_blank=True)
problem_list = ProblemInstanceSerializer(required=False, many=True)
is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.char("段落是否可用"))
is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.char(_('Is active')))
@staticmethod
def get_request_body_api():
@ -61,16 +62,16 @@ class ParagraphInstanceSerializer(ApiMixin, serializers.Serializer):
type=openapi.TYPE_OBJECT,
required=['content'],
properties={
'content': openapi.Schema(type=openapi.TYPE_STRING, max_length=4096, title="分段内容",
description="分段内容"),
'content': openapi.Schema(type=openapi.TYPE_STRING, max_length=4096, title=_('section content'),
description=_('section content')),
'title': openapi.Schema(type=openapi.TYPE_STRING, max_length=256, title="分段标题",
description="分段标题"),
'title': openapi.Schema(type=openapi.TYPE_STRING, max_length=256, title=_('section title'),
description=_('section title')),
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否可用", description="是否可用"),
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_('Is active'), description=_('Is active')),
'problem_list': openapi.Schema(type=openapi.TYPE_ARRAY, title='问题列表',
description="问题列表",
'problem_list': openapi.Schema(type=openapi.TYPE_ARRAY, title=_('problem list'),
description=_('problem list'),
items=ProblemInstanceSerializer.get_request_body_api())
}
)
@ -78,30 +79,30 @@ class ParagraphInstanceSerializer(ApiMixin, serializers.Serializer):
class EditParagraphSerializers(serializers.Serializer):
title = serializers.CharField(required=False, max_length=256, error_messages=ErrMessage.char(
"分段标题"), allow_null=True, allow_blank=True)
_('section title')), allow_null=True, allow_blank=True)
content = serializers.CharField(required=False, max_length=102400, allow_null=True, allow_blank=True,
error_messages=ErrMessage.char(
"分段内容"))
_('section title')))
problem_list = ProblemInstanceSerializer(required=False, many=True)
class ParagraphSerializers(ApiMixin, serializers.Serializer):
title = serializers.CharField(required=False, max_length=256, error_messages=ErrMessage.char(
"分段标题"), allow_null=True, allow_blank=True)
_('section title')), allow_null=True, allow_blank=True)
content = serializers.CharField(required=True, max_length=102400, error_messages=ErrMessage.char(
"分段内容"))
_('section title')))
class Problem(ApiMixin, serializers.Serializer):
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("知识库id"))
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('dataset id')))
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("文档id"))
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('document id')))
paragraph_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("段落id"))
paragraph_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('paragraph id')))
def is_valid(self, *, raise_exception=False):
super().is_valid(raise_exception=True)
if not QuerySet(Paragraph).filter(id=self.data.get('paragraph_id')).exists():
raise AppApiException(500, "段落id不存在")
raise AppApiException(500, _('Paragraph id does not exist'))
def list(self, with_valid=False):
"""
@ -130,7 +131,7 @@ class ParagraphSerializers(ApiMixin, serializers.Serializer):
problem.save()
if QuerySet(ProblemParagraphMapping).filter(dataset_id=self.data.get('dataset_id'), problem_id=problem.id,
paragraph_id=self.data.get('paragraph_id')).exists():
raise AppApiException(500, "已经关联,请勿重复关联")
raise AppApiException(500, _('Already associated, please do not associate again'))
problem_paragraph_mapping = ProblemParagraphMapping(id=uuid.uuid1(),
problem_id=problem.id,
document_id=self.data.get('document_id'),
@ -158,17 +159,17 @@ class ParagraphSerializers(ApiMixin, serializers.Serializer):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='知识库id'),
description=_('dataset id')),
openapi.Parameter(name='document_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='文档id'),
description=_('document id')),
openapi.Parameter(name='paragraph_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='段落id')]
description=_('paragraph id'))]
@staticmethod
def get_request_body_api():
@ -176,7 +177,7 @@ class ParagraphSerializers(ApiMixin, serializers.Serializer):
required=["content"],
properties={
'content': openapi.Schema(
type=openapi.TYPE_STRING, title="内容")
type=openapi.TYPE_STRING, title=_('content'),)
})
@staticmethod
@ -187,30 +188,30 @@ class ParagraphSerializers(ApiMixin, serializers.Serializer):
properties={
'id': openapi.Schema(type=openapi.TYPE_STRING, title="id",
description="id", default="xx"),
'content': openapi.Schema(type=openapi.TYPE_STRING, title="问题内容",
description="问题内容", default='问题内容'),
'hit_num': openapi.Schema(type=openapi.TYPE_INTEGER, title="命中数量", description="命中数量",
'content': openapi.Schema(type=openapi.TYPE_STRING, title=_('question content'),
description=_('question content'), default=_('question content')),
'hit_num': openapi.Schema(type=openapi.TYPE_INTEGER, title=_('hit num'), description=_('hit num'),
default=1),
'dataset_id': openapi.Schema(type=openapi.TYPE_STRING, title="知识库id",
description="知识库id", default='xxx'),
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间",
description="修改时间",
'dataset_id': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset id'),
description=_('dataset id'), default='xxx'),
'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"
)
}
)
class Association(ApiMixin, serializers.Serializer):
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("知识库id"))
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('dataset id')))
problem_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("问题id"))
problem_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('problem id')))
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("文档id"))
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('document id')))
paragraph_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("段落id"))
paragraph_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('paragraph id')))
def is_valid(self, *, raise_exception=True):
super().is_valid(raise_exception=True)
@ -218,9 +219,9 @@ class ParagraphSerializers(ApiMixin, serializers.Serializer):
paragraph_id = self.data.get('paragraph_id')
problem_id = self.data.get("problem_id")
if not QuerySet(Paragraph).filter(dataset_id=dataset_id, id=paragraph_id).exists():
raise AppApiException(500, "段落不存在")
raise AppApiException(500, _('Paragraph does not exist'))
if not QuerySet(Problem).filter(dataset_id=dataset_id, id=problem_id).exists():
raise AppApiException(500, "问题不存在")
raise AppApiException(500, _('Problem does not exist'))
def association(self, with_valid=True, with_embedding=True):
if with_valid:
@ -262,27 +263,27 @@ class ParagraphSerializers(ApiMixin, serializers.Serializer):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='知识库id'),
description=_('dataset id')),
openapi.Parameter(name='document_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='文档id')
description=_('document id'))
, openapi.Parameter(name='paragraph_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='段落id'),
description=_('paragraph id')),
openapi.Parameter(name='problem_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='问题id')
description=_('problem id'))
]
class Batch(serializers.Serializer):
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("知识库id"))
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("文档id"))
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('dataset id')))
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('document id')))
@transaction.atomic
def batch_delete(self, instance: Dict, with_valid=True):
@ -298,13 +299,13 @@ class ParagraphSerializers(ApiMixin, serializers.Serializer):
return True
class Migrate(ApiMixin, serializers.Serializer):
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("知识库id"))
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("文档id"))
target_dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("目标知识库id"))
target_document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("目标文档id"))
paragraph_id_list = serializers.ListField(required=True, error_messages=ErrMessage.char("段落列表"),
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('dataset id')))
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('document id')))
target_dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('target dataset id')))
target_document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('target document id')))
paragraph_id_list = serializers.ListField(required=True, error_messages=ErrMessage.char(_('paragraph id list')),
child=serializers.UUIDField(required=True,
error_messages=ErrMessage.uuid("段落id")))
error_messages=ErrMessage.uuid(_('paragraph id'))))
def is_valid(self, *, raise_exception=False):
super().is_valid(raise_exception=True)
@ -313,12 +314,14 @@ class ParagraphSerializers(ApiMixin, serializers.Serializer):
document_id = self.data.get('document_id')
target_document_id = self.data.get('target_document_id')
if document_id == target_document_id:
raise AppApiException(5000, "需要迁移的文档和目标文档一致")
raise AppApiException(5000, _('The document to be migrated is consistent with the target document'))
if len([document for document in document_list if str(document.id) == self.data.get('document_id')]) < 1:
raise AppApiException(5000, f"文档id不存在【{self.data.get('document_id')}")
raise AppApiException(5000, _('The document id does not exist [{document_id}]').format(
document_id=self.data.get('document_id')))
if len([document for document in document_list if
str(document.id) == self.data.get('target_document_id')]) < 1:
raise AppApiException(5000, f"目标文档id不存在【{self.data.get('target_document_id')}")
raise AppApiException(5000, _('The target document id does not exist [{document_id}]').format(
document_id=self.data.get('target_document_id')))
@transaction.atomic
def migrate(self, with_valid=True):
@ -420,22 +423,22 @@ class ParagraphSerializers(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')),
openapi.Parameter(name='target_dataset_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='目标知识库id'),
description=_('target dataset id')),
openapi.Parameter(name='target_document_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='目标知识库id')
description=_('target document id')),
]
@staticmethod
@ -443,25 +446,25 @@ class ParagraphSerializers(ApiMixin, serializers.Serializer):
return openapi.Schema(
type=openapi.TYPE_ARRAY,
items=openapi.Schema(type=openapi.TYPE_STRING),
title='段落id列表',
description="段落id列表"
title=_('paragraph id list'),
description=_('paragraph id list')
)
class Operate(ApiMixin, serializers.Serializer):
# 段落id
paragraph_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char(
"段落id"))
_('paragraph id')))
# 知识库id
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char(
"知识库id"))
_('dataset id')))
# 文档id
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char(
"文档id"))
_('document id')))
def is_valid(self, *, raise_exception=True):
super().is_valid(raise_exception=True)
if not QuerySet(Paragraph).filter(id=self.data.get('paragraph_id')).exists():
raise AppApiException(500, "段落id不存在")
raise AppApiException(500, _('Paragraph id does not exist'))
@staticmethod
def post_embedding(paragraph, instance, dataset_id):
@ -497,7 +500,7 @@ class ParagraphSerializers(ApiMixin, serializers.Serializer):
# 校验前端 携带过来的id
for update_problem in update_problem_list:
if not set([str(row.id) for row in problem_list]).__contains__(update_problem.get('id')):
raise AppApiException(500, update_problem.get('id') + '问题id不存在')
raise AppApiException(500, _('Problem id does not exist'))
# 对比需要删除的问题
delete_problem_list = list(filter(
lambda row: not [str(update_row.get('id')) for update_row in update_problem_list].__contains__(
@ -557,20 +560,20 @@ class ParagraphSerializers(ApiMixin, serializers.Serializer):
@staticmethod
def get_request_params_api():
return [openapi.Parameter(type=openapi.TYPE_STRING, in_=openapi.IN_PATH, name='paragraph_id',
description="段落id")]
description=_('paragraph id'))]
class Create(ApiMixin, serializers.Serializer):
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char(
"知识库id"))
_('dataset id')))
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)
if not QuerySet(Document).filter(id=self.data.get('document_id'),
dataset_id=self.data.get('dataset_id')).exists():
raise AppApiException(500, "文档id不正确")
raise AppApiException(500, _('The document id is incorrect'))
def save(self, instance: Dict, with_valid=True, with_embedding=True):
if with_valid:
@ -632,22 +635,22 @@ class ParagraphSerializers(ApiMixin, serializers.Serializer):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='知识库id'),
description=_('dataset id')),
openapi.Parameter(name='document_id', in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description="文档id")
description=_('document id'))
]
class Query(ApiMixin, serializers.Serializer):
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char(
"知识库id"))
_('dataset id')))
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.char(
"文档id"))
_('document id')))
title = serializers.CharField(required=False, error_messages=ErrMessage.char(
"段落标题"))
_('section title')))
content = serializers.CharField(required=False)
@ -675,17 +678,17 @@ class ParagraphSerializers(ApiMixin, serializers.Serializer):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='文档id'),
description=_('document id')),
openapi.Parameter(name='title',
in_=openapi.IN_QUERY,
type=openapi.TYPE_STRING,
required=False,
description='标题'),
description=_('title')),
openapi.Parameter(name='content',
in_=openapi.IN_QUERY,
type=openapi.TYPE_STRING,
required=False,
description='内容')
description=_('content'))
]
@staticmethod
@ -698,35 +701,35 @@ class ParagraphSerializers(ApiMixin, serializers.Serializer):
properties={
'id': openapi.Schema(type=openapi.TYPE_STRING, title="id",
description="id", default="xx"),
'content': openapi.Schema(type=openapi.TYPE_STRING, title="段落内容",
description="段落内容", default='段落内容'),
'title': openapi.Schema(type=openapi.TYPE_STRING, title="标题",
description="标题", default="xxx的描述"),
'hit_num': openapi.Schema(type=openapi.TYPE_INTEGER, title="命中数量", description="命中数量",
'content': openapi.Schema(type=openapi.TYPE_STRING, title=_('content'),
description=_('content'), default=_('content')),
'title': openapi.Schema(type=openapi.TYPE_STRING, title=_('title'),
description=_('title'), default="xxx"),
'hit_num': openapi.Schema(type=openapi.TYPE_INTEGER, title=_('hit num'), description=_('hit num'),
default=1),
'star_num': openapi.Schema(type=openapi.TYPE_INTEGER, title="点赞数量",
description="点赞数量", default=1),
'trample_num': openapi.Schema(type=openapi.TYPE_INTEGER, title="点踩数量",
description="点踩数", default=1),
'dataset_id': openapi.Schema(type=openapi.TYPE_STRING, title="知识库id",
description="知识库id", default='xxx'),
'document_id': openapi.Schema(type=openapi.TYPE_STRING, title="文档id",
description="文档id", default='xxx'),
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否可用",
description="是否可用", default=True),
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间",
description="修改时间",
'star_num': openapi.Schema(type=openapi.TYPE_INTEGER, title=_('Number of likes'),
description=_('Number of likes'), default=1),
'trample_num': openapi.Schema(type=openapi.TYPE_INTEGER, title=_('Number of dislikes'),
description=_('Number of dislikes'), default=1),
'dataset_id': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset id'),
description=_('dataset id'), default='xxx'),
'document_id': openapi.Schema(type=openapi.TYPE_STRING, title=_('document id'),
description=_('document id'), default='xxx'),
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_('Is active'),
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"
)
}
)
class BatchGenerateRelated(ApiMixin, serializers.Serializer):
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("知识库id"))
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("文档id"))
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('dataset id')))
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('document id')))
def batch_generate_related(self, instance: Dict, with_valid=True):
if with_valid:
@ -746,7 +749,7 @@ class ParagraphSerializers(ApiMixin, serializers.Serializer):
generate_related_by_paragraph_id_list.delay(document_id, paragraph_id_list, model_id,
prompt)
except AlreadyQueued as e:
raise AppApiException(500, "任务正在执行中,请勿重复下发")
raise AppApiException(500, _('The task is being executed, please do not send it again.'))
def delete_problems_and_mappings(paragraph_ids):

View File

@ -25,6 +25,7 @@ from dataset.serializers.common_serializers import get_embedding_model_id_by_dat
from embedding.models import SourceType
from embedding.task import delete_embedding_by_source_ids, update_problem_embedding, embedding_by_data_list
from smartdoc.conf import PROJECT_DIR
from django.utils.translation import gettext_lazy as _
class ProblemSerializer(serializers.ModelSerializer):
@ -35,9 +36,9 @@ class ProblemSerializer(serializers.ModelSerializer):
class ProblemInstanceSerializer(ApiMixin, serializers.Serializer):
id = serializers.CharField(required=False, error_messages=ErrMessage.char("问题id"))
id = serializers.CharField(required=False, error_messages=ErrMessage.char(_('problem id')))
content = serializers.CharField(required=True, max_length=256, error_messages=ErrMessage.char("问题内容"))
content = serializers.CharField(required=True, max_length=256, error_messages=ErrMessage.char(_('content')))
@staticmethod
def get_request_body_api():
@ -46,21 +47,21 @@ class ProblemInstanceSerializer(ApiMixin, serializers.Serializer):
properties={
'id': openapi.Schema(
type=openapi.TYPE_STRING,
title="问题id,修改的时候传递,创建的时候不传"),
title=_('Issue ID is passed when modifying, not when creating.')),
'content': openapi.Schema(
type=openapi.TYPE_STRING, title="内容")
type=openapi.TYPE_STRING, title=_('content'),)
})
class AssociationParagraph(serializers.Serializer):
paragraph_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("段落id"))
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("文档id"))
paragraph_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('paragraph id')))
document_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('document id')))
class BatchAssociation(serializers.Serializer):
problem_id_list = serializers.ListField(required=True, error_messages=ErrMessage.list("问题id列表"),
problem_id_list = serializers.ListField(required=True, error_messages=ErrMessage.list(_('problem id list')),
child=serializers.UUIDField(required=True,
error_messages=ErrMessage.uuid("问题id")))
error_messages=ErrMessage.uuid(_('problem id'))))
paragraph_list = AssociationParagraph(many=True)
@ -83,11 +84,11 @@ def to_problem_paragraph_mapping(problem, document_id: str, paragraph_id: str, d
class ProblemSerializers(ApiMixin, serializers.Serializer):
class Create(serializers.Serializer):
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("知识库id"))
problem_list = serializers.ListField(required=True, error_messages=ErrMessage.list("问题列表"),
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('dataset id')))
problem_list = serializers.ListField(required=True, error_messages=ErrMessage.list(_('problem list')),
child=serializers.CharField(required=True,
max_length=256,
error_messages=ErrMessage.char("问题")))
error_messages=ErrMessage.char(_('problem'))))
def batch(self, with_valid=True):
if with_valid:
@ -108,8 +109,8 @@ class ProblemSerializers(ApiMixin, serializers.Serializer):
return [ProblemSerializer(problem_instance).data for problem_instance in problem_instance_list]
class Query(serializers.Serializer):
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("知识库id"))
content = serializers.CharField(required=False, error_messages=ErrMessage.char("问题"))
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('dataset id')))
content = serializers.CharField(required=False, error_messages=ErrMessage.char(_('content')))
def get_query_set(self):
query_set = QuerySet(model=Problem)
@ -131,7 +132,7 @@ class ProblemSerializers(ApiMixin, serializers.Serializer):
os.path.join(PROJECT_DIR, "apps", "dataset", 'sql', 'list_problem.sql')))
class BatchOperate(serializers.Serializer):
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("知识库id"))
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('dataset id')))
def delete(self, problem_id_list: List, with_valid=True):
if with_valid:
@ -188,9 +189,9 @@ class ProblemSerializers(ApiMixin, serializers.Serializer):
embedding_by_data_list(data_list, model_id=model_id)
class Operate(serializers.Serializer):
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("知识库id"))
dataset_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('dataset id')))
problem_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("问题id"))
problem_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_('problem id')))
def list_paragraph(self, with_valid=True):
if with_valid:

View File

@ -9,6 +9,7 @@
from drf_yasg import openapi
from common.mixins.api_mixin import ApiMixin
from django.utils.translation import gettext_lazy as _
class DocumentApi(ApiMixin):
@ -19,11 +20,11 @@ class DocumentApi(ApiMixin):
type=openapi.TYPE_OBJECT,
properties={
'id_list': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_STRING),
title="主键id列表",
description="主键id列表"),
'hit_handling_method': openapi.Schema(type=openapi.TYPE_STRING, title="命中处理方式",
title=_('id list'),
description=_('id list')),
'hit_handling_method': openapi.Schema(type=openapi.TYPE_STRING, title=_('hit handling method'),
description="directly_return|optimization"),
'directly_return_similarity': openapi.Schema(type=openapi.TYPE_NUMBER, title="直接返回相似度")
'directly_return_similarity': openapi.Schema(type=openapi.TYPE_NUMBER, title=_('directly return similarity'))
}
)
@ -33,8 +34,8 @@ class DocumentApi(ApiMixin):
return openapi.Schema(
type=openapi.TYPE_OBJECT,
properties={
'type': openapi.Schema(type=openapi.TYPE_INTEGER, title="任务类型",
description="1|2|3 1:向量化|2:生成问题|3:同步文档")
'type': openapi.Schema(type=openapi.TYPE_INTEGER, title=_('task type'),
description=_('1|2|3 1:Vectorization|2:Generate issues|3:Synchronize documents'))
}
)
@ -45,10 +46,10 @@ class DocumentApi(ApiMixin):
type=openapi.TYPE_OBJECT,
properties={
'id_list': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_STRING),
title="文档id列表",
description="文档id列表"),
'type': openapi.Schema(type=openapi.TYPE_INTEGER, title="任务类型",
description="1|2|3 1:向量化|2:生成问题|3:同步文档", default=1)
title=_('id list'),
description=_('id list')),
'type': openapi.Schema(type=openapi.TYPE_INTEGER, title=_('task type'),
description=_('1|2|3 1:Vectorization|2:Generate issues|3:Synchronize documents'), default=1)
}
)
@ -60,7 +61,7 @@ class DocumentApi(ApiMixin):
properties={
'state_list': openapi.Schema(type=openapi.TYPE_ARRAY,
items=openapi.Schema(type=openapi.TYPE_STRING),
title="状态列表",
description="状态列表")
title=_('state list'),
description=_('state list'))
}
)

View File

@ -9,6 +9,7 @@
from drf_yasg import openapi
from common.mixins.api_mixin import ApiMixin
from django.utils.translation import gettext_lazy as _
class ImageApi(ApiMixin):
@ -18,5 +19,5 @@ class ImageApi(ApiMixin):
in_=openapi.IN_FORM,
type=openapi.TYPE_FILE,
required=True,
description='上传图片文件')
description=_('image file'))
]

View File

@ -9,6 +9,7 @@
from drf_yasg import openapi
from common.mixins.api_mixin import ApiMixin
from django.utils.translation import gettext_lazy as _
class ProblemApi(ApiMixin):
@ -20,17 +21,17 @@ class ProblemApi(ApiMixin):
properties={
'id': openapi.Schema(type=openapi.TYPE_STRING, title="id",
description="id", default="xx"),
'content': openapi.Schema(type=openapi.TYPE_STRING, title="问题内容",
description="问题内容", default='问题内容'),
'hit_num': openapi.Schema(type=openapi.TYPE_INTEGER, title="命中数量", description="命中数量",
'content': openapi.Schema(type=openapi.TYPE_STRING, title=_('content'),
description=_('content'), default=_('content')),
'hit_num': openapi.Schema(type=openapi.TYPE_INTEGER, title=_('hit num'), description=_('hit num'),
default=1),
'dataset_id': openapi.Schema(type=openapi.TYPE_STRING, title="知识库id",
description="知识库id", default='xxx'),
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间",
description="修改时间",
'dataset_id': openapi.Schema(type=openapi.TYPE_STRING, title=_('dataset id'),
description=_('dataset id'), default='xxx'),
'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"
)
}
@ -47,20 +48,20 @@ class ProblemApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=['problem_id_list'],
properties={
'problem_id_list': openapi.Schema(type=openapi.TYPE_ARRAY, title="问题id列表",
description="问题id列表",
'problem_id_list': openapi.Schema(type=openapi.TYPE_ARRAY, title=_('problem id list'),
description=_('problem id list'),
items=openapi.Schema(type=openapi.TYPE_STRING)),
'paragraph_list': openapi.Schema(type=openapi.TYPE_ARRAY, title="关联段落信息列表",
description="关联段落信息列表",
'paragraph_list': openapi.Schema(type=openapi.TYPE_ARRAY, title=_('Associated paragraph information list'),
description=_('Associated paragraph information list'),
items=openapi.Schema(type=openapi.TYPE_OBJECT,
required=['paragraph_id', 'document_id'],
properties={
'paragraph_id': openapi.Schema(
type=openapi.TYPE_STRING,
title="段落id"),
title=_('paragraph id')),
'document_id': openapi.Schema(
type=openapi.TYPE_STRING,
title="文档id")
title=_('document id'))
}))
}
@ -73,14 +74,14 @@ class ProblemApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='知识库id'),
description=_('dataset id')),
]
@staticmethod
def get_request_body_api():
return openapi.Schema(
title="问题id列表",
description="问题id列表",
title=_('problem id list'),
description=_('problem id list'),
type=openapi.TYPE_ARRAY,
items=openapi.Schema(type=openapi.TYPE_STRING)
)
@ -92,12 +93,12 @@ class ProblemApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='知识库id'),
description=_('dataset id')),
openapi.Parameter(name='problem_id',
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='问题id')]
description=_('problem id'))]
@staticmethod
def get_request_body_api():
@ -105,8 +106,8 @@ class ProblemApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=['content'],
properties={
'content': openapi.Schema(type=openapi.TYPE_STRING, title="问题内容",
description="问题内容"),
'content': openapi.Schema(type=openapi.TYPE_STRING, title=_('content'),
description=_('content')),
}
)
@ -122,17 +123,17 @@ class ProblemApi(ApiMixin):
type=openapi.TYPE_OBJECT,
required=['content'],
properties={
'content': openapi.Schema(type=openapi.TYPE_STRING, max_length=4096, title="分段内容",
description="分段内容"),
'title': openapi.Schema(type=openapi.TYPE_STRING, max_length=256, title="分段标题",
description="分段标题"),
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否可用", description="是否可用"),
'hit_num': openapi.Schema(type=openapi.TYPE_NUMBER, title="命中次数", description="命中次数"),
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间",
description="修改时间",
'content': openapi.Schema(type=openapi.TYPE_STRING, max_length=4096, title=_('content'),
description=_('content')),
'title': openapi.Schema(type=openapi.TYPE_STRING, max_length=256, title=_('Section title'),
description=_('Section title')),
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_('Is active'), description=_('Is active')),
'hit_num': openapi.Schema(type=openapi.TYPE_NUMBER, title=_('Hit num'), description=_('Hit num')),
'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"
),
}
@ -145,12 +146,12 @@ class ProblemApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='知识库id'),
description=_('dataset id')),
openapi.Parameter(name='content',
in_=openapi.IN_QUERY,
type=openapi.TYPE_STRING,
required=False,
description='问题')]
description=_('content')),]
class BatchCreate(ApiMixin):
@staticmethod
@ -165,7 +166,7 @@ class ProblemApi(ApiMixin):
class Create(ApiMixin):
@staticmethod
def get_request_body_api():
return openapi.Schema(type=openapi.TYPE_STRING, description="问题文本")
return openapi.Schema(type=openapi.TYPE_STRING, description=_('content'), title=_('content'))
@staticmethod
def get_request_params_api():
@ -173,4 +174,4 @@ class ProblemApi(ApiMixin):
in_=openapi.IN_PATH,
type=openapi.TYPE_STRING,
required=True,
description='知识库id')]
description=_('dataset id'))]

View File

@ -13,6 +13,7 @@ from dataset.task.tools import save_problem
from ops import celery_app
from setting.models import Model
from setting.models_provider import get_model
from django.utils.translation import gettext_lazy as _
max_kb_error = logging.getLogger("max_kb_error")
max_kb = logging.getLogger("max_kb")
@ -80,9 +81,11 @@ def generate_related_by_document_id(document_id, model_id, prompt):
page(QuerySet(Paragraph).filter(document_id=document_id), 10, generate_problem, is_the_task_interrupted)
except Exception as e:
max_kb_error.error(f'根据文档生成问题:{document_id}出现错误{str(e)}{traceback.format_exc()}')
max_kb_error.error(_('Generate issue based on document: {document_id} error {error}{traceback}').format(
document_id=document_id, error=str(e), traceback=traceback.format_exc()))
finally:
ListenerManagement.post_update_document_status(document_id, TaskType.GENERATE_PROBLEM)
max_kb.info(f"结束--->生成问题:{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']},

View File

@ -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')

View File

@ -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)))

View File

@ -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):

View File

@ -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')))

View File

@ -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()

View File

@ -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()

View File

@ -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')))

View File

@ -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')))

View File

@ -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

View File

@ -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()