+110









Yeuoly
GitHub
takatost
kurokobo
Novice Lee
zxhlyh
AkaraChen
Yi
Joel
JzoNg
twwu
Hiroshi Fujita
AkaraChen
NFish
Wu Tianwei
非法操作
Novice
Hiroki Nagai
Gen Sato
eux
huangzhuo1949
huangzhuo
lotsik
crazywoola
nite-knite
Jyong
github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
gakkiyomi
CN-P5
CN-P5
Chuehnone
yihong
Kevin9703
-LAN-
Boris Feld
mbo
mabo
Warren Chen
JzoNgKVO
jiandanfeng
zhu-an
zhaoqingyu.1075
海狸大師
Xu Song
rayshaw001
Ding Jiatong
Bowen Liang
JasonVV
le0zh
zhuxinliang
k-zaku
luckylhb90
hobo.l
jiangbo721
刘江波
Shun Miyazawa
EricPan
crazywoola
sino
Jhvcc
lowell
Boris Polonsky
Ademílson Tonato
Ademílson Tonato
IWAI, Masaharu <iwaim.sub@gmail.com>
Yueh-Po Peng
Jason
Xin Zhang
yjc980121
heyszt
Abdullah AlOsaimi
Abdullah AlOsaimi
Yingchun Lai
Hash Brown
zuodongxu
Masashi Tomooka
aplio
Obada Khalili
Nam Vu
Kei YAMAZAKI
TechnoHouse
Riddhimaan-Senapati
MaFee921
te-chan
HQidea
Joshbly
xhe
weiwenyan-dev
ex_wenyan.wei
engchina
engchina
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
呆萌闷油瓶
Kemal
Lazy_Frog
Yi Xiao
Steven sun
steven
Kalo Chin
Katy Tao
depy
胡春东
Junjie.M
MuYu
Naoki Takashima
Summer-Gu
Fei He
ybalbert001
Yuanbo Li
douxc
liuzhenghua
Wu Jiayang
Your Name
kimjion
AugNSo
llinvokerl
liusurong.lsr
Vasu Negi
Hundredwz
Xiyuan Chen
403e2d58b9
Signed-off-by: yihong0618 <zouzou0208@gmail.com> Signed-off-by: -LAN- <laipz8200@outlook.com> Signed-off-by: xhe <xw897002528@gmail.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: takatost <takatost@gmail.com> Co-authored-by: kurokobo <kuro664@gmail.com> Co-authored-by: Novice Lee <novicelee@NoviPro.local> Co-authored-by: zxhlyh <jasonapring2015@outlook.com> Co-authored-by: AkaraChen <akarachen@outlook.com> Co-authored-by: Yi <yxiaoisme@gmail.com> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: JzoNg <jzongcode@gmail.com> Co-authored-by: twwu <twwu@dify.ai> Co-authored-by: Hiroshi Fujita <fujita-h@users.noreply.github.com> Co-authored-by: AkaraChen <85140972+AkaraChen@users.noreply.github.com> Co-authored-by: NFish <douxc512@gmail.com> Co-authored-by: Wu Tianwei <30284043+WTW0313@users.noreply.github.com> Co-authored-by: 非法操作 <hjlarry@163.com> Co-authored-by: Novice <857526207@qq.com> Co-authored-by: Hiroki Nagai <82458324+nagaihiroki-git@users.noreply.github.com> Co-authored-by: Gen Sato <52241300+halogen22@users.noreply.github.com> Co-authored-by: eux <euxuuu@gmail.com> Co-authored-by: huangzhuo1949 <167434202+huangzhuo1949@users.noreply.github.com> Co-authored-by: huangzhuo <huangzhuo1@xiaomi.com> Co-authored-by: lotsik <lotsik@mail.ru> Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com> Co-authored-by: nite-knite <nkCoding@gmail.com> Co-authored-by: Jyong <76649700+JohnJyong@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: gakkiyomi <gakkiyomi@aliyun.com> Co-authored-by: CN-P5 <heibai2006@gmail.com> Co-authored-by: CN-P5 <heibai2006@qq.com> Co-authored-by: Chuehnone <1897025+chuehnone@users.noreply.github.com> Co-authored-by: yihong <zouzou0208@gmail.com> Co-authored-by: Kevin9703 <51311316+Kevin9703@users.noreply.github.com> Co-authored-by: -LAN- <laipz8200@outlook.com> Co-authored-by: Boris Feld <lothiraldan@gmail.com> Co-authored-by: mbo <himabo@gmail.com> Co-authored-by: mabo <mabo@aeyes.ai> Co-authored-by: Warren Chen <warren.chen830@gmail.com> Co-authored-by: JzoNgKVO <27049666+JzoNgKVO@users.noreply.github.com> Co-authored-by: jiandanfeng <chenjh3@wangsu.com> Co-authored-by: zhu-an <70234959+xhdd123321@users.noreply.github.com> Co-authored-by: zhaoqingyu.1075 <zhaoqingyu.1075@bytedance.com> Co-authored-by: 海狸大師 <86974027+yenslife@users.noreply.github.com> Co-authored-by: Xu Song <xusong.vip@gmail.com> Co-authored-by: rayshaw001 <396301947@163.com> Co-authored-by: Ding Jiatong <dingjiatong@gmail.com> Co-authored-by: Bowen Liang <liangbowen@gf.com.cn> Co-authored-by: JasonVV <jasonwangiii@outlook.com> Co-authored-by: le0zh <newlight@qq.com> Co-authored-by: zhuxinliang <zhuxinliang@didiglobal.com> Co-authored-by: k-zaku <zaku99@outlook.jp> Co-authored-by: luckylhb90 <luckylhb90@gmail.com> Co-authored-by: hobo.l <hobo.l@binance.com> Co-authored-by: jiangbo721 <365065261@qq.com> Co-authored-by: 刘江波 <jiangbo721@163.com> Co-authored-by: Shun Miyazawa <34241526+miya@users.noreply.github.com> Co-authored-by: EricPan <30651140+Egfly@users.noreply.github.com> Co-authored-by: crazywoola <427733928@qq.com> Co-authored-by: sino <sino2322@gmail.com> Co-authored-by: Jhvcc <37662342+Jhvcc@users.noreply.github.com> Co-authored-by: lowell <lowell.hu@zkteco.in> Co-authored-by: Boris Polonsky <BorisPolonsky@users.noreply.github.com> Co-authored-by: Ademílson Tonato <ademilsonft@outlook.com> Co-authored-by: Ademílson Tonato <ademilson.tonato@refurbed.com> Co-authored-by: IWAI, Masaharu <iwaim.sub@gmail.com> Co-authored-by: Yueh-Po Peng (Yabi) <94939112+y10ab1@users.noreply.github.com> Co-authored-by: Jason <ggbbddjm@gmail.com> Co-authored-by: Xin Zhang <sjhpzx@gmail.com> Co-authored-by: yjc980121 <3898524+yjc980121@users.noreply.github.com> Co-authored-by: heyszt <36215648+hieheihei@users.noreply.github.com> Co-authored-by: Abdullah AlOsaimi <osaimiacc@gmail.com> Co-authored-by: Abdullah AlOsaimi <189027247+osaimi@users.noreply.github.com> Co-authored-by: Yingchun Lai <laiyingchun@apache.org> Co-authored-by: Hash Brown <hi@xzd.me> Co-authored-by: zuodongxu <192560071+zuodongxu@users.noreply.github.com> Co-authored-by: Masashi Tomooka <tmokmss@users.noreply.github.com> Co-authored-by: aplio <ryo.091219@gmail.com> Co-authored-by: Obada Khalili <54270856+obadakhalili@users.noreply.github.com> Co-authored-by: Nam Vu <zuzoovn@gmail.com> Co-authored-by: Kei YAMAZAKI <1715090+kei-yamazaki@users.noreply.github.com> Co-authored-by: TechnoHouse <13776377+deephbz@users.noreply.github.com> Co-authored-by: Riddhimaan-Senapati <114703025+Riddhimaan-Senapati@users.noreply.github.com> Co-authored-by: MaFee921 <31881301+2284730142@users.noreply.github.com> Co-authored-by: te-chan <t-nakanome@sakura-is.co.jp> Co-authored-by: HQidea <HQidea@users.noreply.github.com> Co-authored-by: Joshbly <36315710+Joshbly@users.noreply.github.com> Co-authored-by: xhe <xw897002528@gmail.com> Co-authored-by: weiwenyan-dev <154779315+weiwenyan-dev@users.noreply.github.com> Co-authored-by: ex_wenyan.wei <ex_wenyan.wei@tcl.com> Co-authored-by: engchina <12236799+engchina@users.noreply.github.com> Co-authored-by: engchina <atjapan2015@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: 呆萌闷油瓶 <253605712@qq.com> Co-authored-by: Kemal <kemalmeler@outlook.com> Co-authored-by: Lazy_Frog <4590648+lazyFrogLOL@users.noreply.github.com> Co-authored-by: Yi Xiao <54782454+YIXIAO0@users.noreply.github.com> Co-authored-by: Steven sun <98230804+Tuyohai@users.noreply.github.com> Co-authored-by: steven <sunzwj@digitalchina.com> Co-authored-by: Kalo Chin <91766386+fdb02983rhy@users.noreply.github.com> Co-authored-by: Katy Tao <34019945+KatyTao@users.noreply.github.com> Co-authored-by: depy <42985524+h4ckdepy@users.noreply.github.com> Co-authored-by: 胡春东 <gycm520@gmail.com> Co-authored-by: Junjie.M <118170653@qq.com> Co-authored-by: MuYu <mr.muzea@gmail.com> Co-authored-by: Naoki Takashima <39912547+takatea@users.noreply.github.com> Co-authored-by: Summer-Gu <37869445+gubinjie@users.noreply.github.com> Co-authored-by: Fei He <droxer.he@gmail.com> Co-authored-by: ybalbert001 <120714773+ybalbert001@users.noreply.github.com> Co-authored-by: Yuanbo Li <ybalbert@amazon.com> Co-authored-by: douxc <7553076+douxc@users.noreply.github.com> Co-authored-by: liuzhenghua <1090179900@qq.com> Co-authored-by: Wu Jiayang <62842862+Wu-Jiayang@users.noreply.github.com> Co-authored-by: Your Name <you@example.com> Co-authored-by: kimjion <45935338+kimjion@users.noreply.github.com> Co-authored-by: AugNSo <song.tiankai@icloud.com> Co-authored-by: llinvokerl <38915183+llinvokerl@users.noreply.github.com> Co-authored-by: liusurong.lsr <liusurong.lsr@alibaba-inc.com> Co-authored-by: Vasu Negi <vasu-negi@users.noreply.github.com> Co-authored-by: Hundredwz <1808096180@qq.com> Co-authored-by: Xiyuan Chen <52963600+GareArc@users.noreply.github.com>
482 lines
19 KiB
Python
482 lines
19 KiB
Python
import logging
|
|
from typing import Optional
|
|
|
|
from core.entities.model_entities import ModelStatus, ModelWithProviderEntity, ProviderModelWithStatusEntity
|
|
from core.model_runtime.entities.model_entities import ModelType, ParameterRule
|
|
from core.model_runtime.model_providers.model_provider_factory import ModelProviderFactory
|
|
from core.provider_manager import ProviderManager
|
|
from models.provider import ProviderType
|
|
from services.entities.model_provider_entities import (
|
|
CustomConfigurationResponse,
|
|
CustomConfigurationStatus,
|
|
DefaultModelResponse,
|
|
ModelWithProviderEntityResponse,
|
|
ProviderResponse,
|
|
ProviderWithModelsResponse,
|
|
SimpleProviderEntityResponse,
|
|
SystemConfigurationResponse,
|
|
)
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class ModelProviderService:
|
|
"""
|
|
Model Provider Service
|
|
"""
|
|
|
|
def __init__(self) -> None:
|
|
self.provider_manager = ProviderManager()
|
|
|
|
def get_provider_list(self, tenant_id: str, model_type: Optional[str] = None) -> list[ProviderResponse]:
|
|
"""
|
|
get provider list.
|
|
|
|
:param tenant_id: workspace id
|
|
:param model_type: model type
|
|
:return:
|
|
"""
|
|
# Get all provider configurations of the current workspace
|
|
provider_configurations = self.provider_manager.get_configurations(tenant_id)
|
|
|
|
provider_responses = []
|
|
for provider_configuration in provider_configurations.values():
|
|
if model_type:
|
|
model_type_entity = ModelType.value_of(model_type)
|
|
if model_type_entity not in provider_configuration.provider.supported_model_types:
|
|
continue
|
|
|
|
provider_response = ProviderResponse(
|
|
tenant_id=tenant_id,
|
|
provider=provider_configuration.provider.provider,
|
|
label=provider_configuration.provider.label,
|
|
description=provider_configuration.provider.description,
|
|
icon_small=provider_configuration.provider.icon_small,
|
|
icon_large=provider_configuration.provider.icon_large,
|
|
background=provider_configuration.provider.background,
|
|
help=provider_configuration.provider.help,
|
|
supported_model_types=provider_configuration.provider.supported_model_types,
|
|
configurate_methods=provider_configuration.provider.configurate_methods,
|
|
provider_credential_schema=provider_configuration.provider.provider_credential_schema,
|
|
model_credential_schema=provider_configuration.provider.model_credential_schema,
|
|
preferred_provider_type=provider_configuration.preferred_provider_type,
|
|
custom_configuration=CustomConfigurationResponse(
|
|
status=CustomConfigurationStatus.ACTIVE
|
|
if provider_configuration.is_custom_configuration_available()
|
|
else CustomConfigurationStatus.NO_CONFIGURE
|
|
),
|
|
system_configuration=SystemConfigurationResponse(
|
|
enabled=provider_configuration.system_configuration.enabled,
|
|
current_quota_type=provider_configuration.system_configuration.current_quota_type,
|
|
quota_configurations=provider_configuration.system_configuration.quota_configurations,
|
|
),
|
|
)
|
|
|
|
provider_responses.append(provider_response)
|
|
|
|
return provider_responses
|
|
|
|
def get_models_by_provider(self, tenant_id: str, provider: str) -> list[ModelWithProviderEntityResponse]:
|
|
"""
|
|
get provider models.
|
|
For the model provider page,
|
|
only supports passing in a single provider to query the list of supported models.
|
|
|
|
:param tenant_id:
|
|
:param provider:
|
|
:return:
|
|
"""
|
|
# Get all provider configurations of the current workspace
|
|
provider_configurations = self.provider_manager.get_configurations(tenant_id)
|
|
|
|
# Get provider available models
|
|
return [
|
|
ModelWithProviderEntityResponse(tenant_id=tenant_id, model=model)
|
|
for model in provider_configurations.get_models(provider=provider)
|
|
]
|
|
|
|
def get_provider_credentials(self, tenant_id: str, provider: str) -> Optional[dict]:
|
|
"""
|
|
get provider credentials.
|
|
"""
|
|
provider_configurations = self.provider_manager.get_configurations(tenant_id)
|
|
provider_configuration = provider_configurations.get(provider)
|
|
if not provider_configuration:
|
|
raise ValueError(f"Provider {provider} does not exist.")
|
|
|
|
return provider_configuration.get_custom_credentials(obfuscated=True)
|
|
|
|
def provider_credentials_validate(self, tenant_id: str, provider: str, credentials: dict) -> None:
|
|
"""
|
|
validate provider credentials.
|
|
|
|
:param tenant_id:
|
|
:param provider:
|
|
:param credentials:
|
|
"""
|
|
# Get all provider configurations of the current workspace
|
|
provider_configurations = self.provider_manager.get_configurations(tenant_id)
|
|
|
|
# Get provider configuration
|
|
provider_configuration = provider_configurations.get(provider)
|
|
if not provider_configuration:
|
|
raise ValueError(f"Provider {provider} does not exist.")
|
|
|
|
provider_configuration.custom_credentials_validate(credentials)
|
|
|
|
def save_provider_credentials(self, tenant_id: str, provider: str, credentials: dict) -> None:
|
|
"""
|
|
save custom provider config.
|
|
|
|
:param tenant_id: workspace id
|
|
:param provider: provider name
|
|
:param credentials: provider credentials
|
|
:return:
|
|
"""
|
|
# Get all provider configurations of the current workspace
|
|
provider_configurations = self.provider_manager.get_configurations(tenant_id)
|
|
|
|
# Get provider configuration
|
|
provider_configuration = provider_configurations.get(provider)
|
|
if not provider_configuration:
|
|
raise ValueError(f"Provider {provider} does not exist.")
|
|
|
|
# Add or update custom provider credentials.
|
|
provider_configuration.add_or_update_custom_credentials(credentials)
|
|
|
|
def remove_provider_credentials(self, tenant_id: str, provider: str) -> None:
|
|
"""
|
|
remove custom provider config.
|
|
|
|
:param tenant_id: workspace id
|
|
:param provider: provider name
|
|
:return:
|
|
"""
|
|
# Get all provider configurations of the current workspace
|
|
provider_configurations = self.provider_manager.get_configurations(tenant_id)
|
|
|
|
# Get provider configuration
|
|
provider_configuration = provider_configurations.get(provider)
|
|
if not provider_configuration:
|
|
raise ValueError(f"Provider {provider} does not exist.")
|
|
|
|
# Remove custom provider credentials.
|
|
provider_configuration.delete_custom_credentials()
|
|
|
|
def get_model_credentials(self, tenant_id: str, provider: str, model_type: str, model: str) -> Optional[dict]:
|
|
"""
|
|
get model credentials.
|
|
|
|
:param tenant_id: workspace id
|
|
:param provider: provider name
|
|
:param model_type: model type
|
|
:param model: model name
|
|
:return:
|
|
"""
|
|
# Get all provider configurations of the current workspace
|
|
provider_configurations = self.provider_manager.get_configurations(tenant_id)
|
|
|
|
# Get provider configuration
|
|
provider_configuration = provider_configurations.get(provider)
|
|
if not provider_configuration:
|
|
raise ValueError(f"Provider {provider} does not exist.")
|
|
|
|
# Get model custom credentials from ProviderModel if exists
|
|
return provider_configuration.get_custom_model_credentials(
|
|
model_type=ModelType.value_of(model_type), model=model, obfuscated=True
|
|
)
|
|
|
|
def model_credentials_validate(
|
|
self, tenant_id: str, provider: str, model_type: str, model: str, credentials: dict
|
|
) -> None:
|
|
"""
|
|
validate model credentials.
|
|
|
|
:param tenant_id: workspace id
|
|
:param provider: provider name
|
|
:param model_type: model type
|
|
:param model: model name
|
|
:param credentials: model credentials
|
|
:return:
|
|
"""
|
|
# Get all provider configurations of the current workspace
|
|
provider_configurations = self.provider_manager.get_configurations(tenant_id)
|
|
|
|
# Get provider configuration
|
|
provider_configuration = provider_configurations.get(provider)
|
|
if not provider_configuration:
|
|
raise ValueError(f"Provider {provider} does not exist.")
|
|
|
|
# Validate model credentials
|
|
provider_configuration.custom_model_credentials_validate(
|
|
model_type=ModelType.value_of(model_type), model=model, credentials=credentials
|
|
)
|
|
|
|
def save_model_credentials(
|
|
self, tenant_id: str, provider: str, model_type: str, model: str, credentials: dict
|
|
) -> None:
|
|
"""
|
|
save model credentials.
|
|
|
|
:param tenant_id: workspace id
|
|
:param provider: provider name
|
|
:param model_type: model type
|
|
:param model: model name
|
|
:param credentials: model credentials
|
|
:return:
|
|
"""
|
|
# Get all provider configurations of the current workspace
|
|
provider_configurations = self.provider_manager.get_configurations(tenant_id)
|
|
|
|
# Get provider configuration
|
|
provider_configuration = provider_configurations.get(provider)
|
|
if not provider_configuration:
|
|
raise ValueError(f"Provider {provider} does not exist.")
|
|
|
|
# Add or update custom model credentials
|
|
provider_configuration.add_or_update_custom_model_credentials(
|
|
model_type=ModelType.value_of(model_type), model=model, credentials=credentials
|
|
)
|
|
|
|
def remove_model_credentials(self, tenant_id: str, provider: str, model_type: str, model: str) -> None:
|
|
"""
|
|
remove model credentials.
|
|
|
|
:param tenant_id: workspace id
|
|
:param provider: provider name
|
|
:param model_type: model type
|
|
:param model: model name
|
|
:return:
|
|
"""
|
|
# Get all provider configurations of the current workspace
|
|
provider_configurations = self.provider_manager.get_configurations(tenant_id)
|
|
|
|
# Get provider configuration
|
|
provider_configuration = provider_configurations.get(provider)
|
|
if not provider_configuration:
|
|
raise ValueError(f"Provider {provider} does not exist.")
|
|
|
|
# Remove custom model credentials
|
|
provider_configuration.delete_custom_model_credentials(model_type=ModelType.value_of(model_type), model=model)
|
|
|
|
def get_models_by_model_type(self, tenant_id: str, model_type: str) -> list[ProviderWithModelsResponse]:
|
|
"""
|
|
get models by model type.
|
|
|
|
:param tenant_id: workspace id
|
|
:param model_type: model type
|
|
:return:
|
|
"""
|
|
# Get all provider configurations of the current workspace
|
|
provider_configurations = self.provider_manager.get_configurations(tenant_id)
|
|
|
|
# Get provider available models
|
|
models = provider_configurations.get_models(model_type=ModelType.value_of(model_type))
|
|
|
|
# Group models by provider
|
|
provider_models: dict[str, list[ModelWithProviderEntity]] = {}
|
|
for model in models:
|
|
if model.provider.provider not in provider_models:
|
|
provider_models[model.provider.provider] = []
|
|
|
|
if model.deprecated:
|
|
continue
|
|
|
|
if model.status != ModelStatus.ACTIVE:
|
|
continue
|
|
|
|
provider_models[model.provider.provider].append(model)
|
|
|
|
# convert to ProviderWithModelsResponse list
|
|
providers_with_models: list[ProviderWithModelsResponse] = []
|
|
for provider, models in provider_models.items():
|
|
if not models:
|
|
continue
|
|
|
|
first_model = models[0]
|
|
|
|
providers_with_models.append(
|
|
ProviderWithModelsResponse(
|
|
tenant_id=tenant_id,
|
|
provider=provider,
|
|
label=first_model.provider.label,
|
|
icon_small=first_model.provider.icon_small,
|
|
icon_large=first_model.provider.icon_large,
|
|
status=CustomConfigurationStatus.ACTIVE,
|
|
models=[
|
|
ProviderModelWithStatusEntity(
|
|
model=model.model,
|
|
label=model.label,
|
|
model_type=model.model_type,
|
|
features=model.features,
|
|
fetch_from=model.fetch_from,
|
|
model_properties=model.model_properties,
|
|
status=model.status,
|
|
load_balancing_enabled=model.load_balancing_enabled,
|
|
)
|
|
for model in models
|
|
],
|
|
)
|
|
)
|
|
|
|
return providers_with_models
|
|
|
|
def get_model_parameter_rules(self, tenant_id: str, provider: str, model: str) -> list[ParameterRule]:
|
|
"""
|
|
get model parameter rules.
|
|
Only supports LLM.
|
|
|
|
:param tenant_id: workspace id
|
|
:param provider: provider name
|
|
:param model: model name
|
|
:return:
|
|
"""
|
|
# Get all provider configurations of the current workspace
|
|
provider_configurations = self.provider_manager.get_configurations(tenant_id)
|
|
|
|
# Get provider configuration
|
|
provider_configuration = provider_configurations.get(provider)
|
|
if not provider_configuration:
|
|
raise ValueError(f"Provider {provider} does not exist.")
|
|
|
|
# fetch credentials
|
|
credentials = provider_configuration.get_current_credentials(model_type=ModelType.LLM, model=model)
|
|
|
|
if not credentials:
|
|
return []
|
|
|
|
model_schema = provider_configuration.get_model_schema(
|
|
model_type=ModelType.LLM, model=model, credentials=credentials
|
|
)
|
|
|
|
return model_schema.parameter_rules if model_schema else []
|
|
|
|
def get_default_model_of_model_type(self, tenant_id: str, model_type: str) -> Optional[DefaultModelResponse]:
|
|
"""
|
|
get default model of model type.
|
|
|
|
:param tenant_id: workspace id
|
|
:param model_type: model type
|
|
:return:
|
|
"""
|
|
model_type_enum = ModelType.value_of(model_type)
|
|
|
|
try:
|
|
result = self.provider_manager.get_default_model(tenant_id=tenant_id, model_type=model_type_enum)
|
|
return (
|
|
DefaultModelResponse(
|
|
model=result.model,
|
|
model_type=result.model_type,
|
|
provider=SimpleProviderEntityResponse(
|
|
tenant_id=tenant_id,
|
|
provider=result.provider.provider,
|
|
label=result.provider.label,
|
|
icon_small=result.provider.icon_small,
|
|
icon_large=result.provider.icon_large,
|
|
supported_model_types=result.provider.supported_model_types,
|
|
),
|
|
)
|
|
if result
|
|
else None
|
|
)
|
|
except Exception as e:
|
|
logger.debug(f"get_default_model_of_model_type error: {e}")
|
|
return None
|
|
|
|
def update_default_model_of_model_type(self, tenant_id: str, model_type: str, provider: str, model: str) -> None:
|
|
"""
|
|
update default model of model type.
|
|
|
|
:param tenant_id: workspace id
|
|
:param model_type: model type
|
|
:param provider: provider name
|
|
:param model: model name
|
|
:return:
|
|
"""
|
|
model_type_enum = ModelType.value_of(model_type)
|
|
self.provider_manager.update_default_model_record(
|
|
tenant_id=tenant_id, model_type=model_type_enum, provider=provider, model=model
|
|
)
|
|
|
|
def get_model_provider_icon(
|
|
self, tenant_id: str, provider: str, icon_type: str, lang: str
|
|
) -> tuple[Optional[bytes], Optional[str]]:
|
|
"""
|
|
get model provider icon.
|
|
|
|
:param tenant_id: workspace id
|
|
:param provider: provider name
|
|
:param icon_type: icon type (icon_small or icon_large)
|
|
:param lang: language (zh_Hans or en_US)
|
|
:return:
|
|
"""
|
|
model_provider_factory = ModelProviderFactory(tenant_id)
|
|
byte_data, mime_type = model_provider_factory.get_provider_icon(provider, icon_type, lang)
|
|
|
|
return byte_data, mime_type
|
|
|
|
def switch_preferred_provider(self, tenant_id: str, provider: str, preferred_provider_type: str) -> None:
|
|
"""
|
|
switch preferred provider.
|
|
|
|
:param tenant_id: workspace id
|
|
:param provider: provider name
|
|
:param preferred_provider_type: preferred provider type
|
|
:return:
|
|
"""
|
|
# Get all provider configurations of the current workspace
|
|
provider_configurations = self.provider_manager.get_configurations(tenant_id)
|
|
|
|
# Convert preferred_provider_type to ProviderType
|
|
preferred_provider_type_enum = ProviderType.value_of(preferred_provider_type)
|
|
|
|
# Get provider configuration
|
|
provider_configuration = provider_configurations.get(provider)
|
|
if not provider_configuration:
|
|
raise ValueError(f"Provider {provider} does not exist.")
|
|
|
|
# Switch preferred provider type
|
|
provider_configuration.switch_preferred_provider_type(preferred_provider_type_enum)
|
|
|
|
def enable_model(self, tenant_id: str, provider: str, model: str, model_type: str) -> None:
|
|
"""
|
|
enable model.
|
|
|
|
:param tenant_id: workspace id
|
|
:param provider: provider name
|
|
:param model: model name
|
|
:param model_type: model type
|
|
:return:
|
|
"""
|
|
# Get all provider configurations of the current workspace
|
|
provider_configurations = self.provider_manager.get_configurations(tenant_id)
|
|
|
|
# Get provider configuration
|
|
provider_configuration = provider_configurations.get(provider)
|
|
if not provider_configuration:
|
|
raise ValueError(f"Provider {provider} does not exist.")
|
|
|
|
# Enable model
|
|
provider_configuration.enable_model(model=model, model_type=ModelType.value_of(model_type))
|
|
|
|
def disable_model(self, tenant_id: str, provider: str, model: str, model_type: str) -> None:
|
|
"""
|
|
disable model.
|
|
|
|
:param tenant_id: workspace id
|
|
:param provider: provider name
|
|
:param model: model name
|
|
:param model_type: model type
|
|
:return:
|
|
"""
|
|
# Get all provider configurations of the current workspace
|
|
provider_configurations = self.provider_manager.get_configurations(tenant_id)
|
|
|
|
# Get provider configuration
|
|
provider_configuration = provider_configurations.get(provider)
|
|
if not provider_configuration:
|
|
raise ValueError(f"Provider {provider} does not exist.")
|
|
|
|
# Enable model
|
|
provider_configuration.disable_model(model=model, model_type=ModelType.value_of(model_type))
|