Parcourir la source

编排模型参数配置

CzRger il y a 6 jours
Parent
commit
24773f0918

+ 90 - 15
src/views/manage/app/make/index.vue

@@ -136,7 +136,16 @@
                 class="col-span-1 overflow-y-auto rounded-lg bg-[#ffffff] p-4"
               >
                 <template v-if="state.detail.type === 0">
-                  <div class="__czr-title_2">模型选择</div>
+                  <div class="__czr-title_2">
+                    模型选择
+                    <div
+                      v-if="state.form.modelId"
+                      class="__hover ml-4 text-sm font-normal text-[var(--czr-main-color)]"
+                      @click="onModelConfig"
+                    >
+                      参数配置
+                    </div>
+                  </div>
                   <div class="mt-4">
                     <CzrFormColumn
                       class="__czr-table-form-column"
@@ -491,19 +500,30 @@
                   v-if="state.form.advise.types.includes(AdviseType.Open)"
                 >
                   <div class="mt-4">
-                    <CzrFormColumn
-                      class="__czr-table-form-column"
-                      required
-                      label="模型选择"
-                      :span="24"
-                      v-model:param="state.form.advise.modelId"
-                      link="select"
-                      :options="DictionaryStore.models.list"
-                      placeholder="点击选择模型"
-                      @click.capture.stop="onAdviseModel"
-                      default-error-msg="请选择问题建议模型"
-                      :clearable="false"
-                    />
+                    <div class="flex items-center">
+                      <div class="flex-1">
+                        <CzrFormColumn
+                          class="__czr-table-form-column"
+                          required
+                          label="模型选择"
+                          :span="24"
+                          v-model:param="state.form.advise.modelId"
+                          link="select"
+                          :options="DictionaryStore.models.list"
+                          placeholder="点击选择模型"
+                          @click.capture.stop="onAdviseModel"
+                          default-error-msg="请选择问题建议模型"
+                          :clearable="false"
+                        />
+                      </div>
+                      <div
+                        v-if="state.form.advise.modelId"
+                        class="__hover ml-4 text-sm font-normal text-[var(--czr-main-color)]"
+                        @click="onAdviseModelConfig"
+                      >
+                        参数配置
+                      </div>
+                    </div>
                     <div
                       class="mt-2 flex h-10 items-center gap-1 rounded-sm bg-[#FFFAEA] px-3.5 text-sm text-[#6F7889]"
                     >
@@ -663,6 +683,11 @@
       :transfer="state.modelSelect.transfer"
       @refresh="getModel"
     />
+    <modelConfig
+      v-model:show="state.modelConfig.show"
+      :transfer="state.modelConfig.transfer"
+      @refresh="getModelConfig"
+    />
     <workflowSelect
       v-model:show="state.workflowSelect.show"
       :transfer="state.workflowSelect.transfer"
@@ -741,7 +766,6 @@ import CzrDialog from '@/components/czr-ui/CzrDialog.vue'
 import toBackCom from '@/views/manage/components/to-back.vue'
 import {
   appHistory,
-  appTemporarily,
   appModelConfigSave,
   appPublish,
   appValidatePublish,
@@ -750,6 +774,7 @@ import {
 import { appDetail } from '@/api/modules/app'
 import { appTextToAudio } from '@/api/modules/app/chat'
 import recallConfig from '@/views/manage/knowledge/recall-config.vue'
+import modelConfig from './model-config.vue'
 
 const DictionaryStore = useDictionaryStore()
 const AppStore = useAppStore()
@@ -826,6 +851,10 @@ const state: any = reactive({
     show: false,
     transfer: {},
   },
+  modelConfig: {
+    show: false,
+    transfer: {},
+  },
 })
 const ref_form = ref()
 const ref_formPublish = ref()
@@ -876,11 +905,13 @@ const autoSave = debounce((v) => {
     voice: state.form.voicePackage,
     qsType: state.form.advise.types,
     qsModelId: state.form.advise.modelId,
+    qsModelConfigs: state.form.advise.modelConfigs,
     qsPrePrompt: state.form.advise.tips,
     qsDatasetIds: state.form.advise.datasetIds,
   }
   if (state.detail.type === 0) {
     params.modelId = state.form.modelId
+    params.modelConfigs = state.form.modelConfigs
     params.datasetIds = state.form.datasetIds
     if (!state.form.datasetConfigs) {
       state.form.datasetConfigs = ref_recalConfig.value.getData()
@@ -933,10 +964,12 @@ const initDetail = () => {
             state.form.advise.types =
               configData.qsType?.map((v) => Number(v)) || []
             state.form.advise.modelId = configData.qsModelId || ''
+            state.form.advise.modelConfigs = configData.qsModelConfigs || ''
             state.form.advise.tips = configData.qsPrePrompt || ''
             state.form.advise.datasetIds = configData.qsDatasetIds || []
             if (state.detail.type === 0) {
               state.form.modelId = configData.modelId || ''
+              state.form.modelConfigs = configData.modelConfigs || ''
               state.form.datasetIds = configData.datasetIds || []
               state.form.datasetConfigs = configData.datasetConfigs
             } else {
@@ -1059,11 +1092,39 @@ const getModel = (val) => {
     case 'model':
       {
         state.form.modelId = val.id
+        state.form.modelConfigs = {
+          paramConfigs: val.paramConfigs,
+          bizConfigs: val.bizConfigs,
+        }
       }
       break
     case 'advise':
       {
         state.form.advise.modelId = val.id
+        state.form.advise.modelConfigs = {
+          paramConfigs: val.paramConfigs,
+          bizConfigs: val.bizConfigs,
+        }
+      }
+      break
+  }
+}
+const getModelConfig = (val) => {
+  switch (state.modelConfig.transfer.type) {
+    case 'model':
+      {
+        state.form.modelConfigs = {
+          paramConfigs: val.paramConfigs,
+          bizConfigs: val.bizConfigs,
+        }
+      }
+      break
+    case 'advise':
+      {
+        state.form.advise.modelConfigs = {
+          paramConfigs: val.paramConfigs,
+          bizConfigs: val.bizConfigs,
+        }
       }
       break
   }
@@ -1082,6 +1143,20 @@ const onAdviseModel = () => {
   }
   state.modelSelect.show = true
 }
+const onModelConfig = () => {
+  state.modelConfig.transfer = {
+    type: 'model',
+    id: state.form.modelId,
+  }
+  state.modelConfig.show = true
+}
+const onAdviseModelConfig = () => {
+  state.modelConfig.transfer = {
+    type: 'advise',
+    id: state.form.advise.modelId,
+  }
+  state.modelConfig.show = true
+}
 const onPublish = () => {
   ref_form.value
     .submit()

+ 208 - 0
src/views/manage/app/make/model-config.vue

@@ -0,0 +1,208 @@
+<template>
+  <CzrDialog
+    :show="show"
+    :title="titleCpt"
+    @onClose="$emit('update:show', false)"
+    @onSubmit="onSubmit"
+    width="62.5rem"
+    height="auto"
+    max-height="90%"
+    :loading="state.loading"
+  >
+    <div class="bm-form">
+      <CzrForm ref="ref_form" label-width="100px">
+        <div class="__czr-title_1">基本信息</div>
+        <CzrFormColumn
+          :span="12"
+          label="模型类型"
+          v-model:param="state.form.type"
+          link="select"
+          :options="DictionaryStore.modelTypes.list"
+          @change="state.form.pluginClass = ''"
+          :disabled="true"
+        />
+        <CzrFormColumn
+          :span="12"
+          label="模型供应商"
+          v-model:param="state.form.pluginClass"
+          link="select"
+          :options="
+            DictionaryStore.modelProvides.list.filter(
+              (v) => v.type === state.form.type,
+            )
+          "
+          @getObject="getModelProvide"
+          :disabled="true"
+        />
+        <CzrFormColumn
+          :span="24"
+          label="模型名称"
+          v-model:param="state.form.name"
+          :disabled="true"
+        />
+        <CzrFormColumn
+          :span="24"
+          label="模型简介"
+          v-model:param="state.form.description"
+          type="textarea"
+          :rows="4"
+          :disabled="true"
+        />
+        <CzrFormColumn
+          :span="24"
+          label="共享条件"
+          v-model:param="state.form.openStrategy"
+          link="radio"
+          :options="DictionaryStore.shareConditions"
+          :disabled="true"
+        />
+        <template v-if="state.form.pluginClass">
+          <template v-if="state.baseForms?.length > 0">
+            <div class="__czr-title_1">基本参数配置</div>
+            <template v-for="item in state.baseForms">
+              <modelFormInit
+                :config="item"
+                :form="state.form.basicConfigs"
+                :disabled="true"
+              />
+            </template>
+          </template>
+          <template v-if="state.paramForms?.length > 0">
+            <div class="__czr-title_1">模型参数配置</div>
+            <template v-for="item in state.paramForms">
+              <modelFormInit :config="item" :form="state.form.paramConfigs" />
+            </template>
+          </template>
+          <template v-if="state.bizForms?.length > 0">
+            <div class="__czr-title_1">业务参数配置</div>
+            <template v-for="item in state.bizForms">
+              <modelFormInit :config="item" :form="state.form.bizConfigs" />
+            </template>
+          </template>
+        </template>
+      </CzrForm>
+    </div>
+  </CzrDialog>
+</template>
+
+<script setup lang="ts">
+import {
+  computed,
+  getCurrentInstance,
+  nextTick,
+  reactive,
+  ref,
+  watch,
+} from 'vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { useAppStore, useDialogStore, useDictionaryStore } from '@/stores'
+import { useRouter } from 'vue-router'
+import modelFormInit from '@/views/manage/model/model-form-init.vue'
+import { pluginDetail } from '@/api/modules/model'
+
+const router = useRouter()
+const AppStore = useAppStore()
+const DictionaryStore = useDictionaryStore()
+const DialogStore = useDialogStore()
+const emit = defineEmits(['update:show', 'refresh'])
+const { proxy } = getCurrentInstance()
+const props = defineProps({
+  show: { default: false },
+  transfer: <any>{},
+})
+const state: any = reactive({
+  loading: false,
+  form: {
+    basicConfigs: {},
+    paramConfigs: {},
+    bizConfigs: {},
+  },
+  baseForms: [],
+  paramForms: [],
+  bizForms: [],
+})
+const ref_form = ref()
+const titleCpt = computed(() => {
+  let t = '模型参数配置'
+  return t
+})
+const isViewCpt = computed(() => props.transfer?.mode === 'view')
+watch(
+  () => props.show,
+  (n) => {
+    if (n) {
+      initDictionary()
+      state.form = {
+        tenantId: AppStore.tenantInfo?.id,
+        basicConfigs: {},
+        paramConfigs: {},
+        bizConfigs: {},
+      }
+      state.baseForms = []
+      state.paramForms = []
+      state.bizForms = []
+      initData()
+      nextTick(() => {
+        ref_form.value.reset()
+      })
+    }
+  },
+)
+const initDictionary = () => {
+  DictionaryStore.initModelProvides()
+}
+const initData = () => {
+  state.loading = true
+  pluginDetail(props.transfer.id)
+    .then(({ data }: any) => {
+      state.form = data
+      const obj = DictionaryStore.modelProvides.objMap.get(
+        state.form.pluginClass,
+      )
+      state.baseForms = obj.basicConfigAttr
+        ? Object.values(obj.basicConfigAttr)
+        : []
+      state.paramForms = obj.paramConfigAttr
+        ? Object.values(obj.paramConfigAttr)
+        : []
+      state.bizForms = obj.bizConfigAttr ? Object.values(obj.bizConfigAttr) : []
+    })
+    .catch(() => {})
+    .finally(() => {
+      state.loading = false
+    })
+}
+const onSubmit = () => {
+  ref_form.value
+    .submit()
+    .then(() => {
+      DialogStore.confirm({
+        content: `请确认是否修改参数?`,
+        onSubmit: () => {
+          emit('update:show', false)
+          emit('refresh', state.form)
+        },
+      })
+    })
+    .catch((e) => {
+      ElMessage({
+        message: e[0].message,
+        grouping: true,
+        type: 'warning',
+      })
+    })
+}
+const getModelProvide = (obj) => {
+  state.form.name = obj.name
+  state.form.description = obj.description
+  state.baseForms = obj.basicConfigAttr
+    ? Object.values(obj.basicConfigAttr)
+    : []
+  state.paramForms = obj.paramConfigAttr
+    ? Object.values(obj.paramConfigAttr)
+    : []
+  state.bizForms = obj.bizConfigAttr ? Object.values(obj.bizConfigAttr) : []
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 16 - 3
src/views/manage/model/detail.vue

@@ -8,6 +8,7 @@
     height="auto"
     max-height="90%"
     :loading="state.loading"
+    :show-submit="!isViewCpt"
   >
     <div class="bm-form">
       <CzrForm ref="ref_form" label-width="100px" :form-view="isViewCpt">
@@ -63,19 +64,31 @@
           <template v-if="state.baseForms?.length > 0">
             <div class="__czr-title_1">基本参数配置</div>
             <template v-for="item in state.baseForms">
-              <modelFormInit :config="item" :form="state.form.basicConfigs" />
+              <modelFormInit
+                :config="item"
+                :form="state.form.basicConfigs"
+                :disabled="isViewCpt"
+              />
             </template>
           </template>
           <template v-if="state.paramForms?.length > 0">
             <div class="__czr-title_1">模型参数配置</div>
             <template v-for="item in state.paramForms">
-              <modelFormInit :config="item" :form="state.form.paramConfigs" />
+              <modelFormInit
+                :config="item"
+                :form="state.form.paramConfigs"
+                :disabled="isViewCpt"
+              />
             </template>
           </template>
           <template v-if="state.bizForms?.length > 0">
             <div class="__czr-title_1">业务参数配置</div>
             <template v-for="item in state.bizForms">
-              <modelFormInit :config="item" :form="state.form.bizConfigs" />
+              <modelFormInit
+                :config="item"
+                :form="state.form.bizConfigs"
+                :disabled="isViewCpt"
+              />
             </template>
           </template>
         </template>

+ 7 - 0
src/views/manage/model/model-form-init.vue

@@ -16,6 +16,7 @@
             ]
           : []
       "
+      :disabled="disabled"
     />
   </template>
   <template v-else-if="config?.type === 'INPUT_NUMBER'">
@@ -29,6 +30,7 @@
       :max="config.maxNumber"
       :min="config.minNumber"
       :decimal="config.decimalSize || 0"
+      :disabled="disabled"
     />
   </template>
   <template v-else-if="config?.type === 'SELECT'">
@@ -40,6 +42,7 @@
       v-model:param="form[config.key]"
       link="select"
       :options="JSON.parse(config.values)"
+      :disabled="disabled"
     />
   </template>
   <template v-else-if="config?.type === 'CHECKBOX'">
@@ -51,6 +54,7 @@
       v-model:param="form[config.key]"
       link="checkbox"
       :options="JSON.parse(config.values)"
+      :disabled="disabled"
     />
   </template>
   <template v-else-if="config?.type === 'RADIO'">
@@ -62,6 +66,7 @@
       v-model:param="form[config.key]"
       link="radio"
       :options="JSON.parse(config.values)"
+      :disabled="disabled"
     />
   </template>
   <template v-else-if="config?.type === 'TEXTAREA'">
@@ -84,6 +89,7 @@
             ]
           : []
       "
+      :disabled="disabled"
     />
   </template>
   <template v-else>
@@ -103,6 +109,7 @@ import { isValue } from '@/utils/czr-util'
 const props = defineProps({
   config: { required: true },
   form: <any>{},
+  disabled: { default: false },
 })
 const state: any = reactive({})
 </script>