ComfyUI 美化增强插件,提供节点收藏管理、工作流管理、主题美化、编组管理、快速节点等功能。
| 模块 | 核心能力 |
|---|---|
| ⭐ 节点收藏 | 右键收藏任意节点 / 多节点,拼音搜索、使用频率排序、最近使用、分类管理 |
| 📋 工作流管理 | 多级嵌套文件夹、拖拽导入节点、拼音搜索、回收站、夺舍模式接管官方 UI |
| 🎨 主题美化 | 多套预设色系、自定义渐变配色、实时预览、一键导出 / 导入配置 |
| ⚡ 快速节点 | 连线即出常用节点、搜索框快速添加、夺舍模式、配置导入导出 |
| 📐 田字格对齐 | 6 种对齐 + 4 种分布、拖拽尺子等距分布、长按自动布局、可自定义间距 |
| 📦 视觉编组 | 半透明框体、彩虹 / 呼吸 / 辉光动画、同级别反选、锁定、组内执行、自动收纳 |
| ⌨️ 自定义快捷键 | 后端持久化快捷键配置(换浏览器不丢失)、执行全图/选中节点/编组内节点、Ctrl+G 官方/小珠光编组选择、主题导出导入含快捷键 |
| 🕶️ 隐藏菜单 | 任意菜单项上鼠标中键点击直接隐藏该菜单项;主题面板「菜单隐藏」页集中查看 / 一键恢复、含「使用说明」标签;配置持久化到后端,云端换浏览器不丢失 |
| 📦 配置云持久化 | 收藏/工作流元数据/快捷键/菜单隐藏/面板宽度等写入后端存储,云端环境跨会话、跨浏览器共享(/xzg_cloud_store) |
| 🖼 图像节点 | 图像加载器(拖入上传/多图模式)、图像保存(懒编码+化神级自定义输出)、图像对比、分割/合并、智能裁剪 ATBC、图像回贴 ATR、人脸对齐 Face Align、图像预览 |
| 🎬 视频节点 | 视频加载器(1GB 分块上传 + 并发重试 + 4K 高清预览)、视频信息读取、帧提取、首尾帧、帧优化、合并视频 |
| 🔊 音频节点 | 音频加载器(大小限制 + 解码律动进度条 + 拖入上传 + 播放头精准交互)、音频保存、AudioDiT 离线 TTS(音色克隆/零样本/多人对话) |
| 🤖 大模型节点 | Qwen/Qwen-VL 模型加载与推理、MiniMax H3 提示词处理 |
| 🔧 实用节点 | 选择器 / 布尔(+反向)/ 数据阻断(+比较大小)/ 标题 / 滑条 / 万能滑条 / 编号切换(惰性求值)/ 随机种子 / 获取控件值 / 输入惰性判断 / SAM 点编辑器 / 文本框(数字→中文) |
| 🌐 国际化 | 遵循 ComfyUI 官方 i18n 规范,中英文界面自动切换 |
💡 全部功能均可通过右键菜单、快捷键或面板一键调用,开箱即用、零外部依赖。
本插件遵循 ComfyUI 官方 i18n 规范(PR #6558):
locales/ 目录下,按语言代码分目录:locales/en/(英文,与源一致)、locales/zh/(中文)。nodeDefs.json(节点显示名、输入/输出端口名)与 main.json(节点分类名)。| 节点名称 | 说明 |
|---|---|
| 小珠光选择器 | 点击按钮选择标签,输出对应整数值 |
| 小珠光布尔 / 反向布尔 | 开关切换 True/False;反向布尔输入取反 |
| 小珠光数据阻断 / 比较大小-数据阻断 | 开关控制数据是否传输;按大于/等于/小于比较值决定数据通断 |
| 小珠光标题 | 标题装饰节点,无实际输出 |
| 小珠光滑条 | 通过滑块调整浮点数值 |
| 小珠光万能滑条 | 浮点/整数双模式切换,右键切换类型 |
| 小珠光编号切换 | 0–49 路输入选择器,在多种数据类型间切换;惰性求值:仅执行被选中编号的上游支路,其余支路不计算 |
| 小珠光随机种子 | 标准 seed 输入与随机化功能,防止重复拦截 |
| 小珠光点编辑器 | SAM 点坐标可视化编辑器 |
| 小珠光获取控件值 | 读取工作流中指定节点的控件当前值 |
| 小珠光文本框 | 双通道文本输出,默认将阿拉伯数字智能转换为中文(量词/单位/序数/日期时间/中文口语时间、身高米数、纯数字完整读数、分辨率例外) |
| 🖼 图像处理节点 | |
| 小珠光图像加载器 | 支持拖入上传、多图/单图模式、拼音搜索、棋盘格透明背景显示;多图网格中心对齐,缩略图黑底无灰框 |
| 小珠光图像预览 | 图像预览节点 |
| 小珠光图像保存 | 保存图像,支持懒编码 + 右键保存真实分辨率 |
| 小珠光图像保存-化神级 | 自定义输出路径、文件夹选择器、JPEG/PNG/WebP 多格式 |
| 小珠光图像对比 | 两张图像并排对比查看 |
| 小珠光 IS (图像分割) / IM (图像合并) | 将图像按行列分割;将分割图像合并回原图 |
| 小珠光 ATBC (智能裁剪) | 按目标尺寸智能裁剪与补边 |
| 小珠光 ATR (图像回贴) | 将处理后的子图按坐标回贴回原图 |
| 小珠光 Face Align (人脸对齐) | 人脸关键点检测与对齐 |
| 🎬 视频处理节点 | |
| 小珠光视频加载器 | 分块上传支持最大 1GB、3 路并发 + 重试、自定义进度对话框 |
| 小珠光视频信息读取 | 读取视频分辨率、帧率、时长、总帧数等元信息 |
| 小珠光帧提取 | 按步长/间隔从视频抽取指定帧 |
| 小珠光首尾帧 | 提取视频的第一帧与最后一帧 |
| 小珠光帧优化 | 复制首帧填充到指定长度(去首帧闪烁) |
| 小珠光合并视频 | 将图像序列合成为视频(可搭配音频) |
| 🔊 音频处理节点 | |
| 小珠光音频加载器 | 上传大小限制、解码进度律动动画、拖入上传、双击上传、播放头精准交互 |
| 小珠光音频保存 | 保存音频到文件 |
| 🤖 大模型节点 | |
| 小珠光 MiniMax H3 提示词 | MiniMax H3 提示词处理节点 |
| 小珠光 Qwen Model Loader | Qwen 系列模型加载器 |
| 小珠光qwenVL | Qwen-VL 多模态指令跟随节点(依赖 transformers) |
| 小珠光 AudioDiT 零样本TTS | 严格离线版 LongCat-AudioDiT 零样本合成(与原插件共享模型目录,永不触发 HF 下载) |
| 小珠光 AudioDiT 音色克隆TTS | 严格离线版音色克隆:参考音频 3–15s + 转录文本 → 目标语音,最常用节点 |
| 小珠光 AudioDiT 多人对话TTS | 严格离线版多说话人对话:2–10 个克隆音色 + [speaker_N]: 台词标签驱动逐段合成 |
| 🧪 实用杂项节点 | |
| 小珠光输入惰性判断 | 判断输入是否被真实连接到下游使用 |
| 场景 | 输入示例 | 输出结果 |
|---|---|---|
| ① 乘积 / 分辨率(按位读 + 乘以 连接) | 1280x7201920×10801x2x3 | 一二八零乘以七二零 一九二零乘以一零八零 一乘以二乘以三 |
| ② 数字 + 量词/单位(完整读数 + 英文缩写自动转中文) | 1个女孩12岁身高188cm体重75kg温度36.5℃电压220V12% | 一个女孩 十二岁 身高一百八十八厘米 体重七十五千克 温度三十六点五摄氏度 电压二百二十伏 百分之十二 |
| ③ 第 / 其 前缀(序数) | 第12章第1名第3次第5届 | 第十二章 第一名 第三次 第五届 |
| ④ 其他(纯编号/代码/串号)(按位读) | 型号1280编号12和13 | 型号一二八零 编号一二和一三 |
💡 规则说明:只有当数字紧跟白名单内的量词/单位时,才会按「完整读数」读出;其他场景默认按位读,避免将编号读错。支持的乘号:
xX×*(前后可带空格)。支持的英文缩写:cm → 厘米、kg → 千克、km → 千米、mm → 毫米、L/mL → 升/毫升、V → 伏、A → 安、W → 瓦、℃/℉ → 摄氏度/华氏度等。
复用 LongCat-AudioDiT 原插件的建模库与推理流程,但 100% 剥离「推理时自动从 HuggingFace 下载模型/tokenizer」 的行为。 解决原插件痛点:即便本地已经下载了模型,只要 HuggingFace 不通,tokenizer 检查那一步仍会卡住 / 失败。
| 依赖 | 说明 |
|---|---|
ComfyUI-LongCat-AudioDIT-TTS 原插件 | 放在 ComfyUI/custom_nodes/ComfyUI-LongCat-AudioDIT-TTS/,本节点复用其 audiodit 建模库代码(不必卸载原插件,双方节点可共存) |
| LongCat-AudioDiT 模型目录 | 放在 ComfyUI/models/audiodit/目录名/,与原插件共享同一目录(推荐先用原插件自动下载一次,之后永远切到小珠光离线版用) |
| UMT5 tokenizer | 放在 ComfyUI/models/audiodit/umt5-base-tokenizer/,至少含 tokenizer_config.json + spiece.model(或 tokenizer.json) |
| comfy_api v3(可选) | 「多人对话 TTS」节点依赖 comfy_api.latest.IO(DynamicCombo),未安装则仅跳过多人节点,其它两个节点仍正常 |
| Python 类 | 显示名(中/英) | 输入 | 说明 |
|---|---|---|---|
XzgAudioDiTTTS | 小珠光 AudioDiT 零样本TTS / Xiaozhuguang AudioDiT Zero-Shot TTS | text, steps, guidance, device, dtype, attention, seed, keep_model_loaded | 纯文本文字转语音,无参考音色 |
XzgAudioDiTVoiceCloneTTS | 小珠光 AudioDiT 音色克隆TTS / Xiaozhuguang AudioDiT Voice Clone TTS | text + prompt_audio + prompt_text + steps/guidance/device/dtype/… | 最常用:参考音频(3–15s)和对应转录文本 → 克隆音色朗读目标文本 |
XzgAudioDiTMultiSpeakerTTS | 小珠光 AudioDiT 多人对话TTS / Xiaozhuguang AudioDiT Multi-Speaker TTS | num_speakers(2–10) + 对应 speaker_N_audio / ref_text + [speaker_1]: 台词 文本 | 逐轮克隆多音色合成;每轮后加 configurable 静音;ComfyUI v3 API 可用 |
LongCat 原插件 nodes/loader.py 的三条联网路径:
| 原函数 | 行为 | 小珠光离线版怎么替换 |
|---|---|---|
get_model_names() | 把 LongCat-AudioDiT-1B (auto download) 这种本地不存在的"虚项"也列到下拉菜单,迷惑用户 | scan_local_models() 只列真实存在于磁盘的目录,空则给占位项带警告 |
resolve_model_path() → _auto_download_model() | 本地没找到就 snapshot_download,网络不通直接卡 | resolve_model_path_xzg() 直接抛清晰的 FileNotFoundError,带本地目标路径 + HF 仓库 URL + 手动放置指引 |
_ensure_tokenizer_downloaded() | umt5 缺失 → snapshot_download → 网络不通就炸 | _find_local_tokenizer() 4 级本地回退:① models/audiodit/umt5-base-tokenizer ② 同层 umt5-base 目录 ③ ~/.cache/huggingface/hub/... snapshot ④ 原插件内兜底 → 都没有才报错并给出下载指引 |
AudioDiTModel.from_pretrained(...) | 没写 local_files_only=True,transformers 会联网补缺失文件 | 强制 local_files_only=True,且 AutoTokenizer.from_pretrained(本地路径, local_files_only=True) |
① 安装原插件 ComfyUI-LongCat-AudioDIT-TTS
↓ 让它自动把 3.5B-bf16 模型和 tokenizer 下好
② 从 ComfyUI 节点菜单切换到 「小珠光_音频 / Xiaozhuguang_Audio」分类
↓ 使用三个离线节点:零样本 / 音色克隆 / 多人对话
③ 之后即便 HuggingFace 完全无法访问,节点依然正常工作
(模型和 tokenizer 全走本地,完全不触网)
在画布任意节点或空白处右键即可使用收藏功能。
| 操作 | 方式 |
|---|---|
| 收藏节点 | 右键节点 → 选择「收藏节点」 |
| 收藏多节点 | 框选 2+ 节点 → 右键 → 选择「收藏多节点」 |
| 添加到画布 | 点击收藏面板中的节点名称 / 多节点项 |
| 取消收藏 | 右键收藏项 → 选择「取消收藏/删除工作流」 |
xzg 可搜索到「小珠光选择器」「小珠光滑条」等xiaozhu 同样匹配| 按钮 | 模式 | 排序规则 |
|---|---|---|
| 🔥 | 使用频率 | 使用次数 → 上次使用时间 |
| ⏱️ | 最近使用 | 上次使用时间 |
| A | 名称 | 按名称字母 / 拼音顺序 |
Q 键,可在面板设置中自定义提供丰富的节点主题预设与自定义配色功能。
内置多套主题色系,一键切换节点配色。
自定义快速节点功能,从节点拉出连线时可快速选择常用节点,提升工作流搭建效率。
| 操作 | 方式 |
|---|---|
| 添加到快速节点 | 右键节点 → 选择「☆ 添加到快速节点」 |
| 从快速节点移除 | 右键节点 → 选择「⭐ 从快速节点移除」 |
💡 快速节点菜单位于节点右键菜单「小珠光主题」上方。
从节点输出口拉出连线到空白处松开,菜单顶部会显示快速节点列表,点击即可创建并自动连线。
双击空白画布打开节点搜索框,搜索框顶部显示快速节点列表,点击即可添加到画布。
按 C 键打开小珠光主题面板,切换到「快速节点」Tab:
| 功能 | 说明 |
|---|---|
| 拖拽排序 | 按住左侧拖拽手柄上下拖动调整顺序 |
| 移除节点 | 点击右侧「移除」按钮 |
| 清空全部 | 一键清空所有快速节点 |
| 导出配置 | 将快速节点配置导出为 JSON 文件备份 |
| 导入配置 | 从 JSON 文件导入快速节点配置 |
在快速节点管理面板中可开启「夺舍模式」,开启后从节点拉出连线时将只显示自定义快速节点,不显示系统默认菜单。
完整的工作流管理系统,支持分类存储、搜索、拖拽导入等功能。
`(反引号),可点顶部「快捷键」按钮自定义txlj 匹配「图像连接」;tuxiang 同样匹配Ctrl+S / 顶栏),保存后本面板会自动同步显示` 键,可在面板设置中自定义可视化节点对齐工具,通过田字格面板快速对齐和分布多个节点,支持拖拽尺子等距分布和长按自动布局。
Alt + A,可在面板设置中自定义点击田字格中的对应线条即可对齐:
| 线条 | 功能 | 说明 |
|---|---|---|
| │ 左侧竖线 | 左对齐 | 所有节点左边对齐到最上方节点的左边缘 |
| │ 中间竖线 | 水平居中 | 所有节点水平中心对齐到最上方节点的中心 |
| │ 右侧竖线 | 右对齐 | 所有节点右边对齐到最上方节点的右边缘 |
| ─ 上方横线 | 上对齐 | 所有节点顶边对齐到最左侧节点的上边缘 |
| ─ 中间横线 | 垂直居中 | 所有节点垂直中心对齐到最左侧节点的中心 |
| ─ 下方横线 | 下对齐 | 所有节点底边对齐到最左侧节点的下边缘 |
点击田字格中的四个区域即可分布:
| 区域 | 功能 | 说明 |
|---|---|---|
| ◱ 左上区域 | 左对齐 + 垂直等距分布 | 左对齐的同时垂直方向均匀分布 |
| ◰ 右上区域 | 右对齐 + 垂直等距分布 | 右对齐的同时垂直方向均匀分布 |
| ◳ 左下区域 | 上对齐 + 水平等距分布 | 上对齐的同时水平方向均匀分布 |
| ◲ 右下区域 | 下对齐 + 水平等距分布 | 下对齐的同时水平方向均匀分布 |
按住中心点并向四个方向拖拽,出现尺子后根据拖拽距离进行等距分布:
按住中心点 1.5 秒 触发自动布局:
| 设置项 | 说明 |
|---|---|
| 水平间距 | 水平分布时的节点间距(默认 100px) |
| 垂直间距 | 垂直分布时的节点间距(默认 50px) |
| 主题色 | 自定义田字格面板主题色 |
| 快捷键 | 自定义打开面板的快捷键 |
视觉化节点编组工具,通过半透明框体将节点组织在一起,支持颜色、动画、绕过等多种功能。
| 方式 | 操作 |
|---|---|
| 快捷键 | 框选节点后按 Ctrl + G(默认,可在设置中修改) |
| 右键菜单 | 框选节点后右键空白画布 → 选择「📦 小珠光编组」 |
| 操作 | 方式 |
|---|---|
| 创建编组 | 选中节点后按 Ctrl + G |
| 移动编组 | 按住标题栏拖拽(框内节点跟随移动) |
| 调整大小 | 拖拽右下角 ↘ 手柄 |
| 删除编组 | 点击标题栏右侧的 × 按钮 |
| 切换绕过 | 左键单击标题栏中间区域(框内节点被绕过/恢复) |
| Ctrl+点击框体 | 按住 Ctrl 左键点击框体任意位置,快速切换绕过 |
| 打开设置 | 右键标题栏任意位置 |
| 滚轮缩放 | 在标题栏滚动滚轮缩放画布 |
| 编组嵌套 | 编组框可以包含其他更小的编组框,支持多层嵌套 |
通过点击标题栏不同区域,快速切换同级编组的绕过状态:
| 操作 | 效果 |
|---|---|
| 点击标题栏左侧 1/5 | 被点击的编组开启,同一级别的其他编组全部绕过 |
| 点击标题栏右侧 1/5 | 被点击的编组绕过,同一级别的其他编组全部开启 |
| 点击标题栏中间 3/5 | 单独切换当前编组的绕过/开启状态 |
💡 同级别指拥有相同父编组(或都在根层级)的编组。大编组内的小组与最外层编组不属于同一级别。
| 操作 | 方式 |
|---|---|
| 锁定/解锁单个编组 | 点击标题栏 🔒 锁图标(锁定后无法拖动和调整大小) |
| 一键锁定/解锁所有编组 | 按住 Ctrl + 鼠标左键点击任意锁图标 |
锁定后编组框的标题栏锁图标变为红色,禁止拖拽移动和调整大小。
| 操作 | 方式 |
|---|---|
| 执行当前编组 | 鼠标位于编组框内时按 F 键 |
按下 F 键后,只会执行当前编组(及其子编组)内的输出节点及其上游依赖,不会运行整个工作流。
💡 如果安装了 rgthree 插件,会优先调用 rgthree 的排队功能;否则使用内置实现。
右键标题栏打开设置面板,默认显示在画布右侧,标题栏可拖拽移动。
| 设置项 | 说明 |
|---|---|
| 名称 | 自定义编组显示名称,修改后实时显示 |
| 文字大小 | 调整标题文字大小(6–48px),默认 14px |
| 文字颜色 | 点击右侧颜色块可自定义标题文字颜色 |
| 背景色 | 点击七彩渐变条可自定义标题栏背景色 |
| 透明度 | 调整标题栏背景透明度(0–100%) |
| 设置项 | 说明 |
|---|---|
| 边框颜色 | 点击七彩渐变条可自定义边框颜色 |
| 边框粗细 | 调整边框宽度(1–10px),默认 2px |
| 边框透明度 | 调整边框透明度(5–100%) |
| 边框动画 | 选择边框动画效果 |
| 动画速度 | 调整动画速度(1–10) |
| 效果 | 说明 |
|---|---|
| 无 | 静态边框 |
| 渐变彩虹 🌈 | 边框色相随时间循环变化 |
| 明暗呼吸 💨 | 边框亮度按正弦波呼吸变化(使用当前颜色) |
| 辉光 ✨ | 发光效果,亮度脉动变化(使用当前颜色) |
| 流光溢彩 🎆 | 多色锥形渐变边框旋转流动 |
| 流光溢彩+明暗呼吸 | 流光溢彩 + 亮度呼吸叠加效果 |
| 设置 | 说明 |
|---|---|
| 开关 | 开启后画布移动时编组框渐隐,停止后渐入 |
| 渐入时间 | 调整渐入动画时长(1–10秒) |
Ctrl + ?)| 按钮 | 说明 |
|---|---|
| 使用说明 | 打开编组功能使用说明 |
| 应用到全部 | 一键将当前颜色、动画等设置应用到所有编组 |
| 取消 | 放弃本次修改 |
| 应用 | 保存并应用设置 |
编组框体会自动检测内部节点:
编组信息(位置、大小、颜色、动画、绕过状态等)会随工作流自动保存和恢复,保存/加载工作流时无需额外操作。
2px solid hsla(H,S%,L%,0.65) 半透明边框hsla(280,60%,55%,0.55)后端持久化的快捷键系统,配置存储于 ComfyUI 用户目录 user/xiaozhuguang/xzg_shortcuts.json(位于插件目录之外,更新 / 整体替换插件不会丢失快捷键),换浏览器、换服务器不丢失。升级后首次启动会自动把旧版插件目录下的 xzg_shortcuts.json 迁移过来。
| 动作 | 说明 |
|---|---|
| 执行全图 | 执行整个工作流(等效 Ctrl+Enter) |
| 执行选中节点 | 执行选中节点及其上游依赖,无选中时执行全图 |
| 执行编组内节点 | 执行鼠标所在编组内的节点,支持小珠光编组和原生编组 |
按 Ctrl+G 弹出选项菜单,可选择创建:
点击空白处或按 Esc 关闭菜单。
快捷键配置随主题导出/导入一起备份,可跨机器迁移。
cd ComfyUI/custom_nodes/
git clone https://github.com/xiaozhuguang/ComfyUI-xiaozhuguang.git
ComfyUI/custom_nodes/ 目录ComfyUI-xiaozhuguang/
├── __init__.py # 节点定义 + NODE_CLASS/DISPLAY_NAME_MAPPINGS + 懒编码/目录浏览等路由
├── extension.json # 扩展配置(版本 12.0.0 + JS/CSS 资源清单)
├── pyproject.toml # Comfy Registry 发布元数据
├── LICENSE # MIT 许可证
├── README.md # 本文档
├── requirements.txt # 依赖声明
├── workflows.py # 工作流管理后端 API
├── .gitignore # Git 忽略规则
├── .comfyignore # Comfy Registry 忽略规则
├── .github/workflows/
│ └── publish_action.yml # 推送 tag → 自动创建 Release + 发布到 Comfy Registry
├── docs/
│ ├── code-audit-report.md # 代码审计报告
│ └── skill-panel-alignment.txt # 设置面板弹出对齐 Skill 文档
├── locales/ # 官方 i18n 规范翻译文件
│ ├── en/ (nodeDefs.json, main.json)
│ └── zh/ (nodeDefs.json, main.json)
├── example_workflows/
│ └── example_workflows.json
├── _xzg_audiodit/ # AudioDiT 严格离线建模库(本地扫描,完全不触网)
│ ├── __init__.py
│ ├── configuration_audiodit.py
│ ├── fp8_linear.py
│ ├── modeling_audiodit.py
│ └── utils.py
├── nodes/
│ ├── xzg_seed.py # 小珠光随机种子节点
│ ├── xzg_get_widget.py # 获取控件值节点
│ ├── xzg_first_last_frame.py # 首尾帧节点
│ ├── xzg_duplicate_first_frame.py # 帧优化节点(复制首帧填充)
│ ├── xzg_frame_extract.py # 帧提取节点
│ ├── xzg_image_loader.py # 图像加载器后端
│ ├── xzg_image_preview.py # 图像预览节点
│ ├── xzg_image_save.py # 图像保存(懒编码 + 右键真实分辨率)
│ ├── xzg_image_save_custom.py # 图像保存-化神级(自定义输出路径/格式)
│ ├── xzg_image_compare.py # 图像对比节点
│ ├── xzg_image_split_merge.py # 图像分割 / 合并节点
│ ├── xzg_atbc.py # ATBC 智能裁剪
│ ├── xzg_atr.py # ATR 图像回贴
│ ├── xzg_face_align.py # Face Align 人脸对齐
│ ├── xzg_video_loader.py # 视频加载器后端(1GB 分块上传端点)
│ ├── xzg_video_info_reader.py # 视频信息读取节点
│ ├── xzg_video_combine.py # 合并视频节点
│ ├── xzg_audio_loader.py # 音频加载器后端(上传大小限制 + 解码进度端点)
│ ├── xzg_audio_save.py # 音频保存节点
│ ├── xzg_lazy_check.py # 输入惰性判断节点
│ ├── xzg_text_box.py # 文本框节点(数字转中文)
│ ├── xzg_universal_slider.py # 万能滑条节点
│ ├── xzg_h3_prompt.py # MiniMax H3 提示词节点
│ ├── xzg_qwen_loader.py # Qwen Model Loader
│ ├── xzg_qwen3_vl_instruct.py # qwenVL 多模态节点
│ ├── xzg_longcat_loader.py # AudioDiT 严格离线模型加载器
│ ├── xzg_longcat_model_cache.py # AudioDiT 模型缓存
│ ├── xzg_audiodit_tts.py # AudioDiT 离线 TTS 三节点(零样本/音色克隆/多人对话)
│ └── xzg_points_editor.py / xzg_selector.js 关联等
└── web/
├── xzg_seed.js # 随机种子节点前端
├── xzg_image_loader.js # 图像加载器前端(多图/单图/棋盘格/拖拽)
├── xzg_image_preview.js # 图像预览前端
├── xzg_image_save.js # 图像保存前端(懒编码/右键保存)
├── xzg_video_loader.js # 视频加载器前端(分块上传/自定义进度对话框)
├── xzg_video_player.js # 视频播放器前端
├── xzg_video_combine.js # 合并视频前端
├── xzg_audio_loader.js # 音频加载器前端(解码律动进度条/拖入上传/播放头交互)
├── xzg_audio_save.js # 音频保存前端
├── xzg_image_compare.js # 图像对比前端
├── node_favorites.js # 收藏管理核心逻辑
├── node_favorites.css # 收藏面板样式
├── pinyin-pro.esm.js # 拼音搜索库
├── xzg_boolean_selector.js # 布尔选择器前端
├── xzg_group.js # 编组功能
├── xzg_group.css # 编组样式
├── xzg_number_switch.js # 编号切换节点前端
├── xzg_points_editor.js # 点编辑器前端
├── xzg_selector.js # 选择器前端
├── xzg_slider.js # 滑条前端
├── xzg_theme.js # 主题核心
├── xzg_theme_presets.js # 主题预设
├── xzg_theme_panel.js # 主题面板
├── xzg_theme.css # 主题样式
├── xzg_quick_nodes.js # 快速节点功能
├── xzg_universal_slider.js # 万能滑条前端
├── xzg_workflows.js # 工作流管理前端
├── xzg_align.js # 田字格对齐功能
├── xzg_get_widget.js # 获取控件值前端
├── xzg_i18n.js # 国际化辅助
├── xzg_menu_hide.js # 菜单隐藏(夺舍模式辅助)
├── xzg_arrow_tool.js # 箭头绘制工具
├── xzg_save_utils.js # 保存通用工具
├── xzg_h3_prompt.js # MiniMax H3 前端
├── xzg_text_box.js # 文本框前端(数字转中文)
└── xzg_qwen.js # Qwen/qwenVL 前端
🖥️ 新增:小珠光系统监控悬浮窗(nodes/xzg_monitor.py + web/xzg_monitor.js)
/xzg/system_monitor_stats 接口,实时返回 GPU / CPU / 内存状态🧰 新增:节点工具与组合辅助功能
🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.1.3,推送 v14.1.3 tag 触发 GitHub Actions 自动创建 Release + 发布到 Comfy Registry⚙️ GitHub Actions 发布流程:消除 Node.js 20 弃用警告
actions/checkout@v4 → v5、softprops/action-gh-release@v2 → v3.0.3setup-python 警告来自 Comfy 官方第三方 action 内部,无法在本仓库修改)🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.1.2,推送 v14.1.2 tag 触发 GitHub Actions 自动创建 Release + 发布到 Comfy Registry↔️ 小珠光箭头:新打开工作流"先错后对"修复(web/xzg_arrow_tool.js)
🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.1.1,推送 v14.1.1 tag 触发 GitHub Actions 自动创建 Release + 发布到 Comfy Registry🖌️ 新增 BrushNet 复刻节点:CutForInpaint / BlendInpaint(nodes/xzg_brushnet_inpaint.py)
CutForInpaint:以 mask 区域为中心裁剪指定画布窗口,输出 IMAGE + MASK + VECTOR(裁剪坐标)BlendInpaint:把 inpaint 结果按高斯模糊 mask 软融合回原图,可选 origin 原位贴回🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.1.0,推送 v14.1.0 tag 触发 GitHub Actions 自动创建 Release + 发布到 Comfy Registry↔️ 小珠光箭头:新工作流串台 / 关闭残留 / 显示时机修复(web/xzg_arrow_tool.js)
🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.0.11,推送 v14.0.11 tag 触发 GitHub Actions 自动创建 Release + 发布到 Comfy Registry⌨️ 快捷键:修复 D / F 裸键在输入框内无法输入
preventDefault(),输入框 / 提示词框内打不出 D / F🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.0.10,推送 v14.0.10 tag 触发 GitHub Actions 自动创建 Release + 发布到 Comfy Registry🔤 小珠光文本框:数字转中文口语读法优化
6点15分 → 六点十五分(此前"六点一五分")1.72米 → 一米七二62 → 六十二、720 → 七百二十(6 位以内整数)720分辨率 → 七二零分辨率(保持按位读)🕶️ 菜单隐藏面板:新增「使用说明」标签页
⌨️ 快捷键:屏蔽浏览器默认 Ctrl+D(收藏当前页)
🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.0.4,推送 v14.0.4 tag 触发 GitHub Actions 自动创建 Release + 发布到 Comfy Registry🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.0.3,重新发布以递增 Comfy Registry 版本编号(代码与 14.0.1 一致)🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.0.2,重新发布以递增 Comfy Registry 版本编号(代码与 14.0.1 一致)⌨️ 自定义快捷键系统(后端持久化)
web/xzg_shortcuts.js,配置存储于插件目录 xzg_shortcuts.json,换浏览器/换服务器不丢失GET/POST /xzg/shortcuts 路由,设置面板「配置快捷键」按钮,支持捕获按键、选择动作、增删保存⌨️ D 键执行选中节点(自研,替代 rgthree)
getOutputNodes、recursiveAddQueueNodes、queueSelectedOutputNodes⌨️ F 键执行编组内节点(支持双编组)
⌨️ Ctrl+G 编组类型选择
🏷️ 工作流标签同步
🏷️ 版本号 / 发布
pyproject.toml 从 13.0.4 升至 14.0.0v14.0.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry🖼️ 小珠光图像保存 / 化神级:媒体资产显示 + JPG 全分辨率输出 + 画面拖动
nodes/xzg_image_save.py、nodes/xzg_image_save_custom.py):节点输出补充标准 ui.images 字段(保存模式=实际输出文件 type=output,预览模式=临时预览 type=temp),使生成图片出现在 ComfyUI 媒体管理「已生成」列表中,与原生 SaveImage 行为一致real_np 全分辨率编码;预览(3840/6400 降采样 JPG)仅用于画布防卡顿,不影响输出尺寸;PNG 输出一直是全分辨率web/xzg_image_save.js):在画面区域按下并拖动可直接移动节点;单击画面区域触发上一张/网格切换/下一张(多图时),单击网格缩略图回到单图显示ui.images 后新前端自动追加 $$canvas-image-preview 虚拟预览 widget(全分辨率输出图),叠在自定义画布(降采样预览)之上。修复为 onDrawBackground 中清空 this.imgs 并移除该 widget,自定义画布预览(3840 防卡顿)不受影响🎬 小珠光合并视频:媒体资产显示
nodes/xzg_video_combine.py)输出键从 videos(复数)改为 video(单数)。前端 parseNodeOutput 以数组键名作为 mediaType,isVideo 检查 mediaType==="video"(单数),复数形式退化为依赖文件名后缀识别,导致媒体资产视频过滤器不显示。前端自定义播放器本身兼容 ui?.videos || ui?.video,无需改 JS🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 13.0.3 升至 13.0.4.github/workflows/publish_action.yml 在推送 v13.0.4 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 13.0.4)🔤 小珠光大字文本展示节点:新增「自适应字号」与正文底色兜底
web/xzg_big_display.js)右键设置新增「自适应字号」(autoFit,复选框):开启后字号在 [4, 用户填写的字号] 区间内二分查找能放下整块文本且不超高内容区的最大字号,尽量填满内容区;节点缩小 → 字变小,节点拉大 → 字变大并被用户设定的字号封顶。bgcolor(透明时回退 #1a1a1a)铺满正文区,避免主题模式下正文区域全透明、文字悬空。🎨 主题美化:大字展示节点主题仅作用标题栏,正文不再被覆盖
web/xzg_theme.js)XiaozhuguangBigDisplay 节点主题渐变只绘制在标题栏,正文(文字显示区)完全由节点自行绘制,主题一律不绘制、不覆盖正文区域。makeDrawShapeWrapper 对大字节点显式补调 node.onDrawBackground,避免开启主题后正文文字永远不会被绘制(正文透明/无内容)。applyGradientToDOMNode / 重绘逻辑对大字节点一律跳过 DOM 主题样式,并清理历史遗留的 DOM 渐变,避免不透明 DOM 渐变盖住画布绘制的正文文字。🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 13.0.2 升至 13.0.3.github/workflows/publish_action.yml 在推送 v13.0.3 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 13.0.3)🔒 视角锁定:修复劫持文本框数字键
web/xzg_viewport_lock.js)快捷键 1-5 的 keydown 监听原先只放行 input / textarea / select,遇到使用 contenteditable 实现的自定义文本框(tag 为 div/span)时会 preventDefault() 劫持数字键,导致部分其它插件的文本框无法输入 12345。input / textarea / select / contenteditable、isContentEditable、以及焦点在 contenteditable 内部子元素(closest('[contenteditable="true"]'))。1-5 快捷恢复视角功能保持不变。🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 13.0.1 升至 13.0.2.github/workflows/publish_action.yml 在推送 v13.0.2 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 13.0.2)🖼️ 图像对比节点 Bug 修复(nodes/xzg_image_compare.py、web/xzg_image_compare.js)
new Image() 路径(首图 / 点击切换 A / 点击切换 B)均添加 onload → setDirtyCanvas(true, true),防止 6400px 级大图/慢加载时 naturalWidth 仍为 0 跳过绘制,导致图片迟迟不显示/显示不全,必须晃动鼠标才刷新sourceWidth/destWidth 裁剪偏移用 clamp(cropOffset, 0, targetW) 限制,鼠标进入右侧留白区时不再 cropOffset > targetW → B 图横向拉伸变形🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 13.0.0 升至 13.0.1.github/workflows/publish_action.yml 在推送 v13.0.1 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 13.0.1)🔤 小珠光文本框:中文朗读输出(text_zh_num,text 原文不变)优化
淼 → 邈(nodes/xzg_text_box.py):避免 LongCat AudioDiT 等 TTS 读错・:达・芬奇→达芬奇、张・芬奇→张芬奇 等你好 世界→你好世界)* 只在非乘法位置删除:1920*1080 仍读「一九二零乘以一零八零」,单独出现的 * 删除🎵 音频加载器:时间码增加「时长」显示
web/xzg_audio_loader.js)时间码右侧新增 时长XX:XX,若被红/蓝裁剪则显示裁剪后的时长,否则为总时长🎬 视频播放器 / 解码器:修复首帧黑屏
web/xzg_frame_decoder.js)取帧带时间容错:time=0 边界处部分视频首帧 PTS 非 0 取不到帧(首帧黑屏、播放一次后才正常),改为逐级小偏移重试,且复用 mediabunny「二次确认」路径renderFrameAwait:真正等待首帧解码绘制完成后再显示,替代原先只调度不等待的 renderFrameweb/xzg_video_player.js)对齐 VHS:使用原生 <video> 的节点加载时不弹转圈动画,加载期间保留上一帧画面,消除「读条」观感🎞️ 视频加载器
web/xzg_video_loader.js):拖拽红/蓝杠或参数变化时写回上游控件(PrimitiveNode / 同名 widget)并触发其回调,红蓝头联动正确;_resolveLinkedValue 优先读取连线值(widget 转 input 后自身 value 不更新)onLoadedMetadata 只应用加载范围(_applyLoadRange),不再触发 _resetToSourceVideo 把刚盖上的预览重置回原视频;参数真正变化时才由 _syncLoadRange 重置serialize=false:文件名仅作显示产物,不独立持久化/进入缓存,避免与「视频」下拉框值发散🎬 合并视频
web/xzg_video_combine.js):输出信息写入 localStorage(key = 节点 id),刷新后仍能恢复上次预览(对齐 VHS 刷新后仍有输出);不再写入 node.properties,避免并入图/extra_pnginfo 改变缓存签名导致每次重编码serialize=false(对齐官方 audioUI 范式):文件名每次执行都变化,一旦进入 widgets_values/extra_pnginfo 就会改变节点缓存签名 →「上游输入未变时仍被判定为变化 → 每次都重编码合成」🗑️ 移除「视频加载器 Pro」节点
nodes/xzg_video_loader_pro.py、web/xzg_video_loader_pro.js(含其前端注册引用),功能以普通视频加载器为准🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 12.22.0 升至 13.0.0.github/workflows/publish_action.yml 在推送 v13.0.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 13.0.0)🐛 修复:获取控件值节点与「输出到队列」兼容性
获取控件值 节点默认值兜底(nodes/xzg_get_widget.py):
model)因上游不在「获取控件值」节点可达链,被 ComfyUI 的 prompt 剪枝从 dynprompt inputs 中移除,导致误报「找不到控件」。_lookup_default_input():从目标节点 INPUT_TYPES 定义读取该控件的默认值兜底输出,重跑后目标节点补全即读到真实值,避免首次执行误报。获取控件值 节点宽度溢出修复(web/xzg_get_widget.js):
widget.width 定义为只读访问器(返回节点实际宽度),忽略属性面板写入的 368px,防止联动下拉/列表超出节点边界(与视频/音频加载器修复一致)。rgthree.queueOutputNodes(web/node_favorites.js、web/xzg_group.js):
recursiveAddNodes 在「输出节点不在默认执行链 prompt.output 里」时无空节点保护,会抛 Cannot read properties of undefined (reading 'inputs') 并触发 ComfyUI 全局「执行失败」弹窗(晨羽智云等装有 rgthree 的平台必现)。currentNode 空保护),保证在 rgthree 环境稳定执行。🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 12.21.0 升至 12.22.0.github/workflows/publish_action.yml 在推送 v12.22.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 12.22.0)🎨 UI 优化:节点收藏器与工作流管理器初始布局尺寸调整
460px → 660px,给左右两列更充裕的展示空间300px(配合 width:660px - min-width:350px 的右列,实现左定宽右弹性)min-width: 350px,避免被过度压缩gap: 10px → 0,配合分割栏紧凑布局80px → 160px,更贴近日常使用需求(中文分类名不再挤成一列)[80, 500]px,已有保存宽度的用户不受影响🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 12.20.0 升至 12.21.0.github/workflows/publish_action.yml 在推送 v12.21.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 12.21.0)☁️ 面板几何(位置/尺寸)纳入云持久化
延续上版云存储:节点收藏器面板的位置/尺寸/分割宽度、工作流管理器左侧栏宽度,之前只写各自 localStorage 键,云平台刷新/换分配即丢。本次把它们也并入服务端持久化。
web/xzg_cloud_store.js 新增面板几何 UI 态模块:
cloudUIInit():拉取云端 xzg_ui_state(面板几何合集),写回对应 localStorage 键(云优先);云端为空时把本地几何首次上云cloudUIQueueGeometry():任一几何键写完后收集全部几何,防抖 400ms 推送到云端createPanel 同步云端后读取几何;宽/高/分割宽/位置四处写点均触发 cloudUIQueueGeometry()☁️ 云平台持久化:收藏节点与工作流元数据从浏览器 localStorage 改为服务端存储
云平台(晨羽智云等)浏览器 localStorage 无法跨会话持久化(刷新/换设备即丢)。本次为「小珠光节点收藏器」和「小珠光工作流管理器」增加服务端持久化:
GET/POST /xzg_cloud_store,数据以 JSON 写入 ComfyUI 用户目录 user/xiaozhuguang/ 磁盘,含路径穿越防护与安全装饰器web/xzg_cloud_store.js(cloudLoad/cloudSave):读取优先「服务端 → 本地 localStorage → 默认值」;服务端无数据时自动把本地推上去实现首次上云;服务端不可用时静默回落本地兜底comfyui_xiaozhuguang)、工作流元数据(xzg_workflows_meta)统一改为云优先读写,防抖 600ms 落云,本地仍保留一份兜底🔧 修复:右上角功能区「快剪」设置项不显示
xzg_video_editor_launcher.js 修正设置项 ID 前缀(Xiaozhuguang. → xiaozhuguang.),与其余小珠光设置同组显示registerSetting 增加 addSetting 未就绪时的延迟重试与去重标记,避免注册失败后永久缺失🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 12.18.0 升至 12.19.0.github/workflows/publish_action.yml 在推送 v12.19.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 12.19.0)📦 依赖修复:补全 requirements.txt(git 安装缺 Qwen 依赖)
requirements.txt 曾被精简为仅 imageio-ffmpeg>=0.5.1,导致通过 git clone 安装(如晨羽智云)时,ComfyUI Manager 按 requirements.txt 安装依赖而漏装 Qwen 相关包(transformers>=4.57.1、qwen-vl-utils、llama-cpp-python、bitsandbytes 等),QwenLoader / qwenVL 节点报"未安装 / 依赖缺失"requirements.txt 必需依赖清单,与 pyproject.toml 的 dependencies 对齐,并保留可选依赖说明注释;git 安装用户执行 pip install -r requirements.txt 即可装上pyproject.toml 的完整依赖)🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 12.17.0 升至 12.18.0.github/workflows/publish_action.yml 在推送 v12.18.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 12.18.0)🔧 修复:夺舍模式误隐藏小珠光工作流按钮(前端 1.51.9 兼容)
前端更新至 1.51.9 后,侧边栏按钮标识由 class 变为 data-testid,导致夺舍模式把小珠光自己的工作流按钮误判为官方按钮而隐藏。本次统一补全两套选择器(class 与 data-testid):
_xzgTabBtnSel / _officialWfBtnSel 选择器辅助方法,兼容新旧前端按钮定位_findOfficialWorkflowButtons 补全 data-testid 兼容:isXzg 用 closest() 检查祖先链,官方按钮识别同时支持 class 与 data-testid="workflows-tab-button"_setOfficialWorkflowButtonsHidden 增加兜底:夺舍模式下强制恢复小珠光按钮显示🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 12.16.0 升至 12.17.0.github/workflows/publish_action.yml 在推送 v12.17.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 12.17.0)🔧 统一修复:属性面板开关导致节点元素溢出(widget.width 污染)
为所有自定义 canvas/DOM widget 统一添加 width 只读访问器,始终跟随节点实际宽度 node.size[0],忽略 ComfyUI(属性面板/线性模式渲染等)写入的面板侧行宽度(例 368px)。当开关右上角"属性面板"时,各行绘制/交互命中区/DOM 预览区宽度稳定,不再超出节点边界、不再随面板开/关拉伸或跳动。覆盖节点如下:
🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 12.15.0 升至 12.16.0.github/workflows/publish_action.yml 在推送 v12.16.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 12.16.0)✨ 新增节点
XiaozhuguangImageFromList):从 IMAGE 输入(列表/已堆叠 batch/单张)中自 index 起连续取 length 张图。index 支持负数(-1 取最后一张),越界自动钳制;length 为连续取图数量(如列表 4 张、index=1、length=3,取第 2/3/4 张;length=1 等价单取);多张时返回列表并广播,下游逐张执行。与图像加载器「列表」模式一致,支持图片尺寸不一致、可分别预览XiaozhuguangListCount):计算输入列表的元素总数,常用于小珠光图像加载器「列表」模式等多元素输出;单个批处理张量按 batch 维统计,保证"总数=图片张数"的直觉🖼️ 小珠光图像加载器增强
∞/空/0 表示无限制,大于 0 时最多加载/显示前 N 张(批次/列表模式均生效);预览网格自适应按该上限数量排布(前端改动刷新页面即生效)= 填充或混入空白引号导致 Incorrect padding 的问题;无效脏数据(过滤后为空或解码过短,不足 PNG 签名)静默返回零遮罩、不再打印告警,仅在解码出足量数据但 PIL 仍无法识别时才告警🔧 修复 / 改进
_initCtxMenu 挂到 document/window 的捕获监听(mousedown/contextmenu/blur/resize)改为挂到实例引用,并在 close() 中配对 removeEventListener 回收,避免每次打开编辑器都重复注册、捕获层越积越多(长时间运行后可能干扰全局右键,刷新页面才会恢复)free 读数更真实;新增"该模型上次成功加载的 GPU 层数"兜底,中断/卸载后显存读数偏低时复用上次成功值,避免模型整体掉到 CPU 推理长时间卡顿;输出更明确的调整说明🖼️ 小珠光图像加载器:多图网格优化
contain 显示时图片两侧空白为黑色,观感更干净✨ 大字展示(XiaozhuguangBigDisplay)全面增强
xzg_big_display.js 此前未登记到 extension.json 的 js 列表,前端未被加载(新增菜单/绘制等全部失效),现已补上IS_CHANGED 兼容节点输入:接收忽略 ComfyUI 传入的 input 等关键字参数,始终返回 True 刷新展示,消除 got an unexpected keyword argument 'input' 警告🐛 小珠光 H3(XiaozhuguangNinimaxH3Prompt)模型失效错误提示优化
unload_after 选项或重新执行 Qwen Model Loader 后再运行本节点,便于定位✨ 新增节点
XiaozhuguangImageScaleByAspectRatioV2):小珠光图片缩放(按宽高比)的高性能版本,参数与 V2 保持一致,计算速度更快。直接从张量形状获取尺寸避免逐图转 PIL,整批图像通过 torch.nn.functional.interpolate 批量插值;对 torch 不支持的 lanczos/hamming 插值自动回退原生 PIL 路径🐛 修复 / 改进
XiaozhuguangPointsEditor)bbox 输出改为结构化列表:连接口类型由 STRING 调整为 BOXES,输出每个框一个元素 [x1, y1, x2, y2](像素坐标取整)的结构化列表,修复连接到小珠光批次计数时始终显示 0 框的问题0 到 总帧数(如 30 帧为 0..30),0 对应第 1 帧画面,29/30 均显示第 30 帧画面,右下角可显示 30/30;后端输出的 frame_index 取 min(帧号, 总帧数-1) 始终落在有效范围内XiaozhuguangImageLoader)移除调试输出:删除遮罩数据长度的控制台 printhideOnZoom: false,画布缩放到细节级别阈值以下时仍显示已加载图片,与内置图像/视频预览组件行为一致(前端改动刷新页面即生效,无需重启后端)🐛 修复
XiaozhuguangBigDisplay)IS_CHANGED 调用报错:原为类属性 IS_CHANGED = True(布尔量),ComfyUI 在生成缓存签名时会把 IS_CHANGED 当作函数调用,触发 'bool' object is not callable,并在控制台打印 [WARNING] WARNING: 'bool' object is not callable。已改为返回 True 的 @classmethod,语义不变(始终刷新大字展示),并消除该警告⚡ 性能优化:帧优化 / 帧提取 惰性化 + 合并视频 内容级去重
XiaozhuguangDuplicateFirstFrame)惰性化:移除强制每次重算的 IS_CHANGED→NaN,前置图像输入未变时直接命中 ComfyUI 输入缓存,不再重复计算;同时移除控制台 printXiaozhuguangFrameExtract)惰性化:同样改为默认缓存(含 front_fill/back_fill 参数变化时才重算),并移除全部控制台 printXiaozhuguangVideoCombine)内容级惰性去重:即使上游每次重新生成相同内容的帧,只要送入的图像/音频内容(SHA-256 指纹)与各项参数均未变且上次文件仍在,就直接复用上次编码文件、跳过 export_to_video——不再重新编码、不再出现编码读条、不新增编号文件xzg_video_combine.py 中遗留的无用变量✨ 新增节点
XiaozhuguangMaskInvert):一键反转遮罩XiaozhuguangImageMaskPreview):图像与蒙版同框预览🔧 其它优化
_compute_crop_box 的 while 循环改为解析式计算;MASK 按实际维度稳健处理(仅在 ndim==4 时去通道,通过 mask_batched 决定是否按帧索引,单遮罩直接广播复用,避免 IndexError)🎬 视频加载 / 视频保存(共享播放器):修复「加载上限截断视频后,单次播放仍会播完整段声音」
XiaozhuguangVideoPlayer,问题来源于 _startAudioPlayback:音频源播放的是 decodeFullAudio() 解码出的完整音频缓冲,且 AudioBufferSourceNode.start(0, offset) 会一路播到缓冲末尾,完全不理会「加载上限」截断的画面结束点_computeEndFrame() 计算剩余可播时长,通过 start(0, localTime, playLen) 的第三参严格限定音频到截断结束点同时停止;未截断时播放长度=剩余全长,声音照常播完,无回归frameLimit/fps 限制)均正确🎬 化神级合并视频节点:修复「文件名前缀含子目录时只能保存、无法预览」
xzg_video/xxx 而非 xxx),后端会把视频正确保存到 output/xzg_video/xxx_00001.mp4,但返回给 UI 的 subfolder 此前被错误置空,导致前端 /view 无法定位子目录文件而预览失败folder_paths.get_save_image_path 返回结构中的真实子目录(第 4 位)被正确捕获并透传给前端;同时修正了元组解包顺序(上版误把第 3 位的整数计数器当子目录,导致 TypeError: expected str, bytes or os.PathLike object, not int)📚 重点参考:化神级视频编辑器(快剪/加载器)的 WebCodecs 解码、统一时钟多轨播放、MediaBunny 集成思路,参考了 OpenCut-app/OpenCut 项目的实现。
🎬 化神级视频编辑器:统一时钟多轨渲染内核(参考 OpenCut 单时钟模型)
performance.now)驱动全局时间 gt」,播放态每个 rAF tick 只渲染当前 gt 一帧,重复 tick 落到同帧号=同一帧,彻底修复「播放几秒后画面与时间码加速快跑」的经典问题_renderLayersOnce(gt) 作为单帧合成内核:播放、seek、拖动、刷新四条路径统一走同一入口,消除旧路径下 17+ 方法各自维护帧号与缓存导致的错乱localTime - clip.start)」改为「源视频绝对帧号」,修复裁掉头部的片段仍从源第 0 帧开始播放的 bug🎬 化神级视频编辑器:预取节拍锁定 + 缓存淘汰中心锚定播放目标帧
topFilled ≥ target+窗口)时本次预取零拉帧,预取速率从「按调用频率」严格锁定为「按播放速率」,领先量稳态保持约 29 帧不再膨胀decoder._targetFrame)锚定「播放目标帧号」(原来是预取头本身),即使领先再多,目标帧也永远处于淘汰中心窗口,不会被挤出缓存🎬 化神级视频编辑器:解码器隔离 + 转码兜底(HEVC/MP3 → H.264+AAC)
decoderPool.get(filename) 为不同文件返回独立实例),快剪编辑器与视频加载器的解码器池完全隔离,避免共享实例引发的资源竞争与画面错乱fastcut-cache/h264/、加载器产物存 input/xzg-h264/,两套转码流程相互独立🖼️ 小珠光图像加载器:侧栏图标化 + 预览区最大化
padding:0 并贴顶贴左对齐,空态说明改为贴顶贴左;四周边框与内容的空隙显著压缩🗂 其他
pyproject.toml、extension.json 从 12.7.0 升至 12.8.0requirements.txt 保持 imageio-ffmpeg>=0.5.1,FFmpeg 环境随包自动安装xzg_video_editor.js、xzg_image_loader.js、xzg_frame_decoder.js、xzg_group.js、xzg_video_player.js、xzg_selector.js、xzg_video_combine.js 通过 node --check;相关后端节点 .py 通过 Python AST 解析.github/workflows/publish_action.yml 在推送 v12.8.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 12.8.0)⚡ 小珠光点编辑器:性能优化(长图/高帧拖拽更流畅)
_baseCache,交互时只做一次同尺寸快速 blit(GPU 加速),显著降低重绘开销requestAnimationFrame 合并,一帧只画一次onDrawForeground 每帧强制 reflow🖼️ 小珠光点编辑器:预览清晰度改为「像素量」
preview_pixels 参数(单位:万像素,100 = 100 万像素 / 1MP):原图总像素超过该值才等比缩放,0 = 不缩放用原始尺寸;坐标自动等比放大回原图,标注结果不受影响🎬 快剪:右上角功能区显示开关(ComfyUI 设置项)
🗂 其他
pyproject.toml、extension.json 从 12.6.1 升至 12.7.0xzg_points_editor.js、xzg_video_editor_launcher.js 通过 node --check;__init__.py 通过 Python AST 解析push tags v* 触发 → Comfy Registry 新版本 12.7.0 发布🎬 化神级视频编辑器:音频模式(从快剪加载音频)布局修复
_applyModeFilter 面板高度同步设为 71 + eachH * 2,与轨道总高一致,滚轮增量保持 10px 无跳变🎬 化神级视频编辑器:时间线空隙选中 + Delete 删除(单轨道)
🎬 化神级视频编辑器:播放头驱动片段选中(配合轨道名激活)
_scheduleScrubSeek)、点刻度跳转(_seekToGlobalTime)、左右箭头帧步进、自动播放 4 个循环(视频/纯音频/图片片段/空隙等待)🎬 化神级视频编辑器:多选增强(媒体库 + 时间线)
_handleClipClickSelection,锚点规则与媒体库一致;不同轨道间点选自动退化为单选🔊 音频节点:波形缓存 + 红蓝线/音量持久化 + 发送到加载器
绝对路径 + mtime + size 为键缓存 peaks/duration/sample_rate(200 条 FIFO),命中缓存直接返回已完成 job 不启 FFmpeg 线程;前端会话缓存 _xzgWaveformCache(100 条 FIFO),切工作流恢复同一音频时零网络请求秒出波形;文件被覆盖上传基于 mtime+size 自动失效{peaks, duration, range, volume};拖动红/蓝线结束(onRangeChange)、拖音量线/双击(onVolumeChange)、改起始/时长 widget 时局部回写;切换工作流恢复同一音频时 range + volume 同步还原(clamp 防御异常);syncVolumeFromWidget(onConfigure 强制 1.0)改为直接赋值不触发回调,避免污染缓存持久化音量xxx.mp3 [output] 或 xzg_preview_{uuid}.mp3 [temp],音频加载器原生支持 output/temp/input 三种后缀解析;预览模式(temp)执行后立即发送可用(刷新/重载工作流后恢复禁用,避免 temp 文件被清理后 404)preventDefault + stopPropagation + stopImmediatePropagation)、processMouseDown hook 返回 true、processContextMenu hook 原 return; 改为 return true(明确"已处理");命中波形区只弹自定义「保存格式 + 发送到音频加载器」菜单,ComfyUI 原生节点菜单不再弹出🗂 其他
pyproject.toml、extension.json 从 12.2.1 升至 12.2.3xzg_video_editor.js、xzg_audio_save.js、xzg_audio_loader.js 均通过 node --check;xzg_audio_loader.py 通过 Python AST 解析🔊 修复:小珠光音频加载器 — 点击虚线下(下半区分界线以下)偶发不播放音频
问题现象:同一音频,有时点波形虚线下能立即播放/暂停,有时点同一个位置却完全没反应 — 呈现出「偶发不播放」。复现路径:拖完播放头立刻点虚线下、或者靠近左侧音量线/红色起始线/蓝色结束线的位置点虚线下,几乎必现
根因 1 — 200ms 防误触守卫吞了整个虚线下点击:handleMouse 入口对 isDragging 或「拖动播放头结束 200ms 内」做了全量拦截 return true,只要上一次操作是拖播放头,立刻点虚线下的 pointerdown 直接被吞,不走 togglePlay
根因 2 — 起始/结束把手「全高度命中」判定:红色 startX、蓝色 endX 两侧 ±14px(handleWidth=14)范围内,点击在虚线下也被判成 dragType='start'/'end' → 进入 isDragging=true 分支,pointerdown 不会调用 togglePlay,原 _handleMouseUp 也没有针对「没拖动」的兜底播放
根因 3 — 左侧音量把手命中:音量(尤其 100% 或更低)的水平线位于中下区域,点虚线下恰好落在 Math.abs(localY - volY) ≤ 5 且 localX ∈ [pad, pad+40] 时 → 被判 dragType='volume' → 同根因 2,无播放
修复 1 — 防误触守卫缩小到「仅上半区」:入口守卫改为 !lowerHalf && (isDragging || _lastPlayheadEnd < 200ms),虚线下(分界线及以下)永远放行,防止拖完播放头后立刻点虚线下被吞
修复 2 — 下半区远离把手 → 直接走播放/暂停:把手命中之前新增分支:lowerHalf && 距离 startX > handleWidth && 距离 endX > handleWidth → 直接单单击 togglePlay() / 双击 onUpload(),不进入 dragging 态,杜绝「把手误判导致永远不播放」
修复 3 — mouseup 兜底播放:新增 _dragStartedInLowerHalf 标志,pointerdown 按下时记录是否位于虚线下(包括撞到音量把手的特殊情况 'volume')。_handleMouseUp 末尾在 !_dragMoved(点击没有真正拖动,距离小于 _dragThreshold)且 startedInLowerHalf 时,补一次 togglePlay() —— 即便真的进入了 start/end/volume dragging 判定,只要是虚线下的「单击」,松开时也一定能播放
行为一致性:虚线上(上半区)的拖动播放头、范围 start/end 把手、音量拖动手柄完全不变;上半区单点仍会跳转播放头不改变播放状态
🗂 其他
pyproject.toml、extension.json 设为 12.2.1xzg_audio_loader.js 通过 node --check🚀 小珠光大字展示:显示区精修 + 字号彻底自由缩放
Math.min(fs, fs*scale) 的上限钳制,改为 fs = fs*scale 双向自由缩放——节点拉大字号跟着放大,节点缩小字号随之缩小,不再被原设置值锁死clip() 强制裁剪,文字绝不遮挡输入端或溢出节点🗂 其他
pyproject.toml、extension.json 从 12.6.0 升至 12.6.1xzg_big_display.js 通过 node --checkpush tags v* 触发 → Comfy Registry 新版本 12.6.1 发布📦 小珠光编组:边框/标题栏与节点、背景完全同步渲染(修复缩放时“边框先动后追平”的时间线抖动)
updatePositions()(改 DOM 位置/尺寸),随后 canvas 才在下一帧 onDrawBackground 里按新 scale 重绘背景和节点,导致边框“领先”背景一帧updatePositions() 的唯一调用点只能是 onDrawBackground(由 setupCanvasBgDraw 挂载的 onDrawBackground 回调,先 self.updatePositions() 再 self._drawGroupBackgrounds()),绝对禁止在独立 rAF(原 startSyncLoop)或任何事件 handler 中提前写 DOM 尺寸;syncNow 统一只做 app.canvas.setDirty(true, true) 触发重绘,把“编组 DOM → 背景 → 节点”三件事锁在同一 canvas 渲染帧、同一 scale 值下一次性完成,视觉上零抖动fadeInStartNow = performance.now() 记录同刻起点,_fadeStart / _fadeDur / _fadeTarget 写入编组对象,canvas 背景渐变与 DOM opacity 过渡按同一时间戳线性插值计算,不再读 getComputedStyle(避免 CSS transition 与重绘不同步导致的档位跳变),两者连续无级同步⭐ 节点收藏:设置面板紧凑化 + 开关对齐 + 标签永不折行
autoCloseAfterInsert)flex: 1 1 0 占满剩余宽度,把 toggle 推到最右端,两行开关严格对齐(此前文字长度不同时开关位置前后错位)white-space: nowrap + text-overflow: ellipsis 兜底,未来再长的中文字符也不会在 210px 窄面板里折行12/16px → 6/16px 并固定字号 13px;各行 gap 16px → 6px;内容区 padding 12px → 8/12/10px;使用频率行距 12px → 6px;底部按钮区与按钮高度同步收紧;设置面板整体高度明显压缩🗂 其他
pyproject.toml、extension.json 从 12.5.0 升至 12.6.0xzg_group.js、node_favorites.js 通过 node --checkpush tags v* 触发 → Comfy Registry 新版本 12.6.0 发布🎬 视频加载器:预览视频自动重置为源视频 + 跳过帧数输出
_isPreviewLoaded 标志 + _resetToSourceVideo();_syncLoadRange(跳过帧/加载上限变动时)、下拉切视频、拖入上传三个入口都会触发重置,重新 player.load(原视频URL),总帧数恢复原视频全长,已有 syncCustomSize() / setLoadRange 机制自动应用当前渲染参数clamp(skip, savedFrame, end-1) 回放到加载范围内对应帧,不会跳回 0;requestAnimationFrame 延迟一帧执行 load,避免数字输入框拖动后 pointerup 与重渲染冲突导致意外进入编辑模式RETURN_TYPES 扩展 (FLOAT,INT,INT,INT,STRING,INT),第 6 口 skip_frames 从视频加载器写入的 info.skip_frames 读取(旧版加载器无此字段回退 0,int() 防御异常),方便下游节点精确对齐到「实际加载的第一帧」而非原视频第 0 帧locales/en/nodeDefs.json + locales/zh/nodeDefs.json 为 XiaozhuguangVideoInfoReader 新增 skip_frames / 跳过帧数 第 5 输出口翻译(与 RETURN_NAMES index 5 一一对应)xzg_video_loader.py 预览视频生成成功后的 print 调试行,减少 stdout 刷屏🔲 小珠光布尔:节点可自由拖拽大小 + 按钮等比自适应(参照小珠光选择器布局算法)
this.resizable = true + this.flags.resizable = true;onResize 强制最小尺寸 宽 120 / 高 58(与选择器一行底线一致);设置面板「应用」不再强行改回固定尺寸,仅兜底最小尺寸getButtonRects(y, W, settings, availableH):左右各 6px 边距 → availableW = W-12;顶部 4px / 底部 8px;availableH > 自然 btnH 时按钮等比放大填满,不足时缩小避免溢出;按钮间比例关系(settings.widths / settings.btnWidth 决定)始终保持不变DEFAULT_SETTINGS.fontColor 从 "#aaa" 改为 "#FFFFFF",与选择器默认字体色一致ctx.textBaseline = 'alphabetic' + ctx.measureText 取 actualBoundingBoxAscent/Descent 计算基线偏移 (ascent-descent)/2,大字体下不再偏上;字体大小 clamp(8, settings.fontSize, r.h*0.85) 防止超出按钮node.onMouseDown:原 widget.mouse 命中受 computeSize 返回高度限制(返回极小值后点击不到),改为 onMouseDown 覆盖整个节点区域;widget.mouse 仅放行事件;widget.computeSize 返回 [width, 4] 不干预节点高度,完全交给用户自由拖动naturalW = falseW + gap + trueW + 12,保证新建节点按钮不被拉得过宽,符合默认视觉🗂 其他
pyproject.toml、extension.json 从 12.4.0 升至 12.5.0xzg_boolean_selector.js、xzg_video_loader.js 通过 node --check;xzg_video_info_reader.py、xzg_video_loader.py、__init__.py 通过 Python AST 解析push tags v* 触发 → Comfy Registry 新版本 12.5.0 发布🔀 小珠光编号切换:惰性求值(参考 easy-use anythingIndexSwitch)
valueN 输入全部声明 {"lazy": true},新增 check_lazy_status —— 切换 select 编号时,执行引擎只调度被选中编号对应的上游工作流,其余编号的上游完全不执行(省去冗余计算 / 大模型加载 / 采样等开销)check_lazy_status 返回 ["value{select}"],引擎 make_input_strong_link 强制求值该支路并返回 PENDING,第二次进入 switch 输出结果kwargs 中,不发起请求,静默输出 None,规避 easy-use 原版会触发的引擎 NodeInputErrorselect 经 int() 转换并 clamp 到 [0, 49];上游输出恰为 None 时引擎会过滤请求,不会死循环⭐ 节点收藏:自定义使用频率
showNodeInputDialog 自定义输入框组件(支持 ESC / 点遮罩取消),后续弹窗类交互统一复用📍 SAM 点编辑器:会话级点缓存 + 布局修复
POINTS_SESSION_CACHE,切换工作流 / 更换图片均不丢失已标注的点;仅刷新浏览器(模块重载)后清空;key 为 ${workflowKey}::${nodeId}🗂 其他
pyproject.toml、extension.json 从 12.3.1 升至 12.4.0__init__.py 通过 Python AST 解析;xzg_number_switch.js、xzg_points_editor.js、node_favorites.js 通过 node --checkpush tags v* 触发 → Comfy Registry 新版本 12.4.0 发布📦 小珠光编组:背景色、背景出现动画、缓入缓出、UI 布局重整
bgColor 字段(rgba,默认透明),不写入 DOM 框体(overlay 在画布之上会遮挡节点),改为挂载到 LiteGraph onDrawBackground 回调(背景网格之后、连线和节点之前),直接在 graph 坐标空间按 bounds 绘制;绘制范围 [b.x, b.y+18, w, h-18] 不覆盖标题栏(避免透过半透明 headerBgColor 混色);顶部两角直角、底部两角 8/scale 圆角匹配 DOMgetComputedStyle(el).opacity(CSS transition 中 el.style.opacity 瞬间即终值,computed 才是每帧过渡值);渐入时动画启动硬上限 700ms(min(700, max(80, fadeInMs*0.4)),避免渐入滑块最大 8000ms 时等比例等待长达数秒)updatePositions 末尾几何 hash 检测(拖框体/resize/收纳)触发 setDirty;渐入+背景动画窗口用 rAF 循环 _kickCanvasRepaint;动画中 _bgAnimRepainting 防重入标记直到所有编组动画窗口过期easeInOutCubic(先慢→中间快→结尾慢)。none 默认无;wipedown/wipeup/wiperight/wipeleft 四向卷帘;centerout 中心扩散;新增 edgesin 从外往内(左右两侧向中间并集 clip);新增 clockwipe 时针旋转(12点方向顺时针扇形扫过,radius=对角线/2+1,极小进度用 lineTo 退化三角防 arc 起止角相同变整圆)bgAnimation/bgAnimDuration 序列化、快照回滚、应用到全部、localStorage 新建继承均覆盖setupCanvasBgDraw 以链式包装旧回调(兼容 ComfyUI 自身),初始化 canvas 未就绪时最多 60 次 100ms 重试🔊 LongCat AudioDiT 节点默认启用开关修复
XZG_ENABLE_AUDIODIT 开关逻辑写反——只要不设环境变量节点就不可见,导致升级后用户画布上原有的 AudioDiT 节点全部消失、模型/tokenizer 缺失错误也无法触发XZG_DISABLE_AUDIODIT=1 才关闭;模型缺失/目录为空的提示延迟到首次执行再打印 stderr(含 [小珠光] / [Xiaozhuguang...] 前缀),启动阶段保持静默IS_CHINESE? 中文 : 英文 双语提示,引导用户设置正确的环境变量或卸载,避免 resolve_model_path_xzg 分支走到不存在的方法时抛笼统 ImportError/AttributeError📝 小珠光文本框:日期时间整体识别与中文转写(2023.4.16 21:08 → 二零二三年四月十六日九点零八分)
./-/. 任意分隔符,以及 [空格/T] + HH:MM(分钟限定 2 位,避免误伤 16:9 这类比例)_DATETIME_RE:同时包含日期 + 时间(2023.4.16 21:08)_DATE_ONLY_RE:纯日期(2023-4-16)_TIME_ONLY_RE:纯时间(9:08,分钟必须 2 位,防止匹配 16:9)2023 → 二零二三、2000 → 二零零零4月 → 四月、16日 → 十六日;1月/2月 不会写成「零一月」9点、21点 → 九点、13点 → 十三点、0点 → 零点(不按 0-23 机械加「零」前缀)00分 → 整;1–9分 → 零X分(08分 → 零八分);10–59分 → 完整读数 + 分(21分 → 二十一分)2023.4.16 21:08 → 二零二三年四月十六日九点零八分🔊 音频节点:短横线音量手柄 — 换音频 / 刷新浏览器 / 重启 ComfyUI 一律重置为 100%
waveformViewer.volume(实际播放增益),又被写入序列化(音频保存写入 waveformWidget.value JSON 的 volume 字段;两个节点的原生「音量」widget 落入 widgets_values),重载工作流后会按旧值恢复 —— 导致刷新浏览器 / 重启 ComfyUI / 切换音频文件后,音量一直停在之前的百分比音频加载器(xzg_audio_loader.js):
syncVolumeFromWidget():不再读取 volWidget.value 历史值,改成强制 volWidget.value = 1.0 + viewer.setVolume(1.0)_applyAudioWidgetStyles():音量 widget 样式初始化处无条件 w.value = 1.0(钉死写入 widgets_values 的值)onExecuted(收到后端 full_peaks 出图波形):末尾 view.setVolume(1.0) + 音量 widget 写回 1.0WaveformViewer.setData() 内部硬重置 volume = 1.0 + _applyVolume(1.0);_syncWidgetsFromViewer() 把音量 widget 强制 1.0uploadAudioFiles / F5 / 重启 ComfyUI / 工作流执行完成 → 音量全部回到 100%音频保存(xzg_audio_save.js):
WaveformViewer.setData():顶部加 volume = 1.0 + _applyVolume(1.0),设置波形时即重置onExecuted 序列化 JSON:删除 saveData.volume 字段,不再把音量写回工作流;末尾显式把音量 widget 写回 1.0waveformWidget.callback(工作流重载后 widget.value 变更触发):不复用 data.volume,不用 volWidget.value 初始化,一律 viewer.volume=1.0 + viewer._applyVolume(1.0) + volW.value = 1.0node.onConfigure:同步 widget JSON 后再走一轮「强制 1.0」双保险w.name === '音量' 样式分支:无条件 w.value = 1.0 钉死序列化🗂 其他
pyproject.toml、extension.json 从 12.2.3 升至 12.3.1(Registry 侧 12.3.0 已被 2026-08-19 旧提交占用,本次通过 bump patch 版本完成新版本收录)xzg_group.js、xzg_audio_save.js、xzg_audio_loader.js、xzg_workflows.js 均通过 node --check;xzg_audiodit_loader.py、xzg_audiodit_tts.py、__init__.py 通过 Python AST 解析push tags v* 触发 → Comfy Registry 新版本 12.3.1 成功发布pyproject.toml、extension.json 从 12.2.0 升至 12.3.0xzg_audio_save.js、xzg_audio_loader.js 均通过 node --check;xzg_text_box.py 通过 Python AST 解析🛡 修复:快剪内删光音轨所有音频后,误删音频/视频加载器节点(重要)
_onKeyDown 的 Delete/Backspace 分支中,当快剪内没有选中片段/媒体时走 if (!mediaSel && !clipSel) return; 直接放行——事件穿透到 LiteGraph,删除当前选中的加载器节点。因此「删光所有音频后习惯性再按一次 Delete(或删除最后一个后连按)」就会误删节点e.preventDefault() + e.stopImmediatePropagation() 拦截,之后才执行片段/媒体删除逻辑。快剪打开期间 Delete/Backspace 永远归属快剪,不再穿透到 ComfyUI 画布;快剪关闭后监听移除,画布删除节点功能不受任何影响🗂 其他
pyproject.toml、extension.json 从 12.1.0 升至 12.2.0📦 依赖管理大升级(pyproject.toml + requirements.txt 双清单)
torch / numpy / Pillow / opencv-python / safetensors / librosa / llama-cpp-python 升级为必需项,确保 Comfy Registry 安装时核心节点(视频加载/快剪、Qwen、TTS)零缺依赖;transformers 明确 >=4.57.1(Qwen3VLForConditionalGeneration 要求);imageio_ffmpeg 统一横线为 imageio-ffmpegpip install -r requirements.txteinops 仅影响 AudioDiT 推理、mediapipe/insightface 降级到整图兜底、flash-attn 回退到 PyTorch SDPA 等)🎬 化神级视频编辑器:使用说明书替换快捷键自定义
_loadShortcuts() / _saveShortcuts() / _resetShortcuts() / _openShortcutSettings() 及按键录制 handler 全部删除,_shortcutKeys 改为直接返回 _defaultShortcuts()localStorage.removeItem("xzg_ve_shortcuts"),清理旧版本用户遗留的自定义键位,避免与固定键位冲突<svg viewBox="0 0 24 24"> 双翻页书本,描边色 #ff5252),title 改为「使用说明书」_openManual() 说明书弹窗(z-index:999999、红色顶边、最大 82vh 滚动),包含 5 大章节:
🛡 右键菜单隐藏鲁棒性修复
_hideCtxMenu 的 hideAll 事件中,e.target 可能是非 Node 对象(如 window 的 blur/resize 事件派发时 e.target 为 undefined 或 window),直接调用 menu.contains(e.target) 会抛 TypeErrorconst t = e && e.target,再加 t.nodeType === 1(元素节点)判断后才走 menu.contains(t) 判定,其他情况一律直接隐藏菜单,杜绝偶发报错干扰🗂 其他新增与维护
comfyui.yml / editor.yml:UI 界面元素快照定义(ComfyUI 主界面 + 快剪编辑器元素树引用)pyproject.toml、extension.json 从 12.0.0 升至 12.1.0🎬 化神级视频编辑器重磅升级:双视频轨 + 双音频轨(V1/V2/A1/A2)
clip.track 字段区分 v1/v2/a1/a2,_yToTrack 按鼠标 Y 坐标判定目标轨道_findClipByGlobalTime 优先查找 V2 轨道,重叠区画面自动切换为 V2;后端 render_timeline 分离 V1/V2,V1 做基底 concat,V2 通过 setpts 偏移后逐个 overlay 叠加display:none),仅显示金色虚线预览框;Shift+垂直拖动锁定 X 位置media.info.has_audio === true),V2→A2、V1→A1 同步生成金色虚线预览框,位置与宽度完全一致🎬 化神级视频编辑器:播放/缩放/间隙/裁剪全面增强
_startPlaybackLoop(视频/图片)与 _startAudioOnlyPlaybackLoop 每帧调用 _findClipByGlobalTime,自动切换 V2 覆盖画面,修复缩放时播放头与画面错位_advanceToNextClip 按最长轨道算总时长,间隙期直接黑屏,不再错误地回跳重放clip.end,超了就立即切换,修复 V2 结束前多显示一帧的问题;音频起始/结束边界才调用 _startAudioPlayback(_checkAudioBoundary),正常播放不调用,彻底消除滋滋声_splitClipAtPlayhead / _splitClipForInsertion 继承 clip.track,修复 V2/A2 裁剪后后半段丢失轨道属性(变灰消失)🎬 化神级视频编辑器:时间线 UI/交互大优化
content-box,1px 黑边 + 2px 彩边,V2 片段强制 height:100% 消除 4px 间隙_tlZoom 范围 [0.1, 20],以播放头为中心缩放(scrollLeft = playheadX - viewWidth/2),自动 clamp 边界MM:SS.cc(百分秒 0-99)改为 MM:SS:FF(帧号 0 到 fps-1),自动进位(30fps 时 5 秒 27 帧 = 00:05:27,6 秒 0 帧 = 00:06:00);媒体库时长/状态提示保持 MM:SS.cc 不变🎬 化神级视频编辑器:旗标 + 批量导出静帧
blur() 避免按钮高亮flag_00-05-20.pngsaveas 手动逐帧选路径;自定义目录模式下先弹一次目录选择框,所有旗标帧静默保存到该目录🔊 音频播放稳定性修复 + 默认质量提升
source.start(0, clampedLocal, clip.end - clampedLocal) 补上第三个 duration 参数,修复裁剪后被裁掉部分仍继续发声_startAudioPlayback 中用 _audioDecodePending Set 跟踪正在解码的 clip,await 后重检查避免重复并发,修复两片段衔接处第二个无声320🖼 其他优化与维护
rgb(0,255,100)e.stopImmediatePropagation() 防事件冲突blur() 对应工具栏按钮,避免意外高亮pyproject.toml、extension.json 从 11.7.0 升至 12.0.0🎬 小珠光合并视频节点(视频保存)预览刷新修复:
executed 监听器在 onRemoved 中被移除,导致后台工作流跑完后视频信息完全丢失,切回 Tab 预览为空,必须手动再运行一次才能刷新setNodeOutputsByExecutionId 全局 store 思路,在 app.registerExtension.init() 中注册模块级全局 executed 监听器(不随节点生命周期销毁),只要工作流执行完成就把视频信息写入 _xzgVideoOutputCache Map,key 为节点 id,完全不依赖节点是否存活onConfigure rAF 优先读 cache → ② ResizeObserver 容器可见时兜底读 cache/properties → ③ properties._xzgVideoOutput(工作流保存/加载场景兜底)三层机制确保预览 100% 恢复,不再需要手动再运行output.ui.videos / output.video 两种数据路径,_lastAppliedKey 去重避免 onExecuted 与全局 api 事件重复触发_pendingVideoUrl,不立即调用 player.load()(否则 canvas 渲染失败导致黑屏);容器变可见时自动从 pending 或 cache 恢复🎬 小珠光视频加载器宽高重置 Bug 修复:
_updateRatioWidgets 在"自定义比例"分支硬编码 wWidget.value = 0 / hWidget.value = 0,但该函数在 onConfigure 的 rAF 中被调用,时序为「configure 先恢复数值(如 1024)→ rAF 执行 → 强制重置为 0」,用户设置的分辨率瞬间丢失🎬 化神级视频编辑器全面升级(OpenCut 式裁剪 + 桥接手柄 + 历史撤销重做):
tlStart 和 start,end 不变;右手柄修改 end,tlStart 和 start 不变,彻底替代旧的三模式方向决策逻辑←||→ 红色光标(播放头同色 #ff4444),触发区域宽 10px(左右各 5px),z-index 高于普通手柄;往右拖=左片段尾扩+右片段头同步右移,往左拖=右片段头扩+左片段尾同步左移,保持相邻且缩略图同步更新_loadClipThumbs 中当可用缩略图数量 inRange.length <= need 时 inRange[i % inRange.length] 循环选取,确保放大时间线后整段有图覆盖clipRects 检测边缘避免多次吸附冲突e.repeat,焦点在播放按钮上时跳过处理,避免播放↔暂停相互抵消pointer-events: none,移除点击轨道空白处跳转逻辑,避免与片段选中冲突_updateClipSelection() 仅遍历现有 DOM 切换 xzg-ve-selected class,不重建 DOM 或重新加载缩略图;清空选中同样只切 class_pushHistory() 记录状态,支持 Ctrl+Z 撤销、Ctrl+Shift+Z/Ctrl+Y 重做_tlBaseLocked=true,阻止自适应重新计算 pxPerSec 导致片段缩放;拖动期间直接更新 DOM width/left,通过 transform: translateX(-offset) 实现左侧裁剪视觉效果,不重建 DOM 避免缩略图闪烁🖼 其他优化与维护:
web/lib/mediabunny.min.mjs:新增视频解码库(MediaBunny)web/xzg_frame_decoder.js:新增帧解码器,配合视频播放器实现高效解码pyproject.toml、extension.json 从 11.5.8 升至 11.6.0🎛️ 小珠光选择器节点全面优化:
contentH + 38 调整为 contentH + 28,确保默认 1 行节点始终为 58px,不再出现"恢复默认后节点高度被弹回68px"的问题#FFFFFF(白色),与设置面板默认值保持一致,修复旧 DEFAULT_SETTINGS 中使用灰色 #aaa 导致新建节点文字发白不明显的问题🖼 小珠光图像保存节点 Bug 修复:
_normModeVal 序列化函数只匹配了 "preview"(小写p),但切换按钮写入的是 "Preview"(大写P),导致后端始终收到 mode="Save"。现已同时匹配 "预览" / "Preview" / "preview" 三种写法🖼 小珠光图像保存-化神级节点清理与修复:
output_path 参数,避免混淆base_dir 为相对路径(如 "my_folder" 或 "{date}")时,之前因 resolved_path 始终为空导致文件被错误保存到 output 根目录。现已简化为:绝对路径 → 直接使用;相对路径 → 正确拼接到 ComfyUI output/ 下;空 → output/ 根目录resolved_path 相关的无用分支(三选一判定中有两个分支永远不可达)🔧 其他优化与维护:
locales/zh/nodeDefs.json:选择器输出端口名"数值"已改为 * 占位,更简洁xzg_group.js:视觉编组代码大幅重构精简(-1200+ 行),移除冗余逻辑xzg_audiodit_tts.py、xzg_longcat_model_cache.py、xzg_qwen_loader.py、xzg_workflows.js:多处细节调优与稳定性修复extension.json 从 11.5.0 升至 11.5.8,与 pyproject.toml 同步🎵 小珠光音频加载器全面升级:
/features 端点获取 max_upload_size,前端预检 + 服务端 HTTP 413 兜底双重校验convertEventToCanvasOffset 转换坐标 + onDragOver/onDragDrop 回调实现🎬 小珠光视频加载器大文件支持:
🌱 新增小珠光随机种子节点:
XiaozhuguangSeed 节点(双语显示:小珠光随机种子 / Xiaozhuguang Seed)_xzgQueuePromptIntercepted 标志防止重复拦截🖼 图像加载器 / 保存器优化:
locales/en/nodeDefs.json、locales/zh/nodeDefs.json)📚 文档与国际化:
🎉 重磅新增:小珠光文本框节点(双通道文本输出 + 数字智能转中文)
text:原始文本原样输出,便于其他节点直接复用text_zh_num:数字转中文后的文本,默认始终开启,可作为 AI 绘图提示词的中文描述1280x720 → 一二八零乘以七二零、1920×1080 → 一九二零乘以一零八零、1x2x3 → 一乘以二乘以三,支持乘号 x / X / × / *(前后可带空格)12岁 → 十二岁、188cm → 一百八十八厘米、75kg → 七十五千克、36.5℃ → 三十六点五摄氏度、220V → 二百二十伏、12% → 百分之十二、3小时 → 三小时 等(覆盖年龄、长度、重量、温度/电学/容量/货币/时间/百分比等白名单)第12章 → 第十二章、第1名 → 第一名、第5届 → 第五届型号1280 → 型号一二八零、12 → 一二cm → 厘米、kg → 千克、km → 千米、mm → 毫米、L/mL → 升/毫升、V/A/W/℃/℉/Ω/Pa… 等均有对应转换文档更新:
nodes/xzg_text_box.py编组拖动跟随缺陷修复:
syncNodeMembership(每 10 帧自动添加框内节点到 group.nodeIds)意外破坏,导致编组框突然停止跟随视频播放条视觉优化:
xzgLaserPulse 呼吸脉冲动画,辉光层数与强度较初版降低 45%–60%API 修复:
xzg_get_output_dir 路由函数补齐 request 形参,解决 aiohttp 自动注入 request 对象时 takes 0 positional arguments but 1 was given 的 TypeError界面交互优化:
C):「应用主题并关闭」「恢复默认颜色」「导出」「导入」「快捷键」按钮统一为仅边框、无底色风格,与其他面板一致文档更新:
国际化:
工作流加载安全与体验修复:
夺舍模式(接管官方工作流 UI)优化:
重磅新增:工作流管理功能
`(反引号),可自定义节点收藏优化:
主题面板优化:
修复与优化:
新增:自定义快速节点功能
修复:
新增:
D 键:快速执行选中的输出节点及其依赖
F 键快捷键:鼠标位于编组内按 F 执行框内节点
新增:
新增:
新增:
优化:
优化:
修复:
applyPreviewColors)applyColorPreview,颜色变更时即时刷新Canvas其他:
新增:
docs/skill-panel-alignment.txt)修复:
computeSize 与 container 高度控制逻辑优化:
splice(0,0))splice(6,0))splice(12,0))getExtraMenuOptions,不再覆盖原型💡 如有问题或建议,欢迎在 GitHub 提 Issue 或 PR。
199 commits
JavaScript
77.7%
Python
21.8%
ComfyUI 美化增强插件,提供节点收藏管理、工作流管理、主题美化、编组管理、快速节点等功能。
| 模块 | 核心能力 |
|---|---|
| ⭐ 节点收藏 | 右键收藏任意节点 / 多节点,拼音搜索、使用频率排序、最近使用、分类管理 |
| 📋 工作流管理 | 多级嵌套文件夹、拖拽导入节点、拼音搜索、回收站、夺舍模式接管官方 UI |
| 🎨 主题美化 | 多套预设色系、自定义渐变配色、实时预览、一键导出 / 导入配置 |
| ⚡ 快速节点 | 连线即出常用节点、搜索框快速添加、夺舍模式、配置导入导出 |
| 📐 田字格对齐 | 6 种对齐 + 4 种分布、拖拽尺子等距分布、长按自动布局、可自定义间距 |
| 📦 视觉编组 | 半透明框体、彩虹 / 呼吸 / 辉光动画、同级别反选、锁定、组内执行、自动收纳 |
| ⌨️ 自定义快捷键 | 后端持久化快捷键配置(换浏览器不丢失)、执行全图/选中节点/编组内节点、Ctrl+G 官方/小珠光编组选择、主题导出导入含快捷键 |
| 🕶️ 隐藏菜单 | 任意菜单项上鼠标中键点击直接隐藏该菜单项;主题面板「菜单隐藏」页集中查看 / 一键恢复、含「使用说明」标签;配置持久化到后端,云端换浏览器不丢失 |
| 📦 配置云持久化 | 收藏/工作流元数据/快捷键/菜单隐藏/面板宽度等写入后端存储,云端环境跨会话、跨浏览器共享(/xzg_cloud_store) |
| 🖼 图像节点 | 图像加载器(拖入上传/多图模式)、图像保存(懒编码+化神级自定义输出)、图像对比、分割/合并、智能裁剪 ATBC、图像回贴 ATR、人脸对齐 Face Align、图像预览 |
| 🎬 视频节点 | 视频加载器(1GB 分块上传 + 并发重试 + 4K 高清预览)、视频信息读取、帧提取、首尾帧、帧优化、合并视频 |
| 🔊 音频节点 | 音频加载器(大小限制 + 解码律动进度条 + 拖入上传 + 播放头精准交互)、音频保存、AudioDiT 离线 TTS(音色克隆/零样本/多人对话) |
| 🤖 大模型节点 | Qwen/Qwen-VL 模型加载与推理、MiniMax H3 提示词处理 |
| 🔧 实用节点 | 选择器 / 布尔(+反向)/ 数据阻断(+比较大小)/ 标题 / 滑条 / 万能滑条 / 编号切换(惰性求值)/ 随机种子 / 获取控件值 / 输入惰性判断 / SAM 点编辑器 / 文本框(数字→中文) |
| 🌐 国际化 | 遵循 ComfyUI 官方 i18n 规范,中英文界面自动切换 |
💡 全部功能均可通过右键菜单、快捷键或面板一键调用,开箱即用、零外部依赖。
本插件遵循 ComfyUI 官方 i18n 规范(PR #6558):
locales/ 目录下,按语言代码分目录:locales/en/(英文,与源一致)、locales/zh/(中文)。nodeDefs.json(节点显示名、输入/输出端口名)与 main.json(节点分类名)。| 节点名称 | 说明 |
|---|---|
| 小珠光选择器 | 点击按钮选择标签,输出对应整数值 |
| 小珠光布尔 / 反向布尔 | 开关切换 True/False;反向布尔输入取反 |
| 小珠光数据阻断 / 比较大小-数据阻断 | 开关控制数据是否传输;按大于/等于/小于比较值决定数据通断 |
| 小珠光标题 | 标题装饰节点,无实际输出 |
| 小珠光滑条 | 通过滑块调整浮点数值 |
| 小珠光万能滑条 | 浮点/整数双模式切换,右键切换类型 |
| 小珠光编号切换 | 0–49 路输入选择器,在多种数据类型间切换;惰性求值:仅执行被选中编号的上游支路,其余支路不计算 |
| 小珠光随机种子 | 标准 seed 输入与随机化功能,防止重复拦截 |
| 小珠光点编辑器 | SAM 点坐标可视化编辑器 |
| 小珠光获取控件值 | 读取工作流中指定节点的控件当前值 |
| 小珠光文本框 | 双通道文本输出,默认将阿拉伯数字智能转换为中文(量词/单位/序数/日期时间/中文口语时间、身高米数、纯数字完整读数、分辨率例外) |
| 🖼 图像处理节点 | |
| 小珠光图像加载器 | 支持拖入上传、多图/单图模式、拼音搜索、棋盘格透明背景显示;多图网格中心对齐,缩略图黑底无灰框 |
| 小珠光图像预览 | 图像预览节点 |
| 小珠光图像保存 | 保存图像,支持懒编码 + 右键保存真实分辨率 |
| 小珠光图像保存-化神级 | 自定义输出路径、文件夹选择器、JPEG/PNG/WebP 多格式 |
| 小珠光图像对比 | 两张图像并排对比查看 |
| 小珠光 IS (图像分割) / IM (图像合并) | 将图像按行列分割;将分割图像合并回原图 |
| 小珠光 ATBC (智能裁剪) | 按目标尺寸智能裁剪与补边 |
| 小珠光 ATR (图像回贴) | 将处理后的子图按坐标回贴回原图 |
| 小珠光 Face Align (人脸对齐) | 人脸关键点检测与对齐 |
| 🎬 视频处理节点 | |
| 小珠光视频加载器 | 分块上传支持最大 1GB、3 路并发 + 重试、自定义进度对话框 |
| 小珠光视频信息读取 | 读取视频分辨率、帧率、时长、总帧数等元信息 |
| 小珠光帧提取 | 按步长/间隔从视频抽取指定帧 |
| 小珠光首尾帧 | 提取视频的第一帧与最后一帧 |
| 小珠光帧优化 | 复制首帧填充到指定长度(去首帧闪烁) |
| 小珠光合并视频 | 将图像序列合成为视频(可搭配音频) |
| 🔊 音频处理节点 | |
| 小珠光音频加载器 | 上传大小限制、解码进度律动动画、拖入上传、双击上传、播放头精准交互 |
| 小珠光音频保存 | 保存音频到文件 |
| 🤖 大模型节点 | |
| 小珠光 MiniMax H3 提示词 | MiniMax H3 提示词处理节点 |
| 小珠光 Qwen Model Loader | Qwen 系列模型加载器 |
| 小珠光qwenVL | Qwen-VL 多模态指令跟随节点(依赖 transformers) |
| 小珠光 AudioDiT 零样本TTS | 严格离线版 LongCat-AudioDiT 零样本合成(与原插件共享模型目录,永不触发 HF 下载) |
| 小珠光 AudioDiT 音色克隆TTS | 严格离线版音色克隆:参考音频 3–15s + 转录文本 → 目标语音,最常用节点 |
| 小珠光 AudioDiT 多人对话TTS | 严格离线版多说话人对话:2–10 个克隆音色 + [speaker_N]: 台词标签驱动逐段合成 |
| 🧪 实用杂项节点 | |
| 小珠光输入惰性判断 | 判断输入是否被真实连接到下游使用 |
| 场景 | 输入示例 | 输出结果 |
|---|---|---|
| ① 乘积 / 分辨率(按位读 + 乘以 连接) | 1280x7201920×10801x2x3 | 一二八零乘以七二零 一九二零乘以一零八零 一乘以二乘以三 |
| ② 数字 + 量词/单位(完整读数 + 英文缩写自动转中文) | 1个女孩12岁身高188cm体重75kg温度36.5℃电压220V12% | 一个女孩 十二岁 身高一百八十八厘米 体重七十五千克 温度三十六点五摄氏度 电压二百二十伏 百分之十二 |
| ③ 第 / 其 前缀(序数) | 第12章第1名第3次第5届 | 第十二章 第一名 第三次 第五届 |
| ④ 其他(纯编号/代码/串号)(按位读) | 型号1280编号12和13 | 型号一二八零 编号一二和一三 |
💡 规则说明:只有当数字紧跟白名单内的量词/单位时,才会按「完整读数」读出;其他场景默认按位读,避免将编号读错。支持的乘号:
xX×*(前后可带空格)。支持的英文缩写:cm → 厘米、kg → 千克、km → 千米、mm → 毫米、L/mL → 升/毫升、V → 伏、A → 安、W → 瓦、℃/℉ → 摄氏度/华氏度等。
复用 LongCat-AudioDiT 原插件的建模库与推理流程,但 100% 剥离「推理时自动从 HuggingFace 下载模型/tokenizer」 的行为。 解决原插件痛点:即便本地已经下载了模型,只要 HuggingFace 不通,tokenizer 检查那一步仍会卡住 / 失败。
| 依赖 | 说明 |
|---|---|
ComfyUI-LongCat-AudioDIT-TTS 原插件 | 放在 ComfyUI/custom_nodes/ComfyUI-LongCat-AudioDIT-TTS/,本节点复用其 audiodit 建模库代码(不必卸载原插件,双方节点可共存) |
| LongCat-AudioDiT 模型目录 | 放在 ComfyUI/models/audiodit/目录名/,与原插件共享同一目录(推荐先用原插件自动下载一次,之后永远切到小珠光离线版用) |
| UMT5 tokenizer | 放在 ComfyUI/models/audiodit/umt5-base-tokenizer/,至少含 tokenizer_config.json + spiece.model(或 tokenizer.json) |
| comfy_api v3(可选) | 「多人对话 TTS」节点依赖 comfy_api.latest.IO(DynamicCombo),未安装则仅跳过多人节点,其它两个节点仍正常 |
| Python 类 | 显示名(中/英) | 输入 | 说明 |
|---|---|---|---|
XzgAudioDiTTTS | 小珠光 AudioDiT 零样本TTS / Xiaozhuguang AudioDiT Zero-Shot TTS | text, steps, guidance, device, dtype, attention, seed, keep_model_loaded | 纯文本文字转语音,无参考音色 |
XzgAudioDiTVoiceCloneTTS | 小珠光 AudioDiT 音色克隆TTS / Xiaozhuguang AudioDiT Voice Clone TTS | text + prompt_audio + prompt_text + steps/guidance/device/dtype/… | 最常用:参考音频(3–15s)和对应转录文本 → 克隆音色朗读目标文本 |
XzgAudioDiTMultiSpeakerTTS | 小珠光 AudioDiT 多人对话TTS / Xiaozhuguang AudioDiT Multi-Speaker TTS | num_speakers(2–10) + 对应 speaker_N_audio / ref_text + [speaker_1]: 台词 文本 | 逐轮克隆多音色合成;每轮后加 configurable 静音;ComfyUI v3 API 可用 |
LongCat 原插件 nodes/loader.py 的三条联网路径:
| 原函数 | 行为 | 小珠光离线版怎么替换 |
|---|---|---|
get_model_names() | 把 LongCat-AudioDiT-1B (auto download) 这种本地不存在的"虚项"也列到下拉菜单,迷惑用户 | scan_local_models() 只列真实存在于磁盘的目录,空则给占位项带警告 |
resolve_model_path() → _auto_download_model() | 本地没找到就 snapshot_download,网络不通直接卡 | resolve_model_path_xzg() 直接抛清晰的 FileNotFoundError,带本地目标路径 + HF 仓库 URL + 手动放置指引 |
_ensure_tokenizer_downloaded() | umt5 缺失 → snapshot_download → 网络不通就炸 | _find_local_tokenizer() 4 级本地回退:① models/audiodit/umt5-base-tokenizer ② 同层 umt5-base 目录 ③ ~/.cache/huggingface/hub/... snapshot ④ 原插件内兜底 → 都没有才报错并给出下载指引 |
AudioDiTModel.from_pretrained(...) | 没写 local_files_only=True,transformers 会联网补缺失文件 | 强制 local_files_only=True,且 AutoTokenizer.from_pretrained(本地路径, local_files_only=True) |
① 安装原插件 ComfyUI-LongCat-AudioDIT-TTS
↓ 让它自动把 3.5B-bf16 模型和 tokenizer 下好
② 从 ComfyUI 节点菜单切换到 「小珠光_音频 / Xiaozhuguang_Audio」分类
↓ 使用三个离线节点:零样本 / 音色克隆 / 多人对话
③ 之后即便 HuggingFace 完全无法访问,节点依然正常工作
(模型和 tokenizer 全走本地,完全不触网)
在画布任意节点或空白处右键即可使用收藏功能。
| 操作 | 方式 |
|---|---|
| 收藏节点 | 右键节点 → 选择「收藏节点」 |
| 收藏多节点 | 框选 2+ 节点 → 右键 → 选择「收藏多节点」 |
| 添加到画布 | 点击收藏面板中的节点名称 / 多节点项 |
| 取消收藏 | 右键收藏项 → 选择「取消收藏/删除工作流」 |
xzg 可搜索到「小珠光选择器」「小珠光滑条」等xiaozhu 同样匹配| 按钮 | 模式 | 排序规则 |
|---|---|---|
| 🔥 | 使用频率 | 使用次数 → 上次使用时间 |
| ⏱️ | 最近使用 | 上次使用时间 |
| A | 名称 | 按名称字母 / 拼音顺序 |
Q 键,可在面板设置中自定义提供丰富的节点主题预设与自定义配色功能。
内置多套主题色系,一键切换节点配色。
自定义快速节点功能,从节点拉出连线时可快速选择常用节点,提升工作流搭建效率。
| 操作 | 方式 |
|---|---|
| 添加到快速节点 | 右键节点 → 选择「☆ 添加到快速节点」 |
| 从快速节点移除 | 右键节点 → 选择「⭐ 从快速节点移除」 |
💡 快速节点菜单位于节点右键菜单「小珠光主题」上方。
从节点输出口拉出连线到空白处松开,菜单顶部会显示快速节点列表,点击即可创建并自动连线。
双击空白画布打开节点搜索框,搜索框顶部显示快速节点列表,点击即可添加到画布。
按 C 键打开小珠光主题面板,切换到「快速节点」Tab:
| 功能 | 说明 |
|---|---|
| 拖拽排序 | 按住左侧拖拽手柄上下拖动调整顺序 |
| 移除节点 | 点击右侧「移除」按钮 |
| 清空全部 | 一键清空所有快速节点 |
| 导出配置 | 将快速节点配置导出为 JSON 文件备份 |
| 导入配置 | 从 JSON 文件导入快速节点配置 |
在快速节点管理面板中可开启「夺舍模式」,开启后从节点拉出连线时将只显示自定义快速节点,不显示系统默认菜单。
完整的工作流管理系统,支持分类存储、搜索、拖拽导入等功能。
`(反引号),可点顶部「快捷键」按钮自定义txlj 匹配「图像连接」;tuxiang 同样匹配Ctrl+S / 顶栏),保存后本面板会自动同步显示` 键,可在面板设置中自定义可视化节点对齐工具,通过田字格面板快速对齐和分布多个节点,支持拖拽尺子等距分布和长按自动布局。
Alt + A,可在面板设置中自定义点击田字格中的对应线条即可对齐:
| 线条 | 功能 | 说明 |
|---|---|---|
| │ 左侧竖线 | 左对齐 | 所有节点左边对齐到最上方节点的左边缘 |
| │ 中间竖线 | 水平居中 | 所有节点水平中心对齐到最上方节点的中心 |
| │ 右侧竖线 | 右对齐 | 所有节点右边对齐到最上方节点的右边缘 |
| ─ 上方横线 | 上对齐 | 所有节点顶边对齐到最左侧节点的上边缘 |
| ─ 中间横线 | 垂直居中 | 所有节点垂直中心对齐到最左侧节点的中心 |
| ─ 下方横线 | 下对齐 | 所有节点底边对齐到最左侧节点的下边缘 |
点击田字格中的四个区域即可分布:
| 区域 | 功能 | 说明 |
|---|---|---|
| ◱ 左上区域 | 左对齐 + 垂直等距分布 | 左对齐的同时垂直方向均匀分布 |
| ◰ 右上区域 | 右对齐 + 垂直等距分布 | 右对齐的同时垂直方向均匀分布 |
| ◳ 左下区域 | 上对齐 + 水平等距分布 | 上对齐的同时水平方向均匀分布 |
| ◲ 右下区域 | 下对齐 + 水平等距分布 | 下对齐的同时水平方向均匀分布 |
按住中心点并向四个方向拖拽,出现尺子后根据拖拽距离进行等距分布:
按住中心点 1.5 秒 触发自动布局:
| 设置项 | 说明 |
|---|---|
| 水平间距 | 水平分布时的节点间距(默认 100px) |
| 垂直间距 | 垂直分布时的节点间距(默认 50px) |
| 主题色 | 自定义田字格面板主题色 |
| 快捷键 | 自定义打开面板的快捷键 |
视觉化节点编组工具,通过半透明框体将节点组织在一起,支持颜色、动画、绕过等多种功能。
| 方式 | 操作 |
|---|---|
| 快捷键 | 框选节点后按 Ctrl + G(默认,可在设置中修改) |
| 右键菜单 | 框选节点后右键空白画布 → 选择「📦 小珠光编组」 |
| 操作 | 方式 |
|---|---|
| 创建编组 | 选中节点后按 Ctrl + G |
| 移动编组 | 按住标题栏拖拽(框内节点跟随移动) |
| 调整大小 | 拖拽右下角 ↘ 手柄 |
| 删除编组 | 点击标题栏右侧的 × 按钮 |
| 切换绕过 | 左键单击标题栏中间区域(框内节点被绕过/恢复) |
| Ctrl+点击框体 | 按住 Ctrl 左键点击框体任意位置,快速切换绕过 |
| 打开设置 | 右键标题栏任意位置 |
| 滚轮缩放 | 在标题栏滚动滚轮缩放画布 |
| 编组嵌套 | 编组框可以包含其他更小的编组框,支持多层嵌套 |
通过点击标题栏不同区域,快速切换同级编组的绕过状态:
| 操作 | 效果 |
|---|---|
| 点击标题栏左侧 1/5 | 被点击的编组开启,同一级别的其他编组全部绕过 |
| 点击标题栏右侧 1/5 | 被点击的编组绕过,同一级别的其他编组全部开启 |
| 点击标题栏中间 3/5 | 单独切换当前编组的绕过/开启状态 |
💡 同级别指拥有相同父编组(或都在根层级)的编组。大编组内的小组与最外层编组不属于同一级别。
| 操作 | 方式 |
|---|---|
| 锁定/解锁单个编组 | 点击标题栏 🔒 锁图标(锁定后无法拖动和调整大小) |
| 一键锁定/解锁所有编组 | 按住 Ctrl + 鼠标左键点击任意锁图标 |
锁定后编组框的标题栏锁图标变为红色,禁止拖拽移动和调整大小。
| 操作 | 方式 |
|---|---|
| 执行当前编组 | 鼠标位于编组框内时按 F 键 |
按下 F 键后,只会执行当前编组(及其子编组)内的输出节点及其上游依赖,不会运行整个工作流。
💡 如果安装了 rgthree 插件,会优先调用 rgthree 的排队功能;否则使用内置实现。
右键标题栏打开设置面板,默认显示在画布右侧,标题栏可拖拽移动。
| 设置项 | 说明 |
|---|---|
| 名称 | 自定义编组显示名称,修改后实时显示 |
| 文字大小 | 调整标题文字大小(6–48px),默认 14px |
| 文字颜色 | 点击右侧颜色块可自定义标题文字颜色 |
| 背景色 | 点击七彩渐变条可自定义标题栏背景色 |
| 透明度 | 调整标题栏背景透明度(0–100%) |
| 设置项 | 说明 |
|---|---|
| 边框颜色 | 点击七彩渐变条可自定义边框颜色 |
| 边框粗细 | 调整边框宽度(1–10px),默认 2px |
| 边框透明度 | 调整边框透明度(5–100%) |
| 边框动画 | 选择边框动画效果 |
| 动画速度 | 调整动画速度(1–10) |
| 效果 | 说明 |
|---|---|
| 无 | 静态边框 |
| 渐变彩虹 🌈 | 边框色相随时间循环变化 |
| 明暗呼吸 💨 | 边框亮度按正弦波呼吸变化(使用当前颜色) |
| 辉光 ✨ | 发光效果,亮度脉动变化(使用当前颜色) |
| 流光溢彩 🎆 | 多色锥形渐变边框旋转流动 |
| 流光溢彩+明暗呼吸 | 流光溢彩 + 亮度呼吸叠加效果 |
| 设置 | 说明 |
|---|---|
| 开关 | 开启后画布移动时编组框渐隐,停止后渐入 |
| 渐入时间 | 调整渐入动画时长(1–10秒) |
Ctrl + ?)| 按钮 | 说明 |
|---|---|
| 使用说明 | 打开编组功能使用说明 |
| 应用到全部 | 一键将当前颜色、动画等设置应用到所有编组 |
| 取消 | 放弃本次修改 |
| 应用 | 保存并应用设置 |
编组框体会自动检测内部节点:
编组信息(位置、大小、颜色、动画、绕过状态等)会随工作流自动保存和恢复,保存/加载工作流时无需额外操作。
2px solid hsla(H,S%,L%,0.65) 半透明边框hsla(280,60%,55%,0.55)后端持久化的快捷键系统,配置存储于 ComfyUI 用户目录 user/xiaozhuguang/xzg_shortcuts.json(位于插件目录之外,更新 / 整体替换插件不会丢失快捷键),换浏览器、换服务器不丢失。升级后首次启动会自动把旧版插件目录下的 xzg_shortcuts.json 迁移过来。
| 动作 | 说明 |
|---|---|
| 执行全图 | 执行整个工作流(等效 Ctrl+Enter) |
| 执行选中节点 | 执行选中节点及其上游依赖,无选中时执行全图 |
| 执行编组内节点 | 执行鼠标所在编组内的节点,支持小珠光编组和原生编组 |
按 Ctrl+G 弹出选项菜单,可选择创建:
点击空白处或按 Esc 关闭菜单。
快捷键配置随主题导出/导入一起备份,可跨机器迁移。
cd ComfyUI/custom_nodes/
git clone https://github.com/xiaozhuguang/ComfyUI-xiaozhuguang.git
ComfyUI/custom_nodes/ 目录ComfyUI-xiaozhuguang/
├── __init__.py # 节点定义 + NODE_CLASS/DISPLAY_NAME_MAPPINGS + 懒编码/目录浏览等路由
├── extension.json # 扩展配置(版本 12.0.0 + JS/CSS 资源清单)
├── pyproject.toml # Comfy Registry 发布元数据
├── LICENSE # MIT 许可证
├── README.md # 本文档
├── requirements.txt # 依赖声明
├── workflows.py # 工作流管理后端 API
├── .gitignore # Git 忽略规则
├── .comfyignore # Comfy Registry 忽略规则
├── .github/workflows/
│ └── publish_action.yml # 推送 tag → 自动创建 Release + 发布到 Comfy Registry
├── docs/
│ ├── code-audit-report.md # 代码审计报告
│ └── skill-panel-alignment.txt # 设置面板弹出对齐 Skill 文档
├── locales/ # 官方 i18n 规范翻译文件
│ ├── en/ (nodeDefs.json, main.json)
│ └── zh/ (nodeDefs.json, main.json)
├── example_workflows/
│ └── example_workflows.json
├── _xzg_audiodit/ # AudioDiT 严格离线建模库(本地扫描,完全不触网)
│ ├── __init__.py
│ ├── configuration_audiodit.py
│ ├── fp8_linear.py
│ ├── modeling_audiodit.py
│ └── utils.py
├── nodes/
│ ├── xzg_seed.py # 小珠光随机种子节点
│ ├── xzg_get_widget.py # 获取控件值节点
│ ├── xzg_first_last_frame.py # 首尾帧节点
│ ├── xzg_duplicate_first_frame.py # 帧优化节点(复制首帧填充)
│ ├── xzg_frame_extract.py # 帧提取节点
│ ├── xzg_image_loader.py # 图像加载器后端
│ ├── xzg_image_preview.py # 图像预览节点
│ ├── xzg_image_save.py # 图像保存(懒编码 + 右键真实分辨率)
│ ├── xzg_image_save_custom.py # 图像保存-化神级(自定义输出路径/格式)
│ ├── xzg_image_compare.py # 图像对比节点
│ ├── xzg_image_split_merge.py # 图像分割 / 合并节点
│ ├── xzg_atbc.py # ATBC 智能裁剪
│ ├── xzg_atr.py # ATR 图像回贴
│ ├── xzg_face_align.py # Face Align 人脸对齐
│ ├── xzg_video_loader.py # 视频加载器后端(1GB 分块上传端点)
│ ├── xzg_video_info_reader.py # 视频信息读取节点
│ ├── xzg_video_combine.py # 合并视频节点
│ ├── xzg_audio_loader.py # 音频加载器后端(上传大小限制 + 解码进度端点)
│ ├── xzg_audio_save.py # 音频保存节点
│ ├── xzg_lazy_check.py # 输入惰性判断节点
│ ├── xzg_text_box.py # 文本框节点(数字转中文)
│ ├── xzg_universal_slider.py # 万能滑条节点
│ ├── xzg_h3_prompt.py # MiniMax H3 提示词节点
│ ├── xzg_qwen_loader.py # Qwen Model Loader
│ ├── xzg_qwen3_vl_instruct.py # qwenVL 多模态节点
│ ├── xzg_longcat_loader.py # AudioDiT 严格离线模型加载器
│ ├── xzg_longcat_model_cache.py # AudioDiT 模型缓存
│ ├── xzg_audiodit_tts.py # AudioDiT 离线 TTS 三节点(零样本/音色克隆/多人对话)
│ └── xzg_points_editor.py / xzg_selector.js 关联等
└── web/
├── xzg_seed.js # 随机种子节点前端
├── xzg_image_loader.js # 图像加载器前端(多图/单图/棋盘格/拖拽)
├── xzg_image_preview.js # 图像预览前端
├── xzg_image_save.js # 图像保存前端(懒编码/右键保存)
├── xzg_video_loader.js # 视频加载器前端(分块上传/自定义进度对话框)
├── xzg_video_player.js # 视频播放器前端
├── xzg_video_combine.js # 合并视频前端
├── xzg_audio_loader.js # 音频加载器前端(解码律动进度条/拖入上传/播放头交互)
├── xzg_audio_save.js # 音频保存前端
├── xzg_image_compare.js # 图像对比前端
├── node_favorites.js # 收藏管理核心逻辑
├── node_favorites.css # 收藏面板样式
├── pinyin-pro.esm.js # 拼音搜索库
├── xzg_boolean_selector.js # 布尔选择器前端
├── xzg_group.js # 编组功能
├── xzg_group.css # 编组样式
├── xzg_number_switch.js # 编号切换节点前端
├── xzg_points_editor.js # 点编辑器前端
├── xzg_selector.js # 选择器前端
├── xzg_slider.js # 滑条前端
├── xzg_theme.js # 主题核心
├── xzg_theme_presets.js # 主题预设
├── xzg_theme_panel.js # 主题面板
├── xzg_theme.css # 主题样式
├── xzg_quick_nodes.js # 快速节点功能
├── xzg_universal_slider.js # 万能滑条前端
├── xzg_workflows.js # 工作流管理前端
├── xzg_align.js # 田字格对齐功能
├── xzg_get_widget.js # 获取控件值前端
├── xzg_i18n.js # 国际化辅助
├── xzg_menu_hide.js # 菜单隐藏(夺舍模式辅助)
├── xzg_arrow_tool.js # 箭头绘制工具
├── xzg_save_utils.js # 保存通用工具
├── xzg_h3_prompt.js # MiniMax H3 前端
├── xzg_text_box.js # 文本框前端(数字转中文)
└── xzg_qwen.js # Qwen/qwenVL 前端
🖥️ 新增:小珠光系统监控悬浮窗(nodes/xzg_monitor.py + web/xzg_monitor.js)
/xzg/system_monitor_stats 接口,实时返回 GPU / CPU / 内存状态🧰 新增:节点工具与组合辅助功能
🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.1.3,推送 v14.1.3 tag 触发 GitHub Actions 自动创建 Release + 发布到 Comfy Registry⚙️ GitHub Actions 发布流程:消除 Node.js 20 弃用警告
actions/checkout@v4 → v5、softprops/action-gh-release@v2 → v3.0.3setup-python 警告来自 Comfy 官方第三方 action 内部,无法在本仓库修改)🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.1.2,推送 v14.1.2 tag 触发 GitHub Actions 自动创建 Release + 发布到 Comfy Registry↔️ 小珠光箭头:新打开工作流"先错后对"修复(web/xzg_arrow_tool.js)
🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.1.1,推送 v14.1.1 tag 触发 GitHub Actions 自动创建 Release + 发布到 Comfy Registry🖌️ 新增 BrushNet 复刻节点:CutForInpaint / BlendInpaint(nodes/xzg_brushnet_inpaint.py)
CutForInpaint:以 mask 区域为中心裁剪指定画布窗口,输出 IMAGE + MASK + VECTOR(裁剪坐标)BlendInpaint:把 inpaint 结果按高斯模糊 mask 软融合回原图,可选 origin 原位贴回🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.1.0,推送 v14.1.0 tag 触发 GitHub Actions 自动创建 Release + 发布到 Comfy Registry↔️ 小珠光箭头:新工作流串台 / 关闭残留 / 显示时机修复(web/xzg_arrow_tool.js)
🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.0.11,推送 v14.0.11 tag 触发 GitHub Actions 自动创建 Release + 发布到 Comfy Registry⌨️ 快捷键:修复 D / F 裸键在输入框内无法输入
preventDefault(),输入框 / 提示词框内打不出 D / F🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.0.10,推送 v14.0.10 tag 触发 GitHub Actions 自动创建 Release + 发布到 Comfy Registry🔤 小珠光文本框:数字转中文口语读法优化
6点15分 → 六点十五分(此前"六点一五分")1.72米 → 一米七二62 → 六十二、720 → 七百二十(6 位以内整数)720分辨率 → 七二零分辨率(保持按位读)🕶️ 菜单隐藏面板:新增「使用说明」标签页
⌨️ 快捷键:屏蔽浏览器默认 Ctrl+D(收藏当前页)
🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.0.4,推送 v14.0.4 tag 触发 GitHub Actions 自动创建 Release + 发布到 Comfy Registry🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.0.3,重新发布以递增 Comfy Registry 版本编号(代码与 14.0.1 一致)🏷️ 版本号 / 发布
pyproject.toml / extension.json 升至 14.0.2,重新发布以递增 Comfy Registry 版本编号(代码与 14.0.1 一致)⌨️ 自定义快捷键系统(后端持久化)
web/xzg_shortcuts.js,配置存储于插件目录 xzg_shortcuts.json,换浏览器/换服务器不丢失GET/POST /xzg/shortcuts 路由,设置面板「配置快捷键」按钮,支持捕获按键、选择动作、增删保存⌨️ D 键执行选中节点(自研,替代 rgthree)
getOutputNodes、recursiveAddQueueNodes、queueSelectedOutputNodes⌨️ F 键执行编组内节点(支持双编组)
⌨️ Ctrl+G 编组类型选择
🏷️ 工作流标签同步
🏷️ 版本号 / 发布
pyproject.toml 从 13.0.4 升至 14.0.0v14.0.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry🖼️ 小珠光图像保存 / 化神级:媒体资产显示 + JPG 全分辨率输出 + 画面拖动
nodes/xzg_image_save.py、nodes/xzg_image_save_custom.py):节点输出补充标准 ui.images 字段(保存模式=实际输出文件 type=output,预览模式=临时预览 type=temp),使生成图片出现在 ComfyUI 媒体管理「已生成」列表中,与原生 SaveImage 行为一致real_np 全分辨率编码;预览(3840/6400 降采样 JPG)仅用于画布防卡顿,不影响输出尺寸;PNG 输出一直是全分辨率web/xzg_image_save.js):在画面区域按下并拖动可直接移动节点;单击画面区域触发上一张/网格切换/下一张(多图时),单击网格缩略图回到单图显示ui.images 后新前端自动追加 $$canvas-image-preview 虚拟预览 widget(全分辨率输出图),叠在自定义画布(降采样预览)之上。修复为 onDrawBackground 中清空 this.imgs 并移除该 widget,自定义画布预览(3840 防卡顿)不受影响🎬 小珠光合并视频:媒体资产显示
nodes/xzg_video_combine.py)输出键从 videos(复数)改为 video(单数)。前端 parseNodeOutput 以数组键名作为 mediaType,isVideo 检查 mediaType==="video"(单数),复数形式退化为依赖文件名后缀识别,导致媒体资产视频过滤器不显示。前端自定义播放器本身兼容 ui?.videos || ui?.video,无需改 JS🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 13.0.3 升至 13.0.4.github/workflows/publish_action.yml 在推送 v13.0.4 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 13.0.4)🔤 小珠光大字文本展示节点:新增「自适应字号」与正文底色兜底
web/xzg_big_display.js)右键设置新增「自适应字号」(autoFit,复选框):开启后字号在 [4, 用户填写的字号] 区间内二分查找能放下整块文本且不超高内容区的最大字号,尽量填满内容区;节点缩小 → 字变小,节点拉大 → 字变大并被用户设定的字号封顶。bgcolor(透明时回退 #1a1a1a)铺满正文区,避免主题模式下正文区域全透明、文字悬空。🎨 主题美化:大字展示节点主题仅作用标题栏,正文不再被覆盖
web/xzg_theme.js)XiaozhuguangBigDisplay 节点主题渐变只绘制在标题栏,正文(文字显示区)完全由节点自行绘制,主题一律不绘制、不覆盖正文区域。makeDrawShapeWrapper 对大字节点显式补调 node.onDrawBackground,避免开启主题后正文文字永远不会被绘制(正文透明/无内容)。applyGradientToDOMNode / 重绘逻辑对大字节点一律跳过 DOM 主题样式,并清理历史遗留的 DOM 渐变,避免不透明 DOM 渐变盖住画布绘制的正文文字。🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 13.0.2 升至 13.0.3.github/workflows/publish_action.yml 在推送 v13.0.3 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 13.0.3)🔒 视角锁定:修复劫持文本框数字键
web/xzg_viewport_lock.js)快捷键 1-5 的 keydown 监听原先只放行 input / textarea / select,遇到使用 contenteditable 实现的自定义文本框(tag 为 div/span)时会 preventDefault() 劫持数字键,导致部分其它插件的文本框无法输入 12345。input / textarea / select / contenteditable、isContentEditable、以及焦点在 contenteditable 内部子元素(closest('[contenteditable="true"]'))。1-5 快捷恢复视角功能保持不变。🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 13.0.1 升至 13.0.2.github/workflows/publish_action.yml 在推送 v13.0.2 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 13.0.2)🖼️ 图像对比节点 Bug 修复(nodes/xzg_image_compare.py、web/xzg_image_compare.js)
new Image() 路径(首图 / 点击切换 A / 点击切换 B)均添加 onload → setDirtyCanvas(true, true),防止 6400px 级大图/慢加载时 naturalWidth 仍为 0 跳过绘制,导致图片迟迟不显示/显示不全,必须晃动鼠标才刷新sourceWidth/destWidth 裁剪偏移用 clamp(cropOffset, 0, targetW) 限制,鼠标进入右侧留白区时不再 cropOffset > targetW → B 图横向拉伸变形🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 13.0.0 升至 13.0.1.github/workflows/publish_action.yml 在推送 v13.0.1 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 13.0.1)🔤 小珠光文本框:中文朗读输出(text_zh_num,text 原文不变)优化
淼 → 邈(nodes/xzg_text_box.py):避免 LongCat AudioDiT 等 TTS 读错・:达・芬奇→达芬奇、张・芬奇→张芬奇 等你好 世界→你好世界)* 只在非乘法位置删除:1920*1080 仍读「一九二零乘以一零八零」,单独出现的 * 删除🎵 音频加载器:时间码增加「时长」显示
web/xzg_audio_loader.js)时间码右侧新增 时长XX:XX,若被红/蓝裁剪则显示裁剪后的时长,否则为总时长🎬 视频播放器 / 解码器:修复首帧黑屏
web/xzg_frame_decoder.js)取帧带时间容错:time=0 边界处部分视频首帧 PTS 非 0 取不到帧(首帧黑屏、播放一次后才正常),改为逐级小偏移重试,且复用 mediabunny「二次确认」路径renderFrameAwait:真正等待首帧解码绘制完成后再显示,替代原先只调度不等待的 renderFrameweb/xzg_video_player.js)对齐 VHS:使用原生 <video> 的节点加载时不弹转圈动画,加载期间保留上一帧画面,消除「读条」观感🎞️ 视频加载器
web/xzg_video_loader.js):拖拽红/蓝杠或参数变化时写回上游控件(PrimitiveNode / 同名 widget)并触发其回调,红蓝头联动正确;_resolveLinkedValue 优先读取连线值(widget 转 input 后自身 value 不更新)onLoadedMetadata 只应用加载范围(_applyLoadRange),不再触发 _resetToSourceVideo 把刚盖上的预览重置回原视频;参数真正变化时才由 _syncLoadRange 重置serialize=false:文件名仅作显示产物,不独立持久化/进入缓存,避免与「视频」下拉框值发散🎬 合并视频
web/xzg_video_combine.js):输出信息写入 localStorage(key = 节点 id),刷新后仍能恢复上次预览(对齐 VHS 刷新后仍有输出);不再写入 node.properties,避免并入图/extra_pnginfo 改变缓存签名导致每次重编码serialize=false(对齐官方 audioUI 范式):文件名每次执行都变化,一旦进入 widgets_values/extra_pnginfo 就会改变节点缓存签名 →「上游输入未变时仍被判定为变化 → 每次都重编码合成」🗑️ 移除「视频加载器 Pro」节点
nodes/xzg_video_loader_pro.py、web/xzg_video_loader_pro.js(含其前端注册引用),功能以普通视频加载器为准🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 12.22.0 升至 13.0.0.github/workflows/publish_action.yml 在推送 v13.0.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 13.0.0)🐛 修复:获取控件值节点与「输出到队列」兼容性
获取控件值 节点默认值兜底(nodes/xzg_get_widget.py):
model)因上游不在「获取控件值」节点可达链,被 ComfyUI 的 prompt 剪枝从 dynprompt inputs 中移除,导致误报「找不到控件」。_lookup_default_input():从目标节点 INPUT_TYPES 定义读取该控件的默认值兜底输出,重跑后目标节点补全即读到真实值,避免首次执行误报。获取控件值 节点宽度溢出修复(web/xzg_get_widget.js):
widget.width 定义为只读访问器(返回节点实际宽度),忽略属性面板写入的 368px,防止联动下拉/列表超出节点边界(与视频/音频加载器修复一致)。rgthree.queueOutputNodes(web/node_favorites.js、web/xzg_group.js):
recursiveAddNodes 在「输出节点不在默认执行链 prompt.output 里」时无空节点保护,会抛 Cannot read properties of undefined (reading 'inputs') 并触发 ComfyUI 全局「执行失败」弹窗(晨羽智云等装有 rgthree 的平台必现)。currentNode 空保护),保证在 rgthree 环境稳定执行。🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 12.21.0 升至 12.22.0.github/workflows/publish_action.yml 在推送 v12.22.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 12.22.0)🎨 UI 优化:节点收藏器与工作流管理器初始布局尺寸调整
460px → 660px,给左右两列更充裕的展示空间300px(配合 width:660px - min-width:350px 的右列,实现左定宽右弹性)min-width: 350px,避免被过度压缩gap: 10px → 0,配合分割栏紧凑布局80px → 160px,更贴近日常使用需求(中文分类名不再挤成一列)[80, 500]px,已有保存宽度的用户不受影响🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 12.20.0 升至 12.21.0.github/workflows/publish_action.yml 在推送 v12.21.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 12.21.0)☁️ 面板几何(位置/尺寸)纳入云持久化
延续上版云存储:节点收藏器面板的位置/尺寸/分割宽度、工作流管理器左侧栏宽度,之前只写各自 localStorage 键,云平台刷新/换分配即丢。本次把它们也并入服务端持久化。
web/xzg_cloud_store.js 新增面板几何 UI 态模块:
cloudUIInit():拉取云端 xzg_ui_state(面板几何合集),写回对应 localStorage 键(云优先);云端为空时把本地几何首次上云cloudUIQueueGeometry():任一几何键写完后收集全部几何,防抖 400ms 推送到云端createPanel 同步云端后读取几何;宽/高/分割宽/位置四处写点均触发 cloudUIQueueGeometry()☁️ 云平台持久化:收藏节点与工作流元数据从浏览器 localStorage 改为服务端存储
云平台(晨羽智云等)浏览器 localStorage 无法跨会话持久化(刷新/换设备即丢)。本次为「小珠光节点收藏器」和「小珠光工作流管理器」增加服务端持久化:
GET/POST /xzg_cloud_store,数据以 JSON 写入 ComfyUI 用户目录 user/xiaozhuguang/ 磁盘,含路径穿越防护与安全装饰器web/xzg_cloud_store.js(cloudLoad/cloudSave):读取优先「服务端 → 本地 localStorage → 默认值」;服务端无数据时自动把本地推上去实现首次上云;服务端不可用时静默回落本地兜底comfyui_xiaozhuguang)、工作流元数据(xzg_workflows_meta)统一改为云优先读写,防抖 600ms 落云,本地仍保留一份兜底🔧 修复:右上角功能区「快剪」设置项不显示
xzg_video_editor_launcher.js 修正设置项 ID 前缀(Xiaozhuguang. → xiaozhuguang.),与其余小珠光设置同组显示registerSetting 增加 addSetting 未就绪时的延迟重试与去重标记,避免注册失败后永久缺失🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 12.18.0 升至 12.19.0.github/workflows/publish_action.yml 在推送 v12.19.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 12.19.0)📦 依赖修复:补全 requirements.txt(git 安装缺 Qwen 依赖)
requirements.txt 曾被精简为仅 imageio-ffmpeg>=0.5.1,导致通过 git clone 安装(如晨羽智云)时,ComfyUI Manager 按 requirements.txt 安装依赖而漏装 Qwen 相关包(transformers>=4.57.1、qwen-vl-utils、llama-cpp-python、bitsandbytes 等),QwenLoader / qwenVL 节点报"未安装 / 依赖缺失"requirements.txt 必需依赖清单,与 pyproject.toml 的 dependencies 对齐,并保留可选依赖说明注释;git 安装用户执行 pip install -r requirements.txt 即可装上pyproject.toml 的完整依赖)🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 12.17.0 升至 12.18.0.github/workflows/publish_action.yml 在推送 v12.18.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 12.18.0)🔧 修复:夺舍模式误隐藏小珠光工作流按钮(前端 1.51.9 兼容)
前端更新至 1.51.9 后,侧边栏按钮标识由 class 变为 data-testid,导致夺舍模式把小珠光自己的工作流按钮误判为官方按钮而隐藏。本次统一补全两套选择器(class 与 data-testid):
_xzgTabBtnSel / _officialWfBtnSel 选择器辅助方法,兼容新旧前端按钮定位_findOfficialWorkflowButtons 补全 data-testid 兼容:isXzg 用 closest() 检查祖先链,官方按钮识别同时支持 class 与 data-testid="workflows-tab-button"_setOfficialWorkflowButtonsHidden 增加兜底:夺舍模式下强制恢复小珠光按钮显示🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 12.16.0 升至 12.17.0.github/workflows/publish_action.yml 在推送 v12.17.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 12.17.0)🔧 统一修复:属性面板开关导致节点元素溢出(widget.width 污染)
为所有自定义 canvas/DOM widget 统一添加 width 只读访问器,始终跟随节点实际宽度 node.size[0],忽略 ComfyUI(属性面板/线性模式渲染等)写入的面板侧行宽度(例 368px)。当开关右上角"属性面板"时,各行绘制/交互命中区/DOM 预览区宽度稳定,不再超出节点边界、不再随面板开/关拉伸或跳动。覆盖节点如下:
🏷️ 版本号 / 发布
pyproject.toml、extension.json 从 12.15.0 升至 12.16.0.github/workflows/publish_action.yml 在推送 v12.16.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 12.16.0)✨ 新增节点
XiaozhuguangImageFromList):从 IMAGE 输入(列表/已堆叠 batch/单张)中自 index 起连续取 length 张图。index 支持负数(-1 取最后一张),越界自动钳制;length 为连续取图数量(如列表 4 张、index=1、length=3,取第 2/3/4 张;length=1 等价单取);多张时返回列表并广播,下游逐张执行。与图像加载器「列表」模式一致,支持图片尺寸不一致、可分别预览XiaozhuguangListCount):计算输入列表的元素总数,常用于小珠光图像加载器「列表」模式等多元素输出;单个批处理张量按 batch 维统计,保证"总数=图片张数"的直觉🖼️ 小珠光图像加载器增强
∞/空/0 表示无限制,大于 0 时最多加载/显示前 N 张(批次/列表模式均生效);预览网格自适应按该上限数量排布(前端改动刷新页面即生效)= 填充或混入空白引号导致 Incorrect padding 的问题;无效脏数据(过滤后为空或解码过短,不足 PNG 签名)静默返回零遮罩、不再打印告警,仅在解码出足量数据但 PIL 仍无法识别时才告警🔧 修复 / 改进
_initCtxMenu 挂到 document/window 的捕获监听(mousedown/contextmenu/blur/resize)改为挂到实例引用,并在 close() 中配对 removeEventListener 回收,避免每次打开编辑器都重复注册、捕获层越积越多(长时间运行后可能干扰全局右键,刷新页面才会恢复)free 读数更真实;新增"该模型上次成功加载的 GPU 层数"兜底,中断/卸载后显存读数偏低时复用上次成功值,避免模型整体掉到 CPU 推理长时间卡顿;输出更明确的调整说明🖼️ 小珠光图像加载器:多图网格优化
contain 显示时图片两侧空白为黑色,观感更干净✨ 大字展示(XiaozhuguangBigDisplay)全面增强
xzg_big_display.js 此前未登记到 extension.json 的 js 列表,前端未被加载(新增菜单/绘制等全部失效),现已补上IS_CHANGED 兼容节点输入:接收忽略 ComfyUI 传入的 input 等关键字参数,始终返回 True 刷新展示,消除 got an unexpected keyword argument 'input' 警告🐛 小珠光 H3(XiaozhuguangNinimaxH3Prompt)模型失效错误提示优化
unload_after 选项或重新执行 Qwen Model Loader 后再运行本节点,便于定位✨ 新增节点
XiaozhuguangImageScaleByAspectRatioV2):小珠光图片缩放(按宽高比)的高性能版本,参数与 V2 保持一致,计算速度更快。直接从张量形状获取尺寸避免逐图转 PIL,整批图像通过 torch.nn.functional.interpolate 批量插值;对 torch 不支持的 lanczos/hamming 插值自动回退原生 PIL 路径🐛 修复 / 改进
XiaozhuguangPointsEditor)bbox 输出改为结构化列表:连接口类型由 STRING 调整为 BOXES,输出每个框一个元素 [x1, y1, x2, y2](像素坐标取整)的结构化列表,修复连接到小珠光批次计数时始终显示 0 框的问题0 到 总帧数(如 30 帧为 0..30),0 对应第 1 帧画面,29/30 均显示第 30 帧画面,右下角可显示 30/30;后端输出的 frame_index 取 min(帧号, 总帧数-1) 始终落在有效范围内XiaozhuguangImageLoader)移除调试输出:删除遮罩数据长度的控制台 printhideOnZoom: false,画布缩放到细节级别阈值以下时仍显示已加载图片,与内置图像/视频预览组件行为一致(前端改动刷新页面即生效,无需重启后端)🐛 修复
XiaozhuguangBigDisplay)IS_CHANGED 调用报错:原为类属性 IS_CHANGED = True(布尔量),ComfyUI 在生成缓存签名时会把 IS_CHANGED 当作函数调用,触发 'bool' object is not callable,并在控制台打印 [WARNING] WARNING: 'bool' object is not callable。已改为返回 True 的 @classmethod,语义不变(始终刷新大字展示),并消除该警告⚡ 性能优化:帧优化 / 帧提取 惰性化 + 合并视频 内容级去重
XiaozhuguangDuplicateFirstFrame)惰性化:移除强制每次重算的 IS_CHANGED→NaN,前置图像输入未变时直接命中 ComfyUI 输入缓存,不再重复计算;同时移除控制台 printXiaozhuguangFrameExtract)惰性化:同样改为默认缓存(含 front_fill/back_fill 参数变化时才重算),并移除全部控制台 printXiaozhuguangVideoCombine)内容级惰性去重:即使上游每次重新生成相同内容的帧,只要送入的图像/音频内容(SHA-256 指纹)与各项参数均未变且上次文件仍在,就直接复用上次编码文件、跳过 export_to_video——不再重新编码、不再出现编码读条、不新增编号文件xzg_video_combine.py 中遗留的无用变量✨ 新增节点
XiaozhuguangMaskInvert):一键反转遮罩XiaozhuguangImageMaskPreview):图像与蒙版同框预览🔧 其它优化
_compute_crop_box 的 while 循环改为解析式计算;MASK 按实际维度稳健处理(仅在 ndim==4 时去通道,通过 mask_batched 决定是否按帧索引,单遮罩直接广播复用,避免 IndexError)🎬 视频加载 / 视频保存(共享播放器):修复「加载上限截断视频后,单次播放仍会播完整段声音」
XiaozhuguangVideoPlayer,问题来源于 _startAudioPlayback:音频源播放的是 decodeFullAudio() 解码出的完整音频缓冲,且 AudioBufferSourceNode.start(0, offset) 会一路播到缓冲末尾,完全不理会「加载上限」截断的画面结束点_computeEndFrame() 计算剩余可播时长,通过 start(0, localTime, playLen) 的第三参严格限定音频到截断结束点同时停止;未截断时播放长度=剩余全长,声音照常播完,无回归frameLimit/fps 限制)均正确🎬 化神级合并视频节点:修复「文件名前缀含子目录时只能保存、无法预览」
xzg_video/xxx 而非 xxx),后端会把视频正确保存到 output/xzg_video/xxx_00001.mp4,但返回给 UI 的 subfolder 此前被错误置空,导致前端 /view 无法定位子目录文件而预览失败folder_paths.get_save_image_path 返回结构中的真实子目录(第 4 位)被正确捕获并透传给前端;同时修正了元组解包顺序(上版误把第 3 位的整数计数器当子目录,导致 TypeError: expected str, bytes or os.PathLike object, not int)📚 重点参考:化神级视频编辑器(快剪/加载器)的 WebCodecs 解码、统一时钟多轨播放、MediaBunny 集成思路,参考了 OpenCut-app/OpenCut 项目的实现。
🎬 化神级视频编辑器:统一时钟多轨渲染内核(参考 OpenCut 单时钟模型)
performance.now)驱动全局时间 gt」,播放态每个 rAF tick 只渲染当前 gt 一帧,重复 tick 落到同帧号=同一帧,彻底修复「播放几秒后画面与时间码加速快跑」的经典问题_renderLayersOnce(gt) 作为单帧合成内核:播放、seek、拖动、刷新四条路径统一走同一入口,消除旧路径下 17+ 方法各自维护帧号与缓存导致的错乱localTime - clip.start)」改为「源视频绝对帧号」,修复裁掉头部的片段仍从源第 0 帧开始播放的 bug🎬 化神级视频编辑器:预取节拍锁定 + 缓存淘汰中心锚定播放目标帧
topFilled ≥ target+窗口)时本次预取零拉帧,预取速率从「按调用频率」严格锁定为「按播放速率」,领先量稳态保持约 29 帧不再膨胀decoder._targetFrame)锚定「播放目标帧号」(原来是预取头本身),即使领先再多,目标帧也永远处于淘汰中心窗口,不会被挤出缓存🎬 化神级视频编辑器:解码器隔离 + 转码兜底(HEVC/MP3 → H.264+AAC)
decoderPool.get(filename) 为不同文件返回独立实例),快剪编辑器与视频加载器的解码器池完全隔离,避免共享实例引发的资源竞争与画面错乱fastcut-cache/h264/、加载器产物存 input/xzg-h264/,两套转码流程相互独立🖼️ 小珠光图像加载器:侧栏图标化 + 预览区最大化
padding:0 并贴顶贴左对齐,空态说明改为贴顶贴左;四周边框与内容的空隙显著压缩🗂 其他
pyproject.toml、extension.json 从 12.7.0 升至 12.8.0requirements.txt 保持 imageio-ffmpeg>=0.5.1,FFmpeg 环境随包自动安装xzg_video_editor.js、xzg_image_loader.js、xzg_frame_decoder.js、xzg_group.js、xzg_video_player.js、xzg_selector.js、xzg_video_combine.js 通过 node --check;相关后端节点 .py 通过 Python AST 解析.github/workflows/publish_action.yml 在推送 v12.8.0 tag 时自动创建 GitHub Release + 发布到 Comfy Registry(版本 12.8.0)⚡ 小珠光点编辑器:性能优化(长图/高帧拖拽更流畅)
_baseCache,交互时只做一次同尺寸快速 blit(GPU 加速),显著降低重绘开销requestAnimationFrame 合并,一帧只画一次onDrawForeground 每帧强制 reflow🖼️ 小珠光点编辑器:预览清晰度改为「像素量」
preview_pixels 参数(单位:万像素,100 = 100 万像素 / 1MP):原图总像素超过该值才等比缩放,0 = 不缩放用原始尺寸;坐标自动等比放大回原图,标注结果不受影响🎬 快剪:右上角功能区显示开关(ComfyUI 设置项)
🗂 其他
pyproject.toml、extension.json 从 12.6.1 升至 12.7.0xzg_points_editor.js、xzg_video_editor_launcher.js 通过 node --check;__init__.py 通过 Python AST 解析push tags v* 触发 → Comfy Registry 新版本 12.7.0 发布🎬 化神级视频编辑器:音频模式(从快剪加载音频)布局修复
_applyModeFilter 面板高度同步设为 71 + eachH * 2,与轨道总高一致,滚轮增量保持 10px 无跳变🎬 化神级视频编辑器:时间线空隙选中 + Delete 删除(单轨道)
🎬 化神级视频编辑器:播放头驱动片段选中(配合轨道名激活)
_scheduleScrubSeek)、点刻度跳转(_seekToGlobalTime)、左右箭头帧步进、自动播放 4 个循环(视频/纯音频/图片片段/空隙等待)🎬 化神级视频编辑器:多选增强(媒体库 + 时间线)
_handleClipClickSelection,锚点规则与媒体库一致;不同轨道间点选自动退化为单选🔊 音频节点:波形缓存 + 红蓝线/音量持久化 + 发送到加载器
绝对路径 + mtime + size 为键缓存 peaks/duration/sample_rate(200 条 FIFO),命中缓存直接返回已完成 job 不启 FFmpeg 线程;前端会话缓存 _xzgWaveformCache(100 条 FIFO),切工作流恢复同一音频时零网络请求秒出波形;文件被覆盖上传基于 mtime+size 自动失效{peaks, duration, range, volume};拖动红/蓝线结束(onRangeChange)、拖音量线/双击(onVolumeChange)、改起始/时长 widget 时局部回写;切换工作流恢复同一音频时 range + volume 同步还原(clamp 防御异常);syncVolumeFromWidget(onConfigure 强制 1.0)改为直接赋值不触发回调,避免污染缓存持久化音量xxx.mp3 [output] 或 xzg_preview_{uuid}.mp3 [temp],音频加载器原生支持 output/temp/input 三种后缀解析;预览模式(temp)执行后立即发送可用(刷新/重载工作流后恢复禁用,避免 temp 文件被清理后 404)preventDefault + stopPropagation + stopImmediatePropagation)、processMouseDown hook 返回 true、processContextMenu hook 原 return; 改为 return true(明确"已处理");命中波形区只弹自定义「保存格式 + 发送到音频加载器」菜单,ComfyUI 原生节点菜单不再弹出🗂 其他
pyproject.toml、extension.json 从 12.2.1 升至 12.2.3xzg_video_editor.js、xzg_audio_save.js、xzg_audio_loader.js 均通过 node --check;xzg_audio_loader.py 通过 Python AST 解析🔊 修复:小珠光音频加载器 — 点击虚线下(下半区分界线以下)偶发不播放音频
问题现象:同一音频,有时点波形虚线下能立即播放/暂停,有时点同一个位置却完全没反应 — 呈现出「偶发不播放」。复现路径:拖完播放头立刻点虚线下、或者靠近左侧音量线/红色起始线/蓝色结束线的位置点虚线下,几乎必现
根因 1 — 200ms 防误触守卫吞了整个虚线下点击:handleMouse 入口对 isDragging 或「拖动播放头结束 200ms 内」做了全量拦截 return true,只要上一次操作是拖播放头,立刻点虚线下的 pointerdown 直接被吞,不走 togglePlay
根因 2 — 起始/结束把手「全高度命中」判定:红色 startX、蓝色 endX 两侧 ±14px(handleWidth=14)范围内,点击在虚线下也被判成 dragType='start'/'end' → 进入 isDragging=true 分支,pointerdown 不会调用 togglePlay,原 _handleMouseUp 也没有针对「没拖动」的兜底播放
根因 3 — 左侧音量把手命中:音量(尤其 100% 或更低)的水平线位于中下区域,点虚线下恰好落在 Math.abs(localY - volY) ≤ 5 且 localX ∈ [pad, pad+40] 时 → 被判 dragType='volume' → 同根因 2,无播放
修复 1 — 防误触守卫缩小到「仅上半区」:入口守卫改为 !lowerHalf && (isDragging || _lastPlayheadEnd < 200ms),虚线下(分界线及以下)永远放行,防止拖完播放头后立刻点虚线下被吞
修复 2 — 下半区远离把手 → 直接走播放/暂停:把手命中之前新增分支:lowerHalf && 距离 startX > handleWidth && 距离 endX > handleWidth → 直接单单击 togglePlay() / 双击 onUpload(),不进入 dragging 态,杜绝「把手误判导致永远不播放」
修复 3 — mouseup 兜底播放:新增 _dragStartedInLowerHalf 标志,pointerdown 按下时记录是否位于虚线下(包括撞到音量把手的特殊情况 'volume')。_handleMouseUp 末尾在 !_dragMoved(点击没有真正拖动,距离小于 _dragThreshold)且 startedInLowerHalf 时,补一次 togglePlay() —— 即便真的进入了 start/end/volume dragging 判定,只要是虚线下的「单击」,松开时也一定能播放
行为一致性:虚线上(上半区)的拖动播放头、范围 start/end 把手、音量拖动手柄完全不变;上半区单点仍会跳转播放头不改变播放状态
🗂 其他
pyproject.toml、extension.json 设为 12.2.1xzg_audio_loader.js 通过 node --check🚀 小珠光大字展示:显示区精修 + 字号彻底自由缩放
Math.min(fs, fs*scale) 的上限钳制,改为 fs = fs*scale 双向自由缩放——节点拉大字号跟着放大,节点缩小字号随之缩小,不再被原设置值锁死clip() 强制裁剪,文字绝不遮挡输入端或溢出节点🗂 其他
pyproject.toml、extension.json 从 12.6.0 升至 12.6.1xzg_big_display.js 通过 node --checkpush tags v* 触发 → Comfy Registry 新版本 12.6.1 发布📦 小珠光编组:边框/标题栏与节点、背景完全同步渲染(修复缩放时“边框先动后追平”的时间线抖动)
updatePositions()(改 DOM 位置/尺寸),随后 canvas 才在下一帧 onDrawBackground 里按新 scale 重绘背景和节点,导致边框“领先”背景一帧updatePositions() 的唯一调用点只能是 onDrawBackground(由 setupCanvasBgDraw 挂载的 onDrawBackground 回调,先 self.updatePositions() 再 self._drawGroupBackgrounds()),绝对禁止在独立 rAF(原 startSyncLoop)或任何事件 handler 中提前写 DOM 尺寸;syncNow 统一只做 app.canvas.setDirty(true, true) 触发重绘,把“编组 DOM → 背景 → 节点”三件事锁在同一 canvas 渲染帧、同一 scale 值下一次性完成,视觉上零抖动fadeInStartNow = performance.now() 记录同刻起点,_fadeStart / _fadeDur / _fadeTarget 写入编组对象,canvas 背景渐变与 DOM opacity 过渡按同一时间戳线性插值计算,不再读 getComputedStyle(避免 CSS transition 与重绘不同步导致的档位跳变),两者连续无级同步⭐ 节点收藏:设置面板紧凑化 + 开关对齐 + 标签永不折行
autoCloseAfterInsert)flex: 1 1 0 占满剩余宽度,把 toggle 推到最右端,两行开关严格对齐(此前文字长度不同时开关位置前后错位)white-space: nowrap + text-overflow: ellipsis 兜底,未来再长的中文字符也不会在 210px 窄面板里折行12/16px → 6/16px 并固定字号 13px;各行 gap 16px → 6px;内容区 padding 12px → 8/12/10px;使用频率行距 12px → 6px;底部按钮区与按钮高度同步收紧;设置面板整体高度明显压缩🗂 其他
pyproject.toml、extension.json 从 12.5.0 升至 12.6.0xzg_group.js、node_favorites.js 通过 node --checkpush tags v* 触发 → Comfy Registry 新版本 12.6.0 发布🎬 视频加载器:预览视频自动重置为源视频 + 跳过帧数输出
_isPreviewLoaded 标志 + _resetToSourceVideo();_syncLoadRange(跳过帧/加载上限变动时)、下拉切视频、拖入上传三个入口都会触发重置,重新 player.load(原视频URL),总帧数恢复原视频全长,已有 syncCustomSize() / setLoadRange 机制自动应用当前渲染参数clamp(skip, savedFrame, end-1) 回放到加载范围内对应帧,不会跳回 0;requestAnimationFrame 延迟一帧执行 load,避免数字输入框拖动后 pointerup 与重渲染冲突导致意外进入编辑模式RETURN_TYPES 扩展 (FLOAT,INT,INT,INT,STRING,INT),第 6 口 skip_frames 从视频加载器写入的 info.skip_frames 读取(旧版加载器无此字段回退 0,int() 防御异常),方便下游节点精确对齐到「实际加载的第一帧」而非原视频第 0 帧locales/en/nodeDefs.json + locales/zh/nodeDefs.json 为 XiaozhuguangVideoInfoReader 新增 skip_frames / 跳过帧数 第 5 输出口翻译(与 RETURN_NAMES index 5 一一对应)xzg_video_loader.py 预览视频生成成功后的 print 调试行,减少 stdout 刷屏🔲 小珠光布尔:节点可自由拖拽大小 + 按钮等比自适应(参照小珠光选择器布局算法)
this.resizable = true + this.flags.resizable = true;onResize 强制最小尺寸 宽 120 / 高 58(与选择器一行底线一致);设置面板「应用」不再强行改回固定尺寸,仅兜底最小尺寸getButtonRects(y, W, settings, availableH):左右各 6px 边距 → availableW = W-12;顶部 4px / 底部 8px;availableH > 自然 btnH 时按钮等比放大填满,不足时缩小避免溢出;按钮间比例关系(settings.widths / settings.btnWidth 决定)始终保持不变DEFAULT_SETTINGS.fontColor 从 "#aaa" 改为 "#FFFFFF",与选择器默认字体色一致ctx.textBaseline = 'alphabetic' + ctx.measureText 取 actualBoundingBoxAscent/Descent 计算基线偏移 (ascent-descent)/2,大字体下不再偏上;字体大小 clamp(8, settings.fontSize, r.h*0.85) 防止超出按钮node.onMouseDown:原 widget.mouse 命中受 computeSize 返回高度限制(返回极小值后点击不到),改为 onMouseDown 覆盖整个节点区域;widget.mouse 仅放行事件;widget.computeSize 返回 [width, 4] 不干预节点高度,完全交给用户自由拖动naturalW = falseW + gap + trueW + 12,保证新建节点按钮不被拉得过宽,符合默认视觉🗂 其他
pyproject.toml、extension.json 从 12.4.0 升至 12.5.0xzg_boolean_selector.js、xzg_video_loader.js 通过 node --check;xzg_video_info_reader.py、xzg_video_loader.py、__init__.py 通过 Python AST 解析push tags v* 触发 → Comfy Registry 新版本 12.5.0 发布🔀 小珠光编号切换:惰性求值(参考 easy-use anythingIndexSwitch)
valueN 输入全部声明 {"lazy": true},新增 check_lazy_status —— 切换 select 编号时,执行引擎只调度被选中编号对应的上游工作流,其余编号的上游完全不执行(省去冗余计算 / 大模型加载 / 采样等开销)check_lazy_status 返回 ["value{select}"],引擎 make_input_strong_link 强制求值该支路并返回 PENDING,第二次进入 switch 输出结果kwargs 中,不发起请求,静默输出 None,规避 easy-use 原版会触发的引擎 NodeInputErrorselect 经 int() 转换并 clamp 到 [0, 49];上游输出恰为 None 时引擎会过滤请求,不会死循环⭐ 节点收藏:自定义使用频率
showNodeInputDialog 自定义输入框组件(支持 ESC / 点遮罩取消),后续弹窗类交互统一复用📍 SAM 点编辑器:会话级点缓存 + 布局修复
POINTS_SESSION_CACHE,切换工作流 / 更换图片均不丢失已标注的点;仅刷新浏览器(模块重载)后清空;key 为 ${workflowKey}::${nodeId}🗂 其他
pyproject.toml、extension.json 从 12.3.1 升至 12.4.0__init__.py 通过 Python AST 解析;xzg_number_switch.js、xzg_points_editor.js、node_favorites.js 通过 node --checkpush tags v* 触发 → Comfy Registry 新版本 12.4.0 发布📦 小珠光编组:背景色、背景出现动画、缓入缓出、UI 布局重整
bgColor 字段(rgba,默认透明),不写入 DOM 框体(overlay 在画布之上会遮挡节点),改为挂载到 LiteGraph onDrawBackground 回调(背景网格之后、连线和节点之前),直接在 graph 坐标空间按 bounds 绘制;绘制范围 [b.x, b.y+18, w, h-18] 不覆盖标题栏(避免透过半透明 headerBgColor 混色);顶部两角直角、底部两角 8/scale 圆角匹配 DOMgetComputedStyle(el).opacity(CSS transition 中 el.style.opacity 瞬间即终值,computed 才是每帧过渡值);渐入时动画启动硬上限 700ms(min(700, max(80, fadeInMs*0.4)),避免渐入滑块最大 8000ms 时等比例等待长达数秒)updatePositions 末尾几何 hash 检测(拖框体/resize/收纳)触发 setDirty;渐入+背景动画窗口用 rAF 循环 _kickCanvasRepaint;动画中 _bgAnimRepainting 防重入标记直到所有编组动画窗口过期easeInOutCubic(先慢→中间快→结尾慢)。none 默认无;wipedown/wipeup/wiperight/wipeleft 四向卷帘;centerout 中心扩散;新增 edgesin 从外往内(左右两侧向中间并集 clip);新增 clockwipe 时针旋转(12点方向顺时针扇形扫过,radius=对角线/2+1,极小进度用 lineTo 退化三角防 arc 起止角相同变整圆)bgAnimation/bgAnimDuration 序列化、快照回滚、应用到全部、localStorage 新建继承均覆盖setupCanvasBgDraw 以链式包装旧回调(兼容 ComfyUI 自身),初始化 canvas 未就绪时最多 60 次 100ms 重试🔊 LongCat AudioDiT 节点默认启用开关修复
XZG_ENABLE_AUDIODIT 开关逻辑写反——只要不设环境变量节点就不可见,导致升级后用户画布上原有的 AudioDiT 节点全部消失、模型/tokenizer 缺失错误也无法触发XZG_DISABLE_AUDIODIT=1 才关闭;模型缺失/目录为空的提示延迟到首次执行再打印 stderr(含 [小珠光] / [Xiaozhuguang...] 前缀),启动阶段保持静默IS_CHINESE? 中文 : 英文 双语提示,引导用户设置正确的环境变量或卸载,避免 resolve_model_path_xzg 分支走到不存在的方法时抛笼统 ImportError/AttributeError📝 小珠光文本框:日期时间整体识别与中文转写(2023.4.16 21:08 → 二零二三年四月十六日九点零八分)
./-/. 任意分隔符,以及 [空格/T] + HH:MM(分钟限定 2 位,避免误伤 16:9 这类比例)_DATETIME_RE:同时包含日期 + 时间(2023.4.16 21:08)_DATE_ONLY_RE:纯日期(2023-4-16)_TIME_ONLY_RE:纯时间(9:08,分钟必须 2 位,防止匹配 16:9)2023 → 二零二三、2000 → 二零零零4月 → 四月、16日 → 十六日;1月/2月 不会写成「零一月」9点、21点 → 九点、13点 → 十三点、0点 → 零点(不按 0-23 机械加「零」前缀)00分 → 整;1–9分 → 零X分(08分 → 零八分);10–59分 → 完整读数 + 分(21分 → 二十一分)2023.4.16 21:08 → 二零二三年四月十六日九点零八分🔊 音频节点:短横线音量手柄 — 换音频 / 刷新浏览器 / 重启 ComfyUI 一律重置为 100%
waveformViewer.volume(实际播放增益),又被写入序列化(音频保存写入 waveformWidget.value JSON 的 volume 字段;两个节点的原生「音量」widget 落入 widgets_values),重载工作流后会按旧值恢复 —— 导致刷新浏览器 / 重启 ComfyUI / 切换音频文件后,音量一直停在之前的百分比音频加载器(xzg_audio_loader.js):
syncVolumeFromWidget():不再读取 volWidget.value 历史值,改成强制 volWidget.value = 1.0 + viewer.setVolume(1.0)_applyAudioWidgetStyles():音量 widget 样式初始化处无条件 w.value = 1.0(钉死写入 widgets_values 的值)onExecuted(收到后端 full_peaks 出图波形):末尾 view.setVolume(1.0) + 音量 widget 写回 1.0WaveformViewer.setData() 内部硬重置 volume = 1.0 + _applyVolume(1.0);_syncWidgetsFromViewer() 把音量 widget 强制 1.0uploadAudioFiles / F5 / 重启 ComfyUI / 工作流执行完成 → 音量全部回到 100%音频保存(xzg_audio_save.js):
WaveformViewer.setData():顶部加 volume = 1.0 + _applyVolume(1.0),设置波形时即重置onExecuted 序列化 JSON:删除 saveData.volume 字段,不再把音量写回工作流;末尾显式把音量 widget 写回 1.0waveformWidget.callback(工作流重载后 widget.value 变更触发):不复用 data.volume,不用 volWidget.value 初始化,一律 viewer.volume=1.0 + viewer._applyVolume(1.0) + volW.value = 1.0node.onConfigure:同步 widget JSON 后再走一轮「强制 1.0」双保险w.name === '音量' 样式分支:无条件 w.value = 1.0 钉死序列化🗂 其他
pyproject.toml、extension.json 从 12.2.3 升至 12.3.1(Registry 侧 12.3.0 已被 2026-08-19 旧提交占用,本次通过 bump patch 版本完成新版本收录)xzg_group.js、xzg_audio_save.js、xzg_audio_loader.js、xzg_workflows.js 均通过 node --check;xzg_audiodit_loader.py、xzg_audiodit_tts.py、__init__.py 通过 Python AST 解析push tags v* 触发 → Comfy Registry 新版本 12.3.1 成功发布pyproject.toml、extension.json 从 12.2.0 升至 12.3.0xzg_audio_save.js、xzg_audio_loader.js 均通过 node --check;xzg_text_box.py 通过 Python AST 解析🛡 修复:快剪内删光音轨所有音频后,误删音频/视频加载器节点(重要)
_onKeyDown 的 Delete/Backspace 分支中,当快剪内没有选中片段/媒体时走 if (!mediaSel && !clipSel) return; 直接放行——事件穿透到 LiteGraph,删除当前选中的加载器节点。因此「删光所有音频后习惯性再按一次 Delete(或删除最后一个后连按)」就会误删节点e.preventDefault() + e.stopImmediatePropagation() 拦截,之后才执行片段/媒体删除逻辑。快剪打开期间 Delete/Backspace 永远归属快剪,不再穿透到 ComfyUI 画布;快剪关闭后监听移除,画布删除节点功能不受任何影响🗂 其他
pyproject.toml、extension.json 从 12.1.0 升至 12.2.0📦 依赖管理大升级(pyproject.toml + requirements.txt 双清单)
torch / numpy / Pillow / opencv-python / safetensors / librosa / llama-cpp-python 升级为必需项,确保 Comfy Registry 安装时核心节点(视频加载/快剪、Qwen、TTS)零缺依赖;transformers 明确 >=4.57.1(Qwen3VLForConditionalGeneration 要求);imageio_ffmpeg 统一横线为 imageio-ffmpegpip install -r requirements.txteinops 仅影响 AudioDiT 推理、mediapipe/insightface 降级到整图兜底、flash-attn 回退到 PyTorch SDPA 等)🎬 化神级视频编辑器:使用说明书替换快捷键自定义
_loadShortcuts() / _saveShortcuts() / _resetShortcuts() / _openShortcutSettings() 及按键录制 handler 全部删除,_shortcutKeys 改为直接返回 _defaultShortcuts()localStorage.removeItem("xzg_ve_shortcuts"),清理旧版本用户遗留的自定义键位,避免与固定键位冲突<svg viewBox="0 0 24 24"> 双翻页书本,描边色 #ff5252),title 改为「使用说明书」_openManual() 说明书弹窗(z-index:999999、红色顶边、最大 82vh 滚动),包含 5 大章节:
🛡 右键菜单隐藏鲁棒性修复
_hideCtxMenu 的 hideAll 事件中,e.target 可能是非 Node 对象(如 window 的 blur/resize 事件派发时 e.target 为 undefined 或 window),直接调用 menu.contains(e.target) 会抛 TypeErrorconst t = e && e.target,再加 t.nodeType === 1(元素节点)判断后才走 menu.contains(t) 判定,其他情况一律直接隐藏菜单,杜绝偶发报错干扰🗂 其他新增与维护
comfyui.yml / editor.yml:UI 界面元素快照定义(ComfyUI 主界面 + 快剪编辑器元素树引用)pyproject.toml、extension.json 从 12.0.0 升至 12.1.0🎬 化神级视频编辑器重磅升级:双视频轨 + 双音频轨(V1/V2/A1/A2)
clip.track 字段区分 v1/v2/a1/a2,_yToTrack 按鼠标 Y 坐标判定目标轨道_findClipByGlobalTime 优先查找 V2 轨道,重叠区画面自动切换为 V2;后端 render_timeline 分离 V1/V2,V1 做基底 concat,V2 通过 setpts 偏移后逐个 overlay 叠加display:none),仅显示金色虚线预览框;Shift+垂直拖动锁定 X 位置media.info.has_audio === true),V2→A2、V1→A1 同步生成金色虚线预览框,位置与宽度完全一致🎬 化神级视频编辑器:播放/缩放/间隙/裁剪全面增强
_startPlaybackLoop(视频/图片)与 _startAudioOnlyPlaybackLoop 每帧调用 _findClipByGlobalTime,自动切换 V2 覆盖画面,修复缩放时播放头与画面错位_advanceToNextClip 按最长轨道算总时长,间隙期直接黑屏,不再错误地回跳重放clip.end,超了就立即切换,修复 V2 结束前多显示一帧的问题;音频起始/结束边界才调用 _startAudioPlayback(_checkAudioBoundary),正常播放不调用,彻底消除滋滋声_splitClipAtPlayhead / _splitClipForInsertion 继承 clip.track,修复 V2/A2 裁剪后后半段丢失轨道属性(变灰消失)🎬 化神级视频编辑器:时间线 UI/交互大优化
content-box,1px 黑边 + 2px 彩边,V2 片段强制 height:100% 消除 4px 间隙_tlZoom 范围 [0.1, 20],以播放头为中心缩放(scrollLeft = playheadX - viewWidth/2),自动 clamp 边界MM:SS.cc(百分秒 0-99)改为 MM:SS:FF(帧号 0 到 fps-1),自动进位(30fps 时 5 秒 27 帧 = 00:05:27,6 秒 0 帧 = 00:06:00);媒体库时长/状态提示保持 MM:SS.cc 不变🎬 化神级视频编辑器:旗标 + 批量导出静帧
blur() 避免按钮高亮flag_00-05-20.pngsaveas 手动逐帧选路径;自定义目录模式下先弹一次目录选择框,所有旗标帧静默保存到该目录🔊 音频播放稳定性修复 + 默认质量提升
source.start(0, clampedLocal, clip.end - clampedLocal) 补上第三个 duration 参数,修复裁剪后被裁掉部分仍继续发声_startAudioPlayback 中用 _audioDecodePending Set 跟踪正在解码的 clip,await 后重检查避免重复并发,修复两片段衔接处第二个无声320🖼 其他优化与维护
rgb(0,255,100)e.stopImmediatePropagation() 防事件冲突blur() 对应工具栏按钮,避免意外高亮pyproject.toml、extension.json 从 11.7.0 升至 12.0.0🎬 小珠光合并视频节点(视频保存)预览刷新修复:
executed 监听器在 onRemoved 中被移除,导致后台工作流跑完后视频信息完全丢失,切回 Tab 预览为空,必须手动再运行一次才能刷新setNodeOutputsByExecutionId 全局 store 思路,在 app.registerExtension.init() 中注册模块级全局 executed 监听器(不随节点生命周期销毁),只要工作流执行完成就把视频信息写入 _xzgVideoOutputCache Map,key 为节点 id,完全不依赖节点是否存活onConfigure rAF 优先读 cache → ② ResizeObserver 容器可见时兜底读 cache/properties → ③ properties._xzgVideoOutput(工作流保存/加载场景兜底)三层机制确保预览 100% 恢复,不再需要手动再运行output.ui.videos / output.video 两种数据路径,_lastAppliedKey 去重避免 onExecuted 与全局 api 事件重复触发_pendingVideoUrl,不立即调用 player.load()(否则 canvas 渲染失败导致黑屏);容器变可见时自动从 pending 或 cache 恢复🎬 小珠光视频加载器宽高重置 Bug 修复:
_updateRatioWidgets 在"自定义比例"分支硬编码 wWidget.value = 0 / hWidget.value = 0,但该函数在 onConfigure 的 rAF 中被调用,时序为「configure 先恢复数值(如 1024)→ rAF 执行 → 强制重置为 0」,用户设置的分辨率瞬间丢失🎬 化神级视频编辑器全面升级(OpenCut 式裁剪 + 桥接手柄 + 历史撤销重做):
tlStart 和 start,end 不变;右手柄修改 end,tlStart 和 start 不变,彻底替代旧的三模式方向决策逻辑←||→ 红色光标(播放头同色 #ff4444),触发区域宽 10px(左右各 5px),z-index 高于普通手柄;往右拖=左片段尾扩+右片段头同步右移,往左拖=右片段头扩+左片段尾同步左移,保持相邻且缩略图同步更新_loadClipThumbs 中当可用缩略图数量 inRange.length <= need 时 inRange[i % inRange.length] 循环选取,确保放大时间线后整段有图覆盖clipRects 检测边缘避免多次吸附冲突e.repeat,焦点在播放按钮上时跳过处理,避免播放↔暂停相互抵消pointer-events: none,移除点击轨道空白处跳转逻辑,避免与片段选中冲突_updateClipSelection() 仅遍历现有 DOM 切换 xzg-ve-selected class,不重建 DOM 或重新加载缩略图;清空选中同样只切 class_pushHistory() 记录状态,支持 Ctrl+Z 撤销、Ctrl+Shift+Z/Ctrl+Y 重做_tlBaseLocked=true,阻止自适应重新计算 pxPerSec 导致片段缩放;拖动期间直接更新 DOM width/left,通过 transform: translateX(-offset) 实现左侧裁剪视觉效果,不重建 DOM 避免缩略图闪烁🖼 其他优化与维护:
web/lib/mediabunny.min.mjs:新增视频解码库(MediaBunny)web/xzg_frame_decoder.js:新增帧解码器,配合视频播放器实现高效解码pyproject.toml、extension.json 从 11.5.8 升至 11.6.0🎛️ 小珠光选择器节点全面优化:
contentH + 38 调整为 contentH + 28,确保默认 1 行节点始终为 58px,不再出现"恢复默认后节点高度被弹回68px"的问题#FFFFFF(白色),与设置面板默认值保持一致,修复旧 DEFAULT_SETTINGS 中使用灰色 #aaa 导致新建节点文字发白不明显的问题🖼 小珠光图像保存节点 Bug 修复:
_normModeVal 序列化函数只匹配了 "preview"(小写p),但切换按钮写入的是 "Preview"(大写P),导致后端始终收到 mode="Save"。现已同时匹配 "预览" / "Preview" / "preview" 三种写法🖼 小珠光图像保存-化神级节点清理与修复:
output_path 参数,避免混淆base_dir 为相对路径(如 "my_folder" 或 "{date}")时,之前因 resolved_path 始终为空导致文件被错误保存到 output 根目录。现已简化为:绝对路径 → 直接使用;相对路径 → 正确拼接到 ComfyUI output/ 下;空 → output/ 根目录resolved_path 相关的无用分支(三选一判定中有两个分支永远不可达)🔧 其他优化与维护:
locales/zh/nodeDefs.json:选择器输出端口名"数值"已改为 * 占位,更简洁xzg_group.js:视觉编组代码大幅重构精简(-1200+ 行),移除冗余逻辑xzg_audiodit_tts.py、xzg_longcat_model_cache.py、xzg_qwen_loader.py、xzg_workflows.js:多处细节调优与稳定性修复extension.json 从 11.5.0 升至 11.5.8,与 pyproject.toml 同步🎵 小珠光音频加载器全面升级:
/features 端点获取 max_upload_size,前端预检 + 服务端 HTTP 413 兜底双重校验convertEventToCanvasOffset 转换坐标 + onDragOver/onDragDrop 回调实现🎬 小珠光视频加载器大文件支持:
🌱 新增小珠光随机种子节点:
XiaozhuguangSeed 节点(双语显示:小珠光随机种子 / Xiaozhuguang Seed)_xzgQueuePromptIntercepted 标志防止重复拦截🖼 图像加载器 / 保存器优化:
locales/en/nodeDefs.json、locales/zh/nodeDefs.json)📚 文档与国际化:
🎉 重磅新增:小珠光文本框节点(双通道文本输出 + 数字智能转中文)
text:原始文本原样输出,便于其他节点直接复用text_zh_num:数字转中文后的文本,默认始终开启,可作为 AI 绘图提示词的中文描述1280x720 → 一二八零乘以七二零、1920×1080 → 一九二零乘以一零八零、1x2x3 → 一乘以二乘以三,支持乘号 x / X / × / *(前后可带空格)12岁 → 十二岁、188cm → 一百八十八厘米、75kg → 七十五千克、36.5℃ → 三十六点五摄氏度、220V → 二百二十伏、12% → 百分之十二、3小时 → 三小时 等(覆盖年龄、长度、重量、温度/电学/容量/货币/时间/百分比等白名单)第12章 → 第十二章、第1名 → 第一名、第5届 → 第五届型号1280 → 型号一二八零、12 → 一二cm → 厘米、kg → 千克、km → 千米、mm → 毫米、L/mL → 升/毫升、V/A/W/℃/℉/Ω/Pa… 等均有对应转换文档更新:
nodes/xzg_text_box.py编组拖动跟随缺陷修复:
syncNodeMembership(每 10 帧自动添加框内节点到 group.nodeIds)意外破坏,导致编组框突然停止跟随视频播放条视觉优化:
xzgLaserPulse 呼吸脉冲动画,辉光层数与强度较初版降低 45%–60%API 修复:
xzg_get_output_dir 路由函数补齐 request 形参,解决 aiohttp 自动注入 request 对象时 takes 0 positional arguments but 1 was given 的 TypeError界面交互优化:
C):「应用主题并关闭」「恢复默认颜色」「导出」「导入」「快捷键」按钮统一为仅边框、无底色风格,与其他面板一致文档更新:
国际化:
工作流加载安全与体验修复:
夺舍模式(接管官方工作流 UI)优化:
重磅新增:工作流管理功能
`(反引号),可自定义节点收藏优化:
主题面板优化:
修复与优化:
新增:自定义快速节点功能
修复:
新增:
D 键:快速执行选中的输出节点及其依赖
F 键快捷键:鼠标位于编组内按 F 执行框内节点
新增:
新增:
新增:
优化:
优化:
修复:
applyPreviewColors)applyColorPreview,颜色变更时即时刷新Canvas其他:
新增:
docs/skill-panel-alignment.txt)修复:
computeSize 与 container 高度控制逻辑优化:
splice(0,0))splice(6,0))splice(12,0))getExtraMenuOptions,不再覆盖原型💡 如有问题或建议,欢迎在 GitHub 提 Issue 或 PR。
199 commits
JavaScript
77.7%
Python
21.8%