Skip to content

Commit a012b37

Browse files
committed
feat: application i18n
1 parent 2f01708 commit a012b37

File tree

34 files changed

+916
-792
lines changed

34 files changed

+916
-792
lines changed

apps/application/chat_pipeline/step/chat_step/i_chat_step.py

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from abc import abstractmethod
1010
from typing import Type, List
1111

12+
from django.utils.translation import gettext_lazy as _
1213
from langchain.chat_models.base import BaseChatModel
1314
from langchain.schema import BaseMessage
1415
from rest_framework import serializers
@@ -23,7 +24,7 @@
2324
class ModelField(serializers.Field):
2425
def to_internal_value(self, data):
2526
if not isinstance(data, BaseChatModel):
26-
self.fail('模型类型错误', value=data)
27+
self.fail(_('Model type error'), value=data)
2728
return data
2829

2930
def to_representation(self, value):
@@ -33,7 +34,7 @@ def to_representation(self, value):
3334
class MessageField(serializers.Field):
3435
def to_internal_value(self, data):
3536
if not isinstance(data, BaseMessage):
36-
self.fail('message类型错误', value=data)
37+
self.fail(_('Message type error'), value=data)
3738
return data
3839

3940
def to_representation(self, value):
@@ -52,37 +53,37 @@ class IChatStep(IBaseChatPipelineStep):
5253
class InstanceSerializer(serializers.Serializer):
5354
# 对话列表
5455
message_list = serializers.ListField(required=True, child=MessageField(required=True),
55-
error_messages=ErrMessage.list("对话列表"))
56-
model_id = serializers.UUIDField(required=False, allow_null=True, error_messages=ErrMessage.uuid("模型id"))
56+
error_messages=ErrMessage.list(_("Conversation list")))
57+
model_id = serializers.UUIDField(required=False, allow_null=True, error_messages=ErrMessage.uuid(_("Model id")))
5758
# 段落列表
58-
paragraph_list = serializers.ListField(error_messages=ErrMessage.list("段落列表"))
59+
paragraph_list = serializers.ListField(error_messages=ErrMessage.list(_("Paragraph List")))
5960
# 对话id
60-
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话id"))
61+
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("Conversation ID")))
6162
# 用户问题
62-
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.uuid("用户问题"))
63+
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.uuid(_("User Questions")))
6364
# 后置处理器
6465
post_response_handler = InstanceField(model_type=PostResponseHandler,
65-
error_messages=ErrMessage.base("用户问题"))
66+
error_messages=ErrMessage.base(_("Post-processor")))
6667
# 补全问题
67-
padding_problem_text = serializers.CharField(required=False, error_messages=ErrMessage.base("补全问题"))
68+
padding_problem_text = serializers.CharField(required=False, error_messages=ErrMessage.base(_("Completion Question")))
6869
# 是否使用流的形式输出
69-
stream = serializers.BooleanField(required=False, error_messages=ErrMessage.base("流式输出"))
70-
client_id = serializers.CharField(required=True, error_messages=ErrMessage.char("客户端id"))
71-
client_type = serializers.CharField(required=True, error_messages=ErrMessage.char("客户端类型"))
70+
stream = serializers.BooleanField(required=False, error_messages=ErrMessage.base(_("Streaming Output")))
71+
client_id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Client id")))
72+
client_type = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Client Type")))
7273
# 未查询到引用分段
73-
no_references_setting = NoReferencesSetting(required=True, error_messages=ErrMessage.base("无引用分段设置"))
74+
no_references_setting = NoReferencesSetting(required=True, error_messages=ErrMessage.base(_("No reference segment settings")))
7475

75-
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
76+
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
7677

7778
model_params_setting = serializers.DictField(required=False, allow_null=True,
78-
error_messages=ErrMessage.dict("模型参数设置"))
79+
error_messages=ErrMessage.dict(_("Model parameter settings")))
7980

8081
def is_valid(self, *, raise_exception=False):
8182
super().is_valid(raise_exception=True)
8283
message_list: List = self.initial_data.get('message_list')
8384
for message in message_list:
8485
if not isinstance(message, BaseMessage):
85-
raise Exception("message 类型错误")
86+
raise Exception(_("message type error"))
8687

8788
def get_step_serializer(self, manage: PipelineManage) -> Type[serializers.Serializer]:
8889
return self.InstanceSerializer

apps/application/chat_pipeline/step/chat_step/impl/base_chat_step.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from application.models.api_key_model import ApplicationPublicAccessClient
2727
from common.constants.authentication_type import AuthenticationType
2828
from setting.models_provider.tools import get_model_instance_by_model_user_id
29+
from django.utils.translation import gettext_lazy as _
2930

3031

3132
def add_access_num(client_id=None, client_type=None, application_id=None):
@@ -172,7 +173,8 @@ def get_stream_result(message_list: List[BaseMessage],
172173
return iter(
173174
[AIMessageChunk(content=no_references_setting.get('value').replace('{question}', problem_text))]), False
174175
if chat_model is None:
175-
return iter([AIMessageChunk('抱歉,没有配置 AI 模型,请先去应用中设置 AI 模型。')]), False
176+
return iter([AIMessageChunk(
177+
_('Sorry, the AI model is not configured. Please go to the application to set up the AI model first.'))]), False
176178
else:
177179
return chat_model.stream(message_list), True
178180

@@ -216,7 +218,7 @@ def get_block_result(message_list: List[BaseMessage],
216218
'status') == 'designated_answer':
217219
return AIMessage(no_references_setting.get('value').replace('{question}', problem_text)), False
218220
if chat_model is None:
219-
return AIMessage('抱歉,没有配置 AI 模型,请先去应用中设置 AI 模型。'), False
221+
return AIMessage(_('Sorry, the AI model is not configured. Please go to the application to set up the AI model first.')), False
220222
else:
221223
return chat_model.invoke(message_list), True
222224

apps/application/chat_pipeline/step/generate_human_message_step/i_generate_human_message_step.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from abc import abstractmethod
1010
from typing import Type, List
1111

12+
from django.utils.translation import gettext_lazy as _
1213
from langchain.schema import BaseMessage
1314
from rest_framework import serializers
1415

@@ -23,26 +24,26 @@
2324
class IGenerateHumanMessageStep(IBaseChatPipelineStep):
2425
class InstanceSerializer(serializers.Serializer):
2526
# 问题
26-
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.char("问题"))
27+
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.char(_("question")))
2728
# 段落列表
2829
paragraph_list = serializers.ListField(child=InstanceField(model_type=ParagraphPipelineModel, required=True),
29-
error_messages=ErrMessage.list("段落列表"))
30+
error_messages=ErrMessage.list(_("Paragraph List")))
3031
# 历史对答
3132
history_chat_record = serializers.ListField(child=InstanceField(model_type=ChatRecord, required=True),
32-
error_messages=ErrMessage.list("历史对答"))
33+
error_messages=ErrMessage.list(_("History Questions")))
3334
# 多轮对话数量
34-
dialogue_number = serializers.IntegerField(required=True, error_messages=ErrMessage.integer("多轮对话数量"))
35+
dialogue_number = serializers.IntegerField(required=True, error_messages=ErrMessage.integer(_("Number of multi-round conversations")))
3536
# 最大携带知识库段落长度
3637
max_paragraph_char_number = serializers.IntegerField(required=True, error_messages=ErrMessage.integer(
37-
"最大携带知识库段落长度"))
38+
_("Maximum length of the knowledge base paragraph")))
3839
# 模板
39-
prompt = serializers.CharField(required=True, error_messages=ErrMessage.char("提示词"))
40+
prompt = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Prompt word")))
4041
system = serializers.CharField(required=False, allow_null=True, allow_blank=True,
41-
error_messages=ErrMessage.char("系统提示词(角色)"))
42+
error_messages=ErrMessage.char(_("System prompt words (role)")))
4243
# 补齐问题
43-
padding_problem_text = serializers.CharField(required=False, error_messages=ErrMessage.char("补齐问题"))
44+
padding_problem_text = serializers.CharField(required=False, error_messages=ErrMessage.char(_("Completion problem")))
4445
# 未查询到引用分段
45-
no_references_setting = NoReferencesSetting(required=True, error_messages=ErrMessage.base("无引用分段设置"))
46+
no_references_setting = NoReferencesSetting(required=True, error_messages=ErrMessage.base(_("No reference segment settings")))
4647

4748
def get_step_serializer(self, manage: PipelineManage) -> Type[serializers.Serializer]:
4849
return self.InstanceSerializer

apps/application/chat_pipeline/step/reset_problem_step/i_reset_problem_step.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,11 @@
99
from abc import abstractmethod
1010
from typing import Type, List
1111

12-
from langchain.chat_models.base import BaseChatModel
12+
from django.utils.translation import gettext_lazy as _
1313
from rest_framework import serializers
1414

1515
from application.chat_pipeline.I_base_chat_pipeline import IBaseChatPipelineStep
1616
from application.chat_pipeline.pipeline_manage import PipelineManage
17-
from application.chat_pipeline.step.chat_step.i_chat_step import ModelField
1817
from application.models import ChatRecord
1918
from common.field.common import InstanceField
2019
from common.util.field_message import ErrMessage
@@ -23,15 +22,16 @@
2322
class IResetProblemStep(IBaseChatPipelineStep):
2423
class InstanceSerializer(serializers.Serializer):
2524
# 问题文本
26-
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.float("问题文本"))
25+
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.float(_("question")))
2726
# 历史对答
2827
history_chat_record = serializers.ListField(child=InstanceField(model_type=ChatRecord, required=True),
29-
error_messages=ErrMessage.list("历史对答"))
28+
error_messages=ErrMessage.list(_("History Questions")))
3029
# 大语言模型
31-
model_id = serializers.UUIDField(required=False, allow_null=True, error_messages=ErrMessage.uuid("模型id"))
32-
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
30+
model_id = serializers.UUIDField(required=False, allow_null=True, error_messages=ErrMessage.uuid(_("Model id")))
31+
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
3332
problem_optimization_prompt = serializers.CharField(required=False, max_length=102400,
34-
error_messages=ErrMessage.char("问题补全提示词"))
33+
error_messages=ErrMessage.char(
34+
_("Question completion prompt")))
3535

3636
def get_step_serializer(self, manage: PipelineManage) -> Type[serializers.Serializer]:
3737
return self.InstanceSerializer

apps/application/chat_pipeline/step/reset_problem_step/impl/base_reset_problem_step.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@
1414
from application.models import ChatRecord
1515
from common.util.split_model import flat_map
1616
from setting.models_provider.tools import get_model_instance_by_model_user_id
17+
from django.utils.translation import gettext_lazy as _
1718

18-
prompt = (
19-
'()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在<data></data>标签中')
19+
prompt = _(
20+
"() contains the user's question. Answer the guessed user's question based on the context ({question}) Requirement: Output a complete question and put it in the <data></data> tag")
2021

2122

2223
class BaseResetProblemStep(IResetProblemStep):

apps/application/chat_pipeline/step/search_dataset_step/i_search_dataset_step.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from typing import List, Type
1212

1313
from django.core import validators
14+
from django.utils.translation import gettext_lazy as _
1415
from rest_framework import serializers
1516

1617
from application.chat_pipeline.I_base_chat_pipeline import IBaseChatPipelineStep, ParagraphPipelineModel
@@ -21,29 +22,30 @@
2122
class ISearchDatasetStep(IBaseChatPipelineStep):
2223
class InstanceSerializer(serializers.Serializer):
2324
# 原始问题文本
24-
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.char("问题"))
25+
problem_text = serializers.CharField(required=True, error_messages=ErrMessage.char(_("question")))
2526
# 系统补全问题文本
26-
padding_problem_text = serializers.CharField(required=False, error_messages=ErrMessage.char("系统补全问题文本"))
27+
padding_problem_text = serializers.CharField(required=False,
28+
error_messages=ErrMessage.char(_("System completes question text")))
2729
# 需要查询的数据集id列表
2830
dataset_id_list = serializers.ListField(required=True, child=serializers.UUIDField(required=True),
29-
error_messages=ErrMessage.list("数据集id列表"))
31+
error_messages=ErrMessage.list(_("Dataset id list")))
3032
# 需要排除的文档id
3133
exclude_document_id_list = serializers.ListField(required=True, child=serializers.UUIDField(required=True),
32-
error_messages=ErrMessage.list("排除的文档id列表"))
34+
error_messages=ErrMessage.list(_("List of document ids to exclude")))
3335
# 需要排除向量id
3436
exclude_paragraph_id_list = serializers.ListField(required=True, child=serializers.UUIDField(required=True),
35-
error_messages=ErrMessage.list("排除向量id列表"))
37+
error_messages=ErrMessage.list(_("List of exclusion vector ids")))
3638
# 需要查询的条数
3739
top_n = serializers.IntegerField(required=True,
38-
error_messages=ErrMessage.integer("引用分段数"))
40+
error_messages=ErrMessage.integer(_("Reference segment number")))
3941
# 相似度 0-1之间
4042
similarity = serializers.FloatField(required=True, max_value=1, min_value=0,
41-
error_messages=ErrMessage.float("引用分段数"))
43+
error_messages=ErrMessage.float(_("Similarity")))
4244
search_mode = serializers.CharField(required=True, validators=[
4345
validators.RegexValidator(regex=re.compile("^embedding|keywords|blend$"),
44-
message="类型只支持register|reset_password", code=500)
45-
], error_messages=ErrMessage.char("检索模式"))
46-
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
46+
message=_("The type only supports register|reset_password"), code=500)
47+
], error_messages=ErrMessage.char(_("Retrieval Mode")))
48+
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid(_("User ID")))
4749

4850
def get_step_serializer(self, manage: PipelineManage) -> Type[InstanceSerializer]:
4951
return self.InstanceSerializer

apps/application/chat_pipeline/step/search_dataset_step/impl/base_search_dataset_step.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
from typing import List, Dict
1111

1212
from django.db.models import QuerySet
13+
from django.utils.translation import gettext_lazy as _
14+
from rest_framework.utils.formatting import lazy_format
1315

1416
from application.chat_pipeline.I_base_chat_pipeline import ParagraphPipelineModel
1517
from application.chat_pipeline.step.search_dataset_step.i_search_dataset_step import ISearchDatasetStep
@@ -26,18 +28,19 @@
2628
def get_model_by_id(_id, user_id):
2729
model = QuerySet(Model).filter(id=_id).first()
2830
if model is None:
29-
raise Exception("模型不存在")
31+
raise Exception(_("Model does not exist"))
3032
if model.permission_type == 'PRIVATE' and str(model.user_id) != str(user_id):
31-
raise Exception(f"无权限使用此模型:{model.name}")
33+
message = lazy_format(_('No permission to use this model {model_name}'), model_name=model.name)
34+
raise Exception(message)
3235
return model
3336

3437

3538
def get_embedding_id(dataset_id_list):
3639
dataset_list = QuerySet(DataSet).filter(id__in=dataset_id_list)
3740
if len(set([dataset.embedding_mode_id for dataset in dataset_list])) > 1:
38-
raise Exception("关联知识库的向量模型不一致,无法召回分段。")
41+
raise Exception(_("The vector model of the associated knowledge base is inconsistent and the segmentation cannot be recalled."))
3942
if len(dataset_list) == 0:
40-
raise Exception("知识库设置错误,请重新设置知识库")
43+
raise Exception(_("The knowledge base setting is wrong, please reset the knowledge base"))
4144
return dataset_list[0].embedding_mode_id
4245

4346

apps/application/flow/step_node/ai_chat_step_node/i_chat_node.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,30 @@
88
"""
99
from typing import Type
1010

11+
from django.utils.translation import gettext_lazy as _
1112
from rest_framework import serializers
1213

1314
from application.flow.i_step_node import INode, NodeResult
1415
from common.util.field_message import ErrMessage
1516

1617

1718
class ChatNodeSerializer(serializers.Serializer):
18-
model_id = serializers.CharField(required=True, error_messages=ErrMessage.char("模型id"))
19+
model_id = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Model id")))
1920
system = serializers.CharField(required=False, allow_blank=True, allow_null=True,
20-
error_messages=ErrMessage.char("角色设定"))
21-
prompt = serializers.CharField(required=True, error_messages=ErrMessage.char("提示词"))
21+
error_messages=ErrMessage.char(_("Role Setting")))
22+
prompt = serializers.CharField(required=True, error_messages=ErrMessage.char(_("Prompt word")))
2223
# 多轮对话数量
23-
dialogue_number = serializers.IntegerField(required=True, error_messages=ErrMessage.integer("多轮对话数量"))
24+
dialogue_number = serializers.IntegerField(required=True, error_messages=ErrMessage.integer(
25+
_("Number of multi-round conversations")))
2426

25-
is_result = serializers.BooleanField(required=False, error_messages=ErrMessage.boolean('是否返回内容'))
27+
is_result = serializers.BooleanField(required=False,
28+
error_messages=ErrMessage.boolean(_('Whether to return content')))
2629

27-
model_params_setting = serializers.DictField(required=False, error_messages=ErrMessage.integer("模型参数相关设置"))
30+
model_params_setting = serializers.DictField(required=False,
31+
error_messages=ErrMessage.integer(_("Model parameter settings")))
2832

2933
dialogue_type = serializers.CharField(required=False, allow_blank=True, allow_null=True,
30-
error_messages=ErrMessage.char("上下文类型"))
34+
error_messages=ErrMessage.char(_("Context Type")))
3135

3236

3337
class IChatNode(INode):

0 commit comments

Comments
 (0)