| 
					
				 | 
			
			
				@@ -4,12 +4,11 @@ from collections.abc import Generator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from typing import Union 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from flask import Response, stream_with_context 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from flask_restful import reqparse 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from flask_restful import Resource, reqparse 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from werkzeug.exceptions import InternalServerError, NotFound 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import services 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from controllers.service_api import api 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from controllers.service_api.app import create_or_update_end_user_for_user_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from controllers.service_api.app.error import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     AppUnavailableError, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     CompletionRequestError, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -19,17 +18,19 @@ from controllers.service_api.app.error import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ProviderNotInitializeError, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ProviderQuotaExceededError, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from controllers.service_api.wraps import AppApiResource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from controllers.service_api.wraps import FetchUserArg, WhereisUserArg, validate_app_token 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from core.application_queue_manager import ApplicationQueueManager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from core.entities.application_entities import InvokeFrom 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from core.errors.error import ModelCurrentlyNotSupportError, ProviderTokenNotInitError, QuotaExceededError 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from core.model_runtime.errors.invoke import InvokeError 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from libs.helper import uuid_value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from models.model import App, EndUser 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from services.completion_service import CompletionService 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class CompletionApi(AppApiResource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def post(self, app_model, end_user): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class CompletionApi(Resource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @validate_app_token(fetch_user_arg=FetchUserArg(fetch_from=WhereisUserArg.JSON, required=True)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def post(self, app_model: App, end_user: EndUser): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if app_model.mode != 'completion': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             raise AppUnavailableError() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -38,16 +39,12 @@ class CompletionApi(AppApiResource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         parser.add_argument('query', type=str, location='json', default='') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         parser.add_argument('files', type=list, required=False, location='json') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         parser.add_argument('response_mode', type=str, choices=['blocking', 'streaming'], location='json') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        parser.add_argument('user', required=True, nullable=False, type=str, location='json') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         parser.add_argument('retriever_from', type=str, required=False, default='dev', location='json') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         args = parser.parse_args() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         streaming = args['response_mode'] == 'streaming' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if end_user is None and args['user'] is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            end_user = create_or_update_end_user_for_user_id(app_model, args['user']) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         args['auto_generate_name'] = False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -82,29 +79,20 @@ class CompletionApi(AppApiResource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             raise InternalServerError() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class CompletionStopApi(AppApiResource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def post(self, app_model, end_user, task_id): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class CompletionStopApi(Resource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @validate_app_token(fetch_user_arg=FetchUserArg(fetch_from=WhereisUserArg.JSON, required=True)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def post(self, app_model: App, end_user: EndUser, task_id): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if app_model.mode != 'completion': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             raise AppUnavailableError() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if end_user is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            parser = reqparse.RequestParser() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            parser.add_argument('user', required=True, nullable=False, type=str, location='json') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            args = parser.parse_args() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            user = args.get('user') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if user is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                end_user = create_or_update_end_user_for_user_id(app_model, user) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                raise ValueError("arg user muse be input.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ApplicationQueueManager.set_stop_flag(task_id, InvokeFrom.SERVICE_API, end_user.id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return {'result': 'success'}, 200 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class ChatApi(AppApiResource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def post(self, app_model, end_user): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class ChatApi(Resource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @validate_app_token(fetch_user_arg=FetchUserArg(fetch_from=WhereisUserArg.JSON, required=True)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def post(self, app_model: App, end_user: EndUser): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if app_model.mode != 'chat': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             raise NotChatAppError() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -114,7 +102,6 @@ class ChatApi(AppApiResource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         parser.add_argument('files', type=list, required=False, location='json') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         parser.add_argument('response_mode', type=str, choices=['blocking', 'streaming'], location='json') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         parser.add_argument('conversation_id', type=uuid_value, location='json') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        parser.add_argument('user', type=str, required=True, nullable=False, location='json') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         parser.add_argument('retriever_from', type=str, required=False, default='dev', location='json') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         parser.add_argument('auto_generate_name', type=bool, required=False, default=True, location='json') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -122,9 +109,6 @@ class ChatApi(AppApiResource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         streaming = args['response_mode'] == 'streaming' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if end_user is None and args['user'] is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            end_user = create_or_update_end_user_for_user_id(app_model, args['user']) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             response = CompletionService.completion( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 app_model=app_model, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -157,22 +141,12 @@ class ChatApi(AppApiResource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             raise InternalServerError() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class ChatStopApi(AppApiResource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def post(self, app_model, end_user, task_id): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class ChatStopApi(Resource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @validate_app_token(fetch_user_arg=FetchUserArg(fetch_from=WhereisUserArg.JSON, required=True)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def post(self, app_model: App, end_user: EndUser, task_id): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if app_model.mode != 'chat': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             raise NotChatAppError() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if end_user is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            parser = reqparse.RequestParser() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            parser.add_argument('user', required=True, nullable=False, type=str, location='json') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            args = parser.parse_args() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            user = args.get('user') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if user is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                end_user = create_or_update_end_user_for_user_id(app_model, user) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                raise ValueError("arg user muse be input.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ApplicationQueueManager.set_stop_flag(task_id, InvokeFrom.SERVICE_API, end_user.id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return {'result': 'success'}, 200 
			 |