From eedb1be6d8061c1538450f61a1b848a3f7d84113 Mon Sep 17 00:00:00 2001 From: shaohuzhang1 Date: Mon, 26 Aug 2024 19:50:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=BC=96=E6=8E=92?= =?UTF-8?q?=E4=B8=AD=E5=BC=95=E7=94=A8=E5=87=BD=E6=95=B0=EF=BC=8C=E5=8E=9F?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E6=9B=B4=E6=96=B0=E5=90=8E=EF=BC=8C=E7=BC=96?= =?UTF-8?q?=E6=8E=92=E4=B8=AD=E6=9C=AA=E5=90=8C=E6=AD=A5=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/application/flow/i_step_node.py | 5 +++- .../function_lib_node/i_function_lib_node.py | 5 ++++ apps/application/flow/workflow_manage.py | 10 ++++++++ apps/function_lib/views/function_lib_views.py | 9 +++++++ ui/src/api/function-lib.ts | 15 ++++++++++- ui/src/views/application-workflow/index.vue | 9 ++++++- .../component/AIModeParamSettingDialog.vue | 6 ++--- ui/src/workflow/common/NodeContainer.vue | 19 +++++++++++--- ui/src/workflow/common/validate.ts | 3 +++ .../nodes/function-lib-node/index.vue | 25 +++++++++++++++++-- 10 files changed, 93 insertions(+), 13 deletions(-) diff --git a/apps/application/flow/i_step_node.py b/apps/application/flow/i_step_node.py index b0058cbe..5ac951da 100644 --- a/apps/application/flow/i_step_node.py +++ b/apps/application/flow/i_step_node.py @@ -13,6 +13,7 @@ from typing import Type, Dict, List from django.core import cache from django.db.models import QuerySet from rest_framework import serializers +from rest_framework.exceptions import ValidationError, ErrorDetail from application.models import ChatRecord from application.models.api_key_model import ApplicationPublicAccessClient @@ -123,12 +124,12 @@ class INode: self.err_message = '' self.node = node self.node_params = node.properties.get('node_data') + self.workflow_params = workflow_params self.workflow_manage = workflow_manage self.node_params_serializer = None self.flow_params_serializer = None self.context = {} self.id = node.id - self.valid_args(self.node_params, workflow_params) def valid_args(self, node_params, flow_params): flow_params_serializer_class = self.get_flow_params_serializer_class() @@ -139,6 +140,8 @@ class INode: if node_params_serializer_class is not None: self.node_params_serializer = node_params_serializer_class(data=node_params) self.node_params_serializer.is_valid(raise_exception=True) + if self.node.properties.get('status', 200) != 200: + raise ValidationError(ErrorDetail(f'节点{self.node.properties.get("stepName")} 不可用')) def get_reference_field(self, fields: List[str]): return self.get_field(self.context, fields) diff --git a/apps/application/flow/step_node/function_lib_node/i_function_lib_node.py b/apps/application/flow/step_node/function_lib_node/i_function_lib_node.py index 0d1d2b82..e69d40a1 100644 --- a/apps/application/flow/step_node/function_lib_node/i_function_lib_node.py +++ b/apps/application/flow/step_node/function_lib_node/i_function_lib_node.py @@ -8,11 +8,13 @@ """ from typing import Type +from django.db.models import QuerySet from rest_framework import serializers from application.flow.i_step_node import INode, NodeResult from common.field.common import ObjectField from common.util.field_message import ErrMessage +from function_lib.models.function import FunctionLib class InputField(serializers.Serializer): @@ -27,6 +29,9 @@ class FunctionLibNodeParamsSerializer(serializers.Serializer): def is_valid(self, *, raise_exception=False): super().is_valid(raise_exception=True) + f_lib = QuerySet(FunctionLib).filter(id=self.data.get('function_lib_id')).first() + if f_lib is None: + raise Exception('函数库已被删除') class IFunctionLibNode(INode): diff --git a/apps/application/flow/workflow_manage.py b/apps/application/flow/workflow_manage.py index 0fc9c27f..9548bf04 100644 --- a/apps/application/flow/workflow_manage.py +++ b/apps/application/flow/workflow_manage.py @@ -19,6 +19,7 @@ from application.flow import tools from application.flow.i_step_node import INode, WorkFlowPostHandler, NodeResult from application.flow.step_node import get_node from common.exception.app_exception import AppApiException +from function_lib.models.function import FunctionLib from setting.models import Model from setting.models_provider import get_model_credential @@ -142,6 +143,13 @@ class Flow: model_params_setting = model_params_setting_form.get_default_form_data() node.properties.get('node_data', {})['model_params_setting'] = model_params_setting model_params_setting_form.valid_form(model_params_setting) + if node.properties.get('status', 200) != 200: + raise ValidationError(ErrorDetail(f'节点{node.properties.get("stepName")} 不可用')) + node_list = [node for node in self.nodes if (node.type == 'function-lib-node')] + for node in node_list: + f_lib = QuerySet(FunctionLib).filter(id=node.properties.get('function_lib_id')).first() + if f_lib is None: + raise ValidationError(ErrorDetail(f'节点{node.properties.get("stepName")} 函数库不可用')) def is_valid_base_node(self): base_node_list = [node for node in self.nodes if node.id == 'base-node'] @@ -171,6 +179,7 @@ class WorkflowManage: try: while self.has_next_node(self.current_result): self.current_node = self.get_next_node() + self.current_node.valid_args(self.current_node.node_params, self.current_node.workflow_params) self.node_context.append(self.current_node) self.current_result = self.current_node.run() result = self.current_result.write_context(self.current_node, self) @@ -193,6 +202,7 @@ class WorkflowManage: while self.has_next_node(self.current_result): self.current_node = self.get_next_node() self.node_context.append(self.current_node) + self.current_node.valid_args(self.current_node.node_params, self.current_node.workflow_params) self.current_result = self.current_node.run() result = self.current_result.write_context(self.current_node, self) if result is not None: diff --git a/apps/function_lib/views/function_lib_views.py b/apps/function_lib/views/function_lib_views.py index 2eebe894..7589a608 100644 --- a/apps/function_lib/views/function_lib_views.py +++ b/apps/function_lib/views/function_lib_views.py @@ -80,6 +80,15 @@ class FunctionLibView(APIView): return result.success( FunctionLibSerializer.Operate(data={'user_id': request.user.id, 'id': function_lib_id}).delete()) + @action(methods=['GET'], detail=False) + @swagger_auto_schema(operation_summary="获取函数详情", + operation_id="获取函数详情", + tags=['函数库']) + @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) + def get(self, request: Request, function_lib_id: str): + return result.success( + FunctionLibSerializer.Operate(data={'user_id': request.user.id, 'id': function_lib_id}).one()) + class Page(APIView): authentication_classes = [TokenAuth] diff --git a/ui/src/api/function-lib.ts b/ui/src/api/function-lib.ts index 990d8632..c68b6a9a 100644 --- a/ui/src/api/function-lib.ts +++ b/ui/src/api/function-lib.ts @@ -83,6 +83,18 @@ const delFunctionLib: ( ) => Promise> = (function_lib_id, loading) => { return del(`${prefix}/${function_lib_id}`, undefined, {}, loading) } +/** + * 获取函数详情 + * @param function_lib_id 函数id + * @param loading 加载器 + * @returns 函数详情 + */ +const getFunctionLibById: ( + function_lib_id: String, + loading?: Ref +) => Promise> = (function_lib_id, loading) => { + return get(`${prefix}/${function_lib_id}`, undefined, loading) +} export default { getFunctionLib, @@ -90,5 +102,6 @@ export default { putFunctionLib, postFunctionLibDebug, getAllFunctionLib, - delFunctionLib + delFunctionLib, + getFunctionLibById } diff --git a/ui/src/views/application-workflow/index.vue b/ui/src/views/application-workflow/index.vue index 97d421f8..7d35658c 100644 --- a/ui/src/views/application-workflow/index.vue +++ b/ui/src/views/application-workflow/index.vue @@ -256,7 +256,14 @@ function clickNodes(item: any, data?: any) { function onmousedown(item: any, data?: any) { if (data) { item['properties']['stepName'] = data.name - item['properties']['node_data'] = { ...data, function_lib_id: data.id } + item['properties']['node_data'] = { + ...data, + function_lib_id: data.id, + input_field_list: data.input_field_list.map((field: any) => ({ + ...field, + value: field.source == 'reference' ? [] : '' + })) + } } workflowRef.value?.onmousedown(item) showPopover.value = false diff --git a/ui/src/views/application/component/AIModeParamSettingDialog.vue b/ui/src/views/application/component/AIModeParamSettingDialog.vue index cf15e08b..1bfd3065 100644 --- a/ui/src/views/application/component/AIModeParamSettingDialog.vue +++ b/ui/src/views/application/component/AIModeParamSettingDialog.vue @@ -60,15 +60,13 @@ const open = (model_id: string, model_setting_data?: any) => { } const reset_default = (model_id: string) => { - form_data.value = {} modelAPi.getModelParamsForm(model_id, loading).then((ok) => { model_form_field.value = ok.data const model_setting_data = ok.data .map((item) => ({ [item.field]: item.default_value })) .reduce((x, y) => ({ ...x, ...y }), {}) - // 渲染动态表单 - dynamicsFormRef.value?.render(model_form_field.value, model_setting_data) - emit('refresh', form_data.value) + + emit('refresh', model_setting_data) }) } diff --git a/ui/src/workflow/common/NodeContainer.vue b/ui/src/workflow/common/NodeContainer.vue index 0f04d357..ac9b80be 100644 --- a/ui/src/workflow/common/NodeContainer.vue +++ b/ui/src/workflow/common/NodeContainer.vue @@ -7,7 +7,10 @@ >
-
+

{{ nodeModel.properties.stepName }}

+
+ 不可用 @@ -73,7 +80,7 @@