Team Ai
Apppublic

Underground-Digital/Workflow-Engine

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
model_providers.py235 linesDownload Raw Back to workspace
1import io2 3from flask import send_file4from flask_login import current_user5from flask_restful import Resource, reqparse6from werkzeug.exceptions import Forbidden7 8from controllers.console import api9from controllers.console.wraps import account_initialization_required, setup_required10from core.model_runtime.entities.model_entities import ModelType11from core.model_runtime.errors.validate import CredentialsValidateFailedError12from core.model_runtime.utils.encoders import jsonable_encoder13from libs.login import login_required14from services.billing_service import BillingService15from services.model_provider_service import ModelProviderService16 17 18class ModelProviderListApi(Resource):19    @setup_required20    @login_required21    @account_initialization_required22    def get(self):23        tenant_id = current_user.current_tenant_id24 25        parser = reqparse.RequestParser()26        parser.add_argument(27            "model_type",28            type=str,29            required=False,30            nullable=True,31            choices=[mt.value for mt in ModelType],32            location="args",33        )34        args = parser.parse_args()35 36        model_provider_service = ModelProviderService()37        provider_list = model_provider_service.get_provider_list(tenant_id=tenant_id, model_type=args.get("model_type"))38 39        return jsonable_encoder({"data": provider_list})40 41 42class ModelProviderCredentialApi(Resource):43    @setup_required44    @login_required45    @account_initialization_required46    def get(self, provider: str):47        tenant_id = current_user.current_tenant_id48 49        model_provider_service = ModelProviderService()50        credentials = model_provider_service.get_provider_credentials(tenant_id=tenant_id, provider=provider)51 52        return {"credentials": credentials}53 54 55class ModelProviderValidateApi(Resource):56    @setup_required57    @login_required58    @account_initialization_required59    def post(self, provider: str):60        parser = reqparse.RequestParser()61        parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json")62        args = parser.parse_args()63 64        tenant_id = current_user.current_tenant_id65 66        model_provider_service = ModelProviderService()67 68        result = True69        error = None70 71        try:72            model_provider_service.provider_credentials_validate(73                tenant_id=tenant_id, provider=provider, credentials=args["credentials"]74            )75        except CredentialsValidateFailedError as ex:76            result = False77            error = str(ex)78 79        response = {"result": "success" if result else "error"}80 81        if not result:82            response["error"] = error83 84        return response85 86 87class ModelProviderApi(Resource):88    @setup_required89    @login_required90    @account_initialization_required91    def post(self, provider: str):92        if not current_user.is_admin_or_owner:93            raise Forbidden()94 95        parser = reqparse.RequestParser()96        parser.add_argument("credentials", type=dict, required=True, nullable=False, location="json")97        args = parser.parse_args()98 99        model_provider_service = ModelProviderService()100 101        try:102            model_provider_service.save_provider_credentials(103                tenant_id=current_user.current_tenant_id, provider=provider, credentials=args["credentials"]104            )105        except CredentialsValidateFailedError as ex:106            raise ValueError(str(ex))107 108        return {"result": "success"}, 201109 110    @setup_required111    @login_required112    @account_initialization_required113    def delete(self, provider: str):114        if not current_user.is_admin_or_owner:115            raise Forbidden()116 117        model_provider_service = ModelProviderService()118        model_provider_service.remove_provider_credentials(tenant_id=current_user.current_tenant_id, provider=provider)119 120        return {"result": "success"}, 204121 122 123class ModelProviderIconApi(Resource):124    """125    Get model provider icon126    """127 128    def get(self, provider: str, icon_type: str, lang: str):129        model_provider_service = ModelProviderService()130        icon, mimetype = model_provider_service.get_model_provider_icon(131            provider=provider,132            icon_type=icon_type,133            lang=lang,134        )135 136        return send_file(io.BytesIO(icon), mimetype=mimetype)137 138 139class PreferredProviderTypeUpdateApi(Resource):140    @setup_required141    @login_required142    @account_initialization_required143    def post(self, provider: str):144        if not current_user.is_admin_or_owner:145            raise Forbidden()146 147        tenant_id = current_user.current_tenant_id148 149        parser = reqparse.RequestParser()150        parser.add_argument(151            "preferred_provider_type",152            type=str,153            required=True,154            nullable=False,155            choices=["system", "custom"],156            location="json",157        )158        args = parser.parse_args()159 160        model_provider_service = ModelProviderService()161        model_provider_service.switch_preferred_provider(162            tenant_id=tenant_id, provider=provider, preferred_provider_type=args["preferred_provider_type"]163        )164 165        return {"result": "success"}166 167 168class ModelProviderPaymentCheckoutUrlApi(Resource):169    @setup_required170    @login_required171    @account_initialization_required172    def get(self, provider: str):173        if provider != "anthropic":174            raise ValueError(f"provider name {provider} is invalid")175        BillingService.is_tenant_owner_or_admin(current_user)176        data = BillingService.get_model_provider_payment_link(177            provider_name=provider,178            tenant_id=current_user.current_tenant_id,179            account_id=current_user.id,180            prefilled_email=current_user.email,181        )182        return data183 184 185class ModelProviderFreeQuotaSubmitApi(Resource):186    @setup_required187    @login_required188    @account_initialization_required189    def post(self, provider: str):190        model_provider_service = ModelProviderService()191        result = model_provider_service.free_quota_submit(tenant_id=current_user.current_tenant_id, provider=provider)192 193        return result194 195 196class ModelProviderFreeQuotaQualificationVerifyApi(Resource):197    @setup_required198    @login_required199    @account_initialization_required200    def get(self, provider: str):201        parser = reqparse.RequestParser()202        parser.add_argument("token", type=str, required=False, nullable=True, location="args")203        args = parser.parse_args()204 205        model_provider_service = ModelProviderService()206        result = model_provider_service.free_quota_qualification_verify(207            tenant_id=current_user.current_tenant_id, provider=provider, token=args["token"]208        )209 210        return result211 212 213api.add_resource(ModelProviderListApi, "/workspaces/current/model-providers")214 215api.add_resource(ModelProviderCredentialApi, "/workspaces/current/model-providers/<string:provider>/credentials")216api.add_resource(ModelProviderValidateApi, "/workspaces/current/model-providers/<string:provider>/credentials/validate")217api.add_resource(ModelProviderApi, "/workspaces/current/model-providers/<string:provider>")218api.add_resource(219    ModelProviderIconApi, "/workspaces/current/model-providers/<string:provider>/<string:icon_type>/<string:lang>"220)221 222api.add_resource(223    PreferredProviderTypeUpdateApi, "/workspaces/current/model-providers/<string:provider>/preferred-provider-type"224)225api.add_resource(226    ModelProviderPaymentCheckoutUrlApi, "/workspaces/current/model-providers/<string:provider>/checkout-url"227)228api.add_resource(229    ModelProviderFreeQuotaSubmitApi, "/workspaces/current/model-providers/<string:provider>/free-quota-submit"230)231api.add_resource(232    ModelProviderFreeQuotaQualificationVerifyApi,233    "/workspaces/current/model-providers/<string:provider>/free-quota-qualification-verify",234)235