UnisKB/ui/src/views/dataset/component/BaseForm.vue

189 lines
4.9 KiB
Vue
Raw Normal View History

2023-10-27 09:49:06 +00:00
<template>
2023-11-22 09:04:47 +00:00
<el-form
ref="FormRef"
:model="form"
:rules="rules"
label-position="top"
require-asterisk-position="right"
v-loading="loading"
2023-11-22 09:04:47 +00:00
>
2023-12-18 03:32:29 +00:00
<el-form-item label="知识库名称" prop="name">
2023-10-27 09:49:06 +00:00
<el-input
2023-12-18 06:42:13 +00:00
v-model="form.name"
2023-12-18 03:32:29 +00:00
placeholder="请输入知识库名称"
2023-10-27 09:49:06 +00:00
maxlength="64"
show-word-limit
2023-12-19 09:57:11 +00:00
@blur="form.name = form.name.trim()"
2023-10-27 09:49:06 +00:00
/>
</el-form-item>
2023-12-18 03:32:29 +00:00
<el-form-item label="知识库描述" prop="desc">
2023-10-27 09:49:06 +00:00
<el-input
2023-12-18 06:42:13 +00:00
v-model="form.desc"
2023-10-27 09:49:06 +00:00
type="textarea"
2023-12-18 03:32:29 +00:00
placeholder="描述知识库的内容详尽的描述将帮助AI能深入理解该知识库的内容能更准确的检索到内容提高该知识库的命中率。"
2024-03-04 07:26:13 +00:00
maxlength="256"
2023-10-27 09:49:06 +00:00
show-word-limit
:autosize="{ minRows: 3 }"
2023-12-19 09:57:11 +00:00
@blur="form.desc = form.desc.trim()"
2023-10-27 09:49:06 +00:00
/>
</el-form-item>
2024-07-22 10:38:53 +00:00
<el-form-item label="向量模型" prop="embedding_mode_id">
<el-select
v-model="form.embedding_mode_id"
2024-07-22 10:38:53 +00:00
placeholder="请选择向量模型"
class="w-full"
popper-class="select-model"
:clearable="true"
>
<el-option-group
v-for="(value, label) in modelOptions"
:key="value"
:label="relatedObject(providerOptions, label, 'provider')?.name"
>
<el-option
v-for="item in value.filter((v: any) => v.status === 'SUCCESS')"
:key="item.id"
:label="item.name"
:value="item.id"
class="flex-between"
>
<div class="flex">
<span
v-html="relatedObject(providerOptions, label, 'provider')?.icon"
class="model-icon mr-8"
></span>
<span>{{ item.name }}</span>
</div>
<el-icon class="check-icon" v-if="item.id === form.embedding_mode_id"
><Check
/></el-icon>
</el-option>
<!-- 不可用 -->
<el-option
v-for="item in value.filter((v: any) => v.status !== 'SUCCESS')"
:key="item.id"
:label="item.name"
:value="item.id"
class="flex-between"
disabled
>
<div class="flex">
<span
v-html="relatedObject(providerOptions, label, 'provider')?.icon"
class="model-icon mr-8"
></span>
<span>{{ item.name }}</span>
<span class="danger">{{
$t('views.application.applicationForm.form.aiModel.unavailable')
}}</span>
</div>
<el-icon class="check-icon" v-if="item.id === form.embedding_mode_id"
><Check
/></el-icon>
</el-option>
</el-option-group>
</el-select>
</el-form-item>
2023-10-27 09:49:06 +00:00
</el-form>
</template>
<script setup lang="ts">
2023-11-14 10:12:55 +00:00
import { ref, reactive, onMounted, onUnmounted, computed, watch } from 'vue'
import { groupBy } from 'lodash'
2023-11-10 09:18:00 +00:00
import useStore from '@/stores'
2024-01-08 09:53:50 +00:00
import type { datasetData } from '@/api/type/dataset'
import { relatedObject } from '@/utils/utils'
import type { Provider } from '@/api/type/model'
2023-12-04 10:28:42 +00:00
2023-11-10 09:18:00 +00:00
const props = defineProps({
data: {
type: Object,
default: () => {}
}
})
const { model } = useStore()
2024-01-08 09:53:50 +00:00
const form = ref<datasetData>({
2023-10-27 09:49:06 +00:00
name: '',
desc: '',
embedding_mode_id: ''
2023-10-27 09:49:06 +00:00
})
const rules = reactive({
2023-12-18 03:32:29 +00:00
name: [{ required: true, message: '请输入知识库名称', trigger: 'blur' }],
desc: [{ required: true, message: '请输入知识库描述', trigger: 'blur' }],
embedding_mode_id: [{ required: true, message: '请输入Embedding模型', trigger: 'change' }]
2023-10-27 09:49:06 +00:00
})
2023-10-27 09:49:06 +00:00
const FormRef = ref()
const loading = ref(false)
const modelOptions = ref<any>([])
const providerOptions = ref<Array<Provider>>([])
2023-11-10 09:18:00 +00:00
watch(
() => props.data,
(value) => {
2023-11-10 11:05:52 +00:00
if (value && JSON.stringify(value) !== '{}') {
2023-11-10 09:18:00 +00:00
form.value.name = value.name
2024-07-18 08:57:21 +00:00
form.value.desc = value.desc
form.value.embedding_mode_id = value.embedding_mode_id
2023-11-10 09:18:00 +00:00
}
},
{
immediate: true
}
)
2023-11-22 03:05:06 +00:00
/*
表单校验
*/
2023-10-27 09:49:06 +00:00
function validate() {
if (!FormRef.value) return
2023-11-02 01:56:14 +00:00
return FormRef.value.validate((valid: any) => {
2023-10-27 09:49:06 +00:00
return valid
})
}
function getModel() {
loading.value = true
model
.asyncGetModel({ model_type: 'EMBEDDING' })
.then((res: any) => {
modelOptions.value = groupBy(res?.data, 'provider')
loading.value = false
})
.catch(() => {
loading.value = false
})
}
function getProvider() {
loading.value = true
model
.asyncGetProvider()
.then((res: any) => {
providerOptions.value = res?.data
loading.value = false
})
.catch(() => {
loading.value = false
})
}
2023-11-10 09:18:00 +00:00
onMounted(() => {
getProvider()
getModel()
2023-11-10 09:18:00 +00:00
})
2023-11-14 10:12:55 +00:00
onUnmounted(() => {
form.value = {
name: '',
desc: '',
embedding_mode_id: ''
2023-11-14 10:12:55 +00:00
}
FormRef.value?.clearValidate()
2023-11-14 10:12:55 +00:00
})
2024-01-08 09:53:50 +00:00
2023-10-27 09:49:06 +00:00
defineExpose({
2023-11-02 01:56:14 +00:00
validate,
form
2023-10-27 09:49:06 +00:00
})
</script>
<style scoped lang="scss"></style>