Skip to content

Commit 4a8963b

Browse files
Merge branch 'v2' of https://github.com/maxkb-dev/maxkb into v2
2 parents 8e5f1bb + d268835 commit 4a8963b

File tree

75 files changed

+2483
-725
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+2483
-725
lines changed

apps/application/flow/step_node/form_node/impl/base_form_node.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,19 @@
1717
from application.flow.step_node.form_node.i_form_node import IFormNode
1818

1919

20+
def get_default_option(option_list, _type, value_field):
21+
if option_list is not None and len(option_list) > 0:
22+
default_value_list = [o.get(value_field) for o in option_list if o.get('default')]
23+
if len(default_value_list) == 0:
24+
return option_list[0].get(value_field)
25+
else:
26+
if _type == 'MultiSelect':
27+
return default_value_list
28+
else:
29+
return default_value_list[0]
30+
return []
31+
32+
2033
def write_context(step_variable: Dict, global_variable: Dict, node, workflow):
2134
if step_variable is not None:
2235
for key in step_variable:
@@ -44,6 +57,30 @@ def save_context(self, details, workflow_manage):
4457
for key in form_data:
4558
self.context[key] = form_data[key]
4659

60+
def reset_field(self, field):
61+
if ['SingleSelect', 'MultiSelect', 'RadioCard'].__contains__(field.get('input_type')):
62+
if field.get('assignment_method') == 'ref_variables':
63+
option_list = self.workflow_manage.get_reference_field(field.get('option_list')[0],
64+
field.get('option_list')[1:])
65+
field['option_list'] = option_list
66+
field['default_value'] = get_default_option(option_list, field.get('input_type'),
67+
field.get('value_field'))
68+
69+
reset_field = ['field', 'label', 'default_value']
70+
for f in reset_field:
71+
_value = field[f]
72+
if _value is None:
73+
continue
74+
if isinstance(_value, str):
75+
field[f] = self.workflow_manage.generate_prompt(_value)
76+
elif f == 'label':
77+
_label_value = _value.get('label')
78+
_value['label'] = self.workflow_manage.generate_prompt(_label_value)
79+
tooltip = _value.get('attrs').get('tooltip')
80+
if tooltip is not None:
81+
_value.get('attrs')['tooltip'] = self.workflow_manage.generate_prompt(tooltip)
82+
return field
83+
4784
def execute(self, form_field_list, form_content_format, form_data, **kwargs) -> NodeResult:
4885
if form_data is not None:
4986
self.context['is_submit'] = True
@@ -52,6 +89,7 @@ def execute(self, form_field_list, form_content_format, form_data, **kwargs) ->
5289
self.context[key] = form_data.get(key)
5390
else:
5491
self.context['is_submit'] = False
92+
form_field_list = [self.reset_field(field) for field in form_field_list]
5593
form_setting = {"form_field_list": form_field_list, "runtime_node_id": self.runtime_node_id,
5694
"chat_record_id": self.flow_params_serializer.data.get("chat_record_id"),
5795
"is_submit": self.context.get("is_submit", False)}
@@ -60,6 +98,7 @@ def execute(self, form_field_list, form_content_format, form_data, **kwargs) ->
6098
form_content_format = self.workflow_manage.reset_prompt(form_content_format)
6199
prompt_template = PromptTemplate.from_template(form_content_format, template_format='jinja2')
62100
value = prompt_template.format(form=form, context=context)
101+
63102
return NodeResult(
64103
{'result': value, 'form_field_list': form_field_list, 'form_content_format': form_content_format}, {},
65104
_write_context=write_context)

apps/application/flow/tools.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,20 @@ def get_reasoning_content(self, chunk):
6060
if not self.reasoning_content_is_end:
6161
self.reasoning_content_is_end = True
6262
self.content += self.all_content
63-
return {'content': self.all_content, 'reasoning_content': ''}
63+
return {'content': self.all_content,
64+
'reasoning_content': chunk.additional_kwargs.get('reasoning_content',
65+
'') if chunk.additional_kwargs else ''
66+
}
6467
else:
6568
if self.reasoning_content_is_start:
6669
self.reasoning_content_chunk += chunk.content
6770
reasoning_content_end_tag_prefix_index = self.reasoning_content_chunk.find(
6871
self.reasoning_content_end_tag_prefix)
6972
if self.reasoning_content_is_end:
7073
self.content += chunk.content
71-
return {'content': chunk.content, 'reasoning_content': ''}
74+
return {'content': chunk.content, 'reasoning_content': chunk.additional_kwargs.get('reasoning_content',
75+
'') if chunk.additional_kwargs else ''
76+
}
7277
# 是否包含结束
7378
if reasoning_content_end_tag_prefix_index > -1:
7479
if len(self.reasoning_content_chunk) - reasoning_content_end_tag_prefix_index >= self.reasoning_content_end_tag_len:
@@ -93,7 +98,9 @@ def get_reasoning_content(self, chunk):
9398
else:
9499
if self.reasoning_content_is_end:
95100
self.content += chunk.content
96-
return {'content': chunk.content, 'reasoning_content': ''}
101+
return {'content': chunk.content, 'reasoning_content': chunk.additional_kwargs.get('reasoning_content',
102+
'') if chunk.additional_kwargs else ''
103+
}
97104
else:
98105
# aaa
99106
result = {'content': '', 'reasoning_content': self.reasoning_content_chunk}

apps/common/constants/permission_constants.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ class Operate(Enum):
170170
TO_CHAT = "READ+TO_CHAT" # 去对话
171171
SETTING = "READ+SETTING" # 管理
172172
DOWNLOAD = "READ+DOWNLOAD" # 下载
173+
AUTH = "READ+AUTH"
173174

174175

175176
class RoleGroup(Enum):
@@ -335,6 +336,7 @@ def get_workspace_role(self):
335336
Operate.DD.value: _('Dingding'),
336337
Operate.WEIXIN_PUBLIC_ACCOUNT.value: _('Weixin Public Account'),
337338
Operate.ADD_KNOWLEDGE.value: _('Add to Knowledge Base'),
339+
Operate.AUTH.value:_('resource authorization'),
338340
Group.APPLICATION_OVERVIEW.value: _('Overview'),
339341
Group.APPLICATION_ACCESS.value: _('Application Access'),
340342
Group.APPLICATION_CHAT_USER.value: _('Dialogue users'),
@@ -481,6 +483,11 @@ class PermissionConstants(Enum):
481483
parent_group=[WorkspaceGroup.MODEL, UserGroup.MODEL],
482484
resource_permission_group_list=[ResourcePermissionConst.MODEL_MANGE]
483485
)
486+
MODEL_RESOURCE_AUTHORIZATION = Permission(
487+
group=Group.MODEL, operate=Operate.AUTH, role_list=[RoleConstants.ADMIN, RoleConstants.USER],
488+
parent_group=[WorkspaceGroup.MODEL, UserGroup.MODEL],
489+
resource_permission_group_list=[ResourcePermissionConst.MODEL_MANGE]
490+
)
484491
TOOL_READ = Permission(
485492
group=Group.TOOL, operate=Operate.READ, role_list=[RoleConstants.ADMIN, RoleConstants.USER],
486493
parent_group=[WorkspaceGroup.TOOL, UserGroup.TOOL],
@@ -520,6 +527,11 @@ class PermissionConstants(Enum):
520527
parent_group=[WorkspaceGroup.TOOL, UserGroup.TOOL],
521528
resource_permission_group_list=[ResourcePermissionConst.TOOL_MANGE]
522529
)
530+
TOOL_RESOURCE_AUTHORIZATION = Permission(
531+
group=Group.TOOL, operate=Operate.AUTH, role_list=[RoleConstants.ADMIN, RoleConstants.USER],
532+
parent_group=[WorkspaceGroup.TOOL, UserGroup.TOOL],
533+
resource_permission_group_list=[ResourcePermissionConst.TOOL_MANGE]
534+
)
523535
KNOWLEDGE_READ = Permission(
524536
group=Group.KNOWLEDGE, operate=Operate.READ, role_list=[RoleConstants.ADMIN, RoleConstants.USER],
525537
resource_permission_group_list=[ResourcePermissionConst.KNOWLEDGE_VIEW],
@@ -560,6 +572,11 @@ class PermissionConstants(Enum):
560572
resource_permission_group_list=[ResourcePermissionConst.KNOWLEDGE_MANGE],
561573
parent_group=[WorkspaceGroup.KNOWLEDGE, UserGroup.KNOWLEDGE]
562574
)
575+
KNOWLEDGE_RESOURCE_AUTHORIZATION = Permission(
576+
group=Group.KNOWLEDGE, operate=Operate.AUTH, role_list=[RoleConstants.ADMIN, RoleConstants.USER],
577+
resource_permission_group_list=[ResourcePermissionConst.KNOWLEDGE_MANGE],
578+
parent_group=[WorkspaceGroup.KNOWLEDGE, UserGroup.KNOWLEDGE]
579+
)
563580
KNOWLEDGE_DOCUMENT_READ = Permission(
564581
group=Group.KNOWLEDGE_DOCUMENT, operate=Operate.READ,
565582
role_list=[RoleConstants.ADMIN, RoleConstants.USER],
@@ -819,7 +836,11 @@ class PermissionConstants(Enum):
819836
parent_group=[WorkspaceGroup.APPLICATION, UserGroup.APPLICATION],
820837
resource_permission_group_list=[ResourcePermissionConst.APPLICATION_MANGE],
821838
)
822-
839+
APPLICATION_RESOURCE_AUTHORIZATION = Permission(group=Group.APPLICATION, operate=Operate.AUTH,
840+
role_list=[RoleConstants.ADMIN, RoleConstants.USER],
841+
parent_group=[WorkspaceGroup.APPLICATION, UserGroup.APPLICATION],
842+
resource_permission_group_list=[ResourcePermissionConst.APPLICATION_MANGE],
843+
)
823844
APPLICATION_OVERVIEW_READ = Permission(group=Group.APPLICATION_OVERVIEW, operate=Operate.READ,
824845
role_list=[RoleConstants.ADMIN, RoleConstants.USER],
825846
parent_group=[WorkspaceGroup.APPLICATION, UserGroup.APPLICATION],

apps/common/forms/radio_button_field.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from common.forms.base_field import BaseExecField, TriggerType
1212

1313

14-
class Radio(BaseExecField):
14+
class RadioButton(BaseExecField):
1515
"""
1616
下拉单选
1717
"""

apps/common/forms/radio_card_field.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from common.forms.base_field import BaseExecField, TriggerType
1212

1313

14-
class Radio(BaseExecField):
14+
class RadioCard(BaseExecField):
1515
"""
1616
下拉单选
1717
"""

apps/knowledge/serializers/paragraph.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,15 @@ def is_valid(self, *, raise_exception=True):
406406
def association(self, with_valid=True, with_embedding=True):
407407
if with_valid:
408408
self.is_valid(raise_exception=True)
409+
# 已关联则直接返回
410+
if QuerySet(ProblemParagraphMapping).filter(
411+
knowledge_id=self.data.get('knowledge_id'),
412+
document_id=self.data.get('document_id'),
413+
paragraph_id=self.data.get('paragraph_id'),
414+
problem_id=self.data.get('problem_id')
415+
).exists():
416+
return True
417+
409418
problem = QuerySet(Problem).filter(id=self.data.get("problem_id")).first()
410419
problem_paragraph_mapping = ProblemParagraphMapping(id=uuid.uuid7(),
411420
document_id=self.data.get('document_id'),

apps/locales/en_US/LC_MESSAGES/django.po

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8648,4 +8648,16 @@ msgid "Multiple dialects, supporting 23 dialects"
86488648
msgstr ""
86498649

86508650
msgid "This interface is used to recognize short audio files within 60 seconds. Supports Mandarin Chinese, English, Cantonese, Japanese, Vietnamese, Malay, Indonesian, Filipino, Thai, Portuguese, Turkish, Arabic, Hindi, French, German, and 23 Chinese dialects."
8651+
msgstr ""
8652+
8653+
msgid "CueWord"
8654+
msgstr ""
8655+
8656+
msgid "If not passed, the default value is What is this audio saying? Only answer the audio content"
8657+
msgstr ""
8658+
8659+
msgid "The Qwen Omni series model supports inputting multiple modalities of data, including video, audio, images, and text, and outputting audio and text."
8660+
msgstr ""
8661+
8662+
msgid "resource authorization"
86518663
msgstr ""

apps/locales/zh_CN/LC_MESSAGES/django.po

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8774,4 +8774,16 @@ msgid "Multiple dialects, supporting 23 dialects"
87748774
msgstr "多种方言,支持 23 种方言"
87758775

87768776
msgid "This interface is used to recognize short audio files within 60 seconds. Supports Mandarin Chinese, English, Cantonese, Japanese, Vietnamese, Malay, Indonesian, Filipino, Thai, Portuguese, Turkish, Arabic, Hindi, French, German, and 23 Chinese dialects."
8777-
msgstr "本接口用于识别 60 秒之内的短音频文件。支持中文普通话、英语、粤语、日语、越南语、马来语、印度尼西亚语、菲律宾语、泰语、葡萄牙语、土耳其语、阿拉伯语、印地语、法语、德语及 23 种汉语方言。"
8777+
msgstr "本接口用于识别 60 秒之内的短音频文件。支持中文普通话、英语、粤语、日语、越南语、马来语、印度尼西亚语、菲律宾语、泰语、葡萄牙语、土耳其语、阿拉伯语、印地语、法语、德语及 23 种汉语方言。"
8778+
8779+
msgid "CueWord"
8780+
msgstr "提示词"
8781+
8782+
msgid "If not passed, the default value is What is this audio saying? Only answer the audio content"
8783+
msgstr "如果未传递,默认值为 这段音频在说什么,只回答音频的内容"
8784+
8785+
msgid "The Qwen Omni series model supports inputting multiple modalities of data, including video, audio, images, and text, and outputting audio and text."
8786+
msgstr "Qwen-Omni 系列模型支持输入多种模态的数据,包括视频、音频、图片、文本,并输出音频与文本"
8787+
8788+
msgid "resource authorization"
8789+
msgstr "资源授权"

apps/locales/zh_Hant/LC_MESSAGES/django.po

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8774,4 +8774,16 @@ msgid "Multiple dialects, supporting 23 dialects"
87748774
msgstr "多種方言,支持 23 種方言"
87758775

87768776
msgid "This interface is used to recognize short audio files within 60 seconds. Supports Mandarin Chinese, English, Cantonese, Japanese, Vietnamese, Malay, Indonesian, Filipino, Thai, Portuguese, Turkish, Arabic, Hindi, French, German, and 23 Chinese dialects."
8777-
msgstr "本介面用於識別 60 秒之內的短音頻文件。支援中文普通話、英語、粵語、日語、越南語、馬來語、印度尼西亞語、菲律賓語、泰語、葡萄牙語、土耳其語、阿拉伯語、印地語、法語、德語及 23 種漢語方言。"
8777+
msgstr "本介面用於識別 60 秒之內的短音頻文件。支援中文普通話、英語、粵語、日語、越南語、馬來語、印度尼西亞語、菲律賓語、泰語、葡萄牙語、土耳其語、阿拉伯語、印地語、法語、德語及 23 種漢語方言。"
8778+
8779+
msgid "CueWord"
8780+
msgstr "提示詞"
8781+
8782+
msgid "If not passed, the default value is What is this audio saying? Only answer the audio content"
8783+
msgstr "如果未傳遞,預設值為這段音訊在說什麼,只回答音訊的內容"
8784+
8785+
msgid "The Qwen Omni series model supports inputting multiple modalities of data, including video, audio, images, and text, and outputting audio and text."
8786+
msgstr "Qwen-Omni系列模型支持輸入多種模態的數據,包括視頻、音訊、圖片、文字,並輸出音訊與文字"
8787+
8788+
msgid "resource authorization"
8789+
msgstr "資源授權"

apps/models_provider/impl/aliyun_bai_lian_model_provider/aliyun_bai_lian_model_provider.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
AliyunBaiLianEmbeddingCredential
1616
from models_provider.impl.aliyun_bai_lian_model_provider.credential.image import QwenVLModelCredential
1717
from models_provider.impl.aliyun_bai_lian_model_provider.credential.llm import BaiLianLLMModelCredential
18+
from models_provider.impl.aliyun_bai_lian_model_provider.credential.omni_stt import AliyunBaiLianOmiSTTModelCredential
1819
from models_provider.impl.aliyun_bai_lian_model_provider.credential.reranker import \
1920
AliyunBaiLianRerankerCredential
2021
from models_provider.impl.aliyun_bai_lian_model_provider.credential.stt import AliyunBaiLianSTTModelCredential
@@ -23,6 +24,7 @@
2324
from models_provider.impl.aliyun_bai_lian_model_provider.model.embedding import AliyunBaiLianEmbedding
2425
from models_provider.impl.aliyun_bai_lian_model_provider.model.image import QwenVLChatModel
2526
from models_provider.impl.aliyun_bai_lian_model_provider.model.llm import BaiLianChatModel
27+
from models_provider.impl.aliyun_bai_lian_model_provider.model.omni_stt import AliyunBaiLianOmiSpeechToText
2628
from models_provider.impl.aliyun_bai_lian_model_provider.model.reranker import AliyunBaiLianReranker
2729
from models_provider.impl.aliyun_bai_lian_model_provider.model.stt import AliyunBaiLianSpeechToText
2830
from models_provider.impl.aliyun_bai_lian_model_provider.model.tti import QwenTextToImageModel
@@ -33,6 +35,7 @@
3335
aliyun_bai_lian_model_credential = AliyunBaiLianRerankerCredential()
3436
aliyun_bai_lian_tts_model_credential = AliyunBaiLianTTSModelCredential()
3537
aliyun_bai_lian_stt_model_credential = AliyunBaiLianSTTModelCredential()
38+
aliyun_bai_lian_omi_stt_model_credential = AliyunBaiLianOmiSTTModelCredential()
3639
aliyun_bai_lian_embedding_model_credential = AliyunBaiLianEmbeddingCredential()
3740
aliyun_bai_lian_llm_model_credential = BaiLianLLMModelCredential()
3841
qwenvl_model_credential = QwenVLModelCredential()
@@ -73,7 +76,13 @@
7376
ModelInfo('qwen-plus', '', ModelTypeConst.LLM, aliyun_bai_lian_llm_model_credential,
7477
BaiLianChatModel),
7578
ModelInfo('qwen-max', '', ModelTypeConst.LLM, aliyun_bai_lian_llm_model_credential,
76-
BaiLianChatModel)
79+
BaiLianChatModel),
80+
ModelInfo('qwen-omni-turbo',
81+
_('The Qwen Omni series model supports inputting multiple modalities of data, including video, audio, images, and text, and outputting audio and text.'),
82+
ModelTypeConst.STT, aliyun_bai_lian_omi_stt_model_credential, AliyunBaiLianOmiSpeechToText),
83+
ModelInfo('qwen2.5-omni-7b',
84+
_('The Qwen Omni series model supports inputting multiple modalities of data, including video, audio, images, and text, and outputting audio and text.'),
85+
ModelTypeConst.STT, aliyun_bai_lian_omi_stt_model_credential, AliyunBaiLianOmiSpeechToText),
7786
]
7887

7988
module_info_vl_list = [

0 commit comments

Comments
 (0)