Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion apps/tools/serializers/tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -1066,6 +1066,7 @@ class Query(serializers.Serializer):
user_id = serializers.UUIDField(required=False, allow_null=True, label=_('user id'))
scope = serializers.CharField(required=True, label=_('scope'))
tool_type = serializers.CharField(required=False, label=_('tool type'), allow_null=True, allow_blank=True)
tool_type_list = serializers.ListField(child=serializers.CharField(),required=False, label=_('tool type list'), allow_null=True, allow_empty=True)
create_user = serializers.UUIDField(required=False, label=_('create user'), allow_null=True)

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

if scope is not None:
tool_query_set = tool_query_set.filter(scope=scope)
if tool_type:

tool_type_list = self.data.get('tool_type_list')
if tool_type_list:
tool_query_set = tool_query_set.filter(tool_type__in=tool_type_list)
elif tool_type:
tool_query_set = tool_query_set.filter(tool_type=tool_type)

query_set_dict = {
Expand Down
1 change: 1 addition & 0 deletions apps/tools/views/tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ def get(self, request: Request, workspace_id: str):
'name': request.query_params.get('name'),
'scope': request.query_params.get('scope', ToolScope.WORKSPACE),
'tool_type': request.query_params.get('tool_type'),
'tool_type_list': request.query_params.getlist('tool_type_list[]'),
'user_id': request.user.id,
'create_user': request.query_params.get('create_user'),
}
Expand Down
15 changes: 15 additions & 0 deletions ui/src/assets/tool/icon_tool_workflow.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
29 changes: 25 additions & 4 deletions ui/src/components/workflow-dropdown-menu/application/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,22 @@
<el-scrollbar height="450">
<NodeContent
:list="toolList"
@clickNodes="(val: any) => clickNodes(toolLibNode, val, 'tool')"
@onmousedown="(val: any) => onmousedown(toolLibNode, val, 'tool')"
@clickNodes="
(val: any) =>
clickNodes(
val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode,
val,
'tool',
)
"
@onmousedown="
(val: any) =>
onmousedown(
val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode,
val,
'tool',
)
"
/>
</el-scrollbar>
</LayoutContainer>
Expand Down Expand Up @@ -122,7 +136,12 @@
</template>
<script setup lang="ts">
import { ref, onMounted, computed, inject } from 'vue'
import { getMenuNodes, toolLibNode, applicationNode } from '@/workflow/common/data'
import {
getMenuNodes,
toolLibNode,
applicationNode,
toolWorkflowLibNode,
} from '@/workflow/common/data'
import { iconComponent } from '@/workflow/icons/utils'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
import { isWorkFlow } from '@/utils/application'
Expand Down Expand Up @@ -260,13 +279,15 @@ async function getToolFolder() {
}

async function getToolList() {
const baseType = activeName.value == 'DATA_SOURCE_TOOL' ? 'DATA_SOURCE' : 'CUSTOM'

const res = await loadSharedApi({
type: 'tool',
isShared: folder.currentFolder?.id === 'share',
systemType: apiType.value,
}).getToolList({
folder_id: folder.currentFolder?.id || user.getWorkspaceId(),
tool_type: 'CUSTOM',
tool_type_list: [baseType, 'WORKFLOW'],
})
toolList.value = res.data?.tools || res.data || []
toolList.value = toolList.value?.filter((item: any) => item.is_active)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code appears to be mostly correct syntactically, but there are several areas that could benefit some improvements or corrections:

  1. Variable Redundancy: The activeName value seems incorrect here since it's not defined anywhere in the snippet provided. You might want to clarify its purpose if needed.

  2. Type Annotations: Some variables like menuItems, currentFolder, isShared, folderId, etc., need type annotations for better clarity and TypeScript support.

  3. Destructuring Assignment: Consider destructuring assignments for cleaner syntax when accessing properties of objects.

  4. Simplification of Code: There isn't much structural redundancy in this specific piece of the code, but you might consider simplifying how certain conditions are checked based on the context.

Here’s an improved version with these considerations:

<template>
  <LayoutContainer v-if="toolList && menuItems.length > 0">
    <ElScrollbar height="450px">
      <NodeContent
        :list="toolList"
        @clickNodes="(val: any) =>
          clickNodes(val.tool_type === 'WORKFLOW' ? workflowToolLibNode : toolLibNode, val, 'tool')"
        @onMouseDown="(val: any) =>
          onmousedown(val.tool_type === 'WORKFLOW' ? workflowToolLibNode : toolLibNode, val, 'tool')"
      />
    </ElScrollbar>
  </LayoutContainer>

</template>

<script setup lang="ts">
import { ref, onMounted, computed, inject } from 'vue';
import { getMenuItems, toolLibNode, applicationNode, workflowToolLibNode } from '@/workflow/common/data';
import { iconComponent } from '@/workflow/icons/utils';
import { loadSharedApi } from '@/utils/dynamics-api/shared-api';
import { isWorkFlow } from '@/utils/application';

let toolList = ref<any[]>([]);
let menuItems = ref<any[]>([]);
// let currentFolder = ref<string |null>(null);
const activeFolderId = ref('');
const currentApplicationInstance = ref<Application>();

async function loadMenusAndData() {
  // Assume loadMenuItem is a valid function
  menuItems.value = await getMenuItems();
  
  // Assuming appInstRef is properly injected somewhere in your environment
  const appInstance = inject('appInstRef', null);
  if (appInstance) {
    currentApplicationInstance.value = appInstance;
  }

  if (!activeFolderId.value && currentApplicationInstance.value) {
    currentFolderId.value = currentApplicationInstance.value.workspace.id!;
  }

  const res = await loadSharedApi({
    type: 'tool',
    isShared: !!activeFolderId.value,
    systemType: apiType.value,
  }).getToolList({
    folder_id: activeFolderId.value || user.getWorkspaceId(),
    tool_type_list: ['DATA_SOURCE', 'CUSTOM'],
  });

  toolList.value = res.data?.tools || [];
}

onMounted(loadMenusAndData);

function clickNodes(node: any, item: any, mode: string): void {
  // Implement node click logic here
}

function onmousedown(target: any, item: any, mode: string): void {
  // Implement mouse down event handler logic here
}
</script>

Key Improvements:

  • Added comments to clarify variable usage.
  • Simplified imports by specifying the exact paths where functions/classes come from.
  • Used default values and proper initialization for activeFolderId.

This should help clean up any issues you're encountering while maintaining good readability and maintainability.

Expand Down
16 changes: 12 additions & 4 deletions ui/src/components/workflow-dropdown-menu/knowledge-inner/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,14 @@
<el-scrollbar height="450">
<NodeContent
:list="toolList"
@clickNodes="(val: any) => clickNodes(toolLibNode, val)"
@onmousedown="(val: any) => onmousedown(toolLibNode, val)"
@clickNodes="
(val: any) =>
clickNodes(val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode, val)
"
@onmousedown="
(val: any) =>
onmousedown(val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode, val)
"
/>
</el-scrollbar>
</LayoutContainer>
Expand All @@ -100,7 +106,7 @@
</template>
<script setup lang="ts">
import { ref, onMounted, computed, inject } from 'vue'
import { getMenuNodes, toolLibNode, applicationNode } from '@/workflow/common/data'
import { getMenuNodes, toolLibNode, toolWorkflowLibNode } from '@/workflow/common/data'
import { iconComponent } from '@/workflow/icons/utils'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
import useStore from '@/stores'
Expand Down Expand Up @@ -221,13 +227,15 @@ async function getToolFolder() {
}

async function getToolList() {
const baseType = activeName.value == 'DATA_SOURCE_TOOL' ? 'DATA_SOURCE' : 'CUSTOM'

const res = await loadSharedApi({
type: 'tool',
isShared: folder.currentFolder?.id === 'share',
systemType: apiType.value,
}).getToolList({
folder_id: folder.currentFolder?.id || user.getWorkspaceId(),
tool_type: activeName.value == 'DATA_SOURCE_TOOL' ? 'DATA_SOURCE' : 'CUSTOM',
tool_type_list: [baseType, 'WORKFLOW'],
})
toolList.value = res.data?.tools || res.data || []
toolList.value = toolList.value?.filter((item: any) => item.is_active)
Expand Down
16 changes: 12 additions & 4 deletions ui/src/components/workflow-dropdown-menu/knowledge/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,14 @@
<el-scrollbar height="450">
<NodeContent
:list="toolList"
@clickNodes="(val: any) => clickNodes(toolLibNode, val)"
@onmousedown="(val: any) => onmousedown(toolLibNode, val)"
@clickNodes="
(val: any) =>
clickNodes(val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode, val)
"
@onmousedown="
(val: any) =>
onmousedown(val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode, val)
"
/>
</el-scrollbar>
</LayoutContainer>
Expand All @@ -124,7 +130,7 @@
</template>
<script setup lang="ts">
import { ref, onMounted, computed, inject } from 'vue'
import { getMenuNodes, toolLibNode, applicationNode } from '@/workflow/common/data'
import { getMenuNodes, toolLibNode, toolWorkflowLibNode } from '@/workflow/common/data'
import { iconComponent } from '@/workflow/icons/utils'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
import useStore from '@/stores'
Expand Down Expand Up @@ -241,13 +247,15 @@ async function getToolFolder() {
}

async function getToolList() {
const baseType = activeName.value == 'DATA_SOURCE_TOOL' ? 'DATA_SOURCE' : 'CUSTOM'

const res = await loadSharedApi({
type: 'tool',
isShared: folder.currentFolder?.id === 'share',
systemType: apiType.value,
}).getToolList({
folder_id: folder.currentFolder?.id || user.getWorkspaceId(),
tool_type: activeName.value == 'DATA_SOURCE_TOOL' ? 'DATA_SOURCE' : 'CUSTOM',
tool_type_list: [baseType, 'WORKFLOW'],
})
toolList.value = res.data?.tools || res.data || []
toolList.value = toolList.value?.filter((item: any) => item.is_active)
Expand Down
15 changes: 11 additions & 4 deletions ui/src/components/workflow-dropdown-menu/tool/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,14 @@
<el-scrollbar height="450">
<NodeContent
:list="toolList"
@clickNodes="(val: any) => clickNodes(toolLibNode, val)"
@onmousedown="(val: any) => onmousedown(toolLibNode, val)"
@clickNodes="
(val: any) =>
clickNodes(val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode, val)
"
@onmousedown="
(val: any) =>
onmousedown(val.tool_type === 'WORKFLOW' ? toolWorkflowLibNode : toolLibNode, val)
"
/>
</el-scrollbar>
</LayoutContainer>
Expand All @@ -100,7 +106,7 @@
</template>
<script setup lang="ts">
import { ref, onMounted, computed, inject } from 'vue'
import { getMenuNodes, toolLibNode, applicationNode } from '@/workflow/common/data'
import { getMenuNodes, toolLibNode, toolWorkflowLibNode } from '@/workflow/common/data'
import { iconComponent } from '@/workflow/icons/utils'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
import useStore from '@/stores'
Expand Down Expand Up @@ -219,13 +225,14 @@ async function getToolFolder() {
}

async function getToolList() {
const baseType = activeName.value == 'DATA_SOURCE_TOOL' ? 'DATA_SOURCE' : 'CUSTOM'
const res = await loadSharedApi({
type: 'tool',
isShared: folder.currentFolder?.id === 'share',
systemType: apiType.value,
}).getToolList({
folder_id: folder.currentFolder?.id || user.getWorkspaceId(),
tool_type: activeName.value == 'DATA_SOURCE_TOOL' ? 'DATA_SOURCE' : 'CUSTOM',
tool_type_list: [baseType, 'WORKFLOW'],
})
toolList.value = res.data?.tools || res.data || []
toolList.value = toolList.value?.filter((item: any) => item.is_active)
Expand Down
1 change: 1 addition & 0 deletions ui/src/enums/application.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export enum WorkflowType {
Condition = 'condition-node',
Reply = 'reply-node',
ToolLib = 'tool-lib-node',
ToolWorkflowLib = 'tool-workflow-lib-node',
ToolLibCustom = 'tool-node',
RerankerNode = 'reranker-node',
Application = 'application-node',
Expand Down
7 changes: 6 additions & 1 deletion ui/src/workflow/common/NodeContainer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@
<template v-if="nodeFields.length > 0">
<div class="flex-between">
<h5 class="title-decoration-1 mb-8 mt-8">
{{ $t('common.param.outputParam') }}
{{ output_title }}
</h5>
<div v-if="exceptionNodeList.includes(nodeModel.type)" class="text-right">
<span class="mt-8 mr-8 lighter">{{ $t('common.param.exception') }}</span>
Expand Down Expand Up @@ -392,6 +392,11 @@ const nodeFields = computed(() => {
}
return []
})

const output_title = computed(() => {
return props.nodeModel.properties.config.output_title ?? t('common.param.outputParam')
})

watch(enable_exception, () => {
props.nodeModel.graphModel.eventCenter.emit(
'delete_edge',
Expand Down
22 changes: 22 additions & 0 deletions ui/src/workflow/common/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1038,6 +1038,27 @@ export const toolLibNode = {
},
}

/**
* 工作流工具配置数据
*/
export const toolWorkflowLibNode = {
type: WorkflowType.ToolWorkflowLib,
text: t('workflow.nodes.toolWorlflowNode.text','工作流工具'),
label: t('workflow.nodes.toolWorlflowNode.label','工作流工具'),
height: 170,
properties: {
stepName: t('workflow.nodes.toolWorlflowNode.label','工作流工具'),
config: {
fields: [
{
label: t('common.result'),
value: 'result',
},
],
},
},
}

export const applicationNode = {
type: WorkflowType.Application,
text: t('workflow.nodes.applicationNode.label'),
Expand Down Expand Up @@ -1086,6 +1107,7 @@ export const nodeDict: any = {
[WorkflowType.Start]: startNode,
[WorkflowType.Reply]: replyNode,
[WorkflowType.ToolLib]: toolNode,
[WorkflowType.ToolWorkflowLib]: toolWorkflowLibNode,
[WorkflowType.ToolLibCustom]: toolNode,
[WorkflowType.RerankerNode]: rerankerNode,
[WorkflowType.FormNode]: formNode,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code seems to be correct for a workflow library in terms of syntax and data structure. However, here are some potential improvements:

  1. Comments Clarity: Consider adding more descriptive comments around significant sections or blocks of code to improve readability and understanding.

  2. Error Handling: It would be advisable to include error handling mechanisms if there's any chance that the t function might throw an exception (which hasn't occurred based on current functionality).

  3. Property Validation: Ensure that the properties defined in toolWorkflowLibNode are correctly set up for use within the workflow system.

Here’s an updated version with added comments:

// Define common constants used throughout the codebase
export const WorkflowType = {
  Start: 'start',
  Reply: 'reply',
  ToolLib: 'toollib', // Replaced 'ToolLib' to match existing keys but maintain clarity.
  ToolWorkflowLib: 'tool-workflow-lib',
  ToolLibCustom: 'custom-tool-lib', // Renamed to avoid confusion with other types.
  RerankerNode: 'reranker-node',
  FormNode: 'form-node'
};

// Translation utility - Placeholder for actual translation functions.
function t(key) { return key; }

/**
 * Base Node Configuration Interface
 */
interface NodeConfigInterface {
  type: string;
  text?: string;
  label?: string;
  height?: number;
  properties?: {};
}

/**
 * Example start node configuration object
 */
const startNode: NodeConfigInterface = {
  type: WorkflowType.Start,
  text: t('workflow.nodes.startNode.text'), // Assuming this translates to 'Start'
  label: t('workflow.nodes.startNode.label') // Assuming this translates to 'Start'
};

/**
 * Application node configuration object
 */
const applicationNode: NodeConfigInterface = {
  type: WorkflowType.Application,
  text: t('workflow.nodes.applicationNode.label')
}

// Dictionary mapping each workflow type to its corresponding node configuration object
const nodeDict: any = {
  [WorkflowType.Start]: startNode,
  [WorkflowType.Reply]: replyNode,
  [WorkflowType.ToolLib]: toolNode,
  [WorkflowType.ToolWorkflowLib]: toolWorkflowLibNode,
  [WorkflowType.ToolLibCustom]: toolNode, // Mapped back from original naming convention
  [WorkflowType.RerankerNode]: rerankerNode,
  [WorkflowType.FormNode]: formNode
};

These changes enhance the modularity of the code through encapsulation of interfaces, improved variable names, and clearer documentation. Adjustments like renaming variables should only take place when absolutely necessary and after thorough consideration to ensure consistency across components and prevent potential bugs due to name collisions or misinterpretation.

Expand Down
6 changes: 6 additions & 0 deletions ui/src/workflow/icons/tool-workflow-lib-node-icon.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<template>
<el-avatar shape="square" style="background: #34c724">
<img src="@/assets/tool/icon_tool_workflow.svg" style="width: 65%" alt="" />
</el-avatar>
</template>
<script setup lang="ts"></script>
12 changes: 12 additions & 0 deletions ui/src/workflow/nodes/tool-workflow-lib-node/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import ToolWorkflowLibNodeVue from './index.vue'
import { AppNode, AppNodeModel } from '@/workflow/common/app-node'
class ToolWorkflowLibNode extends AppNode {
constructor(props: any) {
super(props, ToolWorkflowLibNodeVue)
}
}
export default {
type: 'tool-workflow-lib-node',
model: AppNodeModel,
view: ToolWorkflowLibNode,
}
Loading
Loading