Extensions/LoRA分类加载
ComfyUI Extension

LoRA分类加载

按类别开关 LoRA(多标签 / 同类互斥 / 勾选联动 / 按子文件夹过滤 / 临时分类)+ 为每个 LoRA 挂载多套自定义提示词预设,勾选后输出为字符串

By katokinon·Created 17 days ago·Updated about 19 hours ago· 1
katokinon/ComfyUI-LoraCategoryLoader
Nodes—
On cloudLocal install
Stars1
Updatedabout 19 hours ago
Readme

ComfyUI LoRA 分类加载

把 LoRA 按类别管起来:按类别勾选、同类互斥、跨类别联动,选中即在节点内完成加载;
再配一套跟着 LoRA 走的提示词预设,勾哪条就输出哪条。

给 LoRA 起别名,节点里就只看到「胶片质感」这种好认的名字;鼠标悬停还能看样图和原文件名。

两种渲染模式都能用:旧版画布(legacy canvas)和新的 Nodes 2.0(Vue 渲染)都已适配。

装好后有三个东西:

| | 作用 | | ----------------- | -------------------------------------- | | 节点「LoRA分类加载」 | 按类别勾选 LoRA,加载后输出叠加好的 MODEL,外加名称与语法串 | | 节点「LoRA提示词选择」 | 按 LoRA 分组列出预设复选框,勾选后拼成一段提示词字符串 | | 管理面板 | 建类别、打标签(可多标签)、起别名、写提示词预设、传预览图、按文件夹自动归类 |


安装

把整个 ComfyUI-LoraCategoryLoader 目录放进:

ComfyUI/custom_nodes/ComfyUI-LoraCategoryLoader

重启 ComfyUI。不需要任何额外依赖。


快速上手

  1. 整理类别。打开管理面板(ComfyUI 顶部菜单的「LoRA 分类管理」,或浏览器访问
    http://<你的 ComfyUI 地址>/lora_category_loader),点 「按文件夹自动归类」 一键把
    models/loras 下的子目录名变成类别;也可以手动建类别、拖动排序、逐个打标签。
  2. 写预设、配图。点卡片上的 「提示词预设」,写好这个 LoRA 的完整提示词(一个 LoRA 可以有多条)。
    顺手把鼠标移到卡片图上配张预览图,之后在加载节点里悬停就能看到。
  3. 连节点。画布上加「LoRA分类加载」→ 把 LORA_NAMES 接到「LoRA提示词选择」→ 输出接文本编码。
    加载节点的 model 接基础模型。
  4. 日常使用。在加载节点的折叠面板里勾 LoRA(想只看某个模型目录就动一下顶部的子文件夹下拉),
    再把「LoRA提示词选择」接上文本编码并勾要用的预设。
  5. 临时凑一组?在面板底部新建临时分类,把 LoRA 拖进去即可(只影响当前工作流)。

节点「LoRA分类加载」

节点主体是一块折叠面板,按类别分组,每个类别可折叠,标题上带「单选 / 多选」徽章和勾选计数。

勾选规则

  • 一个 LoRA 可以挂多个类别标签,会同时出现在这几个类别里;行尾的 +N 表示它还挂在别处。
  • 勾选状态是全局的:同一个 LoRA 在几个类别里出现,就是同一份状态 —— 在任意一处点一下,
    其它几处同时变成勾选 / 取消。
  • 单选类别(同类互斥):点一个会关掉这个类别里原来那个;被关掉的那个如果同时挂在别的类别下,
    那边也会一起取消(启用状态只有一份)。
  • 多选类别:可以同时勾好几个。

拖动与摘标签

  • 拖拽 = 给这个 LoRA 加一个类别标签(写回全局配置,持久保存)。拖到分类区任意位置都行,
    靠近面板上下边缘会自动滚动。
  • 行尾的 ✕ = 把这个类别标签从该 LoRA 上摘掉(不影响勾选)。

强度

勾上的行右侧有一个强度框:

  • 可以直接输入数字;
  • 也可以按住左右拖动(横向 100px = 1.0),光标是左右箭头,拖起来很顺手;
  • 默认 1.0;只影响当前工作流,不写回全局配置;
  • 节点上的 global_strength 是总倍率,会乘到每个 LoRA 的强度上。

只作用于 UNET 侧 —— 常见的 LoRA 对文本编码器影响可以忽略,所以没有单独的 CLIP 强度。

别名与预览图

  • 行上显示的是别名(在管理面板里点名称就能改),没设别名时显示文件名。
  • 有预览图的 LoRA 名字后面有个小方框标记,鼠标悬停浮出预览图,设过别名的还会在图下面标出原文件名。

搜索与子文件夹过滤

面板顶部有搜索框(名称 / 别名都能搜)和子文件夹下拉。

如果你按模型分了目录(sdxl/…、flux/…),子文件夹下拉可以把面板收窄成「只看这一个文件夹」:

  • 选项来自 LoRA 相对路径的第一层目录,外加「全部文件夹」;如果有 LoRA 直接放在根目录,
    会多一个「(根目录)」。
  • 选择跟着工作流保存 —— 同一个工作流打开还是上次那个文件夹,不同工作流各记各的。
  • 过滤开着时,被过滤干净的类别会直接收起来,不留空壳。
  • 只有确实有 LoRA 落在子文件夹里时这个下拉才出现。

临时分类

面板底部可以新建临时分类。它只存在当前工作流,不写回全局配置 —— 适合「这一张图想临时凑几个
LoRA 一起上」。把上面任意 LoRA 拖进去即可(拖进去会顺手启用它,但不改它的类别标签);
行尾 ✕ 移出,标题上的 ✕ 删掉整个临时分类。

输入 / 输出

| 输入 | 说明 | | ----------------- | ------------------------------------------------------ | | model | 基础模型。可选:不接则不做实际加载,只输出 LORA_NAMES / LORA_SYNTAX | | selection | 折叠面板自动维护的状态(JSON),平时不用管 | | <每个类别一个下拉> | 降级界面,正常情况下被隐藏,见下 | | global_strength | 总强度倍率,乘以各 LoRA 自己的强度 |

节点「LoRA提示词选择」

  • 把上游的 LORA_NAMES 接进 lora_names。
  • 节点上按 LoRA 分组,把每个 LoRA 的预设列成复选框(像打钩日程)。分组标题用的是别名。
  • 每个 LoRA 单独一组「全选 / 清空」,顶部还有整体的「全选 / 全不选」。
  • 输出拼好的 PROMPT,直接接文本编码节点。

| 输入 | 说明 | | ------------------- | ------------------------------------- | | lora_names | 上游「LoRA分类加载」的 LORA_NAMES | | selection | 复选框状态(JSON),平时不用管 | | separator | 片段之间的分隔符:换行 / 双换行 / 逗号+空格 / 空格 | | prefix / suffix | 各算独立一段,跟正文用同一个分隔符隔开(不是首尾硬黏)。不用就留空 | | dedupe | 去掉完全重复的片段 |

| 输出 | 说明 | | -------- | --------------------- | | PROMPT | 勾选的提示词拼接结果 | | REPORT | 本次用了哪些 LoRA 的哪些预设,排查用 |

拼接顺序:

  1. LoRA 之间 → 按上游的加载顺序(= 管理面板里的类别顺序);
  2. 同一个 LoRA 内 → 按管理面板里预设的排列顺序(不是勾选先后);
  3. 分隔符 → prefix、正文、suffix 用它串起来。

勾选改动要重新执行才会生效:打钩只改状态,节点不会自动重跑;而「预览文本」这类节点显示的
永远是上一次执行的结果。「勾了却没变化」基本都是没重新执行 —— 按 Ctrl+Enter 再跑一次即可。


管理面板

浏览器打开 http://<你的 ComfyUI 地址>/lora_category_loader,或点顶部菜单的「LoRA 分类管理」。

类别

新建 / 改名 / 删除 / 拖动排序;每个类别标「单选」或「多选」。

「未分类」是兜底类别:一个 LoRA 没有别的标签时才会显示在这里,它不占显式标签。
所以从一个只有「未分类」的 LoRA 上把标签拖到别处,它就不再属于「未分类」了 —— 这是正常的。

新增 / 删除类别之后,需要让 ComfyUI 重新读取节点定义,节点上的下拉框才会更新:
点面板右上角「刷新节点定义」,或回到 ComfyUI 页面按 R。
只改标签归属、文件夹过滤、预设内容则不需要刷新。

筛选

  • 类别筛选可多选:点左侧类别即加入筛选,选两个以上时上方出现 「与 / 或」 ——
    「与」= 交集(必须同时属于这些类别),「或」= 并集(属于任意一个即可)。
    下面会有一行 筛选中:A 且 B 提示当前条件;点「全部」清空筛选。
  • 搜索框可以搜名称、别名、备注。
  • 按子文件夹筛选,和节点面板里那个是同一份数据。

LoRA 卡片

  • 卡片上是标签 chips,用「+ 加类别」追加、chip 上的 ✕ 摘掉;
    点图选中多张后可以批量操作:「+ 加标签 / - 去标签 / 设为唯一」。
  • 别名:点卡片上的名称就地改名(回车保存 / Esc 取消 / 点别处保存 / 留空还原成文件名)。
    别名只影响显示,不改动任何文件;设了别名时卡片名称下方会多显示一行原文件名。
  • 提示词预设:每个 LoRA 可以有多条完整提示词,可增删、可排序。
  • 预览图:鼠标移到卡片图上可上传 / 更换 / 删除。
  • 按文件夹自动归类:把 models/loras 下的子目录名直接变成类别,已经打过标签的不会被覆盖。

预览图

上传:管理面板里把鼠标移到 LoRA 卡片图上,右下角出现「上传图 / 换图 / 删除」。图片存在

<ComfyUI user 目录>/lora_category_loader/previews/

只接受 PNG / JPG / WEBP / GIF / AVIF(按文件魔数判断,SVG、HTML 这类会被拒),单张上限 8MB。
上传后立刻生效:管理面板显示,加载节点里悬停对应 LoRA 也会浮出小窗。

没上传时按顺序自动找:

  1. 本插件上传的图(优先级最高);
  2. 模型旁同名图:<LoRA名>.preview.png / <LoRA名>.png;
  3. LoRA Manager 的 sidecar(<模型名>.metadata.json)里的 preview_url,没有就看 civitai.images[].url;
  4. 常见预览图目录,如 models/lora_previews/<相同子目录结构>/<同名>.png。

远端图由浏览器直接加载,本插件不缓存、不下载。


数据存在哪

<ComfyUI user 目录>/lora_category_loader/library.json

放在 user 目录而不是插件目录,插件升级、重装、删了重下都不会丢配置。纯 UTF-8 JSON,
可以直接手改,改完插件会自动检测并重载。

结构:

{
  "version": 3,
  "categories": [
    { "id": "default", "name": "未分类", "mode": "multi", "order": 0 },
    { "id": "cat1a2b3c4d", "name": "风格", "mode": "exclusive", "order": 1 },
    { "id": "cat9f8e7d6c", "name": "人物", "mode": "multi", "order": 2 }
  ],
  "loras": {
    "风格/film_like.safetensors": {
      "categories": ["cat1a2b3c4d", "cat9f8e7d6c"],
      "alias": "胶片质感",
      "model_strength": 0.85,
      "notes": "",
      "presets": [
        { "id": "p1", "name": "预设一", "text": "你的提示词写在这里" },
        { "id": "p2", "name": "预设二", "text": "另一条提示词" }
      ]
    }
  }
}
  • LoRA 的主键是相对路径,跟着硬盘上的实际结构走。新出现的文件会自动归到「未分类」,打上标签即可。
  • categories 是类别 id 的列表,一个 LoRA 可以有多个。
  • alias 是显示用的别名(可空),只影响界面,不改动任何文件。
  • model_strength 是这个 LoRA 的默认强度(默认 1.0),节点里可以按工作流临时覆盖。
  • 挪进子文件夹 / 改名不用重新配:插件会按「文件名唯一匹配」把已有记录认领到新路径,
    标签、强度、预设、上传的预览图全都跟着走(控制台会打印 认领:旧路径 → 新路径)。
    如果两个目录下有同名文件(匹配不唯一)就不动手,宁可让你手动改,也好过张冠李戴。
  • 哪些配置跟着工作流、哪些跟着机器:勾选状态、强度覆盖、文件夹过滤、临时分类随工作流;
    类别、标签、别名、强度默认值、预设、预览图随机器。

已知限制

  • 折叠面板和打钩界面都是自定义前端组件,Nodes 2.0(新版 Vue 渲染)和旧版画布(legacy canvas)下都能用。 万一某个前端版本渲染失败,会自动降级到原生下拉框(少了多标签联动、临时分类、搜索、文件夹过滤)。
  • 拖拽是自己实现的(指针事件),没用浏览器原生 HTML5 拖拽(在画布上原生拖拽实测会中途断掉)。
    所以拖拽只在「LoRA分类加载」节点内部有效,不能把 LoRA 从别处拖进来。
  • 临时分类只活在当前工作流,换工作流就没了 —— 设计如此;要长期保留就建成正式类别。
  • 同一个 LoRA 挂多个标签会显示多行,但只是一份状态:勾一处、处处同步,加载时也只加载一次。
  • 「LoRA提示词选择」读的是上游当前的选择状态,必须先接上 LORA_NAMES 才会显示内容。
  • 类别数量上限 60,超过的部分不会出现在节点上(控制台会提示)。
  • 类别增删后,旧工作流里的下拉框值会被安全忽略:不会报 Required input is missing,
    也不会串到别的输入上;真正生效的始终是折叠面板写进 selection 的那份状态。
    加完类别记得点「刷新节点定义」让节点上的下拉框跟上。
  • 管理面板的批量条(+ 加标签 / - 去标签 / 设为唯一)要先在下拉里选中类别,否则只提示、不改数据。
  • 文件夹过滤按第一层目录分组,更深的层级会一起归到第一层。
  • extra_model_paths.yaml 里的额外 LoRA 目录同样能扫到。

自检

不需要 ComfyUI、不需要 torch,纯离线跑:

python tests/selftest.py

会用桩件模拟 ComfyUI 的 folder_paths,覆盖:扫描索引、预览图读取与上传、类别 / 别名 / 预设持久化、
多类别标签、LoRA 挪动后的自动认领、节点「LoRA分类加载」的动态下拉与状态解析、节点「LoRA提示词选择」的拼接顺序与分隔符。


和 ComfyUI-Lora-Manager 的关系

只做一件事:如果 LoRA Manager 给某个 LoRA 存过预览图,本插件就把那个图读出来显示(读它写在模型旁的
.metadata.json 文件格式,属于数据不是代码)。不依赖它、不引用它一行代码,两者可以同时装、同时用;
不装它也不影响本插件的任何功能。


HTTP 接口

管理面板用的接口(与 ComfyUI 同源,无单独鉴权):

| 方法 | 路径 | 说明 | | ---- | -------------------------------------------- | -------------------------------------------- | | GET | /lora_category_loader/api/state | 类别 + LoRA + 预设全量视图 | | POST | /lora_category_loader/api/rescan | 重新扫描 LoRA 目录 | | POST | /lora_category_loader/api/category | 新建 / 修改类别 | | POST | /lora_category_loader/api/category/delete | 删除类别 | | POST | /lora_category_loader/api/category/reorder | 调整类别顺序 | | POST | /lora_category_loader/api/lora | 保存单个 LoRA 的类别 / 别名 / 强度 / 预设 | | POST | /lora_category_loader/api/lora/tag | 加 / 减一个类别标签(add / remove,不动其他标签) | | POST | /lora_category_loader/api/lora/bulk | 批量改标签(add_category / remove_category)或强度 | | POST | /lora_category_loader/api/autotag | 按文件夹自动归类 | | GET | /lora_category_loader/api/preview?name= | 预览图(本地文件或 302 到远端) | | POST | /lora_category_loader/api/preview/upload | 上传预览图(multipart:name + file) | | POST | /lora_category_loader/api/preview/delete | 删除预览图 |


License

MIT