| 
					
				 | 
			
			
				@@ -1,5 +1,6 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 # -*- coding:utf-8 -*- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import json 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import logging 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from datetime import datetime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from flask_login import login_required, current_user 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -11,7 +12,9 @@ from controllers.console import api 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from controllers.console.app.error import AppNotFoundError, ProviderNotInitializeError 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from controllers.console.setup import setup_required 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from controllers.console.wraps import account_initialization_required 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from core.model_providers.error import ProviderTokenNotInitError, LLMBadRequestError 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from core.model_providers.model_factory import ModelFactory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from core.model_providers.model_provider_factory import ModelProviderFactory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from core.model_providers.models.entity.model_params import ModelType 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from events.app_event import app_was_created, app_was_deleted 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from libs.helper import TimestampField 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -124,24 +127,34 @@ class AppListApi(Resource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if current_user.current_tenant.current_role not in ['admin', 'owner']: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             raise Forbidden() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        default_model = ModelFactory.get_default_model( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tenant_id=current_user.current_tenant_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            model_type=ModelType.TEXT_GENERATION 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if default_model: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            default_model_provider = default_model.provider_name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            default_model_name = default_model.model_name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            raise ProviderNotInitializeError( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                f"No Text Generation Model available. Please configure a valid provider " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                f"in the Settings -> Model Provider.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            default_model = ModelFactory.get_text_generation_model( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tenant_id=current_user.current_tenant_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        except (ProviderTokenNotInitError, LLMBadRequestError): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            default_model = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logging.exception(e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            default_model = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if args['model_config'] is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             # validate config 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             model_config_dict = args['model_config'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            model_config_dict["model"]["provider"] = default_model_provider 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            model_config_dict["model"]["name"] = default_model_name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # get model provider 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            model_provider = ModelProviderFactory.get_preferred_model_provider( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                current_user.current_tenant_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                model_config_dict["model"]["provider"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if not model_provider: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if not default_model: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    raise ProviderNotInitializeError( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        f"No Default System Reasoning Model available. Please configure " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        f"in the Settings -> Model Provider.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    model_config_dict["model"]["provider"] = default_model.model_provider.provider_name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    model_config_dict["model"]["name"] = default_model.name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             model_configuration = AppModelConfigService.validate_configuration( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 tenant_id=current_user.current_tenant_id, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -169,10 +182,22 @@ class AppListApi(Resource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             app = App(**model_config_template['app']) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             app_model_config = AppModelConfig(**model_config_template['model_config']) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            model_dict = app_model_config.model_dict 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            model_dict['provider'] = default_model_provider 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            model_dict['name'] = default_model_name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            app_model_config.model = json.dumps(model_dict) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # get model provider 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            model_provider = ModelProviderFactory.get_preferred_model_provider( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                current_user.current_tenant_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                app_model_config.model_dict["provider"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if not model_provider: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if not default_model: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    raise ProviderNotInitializeError( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        f"No Default System Reasoning Model available. Please configure " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        f"in the Settings -> Model Provider.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    model_dict = app_model_config.model_dict 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    model_dict['provider'] = default_model.model_provider.provider_name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    model_dict['name'] = default_model.name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    app_model_config.model = json.dumps(model_dict) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         app.name = args['name'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         app.mode = args['mode'] 
			 |