diff --git a/ui/AGENTS.md b/ui/AGENTS.md index 527dbbe4433..cbe0ae8c1ab 100644 --- a/ui/AGENTS.md +++ b/ui/AGENTS.md @@ -17,7 +17,7 @@ Before making changes, determine which areas the task touches and read the corre organization, and API type ownership. - Views: `src/views/VIEW_README.md` is the source of truth for page responsibilities and feature-local code organization. -- Workflow canvas: `src/workflow-canvas/README.md` is the source of truth for LogicFlow canvas +- Workflow canvas: `src/workflow-canvas/WORKFLOW_README.md` is the source of truth for LogicFlow canvas responsibilities, configuration boundaries, node maintenance, and View integration. Follow this maintenance flow: @@ -76,7 +76,7 @@ ui/ │ │ ├── icons/ # Workflow node icons │ │ ├── nodes/ # Workflow node definitions and components │ │ ├── plugins/ # Canvas-local plugins -│ │ ├── README.md # Canvas boundaries and maintenance rules +│ │ ├── WORKFLOW_README.md # Canvas boundaries and maintenance rules │ │ ├── types.ts # Workflow canvas protocol types │ │ └── index.vue # MkWorkflow canvas entry │ ├── router/ # Vue Router routes and router instance diff --git a/ui/src/router/admin/system/index.ts b/ui/src/router/admin/system/index.ts index ff99d841d3e..e7cfebb5f9d 100644 --- a/ui/src/router/admin/system/index.ts +++ b/ui/src/router/admin/system/index.ts @@ -13,7 +13,7 @@ export const systemRoutes: RouteRecordRaw = { path: 'home', name: 'system-home', component: () => import('@/views/system/SystemView.vue'), - meta: { title: '首页', activeIcon: 'icon_screen_outlined', icon: 'icon_screen_filled', order: 0 }, + meta: { title: '首页', activeIcon: 'icon_screen_filled', icon: 'icon_screen_outlined', order: 0 }, }, { path: 'identity', diff --git a/ui/src/styles/element-plus.scss b/ui/src/styles/element-plus.scss index 0a1f7f9fd61..622ae465176 100644 --- a/ui/src/styles/element-plus.scss +++ b/ui/src/styles/element-plus.scss @@ -882,6 +882,12 @@ /* tabs */ .el-tabs { --el-tabs-header-height: 34px; + &.small { + --el-tabs-header-height: 28px; + .el-tabs__item { + font-size: 12px; + } + } &__header { margin: 0; flex-shrink: 0; @@ -891,7 +897,7 @@ flex: 1; } &__item { - padding: 2px 14px; + padding: 0 14px; font-weight: 400; align-items: baseline; &.is-active { diff --git a/ui/src/views/VIEW_README.md b/ui/src/views/VIEW_README.md index f323a8bc4e6..04cdde2ea3b 100644 --- a/ui/src/views/VIEW_README.md +++ b/ui/src/views/VIEW_README.md @@ -28,7 +28,7 @@ `src/utils`、`src/stores` 或 `src/api`。 - 所有使用 `src/workflow-canvas/` 渲染画布的路由页面统一放在 `views/workflow/`。这些页面负责 路由参数、页面头部、保存或发布等页面动作以及后续接口编排;LogicFlow 初始化、节点注册和 - 画布内部行为遵循 `src/workflow-canvas/README.md`,不移入 View。 + 画布内部行为遵循 `src/workflow-canvas/WORKFLOW_README.md`,不移入 View。 - 页面目录存在多个层级时,目录名应表达业务层级,例如 `system/identity/groups/UserGroupListView.vue`,不要创建无业务含义的分组目录。 - 页面脚本中的状态、计算属性和处理方法按照同一业务流程集中放置,并使用简短的业务备注划分 diff --git a/ui/src/views/workflow/components/WorkflowComponentMenu.vue b/ui/src/views/workflow/components/WorkflowComponentMenu.vue index 757a164c107..4c7e624f8e3 100644 --- a/ui/src/views/workflow/components/WorkflowComponentMenu.vue +++ b/ui/src/views/workflow/components/WorkflowComponentMenu.vue @@ -2,14 +2,14 @@ import { ref } from 'vue' import { ClickOutside as vClickOutside } from 'element-plus' -import NodeMenu from '@/workflow-canvas/component/NodeMenu.vue' -import type { WorkflowMenuNode } from '@/workflow-canvas/config/menu' +import NodeMenu from '@/workflow-canvas/node-menu/index.vue' +import type { NodeMenuItem } from '@/workflow-canvas/node-menu/types' defineOptions({ name: 'WorkflowComponentMenu' }) const emit = defineEmits<{ - dragstart: [workflowNode: WorkflowMenuNode, event: PointerEvent] - select: [workflowNode: WorkflowMenuNode] + dragstart: [node: NodeMenuItem, event: PointerEvent] + select: [node: NodeMenuItem] }>() const popoverVisible = ref(false) @@ -20,13 +20,13 @@ const togglePopover = () => { popoverVisible.value = !popoverVisible.value } -const handleSelect = (workflowNode: WorkflowMenuNode) => { - emit('select', workflowNode) +const handleSelect = (node: NodeMenuItem) => { + emit('select', node) popoverVisible.value = false } -const handleDragStart = (workflowNode: WorkflowMenuNode, event: PointerEvent) => { - emit('dragstart', workflowNode, event) +const handleDragStart = (node: NodeMenuItem, event: PointerEvent) => { + emit('dragstart', node, event) dragClosing.value = true popoverVisible.value = false } @@ -39,7 +39,7 @@ const handleDragStart = (workflowNode: WorkflowMenuNode, event: PointerEvent) => /` 中实现注册文件和节点视图,并按需增加 `icons/` 图标。 6. 确认节点能被自动注册、从菜单添加、正确连线、校验并导出图数据。 节点协议值统一使用 `WorkflowNodeType` 等枚举或画布常量,不在判断和映射中重复书写 -`ai-chat-node`、`tool-node` 等字符串字面量。 +`ai-chat-node`、`tool-custom-node` 等字符串字面量。 ## 当前迁移范围 -- 已实现并注册:基本信息、开始、AI 对话、意图识别、文本转语音、判断器、指定回复。 +- 已实现并注册:基本信息、开始、AI 对话、意图识别、文本转语音、判断器、指定回复、智能体、 + 自定义工具和工具库工具。 - `config/node-mapping.ts` 保留节点类型映射,以及基本信息和开始节点的默认数据集合。 -- `NodeMenu` 根据当前工作流模式直接渲染 `config/menu.ts` 返回的菜单分组;页面“添加组件”和节点锚点菜单均支持点击创建与拖拽到画布创建。 +- `NodeMenu` 使用 Element Plus Tabs 组织基础组件、工具和智能体;基础组件直接渲染 `node-menu/menu.ts` 返回的菜单分组,工具和智能体复用 Workspace 文件夹树加载可用资源。页面“添加组件”和节点锚点菜单均支持点击创建与拖拽到画布创建。 - `ApplicationWorkflowView` 已接入详情加载、默认工作流、手动与自动保存、发布以及未保存退出确认。 - 调试、发布历史、模板中心、完整国际化、枚举补充和其他尚未迁入的节点组件后续再接入。 diff --git a/ui/src/workflow-canvas/component/NodeMenu.vue b/ui/src/workflow-canvas/component/NodeMenu.vue deleted file mode 100644 index 4fb97b0a64e..00000000000 --- a/ui/src/workflow-canvas/component/NodeMenu.vue +++ /dev/null @@ -1,89 +0,0 @@ - - - diff --git a/ui/src/workflow-canvas/core/DeleteEdgeButton.vue b/ui/src/workflow-canvas/core/edge/DeleteEdgeButton.vue similarity index 95% rename from ui/src/workflow-canvas/core/DeleteEdgeButton.vue rename to ui/src/workflow-canvas/core/edge/DeleteEdgeButton.vue index 968a383eb17..a1dc2817674 100644 --- a/ui/src/workflow-canvas/core/DeleteEdgeButton.vue +++ b/ui/src/workflow-canvas/core/edge/DeleteEdgeButton.vue @@ -1,6 +1,9 @@ + + diff --git a/ui/src/workflow-canvas/node-menu/ResourceNodeMenu.vue b/ui/src/workflow-canvas/node-menu/ResourceNodeMenu.vue new file mode 100644 index 00000000000..0567da7e42f --- /dev/null +++ b/ui/src/workflow-canvas/node-menu/ResourceNodeMenu.vue @@ -0,0 +1,185 @@ + + + diff --git a/ui/src/workflow-canvas/node-menu/index.vue b/ui/src/workflow-canvas/node-menu/index.vue new file mode 100644 index 00000000000..0440a40926a --- /dev/null +++ b/ui/src/workflow-canvas/node-menu/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/ui/src/workflow-canvas/config/menu.ts b/ui/src/workflow-canvas/node-menu/menu.ts similarity index 99% rename from ui/src/workflow-canvas/config/menu.ts rename to ui/src/workflow-canvas/node-menu/menu.ts index 6afa0a06ccf..8467c20e7e1 100644 --- a/ui/src/workflow-canvas/config/menu.ts +++ b/ui/src/workflow-canvas/node-menu/menu.ts @@ -1,5 +1,5 @@ import { WorkflowMode, WorkflowNodeType, type ShapeItem } from '@/workflow-canvas/types' -import * as NodeData from './node-data' +import * as NodeData from '../config/node-data' export interface WorkflowMenuNode extends ShapeItem { height?: number diff --git a/ui/src/workflow-canvas/node-menu/types.ts b/ui/src/workflow-canvas/node-menu/types.ts new file mode 100644 index 00000000000..e947b4759b7 --- /dev/null +++ b/ui/src/workflow-canvas/node-menu/types.ts @@ -0,0 +1,6 @@ +import { RESOURCE_TYPE } from '@/api/enums' +import type { ShapeItem } from '@/workflow-canvas/types' + +export type NodeMenuItem = ShapeItem & { height?: number } +export type NodeMenuResourceSource = typeof RESOURCE_TYPE.APPLICATION | typeof RESOURCE_TYPE.TOOL +export type NodeMenuTab = 'application' | 'basic' | 'tool' diff --git a/ui/src/workflow-canvas/nodes/ai-chat-node/index.vue b/ui/src/workflow-canvas/nodes/ai-chat-node/index.vue index 6a97a680cf2..b05c9dff003 100644 --- a/ui/src/workflow-canvas/nodes/ai-chat-node/index.vue +++ b/ui/src/workflow-canvas/nodes/ai-chat-node/index.vue @@ -4,7 +4,7 @@ import { groupBy, set } from 'lodash' import type { FormInstance } from 'element-plus' import ModelSelect from '@/components/business/model-select/index.vue' import NodeCascader from '@/workflow-canvas/core/NodeCascader.vue' -import NodeContainer from '@/workflow-canvas/core/NodeContainer.vue' +import NodeContainer from '@/workflow-canvas/core/node-container/index.vue' import type { BaseNodeModel } from '@logicflow/core' import { useWorkflowStore } from '@/workflow-canvas/store' import type { ModelItem } from '@/api/types' diff --git a/ui/src/workflow-canvas/nodes/application-node/index.ts b/ui/src/workflow-canvas/nodes/application-node/index.ts new file mode 100644 index 00000000000..e6dc4bd333d --- /dev/null +++ b/ui/src/workflow-canvas/nodes/application-node/index.ts @@ -0,0 +1,11 @@ +import ApplicationNode from './index.vue' +import { WorkflowNodeModel, WorkflowNodeView } from '@/workflow-canvas/core/workflow-node' +import { WorkflowNodeType } from '@/workflow-canvas/types' + +class ApplicationNodeView extends WorkflowNodeView { + constructor(props: ConstructorParameters[0]) { + super(props, ApplicationNode) + } +} + +export default { type: WorkflowNodeType.Application, model: WorkflowNodeModel, view: ApplicationNodeView } diff --git a/ui/src/workflow-canvas/nodes/application-node/index.vue b/ui/src/workflow-canvas/nodes/application-node/index.vue new file mode 100644 index 00000000000..3182abec6be --- /dev/null +++ b/ui/src/workflow-canvas/nodes/application-node/index.vue @@ -0,0 +1,227 @@ + + + diff --git a/ui/src/workflow-canvas/nodes/base-node/index.vue b/ui/src/workflow-canvas/nodes/base-node/index.vue index ed30f058380..9c37edf21c7 100644 --- a/ui/src/workflow-canvas/nodes/base-node/index.vue +++ b/ui/src/workflow-canvas/nodes/base-node/index.vue @@ -3,7 +3,7 @@ import { computed, inject, onMounted, useTemplateRef } from 'vue' import { set } from 'lodash' import type { FormInstance } from 'element-plus' -import NodeContainer from '@/workflow-canvas/core/NodeContainer.vue' +import NodeContainer from '@/workflow-canvas/core/node-container/index.vue' import type { BaseNodeModel } from '@logicflow/core' defineOptions({ name: 'WorkflowBaseNode' }) diff --git a/ui/src/workflow-canvas/nodes/condition-node/index.vue b/ui/src/workflow-canvas/nodes/condition-node/index.vue index d9fa7d40c48..e22c72ef395 100644 --- a/ui/src/workflow-canvas/nodes/condition-node/index.vue +++ b/ui/src/workflow-canvas/nodes/condition-node/index.vue @@ -93,7 +93,7 @@ import type { FormInstance } from 'element-plus' import type { BaseNodeModel } from '@logicflow/core' import NodeCascader from '@/workflow-canvas/core/NodeCascader.vue' -import NodeContainer from '@/workflow-canvas/core/NodeContainer.vue' +import NodeContainer from '@/workflow-canvas/core/node-container/index.vue' import { handleNodeWheel } from '@/workflow-canvas/core/utils' import { compareList } from '@/workflow-canvas/config/constants' import { randomId } from '@/utils/common' diff --git a/ui/src/workflow-canvas/nodes/form-node/index.vue b/ui/src/workflow-canvas/nodes/form-node/index.vue index 18410b13a84..13e7508dceb 100644 --- a/ui/src/workflow-canvas/nodes/form-node/index.vue +++ b/ui/src/workflow-canvas/nodes/form-node/index.vue @@ -106,7 +106,7 @@ import { set, cloneDeep } from 'lodash' import Sortable from 'sortablejs' import type { FormInstance } from 'element-plus' -import NodeContainer from '@/workflow-canvas/core/NodeContainer.vue' +import NodeContainer from '@/workflow-canvas/core/node-container/index.vue' import { MkDynamicsFormConstructor, dynamicFormTypeOptions, type FormField, type VisibilityFieldOption } from '@/components/mk-dynamics-form' import type { WorkflowNodeModel } from '@/workflow-canvas/core/workflow-node' import type { BaseNodeModel } from '@logicflow/core' diff --git a/ui/src/workflow-canvas/nodes/image-generate-node/index.vue b/ui/src/workflow-canvas/nodes/image-generate-node/index.vue index 60d4bedf093..6c276864074 100644 --- a/ui/src/workflow-canvas/nodes/image-generate-node/index.vue +++ b/ui/src/workflow-canvas/nodes/image-generate-node/index.vue @@ -5,7 +5,7 @@ import { QuestionFilled } from '@element-plus/icons-vue' import type { FormInstance } from 'element-plus' import ModelSelect from '@/components/business/model-select/index.vue' import NodeCascader from '@/workflow-canvas/core/NodeCascader.vue' -import NodeContainer from '@/workflow-canvas/core/NodeContainer.vue' +import NodeContainer from '@/workflow-canvas/core/node-container/index.vue' import { useWorkflowStore } from '@/workflow-canvas/store' import type { BaseNodeModel } from '@logicflow/core' import type { ModelItem, ModelProviderItem } from '@/api/types' diff --git a/ui/src/workflow-canvas/nodes/image-understand-node/index.vue b/ui/src/workflow-canvas/nodes/image-understand-node/index.vue index cdc294a066c..e5daa48cbd5 100644 --- a/ui/src/workflow-canvas/nodes/image-understand-node/index.vue +++ b/ui/src/workflow-canvas/nodes/image-understand-node/index.vue @@ -5,7 +5,7 @@ import { set } from 'lodash' import type { FormInstance } from 'element-plus' import ModelSelect from '@/components/business/model-select/index.vue' import NodeCascader from '@/workflow-canvas/core/NodeCascader.vue' -import NodeContainer from '@/workflow-canvas/core/NodeContainer.vue' +import NodeContainer from '@/workflow-canvas/core/node-container/index.vue' import { useWorkflowStore } from '@/workflow-canvas/store' import type { BaseNodeModel } from '@logicflow/core' import type { ModelItem, ModelProviderItem } from '@/api/types' diff --git a/ui/src/workflow-canvas/nodes/intent-node/index.vue b/ui/src/workflow-canvas/nodes/intent-node/index.vue index a8c8c221755..3c03c6741bd 100644 --- a/ui/src/workflow-canvas/nodes/intent-node/index.vue +++ b/ui/src/workflow-canvas/nodes/intent-node/index.vue @@ -5,7 +5,7 @@ import { cloneDeep, set } from 'lodash' import type { FormInstance } from 'element-plus' import ModelSelect from '@/components/business/model-select/index.vue' import NodeCascader from '@/workflow-canvas/core/NodeCascader.vue' -import NodeContainer from '@/workflow-canvas/core/NodeContainer.vue' +import NodeContainer from '@/workflow-canvas/core/node-container/index.vue' import { useWorkflowStore } from '@/workflow-canvas/store' import type { BaseNodeModel } from '@logicflow/core' import type { ModelItem, ModelProviderItem } from '@/api/types' diff --git a/ui/src/workflow-canvas/nodes/question-node/index.vue b/ui/src/workflow-canvas/nodes/question-node/index.vue index d82b73bf73e..70f81ee2653 100644 --- a/ui/src/workflow-canvas/nodes/question-node/index.vue +++ b/ui/src/workflow-canvas/nodes/question-node/index.vue @@ -5,7 +5,7 @@ import { set } from 'lodash' import type { FormInstance } from 'element-plus' import ModelSelect from '@/components/business/model-select/index.vue' import NodeCascader from '@/workflow-canvas/core/NodeCascader.vue' -import NodeContainer from '@/workflow-canvas/core/NodeContainer.vue' +import NodeContainer from '@/workflow-canvas/core/node-container/index.vue' import { useWorkflowStore } from '@/workflow-canvas/store' import type { BaseNodeModel } from '@logicflow/core' import type { ModelItem, ModelProviderItem } from '@/api/types' diff --git a/ui/src/workflow-canvas/nodes/reply-node/index.vue b/ui/src/workflow-canvas/nodes/reply-node/index.vue index 00fb30667d4..499ecd8ad59 100644 --- a/ui/src/workflow-canvas/nodes/reply-node/index.vue +++ b/ui/src/workflow-canvas/nodes/reply-node/index.vue @@ -5,7 +5,7 @@ import { set } from 'lodash' import type { FormInstance } from 'element-plus' import type { WorkflowNodeModel } from '@/workflow-canvas/core/workflow-node' import NodeCascader from '@/workflow-canvas/core/NodeCascader.vue' -import NodeContainer from '@/workflow-canvas/core/NodeContainer.vue' +import NodeContainer from '@/workflow-canvas/core/node-container/index.vue' import { isLastNode } from '@/workflow-canvas/core/utils' import type { BaseNodeModel } from '@logicflow/core' diff --git a/ui/src/workflow-canvas/nodes/speech-to-text-node/index.vue b/ui/src/workflow-canvas/nodes/speech-to-text-node/index.vue index 82ed9652565..5f54e02c5cd 100644 --- a/ui/src/workflow-canvas/nodes/speech-to-text-node/index.vue +++ b/ui/src/workflow-canvas/nodes/speech-to-text-node/index.vue @@ -4,7 +4,7 @@ import { set } from 'lodash' import type { FormInstance } from 'element-plus' import ModelSelect from '@/components/business/model-select/index.vue' import NodeCascader from '@/workflow-canvas/core/NodeCascader.vue' -import NodeContainer from '@/workflow-canvas/core/NodeContainer.vue' +import NodeContainer from '@/workflow-canvas/core/node-container/index.vue' import { useWorkflowStore } from '@/workflow-canvas/store' import type { BaseNodeModel } from '@logicflow/core' import type { ModelItem, ModelProviderItem } from '@/api/types' diff --git a/ui/src/workflow-canvas/nodes/start-node/index.vue b/ui/src/workflow-canvas/nodes/start-node/index.vue index 47e856a7eb1..c7a29bcc1b4 100644 --- a/ui/src/workflow-canvas/nodes/start-node/index.vue +++ b/ui/src/workflow-canvas/nodes/start-node/index.vue @@ -4,7 +4,7 @@ import { computed, inject, onBeforeUnmount, onMounted } from 'vue' import { CopyDocument } from '@element-plus/icons-vue' import { cloneDeep, set } from 'lodash' import type { WorkflowNodeField, WorkflowNodeModel } from '@/workflow-canvas/core/workflow-node' -import NodeContainer from '@/workflow-canvas/core/NodeContainer.vue' +import NodeContainer from '@/workflow-canvas/core/node-container/index.vue' import { WorkflowNodeType } from '@/workflow-canvas/types' import { copyText } from '@/utils/clipboard' import type { BaseEdgeModel, BaseNodeModel, GraphModel } from '@logicflow/core' diff --git a/ui/src/workflow-canvas/nodes/text-to-speech-node/index.vue b/ui/src/workflow-canvas/nodes/text-to-speech-node/index.vue index 34f91b98eeb..981dd9898c6 100644 --- a/ui/src/workflow-canvas/nodes/text-to-speech-node/index.vue +++ b/ui/src/workflow-canvas/nodes/text-to-speech-node/index.vue @@ -4,7 +4,7 @@ import { set } from 'lodash' import type { FormInstance } from 'element-plus' import ModelSelect from '@/components/business/model-select/index.vue' import NodeCascader from '@/workflow-canvas/core/NodeCascader.vue' -import NodeContainer from '@/workflow-canvas/core/NodeContainer.vue' +import NodeContainer from '@/workflow-canvas/core/node-container/index.vue' import { useWorkflowStore } from '@/workflow-canvas/store' import type { BaseNodeModel } from '@logicflow/core' import type { ModelItem, ModelProviderItem } from '@/api/types' diff --git a/ui/src/workflow-canvas/nodes/tool-custom-node/InputFieldDialog.vue b/ui/src/workflow-canvas/nodes/tool-custom-node/InputFieldDialog.vue new file mode 100644 index 00000000000..161d5d4cded --- /dev/null +++ b/ui/src/workflow-canvas/nodes/tool-custom-node/InputFieldDialog.vue @@ -0,0 +1,86 @@ + + + diff --git a/ui/src/workflow-canvas/nodes/tool-custom-node/index.ts b/ui/src/workflow-canvas/nodes/tool-custom-node/index.ts new file mode 100644 index 00000000000..a4c69fc3f74 --- /dev/null +++ b/ui/src/workflow-canvas/nodes/tool-custom-node/index.ts @@ -0,0 +1,11 @@ +import ToolCustomNode from './index.vue' +import { WorkflowNodeModel, WorkflowNodeView } from '@/workflow-canvas/core/workflow-node' +import { WorkflowNodeType } from '@/workflow-canvas/types' + +class ToolCustomNodeView extends WorkflowNodeView { + constructor(props: ConstructorParameters[0]) { + super(props, ToolCustomNode) + } +} + +export default { type: WorkflowNodeType.ToolLibCustom, model: WorkflowNodeModel, view: ToolCustomNodeView } diff --git a/ui/src/workflow-canvas/nodes/tool-custom-node/index.vue b/ui/src/workflow-canvas/nodes/tool-custom-node/index.vue new file mode 100644 index 00000000000..62525447514 --- /dev/null +++ b/ui/src/workflow-canvas/nodes/tool-custom-node/index.vue @@ -0,0 +1,153 @@ + + + diff --git a/ui/src/workflow-canvas/nodes/tool-lib-node/index.ts b/ui/src/workflow-canvas/nodes/tool-lib-node/index.ts new file mode 100644 index 00000000000..a9daffcdfa6 --- /dev/null +++ b/ui/src/workflow-canvas/nodes/tool-lib-node/index.ts @@ -0,0 +1,11 @@ +import ToolLibNode from './index.vue' +import { WorkflowNodeModel, WorkflowNodeView } from '@/workflow-canvas/core/workflow-node' +import { WorkflowNodeType } from '@/workflow-canvas/types' + +class ToolLibNodeView extends WorkflowNodeView { + constructor(props: ConstructorParameters[0]) { + super(props, ToolLibNode) + } +} + +export default { type: WorkflowNodeType.ToolLib, model: WorkflowNodeModel, view: ToolLibNodeView } diff --git a/ui/src/workflow-canvas/nodes/tool-lib-node/index.vue b/ui/src/workflow-canvas/nodes/tool-lib-node/index.vue new file mode 100644 index 00000000000..8ea1419fcb8 --- /dev/null +++ b/ui/src/workflow-canvas/nodes/tool-lib-node/index.vue @@ -0,0 +1,142 @@ + + + diff --git a/ui/src/workflow-canvas/types.ts b/ui/src/workflow-canvas/types.ts index 2686d2d86a4..75fdf0ca6d8 100644 --- a/ui/src/workflow-canvas/types.ts +++ b/ui/src/workflow-canvas/types.ts @@ -12,7 +12,7 @@ export enum WorkflowNodeType { Reply = 'reply-node', ToolLib = 'tool-lib-node', ToolWorkflowLib = 'tool-workflow-lib-node', - ToolLibCustom = 'tool-node', + ToolLibCustom = 'tool-custom-node', RerankerNode = 'reranker-node', Application = 'application-node', DocumentExtractNode = 'document-extract-node',