Skip to content

Commit 5101670

Browse files
author
qingyangshao
committed
feat: CoresHub service is integrated into the platform.
1 parent f333658 commit 5101670

File tree

11 files changed

+535
-0
lines changed

11 files changed

+535
-0
lines changed

apps/setting/models_provider/constants/model_provider_constants.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from setting.models_provider.impl.qwen_model_provider.qwen_model_provider import QwenModelProvider
2222
from setting.models_provider.impl.siliconCloud_model_provider.siliconCloud_model_provider import \
2323
SiliconCloudModelProvider
24+
from setting.models_provider.impl.coreshub_model_provider.coreshub_model_provider import CoresHubModelProvider
2425
from setting.models_provider.impl.tencent_model_provider.tencent_model_provider import TencentModelProvider
2526
from setting.models_provider.impl.vllm_model_provider.vllm_model_provider import VllmModelProvider
2627
from setting.models_provider.impl.volcanic_engine_model_provider.volcanic_engine_model_provider import \
@@ -52,3 +53,4 @@ class ModelProvideConstants(Enum):
5253
aliyun_bai_lian_model_provider = AliyunBaiLianModelProvider()
5354
model_anthropic_provider = AnthropicModelProvider()
5455
model_siliconCloud_provider = SiliconCloudModelProvider()
56+
model_coreshub_provider = CoresHubModelProvider()
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# coding=utf-8
2+
"""
3+
@project: MaxKB
4+
@Author:Qingyang
5+
@file: __init__.py.py
6+
@date:2025/2/11 11:11
7+
@desc:
8+
"""
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# coding=utf-8
2+
"""
3+
@project: maxkb
4+
@Author:Qingyang
5+
@file: coreshub_model_provider.py
6+
@date:2025/2/11 12:11
7+
@desc:
8+
"""
9+
import os
10+
11+
from common.util.file_util import get_file_content
12+
from setting.models_provider.base_model_provider import IModelProvider, ModelProvideInfo, ModelInfo, \
13+
ModelTypeConst, ModelInfoManage
14+
from setting.models_provider.impl.coreshub_model_provider.credential.embedding import CoresHubEmbeddingCredential
15+
from setting.models_provider.impl.coreshub_model_provider.credential.llm import CoresHubLLMModelCredential
16+
from setting.models_provider.impl.coreshub_model_provider.model.llm import CoresHubChatModel
17+
from setting.models_provider.impl.coreshub_model_provider.model.embedding import CoresHubEmbeddingModel
18+
from setting.models_provider.impl.coreshub_model_provider.credential.tts import CoresHubTTSModelCredential
19+
from setting.models_provider.impl.coreshub_model_provider.credential.stt import CoresHubSTTModelCredential
20+
from setting.models_provider.impl.coreshub_model_provider.model.stt import CoresHubSpeechToText
21+
from setting.models_provider.impl.coreshub_model_provider.model.tts import CoresHubTextToSpeech
22+
from smartdoc.conf import PROJECT_DIR
23+
from django.utils.translation import gettext as _
24+
25+
coreshub_llm_model_credential = CoresHubLLMModelCredential()
26+
model_info_list = [
27+
ModelInfo('DeepSeek-V3', '', ModelTypeConst.LLM,
28+
coreshub_llm_model_credential, CoresHubChatModel
29+
),
30+
ModelInfo('DeepSeek-R1', '', ModelTypeConst.LLM,
31+
coreshub_llm_model_credential,
32+
CoresHubChatModel),
33+
ModelInfo('DeepSeek-R1-Distill-Llama-70B', '',
34+
ModelTypeConst.LLM, coreshub_llm_model_credential,
35+
CoresHubChatModel),
36+
ModelInfo('DeepSeek-R1-Distill-Qwen-32B',
37+
'',
38+
ModelTypeConst.LLM, coreshub_llm_model_credential,
39+
CoresHubChatModel),
40+
ModelInfo('DeepSeek-R1-Distill-Llama-70B', '',
41+
ModelTypeConst.LLM, coreshub_llm_model_credential,
42+
CoresHubChatModel),
43+
ModelInfo('DeepSeek-R1-Distill-Qwen-14B', '',
44+
ModelTypeConst.LLM, coreshub_llm_model_credential,
45+
CoresHubChatModel),
46+
ModelInfo('DeepSeek-R1-Distill-Llama-8B', '',
47+
ModelTypeConst.LLM, coreshub_llm_model_credential,
48+
CoresHubChatModel),
49+
ModelInfo('DeepSeek-R1-Distill-Qwen-7B', '',
50+
ModelTypeConst.LLM, coreshub_llm_model_credential,
51+
CoresHubChatModel),
52+
ModelInfo('DeepSeek-R1-Distill-Qwen-1.5B', '',
53+
ModelTypeConst.LLM, coreshub_llm_model_credential,
54+
CoresHubChatModel),
55+
ModelInfo('Qwen2-0.5B-Instruct', '',
56+
ModelTypeConst.LLM, coreshub_llm_model_credential,
57+
CoresHubChatModel)
58+
]
59+
60+
coreshub_embedding_credential = CoresHubEmbeddingCredential()
61+
model_info_embedding_list = [
62+
ModelInfo('bce-embedding-base_v1', '',
63+
ModelTypeConst.EMBEDDING, coreshub_embedding_credential,
64+
CoresHubEmbeddingModel)
65+
]
66+
67+
coreshub_stt_model_credential = CoresHubSTTModelCredential()
68+
model_info_stt_list = [
69+
ModelInfo('SenseVoiceSmall', '',
70+
ModelTypeConst.STT, coreshub_stt_model_credential,
71+
CoresHubSpeechToText)
72+
]
73+
74+
coreshub_tts_model_credential = CoresHubTTSModelCredential()
75+
model_info_tts_list = [
76+
ModelInfo('CosyVoice-300M', '',
77+
ModelTypeConst.TTS, coreshub_tts_model_credential,
78+
CoresHubTextToSpeech)
79+
]
80+
81+
model_info_manage = (
82+
ModelInfoManage.builder()
83+
.append_model_info_list(model_info_list)
84+
.append_default_model_info(model_info_list[0])
85+
.append_model_info_list(model_info_embedding_list)
86+
.append_default_model_info(model_info_embedding_list[0])
87+
.append_model_info_list(model_info_stt_list)
88+
.append_default_model_info(model_info_stt_list[0])
89+
.append_model_info_list(model_info_tts_list)
90+
.append_default_model_info(model_info_tts_list[0])
91+
.build()
92+
)
93+
94+
95+
class CoresHubModelProvider(IModelProvider):
96+
97+
def get_model_info_manage(self):
98+
return model_info_manage
99+
100+
def get_model_provide_info(self):
101+
return ModelProvideInfo(provider='model_coreshub_provider', name='CoresHub', icon=get_file_content(
102+
os.path.join(PROJECT_DIR, "apps", "setting", 'models_provider', 'impl', 'coreshub_model_provider', 'icon',
103+
'coreshub_icon_svg')))
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# coding=utf-8
2+
"""
3+
@project: MaxKB
4+
@Author:虎
5+
@file: embedding.py
6+
@date:2024/7/12 16:45
7+
@desc:
8+
"""
9+
from typing import Dict
10+
11+
from django.utils.translation import gettext as _
12+
13+
from common import forms
14+
from common.exception.app_exception import AppApiException
15+
from common.forms import BaseForm
16+
from setting.models_provider.base_model_provider import BaseModelCredential, ValidCode
17+
18+
19+
class CoresHubEmbeddingCredential(BaseForm, BaseModelCredential):
20+
def is_valid(self, model_type: str, model_name, model_credential: Dict[str, object], model_params, provider,
21+
raise_exception=True):
22+
model_type_list = provider.get_model_type_list()
23+
if not any(list(filter(lambda mt: mt.get('value') == model_type, model_type_list))):
24+
raise AppApiException(ValidCode.valid_error.value,
25+
_('{model_type} Model type is not supported').format(model_type=model_type))
26+
27+
for key in ['api_base', 'api_key']:
28+
if key not in model_credential:
29+
if raise_exception:
30+
raise AppApiException(ValidCode.valid_error.value, _('{key} is required').format(key=key))
31+
else:
32+
return False
33+
try:
34+
model = provider.get_model(model_type, model_name, model_credential)
35+
model.embed_query(_('Hello'))
36+
except Exception as e:
37+
if isinstance(e, AppApiException):
38+
raise e
39+
if raise_exception:
40+
raise AppApiException(ValidCode.valid_error.value,
41+
_('Verification failed, please check whether the parameters are correct: {error}').format(
42+
error=str(e)))
43+
else:
44+
return False
45+
return True
46+
47+
def encryption_dict(self, model: Dict[str, object]):
48+
return {**model, 'api_key': super().encryption(model.get('api_key', ''))}
49+
50+
api_base = forms.TextInputField('API URL', required=True)
51+
api_key = forms.PasswordInputField('API Key', required=True)
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# coding=utf-8
2+
"""
3+
@project: MaxKB
4+
@Author:Qingyang
5+
@file: llm.py
6+
@date:2025/2/11 11:32
7+
@desc:
8+
"""
9+
from typing import Dict
10+
11+
from django.utils.translation import gettext_lazy as _, gettext
12+
from langchain_core.messages import HumanMessage
13+
14+
from common import forms
15+
from common.exception.app_exception import AppApiException
16+
from common.forms import BaseForm, TooltipLabel
17+
from setting.models_provider.base_model_provider import BaseModelCredential, ValidCode
18+
19+
20+
class CoresHubLLMModelParams(BaseForm):
21+
temperature = forms.SliderField(TooltipLabel(_('Temperature'),
22+
_('Higher values make the output more random, while lower values make it more focused and deterministic')),
23+
required=True, default_value=0.7,
24+
_min=0.1,
25+
_max=1.0,
26+
_step=0.01,
27+
precision=2)
28+
29+
max_tokens = forms.SliderField(
30+
TooltipLabel(_('Output the maximum Tokens'),
31+
_('Specify the maximum number of tokens that the model can generate')),
32+
required=True, default_value=800,
33+
_min=1,
34+
_max=100000,
35+
_step=1,
36+
precision=0)
37+
38+
39+
class CoresHubLLMModelCredential(BaseForm, BaseModelCredential):
40+
41+
def is_valid(self, model_type: str, model_name, model_credential: Dict[str, object], model_params, provider,
42+
raise_exception=False):
43+
model_type_list = provider.get_model_type_list()
44+
if not any(list(filter(lambda mt: mt.get('value') == model_type, model_type_list))):
45+
raise AppApiException(ValidCode.valid_error.value,
46+
gettext('{model_type} Model type is not supported').format(model_type=model_type))
47+
48+
for key in ['api_base', 'api_key']:
49+
if key not in model_credential:
50+
if raise_exception:
51+
raise AppApiException(ValidCode.valid_error.value, gettext('{key} is required').format(key=key))
52+
else:
53+
return False
54+
try:
55+
56+
model = provider.get_model(model_type, model_name, model_credential, **model_params)
57+
model.invoke([HumanMessage(content=gettext('Hello'))])
58+
except Exception as e:
59+
if isinstance(e, AppApiException):
60+
raise e
61+
if raise_exception:
62+
raise AppApiException(ValidCode.valid_error.value,
63+
gettext(
64+
'Verification failed, please check whether the parameters are correct: {error}').format(
65+
error=str(e)))
66+
else:
67+
return False
68+
return True
69+
70+
def encryption_dict(self, model: Dict[str, object]):
71+
return {**model, 'api_key': super().encryption(model.get('api_key', ''))}
72+
73+
api_base = forms.TextInputField('API URL', required=True)
74+
api_key = forms.PasswordInputField('API Key', required=True)
75+
76+
def get_model_params_setting_form(self, model_name):
77+
return CoresHubLLMModelParams()
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# coding=utf-8
2+
from typing import Dict
3+
4+
from django.utils.translation import gettext as _
5+
6+
from common import forms
7+
from common.exception.app_exception import AppApiException
8+
from common.forms import BaseForm
9+
from setting.models_provider.base_model_provider import BaseModelCredential, ValidCode
10+
11+
12+
class CoresHubSTTModelCredential(BaseForm, BaseModelCredential):
13+
api_base = forms.TextInputField('API URL', required=True)
14+
api_key = forms.PasswordInputField('API Key', required=True)
15+
16+
def is_valid(self, model_type: str, model_name, model_credential: Dict[str, object], model_params, provider,
17+
raise_exception=False):
18+
model_type_list = provider.get_model_type_list()
19+
if not any(list(filter(lambda mt: mt.get('value') == model_type, model_type_list))):
20+
raise AppApiException(ValidCode.valid_error.value,
21+
_('{model_type} Model type is not supported').format(model_type=model_type))
22+
23+
for key in ['api_base', 'api_key']:
24+
if key not in model_credential:
25+
if raise_exception:
26+
raise AppApiException(ValidCode.valid_error.value, _('{key} is required').format(key=key))
27+
else:
28+
return False
29+
try:
30+
model = provider.get_model(model_type, model_name, model_credential)
31+
model.check_auth()
32+
except Exception as e:
33+
if isinstance(e, AppApiException):
34+
raise e
35+
if raise_exception:
36+
raise AppApiException(ValidCode.valid_error.value,
37+
_('Verification failed, please check whether the parameters are correct: {error}').format(
38+
error=str(e)))
39+
else:
40+
return False
41+
return True
42+
43+
def encryption_dict(self, model: Dict[str, object]):
44+
return {**model, 'api_key': super().encryption(model.get('api_key', ''))}
45+
46+
def get_model_params_setting_form(self, model_name):
47+
pass
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# coding=utf-8
2+
from typing import Dict
3+
4+
from django.utils.translation import gettext_lazy as _, gettext
5+
6+
from common import forms
7+
from common.exception.app_exception import AppApiException
8+
from common.forms import BaseForm, TooltipLabel
9+
from setting.models_provider.base_model_provider import BaseModelCredential, ValidCode
10+
11+
12+
class CoresHubTTSModelGeneralParams(BaseForm):
13+
# alloy, echo, fable, onyx, nova, shimmer
14+
voice = forms.SingleSelect(
15+
TooltipLabel('Voice',
16+
_('Try out the different sounds (Alloy, Echo, Fable, Onyx, Nova, and Sparkle) to find one that suits your desired tone and audience. The current voiceover is optimized for English.')),
17+
required=True, default_value='alloy',
18+
text_field='value',
19+
value_field='value',
20+
option_list=[
21+
{'text': 'alloy', 'value': 'alloy'},
22+
{'text': 'echo', 'value': 'echo'},
23+
{'text': 'fable', 'value': 'fable'},
24+
{'text': 'onyx', 'value': 'onyx'},
25+
{'text': 'nova', 'value': 'nova'},
26+
{'text': 'shimmer', 'value': 'shimmer'},
27+
])
28+
29+
30+
class CoresHubTTSModelCredential(BaseForm, BaseModelCredential):
31+
api_base = forms.TextInputField('API URL', required=True)
32+
api_key = forms.PasswordInputField('API Key', required=True)
33+
34+
def is_valid(self, model_type: str, model_name, model_credential: Dict[str, object], model_params, provider,
35+
raise_exception=False):
36+
model_type_list = provider.get_model_type_list()
37+
if not any(list(filter(lambda mt: mt.get('value') == model_type, model_type_list))):
38+
raise AppApiException(ValidCode.valid_error.value,
39+
gettext('{model_type} Model type is not supported').format(model_type=model_type))
40+
41+
for key in ['api_base', 'api_key']:
42+
if key not in model_credential:
43+
if raise_exception:
44+
raise AppApiException(ValidCode.valid_error.value, gettext('{key} is required').format(key=key))
45+
else:
46+
return False
47+
try:
48+
model = provider.get_model(model_type, model_name, model_credential, **model_params)
49+
model.check_auth()
50+
except Exception as e:
51+
if isinstance(e, AppApiException):
52+
raise e
53+
if raise_exception:
54+
raise AppApiException(ValidCode.valid_error.value,
55+
gettext(
56+
'Verification failed, please check whether the parameters are correct: {error}').format(
57+
error=str(e)))
58+
else:
59+
return False
60+
return True
61+
62+
def encryption_dict(self, model: Dict[str, object]):
63+
return {**model, 'api_key': super().encryption(model.get('api_key', ''))}
64+
65+
def get_model_params_setting_form(self, model_name):
66+
return CoresHubTTSModelGeneralParams()
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# coding=utf-8
2+
"""
3+
@project: MaxKB
4+
@Author:虎
5+
@file: embedding.py
6+
@date:2024/7/12 17:44
7+
@desc:
8+
"""
9+
from typing import Dict
10+
11+
from langchain_community.embeddings import OpenAIEmbeddings
12+
13+
from setting.models_provider.base_model_provider import MaxKBBaseModel
14+
15+
16+
class CoresHubEmbeddingModel(MaxKBBaseModel, OpenAIEmbeddings):
17+
@staticmethod
18+
def new_instance(model_type, model_name, model_credential: Dict[str, object], **model_kwargs):
19+
return CoresHubEmbeddingModel(
20+
api_key=model_credential.get('api_key'),
21+
model=model_name,
22+
openai_api_base=model_credential.get('api_base'),
23+
)

0 commit comments

Comments
 (0)