| <template> | 
|   <!-- 添加编辑子模型 --> | 
|   <a-modal | 
|     v-model:visible="addPageModelVisible" | 
|     :title="title" | 
|     @before-open="handleOpened" | 
|     @cancel="handleCancel" | 
|     :footer="false" | 
|     title-align="start" | 
|     width="600px" | 
|   > | 
|     <a-form | 
|       ref="form_ref" | 
|       :rules="rules" | 
|       :model="form" | 
|       @submit="handleSubmit" | 
|       :style="{ width: '90%', margin: '0 auto' }" | 
|       layout="vertical" | 
|     > | 
|       <div v-if="isType !== 1"> | 
|         <a-form-item field="model_type" label="模型类型"> | 
|           <a-select v-model="form.model_type" placeholder="请选择"> | 
|             <a-option value="chat">chat</a-option> | 
|             <a-option value="embedding">embedding</a-option> | 
|           </a-select> | 
|         </a-form-item> | 
|         <a-form-item field="llm_name" label="模型名称"> | 
|           <a-input v-model="form.llm_name" placeholder="请输入模型名称" /> | 
|         </a-form-item> | 
|   | 
|         <!-- <a-form-item field="volc_ak" label="火山 ACCESS_KEY"> | 
|           <a-input v-model="form.volc_ak" placeholder="请输入火山 ACCESS_KEY" /> | 
|           <a-button | 
|             type="primary" | 
|             @click="handleClick" | 
|             style="margin-left: 10px" | 
|           > | 
|             <template #icon> | 
|               <icon-plus /> | 
|             </template> | 
|           </a-button> | 
|         </a-form-item> | 
|         <a-form-item field="volc_sk" label="火山 SECRET_KEY"> | 
|           <a-input v-model="form.volc_sk" placeholder="请输入火山 SECRET_KEY" /> | 
|         </a-form-item> --> | 
|         <a-form-item field="api_base" label="基础URL"> | 
|           <a-input v-model="form.api_base" placeholder="请输入基础URL" /> | 
|         </a-form-item> | 
|         <a-form-item | 
|           field="raptor" | 
|           label="是否支持 Vision" | 
|           v-if="form.model_type === 'chat'" | 
|         > | 
|           <a-switch v-model="form.raptor" /> | 
|         </a-form-item> | 
|         <a-form-item field="logo" label="模型图片"> | 
|           <a-space direction="vertical" :style="{ width: '100%' }"> | 
|             <Upload | 
|               :action="uploadAction" | 
|               :limit="1" | 
|               @update:fileList="updateFileList" | 
|               @success="handleSuccess" | 
|             ></Upload> | 
|           </a-space> | 
|         </a-form-item> | 
|         <a-form-item field="all_params" label="增加其它参数配置"> | 
|           <a-button | 
|             type="primary" | 
|             @click="handleAddClick" | 
|             style="margin-left: 10px" | 
|           > | 
|             <template #icon> | 
|               <icon-plus /> | 
|             </template> | 
|           </a-button> | 
|         </a-form-item> | 
|   | 
|         <a-form-item v-for="(item, index) in form.addFomList" :key="index"> | 
|           <div class="addInput"> | 
|             <a-input | 
|               style="width: 230px" | 
|               v-model="item.name" | 
|               placeholder="请输入key" | 
|             /> | 
|             : | 
|             <a-input v-model="item.value" placeholder="请输入value" /> | 
|   | 
|             <a-button | 
|               status="danger" | 
|               @click="handleDelInput(index)" | 
|               style="margin-left: 10px" | 
|             > | 
|               <template #icon> | 
|                 <icon-minus size="22" /> | 
|               </template> | 
|             </a-button> | 
|           </div> | 
|         </a-form-item> | 
|       </div> | 
|       <div v-else> | 
|         <a-form-item field="name" label="API-Key"> | 
|           <a-input v-model="form.name" placeholder="API-Key" /> | 
|         </a-form-item> | 
|         <a-form-item field="describe" label="Base-Url"> | 
|           <a-input v-model="form.name" placeholder="Base-Url" /> | 
|         </a-form-item> | 
|   | 
|         <a-form-item field="section" label="模型图片"> | 
|           <a-space direction="vertical" :style="{ width: '100%' }"> | 
|             <Upload | 
|               :action="uploadAction" | 
|               :limit="1" | 
|               :url="form.urlS" | 
|               @update:fileList="updateFileList" | 
|               @success="handleSuccess" | 
|             ></Upload> | 
|           </a-space> | 
|         </a-form-item> | 
|       </div> | 
|   | 
|       <a-form-item> | 
|         <div style="width: 100%; text-align: right"> | 
|           <a-button @click="addPageModelVisible = false">取消</a-button> | 
|           <a-button style="margin-left: 10px" type="primary" html-type="submit" | 
|             >确定</a-button | 
|           > | 
|         </div> | 
|       </a-form-item> | 
|     </a-form> | 
|   </a-modal> | 
| </template> | 
|   | 
| <script lang="ts" setup> | 
|   import { reactive, ref, computed, watch, watchEffect, onMounted } from 'vue'; | 
|   import { addLlm, getLlmDetail, editLlm } from '@/api/model'; | 
|   import { Modal, Message } from '@arco-design/web-vue'; | 
|   import message from '@arco-design/web-vue/es/message'; | 
|   import { resolveUnref } from '@vueuse/core'; | 
|   | 
|   const addPageModelVisible = defineModel('show'); | 
|   const loading = ref(false); | 
|   const props = defineProps({ | 
|     task_id: { | 
|       type: Number, | 
|       default: null, | 
|     }, | 
|     type: { | 
|       type: Number, | 
|       default: 0, | 
|     }, | 
|     title: { | 
|       type: String, | 
|       default: '', | 
|     }, | 
|     editList: { | 
|       type: Object, | 
|       default: {}, | 
|     }, | 
|   }); | 
|   | 
|   const isType = computed(() => props.type); | 
|   const editList = computed(() => props.editList); | 
|   watchEffect(() => { | 
|     if (props.editList) { | 
|       console.log(props.editList, 9999); | 
|       // form.name = props.editList.name; | 
|       // form.llm_factory = props.editList.llm_factory; | 
|       // form.model_type = props.editList.model_type; | 
|       // form.province = props.editList.province; | 
|       // form.options = props.editList.options; | 
|       // form.llm_name = props.editList.llm_name; | 
|       // form.api_base = props.editList.api_base; | 
|       // form.volc_ak = props.editList.volc_ak; | 
|       // form.volc_sk = props.editList.volc_sk; | 
|       // form.logo = props.editList.logo; | 
|     } | 
|   }); | 
|   | 
|   const form = reactive({ | 
|     size: 'medium', | 
|     name: '', | 
|     llm_factory: '', | 
|     model_type: '', | 
|     province: 'haidian', | 
|     options: [], | 
|     llm_name: '', | 
|     api_base: '', | 
|     volc_ak: '', | 
|     volc_sk: '', | 
|     logo: '', | 
|     radio: 'radio one', | 
|     urlS: '', | 
|     slider: 5, | 
|     score: 5, | 
|     switch: false, | 
|     multiSelect: ['section one'], | 
|     treeSelect: '', | 
|     raptor: false, | 
|     addFomList: [], | 
|   }); | 
|   const form_ref = ref(null); | 
|   | 
|   const rules = { | 
|     model_type: [ | 
|       { | 
|         required: true, | 
|         message: '请选择模型类型', | 
|       }, | 
|     ], | 
|     llm_name: [ | 
|       { | 
|         required: true, | 
|         message: '名称不允许为空', | 
|       }, | 
|     ], | 
|     volc_sk: [ | 
|       { | 
|         required: true, | 
|         message: '请输入volc_sk', | 
|       }, | 
|     ], | 
|     volc_ak: [ | 
|       { | 
|         required: true, | 
|         message: '请输入volc_ak', | 
|       }, | 
|     ], | 
|     api_base: [ | 
|       { | 
|         required: true, | 
|         message: '请输入api_base', | 
|       }, | 
|     ], | 
|   }; | 
|   | 
|   const uploadAction = '/api/v1/llm/upload'; // 替换为你的上传API | 
|   const fileList = ref([]); | 
|   const imageUrls = ref([]); | 
|   | 
|   const updateFileList = (newFileList) => { | 
|     fileList.value = newFileList; | 
|     console.log(newFileList, 88); | 
|   }; | 
|   | 
|   const handleSuccess = (urls) => { | 
|     imageUrls.value = urls; // 拿到上传的图片地址 | 
|   }; | 
|   const emit = defineEmits(['refresh-parent']); | 
|   const handleSubmit = ({ values, errors }) => { | 
|     const all_params = form.addFomList.map((item) => { | 
|       console.log(item, 8888); | 
|       return item.name + ':' + item.value; | 
|     }); | 
|     form_ref.value | 
|       ?.validate() | 
|       .then(async (res) => { | 
|         if (!res) { | 
|           if (props.title == '编辑') { | 
|             const data = await editLlm({ | 
|               llm_factory: editList.value.llm_factory, | 
|               llm_name: form.llm_name, | 
|               model_type: form.model_type, | 
|               volc_ak: form.volc_ak, | 
|               volc_sk: form.volc_sk, | 
|               api_base: form.api_base, | 
|               raptor: form.raptor, | 
|               all_params: all_params, | 
|               logo: imageUrls.value[0], | 
|             }); | 
|   | 
|             if ((data as any).code == 200) { | 
|               message.success('添加成功'); | 
|               addPageModelVisible.value = false; | 
|               emit('refresh-parent'); | 
|             } else { | 
|               message.error('添加失败'); | 
|             } | 
|           } else { | 
|             const data = await addLlm({ | 
|               llm_factory: editList.value.llm_factory, | 
|               llm_name: form.llm_name, | 
|               model_type: form.model_type, | 
|               volc_ak: form.volc_ak, | 
|               volc_sk: form.volc_sk, | 
|               api_base: form.api_base, | 
|               raptor: form.raptor, | 
|               all_params: all_params, | 
|               logo: imageUrls.value[0], | 
|             }); | 
|   | 
|             if ((data as any).code == 200) { | 
|               message.success('添加成功'); | 
|               addPageModelVisible.value = false; | 
|               emit('refresh-parent'); | 
|             } else { | 
|               message.error('添加失败'); | 
|             } | 
|           } | 
|         } | 
|       }) | 
|       .catch((err) => { | 
|         console.log(err); | 
|       }); | 
|   }; | 
|   | 
|   //   const addPageModelVisible = ref(false); | 
|   const handleAddPageModel = () => { | 
|     addPageModelVisible.value = true; | 
|   }; | 
|   | 
|   const handleClick = () => { | 
|     addPageModelVisible.value = true; | 
|   }; | 
|   const handleBeforeOk = (done) => { | 
|     form_ref.value?.validate().then((res) => { | 
|       console.log('form:', form); | 
|       if (!form.name) { | 
|         done(false); | 
|       } else { | 
|         console.log('请求数据'); | 
|       } | 
|     }); | 
|   }; | 
|   | 
|   //增加其他参数 | 
|   const handleAddClick = () => { | 
|     form.addFomList.push({ name: '', value: '' }); | 
|   }; | 
|   | 
|   //减少其他参数 | 
|   const handleDelInput = (index) => { | 
|     form.addFomList.splice(index, 1); | 
|   }; | 
|   const handleCancel = () => { | 
|     addPageModelVisible.value = false; | 
|   }; | 
|   | 
|   const handleOpened = (el) => { | 
|     Object.assign(form, { | 
|       name: '', // 用户名 | 
|       nameJoin: '', // 昵称 | 
|       post: '', // 岗位 | 
|       txt: '', // 备注 | 
|     }); | 
|     form_ref.value?.resetFields(); | 
|   }; | 
|   | 
|   const file = ref(); | 
|   | 
|   const onChange = (_, currentFile) => { | 
|     file.value = { | 
|       ...currentFile, | 
|       // url: URL.createObjectURL(currentFile.file), | 
|     }; | 
|   }; | 
|   const onProgress = (currentFile) => { | 
|     file.value = currentFile; | 
|   }; | 
|   // onMounted(() => { | 
|   //   if (editList.value) { | 
|   //     getDetail(); | 
|   //     form.urlS = editList.value.logo; | 
|   //   } | 
|   // }); | 
|   | 
|   //获取详情 | 
|   const getDetail = async () => { | 
|     const data = await getLlmDetail( | 
|       editList.value.llm_factory, | 
|       editList.value.name | 
|     ); | 
|   | 
|     form.llm_name = data.data.llm_name; | 
|     form.model_type = data.data.model_type; | 
|     form.volc_ak = data.data.volc_ak; | 
|     form.volc_sk = data.data.volc_sk; | 
|     form.api_base = data.data.api_base; | 
|     form.raptor = data.data.raptor; | 
|     // form.urlS = data.data.logo; | 
|     if (JSON.parse(data.data.all_params).length > 0) { | 
|       form.addFomList = JSON.parse(data.data.all_params).map((item) => { | 
|         return { name: item.split(':')[0], value: item.split(':')[1] }; | 
|       }); | 
|     } | 
|   | 
|     imageUrls.value = data.data.logo; | 
|   }; | 
| </script> | 
| <style scoped lang="less"> | 
|   .addInput { | 
|     display: flex; | 
|     width: 100%; | 
|   } | 
| </style> |