diff --git a/apps/application/serializers/application_serializers.py b/apps/application/serializers/application_serializers.py index b71bb6801..499bbde6d 100644 --- a/apps/application/serializers/application_serializers.py +++ b/apps/application/serializers/application_serializers.py @@ -42,6 +42,7 @@ from common.util.file_util import get_file_content from dataset.models import DataSet, Document, Image from dataset.serializers.common_serializers import list_paragraph, get_embedding_model_by_dataset_id_list from embedding.models import SearchMode +from function_lib.serializers.function_lib_serializer import FunctionLibSerializer from setting.models import AuthOperate from setting.models.model_management import Model from setting.models_provider import get_model_credential @@ -575,6 +576,19 @@ class ApplicationSerializer(serializers.Serializer): data={'user_id': application.user_id, 'model_type': model_type}).list( with_valid=True) + def list_function_lib(self, with_valid=True): + if with_valid: + self.is_valid(raise_exception=True) + application = QuerySet(Application).filter(id=self.data.get("application_id")).first() + return FunctionLibSerializer.Query(data={'user_id': application.user_id}).list(with_valid=True) + + def get_function_lib(self, function_lib_id, with_valid=True): + if with_valid: + self.is_valid(raise_exception=True) + application = QuerySet(Application).filter(id=self.data.get("application_id")).first() + return FunctionLibSerializer.Operate(data={'user_id': application.user_id, 'id': function_lib_id}).one( + with_valid=True) + def delete(self, with_valid=True): if with_valid: self.is_valid() diff --git a/apps/application/urls.py b/apps/application/urls.py index 335205d37..d5dbf5860 100644 --- a/apps/application/urls.py +++ b/apps/application/urls.py @@ -19,6 +19,9 @@ urlpatterns = [ path('application//statistics/chat_record_aggregate_trend', views.ApplicationStatistics.ChatRecordAggregateTrend.as_view()), path('application//model', views.Application.Model.as_view()), + path('application//function_lib', views.Application.FunctionLib.as_view()), + path('application//function_lib/', + views.Application.FunctionLib.Operate.as_view()), path('application//hit_test', views.Application.HitTest.as_view()), path('application//api_key', views.Application.ApplicationKey.as_view()), path("application//api_key/", diff --git a/apps/application/views/application_views.py b/apps/application/views/application_views.py index e6fe7191e..c884eafc3 100644 --- a/apps/application/views/application_views.py +++ b/apps/application/views/application_views.py @@ -187,6 +187,43 @@ class Application(APIView): data={'application_id': application_id, 'user_id': request.user.id}).list_model(request.query_params.get('model_type'))) + class FunctionLib(APIView): + authentication_classes = [TokenAuth] + + @action(methods=["GET"], detail=False) + @swagger_auto_schema(operation_summary="获取函数库列表", + operation_id="获取函数库列表", + tags=["应用"]) + @has_permissions(ViewPermission( + [RoleConstants.ADMIN, RoleConstants.USER], + [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, + dynamic_tag=keywords.get('application_id'))], + compare=CompareConstants.AND)) + def get(self, request: Request, application_id: str): + return result.success( + ApplicationSerializer.Operate( + data={'application_id': application_id, + 'user_id': request.user.id}).list_function_lib()) + + class Operate(APIView): + authentication_classes = [TokenAuth] + + @action(methods=["GET"], detail=False) + @swagger_auto_schema(operation_summary="获取函数库列表", + operation_id="获取函数库列表", + tags=["应用"], + ) + @has_permissions(ViewPermission( + [RoleConstants.ADMIN, RoleConstants.USER], + [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, + dynamic_tag=keywords.get('application_id'))], + compare=CompareConstants.AND)) + def get(self, request: Request, application_id: str, function_lib_id: str): + return result.success( + ApplicationSerializer.Operate( + data={'application_id': application_id, + 'user_id': request.user.id}).get_function_lib(function_lib_id)) + class Profile(APIView): authentication_classes = [TokenAuth] diff --git a/ui/src/api/application.ts b/ui/src/api/application.ts index 06e8d1313..0e76b4776 100644 --- a/ui/src/api/application.ts +++ b/ui/src/api/application.ts @@ -248,7 +248,32 @@ const putPublishApplication: ( ) => Promise> = (application_id, data, loading) => { return put(`${prefix}/${application_id}/publish`, data, undefined, loading) } - +/** + * 获取应用所属的函数库列表 + * @param application_id 应用id + * @param loading + * @returns + */ +const listFunctionLib: (application_id: String, loading?: Ref) => Promise> = ( + application_id, + loading +) => { + return get(`${prefix}/${application_id}/function_lib`, undefined, loading) +} +/** + * 获取应用所属的函数库 + * @param application_id + * @param function_lib_id + * @param loading + * @returns + */ +const getFunctionLib: ( + application_id: String, + function_lib_id: String, + loading?: Ref +) => Promise> = (application_id, function_lib_id, loading) => { + return get(`${prefix}/${application_id}/function_lib/${function_lib_id}`, undefined, loading) +} export default { getAllAppilcation, getApplication, @@ -268,5 +293,7 @@ export default { getApplicationHitTest, getApplicationModel, putPublishApplication, - postWorkflowChatOpen + postWorkflowChatOpen, + listFunctionLib, + getFunctionLib } diff --git a/ui/src/views/application-workflow/index.vue b/ui/src/views/application-workflow/index.vue index 91acd7dc3..80a7db35c 100644 --- a/ui/src/views/application-workflow/index.vue +++ b/ui/src/views/application-workflow/index.vue @@ -157,7 +157,6 @@ import { datetimeFormat } from '@/utils/time' import useStore from '@/stores' import { WorkFlowInstance } from '@/workflow/common/validate' import { hasPermission } from '@/utils/permission' -import functionLibApi from '@/api/function-lib' const { user, application } = useStore() const router = useRouter() @@ -300,7 +299,7 @@ function saveApplication() { } function getList() { - functionLibApi.getAllFunctionLib({}, loading).then((res: any) => { + applicationApi.listFunctionLib(id, loading).then((res: any) => { functionLibList.value = res.data }) } diff --git a/ui/src/workflow/nodes/function-lib-node/index.vue b/ui/src/workflow/nodes/function-lib-node/index.vue index 8e97473c3..f4fd02ea1 100644 --- a/ui/src/workflow/nodes/function-lib-node/index.vue +++ b/ui/src/workflow/nodes/function-lib-node/index.vue @@ -80,11 +80,14 @@ import NodeCascader from '@/workflow/common/NodeCascader.vue' import type { FormInstance } from 'element-plus' import { ref, computed, onMounted } from 'vue' import { isLastNode } from '@/workflow/common/data' -import functionLibApi from '@/api/function-lib' +import applicationApi from '@/api/application' +import { app } from '@/main' const props = defineProps<{ nodeModel: any }>() const nodeCascaderRef = ref() - +const { + params: { id } +} = app.config.globalProperties.$route as any const form = { input_field_list: [], is_result: false @@ -113,8 +116,8 @@ const validate = () => { } const update_field = () => { - functionLibApi - .getFunctionLibById(props.nodeModel.properties.node_data.function_lib_id) + applicationApi + .getFunctionLib(id, props.nodeModel.properties.node_data.function_lib_id) .then((ok) => { const old_input_field_list = props.nodeModel.properties.node_data.input_field_list const merge_input_field_list = ok.data.input_field_list.map((item: any) => {