|
@@ -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
|