# CanvasMind **Repository Path**: daoos_admin/CanvasMind ## Basic Information - **Project Name**: CanvasMind - **Description**: 这是一个基于NodeGraphQt和qfluentwidgets构建的现代低代码可视化编程平台,支持拖拽组件编排、异步执行、文件作、循环控制以及一键导出工作流到独立可运行项目——实现从开发到部署的无缝过渡。 - **Primary Language**: Python - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-29 - **Last Updated**: 2026-02-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

logo

可视化编程流程算法开发工具

[🇨🇳 中文](README_zh.md) | [🇬🇧 English](README.md)| [📘 使用手册](https://canvasmind-sphinx-build.readthedocs.io/zh-cn/latest/) | [b站相关介绍视频](https://www.bilibili.com/video/BV153zCBGEU2?spm_id_from=333.788.videopod.sections&vd_source=730f7f3382f460e22f17a3b2c58f0256)
![Low-Code Platform](https://img.shields.io/badge/Python-3.8%2B-blue ) ![NodeGraphQt](https://img.shields.io/badge/NodeGraphQt-v0.3%2B-orange ) ![qfluentwidgets](https://img.shields.io/badge/qfluentwidgets-v1.0%2B-green )
一个基于 **NodeGraphQt** 和 **qfluentwidgets** 的现代化低代码可视化编程平台,支持拖拽式组件编排、异步执行、文件操作、循环控制,并可将工作流一键导出为独立可运行项目,实现从开发到部署的无缝衔接。


--- ## 🌟 为什么选择 CanvasMind? | 传统低代码工具 | CanvasMind | |-------------------|----------------------------------------------------| | 静态组件拼接 | **动态表达式 + 全局变量** 驱动参数 | | 仅支持串行执行 | **条件分支 + 迭代 + 循环** 控制流 | | 无法自定义逻辑 | **内嵌代码编辑器**,自由编写 Python 组件 | | 执行即终点 | **一键导出独立项目**,支持 API、命令行、MCP 部署 | | 节点显示单一 | **支持多种控件类型**,可以展示echarts图表、图片及代码编辑器 | | AI 与画布割裂 | **大模型深度集成**:黄色跳转 / 紫色创建,实现画布级智能补全(⭐ 未来) | | 运行环境固定 | **支持远程ssh执行**,集成ssh服务器python环境管理工具,并支持将节点发送到服务器端运行 | | 没有触发器节点 或 触发方式硬编码 | **全插件化触发架构**:支持 Cron、Webhook、文件监听等插件动态扩展,实现零代码接入任意外部事件 | --- ## 🌟 主要特性 #### 核心特性 ✨ - **动态属性网格** - 根据参数数据类型自动渲染适配的UI控件(文本输入、数值调节、文件选择器、开关按钮、滑块等),支持实时类型校验与范围约束,确保配置准确性。 - **层级化属性树** - 采用可展开/折叠的树形结构组织嵌套配置项,支持拖拽重排序与父子关系可视化,轻松管理复杂工作流的多层参数体系。 - **交互式树导航** - 通过右键菜单快速添加/删除节点,视觉标识清晰区分父级容器与叶节点,支持键盘快捷操作提升配置效率。

### ⚡ 分布式混合执行引擎 - **并行 DAG 执行** – 通过高性能任务调度器并发执行独立的分支任务,最大化提升整个工作流在多核 CPU/GPU 上的利用率。 - **混合运行时编排 (Hybrid Runtime)** – 支持多种执行环境的无缝混合调度: * **交互式 IPython 内核**: 利用本地持久化会话实现快速代码调试与内存状态保留。 * **远程 SSH 工作节点**: 将高算力消耗任务(如模型训练、大规模推理)透明地分发至远程服务器,并支持自动化的环境同步。 - **选择性内存持久化 (缓存机制)** – 用户可对特定节点开启“常驻内存”功能;执行结果将直接缓存在活动进程的 RAM 中,彻底消除在反复迭代调优过程中的冗余计算与 I/O 开销。 - **智能拓扑分发** – 系统根据节点配置自动解析依赖关系,并将任务精准路由至最佳目标执行环境(本地、远程服务器或 IPython 内核)。 - **统一状态监控** – 在单个画布上实时可视化所有分布式节点的运行状态(排队中 / 运行中 / 成功 / 失败),全局掌控复杂任务进度。 - **极速数据序列化** – 采用 `pyarrow` 和 `pickle` 深度优化数据传输协议,确保本地与远程环境之间的大规模数据交换保持极低延迟。 ### 🧠 智能节点补全推荐 ✨(新增) - **类型兼容推荐** - 基于输出端口 ArgumentType 自动匹配兼容的下游组件 - **多端口分组** - 按输出端口分组显示推荐项,清晰展示推荐来源 - **视觉区分** - 不同端口的推荐项使用不同颜色高亮,一目了然 - **全局统计学习** - 跨画布记录组件连接频率,越用越聪明 ### 🤖 大模型画布上下文联动(已实现) - **黄色跳转按钮**:大模型回复中引用现有节点时,自动生成 `[节点名](jump)` 黄色按钮,点击直接跳转到画布对应节点; - **紫色创建按钮**:推荐新组件时,生成 `[组件名](create)` 紫色按钮,点击即从组件库实例化新节点并自动连线; - **多模态上下文注入**:自动将节点 JSON、变量状态、base64 图片等作为上下文传给大模型,确保建议精准可操作; - **画布智能补全**:支持同时引用多个现有节点(黄)并推荐多个缺失组件(紫),实现端到端流程补全建议。 ### 🔁 高级控制流支持 ✨(新增) - **条件分支(Conditional Branch)** - 根据表达式动态启用/禁用分支,实现 `if/else` 逻辑 - **迭代执行(Iterate)** - 遍历列表/数组,对每个元素执行子流程 - **循环控制(Loop)** - 支持固定次数或条件驱动的迭代循环 - **动态禁用** - 未激活分支及其**整个下游子图自动跳过**,提升执行效率 - **表达式驱动** - 分支条件、循环次数等均支持 `$...$` 动态表达式 ### 🌐 全局变量与表达式系统 ✨ - **结构化全局变量** - 支持环境变量(env)、自定义变量(custom)、节点输出(node_vars)三类作用域,环境变量在组件执行时实时注入 - **动态表达式引擎** - 使用 `$表达式$` 语法在参数中引用和组合变量(如 `$env_user_id$`、`$custom_threshold * 2$`) - **实时求值** - 执行前自动解析表达式,支持嵌套结构(列表/字典)中的动态值 - **安全沙箱** - 基于 `asteval` 的安全执行环境,禁止危险操作,使用 `contextmanager` 实现组件间环境变量隔离 - **属性面板集成** - 在组件属性中可直接选择全局变量或输入表达式 ### ✅ **动态代码组件** - **自由编程**:在节点内直接编写完整 Python 组件逻辑(含 `run` 方法及辅助函数) - **动态端口**:通过属性表单自由增删输入/输出端口,支持为输入端口绑定**全局变量默认值** - **无缝集成**:复用全局变量、表达式系统、依赖自动安装、独立日志、状态可视化等全部核心能力 - **安全执行**:代码在独立子进程运行,支持超时控制、错误捕获与重试 - **开发友好**:专业级代码编辑器(深色主题、语法高亮、智能补全、折叠、错误提示) ### ⚡ 插件化触发系统 * **动态插件加载** – 采用解耦架构,自动识别并注册插件目录下的新触发类型(如 Cron、Webhook、文件监听),无需重启程序即可热更新。 * **自适应 UI 面板** – 节点属性栏根据所选插件动态重构输入控件,确保界面简洁且仅显示当前触发模式相关的配置项。 * **事件驱动执行** – 从手动运行转向自动化工作流,支持通过外部 HTTP 请求、定时计划或文件系统变更实时驱动画布逻辑。 * **自动化生命周期管理** – 内置安全清理逻辑,在画布关闭或节点删除时自动注销后端监听器,确保零内存泄漏与端口占用。 ### 📊 节点管理 - **动态组件加载** - 自动扫描 `components` 目录,动态加载组件 - **Pydantic 配置** - 使用 Pydantic 模型定义组件输入/输出/属性 - **独立日志系统** - 每个节点独立存储执行日志 - **状态持久化** - 支持工作流的导入/导出 - **依赖管理** - 组件可定义 `requirements` 字段,运行时自动安装缺失包 ### 📦 模型导出与独立部署 ✨ - **子图导出** - 选中任意节点组合,一键导出为独立项目 - **训练/推理分离** - 仅导出推理流程,自动打包训练好的模型文件 - **自包含运行** - 生成完整可执行项目,无需主程序即可运行 - **跨环境部署** - 自动生成工具包要求,支持服务器、Docker、命令行等无 GUI 环境 ### 🛠️ 导出项目画布工具调用 - **工具调用** - 画布可直接根据项目名称调用项目执行脚本,获取运行结果 - **工具调用参数** - 画布节点属性中支持工具调用参数,工具调用时自动传入 - **工具调用日志** - 完整记录并返回详细的工具调用过程与结果日志,便于调试与追踪。 - **大模型集成** - 提供标准化的工具名称、输入/输出参数格式及调用示例,无缝支持大模型的工具调用(Function Calling)能力。 --- ## 🚀 快速开始 ### 环境要求 - Python 3.8+ - PyQt5 或 PySide2 ### 安装依赖 ```bash pip install -r requirements.txt ``` ### 运行应用 ```bash python main.py ``` ### pyinstaller打包应用 ```bash python build.py ``` --- ## 🧪 组件开发 ### 创建新组件 1. **在 `components/` 目录下创建组件文件** ```python # components/data/my_component.py class Component(BaseComponent): name = "" category = "" description = "" requirements = "" inputs = [ ] outputs = [ ] properties = { } def run(self, params, inputs=None): """ params: 节点属性(来自UI) inputs: 上游输入(key=输入端口名) return: 输出数据(key=输出端口名) """ # 在这里编写你的组件逻辑 input_data = inputs.get("input_data") if inputs else None param1 = params.get("param1", "default_value") # 处理逻辑 result = f"处理结果: {input_data} + {param1}" return { "output_data": result } ``` 2. **自动加载** - 组件会自动被扫描并添加到组件面板 3. **自动依赖安装** - 当运行工作流时,如果该组件因缺少依赖包而执行失败,系统会根据 `requirements` 字段自动安装所需包,然后重试执行。 ### 组件端口参数支持 | 类型 | 说明 | 示例 | |------------|---------|------------| | `TEXT` | 文本输入 | 字符串参数 | | `LONGTEXT` | 长文本输入 | 字符串参数 | | `INT` | 整数输入 | 数值参数 | | `FLOAT` | 浮点数输入 | 小数参数 | | `BOOL` | 布尔输入 | 开关选项 | | `CSV` | csv列表数据 | 预定义选项 | | `JSON` | json结构数据 | 不定长度数据列表信息 | | `EXCEL` | excel列表数据 | 指定范围的数值 | | `FILE` | 文本数据 | 指定范围的数值 | | `UPLOAD` | 上传文档 | 指定范围的数值 | | `SKLEARNMODEL` | sklearn模型 | 指定范围的数值 | | `TORCHMODEL` | torch模型 | 指定范围的数值 | | `IMAGE` | 图片数据 | 指定范围的数值 | ### 组件属性参数支持 | 类型 | 说明 | 示例 | |---------------|-------|------------------------| | `TEXT` | 文本输入 | 字符串参数 | | `LONGTEXT` | 长文本输入 | 字符串参数 | | `INT` | 整数输入 | 数值参数 | | `FLOAT` | 浮点数输入 | 小数参数 | | `BOOL` | 布尔输入 | 开关选项 | | `CHOICE` | 下拉选择 | 预定义选项 | | `DYNAMICFORM` | 动态表单 | 不定长度数据列表信息 | | `RANGE` | 数值范围 | 指定范围的数值 | | `VARIABLE` | 变量选择 | 全局变量 | | `FILE SELECT` | 文件选择 | canvas_files/model.pth | --- --- ## 🎮 画布使用指南 ### 基本操作 1. **创建节点** - 从左侧组件面板拖拽组件到画布 2. **连接节点** - 从输出端口拖拽到输入端口 3. **运行节点** - 右键点击节点选择"运行此节点" 4. **查看日志** - 右键点击节点选择"查看节点日志" ### 高级功能 1. **循环执行** - 使用循环控制器节点配合 Backdrop 实现循环 2. **文件操作** - 在属性面板中点击文件选择按钮 3. **工作流管理** - 使用左上角按钮保存/加载工作流 4. **节点分组** - 选中多个节点右键创建 Backdrop 5. **依赖管理** - 组件运行失败时,系统会根据其 `requirements` 尝试自动安装。 ### 快捷键 - `Ctrl+R` - 运行工作流 - `Ctrl+S` - 保存工作流 - `Ctrl+O` - 加载工作流 - `Ctrl+A` - 全选节点 - `Del` - 删除选中节点 - `alt+左键拖拽` - 画布平移 --- ## 🛠️ 画布开发说明 ### 节点状态管理 - **未运行** - 灰色框 - **运行中** - 蓝色框 - **执行成功** - 绿色框 - **执行失败** - 红色框 ### 连接线状态管理 - **未运行** - 黄色线 - **运行中输入连接** - 蓝色线 - **运行中输出连接** - 绿色线 ### 日志系统 - 每个节点独立存储日志 - 自动添加时间戳 - 支持 Loguru 日志库,组件内部使用 `self.logger` 记录日志 - 组件内部 `print()` 输出自动捕获 ### 数据流 - 输入端口自动获取上游节点输出 - 输出端口数据按端口名称存储 - 支持多输入多输出 --- ## 📥 模型导出(独立部署) ### 核心价值 **将画布上的任意子图导出为可独立运行的项目**,无需依赖主程序即可部署到任何 Python 环境! ### 使用场景 - **训练/推理分离**:只导出推理部分,打包训练好的模型文件 - **模型分享**:将完整工作流打包分享给同事 - **生产部署**:直接部署到服务器或 Docker 容器 - **离线运行**:在无 GUI 环境中执行工作流 ### 导出功能特点 ✅ **智能依赖分析** - 自动识别并复制所需组件代码 ✅ **文件路径重写** - 模型文件、数据文件自动复制到项目目录并重写为相对路径 ✅ **列选择支持** - CSV 列选择配置完整保留 ✅ **环境隔离** - 自动生成 `requirements.txt`,确保依赖一致性 ✅ **即开即用** - 包含完整运行脚本,无需额外配置 ### 导出步骤 1. **选择节点** - 在画布上选中要导出的节点(可多选) 2. **点击导出** - 点击左上角 **"导出模型"** 按钮(📤 图标) 3. **选择目录** - 选择导出目录,系统自动生成项目文件夹 4. **运行项目** - 进入导出目录,执行以下命令: ```bash # 安装依赖 pip install -r requirements.txt # 运行模型 python run.py ``` ### 导出项目结构 ``` model_xxxxxxxx/ ├── model.workflow.json # 工作流定义(包含节点配置、连接关系、列选择等) ├── preject_spec.json # 项目输入输出定义信息 ├── preview.png # 项目导出时画布节点预览图 ├── REAMDME.md # 项目信息展示 ├── requirements.txt # 自动分析的依赖包列表 ├── run.py # 一键运行脚本 ├── api_server.py # 一键微服务脚本 ├── scan_components.py # 组件扫描器 ├── runner/ # 执行器模块 │ ├── component_executor.py │ └── workflow_runner.py # 工作流执行引擎 ├── components/ # 组件代码(保持原始目录结构) │ ├── base.py # 组件基类 │ └── your_components/ # 你的组件文件 └── inputs/ # 输入文件(模型文件、数据文件等) ``` --- ## 📊 功能状态(✅ 已实现|⏳ 计划中) - ✅ 可视化画布(NodeGraphQt) - ✅ 控制流:条件分支 / 循环 / 迭代 - ✅ 全局变量 + 表达式系统 - ✅ 动态代码组件(内置编辑器) - ✅ 智能节点推荐 - ✅ 一键导出独立项目(含 API) - ✅ 多运行环境管理 - - ✅ 并行执行 & 远程调度 - ⏳ 大模型上下文联动(黄/紫按钮) --- ## 🤝 贡献指南 1. Fork 本项目 2. 创建 feature 分支 (`git checkout -b feature/AmazingFeature`) 3. 提交代码 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 创建 Pull Request --- ## 📄 许可证 本项目采用 [GPLv3 许可证](LICENSE)。 --- ## 🙏 致谢 - [NodeGraphQt](https://github.com/jchanvfx/NodeGraphQt ) - 节点图框架 - [qfluentwidgets](https://github.com/zhiyiYo/PyQt-Fluent-Widgets ) - Fluent Design 组件库 - [Loguru](https://github.com/Delgan/loguru ) - Python 日志库 ## Star History Star History Chart