feat: Related Knowledge

This commit is contained in:
wangdan-fit2cloud 2025-06-13 15:52:47 +08:00
parent f7349d2b3d
commit 4948051f67
22 changed files with 377 additions and 345 deletions

View File

@ -21,6 +21,23 @@ const getKnowledgeByFolder: (data?: any, loading?: Ref<boolean>) => Promise<Resu
return get(`${prefix}/knowledge`, data, loading) return get(`${prefix}/knowledge`, data, loading)
} }
/**
*
* @param
* param {
folder_id: "string",
name: "string",
tool_type: "string",
desc: string,
}
*/
const getKnowledgeList: (param?: any, loading?: Ref<boolean>) => Promise<Result<any>> = (
param,
loading,
) => {
return get(`${prefix}/knowledge`, param, loading)
}
/** /**
* *
* @param * @param
@ -31,7 +48,7 @@ const getKnowledgeByFolder: (data?: any, loading?: Ref<boolean>) => Promise<Resu
desc: string, desc: string,
} }
*/ */
const getKnowledgeList: ( const getKnowledgeListPage: (
page: pageRequest, page: pageRequest,
param?: any, param?: any,
loading?: Ref<boolean>, loading?: Ref<boolean>,
@ -234,14 +251,6 @@ const postWebKnowledge: (data: any, loading?: Ref<boolean>) => Promise<Result<an
return post(`${prefix}/knowledge/web`, data, undefined, loading) return post(`${prefix}/knowledge/web`, data, undefined, loading)
} }
/**
*
* @param
*/
const getAllKnowledge: (loading?: Ref<boolean>) => Promise<Result<any[]>> = (loading) => {
return get(`${prefix}`, undefined, loading)
}
/** /**
* *
* @param knowledge_id * @param knowledge_id
@ -269,6 +278,7 @@ const importLarkDocument: (
export default { export default {
getKnowledgeByFolder, getKnowledgeByFolder,
getKnowledgeList, getKnowledgeList,
getKnowledgeListPage,
getKnowledgeDetail, getKnowledgeDetail,
putKnowledge, putKnowledge,
delKnowledge, delKnowledge,
@ -284,5 +294,4 @@ export default {
getLarkDocumentList, getLarkDocumentList,
importLarkDocument, importLarkDocument,
getAllKnowledge,
} }

View File

@ -79,6 +79,23 @@ const getKnowledgeByFolder: (data?: any, loading?: Ref<boolean>) => Promise<Resu
return get(`${prefix}/knowledge`, data, loading) return get(`${prefix}/knowledge`, data, loading)
} }
/**
*
* @param
* param {
"folder_id": "string",
"name": "string",
"tool_type": "string",
desc: string,
}
*/
const getKnowledgeList: (param?: any, loading?: Ref<boolean>) => Promise<Result<any>> = (
param,
loading,
) => {
return get(`${prefix}/knowledge`, param, loading)
}
/** /**
* *
* @param * @param
@ -89,7 +106,7 @@ const getKnowledgeByFolder: (data?: any, loading?: Ref<boolean>) => Promise<Resu
desc: string, desc: string,
} }
*/ */
const getKnowledgeList: ( const getKnowledgeListPage: (
page: pageRequest, page: pageRequest,
param?: any, param?: any,
loading?: Ref<boolean>, loading?: Ref<boolean>,
@ -292,14 +309,6 @@ const postWebKnowledge: (data: any, loading?: Ref<boolean>) => Promise<Result<an
return post(`${prefix}/knowledge/web`, data, undefined, loading) return post(`${prefix}/knowledge/web`, data, undefined, loading)
} }
/**
*
* @param
*/
const getAllKnowledge: (loading?: Ref<boolean>) => Promise<Result<any[]>> = (loading) => {
return get(`${prefix}/knowledge`, undefined, loading)
}
/** /**
* *
* @param knowledge_id * @param knowledge_id
@ -327,6 +336,7 @@ const importLarkDocument: (
export default { export default {
getKnowledgeByFolder, getKnowledgeByFolder,
getKnowledgeList, getKnowledgeList,
getKnowledgeListPage,
getKnowledgeDetail, getKnowledgeDetail,
putKnowledge, putKnowledge,
delKnowledge, delKnowledge,
@ -342,7 +352,6 @@ export default {
getLarkDocumentList, getLarkDocumentList,
importLarkDocument, importLarkDocument,
getAllKnowledge,
getSharedWorkspaceKnowledge, getSharedWorkspaceKnowledge,
getSharedWorkspaceKnowledgePage, getSharedWorkspaceKnowledgePage,
getSharedAuthorizationKnowledgeGet, getSharedAuthorizationKnowledgeGet,

View File

@ -169,7 +169,7 @@ function changeMenu(id: string) {
function getDataset() { function getDataset() {
loading.value = true loading.value = true
knowledge knowledge
.asyncGetAllKnowledge() .asyncGetRootKnowledge()
.then((res: any) => { .then((res: any) => {
list.value = res.data list.value = res.data
common.saveBreadcrumb(list.value) common.saveBreadcrumb(list.value)

View File

@ -131,7 +131,6 @@ export default {
addKnowledge: 'Add Related Knowledge', addKnowledge: 'Add Related Knowledge',
addKnowledgePlaceholder: 'The selected knowledge must use the same embedding model', addKnowledgePlaceholder: 'The selected knowledge must use the same embedding model',
selected: 'Selected', selected: 'Selected',
countDataset: 'Knowledge',
selectSearchMode: 'Retrieval Mode', selectSearchMode: 'Retrieval Mode',
vectorSearch: 'Vector Search', vectorSearch: 'Vector Search',

View File

@ -122,7 +122,6 @@ export default {
addKnowledge: '添加关联知识库', addKnowledge: '添加关联知识库',
addKnowledgePlaceholder: '所选知识库必须使用相同的 Embedding 模型', addKnowledgePlaceholder: '所选知识库必须使用相同的 Embedding 模型',
selected: '已选', selected: '已选',
countDataset: '个知识库',
selectSearchMode: '检索模式', selectSearchMode: '检索模式',
vectorSearch: '向量检索', vectorSearch: '向量检索',

View File

@ -122,7 +122,6 @@ export default {
addKnowledge: '新增關聯知識庫', addKnowledge: '新增關聯知識庫',
addKnowledgePlaceholder: '所選知識庫必須使用相同的 Embedding 模型', addKnowledgePlaceholder: '所選知識庫必須使用相同的 Embedding 模型',
selected: '已選', selected: '已選',
countDataset: '個知識庫',
selectSearchMode: '檢索模式', selectSearchMode: '檢索模式',
vectorSearch: '向量檢索', vectorSearch: '向量檢索',

View File

@ -1,8 +1,8 @@
import {defineStore} from 'pinia' import { defineStore } from 'pinia'
import type {knowledgeData} from '@/api/type/knowledge' import type { knowledgeData } from '@/api/type/knowledge'
import type {UploadUserFile} from 'element-plus' import type { UploadUserFile } from 'element-plus'
import knowledgeApi from '@/api/shared/knowledge' import knowledgeApi from '@/api/shared/knowledge'
import {type Ref} from 'vue' import { type Ref } from 'vue'
export interface knowledgeStateTypes { export interface knowledgeStateTypes {
baseInfo: knowledgeData | null baseInfo: knowledgeData | null
@ -31,10 +31,13 @@ const useKnowledgeStore = defineStore('knowledg', {
saveDocumentsFile(file: UploadUserFile[]) { saveDocumentsFile(file: UploadUserFile[]) {
this.documentsFiles = file this.documentsFiles = file
}, },
async asyncGetAllKnowledge(loading?: Ref<boolean>) { async asyncGetRootKnowledge(loading?: Ref<boolean>) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const params = {
folder_id: localStorage.getItem('workspace_id'),
}
knowledgeApi knowledgeApi
.getAllKnowledge(loading) .getKnowledgeList(params, loading)
.then((data) => { .then((data) => {
resolve(data) resolve(data)
}) })
@ -43,10 +46,7 @@ const useKnowledgeStore = defineStore('knowledg', {
}) })
}) })
}, },
async asyncGetKnowledgeDetail( async asyncGetKnowledgeDetail(knowledge_id: string, loading?: Ref<boolean>) {
knowledge_id: string,
loading?: Ref<boolean>,
) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
knowledgeApi knowledgeApi
.getKnowledgeDetail(knowledge_id, loading) .getKnowledgeDetail(knowledge_id, loading)
@ -58,11 +58,7 @@ const useKnowledgeStore = defineStore('knowledg', {
}) })
}) })
}, },
async asyncSyncKnowledge( async asyncSyncKnowledge(id: string, sync_type: string, loading?: Ref<boolean>) {
id: string,
sync_type: string,
loading?: Ref<boolean>,
) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
knowledgeApi knowledgeApi
.putSyncWebKnowledge(id, sync_type, loading) .putSyncWebKnowledge(id, sync_type, loading)

View File

@ -1,6 +1,5 @@
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import applicationApi from '@/api/application/application' import applicationApi from '@/api/application/application'
import knowledgeAPI from '@/api/knowledge/knowledge.ts'
import applicationXpackApi from '@/api/application/application-xpack' import applicationXpackApi from '@/api/application/application-xpack'
import { type Ref } from 'vue' import { type Ref } from 'vue'
import { getBrowserLang } from '@/locales/index' import { getBrowserLang } from '@/locales/index'
@ -36,19 +35,6 @@ const useApplicationStore = defineStore('application', {
}) })
}, },
async asyncGetApplicationKnowledge(id: string, loading?: Ref<boolean>) {
return new Promise((resolve, reject) => {
knowledgeAPI
.getAllKnowledge(loading)
.then((data) => {
resolve(data)
})
.catch((error) => {
reject(error)
})
})
},
async asyncGetAccessToken(id: string, loading?: Ref<boolean>) { async asyncGetAccessToken(id: string, loading?: Ref<boolean>) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const user = useUserStore() const user = useUserStore()

View File

@ -1,8 +1,8 @@
import {defineStore} from 'pinia' import { defineStore } from 'pinia'
import type {knowledgeData} from '@/api/type/knowledge' import type { knowledgeData } from '@/api/type/knowledge'
import type {UploadUserFile} from 'element-plus' import type { UploadUserFile } from 'element-plus'
import knowledgeApi from '@/api/knowledge/knowledge' import knowledgeApi from '@/api/knowledge/knowledge'
import {type Ref} from 'vue' import { type Ref } from 'vue'
export interface knowledgeStateTypes { export interface knowledgeStateTypes {
baseInfo: knowledgeData | null baseInfo: knowledgeData | null
@ -31,10 +31,13 @@ const useKnowledgeStore = defineStore('knowledge', {
saveDocumentsFile(file: UploadUserFile[]) { saveDocumentsFile(file: UploadUserFile[]) {
this.documentsFiles = file this.documentsFiles = file
}, },
async asyncGetAllKnowledge(loading?: Ref<boolean>) { async asyncGetRootKnowledge(loading?: Ref<boolean>) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const params = {
folder_id: localStorage.getItem('workspace_id'),
}
knowledgeApi knowledgeApi
.getAllKnowledge(loading) .getKnowledgeList(params, loading)
.then((data) => { .then((data) => {
resolve(data) resolve(data)
}) })
@ -43,10 +46,7 @@ const useKnowledgeStore = defineStore('knowledge', {
}) })
}) })
}, },
async asyncGetKnowledgeDetail( async asyncGetKnowledgeDetail(knowledge_id: string, loading?: Ref<boolean>) {
knowledge_id: string,
loading?: Ref<boolean>,
) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
knowledgeApi knowledgeApi
.getKnowledgeDetail(knowledge_id, loading) .getKnowledgeDetail(knowledge_id, loading)
@ -58,11 +58,7 @@ const useKnowledgeStore = defineStore('knowledge', {
}) })
}) })
}, },
async asyncSyncKnowledge( async asyncSyncKnowledge(id: string, sync_type: string, loading?: Ref<boolean>) {
id: string,
sync_type: string,
loading?: Ref<boolean>,
) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
knowledgeApi knowledgeApi
.putSyncWebKnowledge(id, sync_type, loading) .putSyncWebKnowledge(id, sync_type, loading)

View File

@ -185,6 +185,7 @@
<div class="flex align-center" style="width: 80%"> <div class="flex align-center" style="width: 80%">
<KnowledgeIcon <KnowledgeIcon
:type="relatedObject(knowledgeList, item, 'id')?.type" :type="relatedObject(knowledgeList, item, 'id')?.type"
class="mr-12"
/> />
<span <span
@ -439,7 +440,7 @@ import { t } from '@/locales'
import TTSModeParamSettingDialog from './component/TTSModeParamSettingDialog.vue' import TTSModeParamSettingDialog from './component/TTSModeParamSettingDialog.vue'
import ReasoningParamSettingDialog from './component/ReasoningParamSettingDialog.vue' import ReasoningParamSettingDialog from './component/ReasoningParamSettingDialog.vue'
const { model, application } = useStore() const { knowledge, model, application } = useStore()
const route = useRoute() const route = useRoute()
const { const {
@ -628,7 +629,7 @@ function getDetail() {
} }
function getKnowledge() { function getKnowledge() {
application.asyncGetApplicationKnowledge(id, knowledgeLoading).then((res: any) => { knowledge.asyncGetRootKnowledge(knowledgeLoading).then((res: any) => {
knowledgeList.value = res.data knowledgeList.value = res.data
}) })
} }
@ -706,8 +707,7 @@ function refresh() {
onMounted(() => { onMounted(() => {
getModel() getModel()
// todo getKnowledge()
// getKnowledge()
getDetail() getDetail()
getSTTModel() getSTTModel()
getTTSModel() getTTSModel()

View File

@ -35,23 +35,39 @@
</div> </div>
</div> </div>
</template> </template>
<el-scrollbar> <LayoutContainer class="application-manage">
<div class="max-height"> <template #left>
<el-row :gutter="12" v-loading="loading"> <folder-tree
<el-col :span="12" v-for="(item, index) in filterData" :key="index" class="mb-16"> :data="folderList"
<CardCheckbox value-field="id" :data="item" v-model="checkList" @change="changeHandle"> :currentNodeKey="currentFolder?.id"
<span class="ellipsis cursor" :title="item.name"> {{ item.name }}</span> @handleNodeClick="folderClickHandel"
</CardCheckbox> class="p-8"
</el-col> v-loading="folderLoading"
</el-row> />
</div> </template>
</el-scrollbar> <el-scrollbar>
<div class="max-height layout-bg p-16-24">
<el-row :gutter="12" v-loading="loading">
<el-col :span="12" v-for="(item, index) in filterData" :key="index" class="mb-16">
<CardCheckbox
value-field="id"
:data="item"
v-model="checkList"
@change="changeHandle"
>
<span class="ellipsis cursor ml-12" :title="item.name"> {{ item.name }}</span>
</CardCheckbox>
</el-col>
</el-row>
</div>
</el-scrollbar>
</LayoutContainer>
<template #footer> <template #footer>
<div class="flex-between"> <div class="flex-between">
<div class="flex"> <div class="flex">
<el-text type="info" class="color-secondary mr-8" v-if="checkList.length > 0"> <el-text type="info" class="color-secondary mr-8" v-if="checkList.length > 0">
{{ $t('views.application.dialog.selected') }} {{ checkList.length }} {{ $t('views.application.dialog.selected') }} {{ checkList.length }}
{{ $t('views.application.dialog.countDataset') }}
</el-text> </el-text>
<el-button link type="primary" v-if="checkList.length > 0" @click="clearCheck"> <el-button link type="primary" v-if="checkList.length > 0" @click="clearCheck">
{{ $t('common.clear') }} {{ $t('common.clear') }}
@ -62,7 +78,7 @@
{{ $t('common.cancel') }} {{ $t('common.cancel') }}
</el-button> </el-button>
<el-button type="primary" @click="submitHandle"> <el-button type="primary" @click="submitHandle">
{{ $t('common.confirm') }} {{ $t('common.add') }}
</el-button> </el-button>
</span> </span>
</div> </div>
@ -71,6 +87,8 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { computed, ref, watch } from 'vue' import { computed, ref, watch } from 'vue'
import KnowledgeApi from '@/api/knowledge/knowledge'
import useStore from '@/stores'
const props = defineProps({ const props = defineProps({
data: { data: {
type: Array<any>, type: Array<any>,
@ -80,12 +98,14 @@ const props = defineProps({
}) })
const emit = defineEmits(['addData', 'refresh']) const emit = defineEmits(['addData', 'refresh'])
const { folder } = useStore()
const dialogVisible = ref<boolean>(false) const dialogVisible = ref<boolean>(false)
const checkList = ref([]) const checkList = ref([])
const currentEmbedding = ref('') const currentEmbedding = ref('')
const searchValue = ref('') const searchValue = ref('')
const searchDate = ref<any[]>([]) const searchDate = ref<any[]>([])
const loading = ref(false)
const filterData = computed(() => { const filterData = computed(() => {
return currentEmbedding.value return currentEmbedding.value
@ -124,8 +144,8 @@ function clearCheck() {
} }
const open = (checked: any) => { const open = (checked: any) => {
searchDate.value = props.data
checkList.value = checked checkList.value = checked
getFolder()
if (checkList.value.length > 0) { if (checkList.value.length > 0) {
currentEmbedding.value = props.data.filter( currentEmbedding.value = props.data.filter(
(v) => v.id === checkList.value[0], (v) => v.id === checkList.value[0],
@ -134,6 +154,7 @@ const open = (checked: any) => {
dialogVisible.value = true dialogVisible.value = true
} }
const submitHandle = () => { const submitHandle = () => {
emit('addData', checkList.value) emit('addData', checkList.value)
dialogVisible.value = false dialogVisible.value = false
@ -143,6 +164,36 @@ const refresh = () => {
emit('refresh') emit('refresh')
} }
const folderList = ref<any[]>([])
const knowledgeList = ref<any[]>([])
const currentFolder = ref<any>({})
const folderLoading = ref(false)
//
function folderClickHandel(row: any) {
currentFolder.value = row
knowledgeList.value = []
if (currentFolder.value.id === 'share') return
getList()
}
function getFolder() {
const params = {}
folder.asyncGetFolder('KNOWLEDGE', params, folderLoading).then((res: any) => {
folderList.value = res.data
currentFolder.value = res.data?.[0] || {}
getList()
})
}
function getList() {
const params = {
folder_id: currentFolder.value?.id || localStorage.getItem('workspace_id'),
}
KnowledgeApi.getKnowledgeList(params, loading).then((res) => {
searchDate.value = res.data
})
}
defineExpose({ open }) defineExpose({ open })
</script> </script>
<style lang="scss"> <style lang="scss">
@ -152,11 +203,9 @@ defineExpose({ open })
padding: 12px 20px 4px 24px; padding: 12px 20px 4px 24px;
border-bottom: 1px solid var(--el-border-color-light); border-bottom: 1px solid var(--el-border-color-light);
} }
.el-dialog__body {
padding: 8px !important;
}
.el-dialog__footer { .el-dialog__footer {
padding: 0 24px 16px 24px; padding: 12px 24px 12px 24px;
border-top: 1px solid var(--el-border-color-light);
} }
.el-dialog__headerbtn { .el-dialog__headerbtn {
@ -165,7 +214,7 @@ defineExpose({ open })
} }
.max-height { .max-height {
max-height: calc(100vh - 260px); max-height: calc(100vh - 260px);
padding: 0 16px; min-height: 300px;
} }
} }
</style> </style>

View File

@ -10,182 +10,174 @@
:close-on-press-escape="false" :close-on-press-escape="false"
> >
<el-scrollbar max-height="550"> <el-scrollbar max-height="550">
<div class="p-16"> <el-form label-position="top" ref="paramFormRef" :model="form" v-loading="loading">
<el-form label-position="top" ref="paramFormRef" :model="form" v-loading="loading"> <el-form-item :label="$t('views.application.dialog.selectSearchMode')">
<el-form-item :label="$t('views.application.dialog.selectSearchMode')"> <el-radio-group
<el-radio-group v-model="form.knowledge_setting.search_mode"
v-model="form.knowledge_setting.search_mode" class="card__radio"
class="card__radio" @change="changeHandle"
@change="changeHandle"
>
<el-card
shadow="never"
class="mb-16"
:class="form.search_mode === 'embedding' ? 'active' : ''"
>
<el-radio value="embedding" size="large">
<p class="mb-4">
{{ $t('views.application.dialog.vectorSearch') }}
</p>
<el-text type="info">{{
$t('views.application.dialog.vectorSearchTooltip')
}}</el-text>
</el-radio>
</el-card>
<el-card
shadow="never"
class="mb-16"
:class="form.knowledge_setting.search_mode === 'keywords' ? 'active' : ''"
>
<el-radio value="keywords" size="large">
<p class="mb-4">
{{ $t('views.application.dialog.fullTextSearch') }}
</p>
<el-text type="info">{{
$t('views.application.dialog.fullTextSearchTooltip')
}}</el-text>
</el-radio>
</el-card>
<el-card
shadow="never"
:class="form.knowledge_setting.search_mode === 'blend' ? 'active' : ''"
>
<el-radio value="blend" size="large">
<p class="mb-4">
{{ $t('views.application.dialog.hybridSearch') }}
</p>
<el-text type="info">{{
$t('views.application.dialog.hybridSearchTooltip')
}}</el-text>
</el-radio>
</el-card>
</el-radio-group>
</el-form-item>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item>
<template #label>
<div class="flex align-center">
<span class="mr-4">{{
$t('views.application.dialog.similarityThreshold')
}}</span>
<el-tooltip
effect="dark"
:content="$t('views.application.dialog.similarityTooltip')"
placement="right"
>
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
</el-tooltip>
</div>
</template>
<el-input-number
v-model="form.knowledge_setting.similarity"
:min="0"
:max="form.knowledge_setting.search_mode === 'blend' ? 2 : 1"
:precision="3"
:step="0.1"
:value-on-clear="0"
controls-position="right"
class="w-full"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('views.application.dialog.topReferences')">
<el-input-number
v-model="form.knowledge_setting.top_n"
:min="1"
:max="10000"
:value-on-clear="1"
controls-position="right"
class="w-full"
/>
</el-form-item>
</el-col>
</el-row>
<el-form-item :label="$t('views.application.dialog.maxCharacters')">
<el-slider
v-model="form.knowledge_setting.max_paragraph_char_number"
show-input
:show-input-controls="false"
:min="500"
:max="100000"
class="custom-slider"
/>
</el-form-item>
<el-form-item
v-if="!isWorkflowType"
:label="$t('views.application.dialog.noReferencesAction')"
> >
<el-form <el-card
label-position="top" shadow="never"
ref="noReferencesformRef" class="mb-16"
:model="noReferencesform" :class="form.search_mode === 'embedding' ? 'active' : ''"
:rules="noReferencesRules"
:hide-required-asterisk="true"
class="w-full"
> >
<el-radio-group <el-radio value="embedding" size="large">
v-model="form.knowledge_setting.no_references_setting.status" <p class="mb-4">
class="radio-block-avatar" {{ $t('views.application.dialog.vectorSearch') }}
> </p>
<el-radio value="ai_questioning"> <el-text type="info">{{
<p> $t('views.application.dialog.vectorSearchTooltip')
{{ $t('views.application.dialog.continueQuestioning') }} }}</el-text>
</p> </el-radio>
</el-radio> </el-card>
<el-card
<el-radio value="designated_answer"> shadow="never"
<p>{{ $t('views.application.dialog.provideAnswer') }}</p> class="mb-16"
<el-form-item :class="form.knowledge_setting.search_mode === 'keywords' ? 'active' : ''"
v-if=" >
form.knowledge_setting.no_references_setting.status === 'designated_answer' <el-radio value="keywords" size="large">
" <p class="mb-4">
prop="designated_answer" {{ $t('views.application.dialog.fullTextSearch') }}
</p>
<el-text type="info">{{
$t('views.application.dialog.fullTextSearchTooltip')
}}</el-text>
</el-radio>
</el-card>
<el-card
shadow="never"
:class="form.knowledge_setting.search_mode === 'blend' ? 'active' : ''"
>
<el-radio value="blend" size="large">
<p class="mb-4">
{{ $t('views.application.dialog.hybridSearch') }}
</p>
<el-text type="info">{{
$t('views.application.dialog.hybridSearchTooltip')
}}</el-text>
</el-radio>
</el-card>
</el-radio-group>
</el-form-item>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item>
<template #label>
<div class="flex align-center">
<span class="mr-4">{{ $t('views.application.dialog.similarityThreshold') }}</span>
<el-tooltip
effect="dark"
:content="$t('views.application.dialog.similarityTooltip')"
placement="right"
> >
<el-input <AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
v-model="noReferencesform.designated_answer" </el-tooltip>
:rows="2" </div>
type="textarea" </template>
maxlength="2048" <el-input-number
:placeholder="defaultValue['designated_answer']" v-model="form.knowledge_setting.similarity"
/> :min="0"
</el-form-item> :max="form.knowledge_setting.search_mode === 'blend' ? 2 : 1"
</el-radio> :precision="3"
</el-radio-group> :step="0.1"
</el-form> :value-on-clear="0"
</el-form-item> controls-position="right"
class="w-full"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('views.application.dialog.topReferences')">
<el-input-number
v-model="form.knowledge_setting.top_n"
:min="1"
:max="10000"
:value-on-clear="1"
controls-position="right"
class="w-full"
/>
</el-form-item>
</el-col>
</el-row>
<el-form-item @click.prevent v-if="!isWorkflowType"> <el-form-item :label="$t('views.application.dialog.maxCharacters')">
<template #label> <el-slider
<div class="flex align-center"> v-model="form.knowledge_setting.max_paragraph_char_number"
<span class="mr-4">{{ show-input
$t('views.application.form.problemOptimization.label') :show-input-controls="false"
}}</span> :min="500"
</div> :max="100000"
</template> class="custom-slider"
<el-switch size="small" v-model="form.problem_optimization"></el-switch> />
</el-form-item> </el-form-item>
<el-form-item
v-if="form.problem_optimization" <el-form-item
:label="$t('views.application.form.prompt.label')" v-if="!isWorkflowType"
:label="$t('views.application.dialog.noReferencesAction')"
>
<el-form
label-position="top"
ref="noReferencesformRef"
:model="noReferencesform"
:rules="noReferencesRules"
:hide-required-asterisk="true"
class="w-full"
> >
<el-input <el-radio-group
v-model="form.problem_optimization_prompt" v-model="form.knowledge_setting.no_references_setting.status"
:rows="6" class="radio-block-avatar"
type="textarea" >
maxlength="2048" <el-radio value="ai_questioning">
:placeholder="defaultPrompt" <p>
/> {{ $t('views.application.dialog.continueQuestioning') }}
</el-form-item> </p>
</el-form> </el-radio>
</div>
<el-radio value="designated_answer">
<p>{{ $t('views.application.dialog.provideAnswer') }}</p>
<el-form-item
v-if="form.knowledge_setting.no_references_setting.status === 'designated_answer'"
prop="designated_answer"
>
<el-input
v-model="noReferencesform.designated_answer"
:rows="2"
type="textarea"
maxlength="2048"
:placeholder="defaultValue['designated_answer']"
/>
</el-form-item>
</el-radio>
</el-radio-group>
</el-form>
</el-form-item>
<el-form-item @click.prevent v-if="!isWorkflowType">
<template #label>
<div class="flex align-center">
<span class="mr-4">{{ $t('views.application.form.problemOptimization.label') }}</span>
</div>
</template>
<el-switch size="small" v-model="form.problem_optimization"></el-switch>
</el-form-item>
<el-form-item
v-if="form.problem_optimization"
:label="$t('views.application.form.prompt.label')"
>
<el-input
v-model="form.problem_optimization_prompt"
:rows="6"
type="textarea"
maxlength="2048"
:placeholder="defaultPrompt"
/>
</el-form-item>
</el-form>
</el-scrollbar> </el-scrollbar>
<template #footer> <template #footer>
<span class="dialog-footer p-16"> <span class="dialog-footer">
<el-button @click.prevent="dialogVisible = false">{{ $t('common.cancel') }}</el-button> <el-button @click.prevent="dialogVisible = false">{{ $t('common.cancel') }}</el-button>
<el-button type="primary" @click="submit(noReferencesformRef)" :loading="loading"> <el-button type="primary" @click="submit(noReferencesformRef)" :loading="loading">
{{ $t('common.save') }} {{ $t('common.save') }}

View File

@ -115,7 +115,7 @@ const submitHandle = () => {
} }
function getDataset() { function getDataset() {
knowledge.asyncGetAllKnowledge(loading).then((res: any) => { knowledge.asyncGetRootKnowledge(loading).then((res: any) => {
datasetList.value = res.data?.filter((v: any) => v.id !== id) datasetList.value = res.data?.filter((v: any) => v.id !== id)
}) })
} }

View File

@ -92,7 +92,7 @@ const submitHandle = () => {
} }
function getDataset() { function getDataset() {
knowledge.asyncGetAllKnowledge(loading).then((res: any) => { knowledge.asyncGetRootKnowledge(loading).then((res: any) => {
datasetList.value = res.data?.filter((v: any) => v.id !== id) datasetList.value = res.data?.filter((v: any) => v.id !== id)
}) })
} }

View File

@ -368,7 +368,7 @@ function getList() {
[search_type.value]: search_form.value[search_type.value], [search_type.value]: search_form.value[search_type.value],
} }
KnowledgeApi.getKnowledgeList(paginationConfig, params, loading).then((res) => { KnowledgeApi.getKnowledgeListPage(paginationConfig, params, loading).then((res) => {
paginationConfig.total = res.data.total paginationConfig.total = res.data.total
knowledgeList.value = [...knowledgeList.value, ...res.data.records] knowledgeList.value = [...knowledgeList.value, ...res.data.records]
}) })

View File

@ -363,7 +363,7 @@ function getList() {
[search_type.value]: search_form.value[search_type.value], [search_type.value]: search_form.value[search_type.value],
} }
KnowledgeApi.getKnowledgeList(paginationConfig, params, loading).then((res) => { KnowledgeApi.getKnowledgeListPage(paginationConfig, params, loading).then((res) => {
paginationConfig.total = res.data.total paginationConfig.total = res.data.total
knowledgeList.value = [...knowledgeList.value, ...res.data.records] knowledgeList.value = [...knowledgeList.value, ...res.data.records]
}) })

View File

@ -144,7 +144,7 @@ function getDocument(id: string) {
} }
function getDataset() { function getDataset() {
knowledge.asyncGetAllKnowledge(loading).then((res: any) => { knowledge.asyncGetRootKnowledge(loading).then((res: any) => {
datasetList.value = res.data datasetList.value = res.data
}) })
} }

View File

@ -121,7 +121,7 @@ function getDocument(id: string) {
} }
function getDataset() { function getDataset() {
knowledge.asyncGetAllKnowledge(loading).then((res: any) => { knowledge.asyncGetRootKnowledge(loading).then((res: any) => {
datasetList.value = res.data datasetList.value = res.data
}) })
} }

View File

@ -11,67 +11,65 @@
> >
<div> <div>
<el-scrollbar always> <el-scrollbar always>
<div class="p-16"> <el-form label-position="top" ref="paramFormRef" :model="form">
<el-form label-position="top" ref="paramFormRef" :model="form"> <el-row :gutter="20">
<el-row :gutter="20"> <el-col :span="12">
<el-col :span="12"> <el-form-item>
<el-form-item> <template #label>
<template #label> <div class="flex align-center">
<div class="flex align-center"> <span class="mr-4"
<span class="mr-4" >Score {{ $t('views.applicationWorkflow.nodes.rerankerNode.higher') }}</span
>Score {{ $t('views.applicationWorkflow.nodes.rerankerNode.higher') }}</span >
> <el-tooltip
<el-tooltip effect="dark"
effect="dark" :content="$t('views.applicationWorkflow.nodes.rerankerNode.ScoreTooltip')"
:content="$t('views.applicationWorkflow.nodes.rerankerNode.ScoreTooltip')" placement="right"
placement="right" >
> <AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon> </el-tooltip>
</el-tooltip> </div>
</div> </template>
</template> <el-input-number
<el-input-number v-model="form.similarity"
v-model="form.similarity" :min="0"
:min="0" :max="form.search_mode === 'blend' ? 2 : 1"
:max="form.search_mode === 'blend' ? 2 : 1" :precision="3"
:precision="3" :step="0.1"
:step="0.1" :value-on-clear="0"
:value-on-clear="0" controls-position="right"
controls-position="right" class="w-full"
class="w-full" />
/> </el-form-item>
</el-form-item> </el-col>
</el-col> <el-col :span="12">
<el-col :span="12"> <el-form-item :label="$t('views.application.dialog.topReferences')">
<el-form-item :label="$t('views.application.dialog.topReferences')"> <el-input-number
<el-input-number v-model="form.top_n"
v-model="form.top_n" :min="1"
:min="1" :max="10000"
:max="10000" :value-on-clear="1"
:value-on-clear="1" controls-position="right"
controls-position="right" class="w-full"
class="w-full" />
/> </el-form-item>
</el-form-item> </el-col>
</el-col> </el-row>
</el-row>
<el-form-item :label="$t('views.application.dialog.maxCharacters')"> <el-form-item :label="$t('views.application.dialog.maxCharacters')">
<el-slider <el-slider
v-model="form.max_paragraph_char_number" v-model="form.max_paragraph_char_number"
show-input show-input
:show-input-controls="false" :show-input-controls="false"
:min="500" :min="500"
:max="100000" :max="100000"
class="custom-slider" class="custom-slider"
/> />
</el-form-item> </el-form-item>
</el-form> </el-form>
</div>
</el-scrollbar> </el-scrollbar>
</div> </div>
<template #footer> <template #footer>
<span class="dialog-footer p-16"> <span class="dialog-footer">
<el-button @click.prevent="dialogVisible = false">{{ $t('common.cancel') }}</el-button> <el-button @click.prevent="dialogVisible = false">{{ $t('common.cancel') }}</el-button>
<el-button type="primary" @click="submit()" :loading="loading"> <el-button type="primary" @click="submit()" :loading="loading">
{{ $t('common.save') }} {{ $t('common.save') }}
@ -91,7 +89,7 @@ const paramFormRef = ref<FormInstance>()
const form = ref<any>({ const form = ref<any>({
top_n: 3, top_n: 3,
similarity: 0, similarity: 0,
max_paragraph_char_number: 5000 max_paragraph_char_number: 5000,
}) })
const dialogVisible = ref<boolean>(false) const dialogVisible = ref<boolean>(false)
@ -102,7 +100,7 @@ watch(dialogVisible, (bool) => {
form.value = { form.value = {
top_n: 3, top_n: 3,
similarity: 0, similarity: 0,
max_paragraph_char_number: 5000 max_paragraph_char_number: 5000,
} }
} }
}) })

View File

@ -1,12 +0,0 @@
import SearchDatasetVue from './index.vue'
import { AppNode, AppNodeModel } from '@/workflow/common/app-node'
class SearchDatasetNode extends AppNode {
constructor(props: any) {
super(props, SearchDatasetVue)
}
}
export default {
type: 'search-dataset-node',
model: AppNodeModel,
view: SearchDatasetNode
}

View File

@ -0,0 +1,12 @@
import SearchKnowledgeVue from './index.vue'
import { AppNode, AppNodeModel } from '@/workflow/common/app-node'
class SearchKnowledgeNode extends AppNode {
constructor(props: any) {
super(props, SearchKnowledgeVue)
}
}
export default {
type: 'search-knowledge-node',
model: AppNodeModel,
view: SearchKnowledgeNode
}

View File

@ -184,15 +184,15 @@ function openDatasetDialog() {
} }
function getDataset() { function getDataset() {
if (id) { // if (id) {
application.asyncGetApplicationKnowledge(id, datasetLoading).then((res: any) => { // application.asyncGetApplicationKnowledge(id, datasetLoading).then((res: any) => {
datasetList.value = res.data // datasetList.value = res.data
}) // })
} else { // } else {
knowledge.asyncGetAllKnowledge(datasetLoading).then((res: any) => { knowledge.asyncGetRootKnowledge(datasetLoading).then((res: any) => {
datasetList.value = res.data?.filter((v: any) => v.user_id === user.userInfo?.id) datasetList.value = res.data?.filter((v: any) => v.user_id === user.userInfo?.id)
}) })
} // }
} }
function refresh() { function refresh() {
getDataset() getDataset()