Skip to content

Commit 8d7734b

Browse files
committed
feat: knowledge workflow
1 parent b82e12a commit 8d7734b

File tree

11 files changed

+125
-16
lines changed

11 files changed

+125
-16
lines changed

apps/application/flow/step_node/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from .ai_chat_step_node import *
1010
from .application_node import BaseApplicationNode
1111
from .condition_node import *
12+
from .data_source_local_node.impl.base_data_source_local_node import BaseDataSourceLocalNode
1213
from .direct_reply_node import *
1314
from .document_extract_node import *
1415
from .form_node import *
@@ -46,7 +47,8 @@
4647
BaseVideoUnderstandNode,
4748
BaseIntentNode, BaseLoopNode, BaseLoopStartStepNode,
4849
BaseLoopContinueNode,
49-
BaseLoopBreakNode, BaseVariableSplittingNode, BaseParameterExtractionNode, BaseVariableAggregationNode]
50+
BaseLoopBreakNode, BaseVariableSplittingNode, BaseParameterExtractionNode, BaseVariableAggregationNode,
51+
BaseDataSourceLocalNode]
5052

5153

5254
def get_node(node_type):

apps/application/flow/step_node/data_source_local_node/i_data_source_local_node.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,17 @@
1616

1717

1818
class DataSourceLocalNodeParamsSerializer(serializers.Serializer):
19-
file_format = serializers.ListField(child=serializers.CharField)
19+
file_format = serializers.ListField(child=serializers.CharField(label=('')), label='')
2020
max_file_number = serializers.IntegerField(required=True, label=_("Number of uploaded files"))
2121
file_max_size = serializers.IntegerField(required=True, label=_("Upload file size"))
2222

2323

2424
class IDataSourceLocalNode(INode):
2525
type = 'data-source-local-node'
2626

27+
@staticmethod
2728
@abstractmethod
28-
def get_form_class(self):
29+
def get_form_class():
2930
pass
3031

3132
def get_node_params_serializer_class(self) -> Type[serializers.Serializer]:

apps/application/flow/step_node/data_source_local_node/impl/base_data_source_local_node.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ class BaseDataSourceLocalNode(IDataSourceLocalNode):
2020
def save_context(self, details, workflow_manage):
2121
pass
2222

23-
def get_form_class(self):
23+
@staticmethod
24+
def get_form_class():
2425
return BaseDataSourceLocalNodeForm()
2526

2627
def execute(self, file_format, max_file_number, file_max_size, **kwargs) -> NodeResult:

apps/knowledge/serializers/knowledge_workflow.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def get_form_list(self):
3232
self.is_valid(raise_exception=True)
3333
if self.data.get('type') == 'local':
3434
node = get_node(self.data.get('id'))
35-
return node.get_form_class()().to_form_list()
35+
return node.get_form_class().to_form_list()
3636
elif self.data.get('type') == 'tool':
3737
tool = QuerySet(Tool).filter(id=self.data.get("id")).first()
3838
# todo 调用工具数据源的函数获取表单列表

apps/knowledge/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,5 +69,6 @@
6969
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/problem/<int:current_page>/<int:page_size>', views.ProblemView.Page.as_view()),
7070
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/document/<int:current_page>/<int:page_size>', views.DocumentView.Page.as_view()),
7171
path('workspace/<str:workspace_id>/knowledge/<int:current_page>/<int:page_size>', views.KnowledgeView.Page.as_view()),
72+
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/form_list/<str:type>/<str:id>', views.KnowledgeWorkflowFormView.as_view()),
7273

7374
]

apps/knowledge/views/knowledge_workflow.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
class KnowledgeWorkflowFormView(APIView):
1919
authentication_classes = [TokenAuth]
2020

21-
def get(self):
22-
return result.success(KnowledgeWorkflowSerializer.Form().get_form_list())
21+
def get(self, request: Request, workspace_id: str, knowledge_id: str, type: str, id: str):
22+
return result.success(KnowledgeWorkflowSerializer.Form(data={'type': type, 'id': id}).get_form_list())
2323

2424

2525
class KnowledgeWorkflowView(APIView):

ui/src/api/knowledge/knowledge.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,14 @@ const delMulTag: (
315315
) => Promise<Result<any>> = (knowledge_id, tags, loading) => {
316316
return put(`${prefix.value}/${knowledge_id}/tags/batch_delete`, tags, null, loading)
317317
}
318+
const getKnowledgeWorkflowFormList: (
319+
knowledge_id: string,
320+
type: 'loacl' | 'tool',
321+
id: string,
322+
loading?: Ref<boolean>,
323+
) => Promise<Result<any>> = (knowledge_id: string, type: 'loacl' | 'tool', id: string, loading) => {
324+
return get(`${prefix.value}/${knowledge_id}/form_list/${type}/${id}`, null, loading)
325+
}
318326

319327
export default {
320328
getKnowledgeList,
@@ -340,4 +348,5 @@ export default {
340348
delTag,
341349
delMulTag,
342350
createWorkflowKnowledge,
351+
getKnowledgeWorkflowFormList,
343352
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<template>
2+
<el-drawer
3+
v-model="drawer"
4+
title="I am the title"
5+
direction="rtl"
6+
destroy-on-close
7+
:before-close="close"
8+
>
9+
<div style="width: 100%">
10+
<ActionVue :workflow="_workflow"></ActionVue>
11+
</div>
12+
</el-drawer>
13+
</template>
14+
<script setup lang="ts">
15+
import ActionVue from '@/views/knowledge-workflow/component/action/index.vue'
16+
import { ref } from 'vue'
17+
const drawer = ref<boolean>(false)
18+
const _workflow = ref<any>(null)
19+
const close = () => {
20+
drawer.value = false
21+
}
22+
const open = (workflow: any) => {
23+
console.log('ok')
24+
drawer.value = true
25+
_workflow.value = workflow
26+
}
27+
defineExpose({ close, open })
28+
</script>
29+
<style lang="scss" scoped></style>
Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,78 @@
11
<template>
2-
<div></div>
2+
<DynamicsForm
3+
v-loading="loading"
4+
v-model="form_data"
5+
:render_data="model_form_field"
6+
:model="form_data"
7+
ref="dynamicsFormRef"
8+
label-position="top"
9+
require-asterisk-position="right"
10+
>
11+
<template #default>
12+
<el-form-item prop="model_name" :rules="base_form_data_rule.model_name">
13+
<el-radio-group @change="sourceChange" v-model="base_form_data.data_source">
14+
<el-radio :value="node.id" size="large" v-for="node in source_node_list">{{
15+
node.properties.stepName
16+
}}</el-radio>
17+
</el-radio-group>
18+
</el-form-item>
19+
</template>
20+
</DynamicsForm>
321
</template>
422
<script setup lang="ts">
5-
import { computed } from 'vue'
23+
import { computed, ref } from 'vue'
24+
import { WorkflowKind, WorkflowMode, WorkflowType } from '@/enums/application'
25+
import DynamicsForm from '@/components/dynamics-form/index.vue'
26+
import type { FormField } from '@/components/dynamics-form/type'
27+
import type { Dict } from '@/api/type/common'
28+
import type { FormRules } from 'element-plus'
29+
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
30+
import { useRoute } from 'vue-router'
31+
const route = useRoute()
32+
const apiType = computed(() => {
33+
if (route.path.includes('resource-management')) {
34+
return 'systemManage'
35+
} else {
36+
return 'workspace'
37+
}
38+
})
39+
const model_form_field = ref<Array<FormField>>([])
640
const props = defineProps<{
741
workflow: any
842
}>()
9-
const source_node_list = computed(() => {})
43+
const loading = ref<boolean>(false)
44+
const dynamicsFormRef = ref<InstanceType<typeof DynamicsForm>>()
45+
const base_form_data = ref<{ data_source: string }>({ data_source: '' })
46+
const dynamics_form_data = ref<Dict<any>>({})
47+
const form_data = computed({
48+
get: () => {
49+
return { ...dynamics_form_data.value, ...base_form_data.value }
50+
},
51+
set: (event: any) => {
52+
dynamics_form_data.value = event
53+
},
54+
})
55+
const source_node_list = computed(() => {
56+
return props.workflow?.nodes?.filter((n: any) => n.properties.kind === WorkflowKind.DataSource)
57+
})
58+
const {
59+
params: { id, from },
60+
} = route as any
61+
const sourceChange = (node_id: string) => {
62+
const n = source_node_list.value.find((n: any) => n.id == node_id)
63+
node_id = n ? ([WorkflowType.DataSourceLocalNode].includes(n.type) ? n.type : node_id) : node_id
64+
loadSharedApi({ type: 'knowledge', systemType: apiType.value })
65+
.getKnowledgeWorkflowFormList(id, 'local', node_id)
66+
.then((ok) => {
67+
dynamicsFormRef.value?.render(ok.data)
68+
})
69+
}
70+
const base_form_data_rule = ref<FormRules>({
71+
data_source: {
72+
required: true,
73+
trigger: 'blur',
74+
message: '数据源必选',
75+
},
76+
})
1077
</script>
1178
<style lang="scss" scoped></style>

ui/src/views/knowledge-workflow/index.vue

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,9 @@
125125
</div>
126126
</div>
127127
</div>
128-
<div class="scrollbar-height">
129-
<AiChat :knowledge-details="detail" :type="'debug-ai-chat'"></AiChat>
130-
</div>
131128
</div>
132129
</el-collapse-transition>
130+
<DebugVue ref="DebugRef"></DebugVue>
133131
<!-- 发布历史 -->
134132
<PublishHistory
135133
v-if="showHistory"
@@ -153,6 +151,7 @@ import { mapToUrlParams } from '@/utils/application'
153151
import useStore from '@/stores'
154152
import { WorkFlowInstance } from '@/workflow/common/validate'
155153
import { hasPermission } from '@/utils/permission'
154+
import DebugVue from './component/Debug.vue'
156155
import { t } from '@/locales'
157156
import { ComplexPermission } from '@/utils/permission/type'
158157
import { EditionConst, PermissionConst, RoleConst } from '@/utils/permission/data'
@@ -184,6 +183,7 @@ const permissionPrecise = computed(() => {
184183
const isDefaultTheme = computed(() => {
185184
return theme.isDefaultTheme()
186185
})
186+
const DebugRef = ref<InstanceType<typeof DebugVue>>()
187187
188188
let interval: any
189189
const workflowRef = ref()
@@ -393,8 +393,8 @@ const clickShowDebug = () => {
393393
...workflow.get_base_node()?.properties.node_data,
394394
work_flow: getGraphData(),
395395
}
396-
397-
showDebug.value = true
396+
console.log('sss', DebugRef.value)
397+
DebugRef.value?.open(graphData)
398398
} catch (e: any) {
399399
console.log(e)
400400
MsgError(e.toString())

0 commit comments

Comments
 (0)