Skip to content

Commit b90a1c9

Browse files
committed
feat: Tool workflow node
1 parent 9066296 commit b90a1c9

File tree

13 files changed

+338
-18
lines changed

13 files changed

+338
-18
lines changed

apps/tools/serializers/tool.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,7 @@ class Query(serializers.Serializer):
10661066
user_id = serializers.UUIDField(required=False, allow_null=True, label=_('user id'))
10671067
scope = serializers.CharField(required=True, label=_('scope'))
10681068
tool_type = serializers.CharField(required=False, label=_('tool type'), allow_null=True, allow_blank=True)
1069+
tool_type_list = serializers.ListField(child=serializers.CharField(),required=False, label=_('tool type list'), allow_null=True, allow_empty=True)
10691070
create_user = serializers.UUIDField(required=False, label=_('create user'), allow_null=True)
10701071

10711072
def page_tool(self, current_page: int, page_size: int):
@@ -1127,7 +1128,11 @@ def get_query_set(self, workspace_manage, is_x_pack_ee):
11271128

11281129
if scope is not None:
11291130
tool_query_set = tool_query_set.filter(scope=scope)
1130-
if tool_type:
1131+
1132+
tool_type_list = self.data.get('tool_type_list')
1133+
if tool_type_list:
1134+
tool_query_set = tool_query_set.filter(tool_type__in=tool_type_list)
1135+
elif tool_type:
11311136
tool_query_set = tool_query_set.filter(tool_type=tool_type)
11321137

11331138
query_set_dict = {

apps/tools/views/tool.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ def get(self, request: Request, workspace_id: str):
7474
'name': request.query_params.get('name'),
7575
'scope': request.query_params.get('scope', ToolScope.WORKSPACE),
7676
'tool_type': request.query_params.get('tool_type'),
77+
'tool_type_list': request.query_params.getlist('tool_type_list[]'),
7778
'user_id': request.user.id,
7879
'create_user': request.query_params.get('create_user'),
7980
}
Lines changed: 15 additions & 0 deletions
Loading

ui/src/components/workflow-dropdown-menu/application/index.vue

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,22 @@
8989
<el-scrollbar height="450">
9090
<NodeContent
9191
:list="toolList"
92-
@clickNodes="(val: any) => clickNodes(toolLibNode, val, 'tool')"
93-
@onmousedown="(val: any) => onmousedown(toolLibNode, val, 'tool')"
92+
@clickNodes="
93+
(val: any) =>
94+
clickNodes(
95+
val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode,
96+
val,
97+
'tool',
98+
)
99+
"
100+
@onmousedown="
101+
(val: any) =>
102+
onmousedown(
103+
val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode,
104+
val,
105+
'tool',
106+
)
107+
"
94108
/>
95109
</el-scrollbar>
96110
</LayoutContainer>
@@ -122,7 +136,12 @@
122136
</template>
123137
<script setup lang="ts">
124138
import { ref, onMounted, computed, inject } from 'vue'
125-
import { getMenuNodes, toolLibNode, applicationNode } from '@/workflow/common/data'
139+
import {
140+
getMenuNodes,
141+
toolLibNode,
142+
applicationNode,
143+
toolWorkflowLibNode,
144+
} from '@/workflow/common/data'
126145
import { iconComponent } from '@/workflow/icons/utils'
127146
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
128147
import { isWorkFlow } from '@/utils/application'
@@ -260,13 +279,15 @@ async function getToolFolder() {
260279
}
261280
262281
async function getToolList() {
282+
const baseType = activeName.value == 'DATA_SOURCE_TOOL' ? 'DATA_SOURCE' : 'CUSTOM'
283+
263284
const res = await loadSharedApi({
264285
type: 'tool',
265286
isShared: folder.currentFolder?.id === 'share',
266287
systemType: apiType.value,
267288
}).getToolList({
268289
folder_id: folder.currentFolder?.id || user.getWorkspaceId(),
269-
tool_type: 'CUSTOM',
290+
tool_type_list: [baseType, 'WORKFLOW'],
270291
})
271292
toolList.value = res.data?.tools || res.data || []
272293
toolList.value = toolList.value?.filter((item: any) => item.is_active)

ui/src/components/workflow-dropdown-menu/knowledge-inner/index.vue

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,14 @@
8989
<el-scrollbar height="450">
9090
<NodeContent
9191
:list="toolList"
92-
@clickNodes="(val: any) => clickNodes(toolLibNode, val)"
93-
@onmousedown="(val: any) => onmousedown(toolLibNode, val)"
92+
@clickNodes="
93+
(val: any) =>
94+
clickNodes(val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode, val)
95+
"
96+
@onmousedown="
97+
(val: any) =>
98+
onmousedown(val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode, val)
99+
"
94100
/>
95101
</el-scrollbar>
96102
</LayoutContainer>
@@ -100,7 +106,7 @@
100106
</template>
101107
<script setup lang="ts">
102108
import { ref, onMounted, computed, inject } from 'vue'
103-
import { getMenuNodes, toolLibNode, applicationNode } from '@/workflow/common/data'
109+
import { getMenuNodes, toolLibNode, toolWorkflowLibNode } from '@/workflow/common/data'
104110
import { iconComponent } from '@/workflow/icons/utils'
105111
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
106112
import useStore from '@/stores'
@@ -221,13 +227,15 @@ async function getToolFolder() {
221227
}
222228
223229
async function getToolList() {
230+
const baseType = activeName.value == 'DATA_SOURCE_TOOL' ? 'DATA_SOURCE' : 'CUSTOM'
231+
224232
const res = await loadSharedApi({
225233
type: 'tool',
226234
isShared: folder.currentFolder?.id === 'share',
227235
systemType: apiType.value,
228236
}).getToolList({
229237
folder_id: folder.currentFolder?.id || user.getWorkspaceId(),
230-
tool_type: activeName.value == 'DATA_SOURCE_TOOL' ? 'DATA_SOURCE' : 'CUSTOM',
238+
tool_type_list: [baseType, 'WORKFLOW'],
231239
})
232240
toolList.value = res.data?.tools || res.data || []
233241
toolList.value = toolList.value?.filter((item: any) => item.is_active)

ui/src/components/workflow-dropdown-menu/knowledge/index.vue

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,14 @@
113113
<el-scrollbar height="450">
114114
<NodeContent
115115
:list="toolList"
116-
@clickNodes="(val: any) => clickNodes(toolLibNode, val)"
117-
@onmousedown="(val: any) => onmousedown(toolLibNode, val)"
116+
@clickNodes="
117+
(val: any) =>
118+
clickNodes(val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode, val)
119+
"
120+
@onmousedown="
121+
(val: any) =>
122+
onmousedown(val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode, val)
123+
"
118124
/>
119125
</el-scrollbar>
120126
</LayoutContainer>
@@ -124,7 +130,7 @@
124130
</template>
125131
<script setup lang="ts">
126132
import { ref, onMounted, computed, inject } from 'vue'
127-
import { getMenuNodes, toolLibNode, applicationNode } from '@/workflow/common/data'
133+
import { getMenuNodes, toolLibNode, toolWorkflowLibNode } from '@/workflow/common/data'
128134
import { iconComponent } from '@/workflow/icons/utils'
129135
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
130136
import useStore from '@/stores'
@@ -241,13 +247,15 @@ async function getToolFolder() {
241247
}
242248
243249
async function getToolList() {
250+
const baseType = activeName.value == 'DATA_SOURCE_TOOL' ? 'DATA_SOURCE' : 'CUSTOM'
251+
244252
const res = await loadSharedApi({
245253
type: 'tool',
246254
isShared: folder.currentFolder?.id === 'share',
247255
systemType: apiType.value,
248256
}).getToolList({
249257
folder_id: folder.currentFolder?.id || user.getWorkspaceId(),
250-
tool_type: activeName.value == 'DATA_SOURCE_TOOL' ? 'DATA_SOURCE' : 'CUSTOM',
258+
tool_type_list: [baseType, 'WORKFLOW'],
251259
})
252260
toolList.value = res.data?.tools || res.data || []
253261
toolList.value = toolList.value?.filter((item: any) => item.is_active)

ui/src/components/workflow-dropdown-menu/tool/index.vue

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,14 @@
8989
<el-scrollbar height="450">
9090
<NodeContent
9191
:list="toolList"
92-
@clickNodes="(val: any) => clickNodes(toolLibNode, val)"
93-
@onmousedown="(val: any) => onmousedown(toolLibNode, val)"
92+
@clickNodes="
93+
(val: any) =>
94+
clickNodes(val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode, val)
95+
"
96+
@onmousedown="
97+
(val: any) =>
98+
onmousedown(val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode, val)
99+
"
94100
/>
95101
</el-scrollbar>
96102
</LayoutContainer>
@@ -100,7 +106,7 @@
100106
</template>
101107
<script setup lang="ts">
102108
import { ref, onMounted, computed, inject } from 'vue'
103-
import { getMenuNodes, toolLibNode, applicationNode } from '@/workflow/common/data'
109+
import { getMenuNodes, toolLibNode, toolWorkflowLibNode } from '@/workflow/common/data'
104110
import { iconComponent } from '@/workflow/icons/utils'
105111
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
106112
import useStore from '@/stores'
@@ -219,13 +225,14 @@ async function getToolFolder() {
219225
}
220226
221227
async function getToolList() {
228+
const baseType = activeName.value == 'DATA_SOURCE_TOOL' ? 'DATA_SOURCE' : 'CUSTOM'
222229
const res = await loadSharedApi({
223230
type: 'tool',
224231
isShared: folder.currentFolder?.id === 'share',
225232
systemType: apiType.value,
226233
}).getToolList({
227234
folder_id: folder.currentFolder?.id || user.getWorkspaceId(),
228-
tool_type: activeName.value == 'DATA_SOURCE_TOOL' ? 'DATA_SOURCE' : 'CUSTOM',
235+
tool_type_list: [baseType, 'WORKFLOW'],
229236
})
230237
toolList.value = res.data?.tools || res.data || []
231238
toolList.value = toolList.value?.filter((item: any) => item.is_active)

ui/src/enums/application.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export enum WorkflowType {
1515
Condition = 'condition-node',
1616
Reply = 'reply-node',
1717
ToolLib = 'tool-lib-node',
18+
ToolWorkflowLib = 'tool-workflow-lib-node',
1819
ToolLibCustom = 'tool-node',
1920
RerankerNode = 'reranker-node',
2021
Application = 'application-node',

ui/src/workflow/common/NodeContainer.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
<template v-if="nodeFields.length > 0">
9393
<div class="flex-between">
9494
<h5 class="title-decoration-1 mb-8 mt-8">
95-
{{ $t('common.param.outputParam') }}
95+
{{ output_title }}
9696
</h5>
9797
<div v-if="exceptionNodeList.includes(nodeModel.type)" class="text-right">
9898
<span class="mt-8 mr-8 lighter">{{ $t('common.param.exception') }}</span>
@@ -392,6 +392,11 @@ const nodeFields = computed(() => {
392392
}
393393
return []
394394
})
395+
396+
const output_title = computed(() => {
397+
return props.nodeModel.properties.config.output_title ?? t('common.param.outputParam')
398+
})
399+
395400
watch(enable_exception, () => {
396401
props.nodeModel.graphModel.eventCenter.emit(
397402
'delete_edge',

ui/src/workflow/common/data.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,6 +1038,27 @@ export const toolLibNode = {
10381038
},
10391039
}
10401040

1041+
/**
1042+
* 工作流工具配置数据
1043+
*/
1044+
export const toolWorkflowLibNode = {
1045+
type: WorkflowType.ToolWorkflowLib,
1046+
text: t('workflow.nodes.toolWorlflowNode.text','工作流工具'),
1047+
label: t('workflow.nodes.toolWorlflowNode.label','工作流工具'),
1048+
height: 170,
1049+
properties: {
1050+
stepName: t('workflow.nodes.toolWorlflowNode.label','工作流工具'),
1051+
config: {
1052+
fields: [
1053+
{
1054+
label: t('common.result'),
1055+
value: 'result',
1056+
},
1057+
],
1058+
},
1059+
},
1060+
}
1061+
10411062
export const applicationNode = {
10421063
type: WorkflowType.Application,
10431064
text: t('workflow.nodes.applicationNode.label'),
@@ -1086,6 +1107,7 @@ export const nodeDict: any = {
10861107
[WorkflowType.Start]: startNode,
10871108
[WorkflowType.Reply]: replyNode,
10881109
[WorkflowType.ToolLib]: toolNode,
1110+
[WorkflowType.ToolWorkflowLib]: toolWorkflowLibNode,
10891111
[WorkflowType.ToolLibCustom]: toolNode,
10901112
[WorkflowType.RerankerNode]: rerankerNode,
10911113
[WorkflowType.FormNode]: formNode,

0 commit comments

Comments
 (0)