perf: Knowledge base workflow adjustment

This commit is contained in:
wangdan-fit2cloud 2025-12-02 19:49:20 +08:00
parent 9255089d8b
commit d39a27f360
10 changed files with 204 additions and 126 deletions

View File

@ -1079,105 +1079,112 @@
</div>
</div>
</template>
<slot></slot>
</template>
<!-- 文本文件 -->
<template v-if="data.type === WorkflowType.DataSourceLocalNode">
<div class="card-never border-r-6">
<h5 class="p-8-12">
{{ $t('common.param.outputParam') }}
</h5>
<!-- 文本文件 -->
<template v-if="data.type === WorkflowType.DataSourceLocalNode">
<div class="card-never border-r-6">
<h5 class="p-8-12">
{{ $t('common.param.outputParam') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
<div class="mb-8">
{{ data.file_list || '-' }}
<div class="p-8-12 border-t-dashed lighter">
<div class="mb-8">
{{ data.file_list || '-' }}
</div>
</div>
</div>
</div>
</template>
<!-- 文档分段 -->
<template v-if="data.type === WorkflowType.DocumentSplitNode">
<div class="card-never border-r-6">
<h5 class="p-8-12">
{{ $t('common.param.inputParam') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
<div v-for="(f, i) in data.result_list" :key="i" class="mb-8">
<span class="color-secondary">{{ f.name }}:</span> {{ f.input_value }}
</template>
<!-- 文档分段 -->
<template v-if="data.type === WorkflowType.DocumentSplitNode">
<div class="card-never border-r-6">
<h5 class="p-8-12">
{{ $t('common.param.inputParam') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
<div class="mb-8">
<span class="color-secondary"
>{{ $t('chat.executionDetails.paragraphRules') }}:</span
>
{{ data.split_strategy }}
</div>
<div class="mb-8">
<span class="color-secondary">{{ $t('common.inputContent') }}:</span>
{{ data.document_list }}
</div>
</div>
</div>
</div>
<div class="card-never border-r-6 mt-8">
<h5 class="p-8-12">
{{ $t('common.param.outputParam') }}每个文档仅能预览前五个分段
</h5>
<div class="p-8-12 border-t-dashed lighter">
<el-radio-group v-model="currentParagraph" class="app-radio-button-group mb-8">
<template
v-for="(paragrapg, ParagraphIndex) in data.paragraph_list"
:key="ParagraphIndex"
>
<el-radio-button :label="paragrapg.name" :value="ParagraphIndex" />
<div class="card-never border-r-6 mt-8">
<h5 class="p-8-12">
{{ $t('common.param.outputParam') }}{{ $t('chat.executionDetails.documentSplitTip') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
<el-radio-group v-model="currentParagraph" class="app-radio-button-group mb-8">
<template
v-for="(paragrapg, ParagraphIndex) in data.paragraph_list"
:key="ParagraphIndex"
>
<el-radio-button :label="paragrapg.name" :value="ParagraphIndex" />
</template>
</el-radio-group>
<template v-if="data.paragraph_list?.length > 0">
<template
v-for="(paragraph, pId) in data.paragraph_list?.[currentParagraph]?.paragraphs"
:key="pId"
>
<ParagraphCard :data="paragraph" :content="paragraph.content" :index="pId">
<template #footer>
<span class="color-secondary">
{{ $t('common.character') }}{{ paragraph.content.length }}</span
>
</template>
</ParagraphCard>
</template>
</template>
</el-radio-group>
<template v-if="data.paragraph_list?.length > 0">
<template
v-for="(paragraph, pId) in data.paragraph_list?.[currentParagraph]?.paragraphs"
:key="pId"
>
<ParagraphCard :data="paragraph" :content="paragraph.content" :index="pId">
<template #footer>
<span class="color-secondary">
{{ $t('common.character') }}{{ paragraph.content.length }}</span
>
</template>
</ParagraphCard>
</template>
</template>
<template v-else> -</template>
</div>
</div>
</template>
<!-- 知识库写入 -->
<template v-if="data.type === WorkflowType.KnowledgeWriteNode">
<div class="card-never border-r-6">
<h5 class="p-8-12">
{{ $t('common.param.inputParam') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
<div v-for="(f, i) in data.result_list" :key="i" class="mb-8">
<span class="color-secondary">{{ f.name }}:</span> {{ f.input_value }}
<template v-else> -</template>
</div>
</div>
</div>
<div class="card-never border-r-6 mt-8">
<h5 class="p-8-12">写入内容</h5>
<div class="p-8-12 border-t-dashed lighter">
<el-radio-group v-model="currentWriteContent" class="app-radio-button-group mb-8">
<template
v-for="(paragrapg, ParagraphIndex) in data.write_content"
:key="ParagraphIndex"
>
<el-radio-button :label="paragrapg.name" :value="ParagraphIndex" />
</template>
</el-radio-group>
<template v-if="data.write_content?.length > 0">
<template
v-for="(paragraph, pId) in data.write_content?.[currentWriteContent]?.paragraphs"
:key="pId"
>
<ParagraphCard :data="paragraph" :content="paragraph.content" :index="pId">
<template #footer>
<span class="color-secondary">
{{ $t('common.character') }}{{ paragraph.content.length }}</span
>
</template>
</ParagraphCard>
</template>
</template>
<template v-else> -</template>
</template>
<!-- 知识库写入 -->
<template v-if="data.type === WorkflowType.KnowledgeWriteNode">
<div class="card-never border-r-6">
<h5 class="p-8-12">
{{ $t('common.param.inputParam') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
<span class="color-secondary">{{$t('chat.executionDetails.subBlockLength')}}:</span>
{{ data.size }}
</div>
</div>
</div>
<div class="card-never border-r-6 mt-8">
<h5 class="p-8-12">{{$t('chat.executionDetails.writeContent')}}</h5>
<div class="p-8-12 border-t-dashed lighter">
<el-radio-group v-model="currentWriteContent" class="app-radio-button-group mb-8">
<template
v-for="(paragrapg, ParagraphIndex) in data.write_content"
:key="ParagraphIndex"
>
<el-radio-button :label="paragrapg.name" :value="ParagraphIndex" />
</template>
</el-radio-group>
<template v-if="data.write_content?.length > 0">
<template
v-for="(paragraph, pId) in data.write_content?.[currentWriteContent]
?.paragraphs"
:key="pId"
>
<ParagraphCard :data="paragraph" :content="paragraph.content" :index="pId">
<template #footer>
<span class="color-secondary">
{{ $t('common.character') }}{{ paragraph.content.length }}</span
>
</template>
</ParagraphCard>
</template>
</template>
<template v-else> -</template>
</div>
</div>
</template>
<slot></slot>
</template>
<template v-else>
<div class="card-never border-r-6">

View File

@ -85,7 +85,7 @@ export default {
localUpload: 'Local Upload',
urlPlaceholder: 'Please enter URL addresses, one per line',
urlTitle: 'URL Address',
urlErrorMessage: 'File type does not meet requirements'
urlErrorMessage: 'File type does not meet requirements',
},
executionDetails: {
title: 'Execution Details',
@ -106,6 +106,10 @@ export default {
noSubmit: 'No submission from user',
errMessage: 'Error Log',
knowedMessage: 'Known Information',
documentSplitTip: 'Each document can preview only the first five segments',
paragraphRules: 'Segmentation Rules',
subBlockLength: 'Sub-block Length',
writeContent: 'Content Written',
},
KnowledgeSource: {
title: 'Knowledge Source',

View File

@ -96,6 +96,7 @@ export default {
next: 'Next',
import: 'Start Import',
preview: 'Apply',
continueImporting: 'Continue Importing Documents',
},
tag: {
label: 'Tag Management',

View File

@ -83,7 +83,7 @@ export default {
localUpload: '本地上传',
urlPlaceholder: '请输入 URL 地址,每行一个地址',
urlTitle: 'URL 地址',
urlErrorMessage: '文件类型不符合要求'
urlErrorMessage: '文件类型不符合要求',
},
executionDetails: {
title: '执行详情',
@ -104,6 +104,10 @@ export default {
noSubmit: '用户未提交',
errMessage: '错误日志',
knowedMessage: '已知信息',
documentSplitTip: '每个文档仅能预览前五个分段',
paragraphRules: '分段规则',
subBlockLength: '子分块长度',
writeContent: '写入内容',
},
KnowledgeSource: {
title: '知识来源',

View File

@ -92,6 +92,7 @@ export default {
next: '下一步',
import: '开始导入',
preview: '生成预览',
continueImporting: '继续导入文档',
},
tag: {
label: '标签管理',

View File

@ -83,7 +83,7 @@ export default {
localUpload: '本地上傳',
urlPlaceholder: '請輸入 URL 地址,每行一個地址',
urlTitle: 'URL 地址',
urlErrorMessage: '文件类型不符合要求'
urlErrorMessage: '文件类型不符合要求',
},
executionDetails: {
title: '執行詳細',
@ -104,6 +104,10 @@ export default {
noSubmit: '用戶未提交',
errMessage: '錯誤日誌',
knowedMessage: '已知資訊',
documentSplitTip: '每個文件僅能預覽前五個段落',
paragraphRules: '分段規則',
subBlockLength: '子分塊長度',
writeContent: '寫入內容',
},
KnowledgeSource: {
title: '知識來源',

View File

@ -94,6 +94,7 @@ export default {
next: '下一步',
import: '開始導入',
preview: '生成預覽',
continueImporting: '繼續導入文檔',
},
tag: {
label: '標籤管理',

View File

@ -21,6 +21,9 @@
</div>
<template #footer>
<el-button :loading="loading" @click="close">{{ $t('common.cancel') }}</el-button>
<!-- <el-button v-if="active == 'result'" @click="continueImporting" :loading="loading">
{{ $t('views.document.buttons.continueImporting') }}
</el-button> -->
<el-button
v-if="base_form_list.length > 0 && active == 'knowledge_base'"
:loading="loading"
@ -43,6 +46,16 @@
>
{{ $t('views.document.buttons.import') }}
</el-button>
<!-- <el-button
v-if="active == 'result'"
type="primary"
@click="
router.push({
path: `/knowledge/${id}/${folderId}/4/document`,
})
"
>{{ $t('views.knowledge.ResultSuccess.buttons.toDocument') }}</el-button
> -->
</template>
</el-drawer>
</template>
@ -54,13 +67,14 @@ import applicationApi from '@/api/application/application'
import KnowledgeBase from '@/views/knowledge-workflow/component/action/KnowledgeBase.vue'
import { WorkflowType } from '@/enums/application'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api.ts'
import { useRoute } from 'vue-router'
import { useRoute, useRouter } from 'vue-router'
provide('upload', (file: any, loading?: Ref<boolean>) => {
return applicationApi.postUploadFile(file, id, 'KNOWLEDGE', loading)
})
const router = useRouter()
const route = useRoute()
const {
params: { id },
params: { id, folderId },
/*
id knowledge_id
*/
@ -125,6 +139,10 @@ const upload = () => {
})
})
}
const continueImporting = () => {
action_id.value = undefined
active.value = 'data_source'
}
defineExpose({ close, open })
</script>
<style lang="scss" scoped></style>

View File

@ -48,12 +48,10 @@
</el-button>
<template #dropdown>
<el-dropdown-menu>
<a :href="shareUrl" target="_blank">
<el-dropdown-item>
<AppIcon iconName="app-create-chat" class="color-secondary"></AppIcon>
{{ $t('views.workflow.operation.toImportDoc') }}
</el-dropdown-item>
</a>
<el-dropdown-item @click="toImportDoc">
<AppIcon iconName="app-create-chat" class="color-secondary"></AppIcon>
{{ $t('views.workflow.operation.toImportDoc') }}
</el-dropdown-item>
<el-dropdown-item @click="openHistory">
<AppIcon iconName="app-history-outlined" class="color-secondary"></AppIcon>
@ -466,37 +464,47 @@ function saveknowledge(bool?: boolean, back?: boolean) {
const go = () => {
if (route.path.includes('resource-management')) {
return router.push({ path: get_resource_management_route() })
} else if (route.path.includes('shared')) {
} else if (route.path.includes('shared')) {
return router.push({ path: get_shared_route() })
} else {
return router.push({ path: get_route() })
}
}
const get_shared_route = () => {
const get_shared_route = () => {
if (hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_READ], 'OR')) {
return `knowledge/${id}/shared/4/document`
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_PROBLEM_READ], 'OR')) {
} else if (
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_PROBLEM_READ], 'OR')
) {
return `/knowledge/${id}/shared/4/problem`
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_HIT_TEST_READ], 'OR')) {
} else if (
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_HIT_TEST_READ], 'OR')
) {
return `/knowledge/${id}/shared/4/hit-test`
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_CHAT_USER_READ], 'OR')) {
} else if (
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_CHAT_USER_READ], 'OR')
) {
return `/knowledge/${id}/shared/4/chat-user`
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_EDIT], 'OR')) {
return `/knowledge/${id}/shared/4/setting`
} else {
return `/system/shared/knowledge`
return `/system/shared/knowledge`
}
}
const get_resource_management_route = () => {
if (hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_DOCUMENT_READ],'OR')) {
if (hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_DOCUMENT_READ], 'OR')) {
return `/knowledge/${id}/resource-management/4/document`
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_PROBLEM_READ], 'OR')) {
} else if (
hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_PROBLEM_READ], 'OR')
) {
return `/knowledge/${id}/resource-management/4/problem`
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_HIT_TEST], 'OR')) {
return `/knowledge/${id}/resource-management/4/hit-test`
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_CHAT_USER_READ], 'OR')) {
} else if (
hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_CHAT_USER_READ], 'OR')
) {
return `/knowledge/${id}/resource-management/4/chat-user`
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_EDIT], 'OR')) {
return `/knowledge/${id}/resource-management/4/setting`
@ -507,20 +515,22 @@ const get_resource_management_route = () => {
const get_route = () => {
const checkPermission = (permissionConst: Permission) => {
return hasPermission([
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(id)],
[],
'AND'
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
permissionConst.getWorkspacePermissionWorkspaceManageRole,
permissionConst.getKnowledgeWorkspaceResourcePermission(id),
],'OR'
return hasPermission(
[
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
permissionConst.getWorkspacePermissionWorkspaceManageRole,
permissionConst.getKnowledgeWorkspaceResourcePermission(id),
],
'OR',
)
}
if (checkPermission(PermissionConst.KNOWLEDGE_DOCUMENT_READ)) {
if (checkPermission(PermissionConst.KNOWLEDGE_DOCUMENT_READ)) {
return `/knowledge/${id}/${folderId}/4/document`
} else if (checkPermission(PermissionConst.KNOWLEDGE_PROBLEM_READ)) {
return `/knowledge/${id}/${folderId}/4/problem`
@ -535,6 +545,15 @@ const get_route = () => {
}
}
const toImportDoc = () => {
router.push({
path: `/knowledge/import/workflow/${folderId}`,
query: {
id: id,
},
})
}
/**
* 定时保存
*/

View File

@ -29,11 +29,12 @@
'请选择文件格式',
)
"
style="width: 240px"
class="w-240"
clearable
multiple
filterable
allow-create
filterable
default-first-option
>
<template #label="{ label, value }">
<span>{{ label }} </span>
@ -60,7 +61,16 @@
trigger: 'change',
}"
>
<el-slider v-model="form_data.file_count_limit" show-input />
<el-input-number
v-model="form_data.file_count_limit"
:min="1"
:max="1000"
:value-on-clear="0"
controls-position="right"
class="w-full"
:step="1"
:step-strictly="true"
/>
</el-form-item>
<el-form-item
:label="
@ -79,7 +89,16 @@
trigger: 'change',
}"
>
<el-slider v-model="form_data.file_size_limit" show-input />
<el-input-number
v-model="form_data.file_size_limit"
:min="1"
:max="1000"
:value-on-clear="0"
controls-position="right"
class="w-full"
:step="1"
:step-strictly="true"
/>
</el-form-item>
</el-form>
</el-card>