| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 | import jsonfrom json import JSONDecodeErrorfrom typing import Typefrom core.helper import encrypterfrom core.model_providers.models.base import BaseProviderModelfrom core.model_providers.models.entity.model_params import ModelKwargsRules, KwargRule, ModelType, ModelModefrom core.model_providers.models.llm.tongyi_model import TongyiModelfrom core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedErrorfrom core.third_party.langchain.llms.tongyi_llm import EnhanceTongyifrom models.provider import ProviderTypeclass TongyiProvider(BaseModelProvider):    @property    def provider_name(self):        """        Returns the name of a provider.        """        return 'tongyi'    def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]:        if model_type == ModelType.TEXT_GENERATION:            return [                {                    'id': 'qwen-turbo',                    'name': 'qwen-turbo',                    'mode': ModelMode.COMPLETION.value,                },                {                    'id': 'qwen-plus',                    'name': 'qwen-plus',                    'mode': ModelMode.COMPLETION.value,                }            ]        else:            return []    def _get_text_generation_model_mode(self, model_name) -> str:        return ModelMode.COMPLETION.value    def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]:        """        Returns the model class.        :param model_type:        :return:        """        if model_type == ModelType.TEXT_GENERATION:            model_class = TongyiModel        else:            raise NotImplementedError        return model_class    def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules:        """        get model parameter rules.        :param model_name:        :param model_type:        :return:        """        model_max_tokens = {            'qwen-turbo': 6000,            'qwen-plus': 6000        }        return ModelKwargsRules(            temperature=KwargRule[float](min=0.01, max=1, default=1, precision=2),            top_p=KwargRule[float](min=0.01, max=0.99, default=0.5, precision=2),            presence_penalty=KwargRule[float](enabled=False),            frequency_penalty=KwargRule[float](enabled=False),            max_tokens=KwargRule[int](enabled=False, max=model_max_tokens.get(model_name)),        )    @classmethod    def is_provider_credentials_valid_or_raise(cls, credentials: dict):        """        Validates the given credentials.        """        if 'dashscope_api_key' not in credentials:            raise CredentialsValidateFailedError('Dashscope API Key must be provided.')        try:            credential_kwargs = {                'dashscope_api_key': credentials['dashscope_api_key']            }            llm = EnhanceTongyi(                model_name='qwen-turbo',                max_retries=1,                **credential_kwargs            )            llm("ping")        except Exception as ex:            raise CredentialsValidateFailedError(str(ex))    @classmethod    def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict:        credentials['dashscope_api_key'] = encrypter.encrypt_token(tenant_id, credentials['dashscope_api_key'])        return credentials    def get_provider_credentials(self, obfuscated: bool = False) -> dict:        if self.provider.provider_type == ProviderType.CUSTOM.value:            try:                credentials = json.loads(self.provider.encrypted_config)            except JSONDecodeError:                credentials = {                    'dashscope_api_key': None                }            if credentials['dashscope_api_key']:                credentials['dashscope_api_key'] = encrypter.decrypt_token(                    self.provider.tenant_id,                    credentials['dashscope_api_key']                )                if obfuscated:                    credentials['dashscope_api_key'] = encrypter.obfuscated_token(credentials['dashscope_api_key'])            return credentials        return {}    @classmethod    def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict):        """        check model credentials valid.        :param model_name:        :param model_type:        :param credentials:        """        return    @classmethod    def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType,                                  credentials: dict) -> dict:        """        encrypt model credentials for save.        :param tenant_id:        :param model_name:        :param model_type:        :param credentials:        :return:        """        return {}    def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict:        """        get credentials for llm use.        :param model_name:        :param model_type:        :param obfuscated:        :return:        """        return self.get_provider_credentials(obfuscated)
 |