Skip to content

Commit a8d8c18

Browse files
committed
feat: support siliconCloud
--story=1017720 --user=王孝刚 【模型管理】-支持SiliconCloud供应商的大语言模型、向量模型 https://www.tapd.cn/57709429/s/1650888
1 parent c5c9ab3 commit a8d8c18

File tree

19 files changed

+891
-5
lines changed

19 files changed

+891
-5
lines changed

apps/setting/models_provider/base_model_provider.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from common.exception.app_exception import AppApiException
1717
from django.utils.translation import gettext_lazy as _
1818

19+
1920
class DownModelChunkStatus(Enum):
2021
success = "success"
2122
error = "error"
@@ -71,7 +72,8 @@ def get_model_params(self, model_type, model_name):
7172
model_info = self.get_model_info_manage().get_model_info(model_type, model_name)
7273
return model_info.model_credential
7374

74-
def is_valid_credential(self, model_type, model_name, model_credential: Dict[str, object], model_params: Dict[str, object], raise_exception=False):
75+
def is_valid_credential(self, model_type, model_name, model_credential: Dict[str, object],
76+
model_params: Dict[str, object], raise_exception=False):
7577
model_info = self.get_model_info_manage().get_model_info(model_type, model_name)
7678
return model_info.model_credential.is_valid(model_type, model_name, model_credential, model_params, self,
7779
raise_exception=raise_exception)
@@ -101,15 +103,16 @@ def is_cache_model():
101103
def filter_optional_params(model_kwargs):
102104
optional_params = {}
103105
for key, value in model_kwargs.items():
104-
if key not in ['model_id', 'use_local', 'streaming']:
106+
if key not in ['model_id', 'use_local', 'streaming', 'show_ref_label']:
105107
optional_params[key] = value
106108
return optional_params
107109

108110

109111
class BaseModelCredential(ABC):
110112

111113
@abstractmethod
112-
def is_valid(self, model_type: str, model_name, model: Dict[str, object], model_params, provider, raise_exception=True):
114+
def is_valid(self, model_type: str, model_name, model: Dict[str, object], model_params, provider,
115+
raise_exception=True):
113116
pass
114117

115118
@abstractmethod

apps/setting/models_provider/constants/model_provider_constants.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
from setting.models_provider.impl.ollama_model_provider.ollama_model_provider import OllamaModelProvider
2020
from setting.models_provider.impl.openai_model_provider.openai_model_provider import OpenAIModelProvider
2121
from setting.models_provider.impl.qwen_model_provider.qwen_model_provider import QwenModelProvider
22+
from setting.models_provider.impl.siliconCloud_model_provider.siliconCloud_model_provider import \
23+
SiliconCloudModelProvider
2224
from setting.models_provider.impl.tencent_model_provider.tencent_model_provider import TencentModelProvider
2325
from setting.models_provider.impl.vllm_model_provider.vllm_model_provider import VllmModelProvider
2426
from setting.models_provider.impl.volcanic_engine_model_provider.volcanic_engine_model_provider import \
@@ -49,3 +51,4 @@ class ModelProvideConstants(Enum):
4951
model_vllm_provider = VllmModelProvider()
5052
aliyun_bai_lian_model_provider = AliyunBaiLianModelProvider()
5153
model_anthropic_provider = AnthropicModelProvider()
54+
model_siliconCloud_provider = SiliconCloudModelProvider()

apps/setting/models_provider/impl/aliyun_bai_lian_model_provider/aliyun_bai_lian_model_provider.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from setting.models_provider.impl.aliyun_bai_lian_model_provider.model.tti import QwenTextToImageModel
2929
from setting.models_provider.impl.aliyun_bai_lian_model_provider.model.tts import AliyunBaiLianTextToSpeech
3030
from smartdoc.conf import PROJECT_DIR
31-
from django.utils.translation import gettext_lazy as _
31+
from django.utils.translation import gettext_lazy as _, gettext
3232

3333
aliyun_bai_lian_model_credential = AliyunBaiLianRerankerCredential()
3434
aliyun_bai_lian_tts_model_credential = AliyunBaiLianTTSModelCredential()
@@ -92,7 +92,7 @@ def get_model_info_manage(self):
9292
return model_info_manage
9393

9494
def get_model_provide_info(self):
95-
return ModelProvideInfo(provider='aliyun_bai_lian_model_provider', name=_('Alibaba Cloud Bailian'),
95+
return ModelProvideInfo(provider='aliyun_bai_lian_model_provider', name=gettext('Alibaba Cloud Bailian'),
9696
icon=get_file_content(
9797
os.path.join(PROJECT_DIR, "apps", "setting", 'models_provider', 'impl',
9898
'aliyun_bai_lian_model_provider',
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:虎
5+
@file: __init__.py.py
6+
@date:2024/3/28 16:25
7+
@desc:
8+
"""
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 SiliconCloudEmbeddingCredential(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: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# coding=utf-8
2+
import base64
3+
import os
4+
from typing import Dict
5+
6+
from langchain_core.messages import HumanMessage
7+
8+
from common import forms
9+
from common.exception.app_exception import AppApiException
10+
from common.forms import BaseForm, TooltipLabel
11+
from setting.models_provider.base_model_provider import BaseModelCredential, ValidCode
12+
from django.utils.translation import gettext_lazy as _, gettext
13+
14+
15+
class SiliconCloudImageModelParams(BaseForm):
16+
temperature = forms.SliderField(TooltipLabel(_('Temperature'),
17+
_('Higher values make the output more random, while lower values make it more focused and deterministic')),
18+
required=True, default_value=0.7,
19+
_min=0.1,
20+
_max=1.0,
21+
_step=0.01,
22+
precision=2)
23+
24+
max_tokens = forms.SliderField(
25+
TooltipLabel(_('Output the maximum Tokens'),
26+
_('Specify the maximum number of tokens that the model can generate')),
27+
required=True, default_value=800,
28+
_min=1,
29+
_max=100000,
30+
_step=1,
31+
precision=0)
32+
33+
34+
class SiliconCloudImageModelCredential(BaseForm, BaseModelCredential):
35+
api_base = forms.TextInputField('API URL', required=True)
36+
api_key = forms.PasswordInputField('API Key', required=True)
37+
38+
def is_valid(self, model_type: str, model_name, model_credential: Dict[str, object], model_params, provider,
39+
raise_exception=False):
40+
model_type_list = provider.get_model_type_list()
41+
if not any(list(filter(lambda mt: mt.get('value') == model_type, model_type_list))):
42+
raise AppApiException(ValidCode.valid_error.value,
43+
gettext('{model_type} Model type is not supported').format(model_type=model_type))
44+
45+
for key in ['api_base', 'api_key']:
46+
if key not in model_credential:
47+
if raise_exception:
48+
raise AppApiException(ValidCode.valid_error.value, gettext('{key} is required').format(key=key))
49+
else:
50+
return False
51+
try:
52+
model = provider.get_model(model_type, model_name, model_credential, **model_params)
53+
res = model.stream([HumanMessage(content=[{"type": "text", "text": gettext('Hello')}])])
54+
for chunk in res:
55+
print(chunk)
56+
except Exception as e:
57+
if isinstance(e, AppApiException):
58+
raise e
59+
if raise_exception:
60+
raise AppApiException(ValidCode.valid_error.value,
61+
gettext(
62+
'Verification failed, please check whether the parameters are correct: {error}').format(
63+
error=str(e)))
64+
else:
65+
return False
66+
return True
67+
68+
def encryption_dict(self, model: Dict[str, object]):
69+
return {**model, 'api_key': super().encryption(model.get('api_key', ''))}
70+
71+
def get_model_params_setting_form(self, model_name):
72+
return SiliconCloudImageModelParams()
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:虎
5+
@file: llm.py
6+
@date:2024/7/11 18: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 SiliconCloudLLMModelParams(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 SiliconCloudLLMModelCredential(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 SiliconCloudLLMModelParams()
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# coding=utf-8
2+
"""
3+
@project: MaxKB
4+
@Author:虎
5+
@file: reranker.py
6+
@date:2024/9/9 17:51
7+
@desc:
8+
"""
9+
from typing import Dict
10+
11+
from django.utils.translation import gettext as _
12+
from langchain_core.documents import Document
13+
14+
from common import forms
15+
from common.exception.app_exception import AppApiException
16+
from common.forms import BaseForm
17+
from setting.models_provider.base_model_provider import BaseModelCredential, ValidCode
18+
from setting.models_provider.impl.aliyun_bai_lian_model_provider.model.reranker import AliyunBaiLianReranker
19+
from setting.models_provider.impl.siliconCloud_model_provider.model.reranker import SiliconCloudReranker
20+
21+
22+
class SiliconCloudRerankerCredential(BaseForm, BaseModelCredential):
23+
24+
def is_valid(self, model_type: str, model_name, model_credential: Dict[str, object], model_params, provider,
25+
raise_exception=False):
26+
if not model_type == 'RERANKER':
27+
raise AppApiException(ValidCode.valid_error.value,
28+
_('{model_type} Model type is not supported').format(model_type=model_type))
29+
for key in ['dashscope_api_key']:
30+
if key not in model_credential:
31+
if raise_exception:
32+
raise AppApiException(ValidCode.valid_error.value, _('{key} is required').format(key=key))
33+
else:
34+
return False
35+
try:
36+
model: SiliconCloudReranker = provider.get_model(model_type, model_name, model_credential)
37+
model.compress_documents([Document(page_content=_('Hello'))], _('Hello'))
38+
except Exception as e:
39+
if isinstance(e, AppApiException):
40+
raise e
41+
if raise_exception:
42+
raise AppApiException(ValidCode.valid_error.value,
43+
_('Verification failed, please check whether the parameters are correct: {error}').format(
44+
error=str(e)))
45+
else:
46+
return False
47+
return True
48+
49+
def encryption_dict(self, model: Dict[str, object]):
50+
return {**model, 'dashscope_api_key': super().encryption(model.get('dashscope_api_key', ''))}
51+
52+
dashscope_api_key = forms.PasswordInputField('API Key', required=True)
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 SiliconCloudSTTModelCredential(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

0 commit comments

Comments
 (0)