@@ -247,11 +249,13 @@ import {
ElDropdownItem,
ElIcon,
ElButton,
- ElInput
+ ElInput,
+ ElMessage
} from 'element-plus'
import { ArrowUp, ArrowDown, Delete } from '@element-plus/icons-vue'
-import { ref, onMounted, watch, nextTick } from 'vue'
+import { ref, onMounted, watch, nextTick, computed } from 'vue'
import { gtagRenderer } from '@renderer/utils/gtag'
+import { SINGLE_ITEM_DEFAULT_SERVE_WEIGHT } from '../../../../common/constant'
interface LlmConfigItem {
providerCompleteApiUrl: string
@@ -273,15 +277,69 @@ function getNewConfigItem(): LlmConfigItem {
const formRef = ref
>()
const formContent = ref([getNewConfigItem()])
-const formRules = {}
+const formContentForElForm = computed(() => {
+ const valueMap = {}
+ formContent.value.forEach((configItem, i) => {
+ valueMap[`${i}_providerCompleteApiUrl`] = configItem.providerCompleteApiUrl
+ })
+ return valueMap
+})
+const formRulesForElForm = computed(() => {
+ const valueMap = {}
+ formContent.value.forEach((_, i) => {
+ valueMap[`${i}_providerCompleteApiUrl`] = [
+ {
+ required: true,
+ message: '请输入服务提供商 Base URL'
+ },
+ {
+ trigger: 'blur',
+ validator(_, value, cb) {
+ try {
+ new URL(value?.trim())
+ } catch (err) {
+ cb(`URL 格式无效,请重新输入`)
+ }
+ if (/^http(s)?:\/\//.test(value)) {
+ cb()
+ return
+ }
+ cb(`服务提供商 Base URL 无效,请重新输入`)
+ }
+ }
+ ]
+ })
+ return valueMap
+})
const handleCancel = () => {
gtagRenderer('cancel_clicked')
electron.ipcRenderer.send('close-llm-config')
gtagRenderer('cancel_done')
}
+
const handleSubmit = async () => {
gtagRenderer('submit_clicked', { llm_config_length: formContent.value.length })
+ await formRef.value?.validate()
+ if (!formContent.value.length) {
+ gtagRenderer('empty_model_list')
+ ElMessage.warning({
+ message: '可选模型列表为空,请出现填写'
+ })
+ formContent.value = [getNewConfigItem()]
+ return
+ } else if (formContent.value.length > 1) {
+ const firstEnabledModel = formContent.value.find(it => it.enabled)
+ if (!firstEnabledModel) {
+ gtagRenderer('no_enabled_model_find_in_model_list')
+ ElMessage.warning({
+ dangerouslyUseHTMLString: true,
+ grouping: true,
+ message: '所有模型均被禁用;请至少启用一个模型
'
+ })
+ return
+ }
+ }
electron.ipcRenderer.invoke('save-llm-config', JSON.parse(JSON.stringify(formContent.value)))
gtagRenderer('submit_done')
}
@@ -403,11 +461,11 @@ function handlePresetClick(selected: (typeof llmPresetList)[number], index) {
const firstInputRefList = ref[]>([])
function addConfig() {
+ gtagRenderer('new_config_item_added', { config_list_length_before_add: formContent.value.length })
formContent.value.push(getNewConfigItem())
nextTick(() => {
firstInputRefList.value[firstInputRefList.value.length - 1]?.focus()
})
- gtagRenderer('new_config_item_added')
}
function moveConfigUp(index) {
;[formContent.value[index], formContent.value[index - 1]] = [
@@ -436,7 +494,7 @@ watch(
if (nVal <= 1) {
electron.ipcRenderer.send('update-window-size', {
width: window.innerWidth,
- height: 510
+ height: 550
})
} else {
electron.ipcRenderer.send('update-window-size', {