14 KiB
14 KiB
ComfyUI_FindModels 项目交接文档
更新时间:2026-06-18 当前分支:
main当前项目版本:1.26.8上一发布基线:v1.25.0当前状态:代码清理、识别改进和 UI 重构已完成,运行文件已同步到实际 ComfyUI 插件目录 发布约束:只有用户明确要求时才提交或上传 GitHub
1. 项目目标
ComfyUI_FindModels 是 ComfyUI 自定义插件,目标是参考 ComfyUI 内置“工作流总览”的依赖识别方式,完成以下工作:
- 快速、准确识别当前工作流真正缺失的模型和自定义节点。
- 只显示尚未解决的依赖;已安装、已加载、已迁移的项目立即消失。
- 从 ComfyUI 已注册模型目录或用户选择的外部模型库精确匹配模型。
- 下载和迁移模型时严格使用 ComfyUI 或对应插件注册的官方模型分类目录。
- 为模型提供文件大小、可信下载来源、进度、速度、耗时、暂停、继续和取消。
- 根据工作流包元数据和可信映射识别缺失节点,并安全安装插件及其依赖。
2. 关键路径与仓库状态
| 项目 | 位置或状态 |
|---|---|
| 本地仓库 | <workspace>/ComfyUI_FindModels |
| 实际插件目录 | <ComfyUI>/custom_nodes/ComfyUI_FindModels |
| GitHub | https://github.com/mclaughlinrosemary927/ComfyUI_FindModels |
| ComfyUI 模型根目录 | <ComfyUI>/models |
| 外部模型库 | 用户在设置页选择,配置文件仅保存在本机 |
| 最新测试 | 104 tests passed |
当前工作区未提交文件:
PROJECT_HANDOFF.md
find_models.py
node_installer.py
tests/test_download_helpers.py
tests/test_node_installer.py
web/find_models.css
web/find_models.js
不要使用 git reset --hard、git checkout -- 等会丢失当前修改的命令。
3. 整体架构
flowchart LR
A["ComfyUI 当前工作流"] --> B["web/find_models.js\n采集节点、widgets、aux_id"]
B --> C["POST /findmodels/scan"]
C --> D["model_finder.py\n提取、分类、匹配模型"]
C --> E["node_installer.py\n识别缺失节点包"]
C --> F["find_models.py\n外部库精确索引"]
D --> G["缺失模型 / 可加载模型"]
E --> H["缺失节点包"]
F --> G
G --> I["本地加载 / 外部迁移 / 精确下载"]
H --> J["可信 GitHub 插件安装"]
I --> K["立即刷新并移出缺失列表"]
J --> K
模块边界
| 文件 | 主要职责 |
|---|---|
model_finder.py |
从工作流提取模型引用、分类、读取已注册模型、判断 installed/adaptable/missing |
find_models.py |
HTTP 路由、外部模型库索引、模型迁移、来源查询、下载任务、节点安装入口 |
node_installer.py |
缺失节点包分组、可信仓库候选、插件安装、依赖冲突保护 |
web/find_models.js |
工作流快照、自动扫描、右侧面板、加载/定位/下载/安装交互 |
web/find_models.css |
原生右侧面板风格、四个独立标签页、响应式布局 |
tests/ |
模型识别、目录规则、下载安全、夸克、节点包和依赖保护回归测试 |
4. 不可改变的关键决策
4.1 模型识别
- 优先读取实时 widget、序列化 widget、嵌套自定义 widget 和工作流嵌入模型元数据。
- 支持动态加载器、多 LoRA、翻译控件、LLM、GGUF、ONNX 等自定义模型控件。
- 忽略 bypass/disabled 节点、自由文本、URL、Markdown、注释和非加载器中的泛化
model字段。 - 同一模型合并显示一次,但保留全部引用节点。
- 不通过扩大模糊扫描范围修复漏报;每个真实案例必须增加回归测试。
4.2 installed、adaptable、missing
- 节点值与 ComfyUI 注册相对路径完全一致:
installed,不显示。 - 文件名完全一致但节点保存了错误前缀或旧路径:
adaptable,显示“加载本地模型”。 - 文件不存在:
missing,显示外部候选或下载来源。 - 相似文件名不能自动替换,只能作为人工搜索参考。
- 加载成功后前端立即移除,并通过后续扫描确认,不能短时间再次出现。
4.3 官方模型目录
- 目标目录由
folder_paths或具体插件注册的模型分类决定。 - 禁止使用工作流节点中的路径前缀推断目标目录。
- 下载和外部迁移都使用目标分类根目录和原始
basename,不得添加自定义前缀。 unknown分类禁止自动迁移或下载。- 永不覆盖已有文件。
关键分类:
| 分类 | 目标目录 |
|---|---|
diffusion_models |
models/diffusion_models,兼容读取旧 models/unet |
loras |
models/loras |
text_encoders |
models/text_encoders,兼容读取 models/clip |
vae |
models/vae |
LLM |
大小写敏感的 models/LLM |
instantid |
对应插件注册的 models/instantid |
sams |
对应插件注册的 models/sams |
ultralytics_bbox |
对应插件注册的检测模型目录 |
4.4 外部模型库
- 扫描当前工作流时,优先按所需文件名和官方分类目录进行精确搜索。
- 分类目录搜索不到时才递归搜索整个外部库。
- 精确结果立即返回;完整索引在后台刷新。
- 支持多层目录和
.safetensors、.gguf、.onnx、.pth、.pt、.bin等格式。 - 迁移前必须确认分类;迁移后清理 ComfyUI 文件名缓存并立即刷新 UI。
已验证案例:
diffusion_models/Wan/Wan2.1-InfiniteTalk_Single_Q6_K.ggufmodels/LLM下的主 GGUF 和mmproj文件- 多 LoRA 节点中带中文或旧目录前缀的模型名
4.5 缺失节点与插件安装
- 缺失节点按工作流
aux_id对应的插件包分组,不按单个节点类型重复显示。 - 模型引用不得混入缺失节点列表。
- 插件来源优先级:
- 工作流
aux_id明确提供的owner/repository。 - ComfyUI-Manager 官方节点映射。
- 用户明确输入的 HTTPS GitHub 仓库。
- 工作流
- 普通 GitHub 搜索结果不能自动安装。
- 安装时优先使用当前启动器配置的 Python、Git 和代理。
- 安装依赖前执行 dry-run,阻止带版本约束地修改
torch、xformers、triton、onnxruntime等核心依赖。 - 安装后执行
pip check;出现新增依赖冲突时安装失败,不启用临时插件目录。
4.6 下载安全
- 只有远程文件名与缺失模型文件名完全一致时才允许直接下载。
- 只接受允许列表中的 HTTPS 主机,拒绝未知主机、HTML 错误页和 Git LFS 指针。
- 下载目标必须是已注册的官方模型分类目录。
- 支持暂停、Range 续传、重试、取消、速度、已耗时和剩余时间。
- 面板关闭后任务继续;重新打开后从后端任务状态恢复。
- 两个固定夸克分享库:
https://pan.quark.cn/s/fb913d649b18https://pan.quark.cn/s/4680ac866516
- 夸克公开分享受权限、token 和限速影响;可选登录 Cookie 仅保存在本地忽略文件中,绝不能提交。
- 夸克失败时回退到文件名完全一致且可验证的 Hugging Face/Civitai 来源。
5. 已完成功能
模型
- checkpoints、LoRA、VAE、ControlNet、text encoders、diffusion models、embeddings、upscale、检测模型、LLM 等分类识别。
- WanVideo、FantasyTalking、InfiniteTalk、多 LoRA 和 Llama-cpp/mmproj 案例。
- 本地精确文件名匹配和路径修正。
- 外部模型库多层精确搜索、大小显示和官方目录迁移。
- 迁移、下载或加载后立即移出缺失列表。
- 模型名复制、引用节点定位和下载来源查询。
- 本地模型候选仅接受不区分大小写的完全同名文件,固定显示为
99%;相似名不再提供自动加载。 - 未知分类会结合节点
INPUT_TYPES、动态folder_paths注册、本地候选分类和外部目录提示解析官方目录。
节点
- 读取
aux_id/ver,按插件包分组。 - 定位节点、重新查找候选、GitHub 搜索、自定义链接安装。
requirements.txt安装开关和依赖冲突保护。- 节点安装任务显示分阶段绿色进度条。
- 已验证
AudioDurationToFrames可归入syq890610-crypto/Comfyui-Mk-tools。
UI 与生命周期
- 顶部运行栏“查找模型”按钮。
- 默认不弹出,点击后挂载到 ComfyUI 原生右侧 SplitterPanel。
- 缺失模型、缺失节点、下载任务、设置四个独立页面。
- 关闭后可再次打开,下载任务不停止。
- 工作流切换触发快速本地扫描,随后异步补充外部候选信息。
- 夸克设置页动态显示两个分享库状态并支持连接检测;搜索会分页递归至深层目录。
6. 本轮未提交优化
本轮优化已经完成并同步到实际插件目录,但尚未提交 Git:
- 删除 3 个无调用 Python 助手函数。
- 删除 4 个前端未使用的旧 HTTP 兼容接口。
install_market_plugin重命名为准确的install_plugin。- 删除无效
panelUserOpened状态和render的无效参数。 - 删除错误的第三个夸克兼容链接,仅保留用户指定的两个分享库。
- 将多轮叠加的 CSS 重写为单一规则集,删除重复选择器和相互覆盖样式。
- 更新测试名称和夸克链接精确断言。
- 净减少约 121 行代码。
实际插件目录已同步以下运行时文件,并完成 SHA-256 一致性检查:
find_models.py
node_installer.py
web/find_models.js
web/find_models.css
7. 重要文件修改记录
model_finder.py
- 建立显式模型 widget、动态 widget 和嵌套值提取规则。
- 增加官方分类别名和插件动态分类。
- 支持 LLM/mmproj、InfiniteTalk、检测模型、多 LoRA。
- 严格区分精确路径、精确文件名和相似候选。
find_models.py
- 实现扫描、外部目录选择、迁移、来源查询、下载任务和节点安装路由。
- 外部库按当前缺失文件名进行快速精确索引。
- 目标目录统一从 ComfyUI 注册分类解析。
- 下载支持校验、续传、进度和失败回退。
- 本轮删除旧同步下载、单任务进度和旧外部目录读写接口。
node_installer.py
- 按
aux_id分组缺失节点包。 - 可信 GitHub 仓库候选及 URL 验证。
- 安装环境解析、依赖 dry-run、核心依赖保护和
pip check。 - 本轮统一安装函数命名为
install_plugin。
web/find_models.js
- 采集实时工作流和前端注册节点。
- 快速扫描、防过期请求覆盖、工作流切换监听。
- 原生右侧面板挂载和关闭恢复。
- 模型加载、外部迁移、来源查询、下载控制、节点安装。
- 本轮删除无效面板状态及无效渲染参数。
web/find_models.css
- 重新整理为单一 344 行规则集。
- 保留原生右侧停靠、完整模型名、四标签页、下载状态和响应式布局。
- 删除历史 UI 版本遗留的重复选择器和覆盖链。
测试
tests/test_model_finder.py:识别、分类、路径适配、多 LoRA、LLM。tests/test_download_helpers.py:官方目录、外部库、下载校验、夸克、任务状态。tests/test_node_installer.py:包分组、可信仓库、依赖保护。
8. 当前待办事项
P0:真实 ComfyUI UI 回归
- 重启 ComfyUI 并执行
Ctrl+F5,确认新 CSS 和 Python 路由生效。 - 验证右侧原生面板打开、关闭、再次打开和 SplitterPanel 拖动。
- 验证四个标签页仅显示各自内容,长模型名完整换行。
- 验证本地路径适配、外部迁移、下载完成后缺失项立即消失且不反复出现。
- 验证下载暂停、继续、速度、耗时和剩余时间。
P1:真实工作流案例持续对齐
- 对用户后续提供的每个漏报或误报工作流,先提取真实 widget/metadata,再添加回归测试。
- 继续与内置“工作流总览”的缺失模型、缺失节点结果逐案例对比。
- 不引入泛化字符串扫描来掩盖单个加载器的识别问题。
P1:插件更新失败回滚
- 新插件在临时目录安装失败时已经清理。
- 已存在插件执行
git pull后,如果依赖安装失败,目前不会自动回退 Git 提交。 - 后续可增加更新前记录提交、失败后非破坏性回退机制。
P2:提交与发布
- 用户确认真实 ComfyUI 回归通过后,检查 diff、更新版本号、提交并上传 GitHub。
- 本地路径、外部目录配置、Cookie、缓存和下载临时文件不得提交。
9. 验证命令与当前结果
cd <workspace>/ComfyUI_FindModels
python -m unittest discover -s tests
python -m py_compile find_models.py model_finder.py node_installer.py __init__.py
node --check web\find_models.js
git diff --check
git status --short
当前结果:
Ran 104 tests
OK
Python compile: passed
JavaScript syntax: passed
CSS brace validation: passed
git diff --check: passed
10. 下一会话建议执行顺序
- 阅读本文件。
- 执行
git status --short,保留当前未提交修改。 - 执行第 9 节完整测试。
- 核对实际插件目录中的运行时文件与仓库一致。
- 优先完成第 8 节 P0 真实 ComfyUI 回归。
- 遇到漏报/误报时添加最小回归测试后再修改识别规则。
- 修改后重新同步实际插件目录并校验文件哈希。
- 只有用户明确要求时才提交或上传 GitHub。
11. 验收标准
- 与“工作流总览”的缺失依赖结果一致,或差异有明确技术理由。
- 真正缺失的模型和节点全部显示,无注释、模型或前端辅助节点误报。
- 本地已存在但节点路径错误的模型可一键加载。
- 加载、迁移或下载后立即消失,后续扫描不重新出现。
- 下载和迁移严格进入官方注册目录,不添加多余文件名前缀。
- 下载文件名完全一致、来源可信、进度可恢复。
- 插件安装不破坏 ComfyUI 核心 Python 环境。