feat: support plugin inner api

This commit is contained in:
Yeuoly
2024-07-29 16:40:04 +08:00
parent ed7fcc5f7d
commit f29b44acd8
5 changed files with 211 additions and 119 deletions

View File

@ -1,34 +1,68 @@
from flask_restful import Resource, reqparse
from controllers.console.setup import setup_required
from controllers.inner_api import api
from controllers.inner_api.plugin.wraps import get_tenant
from controllers.inner_api.plugin.wraps import get_tenant, plugin_data
from controllers.inner_api.wraps import plugin_inner_api_only
from core.plugin.entities.request import RequestInvokeLLM, RequestInvokeModeration, RequestInvokeRerank, RequestInvokeSpeech2Text, RequestInvokeTTS, RequestInvokeTextEmbedding, RequestInvokeTool
from libs.helper import compact_generate_response
from models.account import Tenant
from services.plugin.plugin_invoke_service import PluginInvokeService
class PluginInvokeModelApi(Resource):
class PluginInvokeLLMApi(Resource):
@setup_required
@plugin_inner_api_only
@get_tenant
def post(self, user_id: str, tenant_model: Tenant):
parser = reqparse.RequestParser()
parser.add_argument('provider', type=dict, required=True, location='json')
parser.add_argument('model', type=dict, required=True, location='json')
parser.add_argument('parameters', type=dict, required=True, location='json')
@plugin_data(payload_type=RequestInvokeLLM)
def post(self, user_id: str, tenant_model: Tenant, payload: RequestInvokeLLM):
pass
args = parser.parse_args()
class PluginInvokeTextEmbeddingApi(Resource):
@setup_required
@plugin_inner_api_only
@get_tenant
@plugin_data(payload_type=RequestInvokeTextEmbedding)
def post(self, user_id: str, tenant_model: Tenant, payload: RequestInvokeTextEmbedding):
pass
class PluginInvokeRerankApi(Resource):
@setup_required
@plugin_inner_api_only
@get_tenant
@plugin_data(payload_type=RequestInvokeRerank)
def post(self, user_id: str, tenant_model: Tenant, payload: RequestInvokeRerank):
pass
class PluginInvokeTTSApi(Resource):
@setup_required
@plugin_inner_api_only
@get_tenant
@plugin_data(payload_type=RequestInvokeTTS)
def post(self, user_id: str, tenant_model: Tenant, payload: RequestInvokeTTS):
pass
class PluginInvokeSpeech2TextApi(Resource):
@setup_required
@plugin_inner_api_only
@get_tenant
@plugin_data(payload_type=RequestInvokeSpeech2Text)
def post(self, user_id: str, tenant_model: Tenant, payload: RequestInvokeSpeech2Text):
pass
class PluginInvokeModerationApi(Resource):
@setup_required
@plugin_inner_api_only
@get_tenant
@plugin_data(payload_type=RequestInvokeModeration)
def post(self, user_id: str, tenant_model: Tenant, payload: RequestInvokeModeration):
pass
class PluginInvokeToolApi(Resource):
@setup_required
@plugin_inner_api_only
@get_tenant
@plugin_data(payload_type=RequestInvokeTool)
def post(self, user_id: str, tenant_model: Tenant):
parser = reqparse.RequestParser()
parser.add_argument('provider', type=dict, required=True, location='json')
@ -37,9 +71,9 @@ class PluginInvokeToolApi(Resource):
args = parser.parse_args()
response = PluginInvokeService.invoke_tool(user_id, tenant_model,
args['provider'], args['tool'],
args['parameters'])
response = PluginInvokeService.invoke_tool(
user_id, tenant_model, args['provider'], args['tool'], args['parameters']
)
return compact_generate_response(response)
@ -51,11 +85,14 @@ class PluginInvokeNodeApi(Resource):
parser = reqparse.RequestParser()
args = parser.parse_args()
return {
'message': 'success'
}
return {'message': 'success'}
api.add_resource(PluginInvokeModelApi, '/invoke/model')
api.add_resource(PluginInvokeLLMApi, '/invoke/llm')
api.add_resource(PluginInvokeTextEmbeddingApi, '/invoke/text-embedding')
api.add_resource(PluginInvokeRerankApi, '/invoke/rerank')
api.add_resource(PluginInvokeTTSApi, '/invoke/tts')
api.add_resource(PluginInvokeSpeech2TextApi, '/invoke/speech2text')
api.add_resource(PluginInvokeModerationApi, '/invoke/moderation')
api.add_resource(PluginInvokeToolApi, '/invoke/tool')
api.add_resource(PluginInvokeNodeApi, '/invoke/node')

View File

@ -2,7 +2,9 @@ from collections.abc import Callable
from functools import wraps
from typing import Optional
from flask import request
from flask_restful import reqparse
from pydantic import BaseModel
from extensions.ext_database import db
from models.account import Tenant
@ -45,3 +47,26 @@ def get_tenant(view: Optional[Callable] = None):
return decorator
else:
return decorator(view)
def plugin_data(view: Optional[Callable] = None, *, payload_type: type[BaseModel]):
def decorator(view_func):
def decorated_view(*args, **kwargs):
try:
data = request.get_json()
except Exception:
raise ValueError('invalid json')
try:
payload = payload_type(**data)
except Exception as e:
raise ValueError(f'invalid payload: {str(e)}')
kwargs['payload'] = payload
return view_func(*args, **kwargs)
return decorated_view
if view is None:
return decorator
else:
return decorator(view)