Skip to content

Commit c5e95b6

Browse files
committed
feat: Base node knowledge option
1 parent d186bac commit c5e95b6

File tree

9 files changed

+243
-11
lines changed

9 files changed

+243
-11
lines changed

ui/src/components/dynamics-form/constructor/data.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,5 +59,9 @@ const input_type_list = [
5959
label: t('dynamicsForm.input_type_list.Model'),
6060
value: 'Model',
6161
},
62+
{
63+
label: t('dynamicsForm.input_type_list.Knowledge'),
64+
value: 'Knowledge',
65+
},
6266
]
6367
export { input_type_list }
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
<template>
2+
<el-form-item
3+
:label="$t('dynamicsForm.Knowledge.label', '可选知识库')"
4+
prop="knowledge_list"
5+
:rules="[{ message: '请至少选择一个可选知识库', type: 'array', min: 1 }]"
6+
>
7+
<template #label>
8+
<div
9+
class="flex-between mb-12 cursor"
10+
@click="collapseData.optional_knowledge = !collapseData.optional_knowledge"
11+
>
12+
<div class="flex align-center">
13+
<el-icon
14+
class="mr-8 arrow-icon"
15+
:class="collapseData.optional_knowledge ? 'rotate-90' : ''"
16+
>
17+
<CaretRight />
18+
</el-icon>
19+
<span class="lighter">可选知识库</span>
20+
<span class="ml-4" v-if="formValue.knowledge_list?.length"
21+
>({{ formValue.knowledge_list.length }})</span
22+
>
23+
</div>
24+
<div>
25+
<el-button type="primary" link @click.stop="openAddKnowledgeDialog">
26+
<AppIcon iconName="app-add-outlined"></AppIcon>
27+
</el-button>
28+
</div>
29+
</div>
30+
</template>
31+
<div class="w-full" v-if="collapseData.optional_knowledge">
32+
<el-text type="info" v-if="formValue.knowledge_list?.length === 0">
33+
请选择关联的知识库
34+
</el-text>
35+
<div v-else>
36+
<template v-for="(item, index) in formValue.knowledge_list" :key="item.id">
37+
<div class="flex-between border border-r-6 white-bg mb-4" style="padding: 5px 8px">
38+
<div class="flex align-center" style="width: 80%">
39+
<KnowledgeIcon :type="item.type" class="mr-8" :size="20" />
40+
41+
<span class="ellipsis cursor" :title="item.name"> {{ item.name }}</span>
42+
</div>
43+
<el-button text @click="removeKnowledge(item.id)">
44+
<el-icon><Close /></el-icon>
45+
</el-button>
46+
</div>
47+
</template>
48+
</div>
49+
</div>
50+
</el-form-item>
51+
<el-form-item
52+
:label="$t('dynamicsForm.Knowledge.defaultLabel', '默认知识库')"
53+
prop="default_value"
54+
required
55+
:rules="[{ message: '请选择默认知识库', type: 'array', min: 1 }]"
56+
>
57+
<div class="w-full" v-if="formValue.knowledge_list?.length > 0">
58+
<Knowledge
59+
v-model="formValue.default_value"
60+
:form-field="{ attrs: { knowledge_list: formValue.knowledge_list } } as any"
61+
/>
62+
</div>
63+
</el-form-item>
64+
<AddKnowledgeDialog
65+
ref="AddKnowledgeDialogRef"
66+
@addData="addKnowledge"
67+
:data="formValue.knowledge_list"
68+
:loading="knowledgeLoading"
69+
/>
70+
</template>
71+
<script setup lang="ts">
72+
import { computed, reactive, ref } from 'vue'
73+
import AddKnowledgeDialog from '@/views/application/component/AddKnowledgeDialog.vue'
74+
import Knowledge from '../../items/Knowledge/Knowledge.vue'
75+
76+
const props = defineProps<{
77+
modelValue: any
78+
}>()
79+
80+
const emit = defineEmits(['update:modelValue'])
81+
82+
const collapseData = reactive({
83+
optional_knowledge: true,
84+
})
85+
const knowledgeLoading = ref(false)
86+
87+
const formValue = computed({
88+
set: (item: any) => {
89+
emit('update:modelValue', item)
90+
},
91+
get: () => {
92+
return props.modelValue || { knowledge_list: [], default_value: [] }
93+
},
94+
})
95+
96+
const getData = () => {
97+
const knowledgeItemList = (formValue.value.knowledge_list || []).map((k: any) => {
98+
return {
99+
id: k.id,
100+
name: k.name,
101+
type: k.type,
102+
}
103+
})
104+
105+
return {
106+
input_type: 'Knowledge',
107+
default_value: formValue.value.default_value || [],
108+
attrs: {
109+
knowledge_list: knowledgeItemList,
110+
},
111+
}
112+
}
113+
114+
const rander = (form_data: any) => {
115+
formValue.value.default_value = form_data.default_value || []
116+
formValue.value.knowledge_list = form_data.attrs?.knowledge_list || []
117+
}
118+
119+
defineExpose({ getData, rander })
120+
121+
const AddKnowledgeDialogRef = ref<InstanceType<typeof AddKnowledgeDialog>>()
122+
123+
function openAddKnowledgeDialog() {
124+
const ids = formValue.value.knowledge_list?.map((k: any) => k.id) || []
125+
AddKnowledgeDialogRef.value?.open(ids)
126+
}
127+
128+
function addKnowledge(data: any[]) {
129+
formValue.value.knowledge_list = data
130+
if (formValue.value.default_value) {
131+
const currentIds = data.map((k: any) => k.id)
132+
formValue.value.default_value = formValue.value.default_value.filter((id: string) =>
133+
currentIds.includes(id),
134+
)
135+
}
136+
}
137+
138+
function removeKnowledge(id: string) {
139+
formValue.value.knowledge_list = formValue.value.knowledge_list.filter((k: any) => k.id !== id)
140+
if (formValue.value.default_value) {
141+
formValue.value.default_value = formValue.value.default_value.filter(
142+
(k_id: string) => k_id !== id,
143+
)
144+
}
145+
}
146+
</script>
147+
<style lang="scss" scoped></style>

ui/src/components/dynamics-form/index.vue

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,6 @@ const render = (
215215
| (() => Promise<Result<Array<FormField>>>),
216216
data?: Dict<any>,
217217
) => {
218-
console.log(data, '-----')
219218
formFieldList.value = []
220219
nextTick(() => {
221220
if (typeof render_data == 'string') {
@@ -247,7 +246,6 @@ const render = (
247246
}
248247
const getFormDefaultValue = (fieldList: Array<any>, form_data?: any) => {
249248
form_data = form_data ? form_data : {}
250-
console.log(form_data)
251249
const value = fieldList
252250
.map((item) => {
253251
if (form_data[item.field] !== undefined) {
@@ -276,7 +274,6 @@ const getFormDefaultValue = (fieldList: Array<any>, form_data?: any) => {
276274
return {}
277275
})
278276
.reduce((x, y) => ({ ...x, ...y }), {})
279-
console.log(value)
280277
return value
281278
}
282279
/**
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
<template>
2+
<div class="w-full">
3+
<el-select
4+
v-model="selectedIds"
5+
multiple
6+
class="w-full"
7+
:placeholder="$t('dynamicsForm.Knowledge.placeholder', '请选择知识库')"
8+
>
9+
<el-option v-for="item in availableList" :key="item.id" :label="item.name" :value="item.id">
10+
<div class="flex align-center">
11+
<KnowledgeIcon :type="item.type" class="mr-8" :size="20" />
12+
<span>{{ item.name }}</span>
13+
</div>
14+
</el-option>
15+
<template #tag>
16+
<el-tag
17+
v-for="item in selectedItems"
18+
:key="item.id"
19+
closable
20+
type="info"
21+
@close="removeItem(item.id)"
22+
style="margin-right: 4px"
23+
>
24+
<div class="flex align-center">
25+
<KnowledgeIcon :type="item.type" class="mr-4" :size="16" />
26+
<span>{{ item.name }}</span>
27+
</div>
28+
</el-tag>
29+
</template>
30+
</el-select>
31+
</div>
32+
</template>
33+
34+
<script setup lang="ts">
35+
import { computed } from 'vue'
36+
import type { FormField } from '../../type'
37+
38+
const props = withDefaults(
39+
defineProps<{
40+
modelValue?: string[]
41+
formField: FormField
42+
}>(),
43+
{ modelValue: () => [] },
44+
)
45+
46+
const emit = defineEmits(['update:modelValue', 'change'])
47+
48+
const model_value = computed({
49+
get: () => props.modelValue || [],
50+
set: (value: string[]) => {
51+
emit('update:modelValue', value)
52+
emit('change', props.formField)
53+
},
54+
})
55+
56+
const availableList = computed(() => {
57+
return (props.formField.attrs?.knowledge_list as any[]) || []
58+
})
59+
60+
const selectedItems = computed(() => {
61+
return availableList.value.filter((k: any) => selectedIds.value.includes(k.id))
62+
})
63+
64+
const selectedIds = computed({
65+
get: () => model_value.value || [],
66+
set: (ids: string[]) => {
67+
model_value.value = ids
68+
},
69+
})
70+
71+
function removeItem(id: string) {
72+
model_value.value = model_value.value.filter((item_id: string) => item_id !== id)
73+
}
74+
</script>
75+
<style lang="scss" scoped></style>

ui/src/locales/lang/en-US/dynamics-form.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export default {
1414
TextareaInput: 'Multiline Input',
1515
MultiRow: 'Multi Row',
1616
Model: 'Model',
17+
Knowledge: 'Knowledge',
1718
},
1819
default: {
1920
label: 'Default',

ui/src/locales/lang/zh-CN/dynamics-form.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export default {
1414
TextareaInput: '多行文本框',
1515
MultiRow: '单行多选卡',
1616
Model: '模型',
17+
Knowledge: '知识库',
1718
},
1819
default: {
1920
label: '默认值',

ui/src/locales/lang/zh-Hant/dynamics-form.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export default {
1414
TextareaInput: '多行文字框',
1515
MultiRow: '單行多選卡',
1616
Model: '模型',
17+
Knowledge: '知識庫',
1718
},
1819
default: {
1920
label: '預設值',

ui/src/views/application/ApplicationSetting.vue

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,10 @@
502502

503503
<!-- 技能 -->
504504
<div v-if="toolPermissionPrecise.read()">
505-
<div class="flex-between mb-8" @click="collapseData.skill = !collapseData.skill">
505+
<div
506+
class="flex-between mb-8"
507+
@click="collapseData.skill = !collapseData.skill"
508+
>
506509
<div class="flex align-center lighter cursor">
507510
<el-icon
508511
class="mr-8 arrow-icon"
@@ -535,7 +538,10 @@
535538
collapseData.skill
536539
"
537540
>
538-
<template v-for="(item, index) in applicationForm.skill_tool_ids" :key="index">
541+
<template
542+
v-for="(item, index) in applicationForm.skill_tool_ids"
543+
:key="index"
544+
>
539545
<div
540546
v-if="relatedObject(skillToolSelectOptions, item, 'id')"
541547
class="flex-between border border-r-6 white-bg mb-4"
@@ -550,7 +556,9 @@
550556
class="mr-8"
551557
>
552558
<img
553-
:src="resetUrl(relatedObject(skillToolSelectOptions, item, 'id')?.icon)"
559+
:src="
560+
resetUrl(relatedObject(skillToolSelectOptions, item, 'id')?.icon)
561+
"
554562
alt=""
555563
/>
556564
</el-avatar>
@@ -809,8 +817,6 @@
809817
</el-button>
810818
</div>
811819
</el-form-item>
812-
813-
814820
</el-form>
815821
</el-scrollbar>
816822
</div>
@@ -846,8 +852,8 @@
846852
@refresh="submitReasoningDialog"
847853
/>
848854
<McpServersDialog ref="mcpServersDialogRef" @refresh="submitMcpServersDialog" />
849-
<ToolDialog ref="toolDialogRef" @refresh="submitToolDialog" tool_type="CUSTOM"/>
850-
<ToolDialog ref="skillToolDialogRef" @refresh="submitSkillToolDialog" tool_type="SKILL"/>
855+
<ToolDialog ref="toolDialogRef" @refresh="submitToolDialog" tool_type="CUSTOM" />
856+
<ToolDialog ref="skillToolDialogRef" @refresh="submitSkillToolDialog" tool_type="SKILL" />
851857
<ApplicationDialog ref="applicationDialogRef" @refresh="submitApplicationDialog" />
852858
</div>
853859
</template>
@@ -988,7 +994,6 @@ const knowledgeList = ref<Array<any>>([])
988994
const sttModelOptions = ref<any>(null)
989995
const ttsModelOptions = ref<any>(null)
990996
991-
992997
function submitPrologueDialog(val: string) {
993998
applicationForm.value.prologue = val
994999
}

ui/src/workflow/nodes/base-node/component/UserFieldFormDialog.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ const inputTypeList = ref([
134134
{ label: t('dynamicsForm.input_type_list.TextareaInput'), value: 'TextareaInputConstructor' },
135135
{ label: t('dynamicsForm.input_type_list.MultiRow'), value: 'MultiRowConstructor' },
136136
{ label: t('dynamicsForm.input_type_list.Model'), value: 'ModelConstructor' },
137+
{ label: t('dynamicsForm.input_type_list.Knowledge'), value: 'KnowledgeConstructor' },
137138
])
138139
139140
const dialogVisible = ref<boolean>(false)

0 commit comments

Comments
 (0)