mirror of
https://github.com/1Panel-dev/MaxKB.git
synced 2025-12-26 01:33:05 +00:00
fix(knowledge document): bug fix
This commit is contained in:
parent
d6a301c184
commit
a892f3075f
|
|
@ -374,8 +374,8 @@ const postQADocument: (
|
|||
* 分段预览(上传文档)
|
||||
* @param 参数 file:file,limit:number,patterns:array,with_filter:boolean
|
||||
*/
|
||||
const postSplitDocument: (data: any) => Promise<Result<any>> = (data) => {
|
||||
return post(`${prefix.value}/document/split`, data, undefined, undefined, 1000 * 60 * 60)
|
||||
const postSplitDocument: (data: any, id: string) => Promise<Result<any>> = (data, id) => {
|
||||
return post(`${prefix.value}/${id}/document/split`, data, undefined, undefined, 1000 * 60 * 60)
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -232,11 +232,8 @@ const getKnowledgeEmdeddingModel: (
|
|||
* @query { query_text: string, top_number: number, similarity: number }
|
||||
* @returns
|
||||
*/
|
||||
const getKnowledgeModel: (
|
||||
knowledge_id: string,
|
||||
loading?: Ref<boolean>,
|
||||
) => Promise<Result<Array<any>>> = (knowledge_id, loading) => {
|
||||
return get(`${prefix.value}/${knowledge_id}/model`, loading)
|
||||
const getKnowledgeModel: (loading?: Ref<boolean>) => Promise<Result<Array<any>>> = (loading) => {
|
||||
return get(`${prefix.value}/model`, loading)
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -226,11 +226,8 @@ const getKnowledgeEmdeddingModel: (
|
|||
* @query { query_text: string, top_number: number, similarity: number }
|
||||
* @returns
|
||||
*/
|
||||
const getKnowledgeModel: (
|
||||
knowledge_id: string,
|
||||
loading?: Ref<boolean>,
|
||||
) => Promise<Result<Array<any>>> = (knowledge_id, loading) => {
|
||||
return get(`${prefix}/${knowledge_id}/model`, loading)
|
||||
const getKnowledgeModel: (loading?: Ref<boolean>) => Promise<Result<Array<any>>> = (loading) => {
|
||||
return get(`${prefix}/knowledge/model`, loading)
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -188,7 +188,7 @@ const submitHandle = async (formEl: FormInstance) => {
|
|||
function getModel() {
|
||||
loading.value = true
|
||||
knowledgeApi
|
||||
.getKnowledgeModel(id ? id : knowledgeId.value)
|
||||
.getKnowledgeModel()
|
||||
.then((res: any) => {
|
||||
modelOptions.value = groupBy(res?.data, 'provider')
|
||||
loading.value = false
|
||||
|
|
|
|||
|
|
@ -0,0 +1,203 @@
|
|||
<template>
|
||||
<el-dialog
|
||||
:title="$t('views.document.generateQuestion.title')"
|
||||
v-model="dialogVisible"
|
||||
width="650"
|
||||
:close-on-click-modal="false"
|
||||
:close-on-press-escape="false"
|
||||
>
|
||||
<div class="content-height">
|
||||
<el-form
|
||||
ref="FormRef"
|
||||
:model="form"
|
||||
:rules="rules"
|
||||
label-position="top"
|
||||
require-asterisk-position="right"
|
||||
>
|
||||
<div class="update-info flex border-r-4 mb-16 p-8-12">
|
||||
<div class="mt-4">
|
||||
<AppIcon iconName="app-warning-colorful" style="font-size: 16px"></AppIcon>
|
||||
</div>
|
||||
<div class="ml-12 lighter">
|
||||
<p>{{ $t('views.document.generateQuestion.tip1', { data: '{data}' }) }}</p>
|
||||
<p>
|
||||
{{ $t('views.document.generateQuestion.tip2')+ '<question></question>' +
|
||||
$t('views.document.generateQuestion.tip3') }}
|
||||
</p>
|
||||
<p>{{ $t('views.document.generateQuestion.tip4') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<el-form-item
|
||||
:label="$t('views.application.form.aiModel.label')"
|
||||
prop="model_id"
|
||||
>
|
||||
<ModelSelect
|
||||
v-model="form.model_id"
|
||||
:placeholder="$t('views.application.form.aiModel.placeholder')"
|
||||
:options="modelOptions"
|
||||
showFooter
|
||||
:model-type="'LLM'"
|
||||
></ModelSelect>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
:label="$t('views.application.form.prompt.label')"
|
||||
prop="prompt"
|
||||
>
|
||||
<el-input
|
||||
v-model="form.prompt"
|
||||
:placeholder="$t('views.application.form.prompt.placeholder')"
|
||||
:rows="7"
|
||||
type="textarea"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
v-if="['document', 'knowledge'].includes(apiType)"
|
||||
:label="$t('components.selectParagraph.title')"
|
||||
prop="state"
|
||||
>
|
||||
<el-radio-group v-model="state" class="radio-block">
|
||||
<el-radio value="error" size="large">{{
|
||||
$t('components.selectParagraph.error')
|
||||
}}</el-radio>
|
||||
<el-radio value="all" size="large">{{ $t('components.selectParagraph.all') }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click.prevent="dialogVisible = false"> {{ $t('common.cancel') }} </el-button>
|
||||
<el-button type="primary" @click="submitHandle(FormRef)" :disabled="!model || loading">
|
||||
{{ $t('common.confirm') }}
|
||||
</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { reactive, ref, watch } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
import documentApi from '@/api/shared/document'
|
||||
import paragraphApi from '@/api/shared/paragraph'
|
||||
import knowledgeApi from '@/api/shared/knowledge'
|
||||
import useStore from '@/stores/modules-shared-system'
|
||||
import { groupBy } from 'lodash'
|
||||
import { MsgSuccess } from '@/utils/message'
|
||||
import { t } from '@/locales'
|
||||
import type { FormInstance } from 'element-plus'
|
||||
|
||||
const route = useRoute()
|
||||
const {
|
||||
params: { id, documentId } // id为knowledgeID
|
||||
} = route as any
|
||||
|
||||
const { model, prompt, user } = useStore()
|
||||
|
||||
const emit = defineEmits(['refresh'])
|
||||
|
||||
const loading = ref<boolean>(false)
|
||||
|
||||
const dialogVisible = ref<boolean>(false)
|
||||
const modelOptions = ref<any>(null)
|
||||
const idList = ref<string[]>([])
|
||||
const apiType = ref('') // 文档document或段落paragraph
|
||||
const state = ref<'all' | 'error'>('error')
|
||||
const stateMap = {
|
||||
all: ['0', '1', '2', '3', '4', '5', 'n'],
|
||||
error: ['0', '1', '3', '4', '5', 'n']
|
||||
}
|
||||
const FormRef = ref()
|
||||
const knowledgeId = ref<string>()
|
||||
const userId = user.userInfo?.id as string
|
||||
const form = ref(prompt.get(userId))
|
||||
const rules = reactive({
|
||||
model_id: [
|
||||
{
|
||||
required: true,
|
||||
message: t('views.application.form.aiModel.placeholder'),
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
prompt: [
|
||||
{
|
||||
required: true,
|
||||
message: t('views.application.form.prompt.placeholder'),
|
||||
trigger: 'blur'
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
watch(dialogVisible, (bool) => {
|
||||
if (!bool) {
|
||||
form.value = prompt.get(userId)
|
||||
FormRef.value?.clearValidate()
|
||||
}
|
||||
})
|
||||
|
||||
const open = (ids: string[], type: string, _knowledgeId?: string) => {
|
||||
knowledgeId.value = _knowledgeId
|
||||
getModel()
|
||||
idList.value = ids
|
||||
apiType.value = type
|
||||
dialogVisible.value = true
|
||||
}
|
||||
|
||||
const submitHandle = async (formEl: FormInstance) => {
|
||||
if (!formEl) {
|
||||
return
|
||||
}
|
||||
await formEl.validate((valid, fields) => {
|
||||
if (valid) {
|
||||
// 保存提示词
|
||||
prompt.save(user.userInfo?.id as string, form.value)
|
||||
if (apiType.value === 'paragraph') {
|
||||
const data = {
|
||||
...form.value,
|
||||
paragraph_id_list: idList.value
|
||||
}
|
||||
paragraphApi.putBatchGenerateRelated(id, documentId, data, loading).then(() => {
|
||||
MsgSuccess(t('views.document.generateQuestion.successMessage'))
|
||||
emit('refresh')
|
||||
dialogVisible.value = false
|
||||
})
|
||||
} else if (apiType.value === 'document') {
|
||||
const data = {
|
||||
...form.value,
|
||||
document_id_list: idList.value,
|
||||
state_list: stateMap[state.value]
|
||||
}
|
||||
documentApi.putBatchGenerateRelated(id, data, loading).then(() => {
|
||||
MsgSuccess(t('views.document.generateQuestion.successMessage'))
|
||||
emit('refresh')
|
||||
dialogVisible.value = false
|
||||
})
|
||||
} else if (apiType.value === 'knowledge') {
|
||||
const data = {
|
||||
...form.value,
|
||||
state_list: stateMap[state.value]
|
||||
}
|
||||
knowledgeApi.putGenerateRelated(id ? id : knowledgeId.value, data, loading).then(() => {
|
||||
MsgSuccess(t('views.document.generateQuestion.successMessage'))
|
||||
dialogVisible.value = false
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function getModel() {
|
||||
loading.value = true
|
||||
knowledgeApi
|
||||
.getKnowledgeModel()
|
||||
.then((res: any) => {
|
||||
modelOptions.value = groupBy(res?.data, 'provider')
|
||||
loading.value = false
|
||||
})
|
||||
.catch(() => {
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
|
||||
defineExpose({ open })
|
||||
</script>
|
||||
<style lang="scss" scoped></style>
|
||||
|
|
@ -602,9 +602,11 @@ const title = ref('')
|
|||
const selectKnowledgeDialogRef = ref()
|
||||
|
||||
const exportDocument = (document: any) => {
|
||||
documentApi.exportDocument(document.name, document.knowledge_id, document.id, loading).then(() => {
|
||||
MsgSuccess(t('common.exportSuccess'))
|
||||
})
|
||||
documentApi
|
||||
.exportDocument(document.name, document.knowledge_id, document.id, loading)
|
||||
.then(() => {
|
||||
MsgSuccess(t('common.exportSuccess'))
|
||||
})
|
||||
}
|
||||
const exportDocumentZip = (document: any) => {
|
||||
documentApi
|
||||
|
|
@ -712,8 +714,7 @@ const closeInterval = () => {
|
|||
}
|
||||
|
||||
function syncDocument(row: any) {
|
||||
console.log('row', row)
|
||||
if (row.type === '1') {
|
||||
if (+row.type === 1) {
|
||||
syncWebDocument(row)
|
||||
} else {
|
||||
syncLarkDocument(row)
|
||||
|
|
|
|||
|
|
@ -121,6 +121,7 @@
|
|||
<script setup lang="ts">
|
||||
import { ref, computed, onMounted, reactive, watch } from 'vue'
|
||||
import ParagraphPreview from '@/views/knowledge/component/ParagraphPreview.vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
import { cutFilename } from '@/utils/utils'
|
||||
import documentApi from '@/api/knowledge/document'
|
||||
import useStore from '@/stores'
|
||||
|
|
@ -128,7 +129,10 @@ import type { KeyValue } from '@/api/type/common'
|
|||
const { knowledge } = useStore()
|
||||
const documentsFiles = computed(() => knowledge.documentsFiles)
|
||||
const splitPatternList = ref<Array<KeyValue<string, string>>>([])
|
||||
|
||||
const route = useRoute()
|
||||
const {
|
||||
query: { id }, // id为datasetID
|
||||
} = route as any
|
||||
const radio = ref('1')
|
||||
const loading = ref(false)
|
||||
const paragraphList = ref<any[]>([])
|
||||
|
|
@ -145,7 +149,7 @@ const form = reactive<{
|
|||
}>({
|
||||
patterns: [],
|
||||
limit: 500,
|
||||
with_filter: true
|
||||
with_filter: true,
|
||||
})
|
||||
|
||||
function changeHandle(val: boolean) {
|
||||
|
|
@ -157,11 +161,11 @@ function changeHandle(val: boolean) {
|
|||
problem_list: v.title.trim()
|
||||
? [
|
||||
{
|
||||
content: v.title.trim()
|
||||
}
|
||||
content: v.title.trim(),
|
||||
},
|
||||
]
|
||||
: []
|
||||
}))
|
||||
: [],
|
||||
})),
|
||||
}))
|
||||
firstChecked.value = false
|
||||
}
|
||||
|
|
@ -184,7 +188,7 @@ function splitDocument() {
|
|||
})
|
||||
}
|
||||
documentApi
|
||||
.postSplitDocument(fd)
|
||||
.postSplitDocument(fd, id)
|
||||
.then((res: any) => {
|
||||
const list = res.data
|
||||
|
||||
|
|
@ -197,8 +201,8 @@ function splitDocument() {
|
|||
v['problem_list'] = v.title.trim()
|
||||
? [
|
||||
{
|
||||
content: v.title.trim()
|
||||
}
|
||||
content: v.title.trim(),
|
||||
},
|
||||
]
|
||||
: []
|
||||
})
|
||||
|
|
@ -232,7 +236,7 @@ onMounted(() => {
|
|||
defineExpose({
|
||||
paragraphList,
|
||||
checkedConnect,
|
||||
loading
|
||||
loading,
|
||||
})
|
||||
</script>
|
||||
<style scoped lang="scss">
|
||||
|
|
|
|||
|
|
@ -548,7 +548,7 @@ import { hitHandlingMethod } from '@/enums/document'
|
|||
import { MsgSuccess, MsgConfirm, MsgError } from '@/utils/message'
|
||||
import useStore from '@/stores/modules-shared-system'
|
||||
import StatusValue from '@/views/shared/document-shared/component/Status.vue'
|
||||
import GenerateRelatedDialog from '@/components/generate-related-dialog/index.vue'
|
||||
import GenerateRelatedDialog from '@/components/generate-related-shared-dialog/index.vue'
|
||||
import EmbeddingContentDialog from '@/views/shared/document-shared/component/EmbeddingContentDialog.vue'
|
||||
import { TaskType, State } from '@/utils/status'
|
||||
import { t } from '@/locales'
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ import KnowledgeIcon from '@/views/shared/knowledge-shared/component/KnowledgeIc
|
|||
import CreateKnowledgeDialog from './create-component/CreateKnowledgeDialog.vue'
|
||||
import CreateWebKnowledgeDialog from './create-component/CreateWebKnowledgeDialog.vue'
|
||||
import CreateFolderDialog from '@/components/folder-tree/CreateFolderDialog.vue'
|
||||
import GenerateRelatedDialog from '@/components/generate-related-dialog/index.vue'
|
||||
import GenerateRelatedDialog from '@/components/generate-related-shared-dialog/index.vue'
|
||||
import KnowledgeApi from '@/api/shared/knowledge'
|
||||
import KnowledgeWorkspaceApi from '@/api/shared/workspace'
|
||||
import { MsgSuccess, MsgConfirm } from '@/utils/message'
|
||||
|
|
|
|||
|
|
@ -287,7 +287,7 @@ import CreateKnowledgeDialog from './create-component/CreateKnowledgeDialog.vue'
|
|||
import CreateWebKnowledgeDialog from './create-component/CreateWebKnowledgeDialog.vue'
|
||||
import CreateLarkKnowledgeDialog from './create-component/CreateLarkKnowledgeDialog.vue'
|
||||
import CreateFolderDialog from '@/components/folder-tree/CreateFolderDialog.vue'
|
||||
import GenerateRelatedDialog from '@/components/generate-related-dialog/index.vue'
|
||||
import GenerateRelatedDialog from '@/components/generate-related-shared-dialog/index.vue'
|
||||
import KnowledgeApi from '@/api/shared/knowledge'
|
||||
import { MsgSuccess, MsgConfirm } from '@/utils/message'
|
||||
import useStore from '@/stores/modules-shared-system'
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ import { ref, useSlots } from 'vue'
|
|||
import { useRoute } from 'vue-router'
|
||||
import { t } from '@/locales'
|
||||
import useStore from '@/stores'
|
||||
import GenerateRelatedDialog from '@/components/generate-related-dialog/index.vue'
|
||||
import GenerateRelatedDialog from '@/components/generate-related-shared-dialog/index.vue'
|
||||
import ParagraphDialog from '@/views/paragraph/component/ParagraphDialog.vue'
|
||||
import SelectDocumentDialog from '@/views/paragraph/component/SelectDocumentDialog.vue'
|
||||
import { MsgSuccess, MsgConfirm } from '@/utils/message'
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ import paragraphApi from '@/api/shared/paragraph'
|
|||
import ParagraphDialog from './component/ParagraphDialog.vue'
|
||||
import ParagraphCard from './component/ParagraphCard.vue'
|
||||
import SelectDocumentDialog from './component/SelectDocumentDialog.vue'
|
||||
import GenerateRelatedDialog from '@/components/generate-related-dialog/index.vue'
|
||||
import GenerateRelatedDialog from '@/components/generate-related-shared-dialog/index.vue'
|
||||
import { VueDraggable } from 'vue-draggable-plus'
|
||||
import { MsgSuccess, MsgConfirm } from '@/utils/message'
|
||||
import useStore from '@/stores'
|
||||
|
|
|
|||
Loading…
Reference in New Issue