From b7ceac61ad090111ad1a4f4de01b90451cc0d519 Mon Sep 17 00:00:00 2001 From: shaohuzhang1 Date: Tue, 27 Aug 2024 15:06:54 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E7=BB=99=E5=85=B6=E4=BB=96=E7=94=A8=E6=88=B7?= =?UTF-8?q?=EF=BC=8C=E5=85=B6=E4=BB=96=E7=94=A8=E6=88=B7=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E7=BC=96=E8=BE=91=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serializers/application_serializers.py | 7 +++++++ apps/application/urls.py | 2 ++ apps/application/views/application_views.py | 19 +++++++++++++++++++ ui/src/api/application.ts | 19 +++++++++++++++++-- .../views/application/ApplicationSetting.vue | 4 ++-- .../component/AIModeParamSettingDialog.vue | 19 +++++++++++++------ ui/src/workflow/nodes/ai-chat-node/index.vue | 4 ++-- ui/src/workflow/nodes/question-node/index.vue | 4 ++-- 8 files changed, 64 insertions(+), 14 deletions(-) diff --git a/apps/application/serializers/application_serializers.py b/apps/application/serializers/application_serializers.py index 499bbde6d..910d0b2c4 100644 --- a/apps/application/serializers/application_serializers.py +++ b/apps/application/serializers/application_serializers.py @@ -589,6 +589,13 @@ class ApplicationSerializer(serializers.Serializer): return FunctionLibSerializer.Operate(data={'user_id': application.user_id, 'id': function_lib_id}).one( with_valid=True) + def get_model_params_form(self, model_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 ModelSerializer.ModelParams( + data={'user_id': application.user_id, 'id': model_id}).get_model_params(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 d5dbf5860..12b25fd07 100644 --- a/apps/application/urls.py +++ b/apps/application/urls.py @@ -22,6 +22,8 @@ urlpatterns = [ path('application//function_lib', views.Application.FunctionLib.as_view()), path('application//function_lib/', views.Application.FunctionLib.Operate.as_view()), + path('application//model_params_form/', + views.Application.ModelParamsForm.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 c884eafc3..560c69fab 100644 --- a/apps/application/views/application_views.py +++ b/apps/application/views/application_views.py @@ -27,6 +27,7 @@ from common.response import result from common.swagger_api.common_api import CommonApi from common.util.common import query_params_to_single_dict from dataset.serializers.dataset_serializers import DataSetSerializers +from setting.swagger_api.provide_api import ProvideApi chat_cache = cache.caches['chat_cache'] @@ -187,6 +188,24 @@ class Application(APIView): data={'application_id': application_id, 'user_id': request.user.id}).list_model(request.query_params.get('model_type'))) + class ModelParamsForm(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, model_id: str): + return result.success( + ApplicationSerializer.Operate( + data={'application_id': application_id, + 'user_id': request.user.id}).get_model_params_form(model_id)) + class FunctionLib(APIView): authentication_classes = [TokenAuth] diff --git a/ui/src/api/application.ts b/ui/src/api/application.ts index 0e76b4776..76c20f377 100644 --- a/ui/src/api/application.ts +++ b/ui/src/api/application.ts @@ -3,7 +3,7 @@ import { get, post, postStream, del, put } from '@/request/index' import type { pageRequest } from '@/api/type/common' import type { ApplicationFormType } from '@/api/type/application' import { type Ref } from 'vue' - +import type { FormField } from '@/components/dynamics-form/type' const prefix = '/application' /** @@ -274,6 +274,20 @@ const getFunctionLib: ( ) => Promise> = (application_id, function_lib_id, loading) => { return get(`${prefix}/${application_id}/function_lib/${function_lib_id}`, undefined, loading) } +/** + * 获取模型参数表单 + * @param application_id 应用id + * @param model_id 模型id + * @param loading + * @returns + */ +const getModelParamsForm: ( + application_id: String, + model_id: String, + loading?: Ref +) => Promise>> = (application_id, model_id, loading) => { + return get(`${prefix}/${application_id}/model_params_form/${model_id}`, undefined, loading) +} export default { getAllAppilcation, getApplication, @@ -295,5 +309,6 @@ export default { putPublishApplication, postWorkflowChatOpen, listFunctionLib, - getFunctionLib + getFunctionLib, + getModelParamsForm } diff --git a/ui/src/views/application/ApplicationSetting.vue b/ui/src/views/application/ApplicationSetting.vue index 7880ee4ca..7ba0a87db 100644 --- a/ui/src/views/application/ApplicationSetting.vue +++ b/ui/src/views/application/ApplicationSetting.vue @@ -453,7 +453,7 @@ const submit = async (formEl: FormInstance | undefined) => { } const model_change = (model_id?: string) => { if (model_id) { - AIModeParamSettingDialogRef.value?.reset_default(model_id) + AIModeParamSettingDialogRef.value?.reset_default(model_id, id) } else { refreshForm({}) } @@ -464,7 +464,7 @@ const openAIParamSettingDialog = () => { MsgSuccess(t('请选择AI 模型')) return } - AIModeParamSettingDialogRef.value?.open(model_id, applicationForm.value.model_params_setting) + AIModeParamSettingDialogRef.value?.open(model_id, id, applicationForm.value.model_params_setting) } const openParamSettingDialog = () => { diff --git a/ui/src/views/application/component/AIModeParamSettingDialog.vue b/ui/src/views/application/component/AIModeParamSettingDialog.vue index 1bfd30655..315bb0456 100644 --- a/ui/src/views/application/component/AIModeParamSettingDialog.vue +++ b/ui/src/views/application/component/AIModeParamSettingDialog.vue @@ -34,6 +34,7 @@ import { ref } from 'vue' import type { FormField } from '@/components/dynamics-form/type' import modelAPi from '@/api/model' +import applicationApi from '@/api/application' import DynamicsForm from '@/components/dynamics-form/index.vue' import { keys } from 'lodash' const model_form_field = ref>([]) @@ -42,16 +43,21 @@ const dynamicsFormRef = ref>() const form_data = ref({}) const dialogVisible = ref(false) const loading = ref(false) - -const open = (model_id: string, model_setting_data?: any) => { +const getApi = (model_id: string, application_id?: string) => { + return application_id + ? applicationApi.getModelParamsForm(application_id, model_id, loading) + : modelAPi.getModelParamsForm(model_id, loading) +} +const open = (model_id: string, application_id?: string, model_setting_data?: any) => { form_data.value = {} - modelAPi.getModelParamsForm(model_id, loading).then((ok) => { + const api = getApi(model_id, application_id) + api.then((ok) => { model_form_field.value = ok.data model_setting_data = model_setting_data && keys(model_setting_data).length > 0 ? model_setting_data : ok.data - .map((item) => ({ [item.field]: item.default_value })) + .map((item: any) => ({ [item.field]: item.default_value })) .reduce((x, y) => ({ ...x, ...y }), {}) // 渲染动态表单 dynamicsFormRef.value?.render(model_form_field.value, model_setting_data) @@ -59,8 +65,9 @@ const open = (model_id: string, model_setting_data?: any) => { dialogVisible.value = true } -const reset_default = (model_id: string) => { - modelAPi.getModelParamsForm(model_id, loading).then((ok) => { +const reset_default = (model_id: string, application_id?: string) => { + const api = getApi(model_id, application_id) + api.then((ok) => { model_form_field.value = ok.data const model_setting_data = ok.data .map((item) => ({ [item.field]: item.default_value })) diff --git a/ui/src/workflow/nodes/ai-chat-node/index.vue b/ui/src/workflow/nodes/ai-chat-node/index.vue index 87737459c..236d1bac0 100644 --- a/ui/src/workflow/nodes/ai-chat-node/index.vue +++ b/ui/src/workflow/nodes/ai-chat-node/index.vue @@ -241,7 +241,7 @@ function submitDialog() { } const model_change = (model_id?: string) => { if (model_id) { - AIModeParamSettingDialogRef.value?.reset_default(model_id) + AIModeParamSettingDialogRef.value?.reset_default(model_id, id) } else { refreshParam({}) } @@ -321,7 +321,7 @@ const openCreateModel = (provider?: Provider) => { const openAIParamSettingDialog = (modelId: string) => { if (modelId) { - AIModeParamSettingDialogRef.value?.open(modelId, chat_data.value.model_params_setting) + AIModeParamSettingDialogRef.value?.open(modelId, id, chat_data.value.model_params_setting) } } diff --git a/ui/src/workflow/nodes/question-node/index.vue b/ui/src/workflow/nodes/question-node/index.vue index adfb34b8d..92ae8849d 100644 --- a/ui/src/workflow/nodes/question-node/index.vue +++ b/ui/src/workflow/nodes/question-node/index.vue @@ -234,7 +234,7 @@ function openDialog() { } const model_change = (model_id?: string) => { if (model_id) { - AIModeParamSettingDialogRef.value?.reset_default(model_id) + AIModeParamSettingDialogRef.value?.reset_default(model_id, id) } else { refreshParam({}) } @@ -263,7 +263,7 @@ function refreshParam(data: any) { const openAIParamSettingDialog = (modelId: string) => { if (modelId) { - AIModeParamSettingDialogRef.value?.open(modelId, form_data.value.model_params_setting) + AIModeParamSettingDialogRef.value?.open(modelId, id, form_data.value.model_params_setting) } } const form_data = computed({